X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Ffunctions.php;h=35c3a3646aa2a5f1f6c978667b6e881d358c04e6;hp=f54d18693db3cc0ef999edbe1683b2e2665e991e;hb=8ace8d6167ff99f5d4f6f89d785e4322457daae0;hpb=bc72f913ef9ef26f4103d3deddb4d8be5337a1e5 diff --git a/inc/functions.php b/inc/functions.php index f54d18693d..35c3a3646a 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -150,6 +150,9 @@ 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 @@ -942,6 +945,9 @@ function redirectToUrl ($URL) { // Secure the URL against bad things such als HTML insertions and so on... $URL = secureString($URL); + // Set content-type here to fix a missing array element + setContentType('text/html'); + // Output new location link as anchor outputHtml('' . $URL . ''); } elseif (!headers_sent()) { @@ -1651,7 +1657,7 @@ function addEmailNavigation ($PAGES, $offset, $show_form, $colspan, $return=fals $NAV = ''; for ($page = 1; $page <= $PAGES; $page++) { // Is the page currently selected or shall we generate a link to it? - if (($page == getRequestElement('page')) || ((!isGetRequestElementSet('page')) && ($page == 1))) { + if (($page == getRequestParameter('page')) || ((!isGetRequestParameterSet('page')) && ($page == 1))) { // Is currently selected, so only highlight it $NAV .= '-'; } else { @@ -1659,13 +1665,13 @@ function addEmailNavigation ($PAGES, $offset, $show_form, $colspan, $return=fals $NAV .= ''; } $NAV .= $page; - if (($page == getRequestElement('page')) || ((!isGetRequestElementSet('page')) && ($page == 1))) { + if (($page == getRequestParameter('page')) || ((!isGetRequestParameterSet('page')) && ($page == 1))) { // Is currently selected, so only highlight it $NAV .= '-'; } else { @@ -1750,6 +1756,9 @@ function sendGetRequest ($script, $data = array()) { // Add script data $script .= $body; + // Remove trailed & to make it more conform + if (substr($script, -1, 1) == '&') $script = substr($script, 0, -1); + // Generate GET request header $request = 'GET /' . trim($script) . ' HTTP/1.1' . getConfig('HTTP_EOL'); $request .= 'Host: ' . $host . getConfig('HTTP_EOL'); @@ -1763,8 +1772,9 @@ function sendGetRequest ($script, $data = array()) { $request .= 'Accept-Charset: UTF-8,*' . getConfig('HTTP_EOL'); $request .= 'Cache-Control: no-cache' . getConfig('HTTP_EOL'); $request .= 'Content-Type: text/plain' . getConfig('HTTP_EOL'); - $request .= 'Content-Length: '.strlen($body) . getConfig('HTTP_EOL'); - $request .= 'Connection: Close' . getConfig('HTTP_EOL') . getConfig('HTTP_EOL'); + $request .= 'Content-Length: 0' . getConfig('HTTP_EOL'); + $request .= 'Connection: close' . getConfig('HTTP_EOL'); + $request .= getConfig('HTTP_EOL'); // Send the raw request $response = sendRawRequest($host, $request); @@ -1795,7 +1805,10 @@ function sendPostRequest ($script, $postData) { $request .= 'User-Agent: ' . getConfig('TITLE') . '/' . getConfig('FULL_VERSION') . getConfig('HTTP_EOL'); $request .= 'Cache-Control: no-cache' . getConfig('HTTP_EOL'); $request .= 'Content-Type: application/x-www-form-urlencoded' . getConfig('HTTP_EOL'); - $request .= 'Connection: Close' . getConfig('HTTP_EOL') . getConfig('HTTP_EOL'); + $request .= 'Connection: close' . getConfig('HTTP_EOL'); + $request .= getConfig('HTTP_EOL'); + + // Add body $request .= $body; // Send the raw request @@ -1826,17 +1839,22 @@ function sendRawRequest ($host, $request) { //* DEBUG: */ die("SCRIPT=" . $script.'
'); if ($useProxy === true) { // Connect to host through proxy connection - $fp = @fsockopen(compileRawCode(getConfig('proxy_host')), bigintval(getConfig('proxy_port')), $errno, $errdesc, 30); + $fp = fsockopen(compileRawCode(getConfig('proxy_host')), bigintval(getConfig('proxy_port')), $errno, $errdesc, 30); } else { // Connect to host directly - $fp = @fsockopen($host, 80, $errno, $errdesc, 30); + $fp = fsockopen($host, 80, $errno, $errdesc, 30); } // Is there a link? if (!is_resource($fp)) { // Failed! + logDebugMessage(__FUNCTION__, __LINE__, $errdesc . ' (' . $errno . ')'); return $response; - } // END - if + } elseif ((!stream_set_blocking($fp, 0)) || (!stream_set_timeout($fp, 1))) { + // Cannot set non-blocking mode or timeout + logDebugMessage(__FUNCTION__, __LINE__, socket_strerror(socket_last_error())); + return $response; + } // Do we use proxy? if ($useProxy === true) { @@ -1856,7 +1874,7 @@ function sendRawRequest ($host, $request) { //* DEBUG: */ print('proxyTunnel=
' . $proxyTunnel.'
'); // Write request - fputs($fp, $proxyTunnel); + fwrite($fp, $proxyTunnel); // Got response? if (feof($fp)) { @@ -1874,16 +1892,50 @@ function sendRawRequest ($host, $request) { } // END - if // Write request - fputs($fp, $request); + fwrite($fp, $request); + + // Start counting + $start = microtime(true); // Read response while (!feof($fp)) { - $response[] = trim(fgets($fp, 1024)); + // Get info from stream + $info = stream_get_meta_data($fp); + + // Is it timed out? 15 seconds is a really patient... + if (($info['timed_out'] == true) || (microtime(true) - $start) > 15) { + // Timeout + logDebugMessage(__FUNCTION__, __LINE__, 'Timed out to get data from host ' . $host); + + // Abort here + break; + } // END - if + + // Get line from stream + $line = fgets($fp, 128); + + // Ignore empty lines because of non-blocking mode + if (empty($line)) { + // uslepp a little to avoid 100% CPU load + usleep(10); + + // Skip this + continue; + } // END - if + + // Add it to response + $response[] = trim($line); } // END - while // Close socket fclose($fp); + // Time request if debug-mode is enabled + if (isDebugModeEnabled()) { + // Add debug message... + logDebugMessage(__FUNCTION__, __LINE__, 'Request took ' . (microtime(true) - $start) . ' seconds.'); + } // END - if + // Skip first empty lines $resp = $response; foreach ($resp as $idx => $line) { @@ -1902,8 +1954,11 @@ function sendRawRequest ($host, $request) { //* DEBUG: */ print('Response:
'.print_r($response, true).'
'); - // Proxy agent found? - if ((substr(strtolower($response[0]), 0, 11) == 'proxy-agent') && ($useProxy === true)) { + // Proxy agent found or something went wrong? + if (!isset($response[0])) { + // No response, maybe timeout + $response = array('', '', ''); + } elseif ((substr(strtolower($response[0]), 0, 11) == 'proxy-agent') && ($useProxy === true)) { // Proxy header detected, so remove two lines array_shift($response); array_shift($response); @@ -2019,11 +2074,17 @@ function generateEmailLink ($email, $table = 'admins') { } // Generate a hash for extra-security for all passwords -function generateHash ($plainText, $salt = '') { +function generateHash ($plainText, $salt = '', $hash = true) { // Is the required extension 'sql_patches' there and a salt is not given? if (((isExtensionInstalledAndOlder('sql_patches', '0.3.6')) || (!isExtensionActive('sql_patches')) || (!isExtensionInstalledAndNewer('other', '0.2.5'))) && (empty($salt))) { // Extension sql_patches is missing/outdated so we hash the plain text with MD5 - return md5($plainText); + if ($hash === true) { + // Is plain password + return md5($plainText); + } else { + // Is already a hash + return $plainText; + } } // END - if // Do we miss an arry element here? @@ -2163,35 +2224,37 @@ function generatePassString ($passHash) { $ret = $passHash; // Is a secret key and master salt already initialized? - if ((isExtensionInstalled('sql_patches')) && (isExtensionInstalledAndNewer('other', '0.2.5')) && (isConfigEntrySet('_PRIME')) && (isConfigEntrySet('secret_key')) && (isConfigEntrySet('master_salt'))) { + if ((isExtensionInstalled('sql_patches')) && (isConfigEntrySet('_PRIME')) && (isConfigEntrySet('secret_key')) && (isConfigEntrySet('master_salt'))) { // Only calculate when the secret key is generated + if (strlen($passHash) != getConfig('secret_key')) { + // Both keys must have same length so return unencrypted + return $ret; + } // END - if + $newHash = ''; $start = 9; - for ($idx = '0'; $idx < 10; $idx++) { - $part1 = hexdec(substr($passHash, $start, 4)); - $part2 = hexdec(substr(getConfig('secret_key'), $start, 4)); + //* DEBUG: */ outputHtml('passHash=' . $passHash . '(' . strlen($passHash) . ')
'); + for ($idx = 0; $idx < 20; $idx++) { + $part1 = hexdec(substr($passHash, ($idx * 2), 2)); + $part2 = hexdec(substr(getConfig('secret_key'), $start, 2)); + //* DEBUG: */ outputHtml('part1='.$part1.'/part2='.$part2.'
'); $mod = dechex($idx); if ($part1 > $part2) { $mod = dechex(sqrt(($part1 - $part2) * getConfig('_PRIME') / pi())); } elseif ($part2 > $part1) { $mod = dechex(sqrt(($part2 - $part1) * getConfig('_PRIME') / pi())); } - $mod = substr($mod, 0, 4); + $mod = substr($mod, 0, 2); //* DEBUG: */ outputHtml('part1='.$part1.'/part2='.$part2.'/mod=' . $mod . '('.strlen($mod).')
'); - $mod = str_repeat(0, (4 - strlen($mod))) . $mod; - //* DEBUG: */ outputHtml('*' . $start . '=' . $mod . '*
'); - $start += 4; + $mod = str_repeat(0, (2 - strlen($mod))) . $mod; + //* DEBUG: */ outputHtml('mod(' . ($idx * 2) . ')=' . $mod . '*
'); + $start += 2; $newHash .= $mod; } // END - for - //* DEBUG: */ print($passHash.'
' . $newHash." (".strlen($newHash).')
'); + //* DEBUG: */ print($passHash . '
' . $newHash . ' (' . strlen($newHash) . ')
'); $ret = generateHash($newHash, getConfig('master_salt')); - //* DEBUG: */ print('ret='.$ret.'
'); - } else { - // Hash it simple - //* DEBUG: */ outputHtml("--" . $passHash."--
"); - $ret = md5($passHash); - //* DEBUG: */ outputHtml("++" . $ret."++
"); - } + //* DEBUG: */ print('ret=' . $ret . '
'); + } // END - if // Return result return $ret; @@ -2262,7 +2325,7 @@ function displayParsingTime() { ); // Load the template - loadTemplate('show_timings', false, $content); + $GLOBALS['page_footer'] .= loadTemplate('show_timings', true, $content); } // Check wether a boolean constant is set @@ -2396,7 +2459,7 @@ function getActualVersion ($type = 'Revision') { $FQFN = sprintf("%s/.revision", getConfig('CACHE_PATH')); // Check if 'check_revision_data' is setted (switch for manually rewrite the .revision-File) - if ((isGetRequestElementSet('check_revision_data')) && (getRequestElement('check_revision_data') == 'yes')) { + if ((isGetRequestParameterSet('check_revision_data')) && (getRequestParameter('check_revision_data') == 'yes')) { // Forced rebuild of .revision file $new = true; } else { @@ -2506,6 +2569,12 @@ function getArrayFromActualVersion () { // No valid Data from the last modificated file so read the Revision from the Server. Fallback-solution!! Should not be removed I think. $version = sendGetRequest('check-updates3.php'); + // Invalid request reply? + if (!isset($version[11])) { + // Cannot continue here + debug_report_bug('Invalid response from check-updates3.php, count should be 10, is ' . count($version)); + } // END - if + // Prepare content // Only sets not setted or not proper values to the Online-Server-Fallback-Solution if (!isset($GLOBALS['cache_array']['revision']['Revision']) || $GLOBALS['cache_array']['revision']['Revision'] == '') $GLOBALS['cache_array']['revision']['Revision'] = trim($version[10]); @@ -2631,11 +2700,11 @@ function getMessageFromErrorCode ($code) { 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', getRequestElement('mod')); 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(getRequestElement('blist'), 0); 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; @@ -2655,8 +2724,8 @@ function getMessageFromErrorCode ($code) { 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'); } @@ -2665,7 +2734,7 @@ function getMessageFromErrorCode ($code) { 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); @@ -2836,7 +2905,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 @@ -3110,18 +3179,18 @@ 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')); @@ -3227,15 +3296,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); @@ -3683,7 +3752,7 @@ function sendModeMails ($mod, $modes) { $hash = generatePassString(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(); @@ -3701,7 +3770,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 @@ -3717,7 +3786,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 @@ -3879,6 +3948,66 @@ function isSpider () { return ((strpos($userAgent, 'spider') !== false) || (strpos($userAgent, 'slurp') !== false) || (strpos($userAgent, 'bot') !== false)); } +// Prepares the header for HTML output +function loadHtmlHeader () { + // Determine the page title + $content['header_title'] = determinePageTitle(); + + // Output page header code + $GLOBALS['page_header'] = loadTemplate('page_header', true, $content); + + // Include meta data in 'guest' module + if (getModule() == 'index') { + // Load meta data template + $GLOBALS['page_header'] .= loadTemplate('metadata', true); + + // Add meta description to header + if ((isInstalled()) && (isAdminRegistered()) && (SQL_IS_LINK_UP())) { + // Add meta description not in admin and login module and when the script is installed + generateMetaDescriptionCode(); + } // END - if + } // END - if + + // Include more header data here + $GLOBALS['page_header'] .= loadTemplate('header', true); + + // Include stylesheet + loadIncludeOnce('inc/stylesheet.php'); + + // Closing HEAD tag + $GLOBALS['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 + if (getModule() == 'index') { + // 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']); +} + ////////////////////////////////////////////////// // AUTOMATICALLY RE-GENERATED MISSING FUNCTIONS // //////////////////////////////////////////////////