root/modules/branches/2.6/iaxsettings/functions.inc.php

Revision 8275, 12.4 kB (checked in by p_lindheimer, 4 years ago)

fixes #3864, fixes #3865, fixes #3866 - php notices from undefined and other minor declaration probs

  • Property svn:executable set to *
Line 
1 <?php
2 /* $Id:$ */
3
4 // Original Release by Philippe Lindheimer
5 // Copyright Philippe Lindheimer (2009)
6 // Copyright Bandwidth.com (2009)
7 /*
8     This program is free software: you can redistribute it and/or modify
9     it under the terms of the GNU Affero General Public License as
10     published by the Free Software Foundation, either version 3 of the
11     License, or (at your option) any later version.
12
13     This program is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16     GNU Affero General Public License for more details.
17
18     You should have received a copy of the GNU Affero General Public License
19     along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 // Use hookGet_config so that everyone (like core) will have written their
23 // IAX settings and then we can remove any that we are going to override
24 //
25
26 /* Field Values for type field */
27 define('IAX_NORMAL','0');
28 define('IAX_CODEC','1');
29 define('IAX_VIDEO_CODEC','2');
30 define('IAX_CUSTOM','9');
31
32 class iaxsettings_validate {
33   var $errors = array();
34
35   /* checks if value is an integer */
36   function is_int($value, $item, $message, $negative=false) {
37     $value = trim($value);
38     if ($value != '' && $negative) {
39       $tmp_value = substr($value,0,1) == '-' ? substr($value,1) : $value;
40       if (!ctype_digit($tmp_value)) {
41         $this->errors[] = array('id' => $item, 'value' => $value, 'message' => $message);
42       }
43     } elseif (!$negative) {
44       if (!ctype_digit($value) || ($value < 0 )) {
45         $this->errors[] = array('id' => $item, 'value' => $value, 'message' => $message);
46       }
47     }
48     return $value;
49   }
50
51   /* checks if value is valid port between 1024 - 6 65535 */
52   function is_ip_port($value, $item, $message) {
53     $value = trim($value);
54     if ($value != '' && (!ctype_digit($value) || $value < 1024 || $value > 65535)) {
55       $this->errors[] = array('id' => $item, 'value' => $value, 'message' => $message);
56     }
57     return $value;
58   }
59
60   /* checks if value is valid ip format */
61   function is_ip($value, $item, $message) {
62     $value = trim($value);
63     if ($value != '' && !preg_match('|^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$|',$value,$matches)) {
64       $this->errors[] = array('id' => $item, 'value' => $value, 'message' => $message);
65     }
66     return $value;
67   }
68
69   /* checks if value is valid ip netmask format */
70   function is_netmask($value, $item, $message) {
71     $value = trim($value);
72     if ($value != '' && !(preg_match('|^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$|',$value,$matches) || (ctype_digit($value) && $value >= 0 && $value <= 24))) {
73       $this->errors[] = array('id' => $item, 'value' => $value, 'message' => $message);
74     }
75     return $value;
76   }
77
78   /* checks if value is valid alpha numeric format */
79   function is_alphanumeric($value, $item, $message) {
80     $value = trim($value);
81       if ($value != '' && !preg_match("/^\s*([a-zA-Z0-9.&\-@_!<>!\"\']+)\s*$/",$value,$matches)) {
82       $this->errors[] = array('id' => $item, 'value' => $value, 'message' => $message);
83     }
84     return $value;
85   }
86
87   /* trigger a validation error to be appended to this class */
88   function log_error($value, $item, $message) {
89     $this->errors[] = array('id' => $item, 'value' => $value, 'message' => $message);
90     return $value;
91   }
92 }
93
94 function iaxsettings_hookGet_config($engine) {
95   global $core_conf;
96
97   switch($engine) {
98     case "asterisk":
99       if (isset($core_conf) && is_a($core_conf, "core_conf")) {
100         $raw_settings = iaxsettings_get(true);
101
102         /* TODO: This is example concept code
103
104            The only real conflicts are codecs (mainly cause
105            it will look ugly. So we should strip those but
106            leave the rest. If we overrite it, oh well
107
108                  */
109         $idx = 0;
110         foreach ($core_conf->_iax_general as $entry) {
111           switch (strtolower($entry['key'])) {
112             case 'allow':
113             case 'disallow':
114               unset($core_conf->_iax_general[$idx]);
115             break;
116           default:
117             // do nothing
118           }
119           $idx++;
120         }
121
122         foreach ($raw_settings as $var) {
123           switch ($var['type']) {
124             case IAX_NORMAL:
125               $interim_settings[$var['keyword']] = $var['data'];
126             break;
127
128             case IAX_CODEC:
129               $codecs[$var['keyword']] = $var['data'];
130             break;
131
132             case IAX_VIDEO_CODEC:
133               $video_codecs[$var['keyword']] = $var['data'];
134             break;
135
136             case IAX_CUSTOM:
137               $iax_settings[] = array($var['keyword'], $var['data']);
138             break;
139           default:
140             // Error should be above
141           }
142         }
143         unset($raw_settings);
144
145         /* Codecs First */
146         $core_conf->addIaxGeneral('disallow','all');
147         foreach ($codecs as $codec => $enabled) {
148           if ($enabled == '1') {
149             $core_conf->addIaxGeneral('allow',$codec);
150           }
151         }
152         unset($codecs);
153
154         if ($interim_settings['videosupport'] == 'yes') {
155           foreach ($video_codecs as $codec => $enabled) {
156             if ($enabled == '1') {
157               $core_conf->addIaxGeneral('allow',$codec);
158             }
159           }
160         }
161         unset($video_codecs);
162
163         /* next figure out what we need to write out (deal with things like nat combos, etc. */
164
165         $jitterbuffer = $interim_settings['jitterbuffer'];
166         if (is_array($interim_settings)) foreach ($interim_settings as $key => $value) {
167           switch ($key) {
168             case 'videosupport':
169             break;
170
171             case 'maxjitterbuffer':
172             case 'maxjitterinterps':
173             case 'resyncthreshold':
174             case 'forcejitterbuffer':
175               if ($jitterbuffer == 'yes' && $value != '') {
176                 $iax_settings[] = array($key, $value);
177               }
178             break;
179
180             case 'bandwidth':
181               if ($value != 'unset') {
182                 $iax_settings[] = array($key, $value);
183               }
184             break;
185
186             case 'iax_language':
187               if ($value != '') {
188                 $iax_settings[] = array('language', $value);
189               }
190             break;
191
192             default:
193               $iax_settings[] = array($key, $value);
194             }
195           }
196           unset($interim_settings);
197           if (is_array($iax_settings)) foreach ($iax_settings as $entry) {
198             if ($entry[1] != '') {
199               $core_conf->addIaxGeneral($entry[0],$entry[1]);
200             }
201           }
202       }
203     break;
204   }
205
206   return true;
207 }
208
209 function iaxsettings_get($raw=false) {
210
211   $sql = "SELECT `keyword`, `data`, `type`, `seq` FROM `iaxsettings` ORDER BY `type`, `seq`";
212   $raw_settings = sql($sql,"getAll",DB_FETCHMODE_ASSOC);
213
214   /* Just give the SQL table if more convenient (such as in hookGet_config */
215   if ($raw) {
216     return $raw_settings;
217   }
218
219   /* Initialize first, then replace with DB, to make sure we have defaults */
220
221   $iax_settings['codecs']            =  array(
222     'ulaw'     => '1',
223     'alaw'     => '1',
224     'slin'     => '',
225     'g726'     => '',
226     'gsm'      => '1',
227     'g729'     => '',
228     'ilbc'     => '',
229     'g723'     => '',
230     'g726aal2' => '',
231     'adpcm'    => '',
232     'lpc10'    => '',
233     'speex'    => '',
234     'g722'     => '',
235     'jpeg'     => '',
236     'png'      => '',
237     );
238
239   $iax_settings['video_codecs']      = array(
240     'h261'  => '',
241     'h263'  => '',
242     'h263p' => '',
243     'h264'  => '',
244     );
245
246   $iax_settings['codecpriority']     = 'host';
247   $iax_settings['bandwidth']         = 'unset';
248   $iax_settings['videosupport']      = 'no';
249
250   $iax_settings['minregexpire']      = '60';
251   $iax_settings['maxregexpire']      = '3600';
252
253   $iax_settings['jitterbuffer']      = 'no';
254   $iax_settings['forcejitterbuffer'] = 'no';
255   $iax_settings['maxjitterbuffer']   = '200';
256   $iax_settings['resyncthreshold']   = '1000';
257   $iax_settings['maxjitterinterps']  = '10';
258
259   $iax_settings['iax_language']      = '';
260   $iax_settings['bindaddr']          = '';
261   $iax_settings['bindport']          = '';
262   $iax_settings['delayreject']       = 'yes';
263
264   $iax_settings['iax_custom_key_0']  = '';
265   $iax_settings['iax_custom_val_0']  = '';
266
267   foreach ($raw_settings as $var) {
268     switch ($var['type']) {
269       case IAX_NORMAL:
270         $iax_settings[$var['keyword']]                 = $var['data'];
271       break;
272
273       case IAX_CODEC:
274         $iax_settings['codecs'][$var['keyword']]       = $var['data'];
275       break;
276
277       case IAX_VIDEO_CODEC:
278         $iax_settings['video_codecs'][$var['keyword']] = $var['data'];
279       break;
280
281       case IAX_CUSTOM:
282         $iax_settings['iax_custom_key_'.$var['seq']]   = $var['keyword'];
283         $iax_settings['iax_custom_val_'.$var['seq']]   = $var['data'];
284       break;
285
286     default:
287       // Error should be above
288     }
289   }
290   unset($raw_settings);
291
292   return $iax_settings;
293 }
294
295 // Add a iaxsettings
296 function iaxsettings_edit($iax_settings) {
297   global $db;
298   $save_settings = array();
299   $vd = new  iaxsettings_validate();
300
301   $codecs = $iax_settings['codecs'];
302   $video_codecs = $iax_settings['video_codecs'];
303   unset($iax_settings['codecs']);
304   unset($iax_settings['video_codecs']);
305
306
307
308   $integer_msg = _("%s must be a non-negative integer");
309   foreach ($iax_settings as $key => $val) {
310     switch ($key) {
311       case 'bindaddr':
312         $msg = _("Bind Address (bindaddr) must be an IP address.");
313         $save_settings[] = array($key,$db->escapeSimple($vd->is_ip($val,$key,$msg)),'2',IAX_NORMAL);
314       break;
315
316       case 'bindport':
317         $msg = _("Bind Port (bindport) must be between 1024..65535, default 5060");
318         $save_settings[] = array($key,$db->escapeSimple($vd->is_ip_port($val, $key, $msg)),'1',IAX_NORMAL);
319       break;
320
321       case 'minregexpire':
322       case 'maxregexpire':
323         $msg = sprintf($integer_msg,$key);
324         $save_settings[] = array($key,$db->escapeSimple($vd->is_int($val,$key,$msg)),'10',IAX_NORMAL);
325       break;
326
327       case 'iax_language':
328         $msg = ("Language must be alphanumeric and installed");
329         $save_settings[] = array($key,$db->escapeSimple($vd->is_alphanumeric($val,$key,$msg)),'0',IAX_NORMAL);
330       break;
331
332       case 'codecpriority':
333       case 'delayreject':
334       case 'bandwidth':
335         $save_settings[] = array($key,$val,'0',IAX_NORMAL);
336       break;
337
338       case 'jitterbuffer':
339         $save_settings[] = array($key,$val,'4',IAX_NORMAL);
340       break;
341
342       case 'forcejitterbuffer':
343         $save_settings[] = array($key,$val,'5',IAX_NORMAL);
344       break;
345
346       case 'maxjitterbuffer':
347       case 'maxjitterinterps':
348         $msg = sprintf($integer_msg,$key);
349         $save_settings[] = array($key,$db->escapeSimple($vd->is_int($val,$key,$msg)),'5',IAX_NORMAL);
350       break;
351
352       case 'resyncthreshold':
353         $msg = _("resyncthreshold must be a non-negative integer or -1 to disable");
354         $save_settings[] = array($key,$db->escapeSimple($vd->is_int($val,$key,$msg,true)),'5',IAX_NORMAL);
355       break;
356
357       case 'videosupport':
358         $save_settings[] = array($key,$val,'10',IAX_NORMAL);
359       break;
360
361     default:
362       if (substr($key,0,15) == "iax_custom_key_") {
363         $seq = substr($key,15);
364         $save_settings[] = array($db->escapeSimple($val),$db->escapeSimple($iax_settings["iax_custom_val_$seq"]),($seq),IAX_CUSTOM);
365       } else if (substr($key,0,15) == "iax_custom_val_") {
366         // skip it, we will seek it out when we see the iax_custom_key
367       } else {
368         $save_settings[] = array($key,$val,'0',IAX_NORMAL);
369       }
370     }
371   }
372
373   /* if there were any validation errors, we will return them and not proceed with saving */
374   if (count($vd->errors)) {
375     return $vd->errors;
376   } else {
377     $seq = 0;
378     foreach ($codecs as $key => $val) {
379       $save_settings[] = array($db->escapeSimple($key),$db->escapeSimple($val),$seq++,IAX_CODEC);
380     }
381     $seq = 0;
382     foreach ($video_codecs as $key => $val) {
383       $save_settings[] = array($db->escapeSimple($key),$db->escapeSimple($val),$seq++,IAX_VIDEO_CODEC);
384     }
385
386     // TODO: normally don't like doing delete/insert but otherwise we would have do update for each
387     //       individual setting and then an insert if there was nothing to update. So this is cleaner
388     //       this time around.
389       //
390     sql("DELETE FROM `iaxsettings` WHERE 1");
391     $compiled = $db->prepare('INSERT INTO `iaxsettings` (`keyword`, `data`, `seq`, `type`) VALUES (?,?,?,?)');
392     $result = $db->executeMultiple($compiled,$save_settings);
393     if(DB::IsError($result)) {
394       die_freepbx($result->getDebugInfo()."<br><br>".'error adding to iaxsettings table');    }
395     return true;
396   }
397 }
398
399
Note: See TracBrowser for help on using the browser.