* -------------------------------------------------------------------- *
* Kurzbeschreibung : Viele Nicht-MySQL-Funktionen (auch Dateizugriff) *
* -------------------------------------------------------------------- *
- * $Revision:: 856 $ *
- * $Date:: 2009-03-06 20:24:32 +0100 (Fr, 06. March 2009) $ *
+ * $Revision:: $ *
+ * $Date:: $ *
* $Tag:: 0.2.1-FINAL $ *
- * $Author:: stelzi $ *
+ * $Author:: $ *
* Needs to be in all Files and every File needs "svn propset *
* svn:keywords Date Revision" (autoprobset!) at least!!!!!! *
* -------------------------------------------------------------------- *
require($INC);
}
-// Check if our config file is writeable or not
-function IS_INC_WRITEABLE ($inc) {
- // Generate FQFN
- $FQFN = sprintf("%sinc/%s.php", constant('PATH'), $inc);
-
- // Abort by simple test
- if ((FILE_READABLE($FQFN)) && (!is_writeable($FQFN))) {
- return false;
- } // END - if
-
- // Test write-access on directory
- return is_writeable(dirname($FQFN));
-}
-
// Output HTML code directly or "render" it. You addionally switch the new-line character off
function OUTPUT_HTML ($HTML, $newLine = true) {
// Some global variables
default:
// Huh, something goes wrong or maybe you have edited config.php ???
DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Invalid renderer %s detected.", constant('OUTPUT_MODE')));
- mxchange_die("<strong>{--FATAL_ERROR--}:</strong> {--LANG_NO_RENDER_DIRECT--}");
+ app_die(__FUNCTION__, __LINE__, "<strong>{--FATAL_ERROR--}:</strong> {--LANG_NO_RENDER_DIRECT--}");
break;
}
} elseif ((constant('_OB_CACHING') == "on") && (isset($GLOBALS['footer_sent'])) && ($GLOBALS['footer_sent'] == 1)) {
// Was that eval okay?
if (empty($newContent)) {
// Something went wrong!
- mxchange_die("Evaluation error:<pre>".htmlentities($eval)."</pre>");
+ app_die(__FUNCTION__, __LINE__, "Evaluation error:<pre>".htmlentities($eval)."</pre>");
} // END - if
$OUTPUT = $newContent;
} // END - while
// Add a fatal error message to the queue array
function addFatalMessage ($F, $L, $message, $extra="") {
+ debug_report_bug($message);
if (is_array($extra)) {
// Multiple extras for a message with masks
$message = call_user_func_array('sprintf', $extra);
}
// Send mail out to an email address
-function SEND_EMAIL($TO, $SUBJECT, $MSG, $HTML = "N", $FROM = "") {
- //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):TO={$TO},SUBJECT={$SUBJECT}<br />\n";
+function SEND_EMAIL($toEmail, $subject, $message, $HTML = "N", $mailHeader = "") {
+ //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):TO={$toEmail},SUBJECT={$subject}<br />\n";
// Compile subject line (for POINTS constant etc.)
- $eval = "\$SUBJECT = decodeEntities(\"".COMPILE_CODE(smartAddSlashes($SUBJECT))."\");";
+ $eval = "\$subject = decodeEntities(\"".COMPILE_CODE(smartAddSlashes($subject))."\");";
eval($eval);
// Set from header
- if ((!eregi("@", $TO)) && ($TO > 0)) {
+ if ((!eregi("@", $toEmail)) && ($toEmail > 0)) {
// Value detected, is the message extension installed?
if (EXT_IS_ACTIVE("msg")) {
- ADD_MESSAGE_TO_BOX($TO, $SUBJECT, $MSG, $HTML);
+ ADD_MESSAGE_TO_BOX($toEmail, $subject, $message, $HTML);
return;
} else {
// Load email address
- $result_email = SQL_QUERY_ESC("SELECT email FROM `{!_MYSQL_PREFIX!}_user_data` WHERE userid=%s LIMIT 1", array(bigintval($TO)), __FUNCTION__, __LINE__);
+ $result_email = SQL_QUERY_ESC("SELECT email FROM `{!_MYSQL_PREFIX!}_user_data` WHERE userid=%s LIMIT 1", array(bigintval($toEmail)), __FUNCTION__, __LINE__);
//* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):numRows=".SQL_NUMROWS($result_email)."<br />\n";
// Does the user exist?
if (SQL_NUMROWS($result_email)) {
// Load email address
- list($TO) = SQL_FETCHROW($result_email);
+ list($toEmail) = SQL_FETCHROW($result_email);
} else {
// Set webmaster
- $TO = constant('WEBMASTER');
+ $toEmail = constant('WEBMASTER');
}
// Free result
SQL_FREERESULT($result_email);
}
- } elseif ("$TO" == "0") {
+ } elseif ("$toEmail" == "0") {
// Is the webmaster!
- $TO = constant('WEBMASTER');
+ $toEmail = constant('WEBMASTER');
}
- //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):TO={$TO}<br />\n";
+ //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):TO={$toEmail}<br />\n";
// Check for PHPMailer or debug-mode
if (!CHECK_PHPMAILER_USAGE()) {
// Not in PHPMailer-Mode
- if (empty($FROM)) {
+ if (empty($mailHeader)) {
// Load email header template
- $FROM = LOAD_EMAIL_TEMPLATE("header");
+ $mailHeader = LOAD_EMAIL_TEMPLATE("header");
} else {
// Append header
- $FROM .= LOAD_EMAIL_TEMPLATE("header");
+ $mailHeader .= LOAD_EMAIL_TEMPLATE("header");
}
} elseif (isDebugModeEnabled()) {
- if (empty($FROM)) {
+ if (empty($mailHeader)) {
// Load email header template
- $FROM = LOAD_EMAIL_TEMPLATE("header");
+ $mailHeader = LOAD_EMAIL_TEMPLATE("header");
} else {
// Append header
- $FROM .= LOAD_EMAIL_TEMPLATE("header");
+ $mailHeader .= LOAD_EMAIL_TEMPLATE("header");
}
}
// Compile "TO"
- $eval = "\$TO = \"".COMPILE_CODE(smartAddSlashes($TO))."\";";
+ $eval = "\$toEmail = \"".COMPILE_CODE(smartAddSlashes($toEmail))."\";";
eval($eval);
// Compile "MSG"
- $eval = "\$MSG = \"".COMPILE_CODE(smartAddSlashes($MSG))."\";";
+ $eval = "\$message = \"".COMPILE_CODE(smartAddSlashes($message))."\";";
eval($eval);
// Fix HTML parameter (default is no!)
if (isDebugModeEnabled()) {
// In debug mode we want to display the mail instead of sending it away so we can debug this part
print("<pre>
-".htmlentities(trim($FROM))."
-To : ".$TO."
-Subject : ".$SUBJECT."
-Message : ".$MSG."
+".htmlentities(trim($mailHeader))."
+To : ".$toEmail."
+Subject : ".$subject."
+Message : ".$message."
</pre>\n");
} elseif (($HTML == "Y") && (EXT_IS_ACTIVE("html_mail"))) {
// Send mail as HTML away
- SEND_HTML_EMAIL($TO, $SUBJECT, $MSG, $FROM);
- } elseif (!empty($TO)) {
+ SEND_HTML_EMAIL($toEmail, $subject, $message, $mailHeader);
+ } elseif (!empty($toEmail)) {
// Send Mail away
- SEND_RAW_EMAIL($TO, $SUBJECT, $MSG, $FROM);
+ SEND_RAW_EMAIL($toEmail, $subject, $message, $mailHeader);
} elseif ($HTML == "N") {
// Problem found!
- SEND_RAW_EMAIL(constant('WEBMASTER'), "[PROBLEM:]".$SUBJECT, $MSG, $FROM);
+ SEND_RAW_EMAIL(constant('WEBMASTER'), "[PROBLEM:]".$subject, $message, $mailHeader);
}
}
/*
* Send out a raw email with PHPMailer class or legacy mail() command
*/
-function SEND_RAW_EMAIL ($to, $subject, $msg, $from) {
+function SEND_RAW_EMAIL ($toEmail, $subject, $msg, $from) {
// Shall we use PHPMailer class or legacy mode?
if (CHECK_PHPMAILER_USAGE()) {
// Use PHPMailer class with SMTP enabled
} else {
$mail->Body = decodeEntities($msg);
}
- $mail->AddAddress($to, "");
+ $mail->AddAddress($toEmail, "");
$mail->AddReplyTo(constant('WEBMASTER'), constant('MAIN_TITLE'));
$mail->AddCustomHeader("Errors-To:".constant('WEBMASTER'));
$mail->AddCustomHeader("X-Loop:".constant('WEBMASTER'));
$mail->Send();
} else {
// Use legacy mail() command
- @mail($to, $subject, decodeEntities($msg), $from);
+ @mail($toEmail, $subject, decodeEntities($msg), $from);
}
}
//
//
function FRAMETESTER ($URL) {
// Prepare frametester URL
- $frametesterUrl = sprintf("%s/modules.php?module=frametester&url=%s",
- URL,
+ $frametesterUrl = sprintf("{!URL!}/modules.php?module=frametester&url=%s",
encodeString(compileUriCode($URL))
);
return $frametesterUrl;
default:
DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Unknown status %s detected.", $status));
- $ret = sprintf(getMessage('UNKNOWN_STATUS"'), $status);
+ $ret = sprintf(getMessage('UNKNOWN_STATUS'), $status);
break;
}
return $code;
} // END - if
- $ARRAY = $GLOBALS['security_chars'];
+ // Init replacement-array with full security characters
+ $secChars = $GLOBALS['security_chars'];
// Select smaller set of chars to replace when we e.g. want to compile URLs
- if (!$full) $ARRAY = $GLOBALS['url_chars'];
+ if (!$full) $secChars = $GLOBALS['url_chars'];
// Compile constants
- if ($constants) {
+ if ($constants === true) {
// BEFORE 0.2.1 : Language and data constants
// WITH 0.2.1+ : Only language constants
$code = str_replace('{--','".', str_replace('--}','."', $code));
} // END - if
// Compile QUOT and other non-HTML codes
- foreach ($ARRAY['to'] as $k => $to) {
+ foreach ($secChars['to'] as $k => $to) {
// Do the reversed thing as in inc/libs/security_functions.php
- $code = str_replace($to, $ARRAY['from'][$k], $code);
+ $code = str_replace($to, $secChars['from'][$k], $code);
} // END - foreach
// But shall I keep simple quotes for later use?
if ($simple) $code = str_replace("'", '{QUOT}', $code);
// Find $content[bla][blub] entries
- @preg_match_all('/\$(content|DATA)((\[([a-zA-Z0-9-_]+)\])*)/', $code, $matches);
+ preg_match_all('/\$(content|DATA)((\[([a-zA-Z0-9-_]+)\])*)/', $code, $matches);
// Are some matches found?
if ((count($matches) > 0) && (count($matches[0]) > 0)) {
// Generate a hash for extra-security for all passwords
function generateHash ($plainText, $salt = "") {
- global $_SERVER;
-
// Is the required extension "sql_patches" there and a salt is not given?
if (((EXT_VERSION_IS_OLDER("sql_patches", "0.3.6")) || (!EXT_IS_ACTIVE("sql_patches"))) && (empty($salt))) {
// Extension sql_patches is missing/outdated so we hash the plain text with MD5
// normally be stored in cookies
function ADD_URL_DATA ($URL) {
// Init add
- $ADD = "";
+ $add = "";
// Determine URL binder
$BIND = "?";
// Cookies are not accepted
if ((REQUEST_ISSET_GET(('refid'))) && (strpos($URL, "refid=") == 0)) {
// Cookie found in URL
- $ADD .= $BIND."refid=".bigintval(REQUEST_GET('refid'));
+ $add .= $BIND."refid=".bigintval(REQUEST_GET('refid'));
} elseif ((GET_EXT_VERSION("sql_patches") != '') && (getConfig('def_refid') > 0)) {
// Not found! So let's set default here
- $ADD .= $BIND."refid=".getConfig('def_refid');
+ $add .= $BIND."refid=".getConfig('def_refid');
}
} // END - if
// Add all together and return it
- return $URL . $ADD;
+ return $URL . $add;
}
// Generate an PGP-like encrypted hash of given hash for e.g. cookies
}
// Output error messages in a fasioned way and die...
-function mxchange_die ($msg) {
+function app_die ($F, $L, $msg) {
// Load header
LOAD_INC_ONCE("inc/header.php");
+ // Prepare message for output
+ $msg = sprintf(getMessage('MXCHANGE_HAS_DIED'), basename($F), $L, $msg);
+
// Load the message template
LOAD_TEMPLATE("admin_settings_saved", false, $msg);
// Get current theme name
function GET_CURR_THEME() {
- global $INC_POOL;
-
// The default theme is 'default'... ;-)
$ret = "default";
}
// Add (maybe) found theme.php file to inclusion list
- $theme = sprintf("%stheme/%s/theme.php", constant('PATH'), SQL_ESCAPE($ret));
+ $INC = sprintf("theme/%s/theme.php", SQL_ESCAPE($ret));
// Try to load the requested include file
- if (FILE_READABLE($theme)) $INC_POOL[] = $theme;
+ if (INCLUDE_READABLE($INC)) ADD_INC_TO_POOL($INC);
// Return theme value
return $ret;
$return = file_put_contents($FQFN, $content);
} else {
// Write it with fopen
- $fp = fopen($FQFN, 'w') or mxchange_die("Cannot write file ".basename($FQFN)."!");
+ $fp = fopen($FQFN, 'w') or app_die(__FUNCTION__, __LINE__, "Cannot write file ".basename($FQFN)."!");
fwrite($fp, $content);
fclose($fp);
} // END - if
}
-// Function to search for the last modifikated file
-function searchDirsRecoursive ($dir, &$last_changed) {
- $ds = scandir($dir); // Needs adjustment for PHP < 5.0.0!!
+// Function to search for the last modifified file
+function searchDirsRecursive ($dir, &$last_changed) {
+ // Get dir as array
+ //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):dir=".$dir."<br />\n";
+ // Does it match what we are looking for? (We skip a lot files already!)
+ // RegexPattern to exclude ., .., .revision, .svn, debug.log or .cache in the filenames
+ $excludePattern = '@(\.|\.\.|\.revision|\.svn|debug\.log|\.cache|config\.php)$@';
+ $ds = GET_DIR_AS_ARRAY($dir, "", true, false, $excludePattern);
+ //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):ds[]=".count($ds)."<br />\n";
+
+ // Walk through all entries
foreach ($ds as $d) {
- $f_name = $dir.'/'.$d; // makes a proper Filename
- if (!preg_match('@(\.|\.\.|\.revision|\.svn|debug\.log|\.cache)$@',$d)) { // no . or .. or .revision or .svn in the filename
- $is_dir = is_dir($f_name);
- if (!$is_dir) { // $f_name is a filename and no directory
- $time = filemtime($f_name);
- if ($last_changed['time'] < $time) { // This file is newer as the file before
- $last_changed['path_name'] = $f_name;
- $last_changed['time'] = $time;
- }
- } elseif ($is_dir) { // $f_name is a directory so also crawl into this directory
- searchDirsRecoursive($f_name, $last_changed);
- }
+ // Generate proper FQFN
+ $FQFN = str_replace("//", "/", constant('PATH') . $dir. "/". $d);
+
+ // Is it a file and readable?
+ //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):FQFN={$FQFN}<br />\n";
+ if (isDirectory($FQFN)) {
+ // $FQFN is a directory so also crawl into this directory
+ $newDir = $d;
+ if (!empty($dir)) $newDir = $dir . "/". $d;
+ //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):DESCENT: ".$newDir."<br />\n";
+ searchDirsRecursive($newDir, $last_changed);
+ } elseif (FILE_READABLE($FQFN)) {
+ // $FQFN is a filename and no directory
+ $time = filemtime($FQFN);
+ //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):File: ".$d." found. (".($last_changed['time'] - $time).")<br />\n";
+ if ($last_changed['time'] < $time) {
+ // This file is newer as the file before
+ //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>) - NEWER!<br />\n";
+ $last_changed['path_name'] = $FQFN;
+ $last_changed['time'] = $time;
+ } // END - if
}
- }
+ } // END - foreach
}
-
// "Getter" for revision/version data
function getActualVersion ($type = 'Revision') {
// By default nothing is new... ;-)
|| count($GLOBALS['cache_array']['revision']) < 3
|| !$GLOBALS['cache_instance']->loadCacheFile("revision")) $new = true;
- if ($new){
-
+ // Is the cache file outdated/invalid?
+ if ($new === true){
$GLOBALS['cache_instance']->destroyCacheFile(); // @TODO isn't it better to do $GLOBALS['cache_instance']->destroyCacheFile('revision')?
// @TODO shouldn't do the unset and the reloading $GLOBALS['cache_instance']->destroyCacheFile() Or a new methode like forceCacheReload('revision')?
unset($GLOBALS['cache_array']['revision']);
+
// Reload load_cach-revison.php
- LOAD_INC('inc/loader/load_cache-revision.php');
- }
+ LOAD_INC("inc/loader/load_cache-revision.php");
+ } // END - if
+ // Return found value
return $GLOBALS['cache_array']['revision'][$type][0];
} else {
- // old Version without ext-cache aktive (depricated ?)
+ // Old Version without ext-cache active (deprecated ?)
// FQFN of revision file
$FQFN = sprintf("%sinc/cache/.revision", constant('PATH'));
// Check if $_GET['check_revision_data'] is setted (switch for manually rewrite the .revision-File)
- if (isset($_GET['check_revision_data']) && $_GET['check_revision_data'] == 'yes') {
+ if ((isset($_GET['check_revision_data'])) && ($_GET['check_revision_data'] == 'yes')) {
+ // Has changed!
$new = true;
-
} else {
// Check for revision file
if (!FILE_READABLE($FQFN)) {
// Revision file found
$ins_vers = explode("\n", READ_FILE($FQFN));
+ // Get array for mapping information
+ $mapper = array_flip(getSearchFor());
+ //* DEBUG: */ print("<pre>".print_r($mapper, true).print_r($ins_vers, true)."</pre>");
+
// Is the content valid?
- if ((!is_array($ins_vers)) || (count($ins_vers) <= 0) || (!isset($ins_vers[$type])) || (trim($ins_vers[$type]) == '') || ($ins_vers[0]) == "new") {
+ if ((!is_array($ins_vers)) || (count($ins_vers) <= 0) || (!isset($ins_vers[$mapper[$type]])) || (trim($ins_vers[$mapper[$type]]) == "") || ($ins_vers[0]) == "new") {
// File needs update!
$new = true;
} else {
- // Revision-File has valid Data and isn't 'new' so return the Rev-Number
- $ttype = array_search ($type,array_keys(getSearchFor()));
- if ($ttype || $ttype != null) return trim($ins_vers[$ttype]);
- else return false;
+ // Return found value
+ return trim($ins_vers[$mapper[$type]]);
}
}
}
+
// Has it been updated?
if ($new === true) {
WRITE_FILE($FQFN, implode("\n", getAkt_vers()));
- }
+ } // END - if
}
}
+// Repares an array we are looking for
+// The returned Array is needed twice (in getAkt_vers() and in getActualVersion() in the old .revision-fallback) so I puted it in an extra function to not polute the global namespace
function getSearchFor () {
- $searchFor[] = 'Revision';
- $searchFor[] = 'Date';
- $searchFor[] = 'Tag';
- $searchFor[] = 'Author';
+ // Add Revision, Date, Tag and Author
+ $searchFor = array('Revision', 'Date', 'Tag', 'Author');
+ // Return the created array
return $searchFor;
}
function getAkt_vers () {
- $next_dir = '.';
- $last_changed['path_name'] = '';
- $last_changed['time'] = 0;
- $akt_vers = array();
- searchDirsRecoursive($next_dir, $last_changed); //Searches all Files and there date of the last modifikation and puts the newest File in $last_changed.
+ // Init variables
+ $next_dir = ""; // Directory to start with search
+ $last_changed = array(
+ 'path_name' => "",
+ 'time' => 0
+ );
+ $akt_vers = array(); // Init return array
+ $res = 0; // Init value for counting the founded keywords
+
+ // Searches all Files and there date of the last modifikation and puts the newest File in $last_changed.
+ searchDirsRecursive($next_dir, $last_changed); // @TODO small change to API to $last_changed = searchDirsRecursive($next_dir, $time);
+
+ // Get file
$last_file = READ_FILE($last_changed['path_name']);
- $ergeb = 0;
+
+ // Get all the keywords to search for
$searchFor = getSearchFor();
+ // This foreach loops the $searchFor-Tags (array('Revision', 'Date', 'Tag', 'Author') --> could easaly extended in the future)
foreach ($searchFor as $search) {
- $ergeb += preg_match('@\$'.$search.'(:|::) (.*) \$@U', $last_file, $t);
+ //Searches for "$search-tag:VALUE$" or "$search-tag::VALUE$"(the stylish keywordversion ;-)) in the lates modified file
+ $res += preg_match('@\$'.$search.'(:|::) (.*) \$@U', $last_file, $t);
+ // This trimms the search-result and puts it in the $akt_vers-return array
if (isset($t[2])) $akt_vers[$search] = trim($t[2]);
- }
+ } // END - foreach
+
+ // Save the last-changed filename for debugging
+ $akt_vers['File'] = $last_changed['path_name'];
+
+ // at least 3 keyword-Tags are needed for propper values
+ if ($res && $res >= 3
+ && isset($akt_vers['Revision']) && $akt_vers['Revision'] != ''
+ && isset($akt_vers['Date']) && $akt_vers['Date'] != ''
+ && isset($akt_vers['Tag']) && $akt_vers['Tag'] != '') {
+ // Prepare content witch need special treadment
+
+ // Prepare timestamp for date
+ preg_match('@(....)-(..)-(..) (..):(..):(..)@', $akt_vers['Date'], $match_d);
+ $akt_vers['Date'] = mktime($match_d[4], $match_d[5], $match_d[6], $match_d[2], $match_d[3], $match_d[1]);
+
+ // Add author to the Tag if the author is set and is not quix0r (lead coder)
+ if ((isset($akt_vers['Author'])) && ($akt_vers['Author'] != "quix0r")) {
+ $akt_vers['Tag'] .= '-'.strtoupper($akt_vers['Author']);
+ } // END - if
- if ($ergeb && $ergeb >= 3) {
- // Prepare content
- preg_match('@(....)-(..)-(..) (..):(..):(..)@',$akt_vers['Date'],$match_d);
- $akt_vers['Date'] = mktime($match_d[4],$match_d[5],$match_d[6],$match_d[2],$match_d[3],$match_d[1]);
- if (isset($akt_vers['Author']) && $akt_vers['Author'] != 'quix0r') $akt_vers['Tag'] .= '-'.strtoupper($akt_vers['Author']);
} else {
- // no valid Data from the last modificated file so read the Revision from the Server. FallbackSolution!! Could be removed I think.
+ // No valid Data from the last modificated file so read the Revision from the Server. Fallback-solution!! Should not be removed I think.
$version = GET_URL("check-updates3.php");
+
// Prepare content
- $akt_vers['Revision'] = trim($version[10]);
- $akt_vers['Date'] = trim($version[9]);
- $akt_vers['Tag'] = trim($version[8]);
+ // Only sets not setted or not proper values to the Online-Server-Fallback-Solution
+ if (!isset($akt_vers['Revision']) || $akt_vers['Revision'] == '') $akt_vers['Revision'] = trim($version[10]);
+ if (!isset($akt_vers['Date']) || $akt_vers['Date'] == '') $akt_vers['Date'] = trim($version[9]);
+ if (!isset($akt_vers['Tag']) || $akt_vers['Tag'] == '') $akt_vers['Tag'] = trim($version[8]);
+ if (!isset($akt_vers['Author']) || $akt_vers['Author'] == '') $akt_vers['Author'] = "quix0r";
}
+
+ // Return prepared array
return $akt_vers;
}
$FQFN = constant('PATH') . $INC;
// Is the include file there?
- if (!FILE_READABLE($FQFN)) {
+ if (!INCLUDE_READABLE($INC)) {
// Not there so log it
debug_report_bug(sprintf("Include file %s not found.", $INC));
return false;
} // END - if
// Add output
- $debug .= ("Please report this error at <a href=\"http://bugs.mxchange.org\" rel=\"external\" target=\"_blank\">bugs.mxchange.org</a>:<pre>");
- $debug .= (debug_get_printable_backtrace());
- $debug .= ("</pre>Thank you for your help finding bugs.");
+ $debug .= "Please report this bug at <a href=\"http://bugs.mxchange.org\" rel=\"external\" target=\"_blank\">bugs.mxchange.org</a>:<pre>";
+ $debug .= debug_get_printable_backtrace();
+ $debug .= "</pre>Request-URI: ".$_SERVER['REQUEST_URI']."<br />\n";
+ $debug .= "Thank you for finding bugs.";
// And abort here
+ // @TODO This cannot be rewritten to app_die(), try to find a solution for this.
die($debug);
}
case getCode('COOKIES_DISABLED') : $msg = getMessage('LOGIN_NO_COOKIES'); break;
case getCode('BEG_SAME_AS_OWN') : $msg = getMessage('BEG_SAME_UID_AS_OWN'); break;
case getCode('LOGIN_FAILED') : $msg = getMessage('LOGIN_FAILED_GENERAL'); break;
- default : $msg = sprintf(getMessage('UNKNOWN_MAILID_CODE'), $code); break;
+ case getCode('MODULE_MEM_ONLY') : $msg = sprintf(getMessage('MODULE_MEM_ONLY'), REQUEST_GET('mod')); break;
+
+ default:
+ // Missing/invalid code
+ $msg = sprintf(getMessage('UNKNOWN_MAILID_CODE'), $code);
+
+ // Log it
+ DEBUG_LOG(__FUNCTION__, __LINE__, $msg);
+ break;
} // END - switch
// Return the message
function DEBUG_LOG ($funcFile, $line, $message, $force=true) {
// Is debug mode enabled?
if ((isDebugModeEnabled()) || ($force === true)) {
+ // Remove CRLF
+ $message = str_replace("\r", "", str_replace("\n", "", $message));
+
// Log this message away
- $fp = fopen(constant('PATH')."inc/cache/debug.log", 'a') or mxchange_die("Cannot write logfile debug.log!");
+ $fp = fopen(constant('PATH')."inc/cache/debug.log", 'a') or app_die(__FUNCTION__, __LINE__, "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
}
-// Reads a directory with PHP files in and gets only files back
-function GET_DIR_AS_ARRAY ($baseDir, $prefix) {
- $INCs = array();
-
- // Open directory
- $dirPointer = opendir(constant('PATH') . $baseDir) or mxchange_die("Cannot read ".basename($baseDir)." path!");
-
- // Read all entries
- while ($baseFile = readdir($dirPointer)) {
- // Load file only if extension is active
- $INC = $baseDir.$baseFile;
- $FQFN = constant('PATH') . $INC;
-
- // Is this a valid reset file?
- //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):baseDir={$baseDir},prefix={$prefix},baseFile={$baseFile}<br />\n";
- 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);
-
- // Try to find it
- $extId = GET_EXT_ID($extName);
-
- // Is the extension valid and active?
- if (($extId > 0) && (EXT_IS_ACTIVE($extName))) {
- // Then add this file
- $INCs[] = $INC;
- } elseif ($extId == 0) {
- // Add non-extension files as well
- $INCs[] = $INC;
- }
- } // END - if
- } // END - while
-
- // Close directory
- closedir($dirPointer);
-
- // Sort array
- asort($INCs);
-
- // Return array with include files
- return $INCs;
-}
-
// Load more reset scripts
function runResetIncludes () {
// Is the reset set or old sql_patches?
} // END - if
// Get more daily reset scripts
- $INC_POOL = GET_DIR_AS_ARRAY("inc/reset/", "reset_");
+ SET_INC_POOL(GET_DIR_AS_ARRAY("inc/reset/", "reset_"));
// Update database
if (!defined('DEBUG_RESET')) UPDATE_CONFIG("last_update", time());
// Has it changed?
if (getConfig('last_week') != $currWeek) {
// Include weekly reset scripts
- $INC_POOL = merge_array($INC_POOL, GET_DIR_AS_ARRAY("inc/weekly/", "weekly_"));
+ MERGE_INC_POOL(GET_DIR_AS_ARRAY("inc/weekly/", "weekly_"));
// Update config
if (!defined('DEBUG_WEEKLY')) UPDATE_CONFIG("last_week", $currWeek);
// Has it changed?
if (getConfig('last_month') != $currMonth) {
// Include monthly reset scripts
- $INC_POOL = merge_array($INC_POOL, GET_DIR_AS_ARRAY("inc/monthly/", "monthly_"));
+ MERGE_INC_POOL(GET_DIR_AS_ARRAY("inc/monthly/", "monthly_"));
// Update config
if (!defined('DEBUG_MONTHLY')) UPDATE_CONFIG("last_month", $currMonth);
} // END - if
// Run the filter
- runFilterChain('load_includes', $INC_POOL);
+ runFilterChain('load_includes');
}
// Handle extra values
// Translates the "pool type" into human-readable
function TRANSLATE_POOL_TYPE ($type) {
- // Default type is unknown
+ // Default?type is unknown
$translated = sprintf(getMessage('POOL_TYPE_UNKNOWN'), $type);
// Generate constant
return $translated;
}
+// Determines the real remote address
+function determineRealRemoteAddress () {
+ // Is a proxy in use?
+ if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
+ // Proxy was used
+ $address = $_SERVER['HTTP_X_FORWARDED_FOR'];
+ } elseif (isset($_SERVER['HTTP_CLIENT_IP'])){
+ // Yet, another proxy
+ $address = $_SERVER['HTTP_CLIENT_IP'];
+ } else {
+ // The regular address when no proxy was used
+ $address = $_SERVER['REMOTE_ADDR'];
+ }
+
+ // This strips out the real address from proxy output
+ if (strstr($address, ",")){
+ $addressArray = explode(",", $address);
+ $address = $addressArray[0];
+ } // END - if
+
+ // Return the result
+ return $address;
+}
+
// "Getter" for remote IP number
function GET_REMOTE_ADDR () {
// Get remote ip from environment
- $remoteAddr = getenv('REMOTE_ADDR');
+ $remoteAddr = determineRealRemoteAddress();
// Is removeip installed?
if (EXT_IS_ACTIVE("removeip")) {
// Determines referal id and sets it
function DETERMINE_REFID () {
- global $CLICK, $_SERVER;
-
// Check if refid is set
- if ((!empty($_GET['user'])) && ($CLICK == 1) && (basename($_SERVER['PHP_SELF']) == "click.php")) {
+ if ((!empty($_GET['user'])) && (basename($_SERVER['PHP_SELF']) == "click.php")) {
// The variable user comes from the click-counter script click.php and we only accept this here
$GLOBALS['refid'] = bigintval($_GET['user']);
} elseif (!empty($_POST['refid'])) {
if (SQL_IS_LINK_UP()) {
// Close link
SQL_CLOSE(__FILE__, __LINE__);
- } elseif (!isInstalling()) {
+ } elseif ((!isInstalling()) && (isInstalled())) {
// No database link
addFatalMessage(__FILE__, __LINE__, getMessage('NO_DB_LINK_SHUTDOWN'));
}
return (isset($GLOBALS['userid']));
}
+// Checks wether the given FQFN is a directory and not .,.. or .svn
+function isDirectory ($FQFN) {
+ // Generate baseName
+ $baseName = basename($FQFN);
+
+ // Check it
+ $isDirectory = ((is_dir($FQFN)) && ($baseName != ".") && ($baseName != "..") && ($baseName != ".svn"));
+
+ // Return the result
+ return $isDirectory;
+}
+
+// Handle message codes from URL
+function handleCodeMessage () {
+ if (REQUEST_ISSET_GET(('msg'))) {
+ // Default extension is "unknown"
+ $ext = "unknown";
+
+ // Is extension given?
+ if (REQUEST_ISSET_GET(('ext'))) $ext = REQUEST_GET(('ext'));
+
+ // Convert the 'msg' parameter from URL to a human-readable message
+ $msg = convertCodeToMessage(REQUEST_GET('msg'));
+
+ // Load message template
+ LOAD_TEMPLATE("message", false, $msg);
+ } // END - if
+}
+
//////////////////////////////////////////////////
// AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS //
//////////////////////////////////////////////////