X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Ffunctions.php;h=5e7d2962d2adabc3e0a022d89c4b4fe8ff30dfc3;hp=8b1f6ce32bf7605360c93c05d83824976bbda41d;hb=6b09b7acfe748ff6fdf3904026c187cfe9648ed4;hpb=e45e218c4f629ec63f0788cab231bfc88b3fa46e diff --git a/inc/functions.php b/inc/functions.php index 8b1f6ce32b..5e7d2962d2 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -45,11 +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'] = ''; - - // Transfer username - $username = getMessage('USERNAME_UNKNOWN'); - if (isset($GLOBALS['username'])) $username = getUsername(); + if (!isset($GLOBALS['output'])) { + $GLOBALS['output'] = ''; + } // END - if // Do we have HTML-Code here? if (!empty($htmlCode)) { @@ -83,7 +81,7 @@ function outputHtml ($htmlCode, $newLine = true) { default: // Huh, something goes wrong or maybe you have edited config.php ??? - app_die(__FUNCTION__, __LINE__, '{--FATAL_ERROR--}: {--LANG_NO_RENDER_DIRECT--}'); + debug_report_bug(__FUNCTION__, __LINE__, '{--FATAL_ERROR--}: {--LANG_NO_RENDER_DIRECT--}'); break; } // END - switch } elseif ((getPhpCaching() == 'on') && ((!isset($GLOBALS['header'])) || (count($GLOBALS['header']) == 0))) { @@ -95,11 +93,6 @@ function outputHtml ($htmlCode, $newLine = true) { clearOutputBuffer(); } // END - if - // Extension 'rewrite' installed? - if ((isExtensionActive('rewrite')) && (getOutputMode() != 1)) { - $GLOBALS['output'] = rewriteLinksInCode($GLOBALS['output']); - } // END - if - // Send all HTTP headers sendHttpHeaders(); @@ -109,11 +102,6 @@ function outputHtml ($htmlCode, $newLine = true) { // Output code here, DO NOT REMOVE! ;-) outputRawCode($GLOBALS['output']); } elseif ((getConfig('OUTPUT_MODE') == 'render') && (!empty($GLOBALS['output']))) { - // Rewrite links when rewrite extension is active - if ((isExtensionActive('rewrite')) && (getOutputMode() != 1)) { - $GLOBALS['output'] = rewriteLinksInCode($GLOBALS['output']); - } // END - if - // Send all HTTP headers sendHttpHeaders(); @@ -134,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 @@ -148,32 +136,16 @@ 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'], '{--') > 0) || (strpos($GLOBALS['output'], '{!') > 0) || (strpos($GLOBALS['output'], '{?') > 0)) && ($cnt < 3)) { - // Init common variables - $content = array(); - $newContent = ''; + // Do the final compilation + $GLOBALS['output'] = doFinalCompilation($GLOBALS['output']); - // Compile it - $eval = "\$newContent = \"".compileCode(escapeQuotes($GLOBALS['output']))."\";"; - eval($eval); - - // Was that eval okay? - if (empty($newContent)) { - // Something went wrong! - debug_report_bug('Evaluation error:
' . linenumberCode($eval) . '
', false); - } // END - if - $GLOBALS['output'] = $newContent; - - // Count round - $cnt++; - } // END - while + // Extension 'rewrite' installed? + if ((isExtensionActive('rewrite')) && (getOutputMode() != 1)) { + $GLOBALS['output'] = rewriteLinksInCode($GLOBALS['output']); + } // END - if // Compress it? if (!empty($_SERVER['HTTP_ACCEPT_ENCODING']) && (strpos('gzip', $_SERVER['HTTP_ACCEPT_ENCODING']) !== null)) { @@ -197,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 < 3)) { + // Init common variables + $content = array(); + $newContent = ''; + + // Compile it + //* DEBUG: */ print '
'.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. @@ -254,7 +264,7 @@ function getTotalFatalErrors () { // Load a template file and return it's content (only it's name; do not use ' or ") function loadTemplate ($template, $return = false, $content = array()) { // @TODO Remove this sanity-check if all is fine - if (!is_bool($return)) debug_report_bug('return is not bool (' . gettype($return) . ')'); + if (!is_bool($return)) debug_report_bug(__FUNCTION__, __LINE__, 'return is not bool (' . gettype($return) . ')'); // @TODO Try to rewrite all $DATA to $content global $DATA; @@ -264,9 +274,6 @@ function loadTemplate ($template, $return = false, $content = array()) { // 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); @@ -299,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 @@ -322,9 +329,6 @@ 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--}
@@ -339,10 +343,13 @@ function loadTemplate ($template, $return = false, $content = array()) { // 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)) { @@ -562,7 +569,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 @@ -571,24 +578,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('
@@ -597,6 +592,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); @@ -607,6 +605,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 @@ -619,10 +620,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()) { @@ -759,7 +760,7 @@ function translateYesNo ($yn) { // Log unknown value logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unknown value %s. Expected Y/N!", $yn)); break; - } + } // END - switch // Return it return $translated; @@ -819,7 +820,7 @@ function translateComma ($dotted, $cut = true, $max = '0') { default: // All others $dotted = number_format($dotted, $maxComma, '.', ','); break; - } + } // END - switch // Return translated value return $dotted; @@ -837,7 +838,7 @@ function translateGender ($gender) { case 'C': $ret = getMessage('GENDER_C'); break; default: // Please report bugs on unknown genders - debug_report_bug(sprintf("Unknown gender %s detected.", $gender)); + debug_report_bug(__FUNCTION__, __LINE__, sprintf("Unknown gender %s detected.", $gender)); break; } // END - switch @@ -862,7 +863,7 @@ function translateUserStatus ($status) { default: // Please report all unknown status - debug_report_bug(sprintf("Unknown status %s detected.", $status)); + debug_report_bug(__FUNCTION__, __LINE__, sprintf("Unknown status %s detected.", $status)); break; } // END - switch @@ -870,6 +871,34 @@ 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[$prefix . 'visible']) { + // Should be visible + case 'Y': $content[$prefix . 'visible_css'] = $prefix . 'menu_visible' ; break; + case 'N': $content[$prefix . '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[$prefix . 'locked']) { + // Should be locked + case 'Y': $content[$prefix . 'locked_css'] = $prefix . 'menu_locked' ; break; + case 'N': $content[$prefix . '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; +} + // Generates an URL for the dereferer function generateDerefererUrl ($URL) { // Don't de-refer our own links! @@ -952,26 +981,32 @@ function redirectToUrl ($URL, $allowSpider = true) { } // END - if // Three different ways to debug... - //* DEBUG: */ debug_report_bug(sprintf("%s[%s:] URL=%s", __FUNCTION__, __LINE__, $URL)); + //* DEBUG: */ debug_report_bug(__FUNCTION__, __LINE__, sprintf("%s[%s:] URL=%s", __FUNCTION__, __LINE__, $URL)); //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'URL=' . $URL); //* DEBUG: */ die($URL); // 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'); @@ -985,17 +1020,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(sprintf("Configuration entry %s is not set!", $configEntry)); - } // END - if - // Load the URL - redirectToUrl($URL); + redirectToUrl(getConfig($configEntry)); } // Compiles the given HTML/mail code @@ -1015,15 +1041,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)) { @@ -1040,16 +1069,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) { @@ -1165,30 +1186,30 @@ function addSelectionBox ($type, $default, $prefix = '', $id = '0', $class = 're if ($type == 'yn') { // This is a yes/no selection only! - if ($id > 0) $prefix .= "[" . $id."]"; - $OUT .= " '; } else { // Begin with regular selection box here if (!empty($prefix)) $prefix .= "_"; $type2 = $type; - if ($id > 0) $type2 .= "[" . $id."]"; - $OUT .= " '; } switch ($type) { case 'day': // Day for ($idx = 1; $idx < 32; $idx++) { - $OUT .= "'; } // END - for break; case 'month': // Month - foreach ($GLOBALS['month_descr'] as $month => $descr) { - $OUT .= "'; } // END - for } elseif ($default == -1) { // Current year minus 1 - for ($idx = $startYear; $idx <= ($year + 1); $idx++) - { - $OUT .= "\n"; - } + for ($idx = $startYear; $idx <= ($year + 1); $idx++) { + $OUT .= ''; + } // END - for } else { // Get current year and subtract the configured minimum age - $OUT .= "\n"; + $OUT .= ''; // Calculate earliest year depending on extension version if (isExtensionInstalledAndNewer('order', '0.2.1')) { // Use configured minimum age @@ -1235,41 +1255,41 @@ function addSelectionBox ($type, $default, $prefix = '', $id = '0', $class = 're // Construct year selection list for ($idx = $minYear; $idx <= $year; $idx++) { - $OUT .= "'; } // END - for } break; case 'sec': case 'min': - for ($idx = '0'; $idx < 60; $idx+=5) { + for ($idx = 0; $idx < 60; $idx+=5) { if (strlen($idx) == 1) $idx = '0' . $idx; - $OUT .= "'; } // END - for break; case 'hour': - for ($idx = '0'; $idx < 24; $idx++) { + for ($idx = 0; $idx < 24; $idx++) { if (strlen($idx) == 1) $idx = '0' . $idx; - $OUT .= "'; } // END - for break; case 'yn': - $OUT .= "