X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=inc%2Ffunctions.php;h=837184d15f9cd8667bebb481c4d34c3d9bd7cdd2;hb=cb529a09bd803ae98b5a2fd9baed5a55332252af;hp=305ee3f8aa02f6b18964bd1878aa3fb6aac2c7cb;hpb=ad30a667fd8abeb576c04026b62c2e8a29d86f52;p=mailer.git
diff --git a/inc/functions.php b/inc/functions.php
index 305ee3f8aa..837184d15f 100644
--- a/inc/functions.php
+++ b/inc/functions.php
@@ -49,10 +49,6 @@ function outputHtml ($htmlCode, $newLine = true) {
$GLOBALS['output'] = '';
} // END - if
- // Transfer username
- $username = getMessage('USERNAME_UNKNOWN');
- if (isset($GLOBALS['username'])) $username = getUsername();
-
// Do we have HTML-Code here?
if (!empty($htmlCode)) {
// Yes, so we handle it as you have configured
@@ -126,7 +122,7 @@ function sendHttpHeaders () {
$now = gmdate('D, d M Y H:i:s') . ' GMT';
// Send HTTP header
- sendHeader('HTTP/1.1 200 OK');
+ sendHeader('HTTP/1.1 ' . getHttpStatus());
// General headers for no caching
sendHeader('Expires: ' . $now); // RFC2616 - Section 14.21
@@ -140,37 +136,11 @@ function sendHttpHeaders () {
// Compiles the final output
function compileFinalOutput () {
- // Init counter
- $cnt = 0;
-
// Add page header and footer
addPageHeaderFooter();
- // Compile all out
- while (((strpos($GLOBALS['output'], '{--') !== false) || (strpos($GLOBALS['output'], '{DQUOTE}') !== false) || (strpos($GLOBALS['output'], '{!') !== false) || (strpos($GLOBALS['output'], '{?') !== false) || (strpos($GLOBALS['output'], '{%') !== false)) && ($cnt < 3)) {
- // Init common variables
- $content = array();
- $newContent = '';
-
- // Compile it
- //* DEBUG: */ print '
'.htmlentities($GLOBALS['output']).'
';
- $eval = '$newContent = "' . str_replace('{DQUOTE}', '"', compileCode(escapeQuotes($GLOBALS['output']))) . '";';
- //* DEBUG: */ die(''.htmlentities($eval).'
');
- eval($eval);
- //* DEBUG: */ die(''.htmlentities($newContent).'
');
-
- // Was that eval okay?
- if (empty($newContent)) {
- // Something went wrong!
- debug_report_bug(__FUNCTION__, __LINE__, 'Evaluation error:' . linenumberCode($eval) . '
', false);
- } // END - if
-
- // Use it again
- $GLOBALS['output'] = $newContent;
-
- // Count round
- $cnt++;
- } // END - while
+ // Do the final compilation
+ $GLOBALS['output'] = doFinalCompilation($GLOBALS['output']);
// Extension 'rewrite' installed?
if ((isExtensionActive('rewrite')) && (getOutputMode() != 1)) {
@@ -199,6 +169,44 @@ function compileFinalOutput () {
flushHeaders();
}
+// Main compilation loop
+function doFinalCompilation ($code, $insertComments = true) {
+ // Insert comments? (Only valid with HTML templates, of course)
+ enableTemplateHtml($insertComments);
+
+ // Init counter
+ $cnt = 0;
+
+ // Compile all out
+ while (((strpos($code, '{--') !== false) || (strpos($code, '{DQUOTE}') !== false) || (strpos($code, '{?') !== false) || (strpos($code, '{%') !== false)) && ($cnt < 4)) {
+ // Init common variables
+ $content = array();
+ $newContent = '';
+
+ // Compile it
+ //* DEBUG: */ debugOutput(''.htmlentities($code).'
');
+ $eval = '$newContent = "' . str_replace('{DQUOTE}', '"', compileCode(escapeQuotes($code))) . '";';
+ //* DEBUG: */ if ($insertComments) die(''.linenumberCode($eval).'
');
+ eval($eval);
+ //* DEBUG: */ die(''.htmlentities($newContent).'
');
+
+ // Was that eval okay?
+ if (empty($newContent)) {
+ // Something went wrong!
+ debug_report_bug(__FUNCTION__, __LINE__, 'Evaluation error:' . linenumberCode($eval) . '
', false);
+ } // END - if
+
+ // Use it again
+ $code = $newContent;
+
+ // Count round
+ $cnt++;
+ } // END - while
+
+ // Return the compiled code
+ return $code;
+}
+
// Output the raw HTML code
function outputRawCode ($htmlCode) {
// Output stripped HTML code to avoid broken JavaScript code, etc.
@@ -262,13 +270,10 @@ function loadTemplate ($template, $return = false, $content = array()) {
global $DATA;
// Do we have cache?
- if (isTemplateCached($template)) {
+ if ((isDebuggingTemplateCache() === false) && (isTemplateCached($template))) {
// Evaluate the cache
eval(readTemplateCache($template));
} elseif (!isset($GLOBALS['template_eval'][$template])) {
- // Add more variables which you want to use in your template files
- $username = getUsername();
-
// Make all template names lowercase
$template = strtolower($template);
@@ -301,7 +306,7 @@ function loadTemplate ($template, $return = false, $content = array()) {
// Do we have to compile the code?
$ret = '';
- if ((strpos($GLOBALS['tpl_content'], '$') !== false) || (strpos($GLOBALS['tpl_content'], '{--') !== false) || (strpos($GLOBALS['tpl_content'], '{!') !== false) || (strpos($GLOBALS['tpl_content'], '{?') !== false) || (strpos($GLOBALS['tpl_content'], '{%') !== false)) {
+ if ((strpos($GLOBALS['tpl_content'], '$') !== false) || (strpos($GLOBALS['tpl_content'], '{--') !== false) || (strpos($GLOBALS['tpl_content'], '{?') !== false) || (strpos($GLOBALS['tpl_content'], '{%') !== false)) {
// Normal HTML output?
if (getOutputMode() == '0') {
// Add surrounding HTML comments to help finding bugs faster
@@ -324,27 +329,31 @@ function loadTemplate ($template, $return = false, $content = array()) {
// Cache the eval() command here
$GLOBALS['template_eval'][$template] = $eval;
-
- // Eval the code
- eval($GLOBALS['template_eval'][$template]);
} elseif ((isAdmin()) || ((isInstalling()) && (!isInstalled()))) {
// Only admins shall see this warning or when installation mode is active
- $ret = '
{--TEMPLATE_404--}
-(' . $template . ')
-
-{--TEMPLATE_CONTENT--}
-' . print_r($content, true) . '
-{--TEMPLATE_DATA--}
-' . print_r($DATA, true) . '
-
';
+ $ret = '
+ {--TEMPLATE_404--}
+
+
+ (' . $template . ')
+
+
+ {--TEMPLATE_CONTENT--}
+
' . print_r($content, true) . '
+ {--TEMPLATE_DATA--}
+
' . print_r($DATA, true) . '
+
';
} else {
// No file!
$GLOBALS['template_eval'][$template] = '404';
}
- } else {
+ }
+
+ // Code set?
+ if ((isset($GLOBALS['template_eval'][$template])) && ($GLOBALS['template_eval'][$template] != '404')) {
// Eval the code
eval($GLOBALS['template_eval'][$template]);
- }
+ } // END - if
// Do we have some content to output or return?
if (!empty($ret)) {
@@ -423,29 +432,23 @@ function loadEmailTemplate ($template, $content = array(), $userid = '0') {
// Make sure all template names are lowercase!
$template = strtolower($template);
- // Default 'nickname' if extension is not installed
- $nick = '---';
-
- // Neutral email address is default
- $email = getConfig('WEBMASTER');
-
// Is content an array?
if (is_array($content)) {
// Add expiration to array
if ((isConfigEntrySet('auto_purge')) && (getConfig('auto_purge') == '0')) {
// Will never expire!
- $content['expiration'] = getMessage('MAIL_WILL_NEVER_EXPIRE');
+ $content['expiration'] = '{--MAIL_WILL_NEVER_EXPIRE--}';
} elseif (isConfigEntrySet('auto_purge')) {
// Create nice date string
$content['expiration'] = createFancyTime(getConfig('auto_purge'));
} else {
// Missing entry
- $content['expiration'] = getMessage('MAIL_NO_CONFIG_AUTO_PURGE');
+ $content['expiration'] = '{--MAIL_NO_CONFIG_AUTO_PURGE--}';
}
} // END - if
// Load user's data
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "UID={$userid},template={$template},content[]=".gettype($content).'
');
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "UID={$userid},template={$template},content[]=".gettype($content));
if (($userid > 0) && (is_array($content))) {
// If nickname extension is installed, fetch nickname as well
if ((isExtensionActive('nickname')) && (isNicknameUsed($userid))) {
@@ -466,16 +469,6 @@ function loadEmailTemplate ($template, $content = array(), $userid = '0') {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "content()=".count($content)." - AFTER
");
} // END - if
- // Translate M to male or F to female if present
- if (isset($content['gender'])) $content['gender'] = translateGender($content['gender']);
-
- // Overwrite email from data if present
- if (isset($content['email'])) $email = $content['email'];
-
- // Store email for some functions in global $DATA array
- // @TODO Do only use $content, not $DATA or raw variables
- $DATA['email'] = $email;
-
// Base directory
$basePath = sprintf("%stemplates/%s/emails/", getConfig('PATH'), getLanguage());
@@ -502,18 +495,21 @@ function loadEmailTemplate ($template, $content = array(), $userid = '0') {
eval($GLOBALS['tpl_content']);
} elseif (!empty($template)) {
// Template file not found!
- $newContent = '{--TEMPLATE_404--}: ' . $template . '
-{--TEMPLATE_CONTENT--}
-' . print_r($content, true) . '
-{--TEMPLATE_DATA--}
-' . print_r($DATA, true) . '
-
';
+ $newContent = '
+ {--TEMPLATE_404--}: ' . $template . '
+
+
+ {--TEMPLATE_CONTENT--}
+
' . print_r($content, true) . '
+ {--TEMPLATE_DATA--}
+
' . print_r($DATA, true) . '
+
';
// Debug mode not active? Then remove the HTML tags
if (!isDebugModeEnabled()) $newContent = secureString($newContent);
} else {
// No template name supplied!
- $newContent = getMessage('NO_TEMPLATE_SUPPLIED');
+ $newContent = '{--NO_TEMPLATE_SUPPLIED--}';
}
// Is there some content?
@@ -564,7 +560,7 @@ function sendEmail ($toEmail, $subject, $message, $isHtml = 'N', $mailHeader = '
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "TO={$toEmail}
");
// Check for PHPMailer or debug-mode
- if (!checkPhpMailerUsage()) {
+ if ((!checkPhpMailerUsage()) || (isDebugModeEnabled())) {
// Not in PHPMailer-Mode
if (empty($mailHeader)) {
// Load email header template
@@ -573,24 +569,12 @@ function sendEmail ($toEmail, $subject, $message, $isHtml = 'N', $mailHeader = '
// Append header
$mailHeader .= loadEmailTemplate('header');
}
- } elseif (isDebugModeEnabled()) {
- if (empty($mailHeader)) {
- // Load email header template
- $mailHeader = loadEmailTemplate('header');
- } else {
- // Append header
- $mailHeader .= loadEmailTemplate('header');
- }
- }
-
- // Compile "TO"
- eval('$toEmail = "' . compileRawCode(escapeQuotes($toEmail)) . '";');
-
- // Compile "MSG"
- eval('$message = "' . str_replace('$', '$', compileRawCode(escapeQuotes($message))) . '";');
+ } // END - if
// Fix HTML parameter (default is no!)
if (empty($isHtml)) $isHtml = 'N';
+
+ // Debug mode enabled?
if (isDebugModeEnabled()) {
// In debug mode we want to display the mail instead of sending it away so we can debug this part
outputHtml('
@@ -599,6 +583,9 @@ To : ' . htmlentities(utf8_decode($toEmail)) . '
Subject : ' . htmlentities(utf8_decode($subject)) . '
Message : ' . htmlentities(utf8_decode($message)) . '
');
+
+ // This is always fine
+ return true;
} elseif (($isHtml == 'Y') && (isExtensionActive('html_mail'))) {
// Send mail as HTML away
return sendHtmlEmail($toEmail, $subject, $message, $mailHeader);
@@ -609,6 +596,9 @@ Message : ' . htmlentities(utf8_decode($message)) . '
// Problem found!
return sendRawEmail(getConfig('WEBMASTER'), '[PROBLEM:]' . $subject, $message, $mailHeader);
}
+
+ // Why did we end up here? This should not happen
+ debug_report_bug(__FUNCTION__, __LINE__, 'Ending up: template=' . $template);
}
// Check to use wether legacy mail() command or PHPMailer class
@@ -621,10 +611,10 @@ function checkPhpMailerUsage() {
// Send out a raw email with PHPMailer class or legacy mail() command
function sendRawEmail ($toEmail, $subject, $message, $from) {
// Just compile all again, to put out all configs, etc.
- eval('$toEmail = decodeEntities("' . compileRawCode(escapeQuotes($toEmail)) . '");');
- eval('$subject = decodeEntities("' . compileRawCode(escapeQuotes($subject)) . '");');
- eval('$message = decodeEntities("' . compileRawCode(escapeQuotes($message)) . '");');
- eval('$from = decodeEntities("' . compileRawCode(escapeQuotes($from)) . '");');
+ eval('$toEmail = decodeEntities("' . doFinalCompilation(compileRawCode(escapeQuotes($toEmail)), false) . '");');
+ eval('$subject = decodeEntities("' . doFinalCompilation(compileRawCode(escapeQuotes($subject)), false) . '");');
+ eval('$message = decodeEntities("' . doFinalCompilation(compileRawCode(escapeQuotes($message)), false) . '");');
+ eval('$from = decodeEntities("' . doFinalCompilation(compileRawCode(escapeQuotes($from)) , false) . '");');
// Shall we use PHPMailer class or legacy mode?
if (checkPhpMailerUsage()) {
@@ -755,13 +745,13 @@ function translateYesNo ($yn) {
// Default
$translated = '??? (' . $yn . ')';
switch ($yn) {
- case 'Y': $translated = getMessage('YES'); break;
- case 'N': $translated = getMessage('NO'); break;
+ case 'Y': $translated = '{--YES--}'; break;
+ case 'N': $translated = '{--NO--}'; break;
default:
// Log unknown value
logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unknown value %s. Expected Y/N!", $yn));
break;
- }
+ } // END - switch
// Return it
return $translated;
@@ -821,7 +811,7 @@ function translateComma ($dotted, $cut = true, $max = '0') {
default: // All others
$dotted = number_format($dotted, $maxComma, '.', ',');
break;
- }
+ } // END - switch
// Return translated value
return $dotted;
@@ -834,9 +824,9 @@ function translateGender ($gender) {
// Male/female or company?
switch ($gender) {
- case 'M': $ret = getMessage('GENDER_M'); break;
- case 'F': $ret = getMessage('GENDER_F'); break;
- case 'C': $ret = getMessage('GENDER_C'); break;
+ case 'M': $ret = '{--GENDER_M--}'; break;
+ case 'F': $ret = '{--GENDER_F--}'; break;
+ case 'C': $ret = '{--GENDER_C--}'; break;
default:
// Please report bugs on unknown genders
debug_report_bug(__FUNCTION__, __LINE__, sprintf("Unknown gender %s detected.", $gender));
@@ -859,7 +849,7 @@ function translateUserStatus ($status) {
case '':
case null:
- $ret = getMessage('ACCOUNT_DELETED');
+ $ret = '{--ACCOUNT_DELETED--}';
break;
default:
@@ -872,6 +862,53 @@ function translateUserStatus ($status) {
return $ret;
}
+// "Translates" 'visible' and 'locked' to a CSS class
+function translateMenuVisibleLocked ($content, $prefix = '') {
+ // Translate 'visible' and keep an eye on the prefix
+ switch ($content['visible']) {
+ // Should be visible
+ case 'Y': $content['visible_css'] = $prefix . 'menu_visible' ; break;
+ case 'N': $content['visible_css'] = $prefix . 'menu_invisible'; break;
+ default:
+ // Please report this
+ debug_report_bug(__FUNCTION__, __LINE__, 'Unsupported visible value detected. content=' . print_r($content, true) . '
');
+ break;
+ } // END - switch
+
+ // Translate 'locked' and keep an eye on the prefix
+ switch ($content['locked']) {
+ // Should be locked
+ case 'Y': $content['locked_css'] = $prefix . 'menu_locked' ; break;
+ case 'N': $content['locked_css'] = $prefix . 'menu_unlocked'; break;
+ default:
+ // Please report this
+ debug_report_bug(__FUNCTION__, __LINE__, 'Unsupported locked value detected. content=' . print_r($content, true) . '
');
+ break;
+ } // END - switch
+
+ // Return the resulting array
+ return $content;
+}
+
+// "Getter" for menu CSS classes, mainly used in templates
+function getMenuCssClasses ($data) {
+ // $data needs to be converted into an array
+ $content = explode('|', $data);
+
+ // Non-existent index 2 will happen in menu blocks
+ if (!isset($content[2])) $content[2] = '';
+
+ // Re-construct the array: 0=visible,1=locked,2=prefix
+ $content['visible'] = $content[0];
+ $content['locked'] = $content[1];
+
+ // Call our "translator" function
+ $content = translateMenuVisibleLocked($content, $content[2]);
+
+ // Return CSS classes
+ return ($content['visible_css'] . ' ' . $content['locked_css']);
+}
+
// Generates an URL for the dereferer
function generateDerefererUrl ($URL) {
// Don't de-refer our own links!
@@ -960,20 +997,26 @@ function redirectToUrl ($URL, $allowSpider = true) {
// Simple probe for bots/spiders from search engines
if ((isSpider()) && ($allowSpider === true)) {
- // Secure the URL against bad things such als HTML insertions and so on...
- $URL = secureString($URL);
+ // Set HTTP-Status
+ setHttpStatus('200 OK');
// Set content-type here to fix a missing array element
setContentType('text/html');
// Output new location link as anchor
- outputHtml('' . $URL . '');
+ outputHtml('' . secureString($URL) . '');
} elseif (!headers_sent()) {
+ // Clear output buffer
+ clearOutputBuffer();
+
// Clear own output buffer
$GLOBALS['output'] = '';
+ // Set header
+ setHttpStatus('302 Found');
+
// Load URL when headers are not sent
- sendHeader('Location: '.str_replace('&', '&', $URL));
+ sendRawRedirect(doFinalCompilation(str_replace('&', '&', $URL), false));
} else {
// Output error message
loadInclude('inc/header.php');
@@ -987,17 +1030,8 @@ function redirectToUrl ($URL, $allowSpider = true) {
// Wrapper for redirectToUrl but URL comes from a configuration entry
function redirectToConfiguredUrl ($configEntry) {
- // Get the URL
- $URL = getConfig($configEntry);
-
- // Is this URL set?
- if (is_null($URL)) {
- // Then abort here
- debug_report_bug(__FUNCTION__, __LINE__, sprintf("Configuration entry %s is not set!", $configEntry));
- } // END - if
-
// Load the URL
- redirectToUrl($URL);
+ redirectToUrl(getConfig($configEntry));
}
// Compiles the given HTML/mail code
@@ -1017,15 +1051,18 @@ function compileCode ($code, $simple = false, $constants = true, $full = true) {
// Get timing
$compiled = microtime(true);
- // Add timing
- $code .= '';
+ // Add timing if enabled
+ if (isTemplateHtml()) {
+ // Add timing, this should be disabled in
+ $code .= '';
+ } // END - if
// Return compiled code
return $code;
}
// Compiles the code (use compileCode() only for HTML because of the comments)
-// @TODO $simple is deprecated
+// @TODO $simple/$constants are deprecated
function compileRawCode ($code, $simple = false, $constants = true, $full = true) {
// Is the code a string?
if (!is_string($code)) {
@@ -1042,16 +1079,8 @@ function compileRawCode ($code, $simple = false, $constants = true, $full = true
// Compile more through a filter
$code = runFilterChain('compile_code', $code);
- // Compile constants
- if ($constants === true) {
- // BEFORE 0.2.1 : Language and data constants
- // WITH 0.2.1+ : Only language constants
- $code = str_replace('{--', "\" . getMessage('", str_replace('--}', "') . \"", $code));
-
- // BEFORE 0.2.1 : Not used
- // WITH 0.2.1+ : Data constants
- $code = str_replace('{!', "\" . constant('", str_replace('!}', "') . \"", $code));
- } // END - if
+ // Compile message strings
+ $code = str_replace('{--', '{%message,', str_replace('--}', '%}', $code));
// Compile QUOT and other non-HTML codes
foreach ($secChars['to'] as $k => $to) {
@@ -1090,7 +1119,7 @@ function compileRawCode ($code, $simple = false, $constants = true, $full = true
if ($fuzzyFound === true) continue;
// Take all string elements
- if ((is_string($matches[4][$key])) && (!isset($matchesFound[$match])) && (!isset($matchesFound[$key."_" . $matches[4][$key]]))) {
+ if ((is_string($matches[4][$key])) && (!isset($matchesFound[$match])) && (!isset($matchesFound[$key.'_' . $matches[4][$key]]))) {
// Replace it in the code
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "key={$key},match={$match}
");
$newMatch = str_replace('[', "['", str_replace(']', "']", $match));
@@ -1171,7 +1200,7 @@ function addSelectionBox ($type, $default, $prefix = '', $id = '0', $class = 're
$OUT .= '