PageRenderTime 54ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/source/admincp/admincp_checktools.php

https://github.com/jinbo51/DiscuzX
PHP | 596 lines | 534 code | 56 blank | 6 comment | 133 complexity | 1aede55ed3b68c707448c2b1901da8d0 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: admincp_checktools.php 31554 2012-09-07 08:49:56Z monkey $
  7. */
  8. if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
  9. exit('Access Denied');
  10. }
  11. cpheader();
  12. if(!isfounder()) cpmsg('noaccess_isfounder', '', 'error');
  13. if($operation == 'filecheck') {
  14. $step = max(1, intval($_GET['step']));
  15. shownav('tools', 'nav_filecheck');
  16. showsubmenusteps('nav_filecheck', array(
  17. array('nav_filecheck_confirm', $step == 1),
  18. array('nav_filecheck_verify', $step == 2),
  19. array('nav_filecheck_completed', $step == 3)
  20. ));
  21. if($step == 1) {
  22. cpmsg(cplang('filecheck_tips_step1'), 'action=checktools&operation=filecheck&step=2', 'button', '', FALSE);
  23. } elseif($step == 2) {
  24. cpmsg(cplang('filecheck_verifying'), "action=checktools&operation=filecheck&step=3", 'loading', '', FALSE);
  25. } elseif($step == 3) {
  26. if(!$discuzfiles = @file('./source/admincp/discuzfiles.md5')) {
  27. cpmsg('filecheck_nofound_md5file', '', 'error');
  28. }
  29. $md5data = array();
  30. $cachelist = checkcachefiles('data/sysdata/');
  31. checkfiles('./', '', 0);
  32. checkfiles('config/', '', 1, 'config_global.php,config_ucenter.php');
  33. checkfiles('data/', '\.xml', 0);
  34. checkfiles('data/', '\.htm', 0);
  35. checkfiles('data/log/', '\.htm', 0);
  36. checkfiles('data/plugindata/', '\.htm', 0);
  37. checkfiles('data/download/', '\.htm', 0);
  38. checkfiles('data/addonmd5/', '\.htm', 0);
  39. checkfiles('data/avatar/', '\.htm', 0);
  40. checkfiles('data/cache/', '\.htm', 0);
  41. checkfiles('data/ipdata/', '\.htm|\.dat', 0);
  42. checkfiles('data/template/', '\.htm', 0);
  43. checkfiles('data/threadcache/', '\.htm', 0);
  44. checkfiles('template/', '');
  45. checkfiles('api/', '');
  46. checkfiles('source/', '', 1, 'discuzfiles.md5,plugin');
  47. checkfiles('static/', '');
  48. checkfiles('archiver/', '');
  49. checkfiles('uc_client/', '\.php|\.htm', 0);
  50. checkfiles('uc_client/data/', '\.htm');
  51. checkfiles('uc_client/control/', '\.php|\.htm');
  52. checkfiles('uc_client/model/', '\.php|\.htm');
  53. checkfiles('uc_client/lib/', '\.php|\.htm');
  54. checkfiles('uc_server/', '\.php|\.htm|\.txt|\.xml', 0);
  55. checkfiles('uc_server/data/', '\.htm');
  56. checkfiles('uc_server/api/', '\.php|\.htm');
  57. checkfiles('uc_server/control/', '\.php|\.htm|\.md5');
  58. checkfiles('uc_server/model/', '\.php|\.htm');
  59. checkfiles('uc_server/lib/', '\.php|\.htm');
  60. checkfiles('uc_server/plugin/', '\.php|\.htm|\.xml');
  61. checkfiles('uc_server/upgrade/', '\.php');
  62. checkfiles('uc_server/images/', '\..+?');
  63. checkfiles('uc_server/js/', '\.js|\.htm');
  64. checkfiles('uc_server/release/', '\.php');
  65. checkfiles('uc_server/view/', '\.php|\.htm');
  66. C::t('common_cache')->insert(array(
  67. 'cachekey' => 'checktools_filecheck',
  68. 'cachevalue' => serialize(array('dateline' => $_G['timestamp'])),
  69. 'dateline' => $_G['timestamp'],
  70. ), false, true);
  71. foreach($discuzfiles as $line) {
  72. $file = trim(substr($line, 34));
  73. $md5datanew[$file] = substr($line, 0, 32);
  74. if($md5datanew[$file] != $md5data[$file]) {
  75. $modifylist[$file] = $md5data[$file];
  76. }
  77. $md5datanew[$file] = $md5data[$file];
  78. }
  79. $weekbefore = TIMESTAMP - 604800;
  80. $addlist = @array_merge(@array_diff_assoc($md5data, $md5datanew), $cachelist[2]);
  81. $dellist = @array_diff_assoc($md5datanew, $md5data);
  82. $modifylist = @array_merge(@array_diff_assoc($modifylist, $dellist), $cachelist[1]);
  83. $showlist = @array_merge($md5data, $md5datanew, $cachelist[0]);
  84. $doubt = 0;
  85. $dirlist = $dirlog = array();
  86. foreach($showlist as $file => $md5) {
  87. $dir = dirname($file);
  88. if(@array_key_exists($file, $modifylist)) {
  89. $fileststus = 'modify';
  90. } elseif(@array_key_exists($file, $dellist)) {
  91. $fileststus = 'del';
  92. } elseif(@array_key_exists($file, $addlist)) {
  93. $fileststus = 'add';
  94. } else {
  95. $filemtime = @filemtime($file);
  96. if($filemtime > $weekbefore) {
  97. $fileststus = 'doubt';
  98. $doubt++;
  99. } else {
  100. $fileststus = '';
  101. }
  102. }
  103. if(file_exists($file)) {
  104. $filemtime = @filemtime($file);
  105. $fileststus && $dirlist[$fileststus][$dir][basename($file)] = array(number_format(filesize($file)).' Bytes', dgmdate($filemtime));
  106. } else {
  107. $fileststus && $dirlist[$fileststus][$dir][basename($file)] = array('', '');
  108. }
  109. }
  110. $result = $resultjs = '';
  111. $dirnum = 0;
  112. foreach($dirlist as $status => $filelist) {
  113. $dirnum++;
  114. $class = $status == 'modify' ? 'edited' : ($status == 'del' ? 'del' : 'unknown');
  115. $result .= '<tbody id="status_'.$status.'" style="display:'.($status != 'modify' ? 'none' : '').'">';
  116. foreach($filelist as $dir => $files) {
  117. $result .= '<tr><td colspan="4"><div class="ofolder">'.$dir.'</div><div class="margintop marginbot">';
  118. foreach($files as $filename => $file) {
  119. $result .= '<tr><td><em class="files bold">'.$filename.'</em></td><td style="text-align: right">'.$file[0].'&nbsp;&nbsp;</td><td>'.$file[1].'</td><td><em class="'.$class.'">&nbsp;</em></td></tr>';
  120. }
  121. }
  122. $result .= '</tbody>';
  123. $resultjs .= '$(\'status_'.$status.'\').style.display=\'none\';';
  124. }
  125. $modifiedfiles = count($modifylist);
  126. $deletedfiles = count($dellist);
  127. $unknownfiles = count($addlist);
  128. $doubt = intval($doubt);
  129. $result .= '<script>function showresult(o) {'.$resultjs.'$(\'status_\' + o).style.display=\'\';}</script>';
  130. showtips('filecheck_tips');
  131. showtableheader('filecheck_completed');
  132. showtablerow('', 'colspan="4"', "<div class=\"margintop marginbot\">".
  133. "<em class=\"edited\">$lang[filecheck_modify]: $modifiedfiles</em> ".($modifiedfiles > 0 ? "<a href=\"###\" onclick=\"showresult('modify')\">[$lang[view]]</a> " : '').
  134. " &nbsp; <em class=\"del\">$lang[filecheck_delete]: $deletedfiles</em> ".($deletedfiles > 0 ? "<a href=\"###\" onclick=\"showresult('del')\">[$lang[view]]</a> " : '').
  135. " &nbsp; <em class=\"unknown\">$lang[filecheck_unknown]: $unknownfiles</em> ".($unknownfiles > 0 ? "<a href=\"###\" onclick=\"showresult('add')\">[$lang[view]]</a> " : '').
  136. ($doubt > 0 ? "&nbsp;&nbsp;&nbsp;&nbsp;<em class=\"unknown\">$lang[filecheck_doubt]: $doubt</em> <a href=\"###\" onclick=\"showresult('doubt')\">[$lang[view]]</a> " : '').
  137. "</div>");
  138. showsubtitle(array('filename', '', 'lastmodified', ''));
  139. echo $result;
  140. showtablefooter();
  141. }
  142. } elseif($operation == 'hookcheck') {
  143. $step = max(1, intval($_GET['step']));
  144. shownav('tools', 'nav_hookcheck');
  145. showsubmenusteps('nav_hookcheck', array(
  146. array('nav_hookcheck_confirm', $step == 1),
  147. array('nav_hookcheck_verify', $step == 2),
  148. array('nav_hookcheck_completed', $step == 3)
  149. ));
  150. showtips('hookcheck_tips');
  151. if($step == 1) {
  152. $styleselect = "<br><br><select name=\"styleid\">";
  153. foreach(C::t('common_style')->fetch_all_data() as $style) {
  154. $styleselect .= "<option value=\"$style[styleid]\" ".
  155. ($style['styleid'] == $_G['setting']['styleid'] ? 'selected="selected"' : NULL).
  156. ">$style[name]</option>\n";
  157. }
  158. $styleselect .= '</select>';
  159. cpmsg(cplang('hookcheck_tips_step1', array('template' => $styleselect)), 'action=checktools&operation=hookcheck&step=2', 'form', '', FALSE);
  160. } elseif($step == 2) {
  161. cpmsg(cplang('hookcheck_verifying'), "action=checktools&operation=hookcheck&step=3&styleid=$_POST[styleid]", 'loading', '', FALSE);
  162. } elseif($step == 3) {
  163. if(!$discuzfiles = @file('./source/admincp/discuzhook.dat')) {
  164. cpmsg('filecheck_nofound_md5file', '', 'error');
  165. }
  166. $discuzhookdata = $hookdata = array();
  167. $discuzhookdata_hook = array();
  168. $styleid = intval($_GET['styleid']);
  169. if(!$styleid) {
  170. $styleid = $_G['setting']['styleid'];
  171. }
  172. $style = C::t('common_style')->fetch_by_styleid($styleid);
  173. checkhook(substr($style['directory'], 2).'/', '\.htm', 1);
  174. foreach($discuzfiles as $line) {
  175. list($file, $hook) = explode(' *', substr($line, 0, -2));
  176. if($hook) {
  177. $discuzhookdata[$file][$hook][] = $hook;
  178. $discuzhookdata_hook[$file][] = $hook;
  179. }
  180. }
  181. $diffhooklist = $difffilelist = array();
  182. $diffnum = 0;
  183. foreach($discuzhookdata as $file => $hook) {
  184. $dir = dirname($file);
  185. if(isset($hookdata[$file])) {
  186. foreach($hook as $k => $hookarr) {
  187. if(($diff = count($hookarr) - count($hookdata[$file][$k])) > 0) {
  188. for($i = 0; $i < $diff; $i++) {
  189. $diffhooklist[$file][] = $k;
  190. }
  191. }
  192. }
  193. if(!empty($diffhooklist[$file])) {
  194. $difffilelist[$dir][] = $file;
  195. $diffnum++;
  196. }
  197. }
  198. }
  199. foreach($difffilelist as $dir => $files) {
  200. $result .= '<tbody><tr><td class="td30"><a href="javascript:;" onclick="toggle_group(\'dir_'.$dir.'\')" id="a_dir_'.$dir.'">[-]</a></td><td colspan="3"><div class="ofolder">'.$dir.'</div></td></tr></tbody>';
  201. $result .= '<tbody id="dir_'.$dir.'">';
  202. foreach($files as $file) {
  203. $result .= '<tr><td></td><td><em class="files bold">'.basename($file).'</em></td><td>';
  204. foreach($discuzhookdata_hook[$file] as $hook) {
  205. $result .= '<p>'.dhtmlspecialchars($hook).'</p>';
  206. }
  207. $result .= '</td><td>';
  208. foreach($diffhooklist[$file] as $hook) {
  209. $result .= '<p>'.dhtmlspecialchars($hook).'</p>';
  210. }
  211. $result .= '</td></tr>';
  212. }
  213. $result .= '</tbody>';
  214. }
  215. if($diffnum > 20) {
  216. $result .= '<script type="text/javascript">hide_all_hook(\'dir_\', \'tbody\');</script>';
  217. }
  218. if($diffnum) {
  219. showformheader('forums');
  220. showtableheader('hookcheck_completed');
  221. showtablerow('', 'colspan="4"', "<div class=\"margintop marginbot\">".
  222. '<a href="javascript:;" onclick="show_all_hook(\'dir_\', \'tbody\')">'.$lang[show_all].'</a> | <a href="javascript:;" onclick="hide_all_hook(\'dir_\', \'tbody\')">'.$lang[hide_all].'</a>'.
  223. " &nbsp; <em class=\"del\">$lang[hookcheck_delete]: $diffnum</em> ".
  224. "</div>");
  225. showsubtitle(array('', 'filename', 'hookcheck_discuzhook', 'hookcheck_delhook'));
  226. echo $result;
  227. showtablefooter();
  228. showformfooter();
  229. } else {
  230. cpmsg('hookcheck_nodelhook', '', 'succeed', '', FALSE);
  231. }
  232. }
  233. } elseif($operation == 'ftpcheck') {
  234. $alertmsg = '';
  235. $testcontent = md5('Discuz!' + $_G['config']['security']['authkey']);
  236. $testfile = 'test/discuztest.txt';
  237. $attach_dir = $_G['setting']['attachdir'];
  238. @mkdir($attach_dir.'test', 0777);
  239. if($fp = @fopen($attach_dir.'/'.$testfile, 'w')) {
  240. fwrite($fp, $testcontent);
  241. fclose($fp);
  242. }
  243. if(!$alertmsg) {
  244. $settingnew = $_GET['settingnew'];
  245. $settings['ftp'] = C::t('common_setting')->fetch('ftp', true);
  246. $settings['ftp']['password'] = authcode($settings['ftp']['password'], 'DECODE', md5($_G['config']['security']['authkey']));
  247. $pwlen = strlen($settingnew['ftp']['password']);
  248. if($settingnew['ftp']['password']{0} == $settings['ftp']['password']{0} && $settingnew['ftp']['password']{$pwlen - 1} == $settings['ftp']['password']{strlen($settings['ftp']['password']) - 1} && substr($settingnew['ftp']['password'], 1, $pwlen - 2) == '********') {
  249. $settingnew['ftp']['password'] = $settings['ftp']['password'];
  250. }
  251. $settingnew['ftp']['password'] = authcode($settingnew['ftp']['password'], 'ENCODE', md5($_G['config']['security']['authkey']));
  252. $settingnew['ftp']['attachurl'] .= substr($settingnew['ftp']['attachurl'], -1, 1) != '/' ? '/' : '';
  253. $_G['setting']['ftp'] = $settingnew['ftp'];
  254. ftpcmd('upload', $testfile);
  255. $ftp = ftpcmd('object');
  256. if(ftpcmd('error')) {
  257. $alertmsg = cplang('setting_attach_remote_'.ftpcmd('error'));
  258. }
  259. if(!$alertmsg) {
  260. $str = getremotefile($_G['setting']['ftp']['attachurl'].$testfile);
  261. if($str !== $testcontent) {
  262. $alertmsg = cplang('setting_attach_remote_geterr');
  263. }
  264. }
  265. if(!$alertmsg) {
  266. ftpcmd('delete', $testfile);
  267. ftpcmd('delete', 'test/index.htm');
  268. $ftp->ftp_rmdir('test');
  269. $str = getremotefile($_G['setting']['ftp']['attachurl'].$testfile);
  270. if($str === $testcontent) {
  271. $alertmsg = cplang('setting_attach_remote_delerr');
  272. }
  273. @unlink($attach_dir.'/'.$testfile);
  274. @rmdir($attach_dir.'test');
  275. }
  276. }
  277. if(!$alertmsg) {
  278. $alertmsg = cplang('setting_attach_remote_ok');
  279. }
  280. echo '<script language="javascript">alert(\''.str_replace('\'', '\\\'', $alertmsg).'\');parent.$(\'cpform\').action=\''.ADMINSCRIPT.'?action=setting&edit=yes\';parent.$(\'cpform\').target=\'_self\'</script>';
  281. } elseif($operation == 'mailcheck') {
  282. $oldmail = dunserialize($_G['setting']['mail']);
  283. $settingnew = $_GET['settingnew'];
  284. $oldsmtp = $settingnew['mail']['mailsend'] == 3 ? $settingnew['mail']['smtp'] : $settingnew['mail']['esmtp'];
  285. $deletesmtp = $settingnew['mail']['mailsend'] != 1 ? ($settingnew['mail']['mailsend'] == 3 ? $settingnew['mail']['smtp']['delete'] : $settingnew['mail']['esmtp']['delete']) : array();
  286. $settingnew['mail']['smtp'] = array();
  287. foreach($oldsmtp as $id => $value) {
  288. if((empty($deletesmtp) || !in_array($id, $deletesmtp)) && !empty($value['server']) && !empty($value['port'])) {
  289. $passwordmask = $oldmail['smtp'][$id]['auth_password'] ? $oldmail['smtp'][$id]['auth_password']{0}.'********'.substr($oldmail['smtp'][$id]['auth_password'], -2) : '';
  290. $value['auth_password'] = $value['auth_password'] == $passwordmask ? $oldmail['smtp'][$id]['auth_password'] : $value['auth_password'];
  291. $settingnew['mail']['smtp'][] = $value;
  292. }
  293. }
  294. if(!empty($_GET['newsmtp'])) {
  295. foreach($_GET['newsmtp']['server'] as $id => $smtp) {
  296. if(!empty($smtp) && !empty($_GET['newsmtp']['port'][$id])) {
  297. $settingnew['mail']['smtp'][] = array(
  298. 'server' => $smtp,
  299. 'port' => $_GET['newsmtp']['port'][$id] ? intval($_GET['newsmtp']['port'][$id]) : 25,
  300. 'auth' => $_GET['newsmtp']['auth'][$id] ? 1 : 0,
  301. 'from' => $_GET['newsmtp']['from'][$id],
  302. 'auth_username' => $_GET['newsmtp']['auth_username'][$id],
  303. 'auth_password' => $_GET['newsmtp']['auth_password'][$id]
  304. );
  305. }
  306. }
  307. }
  308. $_G['setting']['mail'] = serialize($settingnew['mail']);
  309. $test_to = $_GET['test_to'];
  310. $test_from = $_GET['test_from'];
  311. $date = date('Y-m-d H:i:s');
  312. $alertmsg = '';
  313. $title = $lang['setting_mailcheck_title_'.$settingnew['mail']['mailsend']];
  314. $message = $lang['setting_mailcheck_message_'.$settingnew['mail']['mailsend']].' '.$test_from.$lang['setting_mailcheck_date'].' '.$date;
  315. $_G['setting']['bbname'] = $lang['setting_mail_check_method_1'];
  316. include libfile('function/mail');
  317. $succeed = sendmail($test_to, $title.' @ '.$date, $_G['setting']['bbname']."\n\n\n$message", $test_from);
  318. $_G['setting']['bbname'] = $lang['setting_mail_check_method_2'];
  319. $succeed = sendmail($test_to, $title.' @ '.$date, $_G['setting']['bbname']."\n\n\n$message", $test_from);
  320. if($succeed) {
  321. $alertmsg = $lang['setting_mail_check_success_1']."$title @ $date".$lang['setting_mail_check_success_2'];
  322. } else {
  323. $alertmsg = $lang['setting_mail_check_error'].$alertmsg;
  324. }
  325. echo '<script language="javascript">alert(\''.str_replace(array('\'', "\n", "\r"), array('\\\'', '\n', ''), $alertmsg).'\');parent.$(\'cpform\').action=\''.ADMINSCRIPT.'?action=setting&edit=yes\';parent.$(\'cpform\').target=\'_self\';parent.$(\'cpform\').operation.value=\'mail\';</script>';
  326. } elseif($operation == 'imagepreview') {
  327. $settingnew = $_GET['settingnew'];
  328. if(!empty($_GET['previewthumb'])) {
  329. $_G['setting']['imagelib'] = $settingnew['imagelib'];
  330. $_G['setting']['imageimpath'] = $settingnew['imageimpath'];
  331. $_G['setting']['thumbwidth'] = $settingnew['thumbwidth'];
  332. $_G['setting']['thumbheight'] = $settingnew['thumbheight'];
  333. $_G['setting']['thumbquality'] = $settingnew['thumbquality'];
  334. require_once libfile('class/image');
  335. @unlink(DISCUZ_ROOT.$_G['setting']['attachdir'].'./temp/watermark_temp1.jpg');
  336. @unlink(DISCUZ_ROOT.$_G['setting']['attachdir'].'./temp/watermark_temp2.jpg');
  337. $image = new image;
  338. $r = 0;
  339. if(!($r = $image->Thumb(DISCUZ_ROOT.'./static/image/admincp/watermarkpreview.jpg', 'temp/watermark_temp1.jpg', $_G['setting']['thumbwidth'], $_G['setting']['thumbheight'], 1))) {
  340. $r = $image->error();
  341. }
  342. $sizetarget1 = $image->imginfo['size'];
  343. $image->Thumb(DISCUZ_ROOT.'./static/image/admincp/watermarkpreview.jpg', 'temp/watermark_temp2.jpg', $_G['setting']['thumbwidth'], $_G['setting']['thumbheight'], 2);
  344. $sizetarget2 = $image->imginfo['size'];
  345. if($r > 0) {
  346. showsubmenu('imagepreview_thumb');
  347. $sizesource = filesize(DISCUZ_ROOT.'./static/image/admincp/watermarkpreview.jpg');
  348. echo '<img src="data/attachment/temp/watermark_temp1.jpg?'.random(5).'"><br /><br />'.
  349. $lang['imagepreview_imagesize_source'].' '.number_format($sizesource).' Bytes &nbsp;&nbsp;'.
  350. $lang['imagepreview_imagesize_target'].' '.number_format($sizetarget1).' Bytes ('.
  351. (sprintf("%2.1f", $sizetarget1 / $sizesource * 100)).'%)<br /><br />';
  352. echo '<img src="data/attachment/temp/watermark_temp2.jpg?'.random(5).'"><br /><br />'.
  353. $lang['imagepreview_imagesize_source'].' '.number_format($sizesource).' Bytes &nbsp;&nbsp;'.
  354. $lang['imagepreview_imagesize_target'].' '.number_format($sizetarget2).' Bytes ('.
  355. (sprintf("%2.1f", $sizetarget2 / $sizesource * 100)).'%)';
  356. } else {
  357. cpmsg('imagepreview_errorcode_'.$r, '', 'error');
  358. }
  359. } else {
  360. $type = $_GET['type'];
  361. if(!$_G['setting']['watermarkstatus'][$type]) {
  362. cpmsg('watermarkpreview_error', '', 'error');
  363. }
  364. require_once libfile('class/image');
  365. @unlink(DISCUZ_ROOT.'./data/attachment/temp/watermark_temp3.jpg');
  366. $image = new image;
  367. if(!($r = $image->Watermark(DISCUZ_ROOT.'./static/image/admincp/watermarkpreview.jpg', 'temp/watermark_temp3.jpg', $type))) {
  368. $r = $image->error();
  369. }
  370. if($r > 0) {
  371. showsubmenu('imagepreview_watermark');
  372. $sizesource = filesize('static/image/admincp/watermarkpreview.jpg');
  373. $sizetarget = $image->imginfo['size'];
  374. echo '<img src="data/attachment/temp/watermark_temp3.jpg?'.random(5).'"><br /><br />'.
  375. $lang['imagepreview_imagesize_source'].' '.number_format($sizesource).' Bytes &nbsp;&nbsp;'.
  376. $lang['imagepreview_imagesize_target'].' '.number_format($sizetarget).' Bytes ('.
  377. (sprintf("%2.1f", $sizetarget / $sizesource * 100)).'%)';
  378. } else {
  379. cpmsg('imagepreview_errorcode_'.$r, '', 'error');
  380. }
  381. }
  382. } elseif($operation == 'rewrite') {
  383. $rule = array();
  384. $rewritedata = rewritedata();
  385. $rule['{apache1}'] = $rule['{apache2}'] = $rule['{iis}'] = $rule['{iis7}'] = $rule['{zeus}'] = $rule['{nginx}'] = '';
  386. foreach($rewritedata['rulesearch'] as $k => $v) {
  387. if(!in_array($k, $_G['setting']['rewritestatus'])) {
  388. continue;
  389. }
  390. $v = !$_G['setting']['rewriterule'][$k] ? $v : $_G['setting']['rewriterule'][$k];
  391. $pvmaxv = count($rewritedata['rulevars'][$k]) + 2;
  392. $vkeys = array_keys($rewritedata['rulevars'][$k]);
  393. $rewritedata['rulereplace'][$k] = pvsort($vkeys, $v, $rewritedata['rulereplace'][$k]);
  394. $v = str_replace($vkeys, $rewritedata['rulevars'][$k], addcslashes($v, '?*+^$.[]()|'));
  395. $rule['{apache1}'] .= "\t".'RewriteCond %{QUERY_STRING} ^(.*)$'."\n\t".'RewriteRule ^(.*)/'.$v.'$ $1/'.pvadd($rewritedata['rulereplace'][$k])."&%1\n";
  396. if($k != 'forum_archiver') {
  397. $rule['{apache2}'] .= 'RewriteCond %{QUERY_STRING} ^(.*)$'."\n".'RewriteRule ^'.$v.'$ '.$rewritedata['rulereplace'][$k]."&%1\n";
  398. } else {
  399. $rule['{apache2}'] .= 'RewriteCond %{QUERY_STRING} ^(.*)$'."\n".'RewriteRule ^archiver/'.$v.'$ archiver/'.$rewritedata['rulereplace'][$k]."&%1\n";
  400. }
  401. $rule['{iis}'] .= 'RewriteRule ^(.*)/'.$v.'(\?(.*))*$ $1/'.addcslashes(pvadd($rewritedata['rulereplace'][$k]).'&$'.($pvmaxv + 1), '.?')."\n";
  402. $rule['{iis7}'] .= "\t\t".'&lt;rule name="'.$k.'"&gt;'."\n\t\t\t".'&lt;match url="^(.*/)*'.str_replace('\.', '.', $v).'\?*(.*)$" /&gt;'."\n\t\t\t".'&lt;action type="Rewrite" url="{R:1}/'.str_replace(array('&', 'page\%3D'), array('&amp;amp;', 'page%3D'), addcslashes(pvadd($rewritedata['rulereplace'][$k], 1).'&{R:'.$pvmaxv.'}', '?')).'" /&gt;'."\n\t\t".'&lt;/rule&gt;'."\n";
  403. $rule['{zeus}'] .= 'match URL into $ with ^(.*)/'.$v.'\?*(.*)$'."\n".'if matched then'."\n\t".'set URL = $1/'.pvadd($rewritedata['rulereplace'][$k]).'&$'.$pvmaxv."\nendif\n";
  404. $rule['{nginx}'] .= 'rewrite ^([^\.]*)/'.$v.'$ $1/'.stripslashes(pvadd($rewritedata['rulereplace'][$k]))." last;\n";
  405. }
  406. $rule['{nginx}'] .= "if (!-e \$request_filename) {\n\treturn 404;\n}";
  407. echo str_replace(array_keys($rule), $rule, cplang('rewrite_message'));
  408. } elseif($operation == 'robots') {
  409. if($do == 'output') {
  410. $robots = implode('', file(DISCUZ_ROOT.'./source/admincp/robots.txt'));
  411. $robots = str_replace('{path}', $_G['siteroot'], $robots);
  412. $robots = str_replace('{ver}', $_G['setting']['version'], $robots);
  413. ob_end_clean();
  414. dheader('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
  415. dheader('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
  416. dheader('Cache-Control: no-cache, must-revalidate');
  417. dheader('Pragma: no-cache');
  418. dheader('Content-Encoding: none');
  419. dheader('Content-Length: '.strlen($robots));
  420. dheader('Content-Disposition: attachment; filename=robots.txt');
  421. dheader('Content-Type: text/plain');
  422. echo $robots;
  423. define('FOOTERDISABLED' , 1);
  424. exit();
  425. }
  426. cpmsg('robots_output', 'action=checktools&operation=robots&do=output&frame=no', 'download', array('siteurl' => $_G['siteurl']));
  427. }
  428. function pvsort($key, $v, $s) {
  429. $r = '/';
  430. $p = '';
  431. foreach($key as $k) {
  432. $r .= $p.preg_quote($k);
  433. $p = '|';
  434. }
  435. $r .= '/';
  436. preg_match_all($r, $v, $a);
  437. $a = $a[0];
  438. $a = array_flip($a);
  439. foreach($a as $key => $value) {
  440. $s = str_replace($key, '$'.($value + 1), $s);
  441. }
  442. return $s;
  443. }
  444. function pvadd($s, $t = 0) {
  445. $s = str_replace(array('$3', '$2', '$1'), array('~4', '~3', '~2'), $s);
  446. if(!$t) {
  447. return str_replace(array('~4', '~3', '~2'), array('$4', '$3', '$2'), $s);
  448. } else {
  449. return str_replace(array('~4', '~3', '~2'), array('{R:4}', '{R:3}', '{R:2}'), $s);
  450. }
  451. }
  452. function checkfiles($currentdir, $ext = '', $sub = 1, $skip = '') {
  453. global $md5data;
  454. $dir = @opendir(DISCUZ_ROOT.$currentdir);
  455. $exts = '/('.$ext.')$/i';
  456. $skips = explode(',', $skip);
  457. while($entry = @readdir($dir)) {
  458. $file = $currentdir.$entry;
  459. if($entry != '.' && $entry != '..' && (($ext && preg_match($exts, $entry) || !$ext) || $sub && is_dir($file)) && !in_array($entry, $skips)) {
  460. if($sub && is_dir($file)) {
  461. checkfiles($file.'/', $ext, $sub, $skip);
  462. } else {
  463. if(is_dir($file)) {
  464. $md5data[$file] = md5($file);
  465. } else {
  466. $md5data[$file] = md5_file($file);
  467. }
  468. }
  469. }
  470. }
  471. }
  472. function checkcachefiles($currentdir) {
  473. global $_G;
  474. $dir = opendir($currentdir);
  475. $exts = '/\.php$/i';
  476. $showlist = $modifylist = $addlist = array();
  477. while($entry = readdir($dir)) {
  478. $file = $currentdir.$entry;
  479. if($entry != '.' && $entry != '..' && preg_match($exts, $entry)) {
  480. $fp = fopen($file, "rb");
  481. $cachedata = fread($fp, filesize($file));
  482. fclose($fp);
  483. if(preg_match("/^<\?php\n\/\/Discuz! cache file, DO NOT modify me!\n\/\/Identify: (\w+)\n\n(.+?)\?>$/s", $cachedata, $match)) {
  484. $showlist[$file] = $md5 = $match[1];
  485. $cachedata = $match[2];
  486. if(md5($entry.$cachedata.$_G['config']['security']['authkey']) != $md5) {
  487. $modifylist[$file] = $md5;
  488. }
  489. } else {
  490. $showlist[$file] = '';
  491. }
  492. }
  493. }
  494. return array($showlist, $modifylist, $addlist);
  495. }
  496. function checkmailerror($type, $error) {
  497. global $alertmsg;
  498. $alertmsg .= !$alertmsg ? $error : '';
  499. }
  500. function getremotefile($file) {
  501. global $_G;
  502. @set_time_limit(0);
  503. $file = $file.'?'.TIMESTAMP.rand(1000, 9999);
  504. $str = @implode('', @file($file));
  505. if(!$str) {
  506. $str = dfsockopen($file);
  507. }
  508. return $str;
  509. }
  510. function checkhook($currentdir, $ext = '', $sub = 1, $skip = '') {
  511. global $hooks, $hookdata;
  512. $dir = opendir($currentdir);
  513. $exts = '/('.$ext.')$/i';
  514. $skips = explode(',', $skip);
  515. while($entry = readdir($dir)) {
  516. $file = $currentdir.$entry;
  517. if($entry != '.' && $entry != '..' && (preg_match($exts, $entry) || $sub && is_dir($file)) && !in_array($entry, $skips)) {
  518. if($sub && is_dir($file)) {
  519. checkhook($file.'/', $ext, $sub, $skip);
  520. } else {
  521. $data = file_get_contents($file);
  522. $hooks = array();
  523. preg_replace("/\{hook\/(\w+?)(\s+(.+?))?\}/ie", "findhook('\\1', '\\3')", $data);
  524. if($hooks) {
  525. foreach($hooks as $v) {
  526. $hookdata[$file][$v][] = $v;
  527. }
  528. }
  529. }
  530. }
  531. }
  532. }
  533. function findhook($hookid, $key) {
  534. global $hooks;
  535. if($key) {
  536. $key = ' '.$key;
  537. }
  538. $hooks[] = '<!--{hook/'.$hookid.$key.'}-->';
  539. }
  540. ?>