// 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);
default:
// Huh, something goes wrong or maybe you have edited config.php ???
- die ("<STRONG>".FATAL_ERROR.":</STRONG> ".LANG_NO_RENDER_DIRECT);
+ DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Invalid renderer %s detected.", OUTPUT_MODE));
+ MXCHANGE_DIE("<STRONG>".FATAL_ERROR.":</STRONG> ".LANG_NO_RENDER_DIRECT);
break;
}
} elseif ((_OB_CACHING == "on") && ($footer == 1)) {
// Clear output buffer for later output
ob_end_clean();
+ // Send HTTP header
+ header("HTTP/1.1 200");
+
+ // Used later
+ $now = gmdate('D, d M Y H:i:s') . ' GMT';
+
+ // General headers for no caching
+ header("Expired: " . $now); // RFC2616 - Section 14.21
+ header("Last-Modified: " . $now);
+ header("Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0"); // HTTP/1.1
+ header("Pragma: no-cache"); // HTTP/1.0
+ header("Connection: Close");
+
// Extension "rewrite" installed?
if ((EXT_IS_ACTIVE("rewrite")) && (function_exists('REWRITE_LINKS')) && ($CSS != "1") && ($CSS != "-1")) {
$OUTPUT = REWRITE_LINKS($OUTPUT);
// 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 ")
$ret = "";
if (empty($GLOBALS['refid'])) $GLOBALS['refid'] = 0;
- // @DEPRECATED Try to remove this if() block
+ // @DEPRECATED Try to rewrite the if() condition
if ($template == "member_support_form") {
// Support request of a member
- $result = SQL_QUERY_ESC("SELECT gender, surname, family, email FROM "._MYSQL_PREFIX."_user_data WHERE userid=%s LIMIT 1",
- array($GLOBALS['userid']), __FILE__, __LINE__);
+ $result = SQL_QUERY_ESC("SELECT userid, 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);
+ DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("DEPRECATION-WARNING: content is not array (%s).", gettype($content)));
+ }
// Free result
SQL_FREERESULT($result);
<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! ;)
$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')) {
</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);
}
}
$mail->WordWrap = 70;
$mail->IsHTML(true);
} else {
- $mail->Body = $msg;
+ $mail->Body = html_entity_decode($msg);
}
$mail->AddAddress($to, "");
$mail->AddReplyTo(WEBMASTER,MAIN_TITLE);
$mail->Send();
} else {
// Use legacy mail() command
- @mail($to, $subject, $msg, $from);
+ @mail($to, $subject, html_entity_decode($msg), $from);
}
}
//
$PASS = "";
for ($i = 0; $i < $LEN; $i++) {
$PASS .= $ABC[mt_rand(0, sizeof($ABC) -1)];
- }
+ } // END - for
// When the size is below 40 we can also add additional security by scrambling it
if (strlen($PASS) <= 40) {
// Also scramble the password
$PASS = scrambleString($PASS);
- }
+ } // END - if
// Return the password
return $PASS;
case "1": $ret = strtolower(date("d.m.Y - H:i", $time)); break;
case "2": $ret = date("d.m.Y|H:i", $time); break;
case "3": $ret = date("d.m.Y", $time); break;
+ default:
+ DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Invalid date mode %s detected.", $mode));
+ break;
}
break;
case "1": $ret = date("Y-m-d - g:i A", $time); break;
case "2": $ret = date("y-m-d|H:i", $time); break;
case "3": $ret = date("y-m-d", $time); break;
+ default:
+ DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Invalid date mode %s detected.", $mode));
+ break;
}
}
return $ret;
}
// 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
} // 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()) {
//
function DEREFERER ($URL) {
- $URL = URL."/modules.php?module=loader&url=".urlencode(base64_encode(gzcompress($URL)));
+ // Don't de-refer our own links!
+ if (substr($URL, 0, strlen(URL)) != URL) {
+ // De-refer this link
+ $URL = URL."/modules.php?module=loader&url=".urlencode(base64_encode(gzcompress($URL)));
+ } // END - if
+
+ // Return link
return $URL;
}
break;
default:
+ DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("Unknown status %s detected.", $status));
$ret = UNKNOWN_STATUS_1.$status.UNKNOWN_STATUS_2;
break;
}
// 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
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);
}
function LOAD_URL($URL, $addUrlData=true) {
global $CSS, $_CONFIG, $footer;
+ // Compile out URI codes
+ $URL = COMPILE_CODE($URL);
+
// Check if http(s):// is there
if ((substr($URL, 0, 7) != "http://") && (substr($URL, 0, 8) != "https://")) {
// Make all URLs full-qualified
$URL = URL."/".$URL;
}
- // Compile out URI codes
- $URL = COMPILE_CODE($URL);
-
// Get output buffer
$OUTPUT = ob_get_contents();
global $SEC_CHARS, $URL_CHARS;
// Is the code a string?
if (!is_string($code)) {
- // Abort here with backtrace
- DEBUG_LOG(__FUNCTION__.": code is not string!");
- print "<pre>";
- debug_print_backtrace();
- die("</pre>");
+ // Silently return it
+ return $code;
} // END - if
$ARRAY = $SEC_CHARS;
// Has the whole value changed?
if ("".$ret."" != "".$num."") {
// Log the values
- DEBUG_LOG(__FUNCTION__.": num={$num},ret={$ret}");
+ print("<pre>");
+ debug_print_backtrace();
+ die("</pre>");
+ DEBUG_LOG(__FUNCTION__, __LINE__, " num={$num},ret={$ret}");
} // END - if
// Return result
global $_CONFIG;
// Calculate 2-seconds timestamp
- $stamp = round($timestamp / 2) * 2;
+ $stamp = round($timestamp);
// Do we have a leap year?
$SWITCH = 0;
// Is postData an array?
if (!is_array($postData)) {
// Abort here
+ DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("postData is not an array. Type: %s", gettype($postData)));
return array("", "", "");
} // END - if
// 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?
$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;
$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;
// Display parsing time and number of SQL queries in footer
function DISPLAY_PARSING_TIME_FOOTER() {
- global $startTime, $_CONFIG;
+ global $_CONFIG;
$endTime = microtime(true);
// Is the timer started?
die("</pre>");
}
// Debug message logger
-function DEBUG_LOG ($message, $force=false) {
+function DEBUG_LOG ($file, $line, $message, $force=true) {
// 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
}
// Close directory
closedir($dirPointer);
+ // Sort array
+ asort($INCs);
+
// Return array with include files
return $INCs;
}
// 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());
$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
$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
// Converts timestamp selections into a timestamp
function CONVERT_SELECTIONS_TO_TIMESTAMP(&$POST, &$DATA, &$id, &$skip) {
// Init test variable
- $TEST2 = "";
+ $test2 = "";
// Get last three chars
- $TEST = substr($id, -3);
+ $test = substr($id, -3);
// Improved way of checking! :-)
- if (in_array($TEST, array("_ye", "_mo", "_we", "_da", "_ho", "_mi", "_se"))) {
+ if (in_array($test, array("_ye", "_mo", "_we", "_da", "_ho", "_mi", "_se"))) {
// Found a multi-selection for timings?
- $TEST = substr($id, 0, -3);
- if ((isset($POST[$TEST."_ye"])) && (isset($POST[$TEST."_mo"])) && (isset($POST[$TEST."_we"])) && (isset($POST[$TEST."_da"])) && (isset($POST[$TEST."_ho"])) && (isset($POST[$TEST."_mi"])) && (isset($POST[$TEST."_se"])) && ($TEST != $TEST2)) {
+ $test = substr($id, 0, -3);
+ if ((isset($POST[$test."_ye"])) && (isset($POST[$test."_mo"])) && (isset($POST[$test."_we"])) && (isset($POST[$test."_da"])) && (isset($POST[$test."_ho"])) && (isset($POST[$test."_mi"])) && (isset($POST[$test."_se"])) && ($test != $test2)) {
// Generate timestamp
- $POST[$TEST] = CREATE_TIMESTAMP_FROM_SELECTIONS($TEST, $POST);
- $DATA[] = "$TEST='".$POST[$TEST]."'";
+ $POST[$test] = CREATE_TIMESTAMP_FROM_SELECTIONS($test, $POST);
+ $DATA[] = sprintf("%s='%s'", $test, $POST[$test]);
// Remove data from array
foreach (array("ye", "mo", "we", "da", "ho", "mi", "se") as $rem) {
- unset($POST[$TEST."_".$rem]);
+ unset($POST[$test."_".$rem]);
} // END - foreach
// Skip adding
- unset($id); $skip = true; $TEST2 = $TEST;
+ unset($id); $skip = true; $test2 = $test;
} // END - if
} else {
// Process this entry
- $skip = false; $TEST2 = "";
+ $skip = false; $test2 = "";
}
}
// Reverts the german decimal comma into Computer decimal dot
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
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!)
// 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
+}
+
+// Destroys the admin session
+function DESTROY_ADMIN_SESSION () {
+ // Kill maybe existing session variables including array elements
+ set_session('admin_login' , "");
+ set_session('admin_md5' , "");
+ set_session('admin_last' , "");
+ set_session('admin_to' , "");
+
+ // Destroy session and return status
+ return @session_destroy();
+}
+
+// Checks if a given apache module is loaded
+function IF_APACHE_MODULE_LOADED ($apacheModule) {
+ // Check it and return result
+ return (((function_exists('apache_get_modules')) && (in_array($apacheModule, apache_get_modules()))) || (!function_exists('apache_get_modules')));
+}
+
//////////////////////////////////////////////////
// //
// AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS //