X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Ffunctions.php;h=a55dda49c181db6def6913bd2a896880de657fb4;hp=ffdcd76a16eeb7907da966e0e3668550578750cd;hb=9741be1a19dd09fe6a5b4f7c92e2b2d57399bd21;hpb=1cf72a9c1a5e737509af79d49f0731da2eb6a218 diff --git a/inc/functions.php b/inc/functions.php index ffdcd76a16..a55dda49c1 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -139,7 +139,7 @@ function OUTPUT_HTML ($HTML, $newLine = true) { while (strpos($OUTPUT, '{!') > 0) { // Prepare the content and eval() it... $newContent = ""; - $eval = "\$newContent = \"".COMPILE_CODE(addslashes($OUTPUT))."\";"; + $eval = "\$newContent = \"".COMPILE_CODE(SQL_ESCAPE($OUTPUT))."\";"; @eval($eval); // Was that eval okay? @@ -160,7 +160,7 @@ function OUTPUT_HTML ($HTML, $newLine = true) { // Compile and run finished rendered HTML code while (strpos($OUTPUT, '{!') > 0) { - $eval = "\$OUTPUT = \"".COMPILE_CODE(addslashes($OUTPUT))."\";"; + $eval = "\$OUTPUT = \"".COMPILE_CODE(SQL_ESCAPE($OUTPUT))."\";"; eval($eval); } // END - while @@ -251,7 +251,9 @@ function LOAD_TEMPLATE ($template, $return=false, $content=array()) { // Translate gender $content['gender'] = TRANSLATE_GENDER($content['gender']); } else { - // DEPRECATED: Load data in direct variables + // @DEPRECATED + // @TODO Fine all templates which are using these direct variables and rewrite them. + // @TODO After this step is done, this else-block is history list($gender, $surname, $family, $email) = SQL_FETCHROW($result); // Translate gender @@ -301,7 +303,7 @@ function LOAD_TEMPLATE ($template, $return=false, $content=array()) { //////////////////////// // Generate file name // //////////////////////// - $file = $BASE.$MODE.$template.".tpl"; + $FQFN = $BASE.$MODE.$template.".tpl"; if ((!empty($GLOBALS['what'])) && ((strpos($template, "_header") > 0) || (strpos($template, "_footer") > 0)) && (($MODE == "guest/") || ($MODE == "member/") || ($MODE == "admin/"))) { // Select what depended header/footer template file for admin/guest/member area @@ -313,22 +315,22 @@ function LOAD_TEMPLATE ($template, $return=false, $content=array()) { ); // Probe for it... - if (FILE_READABLE($file2)) $file = $file2; + if (FILE_READABLE($file2)) $FQFN = $file2; // Remove variable from memory unset($file2); } // Does the special template exists? - if (!FILE_READABLE($file)) { + if (!FILE_READABLE($FQFN)) { // Reset to default template - $file = $BASE.$template.".tpl"; + $FQFN = $BASE.$template.".tpl"; } // END - if // Now does the final template exists? - if (FILE_READABLE($file)) { + if (FILE_READABLE($FQFN)) { // The local file does exists so we load it. :) - $tmpl_file = READ_FILE($file); + $tmpl_file = READ_FILE($FQFN); // Replace ' to our own chars to preventing them being quoted while (strpos($tmpl_file, "'") !== false) { $tmpl_file = str_replace("'", '{QUOT}', $tmpl_file); } @@ -337,7 +339,7 @@ function LOAD_TEMPLATE ($template, $return=false, $content=array()) { $ret = ""; if ((strpos($tmpl_file, "\$") !== false) || (strpos($tmpl_file, '{--') !== false) || (strpos($tmpl_file, '--}') > 0)) { // Okay, compile it! - $tmpl_file = "\$ret=\"".COMPILE_CODE(addslashes($tmpl_file))."\";"; + $tmpl_file = "\$ret=\"".COMPILE_CODE(SQL_ESCAPE($tmpl_file))."\";"; eval($tmpl_file); } else { // Simply return loaded code @@ -349,7 +351,7 @@ function LOAD_TEMPLATE ($template, $return=false, $content=array()) { } elseif ((IS_ADMIN()) || ((isBooleanConstantAndTrue('mxchange_installing')) && (!isBooleanConstantAndTrue('mxchange_installed')))) { // Only admins shall see this warning or when installation mode is active $ret = "
".TEMPLATE_404."
-(".basename($file).")
+(".basename($FQFN).")

".TEMPLATE_CONTENT."
".print_r($content, true)."
@@ -383,7 +385,7 @@ function SEND_EMAIL($TO, $SUBJECT, $MSG, $HTML = "N", $FROM = "") { //* DEBUG: */ print __FUNCTION__."(".__LINE__."):TO={$TO},SUBJECT={$SUBJECT}
\n"; // Compile subject line (for POINTS constant etc.) - $eval = "\$SUBJECT = html_entity_decode(\"".COMPILE_CODE(addslashes($SUBJECT))."\");"; + $eval = "\$SUBJECT = decodeEntities(\"".COMPILE_CODE(SQL_ESCAPE($SUBJECT))."\");"; eval($eval); // Set from header @@ -436,11 +438,11 @@ function SEND_EMAIL($TO, $SUBJECT, $MSG, $HTML = "N", $FROM = "") { } // Compile "TO" - $eval = "\$TO = \"".COMPILE_CODE(addslashes($TO))."\";"; + $eval = "\$TO = \"".COMPILE_CODE(SQL_ESCAPE($TO))."\";"; eval($eval); // Compile "MSG" - $eval = "\$MSG = \"".COMPILE_CODE(addslashes($MSG))."\";"; + $eval = "\$MSG = \"".COMPILE_CODE(SQL_ESCAPE($MSG))."\";"; eval($eval); // Fix HTML parameter (default is no!) @@ -504,7 +506,7 @@ function SEND_RAW_EMAIL ($to, $subject, $msg, $from) { $mail->WordWrap = 70; $mail->IsHTML(true); } else { - $mail->Body = html_entity_decode($msg); + $mail->Body = decodeEntities($msg); } $mail->AddAddress($to, ""); $mail->AddReplyTo(constant('WEBMASTER'), constant('MAIN_TITLE')); @@ -513,7 +515,7 @@ function SEND_RAW_EMAIL ($to, $subject, $msg, $from) { $mail->Send(); } else { // Use legacy mail() command - @mail($to, $subject, html_entity_decode($msg), $from); + @mail($to, $subject, decodeEntities($msg), $from); } } // @@ -624,35 +626,45 @@ function DEREFERER ($URL) { // Don't de-refer our own links! if (substr($URL, 0, strlen(URL)) != URL) { // De-refer this link - $URL = "modules.php?module=loader&url=".urlencode(base64_encode(gzcompress($URL))); + $URL = "modules.php?module=loader&url=".encodeString(compileUriCode($URL)); } // END - if // Return link return $URL; } -// +// Translate Uni*-like gender to human-readable function TRANSLATE_GENDER ($gender) { - switch ($gender) - { - case "M": $ret = GENDER_M; break; - case "F": $ret = GENDER_F; break; - case "C": $ret = GENDER_C; break; - default : $ret = $gender; break; + // Default + $ret = "!{$gender}!"; + + // Male/female or company? + switch ($gender) { + case "M": $ret = getMessage('GENDER_M'); break; + case "F": $ret = getMessage('GENDER_F'); break; + case "C": $ret = getMessage('GENDER_C'); break; + default: + // Log unknown gender + DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Unknown gender %s detected.", $gender)); + break; } + + // Return translated gender return $ret; } + // -function FRAMETESTER($URL) { +function FRAMETESTER ($URL) { // Prepare frametester URL $frametesterUrl = sprintf("%s/modules.php?module=frametester&url=%s", URL, - urlencode(base64_encode(gzcompress(COMPILE_CODE($URL)))) + encodeString(compileUriCode($URL)) ); return $frametesterUrl; } + // -function SELECTION_COUNT($array) { +function SELECTION_COUNT ($array) { $ret = 0; if (is_array($array)) { foreach ($array as $key => $sel) { @@ -666,31 +678,27 @@ function IMG_CODE ($code, $type, $DATA, $uid) { return "\"Code\""; } // -function TRANSLATE_STATUS($status) { +function TRANSLATE_STATUS ($status) { switch ($status) { case "UNCONFIRMED": - $ret = ACCOUNT_UNCONFIRMED; - break; - case "CONFIRMED": - $ret = ACCOUNT_CONFIRMED; - break; - case "LOCKED": - $ret = ACCOUNT_LOCKED; + $ret = getMessage(sprintf("ACCOUNT_%s", $status)); break; case "": case null: - $ret = ACCOUNT_DELETED; + $ret = getMessage('ACCOUNT_DELETED'); break; default: DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Unknown status %s detected.", $status)); - $ret = UNKNOWN_STATUS_1.$status.UNKNOWN_STATUS_2; + $ret = sprintf(getMessage('UNKNOWN_STATUS"'), $status); break; } + + // Return it return $ret; } // @@ -712,7 +720,7 @@ function GET_LANGUAGE() { $ret = $cacheArray['language']; } elseif (!empty($lang)) { // Check if main language file does exist - if (FILE_READABLE(PATH."inc/language/".$lang.".php")) { + if (FILE_READABLE(constant('PATH')."inc/language/".$lang.".php")) { // Okay found, so let's update cookies SET_LANGUAGE($lang); } @@ -770,7 +778,7 @@ function LOAD_EMAIL_TEMPLATE($template, $content=array(), $UID="0") { // Expiration in a nice output format if (getConfig('auto_purge') == 0) { // Will never expire! - $EXPIRATION = MAIL_WILL_NEVER_EXPIRE; + $EXPIRATION = getMessage('MAIL_WILL_NEVER_EXPIRE'); } else { // Create nice date string $EXPIRATION = CREATE_FANCY_TIME(getConfig('auto_purge')); @@ -822,40 +830,40 @@ function LOAD_EMAIL_TEMPLATE($template, $content=array(), $UID="0") { // Check for admin/guest/member templates if (strpos($template, "admin_") > -1) { // Admin template found - $file = $BASE."admin/".$template.".tpl"; + $FQFN = $BASE."admin/".$template.".tpl"; } elseif (strpos($template, "guest_") > -1) { // Guest template found - $file = $BASE."guest/".$template.".tpl"; + $FQFN = $BASE."guest/".$template.".tpl"; } elseif (strpos($template, "member_") > -1) { // Member template found - $file = $BASE."member/".$template.".tpl"; + $FQFN = $BASE."member/".$template.".tpl"; } else { // Test for extension $test = substr($template, 0, strpos($template, "_")); if (EXT_IS_ACTIVE($test)) { // Set extra path to extension's name - $file = $BASE.$test."/".$template.".tpl"; + $FQFN = $BASE.$test."/".$template.".tpl"; } else { // No special filename - $file = $BASE.$template.".tpl"; + $FQFN = $BASE.$template.".tpl"; } } // Does the special template exists? - if (!FILE_READABLE($file)) { + if (!FILE_READABLE($FQFN)) { // Reset to default template - $file = $BASE.$template.".tpl"; + $FQFN = $BASE.$template.".tpl"; } // END - if // Now does the final template exists? $newContent = ""; - if (FILE_READABLE($file)) { + if (FILE_READABLE($FQFN)) { // The local file does exists so we load it. :) - $tmpl_file = READ_FILE($file); - $tmpl_file = addslashes($tmpl_file); + $tmpl_file = READ_FILE($FQFN); + $tmpl_file = SQL_ESCAPE($tmpl_file); // Run code - $tmpl_file = "\$newContent = html_entity_decode(\"".COMPILE_CODE($tmpl_file)."\");"; + $tmpl_file = "\$newContent = decodeEntities(\"".COMPILE_CODE($tmpl_file)."\");"; @eval($tmpl_file); } elseif (!empty($template)) { // Template file not found! @@ -903,7 +911,7 @@ function LOAD_URL($URL, $addUrlData=true) { global $CSS, $footer; // Compile out URI codes - $URL = COMPILE_CODE($URL); + $URL = compileUriCode($URL); // Check if http(s):// is there if ((substr($URL, 0, 7) != "http://") && (substr($URL, 0, 8) != "https://")) { @@ -1210,31 +1218,37 @@ function ADD_SELECTION($type, $DEFAULT, $prefix="", $id="0") { // function TRANSLATE_YESNO($yn) { - switch ($yn) - { - case "Y": $yn = YES; break; - case "N": $yn = NO; break; - default : $yn = "??? (".$yn.")"; break; + // Default + $yn = "??? (".$yn.")"; + switch ($yn) { + case "Y": $yn = getMessage('YES'); break; + case "N": $yn = getMessage('NO'); break; + default: + // Log unknown value + DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Unknown value %s. Expected Y/N!", $yn)); + break; } + + // Return it return $yn; } // // Deprecated : $length // Optional : $DATA // -function GEN_RANDOM_CODE($length, $code, $uid, $DATA="") { +function GEN_RANDOM_CODE ($length, $code, $uid, $DATA="") { // Fix missing _MAX constant if (!defined('_MAX')) define('_MAX', 15235); // Build server string - $server = $_SERVER['PHP_SELF'].":".GET_USER_AGENT().":".getenv('SERVER_SOFTWARE').":".GET_REMOTE_ADDR().":".":".filemtime(PATH."inc/databases.php"); + $server = $_SERVER['PHP_SELF'].":".GET_USER_AGENT().":".getenv('SERVER_SOFTWARE').":".GET_REMOTE_ADDR().":".":".filemtime(constant('PATH')."inc/databases.php"); // Build key string - $keys = SITE_KEY.":".DATE_KEY; - if (getConfig('secret_key') != null) $keys .= ":".getConfig('secret_key'); - if (getConfig('file_hash') != null) $keys .= ":".getConfig('file_hash'); + $keys = constant('SITE_KEY').":".constant('DATE_KEY'); + if (isConfigEntrySet('secret_key')) $keys .= ":".getConfig('secret_key'); + if (isConfigEntrySet('file_hash')) $keys .= ":".getConfig('file_hash'); $keys .= ":".date("d-m-Y (l-F-T)", bigintval(getConfig('patch_ctime'))); - if (getConfig('master_salt') != null) $keys .= ":".getConfig('master_salt'); + if (isConfigEntrySet('master_salt')) $keys .= ":".getConfig('master_salt'); // Build string from misc data $data = $code.":".$uid.":".$DATA; @@ -1249,18 +1263,18 @@ function GEN_RANDOM_CODE($length, $code, $uid, $DATA="") { // Calculate number for generating the code $a = $code + constant('_ADD') - 1; - if (getConfig('master_hash') != null) { + if (isConfigEntrySet('master_hash')) { // Generate hash with master salt from modula of number with the prime number and other data $saltedHash = generateHash(($a % constant('_PRIME')).":".$server.":".$keys.":".$data.":".date("d-m-Y (l-F-T)", time()).":".$a, getConfig('master_salt')); // Create number from hash - $rcode = hexdec(substr($saltedHash, strlen(getConfig('master_salt')), 9)) / abs(_MAX - $a + sqrt(_ADD)) / pi(); + $rcode = hexdec(substr($saltedHash, strlen(getConfig('master_salt')), 9)) / abs(constant('_MAX') - $a + sqrt(constant('_ADD'))) / pi(); } else { // Generate hash with "hash of site key" from modula of number with the prime number and other data $saltedHash = generateHash(($a % constant('_PRIME')).":".$server.":".$keys.":".$data.":".date("d-m-Y (l-F-T)", time()).":".$a, substr(sha1(SITE_KEY), 0, 8)); // Create number from hash - $rcode = hexdec(substr($saltedHash, 8, 9)) / abs(_MAX - $a + sqrt(_ADD)) / pi(); + $rcode = hexdec(substr($saltedHash, 8, 9)) / abs(constant('_MAX') - $a + sqrt(constant('_ADD'))) / pi(); } // At least 10 numbers shall be secure enought! @@ -1274,6 +1288,7 @@ function GEN_RANDOM_CODE($length, $code, $uid, $DATA="") { // Done building code return $return; } + // Does only allow numbers function bigintval($num, $castValue = true) { // Filter all numbers out @@ -1286,20 +1301,21 @@ function bigintval($num, $castValue = true) { // @TODO Remove this if() block if all is working fine if ("".$ret."" != "".$num."") { // Log the values - debug_report_bug(); + debug_report_bug("{$ret}<>{$num}"); } // END - if // Return result return $ret; } + // Insert the code in $img_code into jpeg or PNG image -function GENERATE_IMAGE($img_code, $header=true) { +function GENERATE_IMAGE ($img_code, $header=true) { if ((strlen($img_code) > 6) || (empty($img_code)) || (getConfig('code_length') == 0)) { // Stop execution of function here because of over-sized code length return; } elseif (!$header) { // Return in an HTML code code - return "\n"; + return "\"Image\"\n"; } // Load image @@ -1320,6 +1336,7 @@ function GENERATE_IMAGE($img_code, $header=true) { } } else { // Exit function here + DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("File for image type %s not found.", getConfig('img_type'))); return; } @@ -1635,7 +1652,7 @@ function CREATE_FANCY_TIME ($stamp) { foreach($data as $k => $v) { if ($v > 0) { // Value is greater than 0 "eval" data to return string - $eval = "\$ret .= \", \".\$v.\" \"._".strtoupper($k).";"; + $eval = "\$ret .= \", \".\$v.\" {--_".strtoupper($k)."--}\";"; eval($eval); break; } // END - if @@ -1647,7 +1664,7 @@ function CREATE_FANCY_TIME ($stamp) { $ret = substr($ret, 2); } else { // Zero seconds - $ret = "0 "._SECONDS; + $ret = "0 {--_SECONDS--}"; } // Return fancy time string @@ -1713,7 +1730,7 @@ function ADD_EMAIL_NAV($PAGES, $offset, $show_form, $colspan, $return=false) { // Extract host from script name function EXTRACT_HOST (&$script) { // Use default SERVER_URL by default... ;) So? - $url = SERVER_URL; + $url = constant('SERVER_URL'); // Is this URL valid? if (substr($script, 0, 7) == "http://") { @@ -1756,8 +1773,8 @@ function GET_URL ($script) { // Generate GET request header $request = "GET /" . trim($script) . " HTTP/1.1\r\n"; $request .= "Host: " . $host . "\r\n"; - $request .= "Referer: " . URL . "/admin.php\r\n"; - $request .= "User-Agent: " . TITLE . "/" . FULL_VERSION . "\r\n"; + $request .= "Referer: " . constant('URL') . "/admin.php\r\n"; + $request .= "User-Agent: " . constant('TITLE') . "/" . constant('FULL_VERSION') . "\r\n"; $request .= "Content-Type: text/plain\r\n"; $request .= "Cache-Control: no-cache\r\n"; $request .= "Connection: Close\r\n\r\n"; @@ -1790,8 +1807,8 @@ function POST_URL ($script, $postData) { // Generate POST request header $request = "POST /" . trim($script) . " HTTP/1.1\r\n"; $request .= "Host: " . $host . "\r\n"; - $request .= "Referer: " . URL . "/admin.php\r\n"; - $request .= "User-Agent: " . TITLE . "/" . FULL_VERSION . "\r\n"; + $request .= "Referer: " . constant('URL') . "/admin.php\r\n"; + $request .= "User-Agent: " . constant('TITLE') . "/" . constant('FULL_VERSION') . "\r\n"; $request .= "Content-type: application/x-www-form-urlencoded\r\n"; $request .= "Content-length: " . strlen($data) . "\r\n"; $request .= "Cache-Control: no-cache\r\n"; @@ -1930,6 +1947,7 @@ function VALIDATE_EMAIL($email) { // Return check result return eregi($regex, $email); } + // Function taken from user comments on www.php.net / function eregi() function VALIDATE_URL ($URL, $compile=true) { // Trim URL a little @@ -1937,7 +1955,7 @@ function VALIDATE_URL ($URL, $compile=true) { //* DEBUG: */ echo $URL."
"; // Compile some chars out... - if ($compile) $URL = COMPILE_CODE($URL, false, false, false); + if ($compile) $URL = compileUriCode($URL, false, false, false); //* DEBUG: */ echo $URL."
"; // Check for the extension filter @@ -1948,8 +1966,9 @@ function VALIDATE_URL ($URL, $compile=true) { // If not installed, perform a simple test. Just make it sure there is always a http:// or // https:// in front of the URLs - return (((substr($URL, 0, 7) == "http://") || (substr($URL, 0, 8) == "https://")) && (strlen($URL) >= 12)); + return isUrlValid($URL); } + // function MEMBER_ACTION_LINKS ($uid, $status = "") { // Define all main targets @@ -1986,11 +2005,14 @@ function MEMBER_ACTION_LINKS ($uid, $status = "") { // Return string return $OUT; } + // Function for backward-compatiblity -function ADD_CATEGORY_table ($MODE, $return=false) { +// @TODO Can this function be deprecated? +function ADD_CATEGORY_TABLE ($MODE, $return=false) { // Load it from the register extension - return REGISTER_ADD_CATEGORY_table ($MODE, $return); + return REGISTER_ADD_CATEGORY_TABLE ($MODE, $return); } + // Generate an email link function CREATE_EMAIL_LINK ($email, $table = "admins") { // Default email link (INSECURE! Spammer can read this by harvester programs) @@ -2033,7 +2055,7 @@ function generateHash ($plainText, $salt = "") { // When the salt is empty build a new one, else use the first x configured characters as the salt if (empty($salt)) { // Build server string - $server = $_SERVER['PHP_SELF'].":".GET_USER_AGENT().":".getenv('SERVER_SOFTWARE').":".GET_REMOTE_ADDR().":".":".filemtime(PATH."inc/databases.php"); + $server = $_SERVER['PHP_SELF'].":".GET_USER_AGENT().":".getenv('SERVER_SOFTWARE').":".GET_REMOTE_ADDR().":".":".filemtime(constant('PATH')."inc/databases.php"); // Build key string $keys = constant('SITE_KEY').":".constant('DATE_KEY').":".getConfig('secret_key').":".getConfig('file_hash').":".date("d-m-Y (l-F-T)", bigintval(getConfig('patch_ctime'))).":".getConfig('master_salt'); @@ -2392,16 +2414,16 @@ function merge_array ($array1, $array2) { } // Both are not arrays - debug_report_bug(__FUNCTION__.":"); + debug_report_bug(__FUNCTION__.": No arrays provided!"); } // Debug message logger -function DEBUG_LOG ($file, $line, $message, $force=true) { +function DEBUG_LOG ($funcFile, $line, $message, $force=true) { // Is debug mode enabled? - if ((isBooleanConstantAndTrue('DEBUG_MODE')) || ($force)) { + if ((isBooleanConstantAndTrue('DEBUG_MODE')) || ($force === true)) { // Log this message away - $fp = fopen(PATH."inc/cache/debug.log", 'a') or mxchange_die("Cannot write logfile debug.log!"); - fwrite($fp, date("d.m.Y|H:i:s", time())."|".basename($file)."|".$line."|".strip_tags($message)."\n"); + $fp = fopen(constant('PATH')."inc/cache/debug.log", 'a') or mxchange_die("Cannot write logfile debug.log!"); + fwrite($fp, date("d.m.Y|H:i:s", time())."|".basename($funcFile)."|".$line."|".strip_tags($message)."\n"); fclose($fp); } // END - if } @@ -2417,11 +2439,11 @@ function GET_DIR_AS_ARRAY ($baseDir, $prefix) { while ($baseFile = readdir($dirPointer)) { // Load file only if extension is active // Make full path - $file = $baseDir.$baseFile; + $FQFN = $baseDir.$baseFile; // Is this a valid reset file? //* DEBUG: */ print __FUNCTION__."(".__LINE__."):baseDir={$baseDir},prefix={$prefix},baseFile={$baseFile}
\n"; - if ((FILE_READABLE($file)) && (substr($baseFile, 0, strlen($prefix)) == $prefix) && (substr($baseFile, -4, 4) == ".php")) { + if ((FILE_READABLE($FQFN)) && (substr($baseFile, 0, strlen($prefix)) == $prefix) && (substr($baseFile, -4, 4) == ".php")) { // Remove both for extension name $extName = substr($baseFile, strlen($prefix), -4); @@ -2431,10 +2453,10 @@ function GET_DIR_AS_ARRAY ($baseDir, $prefix) { // Is the extension valid and active? if (($extId > 0) && (EXT_IS_ACTIVE($extName))) { // Then add this file - $INCs[] = $file; + $INCs[] = $FQFN; } elseif ($extId == 0) { // Add non-extension files as well - $INCs[] = $file; + $INCs[] = $FQFN; } } // END - if } // END - while @@ -2457,7 +2479,7 @@ function RESET_ADD_INCLUDES () { } // END - if // Get more daily reset scripts - $INC_POOL = GET_DIR_AS_ARRAY(PATH."inc/reset/", "reset_"); + $INC_POOL = GET_DIR_AS_ARRAY(constant('PATH')."inc/reset/", "reset_"); // Update database if (!defined('DEBUG_RESET')) UPDATE_CONFIG("last_update", time()); @@ -2468,7 +2490,7 @@ function RESET_ADD_INCLUDES () { // Has it changed? if (getConfig('last_week') != $currWeek) { // Include weekly reset scripts - $INC_POOL = merge_array($INC_POOL, GET_DIR_AS_ARRAY(PATH."inc/weekly/", "weekly_")); + $INC_POOL = merge_array($INC_POOL, GET_DIR_AS_ARRAY(constant('PATH')."inc/weekly/", "weekly_")); // Update config if (!defined('DEBUG_WEEKLY')) UPDATE_CONFIG("last_week", $currWeek); @@ -2480,7 +2502,7 @@ function RESET_ADD_INCLUDES () { // Has it changed? if (getConfig('last_month') != $currMonth) { // Include monthly reset scripts - $INC_POOL = merge_array($INC_POOL, GET_DIR_AS_ARRAY(PATH."inc/monthly/", "monthly_")); + $INC_POOL = merge_array($INC_POOL, GET_DIR_AS_ARRAY(constant('PATH')."inc/monthly/", "monthly_")); // Update config if (!defined('DEBUG_MONTHLY')) UPDATE_CONFIG("last_month", $currMonth); @@ -2628,7 +2650,7 @@ function REBUILD_CACHE ($cache, $inc="") { $INC = sprintf("inc/loader/load_cache-%s.php", $inc); // Is the include there? - if (FILE_READABLE($INC)) { + if (INCLUDE_READABLE($INC)) { // And rebuild it from scratch //* DEBUG: */ print __FUNCTION__."(".__LINE__."): inc={$inc} - LOADED!
\n"; LOAD_INC($INC); @@ -2672,7 +2694,7 @@ function TRANSLATE_POOL_TYPE ($type) { // Does it exist? if (defined($constName)) { // Then use it - $translated = constant($constName); + $translated = getMessage($constName); } // END - if // Return "translation" @@ -2835,6 +2857,12 @@ function IF_APACHE_MODULE_LOADED ($apacheModule) { return (((function_exists('apache_get_modules')) && (in_array($apacheModule, apache_get_modules()))) || (!function_exists('apache_get_modules'))); } +// Merges $_CONFIG with data in given array +function mergeConfig ($newConfig) { + global $_CONFIG; + $_CONFIG = merge_array($_CONFIG, $newConfig); +} + // Getter for $_CONFIG entries function getConfig ($entry) { global $_CONFIG; @@ -3022,10 +3050,22 @@ function READ_FILE ($FQFN, $sqlPrepare = false) { // Writes content to a file function WRITE_FILE ($FQFN, $content) { + // Is the file writeable? + if (((FILE_READABLE($FQFN)) && (!is_writeable($FQFN))) && (!chmod($FQFN, 0644)) { + // Not writeable! + DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("File %s not writeable.", basename($FQFN))); + + // Failed! :( + return false; + } // END - if + + // By default all is failed... + $return = false; + // Is the function there? if (function_exists('file_put_contents')) { // Write it directly - file_put_contents($FQFN, $content); + $return = file_put_contents($FQFN, $content); } else { // Write it with fopen $fp = fopen($FQFN, 'w') or mxchange_die("Cannot write file ".basename($FQFN)."!"); @@ -3033,8 +3073,11 @@ function WRITE_FILE ($FQFN, $content) { fclose($fp); // Set CHMOD rights - chmod($FQFN, 0644); + $return = chmod($FQFN, 0644); } + + // Return status + return $return; } // Generates an error code from given account status @@ -3235,7 +3278,7 @@ function convertCodeToMessage ($code) { case constant('CODE_COOKIES_DISABLED') : $msg = getMessage('LOGIN_NO_COOKIES'); break; case constant('CODE_BEG_SAME_AS_OWN') : $msg = getMessage('BEG_SAME_UID_AS_OWN'); break; case constant('CODE_LOGIN_FAILED') : $msg = getMessage('LOGIN_FAILED_GENERAL'); break; - default : $msg = UNKNOWN_MAILID_CODE_1.$code.UNKNOWN_MAILID_CODE_2; break; + default : $msg = sprintf(getMessage('UNKNOWN_MAILID_CODE'), $code); break; } // END - switch // Return the message @@ -3280,6 +3323,205 @@ function GENERATE_AID_LINK ($aid) { return $admin; } +// Checks wether an include file (non-FQFN better) is readable +function INCLUDE_READABLE ($INC) { + // Construct FQFN + $FQFN = constant('PATH') . $INC; + + // Is it readable? + return FILE_READABLE($FQFN); +} + +// Encode strings +// @TODO Implement $compress +function encodeString ($str, $compress=true) { + $str = urlencode(base64_encode(compileUriCode($str))); + return $str; +} + +// Decode strings encoded with encodeString() +// @TODO Implement $decompress +function decodeString ($str, $decompress=true) { + $str = compileUriCode(base64_decode(urldecode(compileUriCode($str)))); + return $str; +} + +// Compile characters which are allowed in URLs +function compileUriCode ($code, $simple=true) { + // Compile constants + if (!$simple) $code = str_replace("{--", '".', str_replace("--}", '."', $code)); + + // Compile QUOT and other non-HTML codes + $code = str_replace("{DOT}", ".", + str_replace("{SLASH}", "/", + str_replace("{QUOT}", "'", + str_replace("{DOLLAR}", "$", + str_replace("{OPEN_ANCHOR}", "(", + str_replace("{CLOSE_ANCHOR}", ")", + str_replace("{OPEN_SQR}", "[", + str_replace("{CLOSE_SQR}", "]", + str_replace("{PER}", "%", + $code + ))))))))); + + // Return compiled code + return $code; +} + +// Function taken from user comments on www.php.net / function eregi() +function isUrlValid ($url) { + // Prepare URL + $url = strip_tags(str_replace("\\", "", compileUriCode(urldecode($url)))); + + // Allows http and https + $http = "(http|https)+(:\/\/)"; + // Test domain + $domain1 = "([[:alnum:]]([-[:alnum:]])*\.)?([[:alnum:]][-[:alnum:]\.]*[[:alnum:]])(\.[[:alpha:]]{2,5})?"; + // Test double-domains (e.g. .de.vu) + $domain2 = "([-[:alnum:]])?(\.[[:alnum:]][-[:alnum:]\.]*[[:alnum:]])(\.[[:alpha:]]{2,5})(\.[[:alpha:]]{2,5})?"; + // Test IP number + $ip = "([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})"; + // ... directory + $dir = "((/)+([-_\.[:alnum:]])+)*"; + // ... page + $page = "/([-_[:alnum:]][-\._[:alnum:]]*\.[[:alnum:]]{2,5})?"; + // ... and the string after and including question character + $getstring1 = "([\?/]([[:alnum:]][-\._%[:alnum:]]*(=)?([-\@\._:%[:alnum:]])+)(&([[:alnum:]]([-_%[:alnum:]])*(=)?([-\@\[\._:%[:alnum:]])+(\])*))*)?"; + // Pattern for URLs like http://url/dir/doc.html?var=value + $pattern['d1dpg1'] = $http.$domain1.$dir.$page.$getstring1; + $pattern['d2dpg1'] = $http.$domain2.$dir.$page.$getstring1; + $pattern['ipdpg1'] = $http.$ip.$dir.$page.$getstring1; + // Pattern for URLs like http://url/dir/?var=value + $pattern['d1dg1'] = $http.$domain1.$dir."/".$getstring1; + $pattern['d2dg1'] = $http.$domain2.$dir."/".$getstring1; + $pattern['ipdg1'] = $http.$ip.$dir."/".$getstring1; + // Pattern for URLs like http://url/dir/page.ext + $pattern['d1dp'] = $http.$domain1.$dir.$page; + $pattern['d1dp'] = $http.$domain2.$dir.$page; + $pattern['ipdp'] = $http.$ip.$dir.$page; + // Pattern for URLs like http://url/dir + $pattern['d1d'] = $http.$domain1.$dir; + $pattern['d2d'] = $http.$domain2.$dir; + $pattern['ipd'] = $http.$ip.$dir; + // Pattern for URLs like http://url/?var=value + $pattern['d1g1'] = $http.$domain1."/".$getstring1; + $pattern['d2g1'] = $http.$domain2."/".$getstring1; + $pattern['ipg1'] = $http.$ip."/".$getstring1; + // Pattern for URLs like http://url?var=value + $pattern['d1g12'] = $http.$domain1.$getstring1; + $pattern['d2g12'] = $http.$domain2.$getstring1; + $pattern['ipg12'] = $http.$ip.$getstring1; + // Test all patterns + $reg = false; + foreach ($pattern as $key=>$pat) { + // Debug regex? + if (defined('DEBUG_REGEX')) { + $pat = str_replace("[:alnum:]", "0-9a-zA-Z", $pat); + $pat = str_replace("[:alpha:]", "a-zA-Z", $pat); + $pat = str_replace("[:digit:]", "0-9", $pat); + $pat = str_replace(".", "\.", $pat); + $pat = str_replace("@", "\@", $pat); + echo $key."= ".$pat."
"; + } + + // Check if expression matches + $reg = ($reg || preg_match(("^".$pat."^"), $url)); + + // Does it match? + if ($reg === true) break; + } + + // Return true/false + return $reg; +} + +// Smartly adds slashes +function smartAddSlashes ($unquoted) { + $unquoted = str_replace("\\", "", $unquoted); + return addslashes($unquoted); +} + +// Decode entities in a nicer way +function decodeEntities ($str) { + // @TODO We may want to switch over to UTF-8 here! + $decodedString = html_entity_decode($str, ENT_NOQUOTES, "ISO-8859-15"); + + // Return decoded string + return $decodedString; +} + +// Wtites data to a config.php-style file +// @TODO Rewrite this function to use READ_FILE() and WRITE_FILE() +function changeDataInFile ($FQFN, $comment, $prefix, $suffix, $DATA, $seek=0) { + // Initialize some variables + $done = false; + $seek++; + $next = -1; + $found = false; + + // Is the file there and read-/write-able? + if ((FILE_READABLE($FQFN)) && (is_writeable($FQFN))) { + $search = "CFG: ".$comment; + $tmp = $FQFN.".tmp"; + + // Open the source file + $fp = @fopen($FQFN, 'r') or OUTPUT_HTML("READ: ".$FQFN."
"); + + // Is the resource valid? + if (is_resource($fp)) { + // Open temporary file + $fp_tmp = @fopen($tmp, 'w') or OUTPUT_HTML("WRITE: ".$tmp."
"); + + // Is the resource again valid? + if (is_resource($fp_tmp)) { + while (!feof($fp)) { + // Read from source file + $line = fgets ($fp, 1024); + + if (strpos($line, $search) > -1) { $next = 0; $found = true; } + + if ($next > -1) { + if ($next === $seek) { + $next = -1; + $line = $prefix . $DATA . $suffix."\n"; + } else { + $next++; + } + } + + // Write to temp file + fputs($fp_tmp, $line); + } + + // Close temp file + fclose($fp_tmp); + + // Finished writing tmp file + $done = true; + } + + // Close source file + fclose($fp); + + if (($done) && ($found)) { + // Copy back tmp file and delete tmp :-) + @copy($tmp, $FQFN); + @unlink($tmp); + define('_FATAL', false); + } elseif (!$found) { + OUTPUT_HTML("CHANGE: 404!"); + define('_FATAL', true); + } else { + OUTPUT_HTML("TMP: UNDONE!"); + define('_FATAL', true); + } + } + } else { + // File not found, not readable or writeable + OUTPUT_HTML("404: ".$FQFN."
"); + } +} + ////////////////////////////////////////////////// // AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS // //////////////////////////////////////////////////