generateHash() does now hash with md5() if sql_patches is missing or out-dated
[mailer.git] / inc / functions.php
index e792e79ddfd553a93e4a3594ddac1be6416d918a..64d80b098bdd0685fb6e3f69cbea2cbb3f3dadb6 100644 (file)
@@ -39,11 +39,20 @@ if (!defined('__SECURITY')) {
 
 // Check if our config file is writeable or not
 function is_INCWritable($inc) {
-       $fp = @fopen(PATH."inc/".$inc.".php", 'a');
+       // Generate FQFN
+       $fqfn = sprintf("%sinc/%s.php", PATH, $inc);
+
+       // Abort by simple test
+       if ((FILE_READABLE($fqfn)) && (!is_writeable($fqfn))) {
+               return false;
+       } // END - if
+
+       // Test if we can append data
+       $fp = @fopen($fqfn, 'a');
        if ($inc == "dummy") {
                // Remove dummy file
                @fclose($fp);
-               return @unlink(PATH."inc/dummy.php");
+               return @unlink($fqfn);
        } else {
                // Close all other files
                return @fclose($fp);
@@ -187,13 +196,18 @@ function OUTPUT_RAW ($HTML) {
 // Add a fatal error message to the queue array
 function ADD_FATAL ($message, $extra="") {
        global $FATAL;
+
        if (empty($extra)) {
                // Regular text message to add to $FATAL
                $FATAL[] = $message;
        } else {
                // $message is text with a mask plus extras to insert into the text
-               $FATAL[] = sprintf($message, $extra);
+               $message = sprintf($message, $extra);
+               $FATAL[] = $message;
        }
+
+       // Log fatal messages away
+       DEBUG_LOG(__FUNCTION__, __LINE__, " message={$message}");
 }
 
 // Load a template file and return it's content (only it's name; do not use ' or ")
@@ -218,21 +232,20 @@ function LOAD_TEMPLATE($template, $return=false, $content=array()) {
                $result = SQL_QUERY_ESC("SELECT gender, surname, family, email FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
                 array($GLOBALS['userid']), __FILE__, __LINE__);
 
-               // @TODO Merge this data into $content
-               list($gender, $surname, $family, $email) = SQL_FETCHROW($result);
+               // Is content an array?
+               if (is_array($content)) {
+                       // Merge data
+                       $content = array_merge($content, SQL_FETCHARRAY($result));
 
-               // Translate gender
-               $gender = TRANSLATE_GENDER($gender);
+                       // Translate gender
+                       $content['gender'] = TRANSLATE_GENDER($content['gender']);
+               } else {
+                       // DEPRECATED: Load data in direct variables
+                       list($gender, $surname, $family, $email) = SQL_FETCHROW($result);
 
-               // Insert data if content is an array
-               if (is_array($content)) {
-                       // Please switch to $content[bla] in all your templates! Direct
-                       // variables are deprecated as of 09/13/2008.
-                       $content['gender']  = $gender;
-                       $content['surname'] = $surname;
-                       $content['family']  = $family;
-                       $content['email']   = $email;
-               } // END - if
+                       // Translate gender
+                       $gender = TRANSLATE_GENDER($gender);
+               }
 
                // Free result
                SQL_FREERESULT($result);
@@ -333,6 +346,10 @@ function LOAD_TEMPLATE($template, $return=false, $content=array()) {
 <br /><br />";
        }
 
+       // Remove content and data
+       unset($content);
+       unset($DATA);
+
        // Do we have some content to output or return?
        if (!empty($ret)) {
                // Not empty so let's put it out! ;)
@@ -410,6 +427,10 @@ function SEND_EMAIL($TO, $SUBJECT, $MSG, $HTML = "N", $FROM = "") {
        $eval = "\$TO = \"".COMPILE_CODE(addslashes($TO))."\";";
        eval($eval);
 
+       // Compile "MSG"
+       $eval = "\$MSG = \"".COMPILE_CODE(addslashes($MSG))."\";";
+       eval($eval);
+
        // Fix HTML parameter (default is no!)
        if (empty($HTML)) $HTML = "N";
        if (isBooleanConstantAndTrue('DEBUG_MODE')) {
@@ -422,16 +443,16 @@ Message : ".$MSG."
 </pre>\n";
 
                // Log the mail away
-               if (defined('DEBUG_MAIL')) DEBUG_LOG(__FUNCTION__.":to={$TO},subject={$SUBJECT},msg={$MSG}");
+               if (defined('DEBUG_MAIL')) DEBUG_LOG(__FUNCTION__, __LINE__, "to={$TO},subject={$SUBJECT},msg={$MSG}");
        } elseif (($HTML == "Y") && (EXT_IS_ACTIVE("html_mail"))) {
                // Send mail as HTML away
                SEND_HTML_EMAIL($TO, $SUBJECT, $MSG, $FROM);
        } elseif (!empty($TO)) {
                // Send Mail away
-               SEND_RAW_EMAIL($TO, COMPILE_CODE($SUBJECT), COMPILE_CODE($MSG), $FROM);
+               SEND_RAW_EMAIL($TO, $SUBJECT, $MSG, $FROM);
        } elseif ($HTML == "N") {
                // Problem found!
-               SEND_RAW_EMAIL(WEBMASTER, COMPILE_CODE($SUBJECT), COMPILE_CODE($MSG), $FROM);
+               SEND_RAW_EMAIL(WEBMASTER, "[PROBLEM:]".$SUBJECT, $MSG, $FROM);
        }
 }
 
@@ -548,13 +569,18 @@ function MAKE_DATETIME ($time, $mode="0")
 }
 
 // Translates the american decimal dot into a german comma
-function TRANSLATE_COMMA ($dotted, $cut=true) {
+function TRANSLATE_COMMA ($dotted, $cut=true, $max=0) {
        global $_CONFIG;
 
        // Default is 3 you can change this in admin area "Misc -> Misc Options"
        if (empty($_CONFIG['max_comma'])) $_CONFIG['max_comma'] = "3";
+
+       // Use from config is default
        $maxComma = $_CONFIG['max_comma'];
 
+       // Use from parameter?
+       if ($max > 0) $maxComma = $max;
+
        // Cut zeros off?
        if ($cut) {
                // Test for commata if in cut-mode
@@ -572,7 +598,7 @@ function TRANSLATE_COMMA ($dotted, $cut=true) {
        } // END - if
 
        // Debug log
-       //DEBUG_LOG(__FUNCTION__.":dotted={$dotted},maxComma={$maxComma}");
+       //DEBUG_LOG(__FUNCTION__, __LINE__, "dotted={$dotted},maxComma={$maxComma}");
 
        // Translate it now
        switch (GET_LANGUAGE()) {
@@ -723,8 +749,11 @@ function LOAD_EMAIL_TEMPLATE($template, $content=array(), $UID="0") {
 
        // Is the admin logged in?
        if (IS_ADMIN()) {
+               // Get admin id
+               $aid = GET_ADMIN_ID(get_session('admin_login'));
+
                // Load Admin data
-               $ADMIN = GET_ADMIN_EMAIL(get_session('admin_login'));
+               $ADMIN = GET_ADMIN_EMAIL($aid);
        } // END - if
 
        // Neutral email address is default
@@ -849,6 +878,10 @@ function LOAD_EMAIL_TEMPLATE($template, $content=array(), $UID="0") {
                if (function_exists('error_get_last')) $newContent .= "\n--------------------------------------\nDebug:\n".print_r(error_get_last(), true)."--------------------------------------\nPlease don't alter these informations!\nThanx.";
        } // END - if
 
+       // Remove content and data
+       unset($content);
+       unset($DATA);
+
        // Return compiled content
        return COMPILE_CODE($newContent);
 }
@@ -1229,7 +1262,7 @@ function bigintval($num, $castValue = true) {
        // Has the whole value changed?
        if ("".$ret."" != "".$num."") {
                // Log the values
-               DEBUG_LOG(__FUNCTION__.": num={$num},ret={$ret}");
+               DEBUG_LOG(__FUNCTION__, __LINE__, " num={$num},ret={$ret}");
        } // END - if
 
        // Return result
@@ -1291,7 +1324,7 @@ function CREATE_TIME_SELECTIONS($timestamp, $prefix="", $display="", $align="cen
        global $_CONFIG;
 
        // Calculate 2-seconds timestamp
-       $stamp = round($timestamp / 2) * 2;
+       $stamp = round($timestamp);
 
        // Do we have a leap year?
        $SWITCH = 0;
@@ -1948,8 +1981,8 @@ function generateHash ($plainText, $salt = "") {
 
        // 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 return the plain text
-               return $plainText;
+               // Extension sql_patches is missing/outdated so we hash the plain text with MD5
+               return md5($plainText);
        } // END - if
 
        // Do we miss an arry element here?
@@ -1969,7 +2002,7 @@ function generateHash ($plainText, $salt = "") {
                $keys   = SITE_KEY.":".DATE_KEY.":".$_CONFIG['secret_key'].":".$_CONFIG['file_hash'].":".date("d-m-Y (l-F-T)", bigintval($_CONFIG['patch_ctime'])).":".$_CONFIG['master_salt'];
 
                // Additional data
-               $data = $plainText.":".uniqid(rand(), true).":".time();
+               $data = $plainText.":".uniqid(mt_rand(), true).":".time();
 
                // Calculate number for generating the code
                $a = time() + _ADD - 1;
@@ -2075,7 +2108,7 @@ function genScrambleString($len) {
        $scrambleString = implode(":", $scrambleNumbers);
        return $scrambleString;
 }
-// Append data like session ID referral ID to the given URL which would
+// Append data like session ID or referal ID to the given URL which would
 // normally be stored in cookies
 function ADD_URL_DATA($URL) {
        global $_CONFIG;
@@ -2329,12 +2362,12 @@ function merge_array ($array1, $array2) {
        die("</pre>");
 }
 // Debug message logger
-function DEBUG_LOG ($message, $force=false) {
+function DEBUG_LOG ($file, $line, $message, $force=false) {
        // Is debug mode enabled?
        if ((isBooleanConstantAndTrue('DEBUG_MODE')) || ($force)) {
                // 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())."|".strip_tags($message)."\n");
+               fwrite($fp, date("d.m.Y|H:i:s", time())."|".basename(__FILE__)."|".__LINE__."|".strip_tags($message)."\n");
                fclose($fp);
        } // END - if
 }
@@ -2374,6 +2407,9 @@ function GET_DIR_AS_ARRAY ($baseDir, $prefix) {
        // Close directory
        closedir($dirPointer);
 
+       // Sort array
+       asort($INCs);
+
        // Return array with include files
        return $INCs;
 }
@@ -2390,6 +2426,9 @@ function RESET_ADD_INCLUDES () {
        // Get more daily reset scripts
        $INC_POOL = GET_DIR_AS_ARRAY(PATH."inc/reset/", "reset_");
 
+       // Update database
+       if (!defined('DEBUG_RESET')) UPDATE_CONFIG("last_update", time());
+
        // Create current week mark
        $currWeek = date("W", time());
 
@@ -2399,7 +2438,7 @@ function RESET_ADD_INCLUDES () {
                $INC_POOL = array_merge($INC_POOL, GET_DIR_AS_ARRAY(PATH."inc/weekly/", "weekly_"));
 
                // Update config
-               UPDATE_CONFIG("last_week", $currWeek);
+               if (!defined('DEBUG_WEEKLY')) UPDATE_CONFIG("last_week", $currWeek);
        } // END - if
 
        // Create current month mark
@@ -2411,7 +2450,7 @@ function RESET_ADD_INCLUDES () {
                $INC_POOL = array_merge($INC_POOL, GET_DIR_AS_ARRAY(PATH."inc/monthly/", "monthly_"));
 
                // Update config
-               UPDATE_CONFIG("last_month", $currMonth);
+               if (!defined('DEBUG_MONTHLY')) UPDATE_CONFIG("last_month", $currMonth);
        } // END - if
 
        // Return array
@@ -2559,7 +2598,7 @@ function REBUILD_CACHE ($cache, $inc="") {
                                require($fqfn);
                        } else {
                                // Include not found!
-                               DEBUG_LOG(__FUNCTION__.":Include {$inc} not found. cache={$cache}");
+                               DEBUG_LOG(__FUNCTION__, __LINE__, "Include {$inc} not found. cache={$cache}");
                        }
                } // END - if
        } // END - if
@@ -2574,7 +2613,7 @@ function CACHE_PURGE_ADMIN_MENU ($id=0, $action="", $what="", $str="") {
                return false;
        } elseif (!is_object($cacheInstance)) {
                // No cache instance!
-               DEBUG_LOG(__FUNCTION__.": No cache instance found.");
+               DEBUG_LOG(__FUNCTION__, __LINE__, " No cache instance found.");
                return false;
        } elseif ((!isset($_CONFIG['cache_admin_menu'])) || ($_CONFIG['cache_admin_menu'] == "N")) {
                // Caching disabled (currently experiemental!)
@@ -2657,7 +2696,79 @@ function GET_REFERER () {
        // Return it
        return $referer;
 }
-//
+
+// Adds a bonus mail to the queue
+// This is a high-level function!
+function ADD_NEW_BONUS_MAIL ($data, $mode="", $output=true) {
+       // Use mode from data if not set and availble ;-)
+       if ((empty($mode)) && (isset($data['mode']))) $mode = $data['mode'];
+
+       // Generate receiver list
+       $RECEIVER = GENERATE_RECEIVER_LIST($data['cat'], $data['receiver'], $mode);
+
+       // Receivers added?
+       if (!empty($RECEIVER)) {
+               // Add bonus mail to queue
+               ADD_BONUS_MAIL_TO_QUEUE(
+                       $data['subject'],
+                       $data['text'],
+                       $RECEIVER,
+                       $data['points'],
+                       $data['seconds'],
+                       $data['url'],
+                       $data['cat'],
+                       $mode,
+                       $data['receiver']
+               );
+
+               // Mail inserted into bonus pool
+               if ($output) LOAD_TEMPLATE("admin_settings_saved", false, ADMIN_BONUS_SEND);
+       } elseif ($output) {
+               // More entered than can be reached!
+               LOAD_TEMPLATE("admin_settings_saved", false, ADMIN_MORE_SELECTED);
+       } else {
+               // Debug log
+               DEBUG_LOG(__FUNCTION__, __LINE__, " cat={$data['cat']},receiver={$data['receiver']},data=".base64_encode(serialize($data))." More selected, than available!");
+       }
+}
+// Determines referal id and sets it
+function DETERMINE_REFID () {
+       global $_CONFIG, $CLICK, $_SERVER;
+
+       // Check if refid is set
+       if ((!empty($_GET['user'])) && ($CLICK == 1) && (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'])) {
+               // Get referal id from variable refid (so I hope this makes my script more compatible to other scripts)
+               $GLOBALS['refid'] = SQL_ESCAPE(strip_tags($_POST['refid']));
+       } elseif (!empty($_GET['refid'])) {
+               // Get referal id from variable refid (so I hope this makes my script more compatible to other scripts)
+               $GLOBALS['refid'] = SQL_ESCAPE(strip_tags($_GET['refid']));
+       } elseif (!empty($_GET['ref'])) {
+               // Set refid=ref (the referal link uses such variable)
+               $GLOBALS['refid'] = SQL_ESCAPE(strip_tags($_GET['ref']));
+       } elseif ((isSessionVariableSet('refid')) && (get_session('refid') != 0)) {
+               // Set session refid als global
+               $GLOBALS['refid'] = bigintval(get_session('refid'));
+       } elseif ((GET_EXT_VERSION("sql_patches") != "") && ($_CONFIG['def_refid'] > 0)) {
+               // Set default refid as refid in URL
+               $GLOBALS['refid'] = bigintval($_CONFIG['def_refid']);
+       } elseif ((GET_EXT_VERSION("user") >= "0.3.4") && ($_CONFIG['select_user_zero_refid']) == "Y") {
+               // Select a random user which has confirmed enougth mails
+               $GLOBALS['refid'] = SELECT_RANDOM_REFID();
+       } else {
+               // No default ID when sql_patches is not installed or none set
+               $GLOBALS['refid'] = 0;
+       }
+
+       // Set cookie when default refid > 0
+       if (!isSessionVariableSet('refid') || (!empty($GLOBALS['refid'])) || ((get_session('refid') == "0") && (isset($_CONFIG['def_refid'])) && ($_CONFIG['def_refid'] > 0))) {
+               // Set cookie
+               set_session('refid', $GLOBALS['refid']);
+       } // END - if
+}
+
 //////////////////////////////////////////////////
 //                                              //
 // AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS //