| | |
| | | |
| | | $error = false; |
| | | |
| | | $to = empty($to) ? $to = strtoupper(RCMAIL_CHARSET) : rcube_parse_charset($to); |
| | | $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : rcube_parse_charset($to); |
| | | $from = rcube_parse_charset($from); |
| | | |
| | | if ($from == $to || empty($str) || empty($from)) |
| | |
| | | // convert charset using iconv module |
| | | if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7') { |
| | | if ($iconv_options === null) { |
| | | // transliterate characters not available in output charset |
| | | $iconv_options = '//TRANSLIT'; |
| | | // ignore characters not available in output charset |
| | | $iconv_options = '//IGNORE'; |
| | | if (iconv('', $iconv_options, '') === false) { |
| | | // iconv implementation does not support options |
| | | $iconv_options = ''; |
| | | } |
| | | } |
| | | |
| | | // throw an exception if iconv reports an illegal character in input |
| | | // it means that input string has been truncated |
| | | set_error_handler('rcube_error_handler', E_NOTICE); |
| | |
| | | $charset = preg_replace(array( |
| | | '/^[^0-9A-Z]+/', // e.g. _ISO-8859-JP$SIO |
| | | '/\$.*$/', // e.g. _ISO-8859-JP$SIO |
| | | '/UNICODE-1-1-/', // RFC1642 |
| | | '/UNICODE-1-1-*/', // RFC1641/1642 |
| | | ), '', $charset); |
| | | |
| | | # Aliases: some of them from HTML5 spec. |
| | |
| | | 'ISO88599' => 'WINDOWS-1254', |
| | | 'ISO885911' => 'WINDOWS-874', |
| | | 'MACROMAN' => 'MACINTOSH', |
| | | '238' => 'WINDOWS-1250', |
| | | '178' => 'WINDOWS-1256', |
| | | '177' => 'WINDOWS-1255', |
| | | '204' => 'WINDOWS-1251', |
| | | '161' => 'WINDOWS-1253', |
| | | '222' => 'WINDOWS-874', |
| | | '134' => 'GBK', |
| | | '238' => 'WINDOWS-1250', |
| | | '128' => 'SHIFT-JIS' |
| | | ); |
| | | |
| | | // allow a-z and 0-9 only and remove X- prefix (e.g. X-ROMAN8 => ROMAN8) |
| | | $str = preg_replace(array('/[^a-z0-9]/i', '/^x+/i'), '', $charset); |
| | | $str = preg_replace(array('/[^A-Z0-9]/', '/^X+/'), '', $charset); |
| | | |
| | | if (isset($aliases[$str])) |
| | | return $aliases[$str]; |
| | | |
| | | if (preg_match('/UTF(7|8|16|32)(BE|LE)*/', $str, $m)) |
| | | if (preg_match('/U[A-Z][A-Z](7|8|16|32)(BE|LE)*/', $str, $m)) |
| | | return 'UTF-' . $m[1] . $m[2]; |
| | | |
| | | if (preg_match('/ISO8859([0-9]{0,2})/', $str, $m)) { |
| | |
| | | # some clients sends windows-1252 text as latin1, |
| | | # it is safe to use windows-1252 for all latin1 |
| | | return $iso == 'ISO-8859-1' ? 'WINDOWS-1252' : $iso; |
| | | } |
| | | |
| | | // handle broken charset names e.g. WINDOWS-1250HTTP-EQUIVCONTENT-TYPE |
| | | if (preg_match('/WINDOWS([0-9]+)/', $str, $m)) { |
| | | return 'WINDOWS-' . $m[1]; |
| | | } |
| | | |
| | | return $charset; |
| | |
| | | */ |
| | | function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL) |
| | | { |
| | | global $OUTPUT; |
| | | $value = NULL; |
| | | |
| | | if ($source==RCUBE_INPUT_GET && isset($_GET[$fname])) |
| | |
| | | $value = $_COOKIE[$fname]; |
| | | } |
| | | |
| | | return parse_input_value($value, $allow_html, $charset); |
| | | } |
| | | |
| | | /** |
| | | * Parse/validate input value. See 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 |
| | | * @return string Parsed value |
| | | */ |
| | | function parse_input_value($value, $allow_html=FALSE, $charset=NULL) |
| | | { |
| | | global $OUTPUT; |
| | | |
| | | if (empty($value)) |
| | | return $value; |
| | | |
| | | if (is_array($value)) { |
| | | foreach ($value as $idx => $val) |
| | | $value[$idx] = parse_input_value($val, $allow_html, $charset); |
| | | return $value; |
| | | } |
| | | |
| | | // strip single quotes if magic_quotes_sybase is enabled |
| | | if (ini_get('magic_quotes_sybase')) |
| | |
| | | $value = strip_tags($value); |
| | | |
| | | // convert to internal charset |
| | | if (is_object($OUTPUT)) |
| | | if (is_object($OUTPUT) && $charset) |
| | | return rcube_charset_convert($value, $OUTPUT->get_charset(), $charset); |
| | | else |
| | | return $value; |
| | |
| | | foreach ($table_data as $row_data) |
| | | { |
| | | $zebra_class = $c % 2 ? 'even' : 'odd'; |
| | | if (!empty($row_data['class'])) |
| | | $zebra_class .= ' '.$row_data['class']; |
| | | |
| | | $table->add_row(array('id' => 'rcmrow' . $row_data[$id_col], 'class' => $zebra_class)); |
| | | |
| | | // format each col |
| | |
| | | return true; |
| | | if ($port && $_SERVER['SERVER_PORT'] == $port) |
| | | return true; |
| | | if ($use_https && $RCMAIL->config->get('use_https')) |
| | | if ($use_https && isset($RCMAIL) && $RCMAIL->config->get('use_https')) |
| | | return true; |
| | | |
| | | return false; |
| | | } |
| | | |
| | | // for backward compatibility |
| | | function rcube_sess_unset($var_name=null) |
| | | { |
| | | global $RCMAIL; |
| | | |
| | | $RCMAIL->session->remove($var_name); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * E-mail address validation |
| | | */ |
| | | function check_email($email) |
| | | function check_email($email, $dns_check=true) |
| | | { |
| | | // Check for invalid characters |
| | | if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $email)) |
| | | return false; |
| | | |
| | | // Check that there's one @ symbol, and that the lengths are right |
| | | if (!preg_match('/^([^@]{1,64})@([^@]{1,255})$/', $email, $email_array)) |
| | | // Check for length limit specified by RFC 5321 (#1486453) |
| | | if (strlen($email) > 254) |
| | | return false; |
| | | |
| | | // Check local part |
| | | $local_array = explode('.', $email_array[1]); |
| | | foreach ($local_array as $local_part) |
| | | if (!preg_match('/^(([A-Za-z0-9!#$%&\'*+\/=?^_`{|}~-]+)|("[^"]+"))$/', $local_part)) |
| | | return false; |
| | | $email_array = explode('@', $email); |
| | | |
| | | // Check that there's one @ symbol |
| | | if (count($email_array) < 2) |
| | | return false; |
| | | |
| | | $domain_part = array_pop($email_array); |
| | | $local_part = implode('@', $email_array); |
| | | |
| | | // from PEAR::Validate |
| | | $regexp = '&^(?: |
| | | ("\s*(?:[^"\f\n\r\t\v\b\s]+\s*)+")| #1 quoted name |
| | | ([-\w!\#\$%\&\'*+~/^`|{}]+(?:\.[-\w!\#\$%\&\'*+~/^`|{}]+)*)) #2 OR dot-atom |
| | | $&xi'; |
| | | |
| | | if (!preg_match($regexp, $local_part)) |
| | | return false; |
| | | |
| | | // Check domain part |
| | | if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/', $email_array[2]) |
| | | || preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/', $email_array[2])) |
| | | return true; // If an IP address |
| | | if (preg_match('/^\[*(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]*$/', $domain_part)) |
| | | return true; // IP address |
| | | else { |
| | | // If not an IP address |
| | | $domain_array = explode('.', $email_array[2]); |
| | | $domain_array = explode('.', $domain_part); |
| | | if (sizeof($domain_array) < 2) |
| | | return false; // Not enough parts to be a valid domain |
| | | |
| | | foreach ($domain_array as $domain_part) |
| | | if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $domain_part)) |
| | | foreach ($domain_array as $part) |
| | | if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]))$/', $part)) |
| | | return false; |
| | | |
| | | if (!rcmail::get_instance()->config->get('email_dns_check')) |
| | | if (!$dns_check || !rcmail::get_instance()->config->get('email_dns_check')) |
| | | return true; |
| | | |
| | | if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && version_compare(PHP_VERSION, '5.3.0', '<')) |
| | | return true; |
| | | |
| | | // find MX record(s) |
| | | if (getmxrr($email_array[2], $mx_records)) |
| | | if (getmxrr($domain_part, $mx_records)) |
| | | return true; |
| | | |
| | | // find any DNS record |
| | | if (checkdnsrr($email_array[2], 'ANY')) |
| | | if (checkdnsrr($domain_part, 'ANY')) |
| | | return true; |
| | | } |
| | | |