admincp_checktools.php 25 KB

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