DiscuzX/upload/uc_server/plugin/filecheck/plugin.php

115 lines
3.8 KiB
PHP

<?php
!defined('IN_UC') && exit('Access Denied');
class control extends pluginbase {
var $md5data = array();
function control() {
$this->pluginbase();
}
function onindex() {
if(!$ucfiles = @file(UC_ROOT.'./control/admin/ucfiles.md5')) {
$this->message('file_check_failed');
}
$this->load('app');
$applist = $_ENV['app']->get_apps();
$this->view->assign('applist', $applist);
$this->checkfiles('./', '\.php', 0, '\.php|\.xml');
$this->checkfiles('control/', '\.php');
$this->checkfiles('model/', '\.php');
$this->checkfiles('lib/', '\.php');
$this->checkfiles('view/', '\.php|\.htm');
$this->checkfiles('js/', '\.js');
foreach($ucfiles as $line) {
$file = trim(substr($line, 34));
$md5datanew[$file] = substr($line, 0, 32);
if($md5datanew[$file] != $this->md5data[$file]) {
$modifylist[$file] = $this->md5data[$file];
}
$md5datanew[$file] = $this->md5data[$file];
}
$weekbefore = $timestamp - 604800;
$addlist = @array_diff_assoc($this->md5data, $md5datanew);
$dellist = @array_diff_assoc($md5datanew, $this->md5data);
$modifylist = @array_diff_assoc($modifylist, $dellist);
$showlist = @array_merge($this->md5data, $md5datanew);
$doubt = 0;
$dirlist = $dirlog = array();
foreach($showlist as $file => $md5) {
$dir = dirname($file);
if(@array_key_exists($file, $modifylist)) {
$fileststus = 'modify';
} elseif(@array_key_exists($file, $dellist)) {
$fileststus = 'del';
} elseif(@array_key_exists($file, $addlist)) {
$fileststus = 'add';
} else {
$filemtime = @filemtime($file);
if($filemtime > $weekbefore) {
$fileststus = 'doubt';
$doubt++;
} else {
$fileststus = '';
}
}
if(file_exists($file)) {
$filemtime = @filemtime($file);
$fileststus && $dirlist[$fileststus][$dir][basename($file)] = array(number_format(filesize($file)).' Bytes', $this->date($filemtime));
} else {
$fileststus && $dirlist[$fileststus][$dir][basename($file)] = array('', '');
}
}
$result = $resultjs = '';
$dirnum = 0;
foreach($dirlist as $status => $filelist) {
$dirnum++;
$result .= '<div id="status_'.$status.'" style="display:'.($status != 'modify' ? 'none' : '').'">';
foreach($filelist as $dir => $files) {
$result .= '<br /><br /><u><b><a>'.$dir.'</a></b></u><br />';
foreach($files as $filename => $file) {
$result .= '<div style="clear:both"><b style="float:left;width: 30%">'.$filename.'</b><div style="float:left;width: 20%">'.$file[0].'</div><div style="float:left;width: 20%">'.$file[1].'</div></div>';
}
}
$result .= '<br /><br /></div>';
$resultjs .= '$(\'status_'.$status.'\').style.display=\'none\';';
}
$modifiedfiles = count($modifylist);
$deletedfiles = count($dellist);
$unknownfiles = count($addlist);
$result .= '<script>function showresult(o) {'.$resultjs.'$(\'status_\' + o).style.display=\'\';}</script>';
$this->view->assign('result', $result);
$this->view->assign('modifiedfiles', $modifiedfiles);
$this->view->assign('deletedfiles', $deletedfiles);
$this->view->assign('unknownfiles', $unknownfiles);
$this->view->assign('doubt', $doubt);
$this->view->display('plugin_filecheck');
}
function checkfiles($currentdir, $ext = '', $sub = 1, $skip = '') {
$dir = @opendir(UC_ROOT.$currentdir);
$exts = '/('.$ext.')$/i';
$skips = explode(',', $skip);
while($entry = @readdir($dir)) {
$file = $currentdir.$entry;
if($entry != '.' && $entry != '..' && (preg_match($exts, $entry) || $sub && is_dir($file)) && !in_array($entry, $skips)) {
if($sub && is_dir($file)) {
$this->checkfiles($file.'/', $ext, $sub, $skip);
} else {
$this->md5data[$file] = md5_file($file);
}
}
}
}
}