AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>./**** @package block* @subpackage rate_course* @copyright 2009 Jenny Gray* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later** Code was Rewritten for Moodle 2.X By Atar + Plus LTD for Comverse LTD.* @copyright © 2011 Comverse LTD.* @license http://www.gnu.org/copyleft/gpl.html GNU Public License*/if (isset($_SERVER['REMOTE_ADDR'])) {define('LINEFEED', "<br />");} else {define('LINEFEED', "\n");}// List of patterns to search.$dml = array ('(begin|commit|rollback)_sql','count_records(_select|_sql)?','delete_records(_select)?','get_field(set)?(_select|sql)?','get_record(s|set)?(_list|_menu|_select|_sql)?(_menu)?','insert_record','record_exists(_select|_sql)?','records_to_menu','recordset_to_(array|menu)','rs_(EOF|close|fetch_next_record|fetch_record|next_record)','set_field(_select)?','update_record',);$helper = array ('db_(lowercase|uppercase)','sql_(as|bitand|bitnot|bitor|bitxor|cast_char2int|ceil|compare_text|concat|concat_join|empty|fullname|ilike|isempty|isnotempty|length|max|null_from_clause|order_by_text|paging_limit|position|substr)');$ddl = array ('add_(field|index|key)','change_field_(default|enum|notnull|precision|type|unsigned)','create_(table|temp_table)','drop_(field|index|key|table)','find_(check_constraint_name|index_name|key_name|sequence_name)','rename_(field|index|key|table)','(check_constraint|field|index|table)_exists');$coreonly = array ('delete_tables_from_xmldb_file','drop_plugin_tables','get_db_directories','get_used_table_names','install_from_xmldb_file',);$internal = array ('change_db_encoding','configure_dbconnection','db_(detect_lobs|update_lobs)','execute_sql(_arr)?','onespace2empty','oracle_dirty_hack','rcache_(get|getforfill|releaseforfill|set|unset|unset_table)','where_clause');$unsupported = array ('column_type','table_column','modify_database','(Execute|Connect|PConnect|ErrorMsg)','(MetaTables|MetaColumns|MetaColumnNames|MetaPrimaryKeys|MetaIndexes)');$other = array ('\$db[,; -]',"[^\$_'\"\.-]dbfamily","[^\$_'\"\.-]dblibrary","[^\$_'\"\.-]dbtype[^s]",'sql_substr\(\)');// Getting current dir.$dir = dirname(__FILE__);echo $me . LINEFEED;// Calculating megarules.$dml_megarule = calculate_megarule($dml, array('[ =@.]'), array('( )?\('), 'i');$helper_megarule = calculate_megarule($helper, array('[ =@.]'), array('( )?\('), 'i');$ddl_megarule = calculate_megarule($ddl, array('[ =@.]'), array('( )?\('), 'i');$coreonly_megarule = calculate_megarule($coreonly, array('[ =@.]'), array('( )?\('), 'i');$internal_megarule = calculate_megarule($internal, array('[ =@.]'), array('( )?\('), 'i');$unsupported_megarule= calculate_megarule($unsupported, array('[ \>=@,.]'), array('( )?\('), 'i');$other_megarule = calculate_megarule($other);// List of exceptions that aren't errors (function declarations, comments and some harcoded strings). False positives.$excludes = '/(function |^\s*\*|^\s*\/\/|\$this-\>[a-zA-Z]*db-\>|^\s*\$CFG-\>(dbtype|dblibrary)\s*=|\$DB-\>(connect|execute)|\$this-\>execute|get_dbtype|protected \$[a-zA-Z]*db|Incorrect |check find_index_name|not available anymore|output|Replace it with the correct use of|where order of parameters is|_moodle_database|invaliddbtype)/';// All rules.$all_megarules = array('DML'=>$dml_megarule,'HELPER'=>$helper_megarule,'DDL'=>$ddl_megarule,'COREONLY'=>$coreonly_megarule,'INTERNAL'=>$internal_megarule,'UNSUPPORTED'=>$unsupported_megarule,'OTHER'=>$other_megarule);// To store errors found.$errors = array();$counterrors = 0;// Process starts here.echo "Checking the $dir directory recursively" . LINEFEED;$files = files_to_check($dir);foreach ($files as $file) {echo " - $file: ";// Read the file, line by line, applying all the megarules.$handle = @fopen($file, 'r');if ($handle) {$line = 0;while (!feof($handle)) {$buffer = fgets($handle, 65535); // Long lines supported on purpose.$line++;// Search for megarules.foreach ($all_megarules as $name => $megarule) {if (!empty($megarule) && preg_match($megarule, $buffer) && !preg_match($excludes, $buffer)) {// Error found, add to errrors.if (!isset($errors[$file])) {$errors[$file] = array();echo LINEFEED . " * ERROR found!" . LINEFEED;}$errors[$file][] = "- ERROR ( $name ) - line $line : " . trim($buffer);echo " - ERROR ( $name ) - line $line : " . trim($buffer) . LINEFEED;$counterrors++;break;}}}if (!isset($errors[$file])) {echo "... OK" . LINEFEED;}fclose($handle);}}echo LINEFEED . LINEFEED;echo " SUMMARY: " . count($errors) . " files with errors ($counterrors ocurrences)" . LINEFEED;foreach ($errors as $file => $errarr) {echo LINEFEED . " * $file" . LINEFEED;foreach ($errarr as $err) {echo " $err" . LINEFEED;}}// INTERNAL FUNCTIONS./*** Given an array of search patterns, create one "megarule", with the specified prefixes and suffixes*/function calculate_megarule($patterns, $prefixes=array(), $suffixes=array(), $modifiers='') {$megarule = '';$totalrule = '';if (empty($patterns)) {return false;}foreach ($patterns as $pattern) {$megarule .= '|(' . $pattern . ')';}$megarule = trim($megarule, '|');// Add all the prefix/suffix combinations.foreach ($prefixes as $prefix) {foreach ($suffixes as $suffix) {$totalrule .= '|(' . $prefix . '(' . $megarule . ')' . $suffix . ')';}}$totalrule = trim($totalrule, '|');return '/' . (empty($totalrule) ? $megarule : $totalrule) . '/' . $modifiers;}/*** Given one full path, return one array with all the files to check*/function files_to_check($path) {$results = array();$pending = array();$dir = opendir($path);while (false !== ($file=readdir($dir))) {$fullpath = $path . '/' . $file;if (substr($file, 0, 1)=='.' || $file=='CVS') { // Exclude some dirs.continue;}if (is_dir($fullpath)) { // Process dirs later.$pending[] = $fullpath;continue;}if (is_file($fullpath) && strpos($file, basename(__FILE__))!==false) { // Exclude me.continue;}if (is_file($fullpath) && (strpos($fullpath, 'lib/adodb')!==false ||strpos($fullpath, 'lib/simpletest')!==false ||strpos($fullpath, 'lib/htmlpurifier')!==false ||strpos($fullpath, 'lib/memcached.class.php')!==false ||strpos($fullpath, 'lib/phpmailer')!==false ||strpos($fullpath, 'lib/soap')!==false ||strpos($fullpath, 'search/Zend/Search')!==false ||strpos($fullpath, 'lang/')!==false)) { // Exclude adodb, simpletest, htmlpurifier, memcached, phpmailer, soap and lucene libs and lang dir.continue;}if (is_file($fullpath) && strpos($file, '.php')===false && strpos($file, '.html')===false) { // Exclude some files.continue;}if (!in_array($fullpath, $results)) { // Add file if doesn't exists.$results[$fullpath] = $fullpath;}}closedir($dir);foreach ($pending as $pend) {$results = array_merge($results, files_to_check($pend));}return $results;}