X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=inc%2Ffunctions.php;h=03376db72e20103835833c2b16695e5e1b336895;hb=b5f5bab2513e56082e977eb534ddd3ceb00a770e;hp=a31c402069ef86f8c151aa68bc481bbf26d62817;hpb=3726c01129d404929701f1bf9e57dd269c601320;p=mailer.git diff --git a/inc/functions.php b/inc/functions.php index a31c402069..03376db72e 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -18,6 +18,7 @@ * svn:keywords Date Revision" (autoprobset!) at least!!!!!! * * -------------------------------------------------------------------- * * Copyright (c) 2003 - 2009 by Roland Haeder * + * Copyright (c) 2009, 2010 by Mailer Developer Team * * For more information visit: http://www.mxchange.org * * * * This program is free software; you can redistribute it and/or modify * @@ -44,7 +45,9 @@ if (!defined('__SECURITY')) { // Output HTML code directly or 'render' it. You addionally switch the new-line character off function outputHtml ($htmlCode, $newLine = true) { // Init output - if (!isset($GLOBALS['output'])) $GLOBALS['output'] = ''; + if (!isset($GLOBALS['output'])) { + $GLOBALS['output'] = ''; + } // END - if // Transfer username $username = getMessage('USERNAME_UNKNOWN'); @@ -85,16 +88,7 @@ function outputHtml ($htmlCode, $newLine = true) { app_die(__FUNCTION__, __LINE__, '{--FATAL_ERROR--}: {--LANG_NO_RENDER_DIRECT--}'); break; } // END - switch - } elseif ((getPhpCaching() == 'on') && (isset($GLOBALS['footer_sent'])) && ($GLOBALS['footer_sent'] == 1)) { - // Headers already sent? - if (headers_sent()) { - // Log this error - logDebugMessage(__FUNCTION__, __LINE__, 'Headers already sent! We need debug backtrace here.'); - - // Trigger an user error - debug_report_bug('Headers are already sent!'); - } // END - if - + } elseif ((getPhpCaching() == 'on') && ((!isset($GLOBALS['header'])) || (count($GLOBALS['header']) == 0))) { // Output cached HTML code $GLOBALS['output'] = ob_get_contents(); @@ -108,12 +102,12 @@ function outputHtml ($htmlCode, $newLine = true) { $GLOBALS['output'] = rewriteLinksInCode($GLOBALS['output']); } // END - if - // Compile and run finished rendered HTML code - compileFinalOutput(); - // Send all HTTP headers sendHttpHeaders(); + // Compile and run finished rendered HTML code + compileFinalOutput(); + // Output code here, DO NOT REMOVE! ;-) outputRawCode($GLOBALS['output']); } elseif ((getConfig('OUTPUT_MODE') == 'render') && (!empty($GLOBALS['output']))) { @@ -122,14 +116,17 @@ function outputHtml ($htmlCode, $newLine = true) { $GLOBALS['output'] = rewriteLinksInCode($GLOBALS['output']); } // END - if - // Compile and run finished rendered HTML code - compileFinalOutput(); - // Send all HTTP headers sendHttpHeaders(); + // Compile and run finished rendered HTML code + compileFinalOutput(); + // Output code here, DO NOT REMOVE! ;-) outputRawCode($GLOBALS['output']); + } else { + // And flush all headers + flushHeaders(); } } @@ -139,10 +136,10 @@ function sendHttpHeaders () { $now = gmdate('D, d M Y H:i:s') . ' GMT'; // Send HTTP header - sendHeader('HTTP/1.1 200'); + sendHeader('HTTP/1.1 200 OK'); // General headers for no caching - sendHeader('Expired: ' . $now); // RFC2616 - Section 14.21 + sendHeader('Expires: ' . $now); // RFC2616 - Section 14.21 sendHeader('Last-Modified: ' . $now); sendHeader('Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0'); // HTTP/1.1 sendHeader('Pragma: no-cache'); // HTTP/1.0 @@ -154,31 +151,56 @@ function sendHttpHeaders () { // Compiles the final output function compileFinalOutput () { // Init counter - $cnt = '0'; + $cnt = 0; + + // Add page header and footer + addPageHeaderFooter(); // Compile all out - while (((strpos($GLOBALS['output'], '{--') > 0) || (strpos($GLOBALS['output'], '{!') > 0) || (strpos($GLOBALS['output'], '{?') > 0)) && ($cnt < 3)) { + while (((strpos($GLOBALS['output'], '{--') !== false) || (strpos($GLOBALS['output'], '{!') !== false) || (strpos($GLOBALS['output'], '{?') !== false) || (strpos($GLOBALS['output'], '{%') !== false)) && ($cnt < 3)) { // Init common variables $content = array(); $newContent = ''; // Compile it - $eval = "\$newContent = \"".compileCode(escapeQuotes($GLOBALS['output']))."\";"; + //* DEBUG: */ print '
'.htmlentities($GLOBALS['output']).'
'.htmlentities($eval).'
' . linenumberCode($eval) . '
-Headers : ' . str_replace('<', '<', str_replace('>', '>', secureString(trim($mailHeader)))) . ' -To : ' . $toEmail . ' -Subject : ' . $subject . ' -Message : ' . $message . ' +Headers : ' . htmlentities(utf8_decode(trim($mailHeader))) . ' +To : ' . htmlentities(utf8_decode($toEmail)) . ' +Subject : ' . htmlentities(utf8_decode($subject)) . ' +Message : ' . htmlentities(utf8_decode($message)) . '
" . $proxyTunnel."
".print_r($response, true)."
'.print_r($request, true).'
'.print_r($response, true).'
' . $proxyTunnel.'
".print_r($GLOBALS['cache_array']['themes'], true)."
mapper='.print_r($mapper, true).'
'.print_r($ins_vers, true).'
"; + $debug .= "Please report this bug at http://bugs.mxchange.org and include the logfile from " . str_replace(getConfig('PATH'), '', getConfig('CACHE_PATH')) . "debug.log in your report (you can now attach files):"; $debug .= debug_get_printable_backtrace(); $debug .= "\nRequest-URI: " . getRequestUri()."\n"; $debug .= "Thank you for finding bugs."; + // Send an email? (e.g. not wanted for evaluation errors) + if (($sendEmail === true) && (!isInstallationPhase())) { + // Prepare content + $content = array( + 'message' => trim($message), + 'backtrace' => trim(debug_get_mailable_backtrace()) + ); + + // Send email to webmaster + sendAdminNotification(getMessage('DEBUG_REPORT_BUG_SUBJECT'), 'admin_report_bug', $content); + } // END - if + // And abort here - // @TODO This cannot be rewritten to app_die(), try to find a solution for this. - die($debug); + app_die(__FUNCTION__, __LINE__, $debug); } // Generates a ***weak*** seed @@ -2667,63 +2581,66 @@ function getMessageFromErrorCode ($code) { $message = ''; switch ($code) { case '': break; - case getCode('LOGOUT_DONE') : $message = getMessage('LOGOUT_DONE'); break; - case getCode('LOGOUT_FAILED') : $message = "{--LOGOUT_FAILED--}"; break; - case getCode('DATA_INVALID') : $message = getMessage('MAIL_DATA_INVALID'); break; - case getCode('POSSIBLE_INVALID') : $message = getMessage('MAIL_POSSIBLE_INVALID'); break; - case getCode('ACCOUNT_LOCKED') : $message = getMessage('MEMBER_ACCOUNT_LOCKED_UNC'); break; - case getCode('USER_404') : $message = getMessage('USER_404'); break; - case getCode('STATS_404') : $message = getMessage('MAIL_STATS_404'); break; - case getCode('ALREADY_CONFIRMED'): $message = getMessage('MAIL_ALREADY_CONFIRMED'); break; - case getCode('WRONG_PASS') : $message = getMessage('LOGIN_WRONG_PASS'); break; - case getCode('WRONG_ID') : $message = getMessage('LOGIN_WRONG_ID'); break; - case getCode('ID_LOCKED') : $message = getMessage('LOGIN_ID_LOCKED'); break; - case getCode('ID_UNCONFIRMED') : $message = getMessage('LOGIN_ID_UNCONFIRMED'); break; - case getCode('ID_GUEST') : $message = getMessage('LOGIN_ID_GUEST'); break; - case getCode('NO_COOKIES') : $message = getMessage('LOGIN_NO_COOKIES'); break; - case getCode('COOKIES_DISABLED') : $message = getMessage('LOGIN_NO_COOKIES'); break; - case getCode('BEG_SAME_AS_OWN') : $message = getMessage('BEG_SAME_UID_AS_OWN'); break; - case getCode('LOGIN_FAILED') : $message = getMessage('LOGIN_FAILED_GENERAL'); break; - case getCode('MODULE_MEM_ONLY') : $message = sprintf(getMessage('MODULE_MEM_ONLY'), getRequestElement('mod')); break; - case getCode('OVERLENGTH') : $message = getMessage('MEMBER_TEXT_OVERLENGTH'); break; - case getCode('URL_FOUND') : $message = getMessage('MEMBER_TEXT_CONTAINS_URL'); break; - case getCode('SUBJ_URL') : $message = getMessage('MEMBER_SUBJ_CONTAINS_URL'); break; - case getCode('BLIST_URL') : $message = "{--MEMBER_URL_BLACK_LISTED--}\n{--MEMBER_BLIST_TIME--}: ".generateDateTime(getRequestElement('blist'), 0); break; - case getCode('NO_RECS_LEFT') : $message = getMessage('MEMBER_SELECTED_MORE_RECS'); break; - case getCode('INVALID_TAGS') : $message = getMessage('MEMBER_HTML_INVALID_TAGS'); break; - case getCode('MORE_POINTS') : $message = getMessage('MEMBER_MORE_POINTS_NEEDED'); break; - case getCode('MORE_RECEIVERS1') : $message = getMessage('MEMBER_ENTER_MORE_RECEIVERS'); break; - case getCode('MORE_RECEIVERS2') : $message = getMessage('MEMBER_NO_MORE_RECEIVERS_FOUND'); break; - case getCode('MORE_RECEIVERS3') : $message = sprintf(getMessage('MEMBER_ENTER_MORE_MIN_RECEIVERS'), getConfig('order_min')); break; - case getCode('INVALID_URL') : $message = getMessage('MEMBER_ENTER_INVALID_URL'); break; + case getCode('LOGOUT_DONE') : $message = getMessage('LOGOUT_DONE'); break; + case getCode('LOGOUT_FAILED') : $message = '{--LOGOUT_FAILED--}'; break; + case getCode('DATA_INVALID') : $message = getMessage('MAIL_DATA_INVALID'); break; + case getCode('POSSIBLE_INVALID') : $message = getMessage('MAIL_POSSIBLE_INVALID'); break; + case getCode('USER_404') : $message = getMessage('USER_404'); break; + case getCode('STATS_404') : $message = getMessage('MAIL_STATS_404'); break; + case getCode('ALREADY_CONFIRMED') : $message = getMessage('MAIL_ALREADY_CONFIRMED'); break; + case getCode('WRONG_PASS') : $message = getMessage('LOGIN_WRONG_PASS'); break; + case getCode('WRONG_ID') : $message = getMessage('LOGIN_WRONG_ID'); break; + case getCode('ACCOUNT_LOCKED') : $message = getMessage('LOGIN_STATUS_LOCKED'); break; + case getCode('ACCOUNT_UNCONFIRMED'): $message = getMessage('LOGIN_STATUS_UNCONFIRMED'); break; + case getCode('COOKIES_DISABLED') : $message = getMessage('LOGIN_COOKIES_DISABLED'); break; + case getCode('BEG_SAME_AS_OWN') : $message = getMessage('BEG_SAME_UID_AS_OWN'); break; + case getCode('LOGIN_FAILED') : $message = getMessage('LOGIN_FAILED_GENERAL'); break; + case getCode('MODULE_MEM_ONLY') : $message = getMaskedMessage('MODULE_MEM_ONLY', getRequestParameter('mod')); break; + case getCode('OVERLENGTH') : $message = getMessage('MEMBER_TEXT_OVERLENGTH'); break; + case getCode('URL_FOUND') : $message = getMessage('MEMBER_TEXT_CONTAINS_URL'); break; + case getCode('SUBJ_URL') : $message = getMessage('MEMBER_SUBJ_CONTAINS_URL'); break; + case getCode('BLIST_URL') : $message = "{--MEMBER_URL_BLACK_LISTED--}\n{--MEMBER_BLIST_TIME--}: ".generateDateTime(getRequestParameter('blist'), 0); break; + case getCode('NO_RECS_LEFT') : $message = getMessage('MEMBER_SELECTED_MORE_RECS'); break; + case getCode('INVALID_TAGS') : $message = getMessage('MEMBER_HTML_INVALID_TAGS'); break; + case getCode('MORE_POINTS') : $message = getMessage('MEMBER_MORE_POINTS_NEEDED'); break; + case getCode('MORE_RECEIVERS1') : $message = getMessage('MEMBER_ENTER_MORE_RECEIVERS'); break; + case getCode('MORE_RECEIVERS2') : $message = getMessage('MEMBER_NO_MORE_RECEIVERS_FOUND'); break; + case getCode('MORE_RECEIVERS3') : $message = getMessage('MEMBER_ENTER_MORE_MIN_RECEIVERS'); break; + case getCode('INVALID_URL') : $message = getMessage('MEMBER_ENTER_INVALID_URL'); break; + case getCode('NO_MAIL_TYPE') : $message = getMessage('MEMBER_NO_MAIL_TYPE_SELECTED'); break; + case getCode('UNKNOWN_ERROR') : $message = getMessage('LOGIN_UNKNOWN_ERROR'); break; + case getCode('UNKNOWN_STATUS') : $message = getMessage('LOGIN_UNKNOWN_STATUS'); break; case getCode('ERROR_MAILID'): if (isExtensionActive('mailid', true)) { $message = getMessage('ERROR_CONFIRMING_MAIL'); } else { - $message = sprintf(getMessage('EXTENSION_PROBLEM_NOT_INSTALLED'), 'mailid'); + $message = getMaskedMessage('EXTENSION_PROBLEM_NOT_INSTALLED', 'mailid'); } break; case getCode('EXTENSION_PROBLEM'): - if (isGetRequestElementSet('ext')) { - $message = generateExtensionInactiveNotInstalledMessage(getRequestElement('ext')); + if (isGetRequestParameterSet('ext')) { + $message = generateExtensionInactiveNotInstalledMessage(getRequestParameter('ext')); } else { $message = getMessage('EXTENSION_PROBLEM_UNSET_EXT'); } break; case getCode('URL_TLOCK'): + // @TODO Move this SQL code into a function, let's say 'getTimestampFromPoolId($id) ? $result = SQL_QUERY_ESC("SELECT `timestamp` FROM `{?_MYSQL_PREFIX?}_pool` WHERE `id`=%s LIMIT 1", - array(bigintval(getRequestElement('id'))), __FILE__, __LINE__); + array(bigintval(getRequestParameter('id'))), __FILE__, __LINE__); // Load timestamp from last order list($timestamp) = SQL_FETCHROW($result); - $timestamp = generateDateTime($timestamp, 1); // Free memory SQL_FREERESULT($result); + // Translate it for templates + $timestamp = generateDateTime($timestamp, 1); + // Calculate hours... $STD = round(getConfig('url_tlock') / 60 / 60); @@ -2742,7 +2659,7 @@ function getMessageFromErrorCode ($code) { default: // Missing/invalid code - $message = sprintf(getMessage('UNKNOWN_MAILID_CODE'), $code); + $message = getMaskedMessage('UNKNOWN_MAILID_CODE', $code); // Log it logDebugMessage(__FUNCTION__, __LINE__, $message); @@ -2775,7 +2692,7 @@ function compileUriCode ($code, $simple = true) { return $code; } -// Function taken from user comments on www.php.net / function eregi() +// Function taken from user comments on www.php.net / function isInStringIgnoreCase() function isUrlValidSimple ($url) { // Prepare URL $url = secureString(str_replace("\\", '', compileRawCode(urldecode($url)))); @@ -2818,11 +2735,12 @@ function isUrlValidSimple ($url) { $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 (isDebugRegExpressionEnabled()) { + if (isDebugRegularExpressionEnabled()) { // @TODO Are these convertions still required? $pat = str_replace('.', "\.", $pat); $pat = str_replace('@', "\@", $pat); @@ -2830,7 +2748,7 @@ function isUrlValidSimple ($url) { } // END - if // Check if expression matches - $reg = ($reg || preg_match(('^' . $pat.'^'), $url)); + $reg = ($reg || preg_match(('^' . $pat . '^'), $url)); // Does it match? if ($reg === true) break; @@ -2884,7 +2802,7 @@ function changeDataInFile ($FQFN, $comment, $prefix, $suffix, $DATA, $seek=0) { } // END - if // Write to temp file - fputs($fp_tmp, $line); + fwrite($fp_tmp, $line); } // END - while // Close temp file @@ -2917,7 +2835,7 @@ function changeDataInFile ($FQFN, $comment, $prefix, $suffix, $DATA, $seek=0) { } // Send notification to admin function sendAdminNotification ($subject, $templateName, $content=array(), $userid = '0') { - if (isExtensionInstalledAndNewer('admins', '0.4.1')) { + if ((isExtensionInstalledAndNewer('admins', '0.4.1')) && (function_exists('sendAdminsEmails'))) { // Send new way sendAdminsEmails($subject, $templateName, $content, $userid); } else { @@ -3032,19 +2950,19 @@ function convertCommaToDot ($str) { } // Handle menu-depending failed logins and return the rendered content -function handleLoginFailtures ($accessLevel) { +function handleLoginFailures ($accessLevel) { // Default output is empty ;-) $OUT = ''; // Is the session data set? - if ((isSessionVariableSet('mxchange_' . $accessLevel.'_failures')) && (isSessionVariableSet('mxchange_' . $accessLevel.'_last_fail'))) { + if ((isSessionVariableSet('mailer_' . $accessLevel . '_failures')) && (isSessionVariableSet('mailer_' . $accessLevel . '_last_failure'))) { // Ignore zero values - if (getSession('mxchange_' . $accessLevel.'_failures') > 0) { + if (getSession('mailer_' . $accessLevel . '_failures') > 0) { // Non-guest has login failures found, get both data and prepare it for template - //* DEBUG: */ outputHtml(__FUNCTION__."(".__LINE__."):accessLevel={$accessLevel}"); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "accessLevel={$accessLevel}"); $content = array( - 'login_failures' => getSession('mxchange_' . $accessLevel.'_failures'), - 'last_failure' => generateDateTime(getSession('mxchange_' . $accessLevel.'_last_fail'), 2) + 'login_failures' => getSession('mailer_' . $accessLevel . '_failures'), + 'last_failure' => generateDateTime(getSession('mailer_' . $accessLevel . '_last_failure'), 2) ); // Load template @@ -3052,8 +2970,8 @@ function handleLoginFailtures ($accessLevel) { } // END - if // Reset session data - setSession('mxchange_' . $accessLevel.'_failures', ''); - setSession('mxchange_' . $accessLevel.'_last_fail', ''); + setSession('mailer_' . $accessLevel . '_failures', ''); + setSession('mailer_' . $accessLevel . '_last_failure', ''); } // END - if // Return rendered content @@ -3061,7 +2979,7 @@ function handleLoginFailtures ($accessLevel) { } // Rebuild cache -function rebuildCacheFile ($cache, $inc = '', $force = false) { +function rebuildCache ($cache, $inc = '', $force = false) { // Debug message /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("cache=%s, inc=%s, force=%s", $cache, $inc, intval($force))); @@ -3081,7 +2999,7 @@ function rebuildCacheFile ($cache, $inc = '', $force = false) { // Is the include there? if (isIncludeReadable($inc)) { // And rebuild it from scratch - //* DEBUG: */ outputHtml(__FUNCTION__."(".__LINE__."): inc={$inc} - LOADED!"); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "inc={$inc} - LOADED!"); loadInclude($inc); } else { // Include not found! @@ -3122,15 +3040,15 @@ function addNewBonusMail ($data, $mode = '', $output=true) { if ((empty($mode)) && (isset($data['mode']))) $mode = $data['mode']; // Generate receiver list - $RECEIVER = generateReceiverList($data['cat'], $data['receiver'], $mode); + $receiver = generateReceiverList($data['cat'], $data['receiver'], $mode); // Receivers added? - if (!empty($RECEIVER)) { + if (!empty($receiver)) { // Add bonus mail to queue addBonusMailToQueue( $data['subject'], $data['text'], - $RECEIVER, + $receiver, $data['points'], $data['seconds'], $data['url'], @@ -3158,25 +3076,25 @@ function determineReferalId () { // Check if refid is set if ((isset($GLOBALS['refid'])) && ($GLOBALS['refid'] > 0)) { // This is fine... - } elseif ((isGetRequestElementSet('user')) && (basename($_SERVER['PHP_SELF']) == 'click.php')) { + } elseif ((isGetRequestParameterSet('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(getRequestElement('user')); - } elseif (isPostRequestElementSet('refid')) { + $GLOBALS['refid'] = bigintval(getRequestParameter('user')); + } elseif (isPostRequestParameterSet('refid')) { // Get referal id from variable refid (so I hope this makes my script more compatible to other scripts) - $GLOBALS['refid'] = secureString(postRequestElement('refid')); - } elseif (isGetRequestElementSet('refid')) { + $GLOBALS['refid'] = secureString(postRequestParameter('refid')); + } elseif (isGetRequestParameterSet('refid')) { // Get referal id from variable refid (so I hope this makes my script more compatible to other scripts) - $GLOBALS['refid'] = secureString(getRequestElement('refid')); - } elseif (isGetRequestElementSet('ref')) { + $GLOBALS['refid'] = secureString(getRequestParameter('refid')); + } elseif (isGetRequestParameterSet('ref')) { // Set refid=ref (the referal link uses such variable) - $GLOBALS['refid'] = secureString(getRequestElement('ref')); + $GLOBALS['refid'] = secureString(getRequestParameter('ref')); } elseif ((isSessionVariableSet('refid')) && (getSession('refid') != 0)) { // Set session refid als global $GLOBALS['refid'] = bigintval(getSession('refid')); } elseif ((isExtensionInstalledAndNewer('user', '0.3.4')) && (getConfig('select_user_zero_refid') == 'Y')) { // Select a random user which has confirmed enougth mails $GLOBALS['refid'] = determineRandomReferalId(); - } elseif ((isExtensionInstalled('sql_patches')) && (getConfig('def_refid') > 0)) { + } elseif ((isExtensionInstalledAndNewer('sql_patches', '0.1.2')) && (getConfig('def_refid') > 0)) { // Set default refid as refid in URL $GLOBALS['refid'] = getConfig('def_refid'); } else { @@ -3226,7 +3144,8 @@ function shutdown () { // Call the filter chain 'shutdown' runFilterChain('shutdown', null); - if (SQL_IS_LINK_UP()) { + // Check if not in installation phase and the link is up + if ((!isInstallationPhase()) && (SQL_IS_LINK_UP())) { // Close link SQL_CLOSE(__FILE__, __LINE__); } elseif (!isInstallationPhase()) { @@ -3274,15 +3193,15 @@ function isMemberIdSet () { // Handle message codes from URL function handleCodeMessage () { - if (isGetRequestElementSet('code')) { + if (isGetRequestParameterSet('code')) { // Default extension is 'unknown' $ext = 'unknown'; // Is extension given? - if (isGetRequestElementSet('ext')) $ext = getRequestElement('ext'); + if (isGetRequestParameterSet('ext')) $ext = getRequestParameter('ext'); // Convert the 'code' parameter from URL to a human-readable message - $message = getMessageFromErrorCode(getRequestElement('code')); + $message = getMessageFromErrorCode(getRequestParameter('code')); // Load message template loadTemplate('message', false, $message); @@ -3320,12 +3239,12 @@ function generateExtensionInactiveMessage ($ext_name) { } // END - if // Default message - $message = sprintf(getMessage('EXTENSION_PROBLEM_EXT_INACTIVE'), $ext_name); + $message = getMaskedMessage('EXTENSION_PROBLEM_EXT_INACTIVE', $ext_name); // Is an admin logged in? if (isAdmin()) { // Then output admin message - $message = sprintf(getMessage('ADMIN_EXTENSION_PROBLEM_EXT_INACTIVE'), $ext_name); + $message = getMaskedMessage('ADMIN_EXTENSION_PROBLEM_EXT_INACTIVE', $ext_name); } // END - if // Return prepared message @@ -3341,12 +3260,12 @@ function generateExtensionNotInstalledMessage ($ext_name) { } // END - if // Default message - $message = sprintf(getMessage('EXTENSION_PROBLEM_EXT_NOT_INSTALLED'), $ext_name); + $message = getMaskedMessage('EXTENSION_PROBLEM_EXT_NOT_INSTALLED', $ext_name); // Is an admin logged in? if (isAdmin()) { // Then output admin message - $message = sprintf(getMessage('ADMIN_EXTENSION_PROBLEM_EXT_NOT_INSTALLED'), $ext_name); + $message = getMaskedMessage('ADMIN_EXTENSION_PROBLEM_EXT_NOT_INSTALLED', $ext_name); } // END - if // Return prepared message @@ -3382,7 +3301,7 @@ function generateExtensionInactiveNotInstalledMessage ($ext_name) { // Reads a directory recursively by default and searches for files not matching // an exclusion pattern. You can now keep the exclusion pattern empty for reading // a whole directory. -function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $addBaseDir = true, $excludeArray = array(), $extension = '.php', $excludePattern = '@(\.|\.\.)$@', $recursive = true) { +function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $addBaseDir = true, $excludeArray = array(), $extension = '.php', $excludePattern = '@(\.|\.\.)$@', $recursive = true, $suffix = '') { // Add default entries we should exclude $excludeArray[] = '.'; $excludeArray[] = '..'; @@ -3412,7 +3331,7 @@ function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $ad // Remove double slashes $FQFN = str_replace('//', '/', $FQFN); - // Check if the base filename matches an exclusion pattern and if the pattern is not empty + // Check if the base filenname matches an exclusion pattern and if the pattern is not empty if ((!empty($excludePattern)) && (preg_match($excludePattern, $baseFile, $match))) { // These Lines are only for debugging!! //* DEBUG: */ outputHtml('baseDir:' . $baseDir . ''); @@ -3434,6 +3353,10 @@ function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $ad // Skip this file //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "Invalid prefix in file " . $baseFile . ", prefix=" . $prefix); continue; + } elseif ((!empty($suffix)) && (substr($baseFile, -(strlen($suffix . $extension)), (strlen($suffix . $extension))) != $suffix . $extension)) { + // Skip wrong suffix as well + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "Invalid suffix in file " . $baseFile . ", suffix=" . $suffix); + continue; } elseif (!isFileReadable($FQFN)) { // Not readable so skip it //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "File " . $FQFN . " is not readable!"); @@ -3476,7 +3399,7 @@ function getArrayFromDirectory ($baseDir, $prefix, $fileIncludeDirs = false, $ad closedir($dirPointer); // Sort array - asort($files); + sort($files); // Return array with include files //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, '- Left!'); @@ -3597,7 +3520,7 @@ function determinePageTitle () { $TITLE = ''; // Title decoration enabled? - if ((getConfig('enable_title_deco') == 'Y') && (getConfig('title_left') != '')) $TITLE .= trim(getConfig('title_left'))." "; + if ((getConfig('enable_title_deco') == 'Y') && (getConfig('title_left') != '')) $TITLE .= trim(getConfig('title_left')) . ' '; // Do we have some extra title? if (isExtraTitleSet()) { @@ -3626,10 +3549,10 @@ function determinePageTitle () { $pageTitle = $TITLE; } elseif ((isInstalled()) && (isAdminRegistered())) { // Installed, admin registered but no ext-sql_patches - $pageTitle = '[-- ' . getConfig('MAIN_TITLE').' - '.getModuleTitle(getModule()) . ' --]'; + $pageTitle = '[-- ' . getConfig('MAIN_TITLE') . ' - ' . getModuleTitle(getModule()) . ' --]'; } elseif ((isInstalled()) && (!isAdminRegistered())) { // Installed but no admin registered - $pageTitle = sprintf(getMessage('SETUP_OF_MXCHANGE'), getConfig('MAIN_TITLE')); + $pageTitle = getMessage('SETUP_OF_MXCHANGE'); } elseif ((!isInstalled()) || (!isAdminRegistered())) { // Installation mode $pageTitle = getMessage('INSTALLATION_OF_MXCHANGE'); @@ -3642,7 +3565,7 @@ function determinePageTitle () { } // Return title - return $pageTitle; + return decodeEntities($pageTitle); } // Checks wethere there is a cache file there. This function is cached. @@ -3650,7 +3573,7 @@ function isTemplateCached ($template) { // Do we have cached this result? if (!isset($GLOBALS['template_cache'][$template])) { // Generate FQFN - $FQFN = sprintf("%s_compiled/templates/%s.tpl.cache", getConfig('CACHE_PATH'), $template); + $FQFN = generateCacheFqfn($template); // Is it there? $GLOBALS['template_cache'][$template] = isFileReadable($FQFN); @@ -3665,7 +3588,7 @@ function flushTemplateCache ($template, $eval) { // Is this cache flushed? if ((isDebuggingTemplateCache() === false) && (isTemplateCached($template) === false) && ($eval != '404')) { // Generate FQFN - $FQFN = sprintf("%s_compiled/templates/%s.tpl.cache", getConfig('CACHE_PATH'), $template); + $FQFN = generateCacheFqfn($template); // Replace username with a call $eval = str_replace('$username', '".getUsername()."', $eval); @@ -3680,7 +3603,7 @@ function readTemplateCache ($template) { // Check it again if ((isDebuggingTemplateCache() === false) && (isTemplateCached($template))) { // Generate FQFN - $FQFN = sprintf("%s_compiled/templates/%s.tpl.cache", getConfig('CACHE_PATH'), $template); + $FQFN = generateCacheFqfn($template); // And read from it $GLOBALS['template_eval'][$template] = readFromFile($FQFN); @@ -3723,10 +3646,10 @@ function sendModeMails ($mod, $modes) { $salt = substr(getSession('u_hash'), 0, -40); // Now let's compare passwords - $hash = generatePassString(getUserData('password')); + $hash = encodeHashForCookie(getUserData('password')); // Does the hash match or should we change it? - if (($hash == getSession('u_hash')) || (postRequestElement('pass1') == postRequestElement('pass2'))) { + if (($hash == getSession('u_hash')) || (postRequestParameter('pass1') == postRequestParameter('pass2'))) { // Load the data $content = getUserDataArray(); @@ -3744,7 +3667,7 @@ function sendModeMails ($mod, $modes) { switch ($mode) { case 'normal': break; // Do not add any special lines case 'email': // Email was changed! - $content['message'] = getMessage('MEMBER_CHANGED_EMAIL').": ".postRequestElement('old_email')."\n"; + $content['message'] = getMessage('MEMBER_CHANGED_EMAIL').": ".postRequestParameter('old_email')."\n"; break; case 'pass': // Password was changed @@ -3760,7 +3683,7 @@ function sendModeMails ($mod, $modes) { if (isExtensionActive('country')) { // Replace code with description - $content['country'] = generateCountryInfo(postRequestElement('country_code')); + $content['country'] = generateCountryInfo(postRequestParameter('country_code')); } // END - if // Merge content with data from POST @@ -3783,21 +3706,21 @@ function sendModeMails ($mod, $modes) { $sub_mem = getMessage('MEMBER_CHANGED_DATA'); // Output success message - $content = "{--MYDATA_MAIL_SENT--}"; + $content = '{--MYDATA_MAIL_SENT--}'; break; default: // Unsupported module! logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unsupported module %s detected.", $mod)); - $content = "{--UNKNOWN_MODULE--}"; + $content = '{--UNKNOWN_MODULE--}'; break; } // END - switch } else { // Passwords mismatch - $content = "{--MEMBER_PASSWORD_ERROR--}"; + $content = '{--MEMBER_PASSWORD_ERROR--}'; } } else { // Could not load profile - $content = "{--MEMBER_CANNOT_LOAD_PROFILE--}"; + $content = '{--MEMBER_CANNOT_LOAD_PROFILE--}'; } // Send email to user if required @@ -3816,7 +3739,7 @@ function sendModeMails ($mod, $modes) { $content = getMessage('CANNOT_SEND_ADMIN_MAILS'); } else { // No mail to admin - $content = "{--MYDATA_MAIL_SENT--}"; + $content = '{--MYDATA_MAIL_SENT--}'; } } // END - if @@ -3825,7 +3748,7 @@ function sendModeMails ($mod, $modes) { } // Generates a 'selection box' from given array -function generateSelectionBoxFromArray ($options, $name, $optionValue, $optionContent) { +function generateSelectionBoxFromArray ($options, $name, $optionValue, $optionContent='') { // Start the output $OUT = ' {--PLEASE_SELECT--}'; @@ -3833,7 +3756,13 @@ function generateSelectionBoxFromArray ($options, $name, $optionValue, $optionCo // Walk through all options foreach ($options as $option) { // Add the entry - $OUT .= '' . $option[$optionContent] . ''; + if (empty($optionContent)) { + // ... from template + $OUT .= loadTemplate('select_' . $name . '_option', true, $option); + } else { + // Direct HTML code + $OUT .= '' . $option[$optionContent] . ''; + } } // END - foreach // Finish selection box @@ -3876,6 +3805,184 @@ function getModuleFromFileName ($file, $accessLevel) { return $modCheck; } +// Encodes an URL for adding session id, etc. +function encodeUrl ($url, $outputMode = '0') { + // Do we have already have a PHPSESSID inside or view.php is called? Then abort here + if ((strpos($url, session_name()) !== false) || (getOutputMode() == -3)) return $url; + + // Do we have a valid session? + if (((!isset($GLOBALS['valid_session'])) || ($GLOBALS['valid_session'] === false) || (!isset($_COOKIE[session_name()]))) && (isSpider() === false)) { + // Invalid session + // Determine right seperator + $seperator = '&'; + if (strpos($url, '?') === false) { + // No question mark + $seperator = '?'; + } elseif ((getOutputMode() != '0') || ($outputMode != '0')) { + // Non-HTML mode + $seperator = '&'; + } + + // Add it to URL + if (session_id() != '') { + $url .= $seperator . session_name() . '=' . session_id(); + } // END - if + } // END - if + + // Add {?URL?} ? + if ((substr($url, 0, strlen(getConfig('URL'))) != getConfig('URL')) && (substr($url, 0, 7) != '{?URL?}') && (substr($url, 0, 7) != 'http://') && (substr($url, 0, 8) != 'https://')) { + // Add it + $url = '{?URL?}/' . $url; + } // END - if + + // Return the URL + return $url; +} + +// Simple check for spider +function isSpider () { + // Get the UA + $userAgent = strtolower(detectUserAgent(true)); + + // It should not be empty, if so it is better a spider/bot + if (empty($userAgent)) return true; + + // Is it a spider? + return ((strpos($userAgent, 'spider') !== false) || (strpos($userAgent, 'slurp') !== false) || (strpos($userAgent, 'bot') !== false) || (strpos($userAgent, 'archiver') !== false)); +} + +// Prepares the header for HTML output +function loadHtmlHeader () { + // Run two filters: + // 1.) pre_page_header (mainly loads the page_header template and includes + // meta description) + runFilterChain('pre_page_header'); + + // Here can be something be added, but normally one of the two filters + // around this line should do the job for you. + + // 2.) post_page_header (mainly to load stylesheet, extra JavaScripts and + // to close the head-tag) + // Include more header data here + runFilterChain('post_page_header'); +} + +// Adds page header and footer to output array element +function addPageHeaderFooter () { + // Init output + $OUT = ''; + + // Add them all together. This is maybe to simple + foreach (array('page_header', 'output', 'page_footer') as $pagePart) { + // Add page part if set + if (isset($GLOBALS[$pagePart])) $OUT .= $GLOBALS[$pagePart]; + } // END - foreach + + // Transfer $OUT to 'output' + $GLOBALS['output'] = $OUT; +} + +// Generates meta description for current module and 'what' value +function generateMetaDescriptionCode () { + // Only include from guest area and if sql_patches has correct version + if ((getModule() == 'index') && (isExtensionInstalledAndNewer('sql_patches', '0.1.6'))) { + // Construct dynamic description + $DESCR = '{?MAIN_TITLE?} ' . trim(getConfig('title_middle')) . ' ' . getTitleFromMenu('guest', getWhat()); + + // Output it directly + $GLOBALS['page_header'] .= ''; + } // END - if + + // Remove depth + unset($GLOBALS['ref_level']); +} + +// Generates an FQFN for template cache from the given template name +function generateCacheFqfn ($template) { + // Is this cached? + if (!isset($GLOBALS['template_cache_fqfn'][$template])) { + // Generate the FQFN + $GLOBALS['template_cache_fqfn'][$template] = sprintf("%s_compiled/html/%s.tpl.cache", getConfig('CACHE_PATH'), $template); + } // END - if + + // Return it + return $GLOBALS['template_cache_fqfn'][$template]; +} + +// Function to search for the last modified file +function searchDirsRecursive ($dir, &$last_changed, $lookFor = 'Date') { + // Get dir as array + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dir=' . $dir); + // 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 = getArrayFromDirectory($dir, '', false, true, array(), '.php', $excludePattern); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'count(ds)='.count($ds)); + + // Walk through all entries + foreach ($ds as $d) { + // Generate proper FQFN + $FQFN = str_replace('//', '/', getConfig('PATH') . $dir . '/' . $d); + + // Is it a file and readable? + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dir=' . $dir . ',d=' . $d); + if (isFileReadable($FQFN)) { + // $FQFN is a readable file so extract the requested data from it + $check = extractRevisionInfoFromFile($FQFN, $lookFor); + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'File: ' . $d . ' found. check=' . $check); + + // Is the file more recent? + if ((!isset($last_changed[$lookFor])) || ($last_changed[$lookFor] < $check)) { + // This file is newer as the file before + //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'NEWER!'); + $last_changed['path_name'] = $FQFN; + $last_changed[$lookFor] = $check; + } // END - if + } else { + // Not readable + /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'File: ' . $d . ' not readable or directory.'); + } + } // END - foreach +} + +// "Fixes" null or empty string to count of dashes +function fixNullEmptyToDashes ($str, $num) { + // Use str as default + $return = $str; + + // Is it empty? + if ((is_null($str)) || (trim($str) == '')) { + // Set it + $return = str_repeat('-', $num); + } // END - if + + // Return final string + return $return; +} + +// Handles the braces [] of a field (e.g. value of 'name' attribute) +function handleFieldWithBraces ($field) { + // Are there braces [] at the end? + if (substr($field, -2, 2) == '[]') { + // Try to find one and replace it. I do it this way to allow easy + // extending of this code. + foreach (array('admin_list_builder_id_value') as $key) { + // Is the cache entry set? + if (isset($GLOBALS[$key])) { + // Insert it + $field = str_replace('[]', '[' . $GLOBALS[$key] . ']', $field); + + // And abort + break; + } // END - if + } // END - foreach + } // END - if + + // Return it + return $field; +} + ////////////////////////////////////////////////// // AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS // ////////////////////////////////////////////////// @@ -3890,7 +3997,7 @@ if (!function_exists('html_entity_decode')) { } // END - if if (!function_exists('http_build_query')) { - // Taken from documentation on www.php.net, credits to Marco K. (Germany) + // Taken from documentation on www.php.net, credits to Marco K. (Germany) and some light mods by R.Haeder function http_build_query($data, $prefix = '', $sep = '', $key = '') { $ret = array(); foreach ((array)$data as $k => $v) { @@ -3898,7 +4005,7 @@ if (!function_exists('http_build_query')) { $k = urlencode($prefix . $k); } // END - if - if ((!empty($key)) || ($key === 0)) $k = $key.'['.urlencode($k).']'; + if ((!empty($key)) || ($key === 0)) $k = $key . '[' . urlencode($k) . ']'; if (is_array($v) || is_object($v)) { array_push($ret, http_build_query($v, '', $sep, $k));
"; $debug .= debug_get_printable_backtrace(); $debug .= "