From a03233cebafc62ec7d88a24856b8a7b37fef4381 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Wed, 07 Oct 2015 03:14:18 -0400 Subject: [PATCH] CS fixes --- program/lib/Roundcube/rcube_utils.php | 191 +++++++++++++++++++++++++++-------------------- 1 files changed, 109 insertions(+), 82 deletions(-) diff --git a/program/lib/Roundcube/rcube_utils.php b/program/lib/Roundcube/rcube_utils.php index eef554e..07dc870 100644 --- a/program/lib/Roundcube/rcube_utils.php +++ b/program/lib/Roundcube/rcube_utils.php @@ -143,39 +143,7 @@ */ public static function check_ip($ip) { - // IPv6, but there's no build-in IPv6 support - if (strpos($ip, ':') !== false && !defined('AF_INET6')) { - $parts = explode(':', $ip); - $count = count($parts); - - if ($count > 8 || $count < 2) { - return false; - } - - foreach ($parts as $idx => $part) { - $length = strlen($part); - if (!$length) { - // there can be only one :: - if ($found_empty) { - return false; - } - $found_empty = true; - } - // last part can be an IPv4 address - else if ($idx == $count - 1) { - if (!preg_match('/^[0-9a-f]{1,4}$/i', $part)) { - return @inet_pton($part) !== false; - } - } - else if (!preg_match('/^[0-9a-f]{1,4}$/i', $part)) { - return false; - } - } - - return true; - } - - return @inet_pton($ip) !== false; + return filter_var($ip, FILTER_VALIDATE_IP) !== false; } /** @@ -185,26 +153,27 @@ */ public static function check_referer() { - $uri = parse_url($_SERVER['REQUEST_URI']); + $uri = parse_url($_SERVER['REQUEST_URI']); $referer = parse_url(self::request_header('Referer')); + return $referer['host'] == self::request_header('Host') && $referer['path'] == $uri['path']; } /** * Replacing specials characters to a specific encoding type * - * @param string Input string - * @param string Encoding type: text|html|xml|js|url - * @param string Replace mode for tags: show|replace|remove - * @param boolean Convert newlines + * @param string Input string + * @param string Encoding type: text|html|xml|js|url + * @param string Replace mode for tags: show|remove|strict + * @param boolean Convert newlines * - * @return string The quoted string + * @return string The quoted string */ public static function rep_specialchars_output($str, $enctype = '', $mode = '', $newlines = true) { static $html_encode_arr = false; - static $js_rep_table = false; - static $xml_rep_table = false; + static $js_rep_table = false; + static $xml_rep_table = false; if (!is_string($str)) { $str = strval($str); @@ -219,8 +188,11 @@ $encode_arr = $html_encode_arr; - // don't replace quotes and html tags - if ($mode == 'show' || $mode == '') { + if ($mode == 'remove') { + $str = strip_tags($str); + } + else if ($mode != 'strict') { + // don't replace quotes and html tags $ltpos = strpos($str, '<'); if ($ltpos !== false && strpos($str, '>', $ltpos) !== false) { unset($encode_arr['"']); @@ -228,9 +200,6 @@ unset($encode_arr['>']); unset($encode_arr['&']); } - } - else if ($mode == 'remove') { - $str = strip_tags($str); } $out = strtr($str, $encode_arr); @@ -264,7 +233,7 @@ // encode for plaintext if ($enctype == 'text') { - return str_replace("\r\n", "\n", $mode=='remove' ? strip_tags($str) : $str); + return str_replace("\r\n", "\n", $mode == 'remove' ? strip_tags($str) : $str); } if ($enctype == 'url') { @@ -284,16 +253,16 @@ * Read input value and convert it for internal use * Performs stripslashes() and charset conversion if necessary * - * @param string Field name to read - * @param int Source to get value from (GPC) - * @param boolean Allow HTML tags in field value - * @param string Charset to convert into + * @param string Field name to read + * @param int Source to get value from (GPC) + * @param boolean Allow HTML tags in field value + * @param string Charset to convert into * - * @return string Field value or NULL if not available + * @return string Field value or NULL if not available */ - public static function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL) + public static function get_input_value($fname, $source, $allow_html = false, $charset = null) { - $value = NULL; + $value = null; if ($source == self::INPUT_GET) { if (isset($_GET[$fname])) { @@ -324,13 +293,13 @@ * Parse/validate input value. See self::get_input_value() * Performs stripslashes() and charset conversion if necessary * - * @param string Input value - * @param boolean Allow HTML tags in field value - * @param string Charset to convert into + * @param string Input value + * @param boolean Allow HTML tags in field value + * @param string Charset to convert into * - * @return string Parsed value + * @return string Parsed value */ - public static function parse_input_value($value, $allow_html=FALSE, $charset=NULL) + public static function parse_input_value($value, $allow_html = false, $charset = null) { global $OUTPUT; @@ -418,9 +387,9 @@ * * @return string Modified CSS source */ - public static function mod_css_styles($source, $container_id, $allow_remote=false) + public static function mod_css_styles($source, $container_id, $allow_remote = false) { - $last_pos = 0; + $last_pos = 0; $replacements = new rcube_string_replacer; // ignore the whole block if evil styles are detected @@ -488,8 +457,8 @@ /** * Generate CSS classes from mimetype and filename extension * - * @param string $mimetype Mimetype - * @param string $filename Filename + * @param string $mimetype Mimetype + * @param string $filename Filename * * @return string CSS classes separated by space */ @@ -575,7 +544,8 @@ } if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https' - && in_array($_SERVER['REMOTE_ADDR'], rcube::get_instance()->config->get('proxy_whitelist', array()))) { + && in_array($_SERVER['REMOTE_ADDR'], rcube::get_instance()->config->get('proxy_whitelist', array())) + ) { return true; } if ($port && $_SERVER['SERVER_PORT'] == $port) { @@ -612,7 +582,8 @@ $h = $_SESSION['storage_host'] ? $_SESSION['storage_host'] : $host; // %z - IMAP domain without first part, e.g. %h=imap.domain.tld, %z=domain.tld $z = preg_replace('/^[^\.]+\./', '', $h); - // %s - domain name after the '@' from e-mail address provided at login screen. Returns FALSE if an invalid email is provided + // %s - domain name after the '@' from e-mail address provided at login screen. + // Returns FALSE if an invalid email is provided if (strpos($name, '%s') !== false) { $user_email = self::get_input_value('_user', self::INPUT_POST); $user_email = self::idn_convert($user_email, true); @@ -638,6 +609,7 @@ if (!empty($_SERVER['HTTP_X_REAL_IP'])) { $remote_ip[] = 'X-Real-IP: ' . $_SERVER['HTTP_X_REAL_IP']; } + // append the X-Forwarded-For header, if set if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $remote_ip[] = 'X-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR']; @@ -685,9 +657,9 @@ /** * Read a specific HTTP request header. * - * @param string $name Header name + * @param string $name Header name * - * @return mixed Header value or null if not available + * @return mixed Header value or null if not available */ public static function request_header($name) { @@ -734,14 +706,14 @@ /** * Improved equivalent to strtotime() * - * @param string $date Date string - * @param object DateTimeZone to use for DateTime object + * @param string $date Date string + * @param DateTimeZone $timezone Timezone to use for DateTime object * * @return int Unix timestamp */ public static function strtotime($date, $timezone = null) { - $date = self::clean_datestr($date); + $date = self::clean_datestr($date); $tzname = $timezone ? ' ' . $timezone->getName() : ''; // unix timestamp @@ -766,14 +738,14 @@ /** * Date parsing function that turns the given value into a DateTime object * - * @param string $date Date string - * @param object DateTimeZone to use for DateTime object + * @param string $date Date string + * @param DateTimeZone $timezone Timezone to use for DateTime object * - * @return object DateTime instance or false on failure + * @return DateTime instance or false on failure */ public static function anytodatetime($date, $timezone = null) { - if (is_object($date) && is_a($date, 'DateTime')) { + if ($date instanceof DateTime) { return $date; } @@ -918,7 +890,7 @@ * @param boolean True to return list of words as array * @param integer Minimum length of tokens * - * @return mixed Normalized string or a list of normalized tokens + * @return mixed Normalized string or a list of normalized tokens */ public static function normalize_string($str, $as_array = false, $minlen = 2) { @@ -970,7 +942,8 @@ * * @param string Haystack * @param string Needle - * @return boolen True if match, False otherwise + * + * @return boolean True if match, False otherwise */ public static function words_match($haystack, $needle) { @@ -1121,25 +1094,35 @@ } /** - * Generate a ramdom string + * Generate a random string * * @param int $length String length - * @param bool $raw Return RAW data instead of hex + * @param bool $raw Return RAW data instead of ascii * * @return string The generated random string */ public static function random_bytes($length, $raw = false) { - $rlen = $raw ? $length : ceil($length / 2); - $random = openssl_random_pseudo_bytes($rlen); + // Use PHP7 true random generator + if (function_exists('random_bytes')) { + // random_bytes() can throw an Error/TypeError/Exception in some cases + try { + $random = random_bytes($length); + } + catch (Throwable $e) {} + } + + if (!$random) { + $random = openssl_random_pseudo_bytes($length); + } if ($raw) { return $random; } - $random = bin2hex($random); + $random = self::bin2ascii($random); - // if the length wasn't even... + // truncate to the specified size... if ($length < strlen($random)) { $random = substr($random, 0, $length); } @@ -1148,6 +1131,50 @@ } /** + * Convert binary data into readable form (containing a-zA-Z0-9 characters) + * + * @param string $input Binary input + * + * @return string Readable output + */ + public static function bin2ascii($input) + { + // Above method returns "hexits". + // Based on bin_to_readable() function in ext/session/session.c. + // Note: removed ",-" characters from hextab + $hextab = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + $nbits = 6; // can be 4, 5 or 6 + $length = strlen($input); + $result = ''; + $char = 0; + $i = 0; + $have = 0; + $mask = (1 << $nbits) - 1; + + while (true) { + if ($have < $nbits) { + if ($i < $length) { + $char |= ord($input[$i++]) << $have; + $have += 8; + } + else if (!$have) { + break; + } + else { + $have = $nbits; + } + } + + // consume nbits + $result .= $hextab[$char & $mask]; + $char >>= $nbits; + $have -= $nbits; + } + + return $result; + } + + /** * Format current date according to specified format. * This method supports microseconds (u). * -- Gitblit v1.9.1