From e1ceb050e19c7574bca146a8da7047ee4ff456b5 Mon Sep 17 00:00:00 2001 From: Marius Burkard <m.burkard@pixcept.de> Date: Sun, 10 Jul 2016 05:02:35 -0400 Subject: [PATCH] Merge branch 'stable-3.1' --- interface/lib/classes/functions.inc.php | 387 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 320 insertions(+), 67 deletions(-) diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php index 0f29003..03bd11d 100644 --- a/interface/lib/classes/functions.inc.php +++ b/interface/lib/classes/functions.inc.php @@ -32,129 +32,137 @@ //* This class is loaded automatically by the ispconfig framework. class functions { - + var $idn_converter = null; + var $idn_converter_name = ''; - public function mail($to, $subject, $text, $from, $filepath = '', $filetype = 'application/pdf', $filename = '') { - global $app,$conf; - + public function mail($to, $subject, $text, $from, $filepath = '', $filetype = 'application/pdf', $filename = '', $cc = '', $bcc = '', $from_name = '') { + global $app, $conf; + if($conf['demo_mode'] == true) $app->error("Mail sending disabled in demo mode."); - + + $app->uses('getconf,ispcmail'); + $mail_config = $app->getconf->get_global_config('mail'); + if($mail_config['smtp_enabled'] == 'y') { + $mail_config['use_smtp'] = true; + $app->ispcmail->setOptions($mail_config); + } + $app->ispcmail->setSender($from, $from_name); + $app->ispcmail->setSubject($subject); + $app->ispcmail->setMailText($text); + if($filepath != '') { if(!file_exists($filepath)) $app->error("Mail attachement does not exist ".$filepath); - - $content = file_get_contents($filepath); - $content = chunk_split(base64_encode($content)); - $uid = strtoupper(md5(uniqid(time()))); - $subject = "=?utf-8?B?".base64_encode($subject)."?="; - - if($filename == '') { - $path_parts = pathinfo($filepath); - $filename = $path_parts["basename"]; - unset($path_parts); - } - - $header = "Return-Path: $form\nFrom: $from\nReply-To: $from\n"; - $header .= "MIME-Version: 1.0\n"; - $header .= "Content-Type: multipart/mixed; boundary=$uid\n"; - - $header .= "--$uid\n"; - $header .= "Content-Type: text/plain;\n\tcharset=\"UTF-8\"\n"; - $header .= "Content-Transfer-Encoding: 8bit\n\n"; - $header .= "$text\n"; - - $header .= "--$uid\n"; - $header .= "Content-Type: $filetype; name=\"$filename\"\n"; - - $header .= "Content-Transfer-Encoding: base64\n"; - $header .= "Content-Disposition: attachment; filename=\"$filename\"\n\n"; - $header .= "$content\n"; - - $header .= "--$uid--"; - - mail($to, $subject, "", $header); - } else { - $header = "From: $from\nReply-To: $from\n"; - $header .= "Content-Type: text/plain;\n\tcharset=\"UTF-8\"\n"; - $header .= "Content-Transfer-Encoding: 8bit\n\n"; - $subject = "=?utf-8?B?".base64_encode($subject)."?="; - mail($to, $subject, $text, $header); + $app->ispcmail->readAttachFile($filepath); } + + if($cc != '') $app->ispcmail->setHeader('Cc', $cc); + if($bcc != '') $app->ispcmail->setHeader('Bcc', $bcc); + + $app->ispcmail->send($to); + $app->ispcmail->finish(); return true; } - - public function array_merge($array1,$array2) { + + public function array_merge($array1, $array2) { $out = $array1; foreach($array2 as $key => $val) { $out[$key] = $val; } return $out; } - - public function currency_format($number) { + + public function currency_format($number, $view = '') { global $app; - $number_format_decimals = (int)$app->lng('number_format_decimals'); + if($view != '') $number_format_decimals = (int)$app->lng('number_format_decimals_'.$view); + if(!$number_format_decimals) $number_format_decimals = (int)$app->lng('number_format_decimals'); + $number_format_dec_point = $app->lng('number_format_dec_point'); $number_format_thousands_sep = $app->lng('number_format_thousands_sep'); if($number_format_thousands_sep == 'number_format_thousands_sep') $number_format_thousands_sep = ''; return number_format((double)$number, $number_format_decimals, $number_format_dec_point, $number_format_thousands_sep); } - + + //* convert currency formatted number back to floating number + public function currency_unformat($number) { + global $app; + + $number_format_dec_point = $app->lng('number_format_dec_point'); + $number_format_thousands_sep = $app->lng('number_format_thousands_sep'); + if($number_format_thousands_sep == 'number_format_thousands_sep') $number_format_thousands_sep = ''; + + if($number_format_thousands_sep != '') $number = str_replace($number_format_thousands_sep, '', $number); + if($number_format_dec_point != '.' && $number_format_dec_point != '') $number = str_replace($number_format_dec_point, '.', $number); + + return (double)$number; + } + public function get_ispconfig_url() { - $url = (stristr($_SERVER['SERVER_PROTOCOL'],'HTTPS') || stristr($_SERVER['HTTPS'],'on'))?'https':'http'; - $url .= '://'.$_SERVER['SERVER_NAME']; - if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) { - $url .= ':'.$_SERVER['SERVER_PORT']; + global $app; + + $url = (stristr($_SERVER['SERVER_PROTOCOL'], 'HTTPS') || stristr($_SERVER['HTTPS'], 'on'))?'https':'http'; + if($_SERVER['SERVER_NAME'] != '_') { + $url .= '://'.$_SERVER['SERVER_NAME']; + if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) { + $url .= ':'.$_SERVER['SERVER_PORT']; + } + } else { + $app->uses("getconf"); + $server_config = $app->getconf->get_server_config(1, 'server'); + $url .= '://'.$server_config['hostname']; + if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) { + $url .= ':'.$_SERVER['SERVER_PORT']; + } } return $url; } - - function json_encode($data) { + + public function json_encode($data) { if(!function_exists('json_encode')){ if(is_array($data) || is_object($data)){ - $islist = is_array($data) && (empty($data) || array_keys($data) === range(0,count($data)-1)); + $islist = is_array($data) && (empty($data) || array_keys($data) === range(0, count($data)-1)); if($islist){ $json = '[' . implode(',', array_map(array($this, "json_encode"), $data) ) . ']'; } else { - $items = Array(); + $items = array(); foreach( $data as $key => $value ) { $items[] = $this->json_encode("$key") . ':' . $this->json_encode($value); } $json = '{' . implode(',', $items) . '}'; } } elseif(is_string($data)){ - # Escape non-printable or Non-ASCII characters. - # I also put the \\ character first, as suggested in comments on the 'addclashes' page. + // Escape non-printable or Non-ASCII characters. + // I also put the \\ character first, as suggested in comments on the 'addclashes' page. $string = '"'.addcslashes($data, "\\\"\n\r\t/".chr(8).chr(12)).'"'; $json = ''; $len = strlen($string); - # Convert UTF-8 to Hexadecimal Codepoints. + // Convert UTF-8 to Hexadecimal Codepoints. for($i = 0; $i < $len; $i++){ $char = $string[$i]; $c1 = ord($char); - # Single byte; + // Single byte; if($c1 <128){ $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1); continue; } - # Double byte + // Double byte $c2 = ord($string[++$i]); if(($c1 & 32) === 0){ $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128); continue; } - # Triple + // Triple $c3 = ord($string[++$i]); if(($c1 & 16) === 0){ $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128)); continue; } - # Quadruple + // Quadruple $c4 = ord($string[++$i]); if(($c1 & 8) === 0){ $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1; @@ -165,17 +173,262 @@ } } } else { - # int, floats, bools, null + // int, floats, bools, null $json = strtolower(var_export($data, true)); } return $json; } else { return json_encode($data); } - } + } - + public function suggest_ips($type = 'IPv4'){ + global $app; + + if($type == 'IPv4'){ +// $regex = "/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/"; + $regex = "/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"; + } else { + // IPv6 + $regex = "/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/"; + } + + $server_by_id = array(); + $server_by_ip = array(); + $servers = $app->db->queryAllRecords("SELECT * FROM server"); + if(is_array($servers) && !empty($servers)){ + foreach($servers as $server){ + $server_by_id[$server['server_id']] = $server['server_name']; + } + } + + $ips = array(); + $results = $app->db->queryAllRecords("SELECT ip_address AS ip, server_id FROM server_ip WHERE ip_type = ?", $type); + if(!empty($results) && is_array($results)){ + foreach($results as $result){ + if(preg_match($regex, $result['ip'])){ + $ips[] = $result['ip']; + $server_by_ip[$result['ip']] = $server_by_id[$result['server_id']]; + } + } + } + $results = $app->db->queryAllRecords("SELECT ip_address AS ip FROM openvz_ip"); + if(!empty($results) && is_array($results)){ + foreach($results as $result){ + if(preg_match($regex, $result['ip'])) $ips[] = $result['ip']; + } + } + $results = $app->db->queryAllRecords("SELECT data AS ip FROM dns_rr WHERE type = 'A' OR type = 'AAAA'"); + if(!empty($results) && is_array($results)){ + foreach($results as $result){ + if(preg_match($regex, $result['ip'])) $ips[] = $result['ip']; + } + } + $results = $app->db->queryAllRecords("SELECT ns AS ip FROM dns_slave"); + if(!empty($results) && is_array($results)){ + foreach($results as $result){ + if(preg_match($regex, $result['ip'])) $ips[] = $result['ip']; + } + } + $results = $app->db->queryAllRecords("SELECT remote_ips FROM web_database WHERE remote_ips != ''"); + if(!empty($results) && is_array($results)){ + foreach($results as $result){ + $tmp_ips = explode(',', $result['remote_ips']); + foreach($tmp_ips as $tmp_ip){ + $tmp_ip = trim($tmp_ip); + if(preg_match($regex, $tmp_ip)) $ips[] = $tmp_ip; + } + } + } + $ips = array_unique($ips); + sort($ips, SORT_NUMERIC); + + $result_array = array('cheader' => array(), 'cdata' => array()); + + if(!empty($ips)){ + $result_array['cheader'] = array('title' => 'IPs', + 'total' => count($ips), + 'limit' => count($ips) + ); + + foreach($ips as $ip){ + $result_array['cdata'][] = array( 'title' => $ip, + 'description' => $type.($server_by_ip[$ip] != ''? ' > '.$server_by_ip[$ip] : ''), + 'onclick' => '', + 'fill_text' => $ip + ); + } + } + + return $result_array; + } + + public function intval($string, $force_numeric = false) { + if(intval($string) == 2147483647 || ($string > 0 && intval($string) < 0)) { + if($force_numeric == true) return floatval($string); + elseif(preg_match('/^([-]?)[0]*([1-9][0-9]*)([^0-9].*)*$/', $string, $match)) return $match[1].$match[2]; + else return 0; + } else { + return intval($string); + } + } + + /** + * Function to change bytes to kB, MB, GB or TB + * @param int $size - size in bytes + * @param int precicion - after-comma-numbers (default: 2) + * @return string - formated bytes + */ + public function formatBytes($size, $precision = 2) { + $base=log($size)/log(1024); + $suffixes=array('', ' kB', ' MB', ' GB', ' TB'); + return round(pow(1024, $base-floor($base)), $precision).$suffixes[floor($base)]; + } + + /** IDN converter wrapper. + * all converter classes should be placed in ISPC_CLASS_PATH.'/idn/' + */ + private function _idn_encode_decode($domain, $encode = true) { + if($domain == '') return ''; + if(preg_match('/^[0-9\.]+$/', $domain)) return $domain; // may be an ip address - anyway does not need to bee encoded + + // get domain and user part if it is an email + $user_part = false; + if(strpos($domain, '@') !== false) { + $user_part = substr($domain, 0, strrpos($domain, '@')); + $domain = substr($domain, strrpos($domain, '@') + 1); + } + + if($encode == true) { + if(function_exists('idn_to_ascii')) { + $domain = idn_to_ascii($domain, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46); + } elseif(file_exists(ISPC_CLASS_PATH.'/idn/idna_convert.class.php')) { + /* use idna class: + * @author Matthias Sommerfeld <mso@phlylabs.de> + * @copyright 2004-2011 phlyLabs Berlin, http://phlylabs.de + * @version 0.8.0 2011-03-11 + */ + + if(!is_object($this->idn_converter) || $this->idn_converter_name != 'idna_convert.class') { + include_once ISPC_CLASS_PATH.'/idn/idna_convert.class.php'; + $this->idn_converter = new idna_convert(array('idn_version' => 2008)); + $this->idn_converter_name = 'idna_convert.class'; + } + $domain = $this->idn_converter->encode($domain); + } + } else { + if(function_exists('idn_to_utf8')) { + $domain = idn_to_utf8($domain, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46); + } elseif(file_exists(ISPC_CLASS_PATH.'/idn/idna_convert.class.php')) { + /* use idna class: + * @author Matthias Sommerfeld <mso@phlylabs.de> + * @copyright 2004-2011 phlyLabs Berlin, http://phlylabs.de + * @version 0.8.0 2011-03-11 + */ + + if(!is_object($this->idn_converter) || $this->idn_converter_name != 'idna_convert.class') { + include_once ISPC_CLASS_PATH.'/idn/idna_convert.class.php'; + $this->idn_converter = new idna_convert(array('idn_version' => 2008)); + $this->idn_converter_name = 'idna_convert.class'; + } + $domain = $this->idn_converter->decode($domain); + } + } + + if($user_part !== false) return $user_part . '@' . $domain; + else return $domain; + } + + public function idn_encode($domain) { + $domains = explode("\n", $domain); + for($d = 0; $d < count($domains); $d++) { + $domains[$d] = $this->_idn_encode_decode($domains[$d], true); + } + return implode("\n", $domains); + } + + public function idn_decode($domain) { + $domains = explode("\n", $domain); + for($d = 0; $d < count($domains); $d++) { + $domains[$d] = $this->_idn_encode_decode($domains[$d], false); + } + return implode("\n", $domains); + } + + public function is_allowed_user($username, $restrict_names = false) { + global $app; + + $name_blacklist = array('root','ispconfig','vmail','getmail'); + if(in_array($username,$name_blacklist)) return false; + + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $username) == false) return false; + + if($restrict_names == true && preg_match('/^web\d+$/', $username) == false) return false; + + return true; + } + + public function is_allowed_group($groupname, $restrict_names = false) { + global $app; + + $name_blacklist = array('root','ispconfig','vmail','getmail'); + if(in_array($groupname,$name_blacklist)) return false; + + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $groupname) == false) return false; + + if($restrict_names == true && preg_match('/^client\d+$/', $groupname) == false) return false; + + return true; + } + + public function getimagesizefromstring($string){ + if (!function_exists('getimagesizefromstring')) { + $uri = 'data://application/octet-stream;base64,' . base64_encode($string); + return getimagesize($uri); + } else { + return getimagesizefromstring($string); + } + } + + public function password($minLength = 10, $special = false){ + global $app; + + $iteration = 0; + $password = ""; + $maxLength = $minLength + 5; + $length = $this->getRandomInt($minLength, $maxLength); + + while($iteration < $length){ + $randomNumber = (floor(((mt_rand() / mt_getrandmax()) * 100)) % 94) + 33; + if(!$special){ + if (($randomNumber >=33) && ($randomNumber <=47)) { continue; } + if (($randomNumber >=58) && ($randomNumber <=64)) { continue; } + if (($randomNumber >=91) && ($randomNumber <=96)) { continue; } + if (($randomNumber >=123) && ($randomNumber <=126)) { continue; } + } + $iteration++; + $password .= chr($randomNumber); + } + $app->uses('validate_password'); + if($app->validate_password->password_check('', $password, '') !== false) $password = $this->password($minLength, $special); + return $password; + } + + public function getRandomInt($min, $max){ + return floor((mt_rand() / mt_getrandmax()) * ($max - $min + 1)) + $min; + } + + public function generate_customer_no(){ + global $app; + // generate customer no. + $customer_no = mt_rand(100000, 999999); + while($app->db->queryOneRecord("SELECT client_id FROM client WHERE customer_no = ?", $customer_no)) { + $customer_no = mt_rand(100000, 999999); + } + + return $customer_no; + } } -?> \ No newline at end of file +?> -- Gitblit v1.9.1