Marius Cramer
2015-08-06 37b29231e47a0c4458dc1c15d98588f16f07e1e2
commit | author | age
5de2af 1 <?php
M 2
3 /*
4 Copyright (c) 2010, Till Brehm, projektfarm Gmbh
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without modification,
8 are permitted provided that the following conditions are met:
9
10     * Redistributions of source code must retain the above copyright notice,
11       this list of conditions and the following disclaimer.
12     * Redistributions in binary form must reproduce the above copyright notice,
13       this list of conditions and the following disclaimer in the documentation
14       and/or other materials provided with the distribution.
15     * Neither the name of ISPConfig nor the names of its contributors
16       may be used to endorse or promote products derived from this software without
17       specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 //* The purpose of this library is to provide some general functions.
32 //* This class is loaded automatically by the ispconfig framework.
33
34 class functions {
35     var $idn_converter = null;
b1a6a5 36     var $idn_converter_name = '';
5de2af 37
M 38     public function mail($to, $subject, $text, $from, $filepath = '', $filetype = 'application/pdf', $filename = '', $cc = '', $bcc = '', $from_name = '') {
b1a6a5 39         global $app, $conf;
MC 40
5de2af 41         if($conf['demo_mode'] == true) $app->error("Mail sending disabled in demo mode.");
b1a6a5 42
MC 43         $app->uses('getconf,ispcmail');
5de2af 44         $mail_config = $app->getconf->get_global_config('mail');
M 45         if($mail_config['smtp_enabled'] == 'y') {
46             $mail_config['use_smtp'] = true;
47             $app->ispcmail->setOptions($mail_config);
48         }
49         $app->ispcmail->setSender($from, $from_name);
50         $app->ispcmail->setSubject($subject);
51         $app->ispcmail->setMailText($text);
b1a6a5 52
5de2af 53         if($filepath != '') {
M 54             if(!file_exists($filepath)) $app->error("Mail attachement does not exist ".$filepath);
55             $app->ispcmail->readAttachFile($filepath);
56         }
b1a6a5 57
5de2af 58         if($cc != '') $app->ispcmail->setHeader('Cc', $cc);
M 59         if($bcc != '') $app->ispcmail->setHeader('Bcc', $bcc);
b1a6a5 60
5de2af 61         $app->ispcmail->send($to);
M 62         $app->ispcmail->finish();
b1a6a5 63
5de2af 64         /* left in here just for the case...
M 65         if($filepath != '') {
66             if(!file_exists($filepath)) $app->error("Mail attachement does not exist ".$filepath);
b1a6a5 67
5de2af 68             $content = file_get_contents($filepath);
M 69             $content = chunk_split(base64_encode($content));
70             $uid = strtoupper(md5(uniqid(time())));
71             $subject      = "=?utf-8?B?".base64_encode($subject)."?=";
b1a6a5 72
5de2af 73             if($filename == '') {
M 74                 $path_parts = pathinfo($filepath);
75                 $filename = $path_parts["basename"];
76                 unset($path_parts);
77             }
78
79             $header = "Return-Path: $from\nFrom: $from\nReply-To: $from\n";
80             if($cc != '') $header .= "Cc: $cc\n";
81             if($bcc != '') $header .= "Bcc: $bcc\n";
82             $header .= "MIME-Version: 1.0\n";
83             $header .= "Content-Type: multipart/mixed; boundary=$uid\n";
84
85             $header .= "--$uid\n";
86             $header .= "Content-Type: text/plain;\n\tcharset=\"UTF-8\"\n";
87             $header .= "Content-Transfer-Encoding: 8bit\n\n";
88             $header .= "$text\n";
89
90             $header .= "--$uid\n";
91             $header .= "Content-Type: $filetype; name=\"$filename\"\n";
92
93             $header .= "Content-Transfer-Encoding: base64\n";
94             $header .= "Content-Disposition: attachment; filename=\"$filename\"\n\n";
95             $header .= "$content\n";
96
97             $header .= "--$uid--";
98
99             mail($to, $subject, "", $header);
100         } else {
101             $header = "From: $from\nReply-To: $from\n";
102             if($cc != '') $header .= "Cc: $cc\n";
103             if($bcc != '') $header .= "Bcc: $bcc\n";
104             $header .= "Content-Type: text/plain;\n\tcharset=\"UTF-8\"\n";
105             $header .= "Content-Transfer-Encoding: 8bit\n\n";
106             $subject      = "=?utf-8?B?".base64_encode($subject)."?=";
107             mail($to, $subject, $text, $header);
108         }
109         */
110         return true;
111     }
b1a6a5 112
MC 113     public function array_merge($array1, $array2) {
5de2af 114         $out = $array1;
M 115         foreach($array2 as $key => $val) {
116             $out[$key] = $val;
117         }
118         return $out;
119     }
b1a6a5 120
5de2af 121     public function currency_format($number, $view = '') {
M 122         global $app;
123         if($view != '') $number_format_decimals = (int)$app->lng('number_format_decimals_'.$view);
b1a6a5 124         if(!$number_format_decimals) $number_format_decimals = (int)$app->lng('number_format_decimals');
MC 125
5de2af 126         $number_format_dec_point = $app->lng('number_format_dec_point');
M 127         $number_format_thousands_sep = $app->lng('number_format_thousands_sep');
128         if($number_format_thousands_sep == 'number_format_thousands_sep') $number_format_thousands_sep = '';
129         return number_format((double)$number, $number_format_decimals, $number_format_dec_point, $number_format_thousands_sep);
130     }
b1a6a5 131
5561eb 132     /**
FS 133     * Function to change bytes to kB, MB, GB or TB
134     * @param int $size - size in bytes
135     * @param int precicion - after-comma-numbers (default: 2)
136     * @return string - formated bytes
137     */
138     public function formatBytes($size, $precision = 2) {
139         $base=log($size)/log(1024);
140         $suffixes=array('', ' kB', ' MB', ' GB', ' TB');
141         return round(pow(1024, $base-floor($base)), $precision).$suffixes[floor($base)];
142     }
143
5de2af 144     public function get_ispconfig_url() {
M 145         global $app;
b1a6a5 146
MC 147         $url = (stristr($_SERVER['SERVER_PROTOCOL'], 'HTTPS') || stristr($_SERVER['HTTPS'], 'on'))?'https':'http';
5de2af 148         if($_SERVER['SERVER_NAME'] != '_') {
M 149             $url .= '://'.$_SERVER['SERVER_NAME'];
150             if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
151                 $url .= ':'.$_SERVER['SERVER_PORT'];
152             }
153         } else {
154             $app->uses("getconf");
b1a6a5 155             $server_config = $app->getconf->get_server_config(1, 'server');
5de2af 156             $url .= '://'.$server_config['hostname'];
M 157             if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
158                 $url .= ':'.$_SERVER['SERVER_PORT'];
159             }
160         }
161         return $url;
162     }
b1a6a5 163
MC 164     public function json_encode($data) {
5de2af 165         if(!function_exists('json_encode')){
M 166             if(is_array($data) || is_object($data)){
b1a6a5 167                 $islist = is_array($data) && (empty($data) || array_keys($data) === range(0, count($data)-1));
5de2af 168
M 169                 if($islist){
170                     $json = '[' . implode(',', array_map(array($this, "json_encode"), $data) ) . ']';
171                 } else {
b1a6a5 172                     $items = array();
5de2af 173                     foreach( $data as $key => $value ) {
M 174                         $items[] = $this->json_encode("$key") . ':' . $this->json_encode($value);
175                     }
176                     $json = '{' . implode(',', $items) . '}';
177                 }
178             } elseif(is_string($data)){
b1a6a5 179                 // Escape non-printable or Non-ASCII characters.
MC 180                 // I also put the \\ character first, as suggested in comments on the 'addclashes' page.
5de2af 181                 $string = '"'.addcslashes($data, "\\\"\n\r\t/".chr(8).chr(12)).'"';
M 182                 $json = '';
183                 $len = strlen($string);
b1a6a5 184                 // Convert UTF-8 to Hexadecimal Codepoints.
5de2af 185                 for($i = 0; $i < $len; $i++){
M 186                     $char = $string[$i];
187                     $c1 = ord($char);
188
b1a6a5 189                     // Single byte;
5de2af 190                     if($c1 <128){
M 191                         $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1);
192                         continue;
193                     }
194
b1a6a5 195                     // Double byte
5de2af 196                     $c2 = ord($string[++$i]);
M 197                     if(($c1 & 32) === 0){
198                         $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128);
199                         continue;
200                     }
201
b1a6a5 202                     // Triple
5de2af 203                     $c3 = ord($string[++$i]);
M 204                     if(($c1 & 16) === 0){
205                         $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128));
206                         continue;
207                     }
208
b1a6a5 209                     // Quadruple
5de2af 210                     $c4 = ord($string[++$i]);
M 211                     if(($c1 & 8) === 0){
212                         $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1;
213
214                         $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3);
215                         $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128);
216                         $json .= sprintf("\\u%04x\\u%04x", $w1, $w2);
217                     }
218                 }
219             } else {
b1a6a5 220                 // int, floats, bools, null
5de2af 221                 $json = strtolower(var_export($data, true));
M 222             }
223             return $json;
224         } else {
225             return json_encode($data);
226         }
b1a6a5 227     }
MC 228
5de2af 229     public function suggest_ips($type = 'IPv4'){
M 230         global $app;
b1a6a5 231
5de2af 232         if($type == 'IPv4'){
M 233             $regex = "/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/";
234         } else {
235             // IPv6
236             $regex = "/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i";
237         }
b1a6a5 238
5de2af 239         $ips = array();
cc7a82 240         $results = $app->db->queryAllRecords("SELECT ip_address AS ip FROM server_ip WHERE ip_type = ?", $type);
5de2af 241         if(!empty($results) && is_array($results)){
M 242             foreach($results as $result){
243                 if(preg_match($regex, $result['ip'])) $ips[] = $result['ip'];
244             }
245         }
246         $results = $app->db->queryAllRecords("SELECT ip_address AS ip FROM openvz_ip");
247         if(!empty($results) && is_array($results)){
248             foreach($results as $result){
249                 if(preg_match($regex, $result['ip'])) $ips[] = $result['ip'];
250             }
251         }
252         $results = $app->db->queryAllRecords("SELECT data AS ip FROM dns_rr WHERE type = 'A' OR type = 'AAAA'");
253         if(!empty($results) && is_array($results)){
254             foreach($results as $result){
255                 if(preg_match($regex, $result['ip'])) $ips[] = $result['ip'];
256             }
257         }
258         $results = $app->db->queryAllRecords("SELECT ns AS ip FROM dns_slave");
259         if(!empty($results) && is_array($results)){
260             foreach($results as $result){
261                 if(preg_match($regex, $result['ip'])) $ips[] = $result['ip'];
262             }
263         }
b1a6a5 264
5de2af 265         $results = $app->db->queryAllRecords("SELECT xfer FROM dns_slave WHERE xfer != ''");
M 266         if(!empty($results) && is_array($results)){
267             foreach($results as $result){
268                 $tmp_ips = explode(',', $result['xfer']);
269                 foreach($tmp_ips as $tmp_ip){
270                     $tmp_ip = trim($tmp_ip);
271                     if(preg_match($regex, $tmp_ip)) $ips[] = $tmp_ip;
272                 }
273             }
274         }
275         $results = $app->db->queryAllRecords("SELECT xfer FROM dns_soa WHERE xfer != ''");
276         if(!empty($results) && is_array($results)){
277             foreach($results as $result){
278                 $tmp_ips = explode(',', $result['xfer']);
279                 foreach($tmp_ips as $tmp_ip){
280                     $tmp_ip = trim($tmp_ip);
281                     if(preg_match($regex, $tmp_ip)) $ips[] = $tmp_ip;
282                 }
283             }
284         }
285         $results = $app->db->queryAllRecords("SELECT also_notify FROM dns_soa WHERE also_notify != ''");
286         if(!empty($results) && is_array($results)){
287             foreach($results as $result){
288                 $tmp_ips = explode(',', $result['also_notify']);
289                 foreach($tmp_ips as $tmp_ip){
290                     $tmp_ip = trim($tmp_ip);
291                     if(preg_match($regex, $tmp_ip)) $ips[] = $tmp_ip;
292                 }
293             }
294         }
295         $results = $app->db->queryAllRecords("SELECT remote_ips FROM web_database WHERE remote_ips != ''");
296         if(!empty($results) && is_array($results)){
297             foreach($results as $result){
298                 $tmp_ips = explode(',', $result['remote_ips']);
299                 foreach($tmp_ips as $tmp_ip){
300                     $tmp_ip = trim($tmp_ip);
301                     if(preg_match($regex, $tmp_ip)) $ips[] = $tmp_ip;
302                 }
303             }
304         }
305         $ips = array_unique($ips);
306         sort($ips, SORT_NUMERIC);
307
308         $result_array = array('cheader' => array(), 'cdata' => array());
b1a6a5 309
5de2af 310         if(!empty($ips)){
M 311             $result_array['cheader'] = array('title' => 'IPs',
b1a6a5 312                 'total' => count($ips),
MC 313                 'limit' => count($ips)
314             );
315
5de2af 316             foreach($ips as $ip){
b1a6a5 317                 $result_array['cdata'][] = array( 'title' => $ip,
MC 318                     'description' => $type,
319                     'onclick' => '',
320                     'fill_text' => $ip
321                 );
5de2af 322             }
M 323         }
b1a6a5 324
5de2af 325         return $result_array;
M 326     }
327
b1a6a5 328     public function intval($string, $force_numeric = false) {
MC 329         if(intval($string) == 2147483647 || ($string > 0 && intval($string) < 0)) {
330             if($force_numeric == true) return floatval($string);
331             elseif(preg_match('/^([-]?)[0]*([1-9][0-9]*)([^0-9].*)*$/', $string, $match)) return $match[1].$match[2];
332             else return 0;
333         } else {
334             return intval($string);
335         }
336     }
337
338     /** IDN converter wrapper.
339      * all converter classes should be placed in ISPC_CLASS_PATH.'/idn/'
340      */
341
342
343     private function _idn_encode_decode($domain, $encode = true) {
344         if($domain == '') return '';
345         if(preg_match('/^[0-9\.]+$/', $domain)) return $domain; // may be an ip address - anyway does not need to bee encoded
346
347         // get domain and user part if it is an email
348         $user_part = false;
349         if(strpos($domain, '@') !== false) {
350             $user_part = substr($domain, 0, strrpos($domain, '@'));
351             $domain = substr($domain, strrpos($domain, '@') + 1);
352         }
353
354         if($encode == true) {
355             if(function_exists('idn_to_ascii')) {
e9d5c9 356                 $domain = idn_to_ascii($domain, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46);
b1a6a5 357             } elseif(file_exists(ISPC_CLASS_PATH.'/idn/idna_convert.class.php')) {
MC 358                 /* use idna class:
5de2af 359                  * @author  Matthias Sommerfeld <mso@phlylabs.de>
M 360                  * @copyright 2004-2011 phlyLabs Berlin, http://phlylabs.de
361                  * @version 0.8.0 2011-03-11
362                  */
b1a6a5 363
MC 364                 if(!is_object($this->idn_converter) || $this->idn_converter_name != 'idna_convert.class') {
365                     include_once ISPC_CLASS_PATH.'/idn/idna_convert.class.php';
366                     $this->idn_converter = new idna_convert(array('idn_version' => 2008));
367                     $this->idn_converter_name = 'idna_convert.class';
368                 }
369                 $domain = $this->idn_converter->encode($domain);
370             }
371         } else {
372             if(function_exists('idn_to_utf8')) {
e9d5c9 373                 $domain = idn_to_utf8($domain, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46);
b1a6a5 374             } elseif(file_exists(ISPC_CLASS_PATH.'/idn/idna_convert.class.php')) {
MC 375                 /* use idna class:
5de2af 376                  * @author  Matthias Sommerfeld <mso@phlylabs.de>
M 377                  * @copyright 2004-2011 phlyLabs Berlin, http://phlylabs.de
378                  * @version 0.8.0 2011-03-11
379                  */
b1a6a5 380
MC 381                 if(!is_object($this->idn_converter) || $this->idn_converter_name != 'idna_convert.class') {
382                     include_once ISPC_CLASS_PATH.'/idn/idna_convert.class.php';
383                     $this->idn_converter = new idna_convert(array('idn_version' => 2008));
384                     $this->idn_converter_name = 'idna_convert.class';
385                 }
386                 $domain = $this->idn_converter->decode($domain);
387             }
388         }
389
390         if($user_part !== false) return $user_part . '@' . $domain;
391         else return $domain;
392     }
393
394     public function idn_encode($domain) {
395         $domains = explode("\n", $domain);
396         for($d = 0; $d < count($domains); $d++) {
397             $domains[$d] = $this->_idn_encode_decode($domains[$d], true);
398         }
399         return implode("\n", $domains);
400     }
401
402     public function idn_decode($domain) {
403         $domains = explode("\n", $domain);
404         for($d = 0; $d < count($domains); $d++) {
405             $domains[$d] = $this->_idn_encode_decode($domains[$d], false);
406         }
407         return implode("\n", $domains);
408     }
409
5de2af 410 }
M 411
b1a6a5 412 ?>