Я зашел. Чувак с безопасностью перемудрил. Которая нахрен там не нужна не стал убирать её, она стоит на pwchat.ru
Да ладно, спасибо за архивчик :) пожалуйста :)
Описание можно?) конечно
Зачем в шару? :( По другому никак :)
Решил этот проект отдать на растерзание, так как понял его совершенную бесполезность. Настройка удивительно проста: открываем config.php, вписываем данные MySQL-сервера и другие данные, указанные в файле. Функция getAdmin возвращает список администраторов. Так же необходимо сделать импорт дампа pw.sql. По любым вопросам можно обращаться либо в мой скайп, либо в лс, либо же в топике. Данные для входа: autosnikers/autosnikers Скачать тут. Пароль на архив: mmorpg
а потом запускаются скрипты типа GET "usr/share/phpmyadmin/scripts/setup.php" и т.п. Для этого достаточно посмотреть какие методы вызываются. В моём приложении нет дыр и багов, все запросы идут только на локальный сервер, предварительно прошедших валидацию. В версии pwchat идёт проверка по ключу, генерированном автоматически.
Обязательно нужно будет заходить через pwchat.ru ?) Ну хз мб есть другой способ Оо Да, я продаю данный скрипт
Графа чуть лучше чем у гта4. Ожидал большего)
Графика разочаровала. Всё остальное - на высоте. В целом неплохо.
Я сам лично не опытен, и в большей части не знаю веб языки программирования, по этому моя логика приводит к тому, что: Я должен ввести IP, на сайте оставить файл с подключением к серверу Получается при подключении к файлу, Вы по логам и\или ещё как-либо можете узнать данные с файла, знающие исправьте. Нет. Я же написал выше. На сайте вы вводите только ip сервера. Клиентский файл скачивается на ваш сервер.
Тем не менее, получается, что вы имеете доступ к данным. Доступ к ip, причём любому, какой вы укажете. Можно сделать иначе - алгоритм описал выше.
но на pwchat.ru наши сервера уязвимы? Нет. Вы вводите только данные для входа на pwchat (любые логин/пароль), так же вводите IP или домен, на котором будет располагаться клиентский файл. В клиентском файле можно прописать удалённое подключение, тем самым создавая двойное подключение. Из этого следует, что файл будет грузиться дольше и данные будут дольше отправляться. Я же продаю то, что находится на pwchat - обработчик файла с последующими модификациями.
Не дороговато за читалку чата + за то, что клиент отдает вам же доступ к серверу? Полностью всё находится у клиента. В описании это указано
Собственно, к продолжению этой темы. С основным функционалом можно ознакомиться на сайте. Основные возможности - мониторинг чата по ключевым словам и оповещение о новых уведовлениях, бан/разбан, просмотр личных чатов, клан-чатов. Вкусняшки: быстрый переход по ссылкам (History API). Скрипт предназначен для серверов версии 1.4.0+ (локально) Последующие обновления: - Просмотр любого чата на отдельной странице - Добавление результатов поиска по ключевым словам в оповещения без необходимости запуска приложения. - а так же ваши пожелания. Цена 2'000р. Последующие обновления бесплатны. Подробности в скайпе: autosnikers.get
Регистрация включена, так же добавлена смена URL сервера и пути к файлу. Так же, для таких пользователей, как Roymike, могу сделать другой конфигурационный файл, который позволяет переадресовывать запросы на другой сервер. В этом случае скорость одного запроса будет немного отличаться от прямого запроса.
Посмотри в каталог /etc/apache2/sites-enabled
Сервис — хорошо, удобно. Дизайн — фреймворк какой-нибудь, ничего необычного. Скажу больше - Bootstrap v2.3.1
Регистрация скоро снова заработает
Альтруизм - это очень хорошо, но он, как правило, до поры до времени. Как будет в дальнейшем развиваться монетизация данного сервиса? В настоящее время есть финансирование для хостинга. Продолжаться это будет довольно долго. В дальнейшем, при заполнении сервиса - скорее всего будет символическая плата для оправдания хостинга. ТС, запили смену айпи и путь к файлу/название файла Доработаю.
У меня вообще грузит, грузит, грузит и не загрузит Взял айпишник где нет сервера - все ок, правда иероглифы были. Взял айпишник руоффа - не работает Логично, если вы ничего не настроили. на тестовый залил его мего трю скрипт чат читался, но без ников, баны и прочую хурму не проверял ну и собственно его скрипт <?php class Chat { const KEY = "24BD-7E04-4595-ED20"; # Не изменяйте ключ const CHAT_FILE = "/home/logs/world2.chat"; # Путь к файлу чата public function __construct($action = null) { header("Content-type: text/html; charset=utf-8"); if($action != null && $_GET["code"] == self::KEY) { switch ($action) { case "getNick": $this->getNick($_GET["id"]); break; case "getNameClan": $this->getNameClan($_GET["id"]); break; case "setBan": $this->setBan($_GET["type"], $_GET["id"], $_GET["sec"], $_GET["reason"]); break; case "sendSystemMessage": $this->sendSystemMessage($_GET["message"]); break; case "getChatFile": $this->getChatFile($_GET["count"]); break; case "getCountString": $this->getCountString(); break; default: die("error"); } } else { die("error"); } } protected function cuint($data) { if($data < 64) return strrev(pack("C", $data)); else if($data < 16384) return strrev(pack("S", ($data | 0x8000))); else if($data < 536870912) return strrev(pack("I", ($data | 0xC0000000))); return strrev(pack("c", -32) . pack("i", $data)); } protected function UnPackString($data, $p) { $size = (hexdec(bin2hex(substr($data,$p,1))) >= 128) ? 2 : 1; $octetlen = (hexdec(bin2hex(substr($data,$p, $size))) >= 128) ? hexdec(bin2hex(substr($data,$p, $size)))-32768 : hexdec(bin2hex(substr($data,$p, $size))); $pp = $p; $p += $size + $octetlen; return mb_convert_encoding(substr($data,$pp+$size,$octetlen),"UTF-8","UTF-16LE"); } protected function PackString($data) { $data = iconv("UTF-8", "UTF-16LE", $data); $LnData = strlen($data); if ($LnData <= 128) { $ln = pack("C*", $LnData); return $ln.$data; } else { $ln = pack("n*", $LnData+32768); return $ln.$data; } } protected function length($data) { $PackLn = strlen($data); if($PackLn < 128) { $PackLn = pack("C*", $PackLn); return $PackLn; } else { $PackLn = pack("n*", $PackLn + 32768); return $PackLn; } } protected function getChatFile($count) { exec("tail -n ".$count." ".self::CHAT_FILE."", $array); for($i=0;$i<count($array);$i++) { echo $array[$i]."\n"; } } protected function getCountString() { $file = self::CHAT_FILE; $e = explode(" ", trim(exec("wc -l $file"))); echo $e[0]; } protected function getNick($id) { $data = pack("N*",-1, $id); $redy = $this->cuint(8003).$this->cuint(strlen($data)).$data; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($sock,"localhost",29400); socket_set_block($sock); socket_send($sock, $redy, 8192, 0); socket_recv($sock, $rb, 8192, 0); socket_set_nonblock($sock); socket_close($sock); echo $this->UnPackString($rb, 17); } protected function getNameClan($id) { $pack = strrev(pack("S", 32768)).strrev(pack("S", 1)).pack("N", $id); $data = $this->cuint(4608).$this->length($pack).$pack; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($sock, "localhost", 29400); socket_set_block($sock); socket_send($sock, $data, 8192, 0); socket_recv($sock, $buf, 8192, 0); socket_set_nonblock($sock); socket_close($sock); if (hexdec(bin2hex(substr($buf,2,1))) >= 128) { $name = $this->UnPackString($buf, 16); } else { $name = $this->UnPackString($buf, 15); } echo $name; } protected function setBan($type, $id, $sec, $reason) { if($type == 101) { $pack = pack("N", 1024).pack("N", 1).pack("N", $id).pack("N", $sec).$this->PackString($reason); $data = $this->cuint(362).$this->length($pack).$pack; } elseif($type == 100) { $pack = pack("N", 1024).pack("N", 830).pack("N", $id).pack("N", $sec).$this->PackString($reason); $data = $this->cuint(360).$this->length($pack).$pack; } $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_connect($sock, "localhost", 29100); socket_set_block($sock); socket_send($sock, $data, 8192, 0); socket_recv($sock, $buf, 8192, 0); socket_set_nonblock($sock); socket_close($sock); } protected function sendSystemMessage($message) { $message = iconv("UTF-8", "UTF-16LE", $message); $Chanel = pack("C*", 9); $Id = pack("N*", 0); $Emotion = pack("C*", 0); $MessageLengh = strlen($message); if ($MessageLengh < 128) { $MessageLengh = pack("C*", $MessageLengh); } else { $MessageLengh = pack("n*", $MessageLengh + 32768); } $Packet = $Chanel . $Emotion . $Id . $MessageLengh . $message . "\x00\x00"; $PacketLen = pack("C*", strlen($Packet)); $type = pack("C", 120); $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $sock2 = socket_connect($sock, "localhost", "29300"); socket_set_block($sock); $data = $type . $PacketLen . $Packet; $sbytes = socket_send($sock, $data, 8192, 0); $rbytes = socket_recv($sock, $buf, 8192, 0); socket_set_nonblock($sock); socket_close($sock); } public function __destruct() { } } $chat = new Chat($_GET["action"]); ?> На 1.2.6, видимо, другие пакеты. Если необходимо, сделаю поддержку.
Имена участников (разделяйте запятой).