$ADMIN_DIRECTORY, 'files' => $FILES_DIRECTORY, 'images' => $IMAGES_DIRECTORY, 'themes' => $THEMES_DIRECTORY, 'plugins' => $PLUGINS_DIRECTORY, 'handlers' => $HANDLERS_DIRECTORY, 'languages' => $LANGUAGES_DIRECTORY, 'downloads' => $DOWNLOADS_DIRECTORY, 'docs' => $DOCS_DIRECTORY); foreach ($maindirs as $maindirs_key => $maindirs_value) { $coredir[$maindirs_key] = substr($maindirs_value, 0, -1); } require_once('core_image.php'); if (e_QUERY) { $fi -> snapshot_interface(); } else if (isset($_POST['scan'])) { $fi -> scan_results(); $fi -> scan_config(); } else { $fi -> scan_config(); } class file_inspector { var $root_dir; var $files = array(); var $parent; var $count = array(); var $results = 0; function file_inspector() { global $e107; set_time_limit(240); $this -> root_dir = $e107 -> file_path; if (substr($this -> root_dir, -1) == '/') { $this -> root_dir = substr($this -> root_dir, 0, -1); } if ($_POST['core'] == 'fail') { $_POST['integrity'] = TRUE; } if (MAGIC_QUOTES_GPC && $_POST['regex']) { $_POST['regex'] = stripslashes($_POST['regex']); } if ($_POST['regex']) { if ($_POST['core'] == 'fail') { $_POST['core'] = 'all'; } $_POST['missing'] = 0; $_POST['integrity'] = 0; } } function scan_config() { global $ns, $rs, $pref; $text = "
"; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; if ($pref['developer']) { $text .= ""; $text .= ""; $text .= ""; $text .= ""; } $text .= "
".FC_LAN_2."
".FC_LAN_3." ".FC_LAN_5.": ".FC_LAN_4."   ".FC_LAN_6."   ".FC_LAN_12."  
".FC_LAN_3." ".FC_LAN_13.": ".FC_LAN_9."   ".FC_LAN_10."  
".FC_LAN_3." ".FC_LAN_7.": ".FC_LAN_9."   ".FC_LAN_10."  
".FC_LAN_3." ".FC_LAN_21.": ".FC_LAN_9."   ".FC_LAN_10."  
".FC_LAN_8.": ".FC_LAN_9."   ".FC_LAN_10."  
".FC_LAN_14.": ".FC_LAN_15."   ".FC_LAN_16."  
".FC_LAN_17."
".FC_LAN_18.": ##
".FC_LAN_19.":
".FC_LAN_20.":
".$rs -> form_button('submit', 'scan', FC_LAN_11)."
"; $ns -> tablerender(FC_LAN_1, $text); } function scan($dir, $image) { $handle = opendir($dir.'/'); while (false !== ($readdir = readdir($handle))) { if ($readdir != '.' && $readdir != '..' && $readdir != '/' && $readdir != 'CVS' && $readdir != 'Thumbs.db' && (strpos('._', $readdir) === FALSE)) { $path = $dir.'/'.$readdir; if (is_dir($path)) { $dirs[$path] = $readdir; } else if (!isset($image[$readdir])) { $files[$readdir] = $this -> checksum($path, TRUE); } } } closedir($handle); if (isset($dirs)) { ksort ($dirs); foreach ($dirs as $dir_path => $dir_list) { $list[$dir_list] = ($set = $this -> scan($dir_path, $image[$dir_list])) ? $set : array(); } } if (isset($files)) { ksort ($files); foreach ($files as $file_name => $file_list) { $list[$file_name] = $file_list; } } return $list; } // Given a full path and filename, looks it up in the list to determine valid actions; returns: // 'check' - file is expected to be present, and validity is to be checked // 'ignore' - file may or may not be present - check its validity if found, but not an error if missing // 'uncalc' - file must be present, but its integrity cannot be checked. // 'nocalc' - file may be present, but its integrity cannot be checked. Not an error if missing function check_action($dir, $name) { global $coredir; if ($name == 'e_inspect.php') return 'nocalc'; // Special case for plugin integrity checking $filename = $dir.'/'.$name; $admin_dir = $this -> root_dir.'/'.$coredir['admin'].'/'; $image_dir = $this -> root_dir.'/'.$coredir['images'].'/'; $test_list = array( $admin_dir.'core_image.php' => 'uncalc', $admin_dir.'filetypes.php' => 'uncalc', $admin_dir.'filetypes_.php' => 'ignore', $admin_dir.'admin_filetypes.php' => 'nocalc', $this -> root_dir.'/e107_config.php' => 'uncalc', $this -> root_dir.'/e107.htaccess' => 'ignore', $this -> root_dir.'/install.php' => 'ignore', $image_dir.'adminlogo.png' => 'uncalc', // Users often change logo $image_dir.'logo.png' => 'uncalc' ); if (isset($test_list[$filename])) return $test_list[$filename]; return 'check'; } // This function does the real work // $list - // $deprecated // $level // $dir // &$tree_end // &$parent_expand function inspect($list, $deprecated, $level, $dir, &$tree_end, &$parent_expand) { global $coredir; unset ($childOut); $parent_expand = false; if (substr($dir, -1) == '/') { $dir = substr($dir, 0, -1); } $dir_id = dechex(crc32($dir)); $this -> files[$dir_id]['.']['level'] = $level; $this -> files[$dir_id]['.']['parent'] = $this -> parent; $this -> files[$dir_id]['.']['file'] = $dir; $directory = $level ? basename($dir) : SITENAME; $level++; foreach ($list as $key => $value) { $this -> parent = $dir_id; if (is_array($value)) { // Entry is a subdirectory - recurse another level $path = $dir.'/'.$key; $child_open = false; $child_end = true; $sub_text .= $this -> inspect($value, $deprecated[$key], $level, $path, $child_end, $child_expand); $tree_end = false; if ($child_expand) { $parent_expand = true; $last_expand = true; } } else { $path = $dir.'/'.$key; $fid = strtolower($key); $this -> files[$dir_id][$fid]['file'] = ($_POST['type'] == 'tree') ? $key : $path; if (($this -> files[$dir_id][$fid]['size'] = filesize($path)) !== FALSE) { // We're checking a file here if ($_POST['core'] != 'none') { // Look at core files $this -> count['core']['num']++; $this -> count['core']['size'] += $this -> files[$dir_id][$fid]['size']; if ($_POST['regex']) { // Developer prefs activated - search file contents according to regex $file_content = file($path); // Get contents of file if (($this -> files[$dir_id][$fid]['size'] = filesize($path)) !== FALSE) { if ($this -> files[$dir_id][$fid]['lines'] = preg_grep("#".$_POST['regex']."#".$_POST['mod'], $file_content)) { // Search string found - add file to list $this -> files[$dir_id][$fid]['file'] = ($_POST['type'] == 'tree') ? $key : $path; $this -> files[$dir_id][$fid]['icon'] = 'file_core.png'; $dir_icon = 'fileinspector.png'; $parent_expand = TRUE; $this -> results++; } else { // Search string not found - discard from list unset($this -> files[$dir_id][$fid]); $known[$dir_id][$fid] = true; $dir_icon = ($dir_icon == 'fileinspector.png') ? $dir_icon : 'folder.png'; } } } else { if ($_POST['integrity']) { // Actually check file integrity switch ($this_action = $this->check_action($dir,$key)) { case 'ignore' : case 'check' : if ($this -> checksum($path) != $value) { $this -> count['fail']['num']++; $this -> count['fail']['size'] += $this -> files[$dir_id][$fid]['size']; $this -> files[$dir_id][$fid]['icon'] = 'file_fail.png'; $dir_icon = 'folder_fail.png'; $parent_expand = TRUE; } else { $this -> count['pass']['num']++; $this -> count['pass']['size'] += $this -> files[$dir_id][$fid]['size']; if ($_POST['core'] != 'fail') { $this -> files[$dir_id][$fid]['icon'] = 'file_check.png'; $dir_icon = ($dir_icon == 'folder_fail.png' || $dir_icon == 'folder_missing.png') ? $dir_icon : 'folder_check.png'; } else { unset($this -> files[$dir_id][$fid]); $known[$dir_id][$fid] = true; } } break; case 'uncalc' : case 'nocalc' : $this -> count['uncalculable']['num']++; $this -> count['uncalculable']['size'] += $this -> files[$dir_id][$fid]['size']; if ($_POST['core'] != 'fail') { $this -> files[$dir_id][$fid]['icon'] = 'file_uncalc.png'; } else { unset($this -> files[$dir_id][$fid]); $known[$dir_id][$fid] = true; } break; } } else { // Just identify as core file $this -> files[$dir_id][$fid]['icon'] = 'file_core.png'; } } } else { unset ($this -> files[$dir_id][$fid]); $known[$dir_id][$fid] = true; } } else if ($_POST['missing']) { switch ($this_action = $this->check_action($dir,$key)) { case 'check' : case 'uncalc' : $this -> count['missing']['num']++; $this -> files[$dir_id][$fid]['icon'] = 'file_missing.png'; $dir_icon = ($dir_icon == 'folder_fail.png') ? $dir_icon : 'folder_missing.png'; $parent_expand = TRUE; break; case 'ignore' : case 'nocalc' : // These files can be missing without error - delete from the list unset ($this -> files[$dir_id][$fid]); $known[$dir_id][$fid] = true; break; } } else { unset ($this -> files[$dir_id][$fid]); } } } if ($_POST['noncore'] || $_POST['oldcore']) { $handle = opendir($dir.'/'); while (false !== ($readdir = readdir($handle))) { if ($readdir != '.' && $readdir != '..' && $readdir != '/' && $readdir != 'CVS' && $readdir != 'Thumbs.db' && (strpos('._', $readdir) === FALSE)) { if (is_dir($dir.'/'.$readdir)) { if (!isset($list[$readdir]) && ($level > 1 || $readdir == 'e107_install')) { $child_open = false; $child_end = true; $sub_text .= $this -> inspect(array(), $deprecated[$readdir], $level, $dir.'/'.$readdir, $child_end, $child_expand); $tree_end = false; if ($child_expand) { $parent_expand = true; $last_expand = true; } } } else { $aid = strtolower($readdir); if (!isset($this -> files[$dir_id][$aid]['file']) && !$known[$dir_id][$aid]) { if (strpos($dir.'/'.$readdir, 'htmlarea') === false) { if (isset($deprecated[$readdir])) { if ($_POST['oldcore']) { $this -> files[$dir_id][$aid]['file'] = ($_POST['type'] == 'tree') ? $readdir : $dir.'/'.$readdir; $this -> files[$dir_id][$aid]['size'] = filesize($dir.'/'.$readdir); $this -> files[$dir_id][$aid]['icon'] = 'file_old.png'; $this -> count['deprecated']['num']++; $this -> count['deprecated']['size'] += $this -> files[$dir_id][$aid]['size']; } } else { if ($_POST['noncore']) { $this -> files[$dir_id][$aid]['file'] = ($_POST['type'] == 'tree') ? $readdir : $dir.'/'.$readdir; $this -> files[$dir_id][$aid]['size'] = filesize($dir.'/'.$readdir); $this -> files[$dir_id][$aid]['icon'] = 'file_unknown.png'; $this -> count['unknown']['num']++; $this -> count['unknown']['size'] += $this -> files[$dir_id][$aid]['size']; } } } else { $this -> files[$dir_id][$aid]['file'] = ($_POST['type'] == 'tree') ? $readdir : $dir.'/'.$readdir; $this -> files[$dir_id][$aid]['size'] = filesize($dir.'/'.$readdir); $this -> files[$dir_id][$aid]['icon'] = 'file_warning.png'; $this -> count['warning']['num']++; $this -> count['warning']['size'] += $this -> files[$dir_id][$aid]['size']; $this -> count['deprecated']['num']++; $this -> count['deprecated']['size'] += $this -> files[$dir_id][$aid]['size']; $dir_icon = 'folder_warning.png'; $parent_expand = TRUE; } if ($_POST['regex']) { $file_content = file($dir.'/'.$readdir); if ($this -> files[$dir_id][$aid]['lines'] = preg_grep("#".$_POST['regex']."#".$_POST['mod'], $file_content)) { $dir_icon = 'fileinspector.png'; $parent_expand = TRUE; $this -> results++; } else { unset($this -> files[$dir_id][$aid]); $dir_icon = ($dir_icon == 'fileinspector.png') ? $dir_icon : 'folder.png'; } } else { if (isset($deprecated[$readdir])) { if ($_POST['oldcore']) { $dir_icon = ($dir_icon == 'folder_warning.png' || $dir_icon == 'folder_fail.png' || $dir_icon == 'folder_missing.png' || $dir_icon == 'folder_old_dir.png') ? $dir_icon : 'folder_old.png'; $parent_expand = TRUE; } } else { if ($_POST['noncore']) { $dir_icon = ($dir_icon == 'folder_warning.png' || $dir_icon == 'folder_fail.png' || $dir_icon == 'folder_missing.png' || $dir_icon == 'folder_old.png' || $dir_icon == 'folder_old_dir.png') ? $dir_icon : 'folder_unknown.png'; $parent_expand = TRUE; } } } } else if ($_POST['core'] == 'none') { unset($this -> files[$dir_id][$aid]); } } } } closedir($handle); } $dir_icon = $dir_icon ? $dir_icon : 'folder.png'; $icon = ""; $hide = ($last_expand && $dir_icon != 'folder_core.png') ? "" : "style='display: none'"; $text = "
"; $text .= $tree_end ? "" : ""; $text .= " ".$icon." ".$directory.""; $text .= $tree_end ? "" : "
".$sub_text."
"; $text .= "
"; $this -> files[$dir_id]['.']['icon'] = $dir_icon; return $text; } function scan_results() { global $ns, $rs, $core_image, $deprecated_image; $scan_text = $this -> inspect($core_image, $deprecated_image, 0, $this -> root_dir); if ($_POST['type'] == 'tree') { $text = "
"; $text .= ""; $text .= ""; $text .= "
".FR_LAN_2."
".$scan_text."
"; } else { $text = "
"; $text .= "
".FR_LAN_2."
"; } $text .= ""; if ($_POST['type'] == 'tree') { $text .= ""; } else { $text .= ""; } if ($_POST['core'] != 'none') { $text .= ""; } if ($_POST['missing']) { $text .= ""; } if ($_POST['noncore']) { $text .= ""; } if ($_POST['oldcore']) { $text .= ""; } if ($_POST['core'] == 'all') { $text .= ""; } if ($this -> count['warning']['num']) { $text .= ""; $text .= ""; $text .= ""; $text .= ""; } if ($_POST['integrity'] && $_POST['core'] != 'none') { $integrity_icon = $this -> count['fail']['num'] ? 'integrity_fail.png' : 'integrity_pass.png'; $integrity_text = $this -> count['fail']['num'] ? '( '.$this -> count['fail']['num'].' '.FR_LAN_19.' )' : '( '.FR_LAN_20.' )'; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; } if ($_POST['type'] == 'tree' && !$this -> results && $_POST['regex']) { $text .= ""; } $text .= "
 ".FR_LAN_3." root_dir))."')\">
 ".FR_LAN_3."
 ".FR_LAN_4.": ".($this -> count['core']['num'] ? $this -> count['core']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['core']['size'], 2)."
 ".FR_LAN_22.": ".($this -> count['missing']['num'] ? $this -> count['missing']['num'] : FR_LAN_21)." 
 ".FR_LAN_5.": ".($this -> count['unknown']['num'] ? $this -> count['unknown']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['unknown']['size'], 2)."
 ".FR_LAN_24.": ".($this -> count['deprecated']['num'] ? $this -> count['deprecated']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['deprecated']['size'], 2)."
 ".FR_LAN_6.": ".($this -> count['core']['num'] + $this -> count['unknown']['num'] + $this -> count['deprecated']['num'])." ".$this -> parsesize($this -> count['core']['size'] + $this -> count['unknown']['size'] + $this -> count['deprecated']['size'], 2)."
 
 ".FR_LAN_26."
 ".FR_LAN_28.": ".($this -> count['warning']['num'] ? $this -> count['warning']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['warning']['size'], 2)."
 ".FR_LAN_27."
 
 ".FR_LAN_7." ".$integrity_text."
 ".FR_LAN_8.": ".($this -> count['pass']['num'] ? $this -> count['pass']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['pass']['size'], 2)."
 ".FR_LAN_9.": ".($this -> count['fail']['num'] ? $this -> count['fail']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['fail']['size'], 2)."
 ".FR_LAN_25.": ".($this -> count['uncalculable']['num'] ? $this -> count['uncalculable']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['uncalculable']['size'], 2)."
 
 ".FR_LAN_10.": 

".FR_LAN_23."
"; if ($_POST['type'] != 'tree') { $text .= "
"; if (!$this -> results && $_POST['regex']) { $text .= ""; } } foreach ($this -> files as $dir_id => $fid) { ksort($fid); $text .= ($_POST['type'] == 'tree') ? "
".FR_LAN_23."
" : ""; $initial = FALSE; foreach ($fid as $key => $stext) { if (!$initial) { if ($_POST['type'] == 'tree') { $text .= ""; } } else { if ($_POST['type'] != 'tree') { $stext['file'] = str_replace($this -> root_dir."/", "", $stext['file']); } $text .= ""; } $initial = TRUE; } $text .= ($_POST['type'] == 'tree') ? "" : ""; } if ($_POST['type'] != 'tree') { $text .= "
"; } $text .= "

"; $ns -> tablerender(FR_LAN_1.'...', $text); } function create_image($dir) { global $core_image, $deprecated_image, $coredir; foreach ($coredir as $trim_key => $trim_dirs) { $search[$trim_key] = "'".$trim_dirs."'"; $replace[$trim_key] = "\$coredir['".$trim_key."']"; } $data = " scan($dir) : $core_image; $image_array = var_export($scan_current, true); $image_array = str_replace($search, $replace, $image_array); $data .= "\$core_image = ".$image_array.";\n\n"; $scan_deprecated = ($_POST['snaptype'] == 'deprecated') ? $this -> scan($dir, $core_image) : $deprecated_image; $image_array = var_export($scan_deprecated, true); $image_array = str_replace($search, $replace, $image_array); $data .= "\$deprecated_image = ".$image_array.";\n\n"; $data .= "?>"; $fp = fopen(e_ADMIN.'core_image.php', 'w'); fwrite($fp, $data); } function snapshot_interface() { global $ns, $rs; $text = ""; if (isset($_POST['create_snapshot'])) { $this -> create_image($_POST['snapshot_path']); $text = "
"; $text .= "
Snapshot Created
The snapshot (".e_ADMIN."core_image.php) was successfully created.
".$rs -> form_button('submit', 'main_page', 'Return To Main Page')."

"; } $text .= "
"; $text .= "
Create Snapshot
Absolute path of root directory to create image from: root_dir)."' />
Create snapshot of current or deprecated core files: Current   Deprecated  
".$rs -> form_button('submit', 'create_snapshot', 'Create Snapshot')."
"; $ns -> tablerender('Snapshot', $text); } function checksum($filename) { $checksum = md5(str_replace(array(chr(13),chr(10)), "", file_get_contents($filename))); return $checksum; } function parsesize($size, $dec = 0) { $size = $size ? $size : 0; $kb = 1024; $mb = 1024 * $kb; $gb = 1024 * $mb; $tb = 1024 * $gb; if ($size < $kb) { return $size." b"; } else if($size < $mb) { return round($size/$kb)." kb"; } else if($size < $gb) { return round($size/$mb, $dec)." mb"; } else if($size < $tb) { return round($size/$gb, $dec)." gb"; } else { return round($size/$tb, $dec)." tb"; } } function regex_match($file) { $file_content = file_get_contents($file); $match = preg_match($_POST['regex'], $file_content); return $match; } } require_once('footer.php'); function headerjs() { global $e107; $text = " \n"; return $text; } ?>