Login procedure rewritten to filters (internal TODO)
[mailer.git] / inc / functions.php
index 2052e4af838925ea3679260c79f57d2d0d5e4329..77065f95dc90447e82733d57730b0d116ef105ad 100644 (file)
@@ -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:
@@ -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 = '<br /><span class=\\"guest_failed\\">{--TEMPLATE_404--}</span><br />
+                       $ret = '<br /><span class="guest_failed">{--TEMPLATE_404--}</span><br />
 (' . $template . ')<br />
 <br />
 {--TEMPLATE_CONTENT--}
@@ -350,44 +350,53 @@ function detectExtraTemplatePath ($template) {
        // Default is empty
        $extraPath = '';
 
-       // Check for admin/guest/member templates
-       if (substr($template, 0, 6) == 'admin_') {
-               // Admin template found
-               $extraPath = 'admin/';
-       } elseif (substr($template, 0, 6) == 'guest_') {
-               // Guest template found
-               $extraPath = 'guest/';
-       } elseif (substr($template, 0, 7) == 'member_') {
-               // Member template found
-               $extraPath = 'member/';
-       } elseif (substr($template, 0, 8) == 'install_') {
-               // Installation template found
-               $extraPath = 'install/';
-       } elseif (substr($template, 0, 4) == 'ext_') {
-               // Extension template found
-               $extraPath = 'ext/';
-       } elseif (substr($template, 0, 3) == 'la_') {
-               // 'Logical-area' template found
-               $extraPath = 'la/';
-       } elseif (substr($template, 0, 3) == 'js_') {
-               // JavaScript template found
-               $extraPath = 'js/';
-       } elseif (substr($template, 0, 5) == 'menu_') {
-               // Menu template found
-               $extraPath = 'menu/';
-       } else {
-               // Test for extension
-               $test = substr($template, 0, strpos($template, '_'));
+       // Do we have cache?
+       if (!isset($GLOBALS['extra_path'][$template])) {
+               // Check for admin/guest/member/etc. templates
+               if (substr($template, 0, 6) == 'admin_') {
+                       // Admin template found
+                       $extraPath = 'admin/';
+               } elseif (substr($template, 0, 6) == 'guest_') {
+                       // Guest template found
+                       $extraPath = 'guest/';
+               } elseif (substr($template, 0, 7) == 'member_') {
+                       // Member template found
+                       $extraPath = 'member/';
+               } elseif (substr($template, 0, 7) == 'select_') {
+                       // Selection template found
+                       $extraPath = 'select/';
+               } elseif (substr($template, 0, 8) == 'install_') {
+                       // Installation template found
+                       $extraPath = 'install/';
+               } elseif (substr($template, 0, 4) == 'ext_') {
+                       // Extension template found
+                       $extraPath = 'ext/';
+               } elseif (substr($template, 0, 3) == 'la_') {
+                       // 'Logical-area' template found
+                       $extraPath = 'la/';
+               } elseif (substr($template, 0, 3) == 'js_') {
+                       // JavaScript template found
+                       $extraPath = 'js/';
+               } elseif (substr($template, 0, 5) == 'menu_') {
+                       // Menu template found
+                       $extraPath = 'menu/';
+               } else {
+                       // Test for extension
+                       $test = substr($template, 0, strpos($template, '_'));
 
-               // Probe for valid extension name
-               if (isExtensionNameValid($test)) {
-                       // Set extra path to extension's name
-                       $extraPath = $test . '/';
-               } // END - if
-       }
+                       // Probe for valid extension name
+                       if (isExtensionNameValid($test)) {
+                               // Set extra path to extension's name
+                               $extraPath = $test . '/';
+                       } // END - if
+               }
+
+               // Store it in cache
+               $GLOBALS['extra_path'][$template] = $extraPath;
+       } // END - if
 
        // Return result
-       return $extraPath;
+       return $GLOBALS['extra_path'][$template];
 }
 
 // Loads an email template and compiles it
@@ -439,7 +448,7 @@ function loadEmailTemplate ($template, $content = array(), $UID = '0') {
        //* DEBUG: */ outputHtml(__FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):UID={$UID},template={$template},content[]=".gettype($content).'<br />');
        if (($UID > 0) && (is_array($content))) {
                // If nickname extension is installed, fetch nickname as well
-               if (isNicknameUsed($UID)) {
+               if ((isExtensionActive('nickname')) && (isNicknameUsed($UID))) {
                        //* DEBUG: */ outputHtml(__FUNCTION__."(<font color=\"#0000aa\">".__LINE__."</font>):NICKNAME!<br />");
                        // Load by nickname
                        fetchUserData($UID, 'nickname');
@@ -997,16 +1006,16 @@ function compileCode ($code, $simple = false, $constants = true, $full = true) {
        } // END - if
 
        // Start couting
-       $startCompile = explode(' ', microtime());
+       $startCompile = microtime(true);
 
        // Comile the code
        $code = compileRawCode($code, $simple, $constants, $full);
 
        // Get timing
-       $compiled = explode(' ', microtime());
+       $compiled = microtime(true);
 
        // Add timing
-       $code .= '<!-- Compilation time: ' . ((($compiled[1] + $compiled[0]) - ($startCompile[1] + $startCompile[0])) * 1000). 'ms //-->';
+       $code .= '<!-- Compilation time: ' . (($compiled - $startCompile) * 1000). 'ms //-->';
 
        // Return compiled code
        return $code;
@@ -1341,7 +1350,7 @@ function bigintval ($num, $castValue = true) {
 function generateImageOrCode ($img_code, $headerSent = true) {
        // Is the code size oversized or shouldn't we display it?
        if ((strlen($img_code) > 6) || (empty($img_code)) || (getConfig('code_length') == '0')) {
-               // Stop2 execution of function here because of over-sized code length
+               // Stop execution of function here because of over-sized code length
                debug_report_bug('img_code ' . $img_code .' has invalid length. img_code()=' . strlen($img_code) . ' code_length=' . getConfig('code_length'));
        } elseif ($headerSent === false) {
                // Return an HTML code here
@@ -1458,31 +1467,31 @@ function createTimeSelections ($timestamp, $prefix = '', $display = '', $align =
                $OUT .= "<tr>\n";
 
                if (ereg('Y', $display) || (empty($display))) {
-                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom2\"><div class=\"tiny\">{--_YEARS--}</strong></td>\n";
+                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom\"><div class=\"tiny\">{--_YEARS--}</strong></td>\n";
                }
 
                if (ereg('M', $display) || (empty($display))) {
-                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom2\"><div class=\"tiny\">{--_MONTHS--}</strong></td>\n";
+                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom\"><div class=\"tiny\">{--_MONTHS--}</strong></td>\n";
                }
 
                if (ereg('W', $display) || (empty($display))) {
-                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom2\"><div class=\"tiny\">{--_WEEKS--}</strong></td>\n";
+                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom\"><div class=\"tiny\">{--_WEEKS--}</strong></td>\n";
                }
 
                if (ereg('D', $display) || (empty($display))) {
-                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom2\"><div class=\"tiny\">{--_DAYS--}</strong></td>\n";
+                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom\"><div class=\"tiny\">{--_DAYS--}</strong></td>\n";
                }
 
                if (ereg('h', $display) || (empty($display))) {
-                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom2\"><div class=\"tiny\">{--_HOURS--}</strong></td>\n";
+                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom\"><div class=\"tiny\">{--_HOURS--}</strong></td>\n";
                }
 
                if (ereg('m', $display) || (empty($display))) {
-                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom2\"><div class=\"tiny\">{--_MINUTES--}</strong></td>\n";
+                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom\"><div class=\"tiny\">{--_MINUTES--}</strong></td>\n";
                }
 
                if (ereg('s', $display) || (empty($display))) {
-                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom2\"><div class=\"tiny\">{--_SECONDS--}</strong></td>\n";
+                       $OUT .= "  <td align=\"center\" class=\"timebox_column bottom\"><div class=\"tiny\">{--_SECONDS--}</strong></td>\n";
                }
 
                $OUT .= "</tr>\n";
@@ -1646,7 +1655,7 @@ function createFancyTime ($stamp) {
 function addEmailNavigation ($PAGES, $offset, $show_form, $colspan, $return=false) {
        $SEP = ''; $TOP = '';
        if ($show_form === false) {
-               $TOP = " top2";
+               $TOP = " top";
                $SEP = "<tr><td colspan=\"" . $colspan."\" class=\"seperator\">&nbsp;</td></tr>";
        }
 
@@ -1720,7 +1729,7 @@ function extractHostnameFromUrl (&$script) {
        if (substr(strtolower($script), 0, 7) == 'http://') {
                // But only if http:// is in front!
                $script = substr($script, (strlen($url) + 7));
-       } elseif (substr(strtolower($script), 0, 8) == "https://") {
+       } elseif (substr(strtolower($script), 0, 8) == 'https://') {
                // Does this work?!
                $script = substr($script, (strlen($url) + 8));
        }
@@ -2028,7 +2037,7 @@ function generateHash ($plainText, $salt = '') {
 
        // Do we miss an arry element here?
        if (!isConfigEntrySet('file_hash')) {
-               // Stop2 here
+               // Stop here
                debug_report_bug('Missing file_hash in ' . __FUNCTION__ . '.');
        } // END - if
 
@@ -2302,89 +2311,16 @@ function getCurrentTheme () {
        // The default theme is 'default'... ;-)
        $ret = 'default';
 
-       // Load default theme if not empty from configuration
-       if ((isConfigEntrySet('default_theme')) && (getConfig('default_theme') != '')) $ret = getConfig('default_theme');
-
-       if (!isSessionVariableSet('mxchange_theme')) {
-               // Set default theme
-               setTheme($ret);
-       } elseif ((isSessionVariableSet('mxchange_theme')) && (isExtensionInstalledAndNewer('sql_patches', '0.1.4'))) {
-               //die("<pre>".print_r($GLOBALS['cache_array']['themes'], true)."</pre>");
-               // 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 +2424,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
 
@@ -2638,7 +2574,7 @@ function debug_report_bug ($message = '') {
        } // END - if
 
        // Add output
-       $debug .= "Please report this bug at <a title=\"Direct link to the bug-tracker\" href=\"http://bugs.mxchange.org\" rel=\"external\" target=\"_blank\">bugs.mxchange.org</a> and include the logfile from <strong>" . getConfig('CACHE_PATH') . "debug.log</strong> in your report (you can now attach files):<pre>";
+       $debug .= "Please report this bug at <a title=\"Direct link to the bug-tracker\" href=\"http://bugs.mxchange.org\" rel=\"external\" target=\"_blank\">bugs.mxchange.org</a> and include the logfile from <strong>" . str_replace(getConfig('PATH'), '', getConfig('CACHE_PATH')) . "debug.log</strong> in your report (you can now attach files):<pre>";
        $debug .= debug_get_printable_backtrace();
        $debug .= "</pre>\nRequest-URI: " . getRequestUri()."<br />\n";
        $debug .= "Thank you for finding bugs.";
@@ -2648,11 +2584,9 @@ function debug_report_bug ($message = '') {
        die($debug);
 }
 
-// Generates a ***weak*** seed (taken from de.php.net/mt_srand)
+// Generates a ***weak*** seed
 function generateSeed () {
-       list($usec, $sec) = explode(' ', microtime());
-       $microTime = (((float)$sec + (float)$usec)) * 100000;
-       return $microTime;
+       return microtime(true) * 100000;
 }
 
 // Converts a message code to a human-readable message
@@ -3166,7 +3100,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)) {
@@ -3183,7 +3117,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) {
@@ -3227,7 +3161,7 @@ function shutdown () {
                addFatalMessage(__FILE__, __LINE__, getMessage('NO_DB_LINK_SHUTDOWN'));
        }
 
-       // Stop2 executing here
+       // Stop executing here
        exit;
 }
 
@@ -3610,10 +3544,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;
@@ -3707,6 +3641,168 @@ 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 = "<span class=\"member_done\">{--MYDATA_MAIL_SENT--}</span>";
+                                       break;
+
+                               default: // Unsupported module!
+                                       logDebugMessage(__FUNCTION__, __LINE__, sprintf("Unsupported module %s detected.", $mod));
+                                       $content = "<span class=\"member_failed\">{--UNKNOWN_MODULE--}</span>";
+                                       break;
+                       } // END - switch
+               } else {
+                       // Passwords mismatch
+                       $content = "<span class=\"member_failed\">{--MEMBER_PASSWORD_ERROR--}</span>";
+               }
+       } else {
+               // Could not load profile
+               $content = "<span class=\"member_failed\">{--MEMBER_CANNOT_LOAD_PROFILE--}</span>";
+       }
+
+       // 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 = "<span class=\"member_done\">{--MYDATA_MAIL_SENT--}</span>";
+               }
+       } // 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 = '<select name="' . $name . '" size="1" class="admin_select">
+<option value="X" disabled="disabled">{--PLEASE_SELECT--}</option>';
+
+       // Walk through all options
+       foreach ($options as $option) {
+               // Add the <option> entry
+               $OUT .= '<option value="' . $option[$optionValue] . '">' . $option[$optionContent] . '</option>';
+       } // END - foreach
+
+       // Finish selection box
+       $OUT .= '</select>';
+
+       // 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;
+}
+
 //////////////////////////////////////////////////
 // AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS //
 //////////////////////////////////////////////////