* -------------------------------------------------------------------- *
* Kurzbeschreibung : Viele Nicht-Datenbank-Funktionen *
* -------------------------------------------------------------------- *
- * $Revision:: $ *
- * $Date:: $ *
- * $Tag:: 0.2.1-FINAL $ *
- * $Author:: $ *
- * -------------------------------------------------------------------- *
* Copyright (c) 2003 - 2009 by Roland Haeder *
- * Copyright (c) 2009 - 2013 by Mailer Developer Team *
+ * Copyright (c) 2009 - 2016 by Mailer Developer Team *
* For more information visit: http://mxchange.org *
* *
* This program is free software; you can redistribute it and/or modify *
// OPPOMENT: convertCommaToDot()
function translateComma ($dotted, $cut = TRUE, $max = '0') {
// First, cast all to double, due to PHP changes
- $dotted = (double) $dotted;
-
- // Default is 3 you can change this in admin area "Settings -> Misc Options"
- if (!isConfigEntrySet('max_comma')) {
- setConfigEntry('max_comma', 3);
- } // END - if
+ $double = (double) $dotted;
// Use from config is default
$maxComma = getConfig('max_comma');
// Cut zeros off?
if (($cut === TRUE) && ($max == '0')) {
// Test for commata if in cut-mode
- $com = explode('.', $dotted);
+ $com = explode('.', $double);
if (count($com) < 2) {
// Don't display commatas even if there are none... ;-)
$maxComma = '0';
// Debug log
// Translate it now
- $translated = $dotted;
+ $translated = $double;
switch (getLanguage()) {
case 'de': // German language
- $translated = number_format($dotted, $maxComma, ',', '.');
+ $translated = number_format($double, $maxComma, ',', '.');
break;
default: // All others
- $translated = number_format($dotted, $maxComma, '.', ',');
+ $translated = number_format($double, $maxComma, '.', ',');
break;
} // END - switch
// Return translated value
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dotted=' . $dotted . ',translated=' . $translated . ',maxComma=' . $maxComma);
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'double=' . $double . ',translated=' . $translated . ',maxComma=' . $maxComma);
return $translated;
}
// "Translates" 'visible' and 'locked' to a CSS class
function translateMenuVisibleLocked ($content, $prefix = '') {
+ // 1st parameter should be an array
+ assert(is_array($content));
+
// Default is 'menu_unknown'
$content['visible_css'] = $prefix . 'menu_unknown';
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'url=' . $url . ',hash=' . $hash . '(' . strlen($hash) . ')');
// De-refer this URL
- $url = '{%url=modules.php?module=loader&url=' . $encodedUrl . '&hash=' . encodeHashForCookie($hash) . '&salt=' . substr($hash, 0, getSaltLength()) . '%}';
+ $url = sprintf(
+ '{%%url=modules.php?module=loader&url=%s&hash=%s&salt=%s%%}',
+ $encodedUrl,
+ encodeHashForCookie($hash),
+ substr($hash, 0, getSaltLength())
+ );
} // END - if
// Return link
$ret = '0';
// Count all entries
- foreach ($array as $key => $selected) {
+ foreach ($array as $selected) {
// Is it checked?
if (!empty($selected)) {
// Yes, then count it
}
// Redirects to an URL and if neccessarry extends it with own base URL
-function redirectToUrl ($url, $allowSpider = TRUE) {
+// @TODO $allowSpider is unused
+function redirectToUrl ($url, $allowSpider = TRUE, $compileCode = TRUE) {
// Is the output mode -2?
if (isAjaxOutputMode()) {
// This is always (!) an AJAX request and shall not be redirected
$url = substr($url, 6, -2);
} // END - if
- // Compile out codes
- eval('$url = "' . compileRawCode(encodeUrl($url)) . '";');
+ // Compile codes out?
+ if ($compileCode === TRUE) {
+ // Compile out codes
+ eval('$url = "' . compileRawCode(encodeUrl($url)) . '";');
+ } // END - if
// Default 'rel' value is external, nofollow is evil from Google and hurts the Internet
$rel = ' rel="external"';
// Three different ways to debug...
//* DEBUG: */ reportBug(__FUNCTION__, __LINE__, 'URL=' . $url);
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'URL=' . $url);
- //* DEBUG: */ die($url);
+ //* DEBUG-DIE: */ die(__METHOD__ . ':url=' . $url . '<br />compileCode=' . intval($compileCode));
// We should not sent a redirect if headers are already sent
if (!headers_sent()) {
+ // Compile again?
+ if ($compileCode === TRUE) {
+ // Do final compilation
+ $url = doFinalCompilation(str_replace('&', '&', $url), FALSE);
+ } // END - if
+
// Load URL when headers are not sent
- sendRawRedirect(doFinalCompilation(str_replace('&', '&', $url), FALSE));
+ sendRawRedirect($url);
} else {
// Output error message
- loadInclude('inc/header.php');
+ loadPageHeader();
loadTemplate('redirect_url', FALSE, str_replace('&', '&', $url));
- loadInclude('inc/footer.php');
+ loadPageFooter();
}
// Shut the mailer down here
if ($match) {
// We have found two different values, so let's sort whole array
foreach ($temporaryArray as $sort_key => $sort_val) {
- $t = $temporaryArray[$sort_key][$key];
+ $t = $temporaryArray[$sort_key][$key];
$temporaryArray[$sort_key][$key] = $temporaryArray[$sort_key][$key2];
$temporaryArray[$sort_key][$key2] = $t;
unset($t);
//
function generateRandomCode ($length, $code, $userid, $extraData = '') {
// Build server string
- $server = $_SERVER['PHP_SELF'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
+ $server = $_SERVER['REQUEST_URI'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
// Build key string
$keys = getSiteKey() . getEncryptSeparator() . getDateKey();
if (isConfigEntrySet('file_hash')) {
$keys .= getEncryptSeparator() . getFileHash();
} // END - if
- $keys .= getEncryptSeparator() . getDateFromRepository();
+
if (isConfigEntrySet('master_salt')) {
$keys .= getEncryptSeparator() . getMasterSalt();
} // END - if
// When the salt is empty build a new one, else use the first x configured characters as the salt
if (empty($salt)) {
// Build server string for more entropy
- $server = $_SERVER['PHP_SELF'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
+ $server = $_SERVER['REQUEST_URI'] . getEncryptSeparator() . detectUserAgent() . getEncryptSeparator() . getenv('SERVER_SOFTWARE') . getEncryptSeparator() . detectRealIpAddress() . getEncryptSeparator() . detectRemoteAddr();
// Build key string
- $keys = getSiteKey() . getEncryptSeparator() . getDateKey() . getEncryptSeparator() . getFileHash() . getEncryptSeparator() . getDateFromRepository() . getEncryptSeparator() . getMasterSalt();
+ $keys = getSiteKey() . getEncryptSeparator() . getDateKey() . getEncryptSeparator() . getFileHash() . getEncryptSeparator() . getMasterSalt();
// Is the secret_key config entry set?
if (isConfigEntrySet('secret_key')) {
if (strlen($str) > 40) {
// The string is to long
return $str;
- } elseif (strlen($str) == 40) {
+ } elseif ((strlen($str) == 40) && (getPassScramble() != '')) {
// From database
- $scrambleNums = explode(':', getPassScramble());
+ $scramble = getPassScramble();
} else {
// Generate new numbers
- $scrambleNums = explode(':', genScrambleString(strlen($str)));
+ $scramble = genScrambleString(strlen($str));
}
+ // Convert it into an array
+ $scrambleNums = explode(':', $scramble);
+
// Assert on both lengths
assert(strlen($str) == count($scrambleNums));
*
* @param $baseDir Relative base directory to PATH to scan from
* @param $prefix Prefix for all positive matches (which files should be found)
- * @param $fileIncludeDirs whether to include directories in the final output array
- * @param $addBaseDir whether to add $baseDir to all array entries
+ * @param $fileIncludeDirs Whether to include directories in the final output array
+ * @param $addBaseDir Whether to add $baseDir to all array entries
* @param $excludeArray Excluded files and directories, these must be full files names, e.g. 'what-' will exclude all files named 'what-' but won't exclude 'what-foo.php'
* @param $extension File extension for all positive matches
* @param $excludePattern Regular expression to exclude more files (preg_match())
- * @param $recursive whether to scan recursively
+ * @param $recursive Whether to scan recursively
* @param $suffix Suffix for positive matches ($extension will be appended, too)
* @param $withPrefixSuffix Whether to include prefix/suffix in found entries
* @return $foundMatches All found positive matches for above criteria
} // END - if
// Add {?URL?} ?
- if ((substr($url, 0, strlen(getUrl())) != getUrl()) && (substr($url, 0, 7) != '{?URL?}') && (substr($url, 0, 7) != 'http://') && (substr($url, 0, 8) != 'https://')) {
+ if ((substr($url, 0, strlen(getUrl())) != getUrl()) && (substr($url, 0, 7) != '{?URL?}') && (!isFullQualifiedUrl($url))) {
// Add it
$url = '{?URL?}/' . $url;
} // END - if
return ((isInStringIgnoreCase('spider', $userAgent)) || (isInStringIgnoreCase('slurp', $userAgent)) || (isInStringIgnoreCase('bot', $userAgent)) || (isInStringIgnoreCase('archiver', $userAgent)));
}
-// Function to search for the last modified file
-function searchDirsRecursive ($dir, &$last_changed, $lookFor = 'Date') {
- // Get dir as array
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dir=' . $dir);
- // Does it match what we are looking for? (We skip a lot files already!)
- // RegexPattern to exclude ., .., .revision, .svn, debug.log or .cache in the filenames
- $excludePattern = '@(\.revision|\.svn|debug\.log|\.cache|config\.php)$@';
-
- $ds = getArrayFromDirectory($dir, '', FALSE, TRUE, array(), '.php', $excludePattern);
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'count(ds)='.count($ds));
-
- // Walk through all entries
- foreach ($ds as $d) {
- // Generate proper FQFN
- $FQFN = str_replace('//', '/', getPath() . $dir . '/' . $d);
-
- // Is it a file and readable?
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dir=' . $dir . ',d=' . $d);
- if (isFileReadable($FQFN)) {
- // $FQFN is a readable file so extract the requested data from it
- $check = extractRevisionInfoFromFile($FQFN, $lookFor);
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'File: ' . $d . ' found. check=' . $check);
-
- // Is the file more recent?
- if ((!isset($last_changed[$lookFor])) || ($last_changed[$lookFor] < $check)) {
- // This file is newer as the file before
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'NEWER!');
- $last_changed['path_name'] = $FQFN;
- $last_changed[$lookFor] = $check;
- } // END - if
- } else {
- // Not readable
- /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'File: ' . $d . ' not readable or directory.');
- }
- } // END - foreach
-}
-
// Handles the braces [] of a field (e.g. value of 'name' attribute)
function handleFieldWithBraces ($field) {
// Are there braces [] at the end?
return $str;
}
-// Hash string with SHA256 and encode it to hex
-function hashSha256 ($str) {
- /// Hash string
- $hash = mhash(MHASH_SHA256, $str);
-
- // Encode it to hexadecimal
- $hex = '';
- for ($i = 0; $i < strlen($hash); $i++) {
- // Encode char to decimal, pad it with zero, add it
- $hex .= padLeftZero(dechex(ord(substr($hash, $i, 1))), 2);
- } // END - if
-
- // Make sure 'length modulo 2' = 0
- assert((strlen($hex) % 2) == 0);
-
- // Return it
- return $hex;
-}
-
// ----------------------------------------------------------------------------
// "Translatation" functions for points_data table
// ----------------------------------------------------------------------------
}
} // END - if
-// "Calculates" password strength
-function calculatePasswordStrength ($password, $configEntry = 'min_password_length') {
- // Default score
- $score = 1;
+// "Getter" for base path from theme
+function getBasePathFromTheme ($theme) {
+ return sprintf('%stheme/%s/css/', getPath(), $theme);
+}
- if ((strlen($password) < 1) || (strlen($password) < getConfig($configEntry))) {
- // Is to weak
- return 0;
+// Wrapper to check whether given theme is readable
+function isThemeReadable ($theme) {
+ // Is there cache?
+ if (!isset($GLOBALS[__FUNCTION__][$theme])) {
+ // Determine it
+ $GLOBALS[__FUNCTION__][$theme] = (isIncludeReadable(sprintf('theme/%s/theme.php', $theme)));
} // END - if
- // At least 8 chars long?
- if (strlen($password) >= 8) {
- // Add score
- $score++;
+ // Return cache
+ return $GLOBALS[__FUNCTION__][$theme];
+}
+
+// Checks whether a given PHP extension is loaded or can be loaded at runtime
+//
+// Supported OS: Windows, Linux, (Mac?)
+function isPhpExtensionLoaded ($extension) {
+ // Is the extension loaded?
+ if (extension_loaded($extension)) {
+ // All fine
+ return TRUE;
} // END - if
- // At least 10 chars long?
- if (strlen($password) >= 10) {
- // Add score
- $score++;
+ // Try to load the extension
+ return loadLibrary($extension);
+}
+
+// Loads given library (aka. PHP extension)
+function loadLibrary ($n, $f = NULL) {
+ // Is the actual function dl() available? (Not on all SAPIs since 5.3)
+ if (!is_callable('dl')) {
+ // Not callable
+ /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'dl() is not callable for n=' . $n . ',f[' . gettype($f) . ']=' . $f);
+ return FALSE;
} // END - if
- // Lower and upper cases?
- if ((preg_match('/[a-z]/', $password)) && (preg_match('/[A-Z]/', $password))) {
- // Add score
- $score++;
+ // Try to load PHP library
+ return dl(((PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '') . ($f ? $f : $n) . '.' . PHP_SHLIB_SUFFIX);
+}
+
+// "Translates" given PHP extension name into a readable version
+function translatePhpExtension ($extension) {
+ // Return the language element
+ return '{--PHP_EXTENSION_' . strtoupper($extension) . '--}';
+}
+
+// Loads stylesheet files in different ways, depending on output mode
+function loadStyleSheets () {
+ // Default styles
+ $stylesList = array(
+ 'general.css',
+ 'ajax.css',
+ );
+
+ // Add stylesheet for installation
+ if ((isInstaller())) {
+ array_push($stylesList, 'install.css');
} // END - if
- // Also numbers?
- if (preg_match('/[0-9]/', $password)) {
- // Add score
- $score++;
+ // When no CSS output-mode is set, set it to file-output
+ if (!isConfigEntrySet('css_php')) {
+ setConfigEntry('css_php', 'FILE');
} // END - if
- // Special characters?
- if (preg_match('/.[!,@,#,$,%,^,&,*,?,\/,_,~,+,-,(,)]/', $password)) {
- // Add score
- $score++;
+ // Get current theme
+ $currentTheme = getCurrentTheme();
+
+ // Has the theme changed?
+ if ($currentTheme != getSession('mailer_theme')) {
+ // Then set it
+ setMailerTheme($currentTheme);
} // END - if
- // Return password score
- return $score;
-}
+ // Output CSS files or content or link to css.php ?
+ if ((isCssOutputMode()) || (getCssPhp() == 'DIRECT')) {
+ // Load CSS files
+ $stylesList = merge_array($stylesList, getExtensionCssFiles());
-// "Translates" password strength/score
-function translatePasswordStrength ($strength) {
- // Return it translated
- return '{--PASSWORD_SCORE_' . bigintval($strength) . '--}';
-}
+ // Generate base path
+ $basePath = getBasePathFromTheme($currentTheme);
-// Checks whether given password is strong enough
-function isStrongPassword ($password) {
- // Determine it
- return (calculatePasswordStrength($password) >= getConfig('min_password_score'));
-}
+ // Output inclusion lines
+ foreach ($stylesList as $value) {
+ // Only include found CSS files (to reduce 404 requests)
+ $FQFN = $basePath . '/' . $value;
-// "Getter" for base path from theme
-function getBasePathFromTheme ($theme) {
- return sprintf('%stheme/%s/css/', getPath(), $theme);
-}
+ // Do include only existing files and whose are not empty
+ if ((isFileReadable($FQFN)) && (filesize($FQFN) > 0)) {
+ switch (getCssPhp()) {
+ case 'DIRECT': // Just link them (unsupported)
+ $GLOBALS['__page_header'] .= '<link rel="stylesheet" type="text/css" href="{%url=theme/' . getCurrentTheme() . '/' . $value . '%}" />';
+ break;
-// Wrapper to check whether given theme is readable
-function isThemeReadable ($theme) {
- // Is there cache?
- if (!isset($GLOBALS[__FUNCTION__][$theme])) {
- // Determine it
- $GLOBALS[__FUNCTION__][$theme] = (isIncludeReadable(sprintf('theme/%s/theme.php', $theme)));
- } // END - if
+ case 'FILE': // Output contents
+ $GLOBALS['__page_header'] .= removeDeprecatedComment(readFromFile($FQFN));
+ break;
- // Return cache
- return $GLOBALS[__FUNCTION__][$theme];
+ default: // Invalid mode!
+ reportBug(__FILE__, __LINE__, sprintf('Invalid css_php value %s detected.', getCssPhp()));
+ break;
+ } // END - switch
+ } // END - if
+ } // END - foreach
+ } elseif ((isHtmlOutputMode()) || (getCssPhp() == 'INLINE')) {
+ // Load CSS files
+ $stylesList = merge_array($stylesList, getExtensionCssFiles());
+
+ // Generate base path
+ $basePath = getBasePathFromTheme(getCurrentTheme());
+
+ // Output inclusion lines
+ $OUT = '';
+ foreach ($stylesList as $value) {
+ // Only include found CSS files (to reduce 404 requests)
+ $FQFN = $basePath . '/' . $value;
+
+ // Do include only existing files and whose are not empty
+ if ((isFileReadable($FQFN)) && (filesize($FQFN) > 0)) {
+ // Load CSS content
+ $OUT .= readFromFile($FQFN);
+ } // END - if
+ } // END - foreach
+
+ // Load template
+ $GLOBALS['__page_header'] .= loadTemplate('css_inline', TRUE, removeDeprecatedComment($OUT));
+ } else {
+ // Now we load all CSS files from css.php!
+ $OUT = '<link rel="stylesheet" type="text/css" href="{%url=css.php';
+
+ if ((isInstaller())) {
+ // Default theme first
+ $OUT .= '?theme=' . getCurrentTheme() . '&installing=1';
+ } else {
+ // Add version + a number to bypass caching problems
+ $OUT .= '?ver={?FULL_VERSION?}&cb={?CACHE_BUSTER?}';
+ }
+
+ // Close tag
+ $GLOBALS['__page_header'] .= $OUT . '%}{%ext,version=sql_patches%}" />';
+ }
}
// [EOF]