More globals rewritten, see ticket #100
[mailer.git] / inc / functions.php
index 1dc08094e8e433784ba375824ae1c59a4305fd48..e202db15d3e7750537b78684bf6b0ae533f3c5be 100644 (file)
@@ -41,20 +41,6 @@ if (!defined('__SECURITY')) {
        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
@@ -94,7 +80,7 @@ function OUTPUT_HTML ($HTML, $newLine = true) {
                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)) {
@@ -143,7 +129,7 @@ function OUTPUT_HTML ($HTML, $newLine = true) {
                        // 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
@@ -2172,7 +2158,7 @@ function genScrambleString ($len) {
 // normally be stored in cookies
 function ADD_URL_DATA ($URL) {
        // Init add
-       $ADD = "";
+       $add = "";
 
        // Determine URL binder
        $BIND = "?";
@@ -2182,15 +2168,15 @@ function ADD_URL_DATA ($URL) {
                // 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
@@ -2247,10 +2233,13 @@ function FIX_DELETED_COOKIES ($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);
 
@@ -2480,7 +2469,7 @@ function WRITE_FILE ($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)."!");
+               $fp = fopen($FQFN, 'w') or app_die(__FUNCTION__, __LINE__, "Cannot write file ".basename($FQFN)."!");
                fwrite($fp, $content);
                fclose($fp);
 
@@ -2495,7 +2484,7 @@ function WRITE_FILE ($FQFN, $content) {
 // Generates an error code from given account status
 function GEN_ERROR_CODE_FROM_ACCOUNT_STATUS ($status) {
        // Default error code if unknown account status
-       $ERROR = getCode('UNKNOWN_STATUS');
+       $errorCode = getCode('UNKNOWN_STATUS');
 
        // Generate constant name
        $constantName = sprintf("ID_%s", $status);
@@ -2503,14 +2492,14 @@ function GEN_ERROR_CODE_FROM_ACCOUNT_STATUS ($status) {
        // Is the constant there?
        if (isCodeSet($constantName)) {
                // Then get it!
-               $ERROR = getCode($constantName);
+               $errorCode = getCode($constantName);
        } else {
                // Unknown status
                DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Unknown error status %s detected.", $status));
        }
 
        // Return error code
-       return $ERROR;
+       return $errorCode;
 }
 
 // Clears the output buffer. This function does *NOT* backup sent content.
@@ -2526,7 +2515,10 @@ function clearOutputBuffer () {
 function searchDirsRecursive ($dir, &$last_changed) {
        // Get dir as array
        //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):dir=".$dir."<br />\n";
-       $ds = GET_DIR_AS_ARRAY($dir, "", true, false);
+       // 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
@@ -2534,28 +2526,25 @@ function searchDirsRecursive ($dir, &$last_changed) {
                // Generate proper FQFN
                $FQFN = str_replace("//", "/", constant('PATH') . $dir. "/". $d);
 
-               // Does it match what we are looking for? (We skip a lot files already!)
-               if (!preg_match('@(\.|\.\.|\.revision|\.svn|debug\.log|\.cache)$@', $d)) {      // no . or  ..  or .revision or .svn in the filename
-                       // 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 - if
+               // 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
 }
 
@@ -2627,6 +2616,7 @@ function getActualVersion ($type = 'Revision') {
 }
 
 // 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 () {
        // Add Revision, Date, Tag and Author
        $searchFor = array('Revision', 'Date', 'Tag', 'Author');
@@ -2637,47 +2627,60 @@ function getSearchFor () {
 
 function getAkt_vers () {
        // Init variables
-       $next_dir = "";
+       $next_dir = ""; // Directory to start with search
        $last_changed = array(
                'path_name' => "",
                'time'      => 0
        );
-       $akt_vers = array();
-       $res = 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);
+       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']);
+
+       // Get all the keywords to search for
        $searchFor = getSearchFor();
 
-       // @TODO What does this loop/regex do? Document it, please.
+       // This foreach loops the $searchFor-Tags (array('Revision', 'Date', 'Tag', 'Author') --> could easaly extended in the future)
        foreach ($searchFor as $search) {
+               //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
 
-       if ($res && $res >= 3) {
-               // Prepare content
-               preg_match('@(....)-(..)-(..) (..):(..):(..)@', $akt_vers['Date'], $match_d);
+       // 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 Tag if the author is set and is not quix0r (lead coder)
+               // 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
+
        } else {
-               // No valid Data from the last modificated file so read the Revision from the Server. Fallback-solution!! 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]);
-               $akt_vers['Author']   = "quix0r";
+               // 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
@@ -2691,7 +2694,7 @@ function LOAD_INC ($INC) {
        $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;
@@ -2750,12 +2753,13 @@ function debug_report_bug ($message = "") {
        } // 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 .= "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>Thank you for finding bugs.";
+       $debug .= "</pre>Request-URI: ".$_SERVER['REQUEST_URI']."<br />\n";
+       $debug .= "Thank you for finding bugs.";
 
        // And abort here
-       // @TODO This cannot be rewritten to mxchange_die(), try to find a solution for this.
+       // @TODO This cannot be rewritten to app_die(), try to find a solution for this.
        die($debug);
 }
 
@@ -2828,9 +2832,11 @@ function GENERATE_AID_LINK ($aid) {
        $admin = "<span class=\"admin_note\">{--ADMIN_NO_ADMIN_ASSIGNED--}</span>";
 
        // Zero? = Not assigned
-       if ($aid > 0) {
+       if (bigintval($aid) > 0) {
                // Load admin's login
                $login = GET_ADMIN_LOGIN($aid);
+
+               // Is the login valid?
                if ($login != "***") {
                        // Is the extension there?
                        if (EXT_IS_ACTIVE("admins")) {
@@ -3088,62 +3094,12 @@ function DEBUG_LOG ($funcFile, $line, $message, $force=true) {
                $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, $includeDirs = false, $addBaseDir = true) {
-       // Init includes
-       $INCs = array();
-
-       // Open directory
-       $dirPointer = opendir(constant('PATH') . $baseDir) or mxchange_die("Cannot read ".basename($baseDir)." path!");
-
-       // Read all entries
-       while ($baseFile = readdir($dirPointer)) {
-               // Construct include filename and FQFN
-               $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")) || (($includeDirs) && (isDirectory($FQFN)))) {
-                       // 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
-                               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>): Extension entry ".$baseFile." added.<br />\n";
-                               $INCs[] = $INC;
-                       } elseif ($extId == 0) {
-                               // Add non-extension files as well
-                               //* DEBUG: */ print __FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>): Regular entry ".$baseFile." added.<br />\n";
-                               if ($addBaseDir) {
-                                       $INCs[] = $INC;
-                               } else {
-                                       $INCs[] = $baseFile;
-                               }
-                       }
-               } // 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?
@@ -3363,7 +3319,7 @@ function CACHE_PURGE_ADMIN_MENU ($id=0, $action="", $what="", $str="") {
 
 // 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
@@ -3379,10 +3335,34 @@ function TRANSLATE_POOL_TYPE ($type) {
        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")) {
@@ -3611,51 +3591,6 @@ function isDirectory ($FQFN) {
        return $isDirectory;
 }
 
-// Init INC_POOL
-function INIT_INC_POOL () {
-       $GLOBALS['inc_pool'] = array();
-}
-
-// Setter for INC_POOL
-function SET_INC_POOL ($includePool) {
-       $GLOBALS['inc_pool'] = (array) $includePool;
-}
-
-// Getter for INC_POOL
-function GET_INC_POOL () {
-       return $GLOBALS['inc_pool'];
-}
-
-// Count INC_POOL
-function COUNT_INC_POOL () {
-       return count($GLOBALS['inc_pool']);
-}
-
-// Merge INC_POOL into given
-function MERGE_INC_POOL ($includePool) {
-       SET_INC_POOL(merge_array(GET_INC_POOL(), $includePool));
-}
-
-// Add single include file to INC_POOL
-function ADD_INC_TO_POOL ($INC) {
-       $GLOBALS['inc_pool'][] = (string) $INC;
-}
-
-// Remove an include file from INC_POOL
-function REMOVE_INC_FROM_POOL ($INC) {
-       // First look it up
-       $key = array_search($INC, GET_INC_POOL());
-
-       // Is it valid?
-       if ($key !== false) {
-               // Then remove it
-               unset($GLOBALS['inc_pool'][$key]);
-
-               // And sort the list
-               asort($GLOBALS['inc_pool']);
-       } // END - if
-}
-
 // Handle message codes from URL
 function handleCodeMessage () {
        if (REQUEST_ISSET_GET(('msg'))) {