.
/**
* @package MantisBT
* @copyright Copyright (C) 2000 - 2002 Kenzaburo Ito - kenito@300baud.org
* @copyright Copyright (C) 2002 - 2014 MantisBT Team - mantisbt-dev@lists.sourceforge.net
* @link http://www.mantisbt.org
*/
define( 'PLUGINS_DISABLED', true );
define( 'STRINGS_ENGLISH', 'strings_english.txt' );
$g_skip_lang_load = true;
$t_mantis_dir = dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR;
/**
* MantisBT Core API's
*/
require_once( $t_mantis_dir . 'core.php' );
access_ensure_global_level( config_get_global( 'admin_site_threshold' ) );
if( function_exists( 'xdebug_disable' ) ) {
xdebug_disable();
}
if( !defined( 'T_ML_COMMENT' ) ) {
define( 'T_ML_COMMENT', T_COMMENT );
}
else {
define( 'T_DOC_COMMENT', T_ML_COMMENT );
}
if(!checkfile( $t_mantis_dir . 'lang' . DIRECTORY_SEPARATOR, STRINGS_ENGLISH, true)) {
print_error( "Language file '" . STRINGS_ENGLISH . "' failed.", 'FAILED' );
die;
}
unset( $g_skip_lang_load ) ;
lang_push( 'english' );
set_time_limit( 0 );
html_page_top();
// check core language files
if( function_exists( 'scandir' ) ) {
checklangdir( $t_mantis_dir );
}
else {
$t_lang_files = Array();
foreach( $g_language_choices_arr as $t_lang ) {
if( $t_lang == 'auto' ) {
continue;
}
$t_lang_files[] = $t_lang;
}
asort( $t_lang_files );
checklangdir( $t_mantis_dir, $t_lang_files );
}
// attempt to find plugin language files
echo "
Trying to find+check plugin language files...
";
if( function_exists( 'scandir' ) ) {
checkplugins( config_get( 'plugin_path' ) );
} else {
echo 'php scandir is disabled - skipping
';
}
function checkplugins( $p_path ) {
$t_path = rtrim( $p_path, DIRECTORY_SEPARATOR ) . DIRECTORY_SEPARATOR;
$t_plugins = @scandir( $t_path );
if( false == $t_plugins ) {
print_error( "plugin path $t_path not found or not accessible" );
}
else {
foreach( $t_plugins as $t_plugin ) {
if( $t_plugin[0] == '.' ) {
continue;
}
echo "
Checking language files for plugin $t_plugin:
";
checklangdir( $t_path . $t_plugin );
}
}
}
function checklangdir( $p_path, $p_lang_files = null ) {
$t_path = rtrim( $p_path, DIRECTORY_SEPARATOR ) . DIRECTORY_SEPARATOR . 'lang' . DIRECTORY_SEPARATOR;
if( is_array( $p_lang_files ) ) {
$t_lang_files = $p_lang_files;
}
else {
$t_lang_files = @scandir( $t_path );
}
if( false == $t_lang_files ) {
print_error( "language dir $t_path not found or not accessible" );
}
else {
if( in_array( STRINGS_ENGLISH, $t_lang_files ) ) {
echo "Testing English language file...
";
flush();
checkfile( $t_path, STRINGS_ENGLISH );
}
// Skipping english language, readme and hidden files
foreach( $t_lang_files as $key => $t_lang ) {
if( $t_lang[0] == '.' || $t_lang == 'langreadme.txt' || $t_lang == STRINGS_ENGLISH ) {
unset( $t_lang_files[$key] );
}
}
if( !empty($t_lang_files ) ) {
echo 'Retrieved ', count( $t_lang_files ), ' languages
';
foreach( $t_lang_files as $t_lang ) {
checkfile( $t_path, $t_lang );
}
}
}
}
function checkfile( $p_path, $p_file, $p_quiet = false ) {
if( !$p_quiet) {
echo "Testing language file '$p_file' (phase 1)...
";
flush();
}
$file = $p_path . $p_file;
set_error_handler( 'lang_error_handler' );
$result = checktoken( $file, ($p_file == STRINGS_ENGLISH ) );
restore_error_handler();
if( !$result ) {
print_error( "Language file '$p_file' failed at phase 1.", 'FAILED' );
if( $p_quiet ) {
return false;
}
}
if( !$p_quiet ) {
echo "Testing language file '$p_file' (phase 2)...
";
flush();
} else {
return true;
}
set_error_handler( 'lang_error_handler' );
ob_start();
$result = eval( "require_once( '$file' );" );
$data = ob_get_contents();
ob_end_clean();
restore_error_handler();
if( $result === false ) {
print_error( "Language file '$p_file' failed at eval", 'FAILED' );
if( $p_quiet ) {
return false;
}
}
if( !empty( $data ) ) {
print_error( "Language file '$p_file' failed at require_once (data output: " . var_export( $data, true ) . ")", 'FAILED' );
if( $p_quiet ) {
return false;
}
}
return true;
}
$basevariables = Array();
function checktoken( $file, $base = false ) {
$in_php_code = false;
$variables = Array();
global $basevariables;
$current_var = null;
$last_token = 0;
$set_variable = false;
$variablearr = false;
$twopartstring = false;
$need_end_variable = false;
$source = file_get_contents( $file );
$tokens = @token_get_all( $source );
$expectendarr = false;
$settingvariable = false;
$pass = true;
$fatal = false;
foreach( $tokens as $token ) {
$last_token2 = 0;
if( is_string( $token ) ) {
switch( $token ) {
case '=':
if( $last_token != T_VARIABLE ) {
print_error( "'=' sign without variable (line $line)" );
$pass = false;
}
$set_variable = true;
break;
case '[':
if( $last_token != T_VARIABLE ) {
$pass = false;
}
$variablearr = true;
break;
case ']':
if( !$expectendarr ) {
$pass = false;
}
$expectendarr = false;
$variablearr = false;
break;
case ';':
if( !$need_end_variable ) {
print_error( "function seperator found at unexpected location (line $line)" );
$pass = false;
}
$need_end_variable = false;
break;
case '.':
if( $last_token == T_CONSTANT_ENCAPSED_STRING ) {
$twopartstring = true;
} else {
print_error( "string concat found at unexpected location (line $line)" );
$pass = false;
}
break;
default:
print_error( "unknown token $token" );
$pass = false;
break;
}
} else {
// token array
list( $id, $text, $line ) = $token;
if( $id == T_WHITESPACE || $id == T_COMMENT || $id == T_DOC_COMMENT || $id == T_ML_COMMENT ) {
continue;
}
if( $need_end_variable ) {
if( $twopartstring && $id == T_CONSTANT_ENCAPSED_STRING ) {
$twopartstring = false;
continue;
}
if( $settingvariable && $id == T_STRING ) {
$last_token = T_VARIABLE;
$expectendarr = true;
continue;
}
print_error( "token# $id: " . token_name( $id ) . " = $text (line $line)" );
$pass = false;
}
switch( $id ) {
case T_OPEN_TAG:
$in_php_code = true;
break;
case T_CLOSE_TAG:
$in_php_code = false;
break;
case T_INLINE_HTML:
print_error( "Whitespace in language file outside of PHP code block (line $line)" );
$pass = false;
break;
case T_VARIABLE:
if( $set_variable && $current_var != null ) {
$need_end_variable = true;
$settingvariable = true;
$current_var = null;
break;
}
$current_var = $text;
break;
case T_STRING:
if( $variablearr ) {
$current_var .= $text;
if( !defined( $text ) ) {
print_error( "undefined constant: $text (line $line)" );
}
} else {
print_error( "T_STRING found at unexpected location (line $line)" );
$pass = false;
}
if( strpos( $current_var, "\n" ) !== false ) {
print_error( "NEW LINE in string: $id " . token_name( $id ) . " = $text (line $line)", 'PARSER' );
$pass = false;
$fatal = true;
}
$last_token2 = T_VARIABLE;
$expectendarr = true;
break;
case T_CONSTANT_ENCAPSED_STRING:
if( $token[1][0] != '\'' ) {
print_error( "Language strings should be single-quoted (line $line)" );
}
if( $variablearr ) {
$current_var .= $text;
$last_token2 = T_VARIABLE;
$expectendarr = true;
break;
}
if( $last_token == T_VARIABLE && $set_variable && $current_var != null ) {
if( isset( $variables[$current_var] ) ) {
print_error( "duplicate language string ($current_var ) (line $line)" );
} else {
$variables[$current_var] = $text;
}
if( $base ) {
// english
//if( isset( $basevariables[$current_var] ) ) {
// print_error( "WARN: english string redefined - plugin? $current_var" );
//}
$basevariables[$current_var] = true;
} else {
if( !isset( $basevariables[$current_var] ) ) {
print_error( "'$current_var' is not defined in the English language file", 'WARNING' );
//} else {
// missing translation
}
}
}
if( strpos( $current_var, "\n" ) !== false ) {
print_error( "NEW LINE in string: $id " . token_name( $id ) . " = $text (line $line)", 'PARSER' );
$pass = false;
$fatal = true;
}
$current_var = null;
$need_end_variable = true;
break;
default:
// if (!$in_php_code)
print_error( "$id " . token_name( $id ) . " = $text (line $line)", 'PARSER' );
$pass = false;
break;
}
$last_token = $id;
if( $last_token2 > 0 ) {
$last_token = $last_token2;
}
}
if( $fatal ) {
break;
}
}
return $pass;
}
function lang_error_handler( $p_type, $p_error, $p_file, $p_line, $p_context ) {
print_error( "error handler thrown: " . $p_type . '
' . $p_error . '
' . $p_file . '
' . $p_line . '
' . $p_context );
}
function print_error( $p_string, $p_type = 'ERROR' ) {
echo "$p_type: ", $p_string, '
';
}
html_page_bottom();