Copyright (C) 2010 - 2016 All Rights Reserved. Contributor(s): Mark J Crane */ //define the directory class if (!class_exists('extension')) { class extension { public $db; public $domain_uuid; public $domain_name; private $app_uuid; public $extension_uuid; public $extension; public $voicemail_id; public $number_alias; public $password; public $provisioning_list; public $voicemail_password; public $accountcode; public $effective_caller_id_name; public $effective_caller_id_number; public $outbound_caller_id_name; public $outbound_caller_id_number; public $emergency_caller_id_name; public $emergency_caller_id_number; public $directory_full_name; public $directory_visible; public $directory_exten_visible; public $limit_max; public $limit_destination; public $voicemail_enabled; public $voicemail_mail_to; public $voicemail_file; public $voicemail_local_after_email; public $user_context; public $toll_allow; public $call_timeout; public $call_group; public $hold_music; public $auth_acl; public $cidr; public $sip_force_contact; public $sip_force_expires; public $nibble_account; public $mwi_account; public $sip_bypass_media; public $absolute_codec_string; public $dial_string; public $enabled; public $description; public function __construct() { //connect to the database if not connected if (!$this->db) { require_once "resources/classes/database.php"; $database = new database; $database->connect(); $this->db = $database->db; } //set the application id $this->app_uuid = 'e68d9689-2769-e013-28fa-6214bf47fca3'; } public function __destruct() { foreach ($this as $key => $value) { unset($this->$key); } } public function exists($domain_uuid, $extension) { $sql = "select extension_uuid from v_extensions "; $sql .= "where domain_uuid = :domain_uuid "; $sql .= "and (extension = :extension or number_alias = :extension) "; $sql .= "and enabled = 'true' "; $prep_statement = $this->db->prepare($sql); $prep_statement->bindParam(':domain_uuid', $domain_uuid); $prep_statement->bindParam(':extension', $extension); $prep_statement->execute(); $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); if ($result && count($result) > 0) { return true; } else { return false; } } public function get_domain_uuid() { return $this->domain_uuid; } public function set_domain_uuid($domain_uuid){ $this->domain_uuid = $domain_uuid; } public function voicemail() { //determine the voicemail_id if (is_numeric($this->number_alias)) { $this->voicemail_id = $this->number_alias; } else { $this->voicemail_id = $this->extension; } //update the voicemail settings $sql = "select * from v_voicemails "; $sql .= "where domain_uuid = '".$this->domain_uuid."' "; $sql .= "and voicemail_id = '".$this->voicemail_id."' "; $prep_statement = $this->db->prepare(check_sql($sql)); $prep_statement->execute(); $result = $prep_statement->fetchAll(PDO::FETCH_NAMED); if (count($result) == 0) { //add the voicemail box $sql = "insert into v_voicemails "; $sql .= "("; $sql .= "domain_uuid, "; $sql .= "voicemail_uuid, "; $sql .= "voicemail_id, "; $sql .= "voicemail_password, "; if (strlen($this->greeting_id) > 0) { $sql .= "greeting_id, "; } $sql .= "voicemail_mail_to, "; $sql .= "voicemail_file, "; $sql .= "voicemail_local_after_email, "; $sql .= "voicemail_enabled, "; $sql .= "voicemail_description "; $sql .= ") "; $sql .= "values "; $sql .= "("; $sql .= "'".$this->domain_uuid."', "; $sql .= "'".uuid()."', "; $sql .= "'".$this->voicemail_id."', "; $sql .= "'".$this->voicemail_password."', "; $sql .= "'".$this->voicemail_mail_to."', "; $sql .= "'".$this->voicemail_file."', "; $sql .= "'".$this->voicemail_local_after_email."', "; $sql .= "'".$this->voicemail_enabled."', "; $sql .= "'".$this->description."' "; $sql .= ")"; $this->db->exec(check_sql($sql)); unset($sql); } else { //update the voicemail box $sql = "update v_voicemails set "; $sql .= "voicemail_password = '".$this->voicemail_password."', "; $sql .= "voicemail_mail_to = '".$this->voicemail_mail_to."', "; $sql .= "voicemail_file = '".$this->voicemail_file."', "; $sql .= "voicemail_local_after_email = '".$this->voicemail_local_after_email."', "; $sql .= "voicemail_enabled = '".$this->voicemail_enabled."', "; $sql .= "voicemail_description = '".$this->description."' "; $sql .= "where domain_uuid = '".$this->domain_uuid."' "; $sql .= "and voicemail_id = '".$this->voicemail_id."' "; $this->db->exec(check_sql($sql)); unset($sql); } unset ($prep_statement); } public function xml() { if (isset($_SESSION['switch']['extensions']['dir'])) { //declare global variables global $config, $db, $domain_uuid; //get the domain_name $domain_name = $_SESSION['domains'][$domain_uuid]['domain_name']; $user_context = $domain_name; //delete all old extensions to prepare for new ones $dialplan_list = glob($_SESSION['switch']['extensions']['dir']."/".$user_context."/v_*.xml"); foreach($dialplan_list as $name => $value) { unlink($value); } //write the xml files $sql = "SELECT * FROM v_extensions AS e, v_voicemails AS v "; $sql .= "WHERE e.domain_uuid = '$domain_uuid' "; $sql .= "AND COALESCE(NULLIF(e.number_alias,''),e.extension) = CAST(v.voicemail_id as VARCHAR) "; $sql .= "ORDER BY e.call_group ASC "; $prep_statement = $db->prepare(check_sql($sql)); $prep_statement->execute(); $i = 0; $extension_xml_condensed = false; while($row = $prep_statement->fetch(PDO::FETCH_ASSOC)) { $call_group = $row['call_group']; $call_group = str_replace(";", ",", $call_group); $tmp_array = explode(",", $call_group); foreach ($tmp_array as &$tmp_call_group) { $tmp_call_group = trim($tmp_call_group); if (strlen($tmp_call_group) > 0) { if (strlen($call_group_array[$tmp_call_group]) == 0) { $call_group_array[$tmp_call_group] = $row['extension']; } else { $call_group_array[$tmp_call_group] = $call_group_array[$tmp_call_group].','.$row['extension']; } } $i++; } $call_timeout = $row['call_timeout']; $user_context = $row['user_context']; $password = $row['password']; $voicemail_password = $row['voicemail_password']; //$voicemail_password = str_replace("#", "", $voicemail_password); //preserves leading zeros //echo "enabled: ".$row['enabled']; if ($row['enabled'] != "false") { $extension_uuid = $row['extension_uuid']; //remove invalid characters from the file names $extension = $row['extension']; $extension = str_replace(" ", "_", $extension); $extension = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $extension); $dial_string = $row['dial_string']; if (strlen($dial_string) == 0) { if (strlen($_SESSION['domain']['dial_string']['text']) > 0) { $dial_string = $_SESSION['domain']['dial_string']['text']; } else { $dial_string = "{sip_invite_domain=\${domain_name},leg_timeout=".$call_timeout.",presence_id=\${dialed_user}@\${dialed_domain}}\${sofia_contact(\${dialed_user}@\${dialed_domain})}"; } } //set the password hashes $a1_hash = md5($extension.":".$domain_name.":".$password); $vm_a1_hash = md5($extension.":".$domain_name.":".$voicemail_password); $xml .= "\n"; $cidr = ''; if (strlen($row['cidr']) > 0) { $cidr = " cidr=\"" . $row['cidr'] . "\""; } $number_alias = ''; if (strlen($row['number_alias']) > 0) { $number_alias = " number-alias=\"".$row['number_alias']."\""; } $xml .= " \n"; $xml .= " \n"; //$xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; //voicemail settings //$xml .= " \n"; $xml .= " \n"; switch ($row['voicemail_enabled']) { case "true": $xml .= " \n"; break; case "false": $xml .= " \n"; break; default: $xml .= " \n"; } if (strlen($row['voicemail_mail_to']) > 0) { $xml .= " \n"; switch ($row['voicemail_file']) { case "attach": $xml .= " \n"; break; default: $xml .= " \n"; } switch ($row['voicemail_local_after_email']) { case "true": $xml .= " \n"; break; case "false": $xml .= " \n"; break; default: $xml .= " \n"; } $xml .= " \n"; } if (strlen($row['mwi_account']) > 0) { $xml .= " \n"; } if (strlen($row['auth_acl']) > 0) { $xml .= " \n"; } if (strlen($row['directory_exten_visible']) > 0) { $xml .= " \n"; } $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; if (strlen($row['call_group']) > 0) { $xml .= " \n"; } if (strlen($row['user_record']) > 0) { $xml .= " \n"; } if (strlen($row['hold_music']) > 0) { $xml .= " \n"; } $xml .= " \n"; if (strlen($row['call_timeout']) > 0) { $xml .= " \n"; } if (strlen($switch_account_code) > 0) { $xml .= " \n"; } else { $xml .= " \n"; } $xml .= " \n"; if (strlen($row['effective_caller_id_name']) > 0) { $xml .= " \n"; } if (strlen($row['effective_caller_id_number']) > 0) { $xml .= " \n"; } if (strlen($row['outbound_caller_id_name']) > 0) { $xml .= " \n"; } if (strlen($row['outbound_caller_id_number']) > 0) { $xml .= " \n"; } if (strlen($row['emergency_caller_id_name']) > 0) { $xml .= " \n"; } if (strlen($row['emergency_caller_id_number']) > 0) { $xml .= " \n"; } if (strlen($row['directory_full_name']) > 0) { $xml .= " \n"; } if (strlen($row['directory_visible']) > 0) { $xml .= " \n"; } if (strlen($row['limit_max']) > 0) { $xml .= " \n"; } else { $xml .= " \n"; } if (strlen($row['limit_destination']) > 0) { $xml .= " \n"; } if (strlen($row['sip_force_contact']) > 0) { $xml .= " \n"; } if (strlen($row['sip_force_expires']) > 0) { $xml .= " \n"; } if (strlen($row['nibble_account']) > 0) { $xml .= " \n"; } switch ($row['sip_bypass_media']) { case "bypass-media": $xml .= " \n"; break; case "bypass-media-after-bridge": $xml .= " \n"; break; case "proxy-media": $xml .= " \n"; break; } if (strlen($row['absolute_codec_string']) > 0) { $xml .= " \n"; } if (strlen($row['forward_all_enabled']) > 0) { $xml .= " \n"; } if (strlen($row['forward_all_destination']) > 0) { $xml .= " \n"; } if (strlen($row['forward_busy_enabled']) > 0) { $xml .= " \n"; } if (strlen($row['forward_busy_destination']) > 0) { $xml .= " \n"; } if (strlen($row['forward_no_answer_enabled']) > 0) { $xml .= " \n"; } if (strlen($row['forward_no_answer_destination']) > 0) { $xml .= " \n"; } if (strlen($row['forward_user_not_registered_enabled']) > 0) { $xml .= " \n"; } if (strlen($row['forward_user_not_registered_destination']) > 0) { $xml .= " \n"; } if (strlen($row['do_not_disturb']) > 0) { $xml .= " \n"; } $xml .= " \n"; $xml .= " \n"; if (!is_readable($_SESSION['switch']['extensions']['dir']."/".$row['user_context'])) { event_socket_mkdir($_SESSION['switch']['extensions']['dir']."/".$row['user_context']); } if (strlen($extension) > 0) { $fout = fopen($_SESSION['switch']['extensions']['dir']."/".$row['user_context']."/v_".$extension.".xml","w"); } $xml .= "\n"; fwrite($fout, $xml); unset($xml); fclose($fout); } } unset ($prep_statement); //prepare extension $extension_dir = realpath($_SESSION['switch']['extensions']['dir']); $user_context = str_replace(" ", "_", $user_context); $user_context = preg_replace("/[\*\:\\/\<\>\|\'\"\?]/", "", $user_context); //define the group members $xml = "\n"; $xml .= "\n"; $xml .= "\n"; $xml .= " \n"; if ($user_context == "default") { $xml .= " \n"; } else { $xml .= " \n"; } $xml .= " \n"; //$xml .= " \n"; $xml .= " \n"; $xml .= "\n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= "\n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $xml .= "\n"; $previous_call_group = ""; foreach ($call_group_array as $key => $value) { $call_group = trim($key); $extension_list = trim($value); if (strlen($call_group) > 0) { if ($previous_call_group != $call_group) { $xml .= " \n"; $xml .= " \n"; $xml .= " \n"; $extension_array = explode(",", $extension_list); foreach ($extension_array as &$tmp_extension) { $xml .= " \n"; } $xml .= " \n"; $xml .= " \n"; $xml .= "\n"; } $previous_call_group = $call_group; } unset($call_group); } $xml .= " \n"; $xml .= "\n"; $xml .= " \n"; $xml .= ""; //write the xml file if (is_readable($extension_dir) && strlen($extension_dir) > 0) { $fout = fopen($extension_dir."/".$user_context.".xml","w"); fwrite($fout, $xml); unset($xml); fclose($fout); } //apply settings $_SESSION["reload_xml"] = true; } } } } ?>