ba00dbf23821050911858ca373af9de98e0efe5a
1 <?php
3 class phoneAccount extends plugin
4 {
5 /* Definitions */
6 var $plHeadline= "Phone";
7 var $plDescription= "This does something";
8 var $has_mailAccount= FALSE;
10 /* Attributes */
11 var $telephoneNumber = array();
12 var $goFonHardware = "automatic";
13 var $goFonFormat = "wav";
14 var $goFonPIN = "";
15 var $goFonVoicemailPIN = "";
16 var $goFonDeliveryMode = "[]";
17 var $phoneNumbers = array();
18 var $mail = "";
19 var $hardware_list = array();
20 var $used_hardware = array();
21 var $goFonMacro = "";
22 var $macro = 0; // Selected Macroi
23 var $lastmacro = "";
24 var $macros = array(); // List of macros for smarty select box
25 var $macroarray = array(); // All needed macro informations
26 var $macrostillavailable = false;
27 var $generate_error = "";
28 var $a_old_telenums = array();
29 var $goFonPINVoice = "";
30 var $goFonHomeServer = "0"; // Contains the dn of the server that manage this account
31 var $init_HomeServer = "0"; // Contains the dn of the server that manage this account
32 var $goFonHomeServers = array(); // Contains all available server configurations
34 /* attribute list for save action */
35 var $CopyPasteVars = array("phoneNumbers","macroarray","macrostillavailable"/*"phoneNumbers" -Reset- */,
36 "hardware_list","used_hardware");
38 var $attributes = array("goFonDeliveryMode", "goFonFormat","uid","cn","goFonHomeServer",
39 "goFonHardware","goFonPIN","goFonVoicemailPIN","telephoneNumber", "goFonMacro","macro");
40 var $objectclasses= array("goFonAccount");
42 var $uid;
44 function phoneAccount ($config, $dn= NULL, $parent= NULL)
45 {
46 plugin::plugin ($config, $dn, $parent);
48 /* Assemble phone numbers */
49 if (isset($this->attrs['telephoneNumber'])){
50 for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){
51 $number= $this->attrs['telephoneNumber'][$i];
52 $this->phoneNumbers[$number]= $number;
53 }
54 }
56 /* Set up has_mailAccount */
57 if (isset($this->attrs['objectClass'])){
58 if (in_array("gosaMailAccount", $this->attrs['objectClass'])){
59 $this->has_mailAccount= TRUE;
60 }
61 }
63 /* Set uid */
64 if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
65 $this->uid = $this->parent->by_object['user']->uid;
66 }
67 if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
68 $this->cn = $this->parent->by_object['user']->cn;
69 }
71 /* Check server configurations
72 * Load all server configuration in $this->goFonHomeServers if available
73 * and first server as default if necessary.
74 * Check if connection is successfull for the selected server $this->goFonHomeServer
75 */
77 /* Set available server */
78 if(isset($_SESSION['config']->data['SERVERS']['FON'])){
79 $this->goFonHomeServers = $_SESSION['config']->data['SERVERS']['FON'];
80 }
82 $a_SETUP= array();
83 if($this->is_account &&
84 array_key_exists('config',$_SESSION) &&
85 array_key_exists('SERVERS',$_SESSION['config']->data) &&
86 array_key_exists('FON',$_SESSION['config']->data['SERVERS']) &&
87 is_callable("mysql_connect")
88 ) {
90 /* Servers defined? Watch here... */
91 if (count($this->goFonHomeServers)){
93 /* Set default server */
94 if(empty($this->goFonHomeServer) || $this->goFonHomeServer == "0"){
95 $this->goFonHomeServer= $this->goFonHomeServers[0]['DN'];
96 }
98 /* Remember inital home server, to be able to remove old entries */
99 $this->init_HomeServer = $this->goFonHomeServer;
101 /* Get config */
102 if(!isset($this->goFonHomeServers[$this->goFonHomeServer])){
103 print_red(sprintf(_("The specified goFonHomeServer '%s' is not available in GOsa server configuration. Saving this account will create a new entry on the server '%s'. Use cancel if you do not want to create a new entry ignoring old accounts."),$this->goFonHomeServer, $this->goFonHomeServers[0]['DN']));
105 $this->goFonHomeServer = $this->goFonHomeServers[0]['DN'];
106 $this->init_HomeServer = $this->goFonHomeServers[0]['DN'];
107 }
108 $cur_cfg = $this->goFonHomeServers[$this->goFonHomeServer];
110 $r_con = @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
111 if(!$r_con){
112 # print_red( sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
113 # $cur_cfg['SERVER'],$cur_cfg['LOGIN']));
114 gosa_log(mysql_error());
115 }
116 $db = @mysql_select_db($cur_cfg['DB'],$r_con);
117 if(!$db){
118 # print_red(sprintf(_("Can't select database %s on %s."),$cur_cfg['DB'],$cur_cfg['SERVER']));
119 gosa_log(mysql_error());
120 }
122 $first = false;
123 foreach($this->phoneNumbers as $key => $val){
124 if(!$first){
125 $first = $key;
126 }
127 }
128 }
129 }
131 /* Get available phone hardware
132 * Search for all available phone hardware
133 */
134 $ldap= $this->config->get_ldap_link();
135 $ldap->cd($this->config->current['BASE']);
136 $ldap->search("(objectClass=goFonHardware)", array('cn', 'description'));
137 while ($attrs= $ldap->fetch()){
138 $cn= $attrs['cn'][0];
139 if (isset($attrs['description'])){
140 $description= " - ".$attrs['description'][0];
141 } else {
142 $description= "";
143 }
144 $this->hardware_list[$cn]= "$cn$description";
145 }
148 /* Get available Macros
149 * Search for all Marcos that are visible and create
150 * an array with name and parameters
151 */
152 $ldap->search("(&(objectClass=goFonMacro)(goFonMacroVisible=1))", array("*"));
154 /* Add none for no macro*/
155 $this->macros['none']=_("no macro");
156 $this->macro ="none";
158 /* Fetch all Macros*/
159 while ($attrs= $ldap->fetch()){
161 /* unset Count, we don't need that here */
162 unset($attrs['displayName']['count']);
164 /* Parse macro data, unset count for parameterarrays */
165 if (isset($attrs['goFonMacroParameter']['count'])){
166 unset($attrs['goFonMacroParameter']['count']);
167 }
169 /* fill Selectfield variable with Macros */
170 if(isset($attrs['displayName'][0])){
171 $this->macros[$attrs['dn']] = $attrs['displayName'][0]." (".$attrs['cn'][0].")";
172 }else{
173 $this->macros[$attrs['dn']] = _("undefined");
174 }
176 /* Go through available parameters and parse all attributes, like parametername, type, default ...*/
177 if((isset($attrs['goFonMacroParameter']))&&(is_array($attrs['goFonMacroParameter']))){
179 foreach($attrs['goFonMacroParameter'] as $pkey=>$pval){
180 /* Split Data in readable values, by delimiter ! */
181 $data = split("!",$attrs['goFonMacroParameter'][$pkey]);
183 /* Set all attrs */
184 $id = $data[0];
185 $this->macroarray[$attrs['dn']][$id]['var'] ="var".$id;
186 $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3];
187 $this->macroarray[$attrs['dn']][$id]['id'] =$id;
188 $this->macroarray[$attrs['dn']][$id]['name'] =$data[1];
189 $this->macroarray[$attrs['dn']][$id]['type'] =$data[2];
190 $this->macroarray[$attrs['dn']][$id]['default']=$data[3];
191 if($data[2] == "bool"){
192 $this->macroarray[$attrs['dn']][$id]['choosen']=$data[3];
193 }
194 }//foreach
195 }//is_array
196 }//while
199 /* Parse used Macro
200 * If we have a macro selected, parse it and set values
201 * in $this->macroarray[$this->macro].
202 */
203 $tmp = split("!",$this->goFonMacro);
204 if(is_array($tmp)){
206 /* First value is the macroname */
207 $this->macro = $tmp[0];
209 /* Macroname saved, delete that index */
210 unset($tmp[0]);
212 /* Check if makro has been removed */
213 if(!isset($this->macros[$this->macro])){
214 $this->macrostillavailable = false;
215 }else{
216 $this->macrostillavailable = true;
217 }
219 /* for each parametervalues ( parameterID#value like 25#twentyfive) */
220 foreach($tmp as $var){
222 /* Split this, so we have $varar[0] = parameterID $varar[1] = SelectedValue */
223 $varar = split("#",$var);
225 /* Only insert if the parameter still exists */
226 if(isset($this->macroarray[$this->macro][$varar[0]])){
227 /* Assign value */
228 $this->macroarray[$this->macro][$varar[0]]['choosen']=$varar[1];
229 }
230 }
231 }
234 /* Colorize phones
235 * Used phones will be colored in grey,
236 * so we must detect which phones are currently in use.
237 */
238 $ldap->cd($this->config->current['BASE']);
239 foreach ($this->hardware_list as $cn => $desc){
240 $ldap->search("(goFonHardware=$cn)", array('cn'));
241 if ($ldap->count() > 0){
242 $ldap->fetch();
243 if ($ldap->getDN() != $this->dn){
244 $this->used_hardware[$cn]= $ldap->getDN();
245 }
246 }
247 }
248 $this->hardware_list["automatic"]= _("automatic");
249 ksort($this->hardware_list);
250 $this->a_old_telenums = $this->phoneNumbers;
252 /* Get voicemail PIN from MySQL DB
253 * Because every user can change his PIN directly from the phone
254 * without any update to the ldap
255 * This means, the PIN in the DB is up to date
256 */
257 // Connect to DB server
258 if((is_callable("mysql_pconnect"))&&(isset($cur_cfg))&&(isset($cur_cfg['SERVER']))&&(isset($cur_cfg['LOGIN']))&&(isset($cur_cfg['PASSWORD']))){
259 $r_con = @mysql_pconnect($cur_cfg['SERVER'],$cur_cfg['LOGIN'],$cur_cfg['PASSWORD']);
260 if($r_con){
261 $r_db = @mysql_select_db($cur_cfg['DB'],$r_con);
262 $vp = mysql_fetch_row(mysql_query("SELECT ".$cur_cfg['VOICE_TABLE'].".password FROM ".$cur_cfg['VOICE_TABLE'].", ".$cur_cfg['SIP_TABLE']." WHERE customer_id = sip_users.mailbox AND name='".$this->uid."'"));
264 if((isset($vp[0]))&&(!empty($vp[0]))){
265 $this->goFonPINVoice = $vp[0];
266 }
267 }
268 }
269 $this->lastmacro=$this->macro;
271 if(is_callable("mysql_close")&&(isset($r_con))&&($r_con)){
272 @mysql_close($r_con) ;
273 }
274 }
277 /* This function generates the Database entries.
278 * The Parameter 'save' could be true or false.
279 * false - means only testing no database transactions.
280 * true - write database entries.
281 *
282 * 'sip_users','voice_mail' and 'extensions' table entries will be created.
283 *
284 * If the phone hardware is 'automatic' the table entries will only be removed
285 * and not added.
286 */
287 function generate_mysql_entension_entries($save = false)
288 {
289 /* Check if there is at least one server available
290 * If not, return and tell the user that saving failed
291 */
292 if(!count($this->goFonHomeServers)){
293 if($save){
294 print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
295 }
296 return(true);
297 }
299 /* Check if Mysql extension is available */
300 if(!is_callable("mysql_pconnect")){
301 if($save)
302 print_red(_("Can't save any changes to asterisk database, there is no mysql extension available."));
303 return(true);
304 }
306 /**********************
307 * Attribute Initialisation
308 **********************/
310 $old_connection = false;
312 // Get Configuration for Mysql database Server
313 $s_parameter = ""; // Contains paramter for selected Macro
314 $r_con = false; // DB connection
315 $r_db = false; // Selected DB
316 $r_res = false; // Result resource
317 $a_ldap_attrs = array(); //
319 $s_ip = NULL; // Contains ip for Sip entry
320 $s_host = NULL; // Contains host for Sip entry
321 $s_qualify = "yes"; // Qualify entry
322 $s_pin = NULL; // Entry for secret
323 $s_type = NULL; // Entry for phone type (friend , peer ..)
325 $sip_data_array = array(); // Contains complete sip entry, to generate SQL syntax
326 $i_old_key = false; // Contains index for first old phonenumber, to delete old entries corectly
327 $i_new_key = false; // Contains index for first new phonenumber, to generate new entries corectly
329 $s_sip_values = ""; // Contains string with all values for given attributes in SQL syntax
330 $s_sip_keys = ""; // Contains all needed attributes to generate sip entry in DB
332 $s_sip_key = ""; // Key for SIP entry index
333 $s_sip_val = ""; // Value for SIP entry index
335 $b_first_deleted= false; // Only delete first entry,
336 $s_telenums = ""; // for each value variable
338 $i_is_accounted = false; // Ensure that extension entry, for name to number is only once in table
340 /* Prepare some basic attributes */
341 foreach($this->a_old_telenums as $tele){
342 $oldnums[]= preg_replace("/[^0-9]/","",$tele);
343 }
344 foreach($this->phoneNumbers as $tele){
345 $newnums[]= preg_replace("/[^0-9]/","",$tele);
346 }
348 /* If deletion starts from userslist, cn uid are not set */
349 if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
350 $this->uid = $this->parent->by_object['user']->uid;
351 }
352 if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
353 $this->cn = $this->parent->by_object['user']->cn;
354 }
355 /* Create voicemail entry
356 */
357 if((!isset($this->cn))||(empty($this->cn))){
358 $CNname= $this->uid;
359 }else{
360 $CNname= $this->cn;
361 }
363 if((isset($this->parent))&&(isset($this->parent->by_object['mailAccount']))&&($this->parent->by_object['mailAccount']->is_account==true)){
364 $s_mail = $this->parent->by_object['mailAccount']->mail;
365 }else{
366 $s_mail = "";
367 }
368 /* Get phonehardware to setup sip entry */
369 $ldap = $this->config->get_ldap_link();
370 $r_res = $ldap->search("(&(objectClass=goFonHardware)(cn=".$this->goFonHardware."))", array('*'));
371 $a_ldap_attrs = $ldap->fetch();
373 /* Check selected phone hardware, is a default IP set? */
374 if(((isset($a_ldap_attrs['goFonDefaultIP'][0]))&&($a_ldap_attrs['goFonDefaultIP'][0] != "dynamic"))){
375 $s_ip = $a_ldap_attrs['goFonDefaultIP'][0];
376 $s_host = $s_ip;
377 }else{
378 $s_ip = NULL;
379 $s_host = "dynamic";
380 }
382 // Attribute GoFonQualify set ?
383 if(isset($a_ldap_attrs['goFonQualify'])){
384 $s_qualify = $a_ldap_attrs['goFonQualify'][0];
385 }
387 // Attribute GoFonPIN set ?
388 if(isset($this->goFonPIN)){
389 $s_pin = $this->goFonPIN;
390 }
392 // Attribute GoFonType set ?
393 if(isset($a_ldap_attrs['goFonType'])){
394 $s_type = $a_ldap_attrs['goFonType'][0];
395 }
397 if(isset($a_ldap_attrs['goFonDmtfMode'][0])){
398 $sip_data_array['dtmfmode'] = $a_ldap_attrs['goFonDmtfMode'][0];
399 }else{
400 $sip_data_array['dtmfmode'] ="rfc2833";
401 }
403 /* Check if phone number is used */
404 if($this->is_number_used()){
405 $this->generate_error = $this->is_number_used();
406 return false;
407 }
411 /**********************
412 * Check Server Connection Information
413 **********************/
415 /* Create Mysql handle for the current goFonHomeServer, if possible
416 * Get configuration to old asterisk home server
417 */
418 $a_New = $this->goFonHomeServers[$this->goFonHomeServer]; // DB Configuration
419 $new_connection = @mysql_pconnect($a_New['SERVER'],$a_New['LOGIN'],$a_New['PASSWORD']);
420 if(!$new_connection){
421 $this->generate_error = sprintf(
422 _("The MySQL Server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
423 $a_New['SERVER'],$a_New['LOGIN']);
424 gosa_log(@mysql_error($new_connection));
425 return false;
426 }
427 $new_database = @mysql_select_db($a_New['DB'],$new_connection);
428 if(!$new_database){
429 $this->generate_error = sprintf(
430 _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
431 $a_New['DB'],$a_New['SERVER']);
432 gosa_log( @mysql_error($new_connection));
433 return false;
434 }
436 /* If the home server has changed, we must remove entries from old
437 * server and add new entries in new server.
438 */
439 if($this->init_HomeServer != $this->goFonHomeServer){
441 /* Get configuration to old asterisk home server */
442 $a_Remove = $this->goFonHomeServers[$this->init_HomeServer]; // DB Configuration
444 /* Create connection to the database that contains the old entry.
445 */
446 $old_connection = @mysql_pconnect($a_Remove['SERVER'],$a_Remove['LOGIN'],$a_Remove['PASSWORD']);
447 if(!$old_connection){
448 $this->generate_error = sprintf(
449 _("The old MySQL home server '%s' isn't reachable as user '%s'. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
450 $a_Remove['SERVER'],$a_Remove['LOGIN']);
451 gosa_log(@mysql_error($old_connection));
452 return false;
453 }
454 $old_database = @mysql_select_db($a_Remove['DB'],$old_connection);
455 if(!$old_database){
456 $this->generate_error = sprintf(
457 _("Can't select database %s on %s. Abort saving entries to keep the database consistent, check GOsa log for mysql error."),
458 $a_Remove['DB'],$a_Remove['SERVER']);
459 gosa_log(@mysql_error($old_connection));
460 return false;
461 }
462 }
464 /* Save means that we must save changes, not only test */
465 if($save == true){
467 /**********************
468 * Remove entries from old home server
469 **********************/
471 /* Check if there is an old entry
472 * If there is en old entry, get callerid and remove voicemail and extensions too
473 */
474 if($old_connection){
475 $query = "SELECT id,name,callerid FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
476 $rid = mysql_query($query,$old_connection);
478 /* Old entry found, remove it */
479 $query_a = array();
480 if(mysql_affected_rows($old_connection)){
481 $result = mysql_fetch_assoc($rid);
482 $query_a[]= "DELETE FROM ".$a_Remove['SIP_TABLE']." WHERE name='".$this->uid."';";
483 $query_a[]= "DELETE FROM ".$a_Remove['VOICE_TABLE']." WHERE customer_id='".$result['callerid']."';";
484 $query_a[]= "DELETE FROM ".$a_Remove['EXT_TABLE']." WHERE exten='".$this->uid."';";
485 foreach($oldnums as $s_telenums) {
486 $query_a[]= "DELETE FROM ".$a_Remove['EXT_TABLE']." WHERE exten='".$s_telenums."';";
487 }
489 foreach($query_a as $qry){
490 if(!mysql_query($qry,$old_connection)){
491 echo $qry;
492 echo mysql_error($old_connection);
493 }
494 }
495 }
496 }
498 /**********************
499 * Update / Insert sip_users entry
500 **********************/
502 /* Set the first given phone number as callerid */
503 reset($newnums);
504 $i_new_key = key($newnums);
505 $sip_data_array['callerid'] =$newnums[$i_new_key];
506 $sip_data_array['mailbox'] =$newnums[$i_new_key];
508 /* Check if there is already an entry in sip_users for this uid */
509 $SQL_query_array = array();
510 $rid = mysql_query("SELECT * FROM ".$a_New['SIP_TABLE']." WHERE name='".$this->uid."';\n",$new_connection);
511 if(mysql_affected_rows($new_connection)){
513 /**********************
514 * Update sip_users entry
515 **********************/
516 $result = mysql_fetch_assoc($rid);
517 $sip_data_array['host'] = $s_host;
518 $sip_data_array['qualify'] = $s_qualify;
519 $sip_data_array['secret'] = $this->goFonPIN;
520 $sip_data_array['type'] = $s_type ;
521 $sip_data_array['username'] = $this->uid;
522 $sip_data_array['ipaddr'] = $s_ip;
524 /* Remove not changed attributes, to avoid updating table with same values */
525 foreach($sip_data_array as $name => $value){
526 if($result[$name] == $value){
527 unset($sip_data_array[$name]);
528 }
529 }
530 /* Only update entry if there is something to uopdate */
531 if(count($sip_data_array)){
532 $query = "UPDATE ".$a_New['SIP_TABLE']." SET ";
533 foreach($sip_data_array as $key => $val){
534 $query.= "".$key."='".$val."',";
535 }
536 $query = preg_replace("/,$/","",$query);
537 $query.= " WHERE name='".$this->uid."';";
538 $SQL_query_array[] = $query;
539 }
540 } else {
542 /**********************
543 * Insert sip_users entry
544 **********************/
545 //generate SIP entry
546 $sip_data_array['id'] = "";
547 $sip_data_array['name'] = $this->uid;
548 $sip_data_array['accountcode'] = NULL;
549 $sip_data_array['amaflags'] = NULL;
550 $sip_data_array['callgroup'] = NULL;
551 $sip_data_array['canreinvite'] = "no";
552 $sip_data_array['context'] = "default";
553 $sip_data_array['defaultip'] = NULL;
554 $sip_data_array['fromuser'] = NULL;
555 $sip_data_array['fromdomain'] = NULL;
556 $sip_data_array['host'] = $s_host;
557 $sip_data_array['insecure'] = NULL;
558 $sip_data_array['language'] = NULL;
559 $sip_data_array['mailbox'] = $newnums[$i_new_key];
560 $sip_data_array['md5secret'] = NULL;
561 $sip_data_array['nat'] = "no";
562 $sip_data_array['permit'] = NULL;
563 $sip_data_array['deny'] = NULL;
564 $sip_data_array['mask'] = NULL;
565 $sip_data_array['pickupgroup'] = NULL;
566 $sip_data_array['port'] = NULL;
567 $sip_data_array['qualify'] = $s_qualify;
568 $sip_data_array['restrictcid'] = "n";
569 $sip_data_array['rtptimeout'] = NULL;
570 $sip_data_array['rtpholdtimeout']=NULL;
571 $sip_data_array['secret'] = $this->goFonPIN;
572 $sip_data_array['type'] = $s_type ;
573 $sip_data_array['username'] = $this->uid;
574 $sip_data_array['disallow'] = NULL;
575 $sip_data_array['allow'] = NULL;
576 $sip_data_array['musiconhold'] = NULL;
577 $sip_data_array['regseconds'] = NULL;
578 $sip_data_array['ipaddr'] = $s_ip;
579 $sip_data_array['regexten'] = NULL;
580 $sip_data_array['cancallforward']=NULL;
582 /* There is currently no entry for this user in the sip_users table.
583 * We should create one i
584 */
585 foreach($sip_data_array as $s_sip_key=>$s_sip_val){
586 if($s_sip_val == NULL) continue;
587 $s_sip_values.="'".$s_sip_val."',";
588 $s_sip_keys .="`".$s_sip_key."`,";
589 }
590 $s_sip_values = preg_replace("/,$/","",$s_sip_values);
591 $s_sip_keys = preg_replace("/,$/","",$s_sip_keys);
593 /* Add sip entries to mysql queries */
594 $SQL_query_array[] ="INSERT INTO ".$a_New['SIP_TABLE']." (".$s_sip_keys.") VALUES (".$s_sip_values.");";
595 }
598 /**********************
599 * Update / Insert Voice mail entry
600 **********************/
602 $customer_id = $newnums[$i_new_key];
604 $voice_data_array = array(
605 "customer_id" => $customer_id,
606 "mailbox" => $customer_id,
607 "password" => $this->goFonVoicemailPIN,
608 "fullname" => $CNname,
609 "email" => $s_mail);
611 /* Set pager number if available */
612 if(isset($this->parent->by_object['user']->pager)){
613 $voice_data_array['pager'] = $this->parent->by_object['user']->pager;
614 }
616 /* Check if there is already an entry in sip_users for this uid */
617 $rid = mysql_query("SELECT * FROM ".$a_New['VOICE_TABLE']." WHERE customer_id='".$customer_id."';\n",$new_connection);
618 if(mysql_affected_rows($new_connection)){
620 /**********************
621 * Update Voice mail entry
622 **********************/
623 $result = mysql_fetch_assoc($rid) ;
625 foreach($voice_data_array as $name => $value){
626 if($result[$name] == $value){
627 unset($voice_data_array[$name]);
628 }
629 }
631 /* Only update entry if there is something to uopdate */
632 if(count($voice_data_array)){
633 $query = "UPDATE ".$a_New['VOICE_TABLE']." SET ";
634 foreach($voice_data_array as $key => $val){
635 $query.= "".$key."='".$val."',";
636 }
637 $query = preg_replace("/,$/","",$query);
638 $query.= " WHERE customer_id='".$customer_id."';";
639 $SQL_query_array[] = $query;
640 }
641 }else{
643 /**********************
644 * Insert Voice mail entry
645 **********************/
646 $voice_data_array['context'] = "default";
648 /* There is currently no voice mail entry for this user.
649 * We should create one
650 */
651 $s_voi_values = $s_voi_keys = "";
652 foreach($voice_data_array as $s_voi_key=>$s_voi_val){
653 if($s_voi_val == NULL) continue;
654 $s_voi_values.="'".$s_voi_val."',";
655 $s_voi_keys .="`".$s_voi_key."`,";
656 }
657 $s_voi_values = preg_replace("/,$/","",$s_voi_values);
658 $s_voi_keys = preg_replace("/,$/","",$s_voi_keys);
660 /* Add sip entries to mysql queries */
661 $SQL_query_array[] ="INSERT INTO ".$a_New['VOICE_TABLE']." (".$s_voi_keys.") VALUES (".$s_voi_values.");";
662 }
665 /**********************
666 * Remove/Insert extension entries
667 **********************/
669 /* Remove old entries */
670 $query = array();
671 $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$this->uid."\";";
672 foreach($newnums as $s_telenums){
673 $query[]= "DELETE FROM ".$a_New['EXT_TABLE']." WHERE exten=\"".$s_telenums."\";";
674 }
675 foreach($query as $qry){
676 if(!mysql_query($qry,$new_connection)){
677 echo mysql_error($new_connection);
678 }
679 }
681 /**********************
682 * Insert extension entries
683 **********************/
685 // Get selected Macro Parameter and create parameter entry
686 if(isset($this->macroarray[$this->macro])){
687 foreach($this->macroarray[$this->macro] as $key => $val ){
688 $s_parameter .= $val['choosen']."|";
689 }
690 $s_parameter = preg_replace("/\|$/","",$s_parameter);
691 }
693 $i = 0;
694 $EXT = array();
696 if(!is_numeric($this->uid)){
697 $EXT[$i]['context'] = 'GOsa';
698 $EXT[$i]['exten'] = $this->uid;
699 $EXT[$i]['priority']= 1;
700 $EXT[$i]['app'] = "Goto";
701 $EXT[$i]['appdata'] = $newnums[$i_new_key]."|1";
702 $i ++;
703 }
705 // Entension entries Hint / Dial / Goto
706 foreach($newnums as $s_telenums){
708 /* Hint Entry */
709 $EXT[$i]['context'] = 'GOsa';
710 $EXT[$i]['exten'] = $s_telenums;
711 $EXT[$i]['priority']= "Hint";
712 $EXT[$i]['app'] = 'SIP/'.$this->uid;
713 $i ++;
714 /* SetCID */
715 //$EXT[$i]['context'] = 'GOsa';
716 //$EXT[$i]['exten'] = $s_telenums;
717 //$EXT[$i]['priority']= 1;
718 //$EXT[$i]['app'] = "SetCIDName";
719 //$EXT[$i]['appdata'] = $CNname;
720 //$i ++;
722 // If no macro is selected use Dial
723 if($this->macro!="none"){
724 $macroname = preg_replace("/,.*$/","",$this->macro);
725 $macroname = preg_replace("/^.*=/","",$macroname);
726 $s_app = "Macro";$macroname;
727 $s_par = $macroname."|".$s_parameter;
728 }else{
729 $s_app = "Dial";
730 $s_par = 'SIP/'.$this->uid."|20|r";
731 }
733 $EXT[$i]['context'] = 'GOsa';
734 $EXT[$i]['exten'] = $s_telenums;
735 $EXT[$i]['priority']= 1;
736 $EXT[$i]['app'] = $s_app;
737 $EXT[$i]['appdata'] = $s_par;
738 $i ++;
739 }
741 // Append all these Entries
742 foreach($EXT as $entr){
743 $SQL_syn = "INSERT INTO ".$a_New['EXT_TABLE']." (";
744 foreach($entr as $key2 => $val2){
745 $SQL_syn.= "`".$key2."`,";
746 }
747 $SQL_syn = preg_replace("/,$/","",$SQL_syn);
748 $SQL_syn .= ") VALUES (";
749 foreach($entr as $key2 => $val2){
750 $SQL_syn .= "'".$val2."',";
751 }
752 $SQL_syn = preg_replace("/,$/","",$SQL_syn);
753 $SQL_syn .=");\n";
755 $SQL_query_array[] =$SQL_syn;
756 $SQL_syn ="";
757 }
759 // Perform queries ...
760 if($this->goFonHardware != "automatic"){
761 foreach($SQL_query_array as $query){
762 if(!@mysql_query($query,$new_connection)){
763 print_red(_("Error while performing query:")." ".mysql_error());
764 return false;
765 }
766 }
767 }
768 }
769 @mysql_close($new_connection);
770 return true;
771 }
774 function execute()
775 {
776 /* Call parent execute */
777 plugin::execute();
779 $display = "";
781 if(empty($this->macro)&&(!empty($this->goFonMacro))){
783 /* Go through already saved values, for a parameter */
784 $tmp = split("!",$this->goFonMacro);
786 /* it is possible that nothing has been saved yet */
787 if(is_array($tmp)){
789 /* First value is the macroname */
790 $this->macro = $tmp[0];
792 /* Macroname saved, delete that index */
793 unset($tmp[0]);
795 /* Check if macro has been removed */
796 if(!isset($this->macroarray[$this->macro])){
797 $this->macrostillavailable = false;
798 }else{
799 $this->macrostillavailable = true;
800 }
802 /* for each parametervalues ( parameterID#value like 25#twentyfive) */
803 foreach($tmp as $var){
805 /* Split this, so we have $varar[0] = parameterID $varar[1] = SelectedValue */
806 $varar = split("#",$var);
808 /* Only insert if the parameter still exists */
809 if(isset($this->macroarray[$this->macro][$varar[0]])){
810 /* Assign value */
811 $this->macroarray[$this->macro][$varar[0]]['choosen']=$varar[1];
812 }
813 }
814 }
815 }
817 /* Do we represent a valid account? */
818 if (!$this->is_account && $this->parent == NULL){
819 $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\"> <b>".
820 _("This account has no phone extensions.")."</b>";
821 $display.= back_to_main();
822 return ($display);
823 }
825 /* Do we need to flip is_account state? */
826 if (isset($_POST['modify_state'])){
828 /* Onyl change account state if allowed */
829 if($this->is_account && $this->acl == "#all#"){
830 $this->is_account= !$this->is_account;
831 }elseif(!$this->is_account && chkacl($this->acl,"create") == ""){
832 $this->is_account= !$this->is_account;
833 }
834 }
836 /* Select no macro if, state is empty, this is the case, if the selected macro is no longer available */
837 if(empty($this->macro)){
838 $this->macro ="none";
839 }
841 /* Prepare templating */
842 $smarty= get_smarty();
844 /* tell user that the selected plugin is no longer available */
845 if((!$this->macrostillavailable)&&($this->macro!="none")){
846 print_red(_("The macro you selected, is no longer available for you, please choose another one."));
847 }
849 /* Assing macroselectbox values */
850 $smarty->assign("macros",$this->macros);
851 $smarty->assign("macro", $this->macro);
853 /* check if there is a FON server created */
854 if(!count($this->goFonHomeServer)){
855 print_red(_("There is currently no asterisk server defined. Possibly you are missing a server that handles the asterisk management (goFonServer). Your settings can't be saved to asterisk database."));
856 }
858 /* Create html parameter table for selected macro parameters
859 * skip if no parameters given
860 */
861 if(!isset($this->macroarray[$this->macro])){
862 $macrotab="";
863 }else{
865 $macrotab ="<table summary=\""._("Parameter")."\">";
866 /* for every single parameter-> display textfile,combo, or true false switch*/
868 foreach($this->phoneNumbers as $phonenum){
869 $tmp[] = $phonenum;
870 }
872 if($this->macro != $this->lastmacro){
873 /* Go through all params */
874 foreach($this->macroarray[$this->macro] as $key => $paras){
876 $string = $paras['default'];
878 $string=preg_replace("/%uid/i",$this->uid,$string);
880 if(isset($this->cn)){
881 $string=preg_replace("/%cn/i",$this->cn,$string);
882 }
884 for($i = 0 ; $i < 10; $i++){
885 if(isset($tmp[$i])){
886 $string = preg_replace("/%telephoneNumber_".($i+1)."/i",$tmp[$i],$string);
887 }
888 }
889 if(isset($tmp[0])){
890 $string = preg_replace("/%telephoneNumber/i",$tmp[0],$string);
891 }
892 $this->macroarray[$this->macro][$key]['choosen']=$string;
893 }
894 }
896 foreach($this->macroarray[$this->macro] as $paras){
898 /* get al vars */
899 $var = $paras['var'];
900 $name = $paras['name'];
901 $default = $paras['default'];
902 $type = $paras['type'];
903 $choosen = $paras['choosen'] ;
904 $str = $default;
906 /* in case of a combo box display a combobox with selected attr */
907 $macrotab.= "<tr>";
908 switch ($type){
910 case "combo":
911 $str= "<select name='".$var."' ".chkacl($this->acl, "goFonMacro")." >";
912 foreach(split(":",$default) as $choice){
913 if($choosen==$choice){
914 $str.= "\n<option value='".$choice."' selected>".$choice." </option>";
915 }else{
916 $str.= "\n<option value='".$choice."'>".$choice." </option>";
917 }
918 }
919 $str.="</select>";
920 $macrotab.= "<td>".base64_decode($name)."</td><td>$str";
921 break;
923 case "bool":
924 if(!$choosen){
925 $str="\n<input type='checkbox' name='".$var."' value='1' ".chkacl($this->acl, "goFonMacro")." >";
926 }else{
927 $str="\n<input type='checkbox' name='".$var."' value='1' checked ".chkacl($this->acl, "goFonMacro").">";
928 }
929 $macrotab.= "<td colspan='2'>$str ".base64_decode($name)."";
930 break;
932 case "string":
933 $str="<input name='".$var."' value='".$choosen."' ".chkacl($this->acl, "goFonMacro")." style='width:340px;'>";
934 $macrotab.= "<td>".base64_decode($name)."</td><td>$str";
935 break;
937 }
938 $macrotab.= "</td></tr>";
940 }
941 $macrotab.="</table><input name='post_success' type='hidden' value='1'>";
942 }//is_array()
944 /* Give smarty the table */
945 $smarty->assign("macrotab",$macrotab);
948 /* Do we represent a valid account? */
949 if (!$this->is_account && $this->parent == NULL){
950 $display= "<img alt=\"\" src=\"images/stop.png\" align=\"middle\"> <b>".
951 _("This account has no phone extensions.")."</b>";
952 $display.= back_to_main();
953 return($display);
954 }
956 $display= "";
958 /* Show tab dialog headers */
959 if ($this->parent != NULL){
960 if ($this->is_account){
961 $display= $this->show_header(_("Remove phone account"),
962 _("This account has phone features enabled. You can disable them by clicking below."));
963 } else {
964 if(empty($this->uid)){
965 $display= $this->show_header(_("Create phone account"),
966 _("This account has phone features disabled. You can't enable them while no uid is set."),TRUE,TRUE);
967 }else{
968 $display= $this->show_header(_("Create phone account"),
969 _("This account has phone features disabled. You can enable them by clicking below."));
970 }
971 return ($display);
972 }
973 }
975 /* Add phone number */
976 if (isset($_POST["add_phonenumber"]) && $_POST['phonenumber']){
977 if (is_phone_nr($_POST['phonenumber'])){
978 $number= $_POST["phonenumber"];
979 $this->phoneNumbers[$number]= $number;
980 $this->is_modified= TRUE;
981 } else {
982 print_red(_("Please enter a valid phone number!"));
983 }
984 }
986 /* Remove phone number */
987 if (isset($_POST["delete_phonenumber"]) && isset($_POST["phonenumber_list"])){
988 foreach ($_POST['phonenumber_list'] as $number){
989 unset($this->phoneNumbers[$number]);
990 $this->is_modified= TRUE;
991 }
992 }
994 /* Transfer ACL's */
995 foreach($this->attributes as $val){
996 $smarty->assign($val."ACL", chkacl($this->acl,$val));
997 if(isset($this->$val)){
998 $smarty->assign($val,$this->$val);
999 }else{
1000 $smarty->assign($val,"");
1001 }
1002 }
1004 /* Create home server array */
1005 $tmp = array();
1006 foreach($this->goFonHomeServers as $dn => $attrs){
1007 if(!is_numeric($dn)){
1008 $tmp[$dn] = $attrs['SERVER'];
1009 }
1010 }
1011 $smarty->assign("goFonHomeServers",$tmp);
1013 /* Fill arrays */
1014 $smarty->assign ("goFonHardware", $this->goFonHardware);
1015 if (!count($this->phoneNumbers)){
1016 $smarty->assign ("phoneNumbers", array());
1017 } else {
1018 $smarty->assign ("phoneNumbers", $this->phoneNumbers);
1019 }
1020 $hl= "<select size=\"1\" name=\"goFonHardware\" title=\"".
1021 _("Choose your private phone")."\" ".chkacl($this->acl, "goFonHardware").">\n";
1022 foreach ($this->hardware_list as $cn => $description){
1023 if ($cn == $this->goFonHardware){
1024 $selected= "selected";
1025 } else {
1026 $selected= "";
1027 }
1028 if (isset($this->used_hardware[$cn])){
1029 $color= "style=\"color:#A0A0A0\"";
1030 } else {
1031 $color= "";
1032 }
1033 $hl.= " <option $color label=\"$cn\" value=\"$cn\" $selected>$description </option>\n";
1034 }
1035 $hl.= "</select>\n";
1036 $smarty->assign ("hardware_list", $hl);
1038 /* Show main page */
1039 $this->lastmacro = $this->macro;
1040 $display.= $smarty->fetch(get_template_path('generic.tpl', TRUE, dirname(__FILE__)));
1041 return($display);
1042 }
1045 function save_object()
1046 {
1047 if (isset($_POST["phoneTab"])){
1049 plugin::save_object();
1051 /* Save checkbox */
1052 if (isset($_POST['fon_to_mail'])){
1053 $tmp= "[M]";
1054 } else {
1055 $tmp= "[]";
1056 }
1057 if (chkacl ($this->acl, "goFonDeliveryMode") == ""){
1058 if ($this->goFonDeliveryMode != $tmp){
1059 $this->is_modified= TRUE;
1060 }
1061 $this->goFonDeliveryMode= $tmp;
1062 }
1064 /* Every macro in the select box are available */
1065 if((isset($_POST['macro']))){
1066 $this->macrostillavailable=true;
1067 }
1069 if(isset($_POST['macro']) && $_POST['macro'] != $this->macro){
1070 $this->is_modified =true;
1071 }
1073 if(is_array($this->phoneNumbers)){
1074 foreach($this->phoneNumbers as $telenumms) {
1075 $nummsinorder[]=$telenumms;
1076 }
1077 }else{
1078 $nummsinorder=array("");
1079 }
1081 /* get all Postvars */
1082 if(isset($this->macroarray[$this->macro])){
1084 foreach($this->macroarray[$this->macro] as $key => $paras){
1086 $backup = $this->macroarray[$this->macro][$key];
1088 if(isset($_POST[$paras['var']])){
1089 $this->macroarray[$this->macro][$key]['choosen'] = $_POST[$paras['var']];
1090 }
1092 /* Checkboxes are special, they are not Posted if they are not selected, so the won't be changed with the above code
1093 We need this code below to read and save checkboxes correct
1094 */
1096 if(isset($_POST['post_success'])){
1097 if($this->macroarray[$this->macro][$key]['type']=="bool"){
1098 if(isset($_POST[$this->macroarray[$this->macro][$key]['var']])) {
1099 $this->macroarray[$this->macro][$key]['choosen']=$_POST[$paras['var']];
1100 }else{
1101 $this->macroarray[$this->macro][$key]['choosen']=false;
1102 }
1103 }
1104 }
1105 if(count(array_diff($this->macroarray[$this->macro][$key],$backup))){
1106 $this->modified = TRUE;
1107 }
1108 }
1109 }
1110 }
1111 }
1113 function check()
1114 {
1115 /* Call common method to give check the hook */
1116 $message= plugin::check();
1118 if(!count($this->goFonHomeServers)){
1119 $message[] = _("There must be at least one server with an asterisk database to create a phone account.");
1120 }
1122 if(empty($this->goFonHomeServer)){
1123 $message[] = _("Please select a valid goFonHomeServer.");
1124 }
1126 if((strlen($this->goFonVoicemailPIN)==0)||(strlen($this->goFonVoicemailPIN)>4)){
1127 $message[]=(_("Voicemail PIN must be between 1-4 characters."));
1128 }else{
1129 if(preg_match("/[^0-9]/",$this->goFonVoicemailPIN)){
1130 $message[]=(_("The specified Voicemail PIN contains invalid characters, only numeric values are allowed here."));
1131 }
1132 }
1134 if((strlen($this->goFonPIN)<=0)){
1135 $message[]=(_("Phone PIN must be at least one character long."));
1136 }else{
1137 if(preg_match("/[^0-9a-z]/i",$this->goFonPIN)){
1138 $message[]=(_("The specified phone PIN contains invalid characters, only aphanumeric values are allowed here."));
1139 }
1140 }
1142 if ($this->initially_was_account != $this->is_account || $this->is_modified){
1143 if(!$this->generate_mysql_entension_entries()){
1144 $message[] = $this->generate_error;
1145 }
1146 }
1148 /* We need at least one phone number */
1149 if (count($this->phoneNumbers) == 0){
1150 $message[]= sprintf(_("You need to specify at least one phone number!"));
1151 }
1153 /* check for ! in any parameter setting*/
1154 if(isset($this->macroarray[$this->macro])){
1155 foreach($this->macroarray[$this->macro] as $val){
1156 if((strstr($val['choosen'],"!"))||(strstr($val['choosen'],"#"))){
1157 $message[] = sprintf(_("The parameter %s contains invalid char. '!,#' is used as delimiter"),$val['name']);
1158 }
1159 }
1160 }
1161 return ($message);
1162 }
1166 function save()
1167 {
1168 plugin::save();
1170 /* Force saving macro again
1171 * This ensures that
1172 * - the macro is available on the destiantion server.
1173 * - the macro saved is up to date on the destination server.
1174 */
1175 if(!empty($this->macro) && $this->macro != "none") {
1176 $macro_tab = new macrotabs($this->config,$this->config->data['TABS']['MACROTABS'], $this->macro);
1177 $macro_tab -> save();
1178 }
1180 /* Save arrays */
1181 $tmp_numbers = array();
1182 foreach ($this->phoneNumbers as $number){
1183 $tmp_numbers[] = $number;
1184 }
1186 /* Save settings, or remove goFonMacro attribute*/
1187 if($this->macro!="none"){
1188 $this->attrs['goFonMacro']=$this->macro;
1189 if(isset($this->macroarray[$this->macro])){
1190 foreach($this->macroarray[$this->macro] as $paras) {
1191 $this->attrs['goFonMacro'].="!".$paras['id']."#".$paras['choosen'];
1192 }
1193 }
1194 }else{
1195 $this->attrs['goFonMacro']=array();
1196 }
1197 unset($this->attrs['macro']) ;
1199 $this->attrs['goFonForwarding']=array();
1201 if ($this->initially_was_account != $this->is_account || $this->is_modified){
1202 $str = $this->generate_mysql_entension_entries(true);
1203 if(empty($str)){
1204 print_red($str);
1205 }
1206 }
1208 if($this->attrs['goFonMacro']==""){
1209 $this->attrs['goFonMacro']=array();
1210 }
1212 unset($this->attrs['cn']);
1214 /* Write back to ldap */
1215 $ldap= $this->config->get_ldap_link();
1216 $ldap->cd($this->dn);
1217 $this->cleanup();
1219 /* Force saving numbers, else it will be overwriten by user account. */
1220 $this->attrs['telephoneNumber'] =$tmp_numbers;
1221 $ldap->modify ($this->attrs);
1223 show_ldap_error($ldap->get_error(), _("Saving phone account failed"));
1225 /* Optionally execute a command after we're done */
1227 if ($this->initially_was_account == $this->is_account){
1228 if ($this->is_modified){
1229 $this->handle_post_events("modify",array("uid" => $this->uid));
1230 }
1231 } else {
1232 $this->handle_post_events("add",array("uid" => $this->uid));
1233 }
1235 }
1238 function adapt_from_template($dn)
1239 {
1240 plugin::adapt_from_template($dn);
1242 /* Assemble phone numbers */
1243 if (isset($this->attrs['telephoneNumber'])){
1244 for ($i= 0; $i<$this->attrs['telephoneNumber']['count']; $i++){
1245 $number= $this->attrs['telephoneNumber'][$i];
1246 $this->phoneNumbers[$number]= $number;
1247 }
1248 }
1249 }
1252 function remove_from_parent()
1253 {
1254 if(!$this->initially_was_account) return;
1256 foreach($this->attributes as $key=>$val){
1257 if(in_array($val,array("uid","cn"))){
1258 unset($this->attributes[$key]);
1259 unset($this->$val);
1260 }
1261 }
1262 if(count($this->goFonHomeServers) && !empty($this->init_HomeServer) && is_callable("mysql_pconnect")){
1264 // Get Configuration for initial Mysql database Server
1265 $a_SETUP = $this->goFonHomeServers[$this->init_HomeServer];
1266 $s_parameter ="";
1268 // Connect to DB server
1269 $r_con = @mysql_pconnect($a_SETUP['SERVER'],$a_SETUP['LOGIN'],$a_SETUP['PASSWORD']);
1271 // Check if we are connected correctly
1272 if(!$r_con){
1273 print_red(sprintf(_("The MySQL Server '%s' isn't reachable as user '%s', check GOsa log for mysql error."),
1274 $a_SETUP['SERVER'],$a_SETUP['LOGIN']));
1275 gosa_log(@mysql_error());
1276 return false;
1277 }
1279 // Select database for Extensions
1280 $db = @mysql_select_db($a_SETUP['DB'],$r_con);
1282 // Test if we have the database selected correctly
1283 if(!$db){
1284 print_red(sprintf(_("Can't select database %s on %s."),$a_SETUP['DB'],$a_SETUP['SERVER']));
1285 gosa_log(@mysql_error());
1286 return false;
1287 }
1289 $SQL="";
1291 /* If deletion starts from userslist, cn uid are not set */
1292 if((isset($this->parent->by_object['user']->uid))&&(!empty($this->parent->by_object['user']->uid))){
1293 $this->uid = $this->parent->by_object['user']->uid;
1294 }
1296 if((isset($this->parent->by_object['user']->cn))&&(!empty($this->parent->by_object['user']->cn))){
1297 $this->cn = $this->parent->by_object['user']->cn;
1298 }
1300 $first_num = false;
1301 // Delete old entries
1302 foreach($this->a_old_telenums as $s_telenums){
1303 if(!$first_num){
1304 $first_num = $s_telenums;
1305 }
1306 $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$s_telenums."';\n";
1307 }
1309 $SQL[] = "DELETE FROM ".$a_SETUP['VOICE_TABLE']." WHERE customer_id='".$first_num."';";
1310 $SQL[] = "DELETE FROM ".$a_SETUP['EXT_TABLE']." WHERE exten='".$this->uid."';\n";
1311 $SQL[] = "DELETE FROM ".$a_SETUP['SIP_TABLE']." WHERE name='".$this->uid."';\n";
1313 foreach($SQL as $query){
1314 if(!@mysql_query($query,$r_con)){
1315 print_red(_("Stop".mysql_error()));
1316 return false;
1317 }
1318 }
1319 }else{
1320 print_red(_("Can't remove phone account, the mysql extension is not present in php configuration."));
1321 return false;
1322 }
1324 /* unset macro attr, it will cause an error */
1325 $tmp = array_flip($this->attributes);
1326 unset($tmp['macro']);
1327 $this->attributes=array_flip($tmp);
1329 /* Cancel if there's nothing to do here */
1330 if (!$this->initially_was_account){
1331 return;
1332 }
1334 plugin::remove_from_parent();
1336 /* Just keep one phone number */
1337 if (count($this->telephoneNumber) && $this->telephoneNumber != ""){
1338 $this->attrs['telephoneNumber']= $this->telephoneNumber;
1339 } else {
1340 $this->attrs['telephoneNumber']= array();
1341 }
1344 $ldap= $this->config->get_ldap_link();
1345 $ldap->cd($this->config->current['BASE']);
1346 $ldap->search("(&(objectClass=goFonQueue)(member=*))", array("member"));
1347 while($attr = $ldap->fetch()){
1348 if(in_array($this->dn,$attr['member'])){
1349 $new =new ogrouptabs($this->config, $this->config->data['TABS']['OGROUPTABS'],$attr['dn']);
1350 unset($new->by_object['ogroup']->memberList[$this->dn]);
1351 unset($new->by_object['ogroup']->member[$this->dn]);
1352 $new->save();
1353 print_red(sprintf(_("Removed user '%s' from phone queue '%s'."),$this->uid,$new->by_object['ogroup']->cn));
1354 }
1355 }
1356 $ldap->cd($this->dn);
1357 $this->cleanup();
1358 $ldap->modify ($this->attrs);
1360 show_ldap_error($ldap->get_error(), _("Removing phone account failed"));
1362 /* Optionally execute a command after we're done */
1363 @mysql_close($r_con);
1364 $this->handle_post_events('remove',array("uid"=> $this->uid));
1365 }
1369 /* This function checks if the given phonenumbers are available or already in use*/
1370 function is_number_used()
1371 {
1372 $ldap= $this->config->get_ldap_link();
1373 $ldap->cd($this->config->current['BASE']);
1374 $ldap->search("(|(objectClass=goFonAccount)(objectClass=goFonQueue)(objectClass=goFonConference))", array("telephoneNumber","cn","uid"));
1375 while($attrs = $ldap->fetch()) {
1376 unset($attrs['telephoneNumber']['count']);
1377 foreach($attrs['telephoneNumber'] as $tele){
1378 if(!isset($attrs['cn'][0])) $attrs['cn'][0]=$attrs['dn'];
1379 if(!isset($attrs['uid'][0])) $attrs['uid'][0]=$attrs['dn'];
1380 $numbers[$tele]=$attrs;
1381 }
1382 }
1384 foreach($this->phoneNumbers as $num){
1385 if(!isset($this->cn)) $this->cn = "";
1387 if((isset($numbers[$num]))&&(($numbers[$num]['uid'][0]!=$this->uid))){
1388 if(isset($numbers[$num]['uid'][0])){
1389 return sprintf(_("The specified telephonenumber '%s' is already assigned to '%s'."),$num,$numbers[$num]['uid'][0]);
1390 }else{
1391 return sprintf(_("The specified telephonenumber '%s' is already assigned to '%s'."),$num,$numbers[$num]['cn'][0]);
1392 }
1393 }
1394 }
1395 }
1398 /* Create phoneAccount part of copy & paste dialog */
1399 function getCopyDialog()
1400 {
1401 if(!$this->is_account) return("");
1402 $smarty = get_smarty();
1403 if (!count($this->phoneNumbers)){
1404 $smarty->assign ("phoneNumbers", array(""));
1405 } else {
1406 $smarty->assign ("phoneNumbers", $this->phoneNumbers);
1407 }
1409 $smarty->assign("goFonVoicemailPIN",$this->goFonVoicemailPIN);
1410 $smarty->assign("goFonPIN",$this->goFonPIN);
1412 $display= $smarty->fetch(get_template_path('paste_generic.tpl', TRUE, dirname(__FILE__)));
1413 $ret =array();
1414 $ret['string'] = $display;
1415 $ret['status'] = "";
1416 return($ret);
1417 }
1419 /* Save posts from copy & paste dialog dialog */
1420 function saveCopyDialog()
1421 {
1422 if(!$this->is_account) return;
1423 $this->execute();
1424 if(isset($_POST['goFonVoicemailPIN'])) {
1425 $this->goFonVoicemailPIN = $_POST['goFonVoicemailPIN'];
1426 }
1427 if(isset($_POST['goFonPIN'])){
1428 $this->goFonPIN = $_POST['goFonPIN'];
1429 }
1430 }
1433 function allow_remove()
1434 {
1435 /* Check if previously selected server is still available */
1436 if($this->initially_was_account && !isset($this->goFonHomeServers[$this->goFonHomeServer])){
1437 return sprintf(_("The previously selected asterisk home server (%s) is no longer available. Remove aborted."),preg_replace("/,/",", ",$this->goFonHomeServer));
1438 }
1439 }
1440 }
1442 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
1443 ?>