/** * Processes a checksum list on MyBB files and returns a result set * * @param array The array of checksums and their corresponding files * @return array The bad files */ function verify_files($path = MYBB_ROOT, $count = 0) { global $mybb, $checksums, $bad_verify_files; // We don't need to check these types of files $ignore = array(".", "..", ".svn", "config.php", "settings.php", "Thumb.db", "config.default.php", "lock", "htaccess.txt", "logo.gif"); $ignore_ext = array("attach"); if (substr($path, -1, 1) == "/") { $path = substr($path, 0, -1); } if (!is_array($bad_verify_files)) { $bad_verify_files = array(); } // Make sure that we're in a directory and it's not a symbolic link if (@is_dir($path) && !@is_link($path)) { if ($dh = @opendir($path)) { // Loop through all the files/directories in this directory while (($file = @readdir($dh)) !== false) { if (in_array($file, $ignore) || in_array(get_extension($file), $ignore_ext)) { continue; } // Recurse through the directory tree if (is_dir($path . "/" . $file)) { verify_files($path . "/" . $file, $count + 1); continue; } // We only need the last part of the path (from the MyBB directory to the file. i.e. inc/functions.php) $file_path = "." . str_replace(substr(MYBB_ROOT, 0, -1), "", $path) . "/" . $file; // Does this file even exist in our official list? Perhaps it's a plugin if (array_key_exists($file_path, $checksums)) { $filename = $path . "/" . $file; $handle = fopen($filename, "rb"); $contents = ''; while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); $md5 = md5($contents); // Does it match any of our hashes (unix/windows new lines taken into consideration with the hashes) if (!in_array($md5, $checksums[$file_path])) { $bad_verify_files[] = array("status" => "changed", "path" => $file_path); } } unset($checksums[$file_path]); } @closedir($dh); } } if ($count == 0) { if (!empty($checksums)) { foreach ($checksums as $file_path => $hashes) { if (in_array(basename($file_path), $ignore)) { continue; } $bad_verify_files[] = array("status" => "missing", "path" => $file_path); } } } // uh oh if ($count == 0) { return $bad_verify_files; } }
if (empty($parts[0]) || empty($parts[1])) { continue; } if (substr($parts[1], 0, 7) == "./admin") { $parts[1] = "./{$mybb->config['admin_dir']}" . substr($parts[1], 7); } if (file_exists(MYBB_ROOT . "forums.php") && !file_exists(MYBB_ROOT . "portal.php")) { if (trim($parts[1]) == "./index.php") { $parts[1] = "./forums.php"; } elseif ($parts[1] == "./portal.php") { $parts[1] = "./index.php"; } } $checksums[trim($parts[1])][] = $parts[0]; } $bad_files = verify_files(); $plugins->run_hooks("admin_tools_file_verification_check_commit_start"); $table = new Table(); $table->construct_header($lang->file); $table->construct_header($lang->status, array("class" => "align_center", "width" => 100)); foreach ($bad_files as $file) { switch ($file['status']) { case "changed": $file['status'] = $lang->changed; $color = "#F22B48"; break; case "missing": $file['status'] = $lang->missing; $color = "#5B5658"; break; }