X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Ffunctions.php;h=7ed051a28a3d75725f660c2ee592038d659e00d6;hp=c621cbc3f2cd730713c41464a8c925eb9d3a85cf;hb=6d2261c68297de5411ebade6548b6f9c3d3164a0;hpb=606e585919ff565b55fb3c2cdee4a80c4e61a9c6 diff --git a/inc/functions.php b/inc/functions.php index c621cbc3f2..7ed051a28a 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -77,7 +77,7 @@ function outputHtml ($htmlCode, $newLine = true) { // The same as above... ^ outputRawCode($htmlCode); - if ($newLine) print("\n"); + if ($newLine === true) print("\n"); break; default: @@ -169,7 +169,7 @@ function compileFinalOutput () { // Was that eval okay? if (empty($newContent)) { // Something went wrong! - debug_report_bug('Evaluation error:
' . linenumberCode($eval) . ''); + debug_report_bug('Evaluation error:
' . linenumberCode($eval) . '', false); } // END - if $GLOBALS['output'] = $newContent; @@ -302,7 +302,7 @@ function loadTemplate ($template, $return = false, $content = array()) { } else { // Add surrounding HTML comments to help finding bugs faster $ret = '\n" . $GLOBALS['tpl_content'] . '\n"; - $eval = '$ret = "' . escapeQuotes($ret) . '";'; + $eval = '$ret = "' . compileRawCode(escapeQuotes($ret)) . '";'; } // END - if // Cache the eval() command here @@ -312,7 +312,7 @@ function loadTemplate ($template, $return = false, $content = array()) { eval($GLOBALS['template_eval'][$template]); } elseif ((isAdmin()) || ((isInstalling()) && (!isInstalled()))) { // Only admins shall see this warning or when installation mode is active - $ret = '
".print_r($GLOBALS['cache_array']['themes'], true).""); - // Get theme from cookie - $ret = getSession('mxchange_theme'); - - // Is it valid? - if (getThemeId($ret) == '0') { - // Fix it to default - $ret = 'default'; - } // END - if - } elseif ((!isInstalled()) && ((isInstalling()) || (getOutputMode() == true)) && ((isGetRequestElementSet('theme')) || (isPostRequestElementSet('theme')))) { - // Prepare FQFN for checking - $theme = sprintf("%stheme/%s/theme.php", getConfig('PATH'), getRequestElement('theme')); - - // Installation mode active - if ((isGetRequestElementSet('theme')) && (isFileReadable($theme))) { - // Set cookie from URL data - setTheme(getRequestElement('theme')); - } elseif (isFileReadable(sprintf("%stheme/%s/theme.php", getConfig('PATH'), secureString(postRequestElement('theme'))))) { - // Set cookie from posted data - setTheme(secureString(postRequestElement('theme'))); - } - - // Set return value - $ret = getSession('mxchange_theme'); - } else { - // Invalid design, reset cookie - setTheme($ret); - } + // Do we have ext-theme installed and active? + if (isExtensionActive('theme')) { + // Call inner method + $ret = getActualTheme(); + } // END - if // Return theme value return $ret; } -// Setter for theme in session -function setTheme ($newTheme) { - setSession('mxchange_theme', $newTheme); -} - -// Get id from theme -// @TODO Try to move this to inc/libs/theme_functions.php -function getThemeId ($name) { - // Is the extension 'theme' installed? - if (!isExtensionActive('theme')) { - // Then abort here - return 0; - } // END - if - - // Default id - $id = '0'; - - // Is the cache entry there? - if (isset($GLOBALS['cache_array']['themes']['id'][$name])) { - // Get the version from cache - $id = $GLOBALS['cache_array']['themes']['id'][$name]; - - // Count up - incrementStatsEntry('cache_hits'); - } elseif (isExtensionInstalledAndNewer('cache', '0.1.8')) { - // Check if current theme is already imported or not - $result = SQL_QUERY_ESC("SELECT `id` FROM `{?_MYSQL_PREFIX?}_themes` WHERE `theme_path`='%s' LIMIT 1", - array($name), __FUNCTION__, __LINE__); - - // Entry found? - if (SQL_NUMROWS($result) == 1) { - // Fetch data - list($id) = SQL_FETCHROW($result); - } // END - if - - // Free result - SQL_FREERESULT($result); - } - - // Return id - return $id; -} - // Generates an error code from given account status function generateErrorCodeFromUserStatus ($status='') { // If no status is provided, use the default, cached @@ -2488,7 +2418,7 @@ function getActualVersion ($type = 'Revision') { $new = true; } else { // Generate fake cache entry - foreach ($mapper as $map=>$idx) { + foreach ($mapper as $map => $idx) { $GLOBALS['cache_array']['revision'][$map][0] = $ins_vers[$idx]; } // END - foreach @@ -2610,8 +2540,26 @@ function debug_get_printable_backtrace () { return $backtrace; } +// A mail-able backtrace +function debug_get_mailable_backtrace () { + // Init variable + $backtrace = ''; + + // Get and prepare backtrace for output + $backtraceArray = debug_backtrace(); + foreach ($backtraceArray as $key => $trace) { + if (!isset($trace['file'])) $trace['file'] = __FUNCTION__; + if (!isset($trace['line'])) $trace['line'] = __LINE__; + if (!isset($trace['args'])) $trace['args'] = array(); + $backtrace .= ($key+1) . '.:' . basename($trace['file']) . ':' . $trace['line'] . ', ' . $trace['function'] . '(' . count($trace['args']) . ")\n"; + } // END - foreach + + // Return the backtrace + return $backtrace; +} + // Output a debug backtrace to the user -function debug_report_bug ($message = '') { +function debug_report_bug ($message = '', $sendEmail = true) { // Is this already called? if (isset($GLOBALS[__FUNCTION__])) { // Other backtrace @@ -2638,11 +2586,24 @@ function debug_report_bug ($message = '') { } // END - if // Add output - $debug .= "Please report this bug at bugs.mxchange.org and include the logfile from " . getConfig('CACHE_PATH') . "debug.log in your report (you can now attach files):
"; + $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) { + // Prepare content + $content = array( + 'message' => trim($message), + 'backtrace' => trim(debug_get_mailable_backtrace()), + 'request_uri' => trim(getRequestUri()) + ); + + // 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); @@ -2671,8 +2632,7 @@ function getMessageFromErrorCode ($code) { 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('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 = sprintf(getMessage('MODULE_MEM_ONLY'), getRequestElement('mod')); break; @@ -3164,7 +3124,7 @@ function determineReferalId () { } 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') { + } 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)) { @@ -3181,7 +3141,7 @@ function determineReferalId () { $found = false; // Do we have nickname or userid set? - if (isNicknameUsed($GLOBALS['refid'])) { + if ((isExtensionActive('nickname')) && (isNicknameUsed($GLOBALS['refid']))) { // Nickname in URL, so load the id $found = fetchUserData($GLOBALS['refid'], 'nickname'); } elseif ($GLOBALS['refid'] > 0) { @@ -3225,7 +3185,7 @@ function shutdown () { addFatalMessage(__FILE__, __LINE__, getMessage('NO_DB_LINK_SHUTDOWN')); } - // Stop2 executing here + // Stop executing here exit; } @@ -3373,7 +3333,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[] = '..'; @@ -3403,7 +3363,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 . '
'); @@ -3425,6 +3385,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!"); @@ -3467,7 +3431,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!'); @@ -3608,10 +3572,10 @@ function determinePageTitle () { $mode = ''; if (getModule() == 'login') $mode = 'member'; elseif (getModule() == 'index') $mode = 'guest'; - if ((!empty($mode)) && (getConfig('enable_what_title') == 'Y')) $TITLE .= " ".trim(getConfig('title_middle'))." ".getModuleDescription($mode, getWhat()); + if ((!empty($mode)) && (getConfig('enable_what_title') == 'Y')) $TITLE .= ' ' . trim(getConfig('title_middle')) . ' ' . getTitleFromMenu($mode, getWhat()); // Add title decorations? (right) - if ((getConfig('enable_title_deco') == 'Y') && (getConfig('title_right') != '')) $TITLE .= " ".trim(getConfig('title_right')); + if ((getConfig('enable_title_deco') == 'Y') && (getConfig('title_right') != '')) $TITLE .= ' ' . trim(getConfig('title_right')); // Remember title in constant for the template $pageTitle = $TITLE; @@ -3705,6 +3669,208 @@ function escapeJavaScriptQuotes ($str) { return $str; } +// Send out mails depending on the 'mod/modes' combination +// @TODO Lame description for this function +function sendModeMails ($mod, $modes) { + // Load hash + if (fetchUserData(getMemberId())) { + // Extract salt from cookie + $salt = substr(getSession('u_hash'), 0, -40); + + // Now let's compare passwords + $hash = generatePassString(getUserData('password')); + + // Does the hash match or should we change it? + if (($hash == getSession('u_hash')) || (postRequestElement('pass1') == postRequestElement('pass2'))) { + // Load the data + $content = getUserDataArray(); + + // Translate gender + $content['gender'] = translateGender($content['gender']); + + // Clear/init the content variable + $content['message'] = ''; + + // Which mail? + // @TODO Move this in a filter + switch ($mod) { + case 'mydata': + foreach ($modes as $mode) { + 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"; + break; + + case 'pass': // Password was changed + $content['message'] = getMessage('MEMBER_CHANGED_PASS')."\n"; + break; + + default: + logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unknown mode %s detected.", $mode)); + $content['message'] = getMessage('MEMBER_UNKNOWN_MODE') . ': ' . $mode . "\n\n"; + break; + } // END - switch + } // END - foreach + + if (isExtensionActive('country')) { + // Replace code with description + $content['country'] = generateCountryInfo(postRequestElement('country_code')); + } // END - if + + // Merge content with data from POST + $content = merge_array($content, postRequestArray()); + + // Load template + $message = loadEmailTemplate('member_mydata_notify', $content, getMemberId()); + + if (getConfig('admin_notify') == 'Y') { + // The admin needs to be notified about a profile change + $message_admin = 'admin_mydata_notify'; + $sub_adm = getMessage('ADMIN_CHANGED_DATA'); + } else { + // No mail to admin + $message_admin = ''; + $sub_adm = ''; + } + + // Set subject lines + $sub_mem = getMessage('MEMBER_CHANGED_DATA'); + + // Output success message + $content = "{--MYDATA_MAIL_SENT--}"; + break; + + default: // Unsupported module! + logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unsupported module %s detected.", $mod)); + $content = "{--UNKNOWN_MODULE--}"; + break; + } // END - switch + } else { + // Passwords mismatch + $content = "{--MEMBER_PASSWORD_ERROR--}"; + } + } else { + // Could not load profile + $content = "{--MEMBER_CANNOT_LOAD_PROFILE--}"; + } + + // Send email to user if required + if ((!empty($sub_mem)) && (!empty($message))) { + // Send member mail + sendEmail($content['email'], $sub_mem, $message); + } // END - if + + // Send only if no other error has occured + if (empty($content)) { + if ((!empty($sub_adm)) && (!empty($message_admin))) { + // Send admin mail + sendAdminNotification($sub_adm, $message_admin, $content, getMemberId()); + } elseif (getConfig('admin_notify') == 'Y') { + // Cannot send mails to admin! + $content = getMessage('CANNOT_SEND_ADMIN_MAILS'); + } else { + // No mail to admin + $content = "{--MYDATA_MAIL_SENT--}"; + } + } // END - if + + // Load template + loadTemplate('admin_settings_saved', false, $content); +} + +// Generates a 'selection box' from given array +function generateSelectionBoxFromArray ($options, $name, $optionValue, $optionContent) { + // Start the output + $OUT = ''; + + // Prepare output + $content = array( + 'selection_box' => $OUT, + 'module' => getModule(), + 'what' => getWhat() + ); + + // Load template and return it + return loadTemplate('select_' . $name . '_box', true, $content); +} + +// Get a module from filename and access level +function getModuleFromFileName ($file, $accessLevel) { + // Default is 'invalid'; + $modCheck = 'invalid'; + + // @TODO This is still very static, rewrite it somehow + switch ($accessLevel) { + case 'admin': + $modCheck = 'admin'; + break; + + case 'sponsor': + case 'guest': + case 'member': + $modCheck = getModule(); + break; + + default: // Unsupported file name / access level + debug_report_bug('Unsupported file name=' . basename($file) . '/access level=' . $accessLevel); + break; + } + + // Return result + return $modCheck; +} + +// Encodes an URL for adding session id, etc. +function encodeUrl ($url, $outputMode = '0') { + // Do we have already have a PHPSESSID inside? Then it is already converted... + if (strpos($url, session_name()) !== false) return $url; + + // Do we have a valid session? + if ((($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?}')) { + // Add it + $url = '{?URL?}/' . $url; + } // END - if + + // Return the URL + return $url; +} + +// Simple check for spider +function isSpider () { + // Is it a spider? + return ((strpos('spider', strtolower(detectUserAgent(true))) !== false) || (strpos('bot', strtolower(detectUserAgent(true))) !== false)); +} + ////////////////////////////////////////////////// // AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS // //////////////////////////////////////////////////