2017-06-13 07:09:36 +02:00
< ? php
/*
FusionPBX
Version : MPL 1.1
The contents of this file are subject to the Mozilla Public License Version
1.1 ( the " License " ); you may not use this file except in compliance with
the License . You may obtain a copy of the License at
http :// www . mozilla . org / MPL /
Software distributed under the License is distributed on an " AS IS " basis ,
WITHOUT WARRANTY OF ANY KIND , either express or implied . See the License
for the specific language governing rights and limitations under the
License .
The Original Code is FusionPBX
The Initial Developer of the Original Code is
Mark J Crane < markjcrane @ fusionpbx . com >
2018-02-04 04:36:56 +01:00
Copyright ( C ) 2014 - 2018
2017-06-13 07:09:36 +02:00
All Rights Reserved .
Contributor ( s ) :
Mark J Crane < markjcrane @ fusionpbx . com >
Luis Daniel Lucio Quiroz < dlucio @ okay . com . mx >
*/
include " root.php " ;
//define the provision class
class provision {
public $db ;
public $domain_uuid ;
public $domain_name ;
public $template_dir ;
public $mac ;
public function __construct () {
//get the database object
global $db ;
$this -> db = $db ;
//set the default template directory
if ( PHP_OS == " Linux " ) {
//set the default template dir
if ( strlen ( $this -> template_dir ) == 0 ) {
if ( file_exists ( '/etc/fusionpbx/resources/templates/provision' )) {
$this -> template_dir = '/etc/fusionpbx/resources/templates/provision' ;
}
else {
$this -> template_dir = $_SERVER [ " DOCUMENT_ROOT " ] . PROJECT_PATH . '/resources/templates/provision' ;
}
}
} elseif ( PHP_OS == " FreeBSD " ) {
//if the FreeBSD port is installed use the following paths by default.
if ( file_exists ( '/usr/local/etc/fusionpbx/resources/templates/provision' )) {
if ( strlen ( $this -> template_dir ) == 0 ) {
$this -> template_dir = '/usr/local/etc/fusionpbx/resources/templates/provision' ;
}
else {
$this -> template_dir = $_SERVER [ " DOCUMENT_ROOT " ] . PROJECT_PATH . '/resources/templates/provision' ;
}
}
else {
if ( strlen ( $this -> template_dir ) == 0 ) {
$this -> template_dir = $_SERVER [ " DOCUMENT_ROOT " ] . PROJECT_PATH . '/resources/templates/provision' ;
}
else {
$this -> template_dir = $_SERVER [ " DOCUMENT_ROOT " ] . PROJECT_PATH . '/resources/templates/provision' ;
}
}
} elseif ( PHP_OS == " NetBSD " ) {
//set the default template_dir
if ( strlen ( $this -> template_dir ) == 0 ) {
$this -> template_dir = $_SERVER [ " DOCUMENT_ROOT " ] . PROJECT_PATH . '/resources/templates/provision' ;
}
} elseif ( PHP_OS == " OpenBSD " ) {
//set the default template_dir
if ( strlen ( $this -> template_dir ) == 0 ) {
$this -> template_dir = $_SERVER [ " DOCUMENT_ROOT " ] . PROJECT_PATH . '/resources/templates/provision' ;
}
} else {
//set the default template_dir
if ( strlen ( $this -> template_dir ) == 0 ) {
$this -> template_dir = $_SERVER [ " DOCUMENT_ROOT " ] . PROJECT_PATH . '/resources/templates/provision' ;
}
}
//normalize the mac address
if ( isset ( $this -> mac )) {
$this -> mac = strtolower ( preg_replace ( '#[^a-fA-F0-9./]#' , '' , $this -> mac ));
}
}
public function __destruct () {
foreach ( $this as $key => $value ) {
unset ( $this -> $key );
}
}
public function get_domain_uuid () {
return $this -> domain_uuid ;
}
//define the function which checks to see if the mac address exists in devices
private function mac_exists ( $mac ) {
//normalize the mac address
$mac = strtolower ( preg_replace ( '#[^a-fA-F0-9./]#' , '' , $mac ));
//check in the devices table for a specific mac address
$sql = " SELECT count(*) as count FROM v_devices " ;
$sql .= " WHERE device_mac_address=:mac " ;
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
if ( $prep_statement ) {
//$prep_statement->bindParam(':domain_uuid', $domain_uuid);
$prep_statement -> bindParam ( ':mac' , $mac );
$prep_statement -> execute ();
$row = $prep_statement -> fetch ();
$count = $row [ 'count' ];
if ( $row [ 'count' ] > 0 ) {
2017-10-09 07:14:52 +02:00
$mac_exists = true ;
2017-06-13 07:09:36 +02:00
}
else {
2017-10-09 07:14:52 +02:00
$mac_exists = false ;
2017-06-13 07:09:36 +02:00
}
}
else {
2017-10-09 07:14:52 +02:00
$mac_exists = false ;
}
if ( $mac_exists ) {
return true ;
}
else {
2019-01-09 19:25:55 +01:00
return false ;
2017-06-13 07:09:36 +02:00
}
}
//set the mac address in the correct format for the specific vendor
public function format_mac ( $mac , $vendor ) {
switch ( strtolower ( $vendor )) {
case " algo " :
$mac = strtoupper ( $mac );
break ;
case " aastra " :
$mac = strtoupper ( $mac );
break ;
case " cisco " :
$mac = strtoupper ( $mac );
break ;
case " linksys " :
$mac = strtolower ( $mac );
break ;
case " mitel " :
$mac = strtoupper ( $mac );
break ;
case " polycom " :
$mac = strtolower ( $mac );
break ;
case " snom " :
$mac = strtolower ( $mac );
break ;
case " escene " :
$mac = strtolower ( $mac );
break ;
case " grandstream " :
$mac = strtolower ( $mac );
break ;
2017-11-23 02:18:56 +01:00
case " yealink " :
$mac = strtolower ( $mac );
break ;
2018-05-16 03:53:43 +02:00
case " gigaset " :
$mac = strtoupper ( $mac );
break ;
2017-06-13 07:09:36 +02:00
default :
$mac = strtolower ( $mac );
}
return $mac ;
}
2017-12-03 20:24:56 +01:00
//send http error
private function http_error ( $error ) {
if ( $error === " 404 " ) {
header ( " HTTP/1.0 404 Not Found " );
echo " <html> \n " ;
echo " <head><title>404 Not Found</title></head> \n " ;
echo " <body bgcolor= \" white \" > \n " ;
echo " <center><h1>404 Not Found</h1></center> \n " ;
echo " <hr><center>nginx/1.12.1</center> \n " ;
echo " </body> \n " ;
echo " </html> \n " ;
}
exit ();
}
2017-12-03 20:39:25 +01:00
//define a function to check if a contact exists in the contacts array
private function contact_exists ( $contacts , $uuid ) {
if ( is_array ( $contacts [ $uuid ])) {
return true ;
}
else {
return false ;
}
}
2019-06-10 02:44:33 +02:00
private function contact_append ( & $contacts , & $line , $domain_uuid , $device_user_uuid , $is_group ) {
2017-06-13 07:09:36 +02:00
$sql = " select c.contact_uuid, c.contact_organization, c.contact_name_given, c.contact_name_family, " ;
$sql .= " c.contact_type, c.contact_category, p.phone_label, " ;
$sql .= " p.phone_number, p.phone_extension, p.phone_primary " ;
$sql .= " from v_contacts as c, v_contact_phones as p " ;
$sql .= " where c.contact_uuid = p.contact_uuid " ;
$sql .= " and p.phone_type_voice = '1' " ;
$sql .= " and c.domain_uuid = ' $domain_uuid ' " ;
if ( $is_group ) {
$sql .= " and c.contact_uuid in ( " ;
$sql .= " select contact_uuid from v_contact_groups " ;
$sql .= " where group_uuid in ( " ;
2019-02-09 16:26:35 +01:00
$sql .= " select group_uuid from v_user_groups " ;
2017-06-13 07:09:36 +02:00
$sql .= " where user_uuid = ' $device_user_uuid ' " ;
$sql .= " and domain_uuid = ' $domain_uuid ' " ;
$sql .= " )) " ;
}
else {
$sql .= " and c.contact_uuid in ( " ;
$sql .= " select contact_uuid from v_contact_users " ;
$sql .= " where user_uuid = ' $device_user_uuid ' " ;
$sql .= " and domain_uuid = ' $domain_uuid ' " ;
$sql .= " ) " ;
}
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$user_contacts = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
unset ( $prep_statement , $sql );
if ( is_array ( $user_contacts )) {
foreach ( $user_contacts as & $row ) {
$uuid = $row [ 'contact_uuid' ];
$phone_label = strtolower ( $row [ 'phone_label' ]);
$contact_category = strtolower ( $row [ 'contact_category' ]);
$contact = array ();
$contacts [] = & $contact ;
$contact [ 'category' ] = $is_group ? 'groups' : 'users' ;
$contact [ 'contact_uuid' ] = $row [ 'contact_uuid' ];
$contact [ 'contact_type' ] = $row [ 'contact_type' ];
$contact [ 'contact_category' ] = $row [ 'contact_category' ];
$contact [ 'contact_organization' ] = $row [ 'contact_organization' ];
$contact [ 'contact_name_given' ] = $row [ 'contact_name_given' ];
$contact [ 'contact_name_family' ] = $row [ 'contact_name_family' ];
$contact [ 'numbers' ] = array ();
$numbers = & $contact [ 'numbers' ];
if (( $row [ 'phone_primary' ] == '1' ) || ( ! isset ( $contact [ 'phone_number' ]))) {
$contact [ 'phone_label' ] = $phone_label ;
$contact [ 'phone_number' ] = $row [ 'phone_number' ];
$contact [ 'phone_extension' ] = $row [ 'phone_extension' ];
}
$numbers [] = array (
line_number => $line [ 'line_number' ],
phone_label => $phone_label ,
phone_number => $row [ 'phone_number' ],
phone_extension => $row [ 'phone_extension' ],
phone_primary => $row [ 'phone_primary' ],
);
$contact [ 'phone_number_' . $phone_label ] = $row [ 'phone_number' ];
unset ( $contact , $numbers , $uuid , $phone_label );
}
}
}
2019-06-10 02:44:33 +02:00
private function contact_grandstream ( & $contacts , & $line , $domain_uuid , $device_user_uuid ) {
2017-06-13 07:09:36 +02:00
// Get username for this.
$sql = " SELECT username FROM v_users WHERE user_uuid = ' ${ device_user_uuid } ' AND domain_uuid = ' ${ domain_uuid } ' LIMIT 1 " ;
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$my_username = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
unset ( $prep_statement , $sql );
$my_username = $my_username [ 0 ][ 'username' ];
// Global contact groups available to every phone if ['provision']['global_contact_groups']['text'] is set.
// Easier than assigning these common groups to every user.
// Check provision global_contact_groups and sanitize for sql.
$global_contact_groups [ 'enabled' ] = false ;
2019-06-10 02:44:33 +02:00
if ( preg_match ( '/[a-zA-Z0-9-_, ]/' , $_SESSION [ 'provision' ][ 'grandstream_global_contact_groups' ][ 'text' ])) {
2017-06-13 07:09:36 +02:00
$global_contact_groups [ 'enabled' ] = true ;
$gp = array ();
2018-10-12 22:33:05 +02:00
$groups = explode ( ',' , $_SESSION [ 'provision' ][ 'grandstream_global_contact_groups' ][ 'text' ]);
2017-06-13 07:09:36 +02:00
foreach ( $groups as $group ){
$gp [] = trim ( $group );
}
$global_contact_groups [ 'sql' ] = " ' " . implode ( " ',' " , $gp ) . " ' " ;
}
// Get a list of groups the user has access to see.
$sql = " SELECT DISTINCT g.group_uuid, g.group_name, g.group_description " ;
$sql .= " FROM v_groups g " ;
2019-02-09 16:26:35 +01:00
$sql .= " INNER JOIN v_user_groups ug " ;
$sql .= " ON ug.group_uuid = g.group_uuid " ;
2017-06-13 07:09:36 +02:00
$sql .= " INNER JOIN v_contact_groups cg " ;
2019-02-09 16:26:35 +01:00
$sql .= " ON cg.group_uuid = g.group_uuid " ;
$sql .= " WHERE ug.user_uuid = ' $device_user_uuid ' " ;
2019-06-10 02:44:33 +02:00
if ( $global_contact_groups [ 'enabled' ]) {
2017-06-13 07:09:36 +02:00
$sql .= " UNION " ;
$sql .= " SELECT g.group_uuid, g.group_name, g.group_description " ;
$sql .= " FROM v_groups g " ;
$sql .= " WHERE g.group_name IN( " . $global_contact_groups [ 'sql' ] . " ) " ;
}
$sql .= " ORDER BY group_description " ;
2019-06-10 02:44:33 +02:00
//echo $sql."\n\n";
2017-06-13 07:09:36 +02:00
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$user_groups = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
unset ( $prep_statement , $sql );
$key = 0 ;
foreach ( $user_groups as & $row ) {
$contacts [] = array ( " contact_type " => " group " , " group_name " => $row [ 'group_name' ], " group_description " => $row [ 'group_description' ], " id " =>++ $key );
$groups [ $row [ 'group_uuid' ]] = $key ;
2019-06-10 02:44:33 +02:00
$my_groups [] = '@' . $row [ 'group_name' ]; // Used to show/hide
2017-06-13 07:09:36 +02:00
}
// Get a list of contacts that this user/phone has access based on assigned users and groups.
$sql = " SELECT c.contact_uuid, c.contact_name_given, c.contact_name_family, c.contact_title, c.contact_category, c.contact_role, c.contact_organization, u.user_uuid " ;
$sql .= " FROM v_contacts c " ;
$sql .= " LEFT JOIN v_users u " ;
$sql .= " ON c.contact_uuid = u.contact_uuid " ;
$sql .= " WHERE c.contact_uuid IN ( " ; // assigned groups
$sql .= " SELECT cg.contact_uuid " ;
$sql .= " FROM v_contact_groups cg " ;
$sql .= " WHERE cg.group_uuid IN ( " ;
2019-02-09 16:26:35 +01:00
$sql .= " SELECT ug.group_uuid " ;
$sql .= " FROM v_user_groups ug " ;
$sql .= " WHERE ug.user_uuid = ' $device_user_uuid ' " ;
$sql .= " AND ug.domain_uuid = ' $domain_uuid ' " ;
2019-06-10 02:44:33 +02:00
if ( $global_contact_groups [ 'enabled' ]) {
2017-06-13 07:09:36 +02:00
$sql .= " UNION " ;
$sql .= " SELECT g.group_uuid " ;
$sql .= " FROM v_groups g " ;
$sql .= " WHERE g.group_name IN( " . $global_contact_groups [ 'sql' ] . " ) " ;
}
$sql .= " ) " ;
$sql .= " UNION " ; // assigned users
$sql .= " SELECT cu.contact_uuid " ;
$sql .= " FROM v_contact_users cu " ;
$sql .= " WHERE cu.user_uuid = ' $device_user_uuid ' " ;
$sql .= " AND cu.domain_uuid = ' $domain_uuid ' " ;
$sql .= " ) " ;
$sql .= " ORDER BY contact_name_given, contact_name_family " ;
2019-06-10 02:44:33 +02:00
//echo $sql."\n\n";
//exit;
2017-06-13 07:09:36 +02:00
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$user_contacts = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
unset ( $prep_statement , $sql );
$groupid = 0 ;
foreach ( $user_contacts as & $row ) {
$last_extention = $row [ 'extension' ];
unset ( $contact );
// Grandsteam phonebook manager: First, Last, Department, Primary, (Work, Home, Mobile, Fax, Pager, Car... with number and account), email(s), Photo, Ringtone, Group(s)
// GXP21xx serries has First, Last, Company, Department, Job, Job TItle, 1Work ,1Home, 1Mobile, Accounts, Groups(1-many)
$contact = array ();
$contact [ 'contact_type' ] = " contact " ;
$contact [ 'contact_uuid' ] = $row [ 'contact_uuid' ];
$contact [ 'user_uuid' ] = $row [ 'user_uuid' ];
$contact [ 'contact_name_given' ] = $row [ 'contact_name_given' ]; //FirstName
$contact [ 'contact_name_family' ] = $row [ 'contact_name_family' ]; // LastName
$contact [ 'contact_title' ] = $row [ 'contact_title' ];
$contact [ 'contact_category' ] = $row [ 'contact_category' ]; // Department
$contact [ 'contact_role' ] = $row [ 'contact_role' ]; // Job Title
$contact [ 'contact_organization' ] = $row [ 'contact_organization' ]; // Company
$contact [ 'contact_work' ] = $row [ 'extension' ];
//$contact['contact_account_index'] = $line['line_number']; // This was empty so disabled it.
// Look up groups for this contact
$sql = " SELECT g.group_description, g.group_uuid " ;
$sql .= " FROM v_groups g " ;
$sql .= " INNER JOIN v_contact_groups cg " ;
$sql .= " ON cg.group_uuid=g.group_uuid " ;
$sql .= " WHERE cg.contact_uuid = ' " . $row [ 'contact_uuid' ] . " ' " ;
$sql .= " AND cg.domain_uuid = ' $domain_uuid ' " ;
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$user_groups = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
foreach ( $user_groups as $group ){
if ( ! empty ( $groups [ $group [ 'group_uuid' ]])){
$contact [ 'groups' ][] = $groups [ $group [ 'group_uuid' ]];
}
}
if ( empty ( $contact [ 'groups' ]) && ! empty ( $groups [ 'Other' ])){
$contact [ 'groups' ][] = $groups [ 'Other' ];
}
// Look up extention(s) for this contact.
if ( ! empty ( $row [ 'user_uuid' ]) ){
$sql = " SELECT e.extension, e.description " ;
$sql .= " FROM v_extensions e " ;
$sql .= " INNER JOIN v_extension_users eu " ;
$sql .= " ON e.extension_uuid = eu.extension_uuid " ;
$sql .= " WHERE eu.user_uuid = ' " . $row [ 'user_uuid' ] . " ' " ;
$sql .= " AND eu.domain_uuid = ' $domain_uuid ' " ;
$sql .= " AND e.enabled = 'true' " ;
$sql .= " AND e.directory_visible = 'true' " ; # TODO: not right field but it works for our district.
$sql .= " AND e.directory_exten_visible = 'true' " ; # TODO: not right field but it works for our district.
2017-09-05 20:51:34 +02:00
$sql .= " ORDER BY CASE WHEN directory_first_name LIKE '% " . $contact [ 'contact_name_given' ] . " %' THEN 1 ELSE 2 END DESC " ;
2017-06-13 07:09:36 +02:00
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$user_extentions = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
foreach ( $user_extentions as $ext ){
if ( preg_match ( '/ (Cell|Mobile)/i' , $ext [ 'description' ])){
$contact [ 'contact_cell' ] = $ext [ 'extension' ];
} elseif ( preg_match ( " / Home/i " , $ext [ 'description' ])){
$contact [ 'contact_home' ] = $ext [ 'extension' ];
} else {
$contact [ 'contact_work' ] = $ext [ 'extension' ];
}
}
}
// Additional phone numbers for this contact.
$sql = " select phone_number, phone_label, phone_description from v_contact_phones " ;
$sql .= " where contact_uuid=' " . $row [ 'contact_uuid' ] . " ' " ;
$sql .= " and domain_uuid=' " . $domain_uuid . " ' " ;
$sql .= " and phone_type_voice = '1' " ;
$sql .= " and phone_label in ('Home', 'Mobile', 'Work') " ;
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$user_phones = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
unset ( $prep_statement , $sql );
foreach ( $user_phones as $phone ){
// Check permission in phone_description field for string :allow:username1:username2:@group1:@group2:
$show = true ;
if ( preg_match ( '/:allow:/i' , $phone [ 'phone_description' ] )){
$show = false ;
$allows = explode ( ':' , $phone [ 'phone_description' ] );
foreach ( $allows as $allow ){
if ( in_array ( $allow , $my_groups ) || preg_match ( '/^' . $my_username . '$/' , $allow )){
$show = true ;
break 1 ;
}
2019-06-10 02:44:33 +02:00
}
2017-06-13 07:09:36 +02:00
}
if ( $show && $phone [ 'phone_label' ] == " Home " ) {
$contact [ 'contact_home' ] = $phone [ 'phone_number' ];
} elseif ( $show && $phone [ 'phone_label' ] == " Mobile " ){
$contact [ 'contact_cell' ] = $phone [ 'phone_number' ];
} elseif ( $show && $phone [ 'phone_label' ] == " Work " ){
// Work phones are usually just extentions already assigned above.
if ( empty ( $contact [ 'contact_work' ])){
$contact [ 'contact_work' ] = $phone [ 'phone_number' ];
}
}
}
// Only add to contact list if a phone number exists.
if ( ! empty ( $contact [ 'contact_work' ]) || ! empty ( $contact [ 'contact_home' ]) || ! empty ( $contact [ 'contact_cell' ])){
$contacts [] = & $contact ;
}
}
}
public function render () {
//debug
$debug = $_REQUEST [ 'debug' ]; // array
//get the variables
$domain_uuid = $this -> domain_uuid ;
$device_template = $this -> device_template ;
$template_dir = $this -> template_dir ;
$mac = $this -> mac ;
$file = $this -> file ;
//set the mac address to lower case to be consistent with the database
$mac = strtolower ( $mac );
//get the device template
if ( strlen ( $_REQUEST [ 'template' ]) > 0 ) {
$device_template = $_REQUEST [ 'template' ];
$search = array ( '..' , '/./' );
$device_template = str_replace ( $search , " " , $device_template );
$device_template = str_replace ( '//' , '/' , $device_template );
}
//remove ../ and slashes in the file name
$search = array ( '..' , '/' , '\\' , '/./' , '//' );
$file = str_replace ( $search , " " , $file );
//get the domain_name
if ( strlen ( $domain_name ) == 0 ) {
$sql = " SELECT domain_name FROM v_domains " ;
$sql .= " WHERE domain_uuid=:domain_uuid " ;
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
if ( $prep_statement ) {
//use the prepared statement
$prep_statement -> bindParam ( ':domain_uuid' , $domain_uuid );
$prep_statement -> execute ();
$row = $prep_statement -> fetch ();
unset ( $prep_statement );
//set the variables from values in the database
$domain_name = $row [ " domain_name " ];
}
}
//build the provision array
$provision = Array ();
if ( is_array ( $_SESSION [ 'provision' ])) {
foreach ( $_SESSION [ 'provision' ] as $key => $val ) {
if ( strlen ( $val [ 'var' ]) > 0 ) { $value = $val [ 'var' ]; }
if ( strlen ( $val [ 'text' ]) > 0 ) { $value = $val [ 'text' ]; }
if ( strlen ( $val [ 'boolean' ]) > 0 ) { $value = $val [ 'boolean' ]; }
if ( strlen ( $val [ 'numeric' ]) > 0 ) { $value = $val [ 'numeric' ]; }
if ( strlen ( $value ) > 0 ) { $provision [ $key ] = $value ; }
unset ( $value );
}
}
2018-03-18 03:18:01 +01:00
//add the http auth password to the array
if ( is_array ( $_SESSION [ 'provision' ][ " http_auth_password " ])) {
$provision [ " http_auth_password " ] = $_SESSION [ 'provision' ][ " http_auth_password " ][ 0 ];
}
2017-06-13 07:09:36 +02:00
//check to see if the mac_address exists in devices
if ( strlen ( $_REQUEST [ 'user_id' ]) == 0 || strlen ( $_REQUEST [ 'userid' ]) == 0 ) {
if ( $this -> mac_exists ( $mac )) {
2019-08-12 21:34:37 +02:00
2017-06-13 07:09:36 +02:00
//get the device_template
if ( strlen ( $device_template ) == 0 ) {
$sql = " SELECT * FROM v_devices " ;
2019-08-12 21:34:37 +02:00
$sql .= " WHERE device_mac_address = :mac_address " ;
if ( $provision [ 'http_domain_filter' ] == " true " ) {
2017-06-13 07:09:36 +02:00
$sql .= " AND domain_uuid=:domain_uuid " ;
2019-08-12 21:34:37 +02:00
$parameters [ 'domain_uuid' ] = $domain_uuid ;
2017-06-13 07:09:36 +02:00
}
2019-08-12 21:34:37 +02:00
$parameters [ 'mac_address' ] = $mac ;
$database = new database ;
$row = $database -> select ( $sql , $parameters , 'row' );
if ( is_array ( $row ) && sizeof ( $row ) != 0 ) {
2017-06-13 07:09:36 +02:00
//checks either device enabled
if ( $row [ 'device_enabled' ] != 'true' ){
if ( $_SESSION [ 'provision' ][ 'debug' ][ 'boolean' ] == 'true' ){
echo " <br/>device disabled<br/> " ;
}
2017-12-03 20:39:25 +01:00
else {
$this -> http_error ( '404' );
}
2017-06-13 07:09:36 +02:00
exit ;
}
2017-12-14 08:01:44 +01:00
//register that we have seen the device
2017-12-14 17:21:37 +01:00
$sql = " UPDATE v_devices " ;
2017-12-14 08:01:44 +01:00
$sql .= " SET device_provisioned_date=:date, device_provisioned_method=:method, device_provisioned_ip=:ip " ;
$sql .= " WHERE domain_uuid=:domain_uuid AND device_mac_address=:mac " ;
2017-12-14 17:21:37 +01:00
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
2017-12-14 08:01:44 +01:00
if ( $prep_statement ) {
//use the prepared statement
$prep_statement -> bindValue ( ':domain_uuid' , $domain_uuid );
$prep_statement -> bindValue ( ':mac' , strtolower ( $mac ));
$prep_statement -> bindValue ( ':date' , date ( " Y-m-d H:i:s " ));
$prep_statement -> bindValue ( ':method' , ( isset ( $_SERVER [ " HTTPS " ]) ? 'https' : 'http' ));
$prep_statement -> bindValue ( ':ip' , $_SERVER [ 'REMOTE_ADDR' ]);
$prep_statement -> execute ();
unset ( $prep_statement );
}
2017-06-13 07:09:36 +02:00
//set the variables from values in the database
$device_uuid = $row [ " device_uuid " ];
$device_label = $row [ " device_label " ];
if ( strlen ( $row [ " device_vendor " ]) > 0 ) {
$device_vendor = strtolower ( $row [ " device_vendor " ]);
}
$device_user_uuid = $row [ " device_user_uuid " ];
$device_model = $row [ " device_model " ];
$device_firmware_version = $row [ " device_firmware_version " ];
$device_enabled = $row [ " device_enabled " ];
$device_template = $row [ " device_template " ];
$device_profile_uuid = $row [ " device_profile_uuid " ];
$device_description = $row [ " device_description " ];
}
}
//find a template that was defined on another phone and use that as the default.
if ( strlen ( $device_template ) == 0 ) {
$sql = " SELECT * FROM v_devices " ;
$sql .= " WHERE domain_uuid=:domain_uuid " ;
$sql .= " AND device_enabled='true' " ;
$sql .= " limit 1 " ;
2019-08-12 21:34:37 +02:00
$prep_statement_3 = $this -> db -> prepare ( $sql );
2017-06-13 07:09:36 +02:00
if ( $prep_statement_3 ) {
$prep_statement_3 -> bindParam ( ':domain_uuid' , $domain_uuid );
$prep_statement_3 -> execute ();
$row = $prep_statement_3 -> fetch ();
$device_label = $row [ " device_label " ];
$device_vendor = strtolower ( $row [ " device_vendor " ]);
$device_model = $row [ " device_model " ];
$device_firmware_version = $row [ " device_firmware_version " ];
$device_enabled = $row [ " device_enabled " ];
$device_template = $row [ " device_template " ];
$device_profile_uuid = $row [ " device_profile_uuid " ];
$device_description = $row [ " device_description " ];
}
}
}
else {
//use the user_agent to pre-assign a template for 1-hit provisioning. Enter the a unique string to match in the user agent, and the template it should match.
2017-07-29 00:31:26 +02:00
$templates [ 'Linksys/SPA-2102' ] = 'linksys/spa2102' ;
$templates [ 'Linksys/SPA-3102' ] = 'linksys/spa3102' ;
$templates [ 'Linksys/SPA-9212' ] = 'linksys/spa921' ;
$templates [ 'Cisco/SPA301' ] = 'cisco/spa301' ;
$templates [ 'Cisco/SPA301D' ] = 'cisco/spa302d' ;
$templates [ 'Cisco/SPA303' ] = 'cisco/spa303' ;
$templates [ 'Cisco/SPA501G' ] = 'cisco/spa501g' ;
$templates [ 'Cisco/SPA502G' ] = 'cisco/spa502g' ;
$templates [ 'Cisco/SPA504G' ] = 'cisco/spa504g' ;
$templates [ 'Cisco/SPA508G' ] = 'cisco/spa508g' ;
$templates [ 'Cisco/SPA509G' ] = 'cisco/spa509g' ;
$templates [ 'Cisco/SPA512G' ] = 'cisco/spa512g' ;
$templates [ 'Cisco/SPA514G' ] = 'cisco/spa514g' ;
$templates [ 'Cisco/SPA525G2' ] = 'cisco/spa525g2' ;
$templates [ 'snom300-SIP' ] = 'snom/300' ;
$templates [ 'snom320-SIP' ] = 'snom/320' ;
$templates [ 'snom360-SIP' ] = 'snom/360' ;
$templates [ 'snom370-SIP' ] = 'snom/370' ;
$templates [ 'snom820-SIP' ] = 'snom/820' ;
$templates [ 'snom-m3-SIP' ] = 'snom/m3' ;
2018-12-04 08:16:35 +01:00
$templates [ 'Fanvil X6' ] = 'fanvil/x6' ;
$templates [ 'Fanvil i30' ] = 'fanvil/i30' ;
2017-11-24 18:36:09 +01:00
2017-07-29 00:31:26 +02:00
$templates [ 'yealink SIP-CP860' ] = 'yealink/cp860' ;
2019-06-10 02:44:33 +02:00
# $templates['yealink SIP-CP860'] = 'yealink/cp920';
2017-11-24 18:36:09 +01:00
# $templates['yealink SIP-CP860'] = 'yealink/cp960';
2017-07-31 23:11:06 +02:00
$templates [ 'yealink SIP-T19P' ] = 'yealink/t19p' ;
$templates [ 'yealink SIP-T20P' ] = 'yealink/t20p' ;
$templates [ 'yealink SIP-T21P' ] = 'yealink/t21p' ;
$templates [ 'yealink SIP-T22P' ] = 'yealink/t22p' ;
$templates [ 'yealink SIP-T23G' ] = 'yealink/t23g' ;
2017-11-24 18:36:09 +01:00
$templates [ 'yealink SIP-T23P' ] = 'yealink/t23p' ;
2017-07-31 23:11:06 +02:00
$templates [ 'yealink SIP-T26P' ] = 'yealink/t26p' ;
2017-11-24 18:36:09 +01:00
$templates [ 'yealink SIP-T27G' ] = 'yealink/t27g' ;
$templates [ 'Yealink SIP-T29G' ] = 'yealink/t27p' ;
2017-07-31 23:11:06 +02:00
$templates [ 'yealink SIP-T28P' ] = 'yealink/t28p' ;
2017-11-24 18:36:09 +01:00
$templates [ 'Yealink SIP-T29G' ] = 'yealink/t29g' ;
2017-07-31 23:11:06 +02:00
$templates [ 'yealink SIP-T29P' ] = 'yealink/t29p' ;
$templates [ 'Yealink SIP-T32G' ] = 'yealink/t32g' ;
$templates [ 'Yealink SIP-T38G' ] = 'yealink/t38g' ;
$templates [ 'Yealink SIP-T40P' ] = 'yealink/t40p' ;
$templates [ 'Yealink SIP-T41G' ] = 'yealink/t41g' ;
2017-11-24 18:36:09 +01:00
$templates [ 'Yealink SIP-T41P' ] = 'yealink/t41p' ;
2017-07-31 23:11:06 +02:00
$templates [ 'Yealink SIP-T41S' ] = 'yealink/t41s' ;
$templates [ 'Yealink SIP-T42G' ] = 'yealink/t42g' ;
2017-11-24 18:36:09 +01:00
$templates [ 'Yealink SIP-T42S' ] = 'yealink/t42s' ;
2017-07-31 23:11:06 +02:00
$templates [ 'Yealink SIP-T46G' ] = 'yealink/t46g' ;
$templates [ 'Yealink SIP-T46S' ] = 'yealink/t46s' ;
$templates [ 'Yealink SIP-T48G' ] = 'yealink/t48g' ;
$templates [ 'Yealink SIP-T48S' ] = 'yealink/t48s' ;
$templates [ 'Yealink SIP-T49G' ] = 'yealink/t49g' ;
2017-11-24 18:36:09 +01:00
$templates [ 'Yealink SIP-T52S' ] = 'yealink/t52s' ;
$templates [ 'Yealink SIP-T54S' ] = 'yealink/t54s' ;
$templates [ 'Yealink SIP-T56A' ] = 'yealink/t56a' ;
2017-11-26 23:16:55 +01:00
$templates [ 'Yealink SIP-T58' ] = 'yealink/t58v' ;
2017-08-10 17:12:05 +02:00
$templates [ 'VP530P' ] = 'yealink/vp530' ;
2017-07-31 23:11:06 +02:00
$templates [ 'Yealink SIP-W52P' ] = 'yealink/w52p' ;
$templates [ 'Yealink SIP-W56P' ] = 'yealink/w56p' ;
2017-11-24 18:36:09 +01:00
2017-07-29 00:31:26 +02:00
$templates [ 'HW DP750' ] = 'grandstream/dp750' ;
$templates [ 'HW GXP1450' ] = 'grandstream/gxp1450' ;
$templates [ 'HW GXP1628' ] = 'grandstream/gxp16xx' ;
$templates [ 'HW GXP1610' ] = 'grandstream/gxp16xx' ;
$templates [ 'HW GXP1620' ] = 'grandstream/gxp16xx' ;
$templates [ 'HW GXP1625' ] = 'grandstream/gxp16xx' ;
$templates [ 'HW GXP1630' ] = 'grandstream/gxp16xx' ;
$templates [ 'HW GXP2124' ] = 'grandstream/gxp2124' ;
$templates [ 'HW GXP2130' ] = 'grandstream/gxp2130' ;
$templates [ 'HW GXP2135' ] = 'grandstream/gxp2135' ;
$templates [ 'HW GXP2140' ] = 'grandstream/gxp2140' ;
$templates [ 'HW GXP2160' ] = 'grandstream/gxp2160' ;
$templates [ 'HW GXP2170' ] = 'grandstream/gxp2170' ;
$templates [ 'HW GXV3140' ] = 'grandstream/gxv3140' ;
$templates [ 'HW GXV3240' ] = 'grandstream/gxv3240' ;
$templates [ 'HW GXV3175' ] = 'grandstream/gxv3175' ;
2017-07-29 00:47:59 +02:00
$templates [ 'PolycomVVX-VVX_101-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_201-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_300-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_301-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_310-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_311-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_400-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_410-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_500-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_501-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_600-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_601-UA/4' ] = 'polycom/4.x' ;
$templates [ 'PolycomVVX-VVX_101-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_201-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_300-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_301-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_310-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_311-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_400-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_410-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_500-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_501-UA/5' ] = 'polycom/5.x' ;
$templates [ 'PolycomVVX-VVX_600-UA/5' ] = 'polycom/5.x' ;
2019-06-10 02:44:33 +02:00
$templates [ 'PolycomVVX-VVX_601-UA/5' ] = 'polycom/5.x' ;
2017-07-29 00:31:26 +02:00
$templates [ 'Vesa VCS754' ] = 'vtech/vcs754' ;
$templates [ 'Wget/1.11.3' ] = 'konftel/kt300ip' ;
foreach ( $templates as $key => $value ){
2017-06-13 07:09:36 +02:00
if ( stripos ( $_SERVER [ 'HTTP_USER_AGENT' ], $key ) !== false ) {
2017-07-29 00:31:26 +02:00
$device_template = $value ;
2017-06-13 07:09:36 +02:00
break ;
}
}
2017-07-29 00:31:26 +02:00
unset ( $templates );
2017-06-13 07:09:36 +02:00
//mac address does not exist in the table so add it
if ( $_SESSION [ 'provision' ][ 'auto_insert_enabled' ][ 'boolean' ] == " true " and strlen ( $domain_uuid ) > 0 ) {
2018-12-11 23:34:00 +01:00
2018-12-11 23:38:15 +01:00
//get a new primary key
2017-06-13 07:09:36 +02:00
$device_uuid = uuid ();
2018-12-11 23:38:15 +01:00
2018-12-11 23:34:00 +01:00
//prepare the array
$x = 0 ;
$array [ 'devices' ][ $x ][ 'domain_uuid' ] = $domain_uuid ;
$array [ 'devices' ][ $x ][ 'device_uuid' ] = $device_uuid ;
$array [ 'devices' ][ $x ][ 'device_mac_address' ] = $mac ;
$array [ 'devices' ][ $x ][ 'device_vendor' ] = $device_vendor ;
$array [ 'devices' ][ $x ][ 'device_enabled' ] = 'true' ;
$array [ 'devices' ][ $x ][ 'device_template' ] = $device_template ;
$array [ 'devices' ][ $x ][ 'device_description' ] = $_SERVER [ 'HTTP_USER_AGENT' ];
//add the dialplan permission
$p = new permissions ;
$p -> add ( " device_add " , " temp " );
$p -> add ( " device_edit " , " temp " );
//save to the data
$database = new database ;
$database -> app_name = 'devices' ;
$database -> app_uuid = '4efa1a1a-32e7-bf83-534b-6c8299958a8e' ;
if ( strlen ( $device_uuid ) > 0 ) {
$database -> uuid ( $device_uuid );
}
$database -> save ( $array );
$message = $database -> message ;
//remove the temporary permission
$p -> delete ( " device_add " , " temp " );
$p -> delete ( " device_edit " , " temp " );
2017-06-13 07:09:36 +02:00
}
}
}
//alternate device_uuid
2019-08-12 21:34:37 +02:00
if ( strlen ( $device_uuid ) > 0 && is_uuid ( $device_uuid )) {
2017-06-13 07:09:36 +02:00
$sql = " SELECT * FROM v_devices " ;
$sql .= " WHERE device_uuid = ' " . $device_uuid . " ' " ;
$sql .= " AND device_enabled = 'true' " ;
if ( $provision [ 'http_domain_filter' ] == " true " ) {
$sql .= " AND domain_uuid=:domain_uuid " ;
}
$prep_statement_3 = $this -> db -> prepare ( check_sql ( $sql ));
if ( $prep_statement_3 ) {
if ( $provision [ 'http_domain_filter' ] == " true " ) {
$prep_statement_3 -> bindParam ( ':domain_uuid' , $domain_uuid );
}
$prep_statement_3 -> execute ();
$row = $prep_statement_3 -> fetch ();
$device_uuid_alternate = $row [ " device_uuid_alternate " ];
if ( is_uuid ( $device_uuid_alternate )) {
//override the original device_uuid
$device_uuid = $device_uuid_alternate ;
//get the new devices information
$sql = " SELECT * FROM v_devices " ;
$sql .= " WHERE device_uuid = ' " . $device_uuid . " ' " ;
if ( $provision [ 'http_domain_filter' ] == " true " ) {
$sql .= " AND domain_uuid=:domain_uuid " ;
}
$prep_statement_4 = $this -> db -> prepare ( check_sql ( $sql ));
if ( $prep_statement_4 ) {
if ( $provision [ 'http_domain_filter' ] == " true " ) {
$prep_statement_4 -> bindParam ( ':domain_uuid' , $domain_uuid );
}
$prep_statement_4 -> execute ();
$row = $prep_statement_4 -> fetch ();
if ( $row [ " device_enabled " ] == " true " ) {
$device_label = $row [ " device_label " ];
$device_firmware_version = $row [ " device_firmware_version " ];
$device_user_uuid = $row [ " device_user_uuid " ];
$device_enabled = $row [ " device_enabled " ];
//keep the original template
$device_profile_uuid = $row [ " device_profile_uuid " ];
$device_description = $row [ " device_description " ];
}
}
unset ( $prep_statement_4 );
}
}
unset ( $prep_statement_3 );
}
//get the device settings table in the provision category from the profile and update the provision array
if (( strlen ( $device_uuid ) > 0 ) and ( strlen ( $device_profile_uuid ) > 0 )) {
2019-08-15 00:45:51 +02:00
$sql = " SELECT * FROM v_device_profile_settings " ;
2017-06-13 07:09:36 +02:00
$sql .= " WHERE device_profile_uuid = ' " . $device_profile_uuid . " ' " ;
2019-08-15 00:45:51 +02:00
$sql .= " AND profile_setting_enabled = 'true' " ;
2017-06-13 07:09:36 +02:00
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$result = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
$result_count = count ( $result );
if ( is_array ( $result )) {
foreach ( $result as $row ) {
2019-08-15 00:45:51 +02:00
$key = $row [ 'profile_setting_name' ];
$value = $row [ 'profile_setting_value' ];
2017-06-13 07:09:36 +02:00
$provision [ $key ] = $value ;
}
}
unset ( $prep_statement );
}
//get the device settings table in the provision category and update the provision array
if ( strlen ( $device_uuid ) > 0 ) {
$sql = " SELECT * FROM v_device_settings " ;
$sql .= " WHERE device_uuid = ' " . $device_uuid . " ' " ;
$sql .= " AND device_setting_enabled = 'true' " ;
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$result = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
$result_count = count ( $result );
if ( is_array ( $result )) {
foreach ( $result as $row ) {
$key = $row [ 'device_setting_subcategory' ];
$value = $row [ 'device_setting_value' ];
$provision [ $key ] = $value ;
}
}
unset ( $prep_statement );
}
2018-01-22 17:53:30 +01:00
//set the template directory
if ( strlen ( $provision [ " template_dir " ]) > 0 ) {
$template_dir = $provision [ " template_dir " ];
}
//if the domain name directory exists then only use templates from it
if ( is_dir ( $template_dir . '/' . $domain_name )) {
$device_template = $domain_name . '/' . $device_template ;
}
2017-06-13 07:09:36 +02:00
//initialize a template object
$view = new template ();
if ( strlen ( $_SESSION [ 'provision' ][ 'template_engine' ][ 'text' ]) > 0 ) {
$view -> engine = $_SESSION [ 'provision' ][ 'template_engine' ][ 'text' ]; //raintpl, smarty, twig
}
else {
$view -> engine = " smarty " ;
}
$view -> template_dir = $template_dir . " / " . $device_template . " / " ;
$view -> cache_dir = $_SESSION [ 'server' ][ 'temp' ][ 'dir' ];
$view -> init ();
//replace the variables in the template in the future loop through all the line numbers to do a replace for each possible line number
//create a mac address with back slashes for backwards compatability
$mac_dash = substr ( $mac , 0 , 2 ) . '-' . substr ( $mac , 2 , 2 ) . '-' . substr ( $mac , 4 , 2 ) . '-' . substr ( $mac , 6 , 2 ) . '-' . substr ( $mac , 8 , 2 ) . '-' . substr ( $mac , 10 , 2 );
//get the provisioning information from device lines table
if ( strlen ( $device_uuid ) > 0 ) {
//get the device lines array
$sql = " select * from v_device_lines " ;
$sql .= " where device_uuid = ' " . $device_uuid . " ' " ;
$sql .= " and (enabled = 'true' or enabled is null or enabled = '') " ;
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$device_lines = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
2018-09-12 21:59:27 +02:00
2017-06-13 07:09:36 +02:00
//set the variables
if ( is_array ( $device_lines )) {
foreach ( $device_lines as $row ) {
//set the variables
$line_number = $row [ 'line_number' ];
$register_expires = $row [ 'register_expires' ];
$sip_transport = strtolower ( $row [ 'sip_transport' ]);
$sip_port = $row [ 'sip_port' ];
//set defaults
if ( strlen ( $register_expires ) == 0 ) { $register_expires = " 120 " ; }
if ( strlen ( $sip_transport ) == 0 ) { $sip_transport = " tcp " ; }
if ( strlen ( $sip_port ) == 0 ) {
if ( $line_number == " " || $line_number == " 1 " ) {
$sip_port = " 5060 " ;
}
else {
$sip_port = " 506 " . ( $line_number + 1 );
}
}
2019-05-21 18:00:55 +02:00
//convert seconds to minutes for grandstream
if ( $device_vendor == 'grandstream' ) {
$register_expires = round ( $register_expires / 60 );
}
2017-06-13 07:09:36 +02:00
//set a lines array index is the line number
2018-09-12 21:59:27 +02:00
$lines [ $line_number ] = $row ;
2017-06-13 07:09:36 +02:00
$lines [ $line_number ][ 'register_expires' ] = $register_expires ;
$lines [ $line_number ][ 'sip_transport' ] = strtolower ( $sip_transport );
$lines [ $line_number ][ 'sip_port' ] = $sip_port ;
$lines [ $line_number ][ 'server_address' ] = $row [ " server_address " ];
$lines [ $line_number ][ 'outbound_proxy' ] = $row [ " outbound_proxy_primary " ];
2018-09-12 21:59:27 +02:00
$lines [ $line_number ][ 'server' ][ 1 ][ 'address' ] = $row [ " server_address_primary " ];
$lines [ $line_number ][ 'server' ][ 2 ][ 'address' ] = $row [ " server_address_secondary " ];
2017-06-13 07:09:36 +02:00
$lines [ $line_number ][ 'outbound_proxy_primary' ] = $row [ " outbound_proxy_primary " ];
$lines [ $line_number ][ 'outbound_proxy_secondary' ] = $row [ " outbound_proxy_secondary " ];
$lines [ $line_number ][ 'display_name' ] = $row [ " display_name " ];
$lines [ $line_number ][ 'auth_id' ] = $row [ " auth_id " ];
$lines [ $line_number ][ 'user_id' ] = $row [ " user_id " ];
$lines [ $line_number ][ 'password' ] = $row [ " password " ];
2018-10-20 22:18:06 +02:00
$lines [ $line_number ][ 'user_password' ] = $row [ " password " ];
2018-02-04 04:36:56 +01:00
$lines [ $line_number ][ 'shared_line' ] = $row [ " shared_line " ];
2017-06-13 07:09:36 +02:00
//assign the variables for line one - short name
if ( $line_number == " 1 " ) {
$view -> assign ( " server_address " , $row [ " server_address " ]);
$view -> assign ( " outbound_proxy " , $row [ " outbound_proxy_primary " ]);
$view -> assign ( " outbound_proxy_primary " , $row [ " outbound_proxy_primary " ]);
$view -> assign ( " outbound_proxy_secondary " , $row [ " outbound_proxy_secondary " ]);
$view -> assign ( " display_name " , $row [ " display_name " ]);
$view -> assign ( " auth_id " , $row [ " auth_id " ]);
$view -> assign ( " user_id " , $row [ " user_id " ]);
$view -> assign ( " sip_transport " , $sip_transport );
$view -> assign ( " sip_port " , $sip_port );
$view -> assign ( " register_expires " , $register_expires );
2018-02-04 04:36:56 +01:00
$view -> assign ( " shared_line " , $row [ " shared_line " ]);
2017-06-13 07:09:36 +02:00
}
//assign the variables with the line number as part of the name
$view -> assign ( " server_address_ " . $line_number , $row [ " server_address " ]);
$view -> assign ( " outbound_proxy_ " . $line_number , $row [ " outbound_proxy_primary " ]);
$view -> assign ( " outbound_proxy_primary_ " . $line_number , $row [ " outbound_proxy_primary " ]);
$view -> assign ( " outbound_proxy_secondary_ " . $line_number , $row [ " outbound_proxy_secondary " ]);
$view -> assign ( " display_name_ " . $line_number , $row [ " display_name " ]);
$view -> assign ( " auth_id_ " . $line_number , $row [ " auth_id " ]);
$view -> assign ( " user_id_ " . $line_number , $row [ " user_id " ]);
$view -> assign ( " user_password_ " . $line_number , $row [ " password " ]);
$view -> assign ( " sip_transport_ " . $line_number , $sip_transport );
$view -> assign ( " sip_port_ " . $line_number , $sip_port );
$view -> assign ( " register_expires_ " . $line_number , $register_expires );
2018-02-04 04:36:56 +01:00
$view -> assign ( " shared_line_ " . $line_number , $row [ " shared_line " ]);
2017-06-13 07:09:36 +02:00
}
}
unset ( $prep_statement );
}
2018-10-19 20:15:49 +02:00
//assign the arrays
2018-09-12 21:59:27 +02:00
$view -> assign ( " lines " , $lines );
$view -> assign ( " account " , $lines );
2018-10-19 20:15:49 +02:00
$view -> assign ( " user " , $lines );
2018-09-12 21:59:27 +02:00
2017-06-13 07:09:36 +02:00
//get the list of contact directly assigned to the user
if ( strlen ( $device_user_uuid ) > 0 and strlen ( $domain_uuid ) > 0 ) {
//get the contacts assigned to the groups and add to the contacts array
if ( $_SESSION [ 'provision' ][ 'contact_groups' ][ 'boolean' ] == " true " ) {
$this -> contact_append ( $contacts , $line , $domain_uuid , $device_user_uuid , true );
}
//get the contacts assigned to the user and add to the contacts array
if ( $_SESSION [ 'provision' ][ 'contact_users' ][ 'boolean' ] == " true " ) {
$this -> contact_append ( $contacts , $line , $domain_uuid , $device_user_uuid , false );
}
2019-06-10 02:44:33 +02:00
//get the contacts assigned to the user and groups and add to the contacts array
2018-10-12 22:33:05 +02:00
if ( $_SESSION [ 'provision' ][ 'contact_grandstream' ][ 'boolean' ] == " true " ) {
2017-06-13 07:09:36 +02:00
$this -> contact_grandstream ( $contacts , $line , $domain_uuid , $device_user_uuid );
}
}
//get the extensions and add them to the contacts array
if ( strlen ( $device_uuid ) > 0 and strlen ( $domain_uuid ) > 0 and $_SESSION [ 'provision' ][ 'contact_extensions' ][ 'boolean' ] == " true " ) {
//get contacts from the database
2017-06-21 18:50:33 +02:00
$sql = " select extension_uuid as contact_uuid, directory_first_name, directory_last_name, " ;
2017-06-13 07:09:36 +02:00
$sql .= " effective_caller_id_name, effective_caller_id_number, " ;
2019-07-02 22:44:04 +02:00
$sql .= " number_alias, extension, call_group " ;
2017-06-13 07:09:36 +02:00
$sql .= " from v_extensions " ;
$sql .= " where domain_uuid = ' " . $domain_uuid . " ' " ;
$sql .= " and enabled = 'true' " ;
2017-08-03 00:31:20 +02:00
$sql .= " and directory_visible = 'true' " ;
2017-06-13 07:09:36 +02:00
$sql .= " order by number_alias, extension asc " ;
$prep_statement = $this -> db -> prepare ( $sql );
if ( $prep_statement ) {
$prep_statement -> execute ();
$extensions = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
if ( is_array ( $extensions )) {
foreach ( $extensions as $row ) {
//get the contact_uuid
$uuid = $row [ 'contact_uuid' ];
//get the names
2017-06-21 18:44:59 +02:00
if ( strlen ( $row [ 'directory_first_name' ]) > 0 ) {
$contact_name_given = $row [ 'directory_first_name' ];
$contact_name_family = $row [ 'directory_last_name' ];
2017-06-13 07:09:36 +02:00
} else {
$name_array = explode ( " " , $row [ 'effective_caller_id_name' ]);
2017-06-21 18:44:59 +02:00
$contact_name_given = array_shift ( $name_array );
$contact_name_family = trim ( implode ( ' ' , $name_array ));
2017-06-13 07:09:36 +02:00
}
2017-06-21 18:44:59 +02:00
2017-06-13 07:09:36 +02:00
//get the phone_extension
if ( is_numeric ( $row [ 'extension' ])) {
$phone_extension = $row [ 'extension' ];
}
else {
$phone_extension = $row [ 'number_alias' ];
}
//save the contact array values
$contacts [ $uuid ][ 'category' ] = 'extensions' ;
$contacts [ $uuid ][ 'contact_uuid' ] = $row [ 'contact_uuid' ];
$contacts [ $uuid ][ 'contact_category' ] = 'extensions' ;
$contacts [ $uuid ][ 'contact_name_given' ] = $contact_name_given ;
$contacts [ $uuid ][ 'contact_name_family' ] = $contact_name_family ;
$contacts [ $uuid ][ 'phone_extension' ] = $phone_extension ;
2019-07-02 22:44:04 +02:00
$contacts [ $uuid ][ 'call_group' ] = $row [ 'call_group' ];
2017-06-13 07:09:36 +02:00
//unset the variables
unset ( $name_array , $contact_name_given , $contact_name_family , $phone_extension );
}
}
}
}
//assign the contacts array to the template
if ( is_array ( $contacts )) {
$view -> assign ( " contacts " , $contacts );
unset ( $contacts );
}
//get the provisioning information from device keys
2017-11-17 22:30:26 +01:00
if ( isset ( $device_uuid )) {
2017-06-13 07:09:36 +02:00
2019-08-15 00:45:51 +02:00
//get the device profile keys
2019-08-15 22:25:56 +02:00
if ( isset ( $device_profile_uuid ) && is_uuid ( $device_profile_uuid )) {
$sql = " SELECT " ;
$sql .= " profile_key_id as device_key_id, " ;
$sql .= " profile_key_category as device_key_category, " ;
$sql .= " profile_key_vendor as device_key_vendor, " ;
$sql .= " profile_key_type as device_key_type, " ;
$sql .= " profile_key_line as device_key_line, " ;
$sql .= " profile_key_value as device_key_value, " ;
$sql .= " profile_key_extension as device_key_extension, " ;
$sql .= " profile_key_protected as device_key_protected, " ;
$sql .= " profile_key_label as device_key_label, " ;
$sql .= " profile_key_icon as device_key_icon " ;
$sql .= " FROM v_device_profile_keys " ;
$sql .= " WHERE device_profile_uuid = ' " . $device_profile_uuid . " ' " ;
if ( strtolower ( $device_vendor ) == 'escene' ){
$sql .= " AND (lower(profile_key_vendor) = 'escene' or lower(profile_key_vendor) = 'escene programmable' or profile_key_vendor is null) " ;
}
else {
$sql .= " AND (lower(profile_key_vendor) = ' " . $device_vendor . " ' or profile_key_vendor is null) " ;
}
$sql .= " ORDER BY " ;
$sql .= " profile_key_vendor ASC, " ;
$sql .= " CASE profile_key_category " ;
$sql .= " WHEN 'line' THEN 1 " ;
$sql .= " WHEN 'memory' THEN 2 " ;
$sql .= " WHEN 'programmable' THEN 3 " ;
$sql .= " WHEN 'expansion' THEN 4 " ;
$sql .= " ELSE 100 END, " ;
if ( $GLOBALS [ 'db_type' ] == " mysql " ) {
$sql .= " profile_key_id ASC " ;
}
else {
$sql .= " CAST(profile_key_id as numeric) ASC " ;
}
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$keys = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
//add the profile keys to the device keys array
if ( is_array ( $keys )) {
foreach ( $keys as $row ) {
//set the variables
$id = $row [ 'device_key_id' ];
$category = $row [ 'device_key_category' ];
//build the device keys array
$device_keys [ $category ][ $id ] = $row ;
$device_keys [ $category ][ $id ][ 'device_key_owner' ] = " profile " ;
//kept temporarily for backwards comptability to allow custom templates to be updated
$device_keys [ $id ] = $row ;
$device_keys [ $id ][ 'device_key_owner' ] = " profile " ;
}
2019-08-15 00:45:51 +02:00
}
2019-08-15 22:25:56 +02:00
unset ( $keys );
2017-06-13 07:09:36 +02:00
}
2019-08-15 00:45:51 +02:00
//get the device keys
$sql = " SELECT * FROM v_device_keys " ;
$sql .= " WHERE device_uuid = ' " . $device_uuid . " ' " ;
2017-06-13 07:09:36 +02:00
if ( strtolower ( $device_vendor ) == 'escene' ){
$sql .= " AND (lower(device_key_vendor) = 'escene' or lower(device_key_vendor) = 'escene programmable' or device_key_vendor is null) " ;
}
else {
$sql .= " AND (lower(device_key_vendor) = ' " . $device_vendor . " ' or device_key_vendor is null) " ;
}
$sql .= " ORDER BY " ;
$sql .= " device_key_vendor ASC, " ;
$sql .= " CASE device_key_category " ;
$sql .= " WHEN 'line' THEN 1 " ;
$sql .= " WHEN 'memory' THEN 2 " ;
$sql .= " WHEN 'programmable' THEN 3 " ;
$sql .= " WHEN 'expansion' THEN 4 " ;
$sql .= " ELSE 100 END, " ;
if ( $GLOBALS [ 'db_type' ] == " mysql " ) {
2019-08-15 00:45:51 +02:00
$sql .= " device_key_id ASC " ;
2017-06-13 07:09:36 +02:00
}
else {
2019-08-15 00:45:51 +02:00
$sql .= " CAST(device_key_id as numeric) ASC " ;
2017-06-13 07:09:36 +02:00
}
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$keys = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
2019-08-15 00:45:51 +02:00
//override profile keys with the device keys
2017-06-13 07:09:36 +02:00
if ( is_array ( $keys )) {
foreach ( $keys as $row ) {
//set the variables
$id = $row [ 'device_key_id' ];
$category = $row [ 'device_key_category' ];
//build the device keys array
$device_keys [ $category ][ $id ] = $row ;
2019-08-15 00:45:51 +02:00
$device_keys [ $category ][ $id ][ 'device_key_owner' ] = " device " ;
2019-08-15 21:39:55 +02:00
//kept temporarily for backwards comptability to allow custom templates to be updated
$device_keys [ $id ] = $row ;
$device_keys [ $id ][ 'device_key_owner' ] = " device " ;
2017-06-13 07:09:36 +02:00
}
}
unset ( $keys );
}
//debug information
if ( $debug == " array " ) {
echo " <pre> \n " ;
print_r ( $device_keys );
echo " <pre> \n " ;
exit ;
}
//set the variables key and values
$x = 1 ;
$variables [ 'domain_name' ] = $domain_name ;
$variables [ 'user_id' ] = $lines [ $x ][ 'user_id' ];
$variables [ 'auth_id' ] = $lines [ $x ][ 'auth_id' ];
$variables [ 'extension' ] = $lines [ $x ][ 'extension' ];
//$variables['password'] = $lines[$x]['password'];
$variables [ 'register_expires' ] = $lines [ $x ][ 'register_expires' ];
$variables [ 'sip_transport' ] = $lines [ $x ][ 'sip_transport' ];
$variables [ 'sip_port' ] = $lines [ $x ][ 'sip_port' ];
$variables [ 'server_address' ] = $lines [ $x ][ 'server_address' ];
$variables [ 'outbound_proxy' ] = $lines [ $x ][ 'outbound_proxy_primary' ];
$variables [ 'outbound_proxy_primary' ] = $lines [ $x ][ 'outbound_proxy_primary' ];
$variables [ 'outbound_proxy_secondary' ] = $lines [ $x ][ 'outbound_proxy_secondary' ];
$variables [ 'display_name' ] = $lines [ $x ][ 'display_name' ];
//update the device keys by replacing variables with their values
foreach ( $variables as $name => $value ) {
if ( is_array ( $device_keys )) {
foreach ( $device_keys as $k => $field ) {
if ( strlen ( $field [ 'device_key_uuid' ]) > 0 ) {
$device_keys [ $k ][ 'device_key_value' ] = str_replace ( " \$ { " . $name . " } " , $value , $field [ 'device_key_value' ]);
$device_keys [ $k ][ 'device_key_extension' ] = str_replace ( " \$ { " . $name . " } " , $value , $field [ 'device_key_extension' ]);
$device_keys [ $k ][ 'device_key_label' ] = str_replace ( " \$ { " . $name . " } " , $value , $field [ 'device_key_label' ]);
2019-06-10 02:44:33 +02:00
$device_keys [ $k ][ 'device_key_icon' ] = str_replace ( " \$ { " . $name . " } " , $value , $field [ 'device_key_icon' ]);
2017-06-13 07:09:36 +02:00
}
else {
if ( is_array ( $field )) {
foreach ( $field as $key => $row ) {
$device_keys [ $k ][ $key ][ 'device_key_value' ] = str_replace ( " \$ { " . $name . " } " , $value , $row [ 'device_key_value' ]);
$device_keys [ $k ][ $key ][ 'device_key_extension' ] = str_replace ( " \$ { " . $name . " } " , $value , $row [ 'device_key_extension' ]);
$device_keys [ $k ][ $key ][ 'device_key_label' ] = str_replace ( " \$ { " . $name . " } " , $value , $row [ 'device_key_label' ]);
2019-06-10 02:44:33 +02:00
$device_keys [ $k ][ $key ][ 'device_key_icon' ] = str_replace ( " \$ { " . $name . " } " , $value , $row [ 'device_key_icon' ]);
2017-06-13 07:09:36 +02:00
}
}
}
}
}
}
//assign the keys array
$view -> assign ( " keys " , $device_keys );
//set the variables
$types = array ( " line " , " memory " , " expansion " , " programmable " );
foreach ( $types as $type ) {
if ( is_array ( $device_keys [ $type ])) {
foreach ( $device_keys [ $type ] as $row ) {
//set the variables
$device_key_category = $row [ 'device_key_category' ];
$device_key_id = $row [ 'device_key_id' ]; //1
$device_key_type = $row [ 'device_key_type' ]; //line
$device_key_line = $row [ 'device_key_line' ];
$device_key_value = $row [ 'device_key_value' ]; //1
$device_key_extension = $row [ 'device_key_extension' ];
$device_key_label = $row [ 'device_key_label' ]; //label
Add device key icon for dss programming (#3896)
* Expand Fanvil DSS-Key support for templating
* Add DSS key programming to Fanvil X6
* Add device key icon support.
* Additional device key icon fixes
* Fix SQL for device_key_label
* Add device_key_icon varible to X6 dss key programming
* Add new Advanced SIP Var (#3859)
Add the following advanced SIP variable. Disabling this allows Yealink phones to display the SIP error reason in the format sent by the carrier rather than Q.850 format e.g. "User Busy" rather than "NORMAL_CLEARING"
sip.call_fail_use_reason.enable = {$yealink_sip_call_fail_use_reason_enable}
* Variables for DP750 Handset Assignment, Ring Type (#3772)
New variables for the DP750 to allow the following settings:
$grandstream_repeater_mode_enable
(Enables or disables repeater mode on DP750 base)
$grandstream_hanging_group_mode
(Allows users to set hanging group mode (e.g. ring handsets at the same time, sequentially, etc.)
$grandstream_handset_X_line_Y_enable
(Allows setting of handset to line assignment)
* Update app_config.php
* Update 520_follow_me_bridge.xml (#3893)
Search through all SIP Profiles when looking up the Contact.
* Update xml_cdr_delete.php (#3891)
Fix typo in delete() query
* Make storage_path and storage_type = http_cache work (#3892)
* Make storage_path work
if storage_path was set, the script would fail. I have fixed it by removing the references to unset variables. I also made the recordings use the path.
* Update ivr.conf.lua
Add storage_path definition so storage_type of http_cache works correctly
* Fix IVR (#3898)
IVR was broken after previous update/change.
* Add Fanvil one-hit privisioning support for X6 and i30 devices (#3894)
* Update directory.xml
* Update directory.xml
* Update directory.xml
* Update directory.xml
* Update directory.xml (#3931)
* Update directory.xml (#3929)
* Update directory.xml (#3928)
* Update directory.xml (#3930)
* Update directory.xml (#3927)
* Update directory.xml (#3924)
* Update directory.xml (#3922)
* Update directory.xml (#3921)
* Update directory.xml (#3923)
* Update directory.xml (#3926)
* Update directory.xml (#3925)
* Update directory.xml (#3920)
* Update directory.xml (#3916)
* Update directory.xml (#3906)
* Update directory.xml (#3919)
* Update directory.xml (#3918)
* Update directory.xml (#3917)
* Update directory.xml (#3915)
* Update directory.xml (#3914)
* Update directory.xml (#3912)
* Update directory.xml (#3911)
* Update directory.xml (#3910)
* Update directory.xml (#3909)
* Update directory.xml (#3913)
* Update directory.xml (#3908)
* Update directory.xml (#3901)
* Update directory.xml (#3902)
* Update directory.xml (#3904)
* Update directory.xml (#3907)
* Update directory.xml (#3905)
* Update directory.xml (#3903)
* Update extensions.php
* Update domains.php
* Update dialplans.php
* Update users.php
* Update click_to_call.php
* Update app_config.php
* Update app_languages.php
* Update dialplan_edit.php
* Show enabled extension only on operator panel (#3900)
Add e.enabled = 'true' to SQL where and show only enabled extensions on the operator panel.
* Add new default_settings for Fanvil products (#3895)
* Add new default_settings for Fanvil products
* Set setting names too lowercase.
* Add additional firmware auto upgrade options
* Add intial Fanvil i30 device support (#3897)
* Update app_config.php
* Update dialplan.php (#3934)
Adds the ability to set "dialplan_destination" db field from Upgrade App Defaults and xml dialplan templates.
* Update dialplan.php
* Fanvil x6 template (#3936)
* Allow Fanvil x6 template to dynamically provision DSS memory and expansion keys
* Expand Fanvil X6 template options to match latest firmware. Use more FusionPBX default settings.
* Remove TR069 CPE serial number from template
* Have template use the 'admin_name' and 'admin_pass' default settings for admin webui login
* Fanvil i30 template fixes (#3933)
* Make varible names lowercase. follows cf76c39e977eaadc3cd1fb5d5160f432ce4e1486
* Additional i30 fixs around FusionPBX and feature enhancements.
* Add dynamic memory key programming
* Add support for configuring time to leave switch relay open on i-series devices
* Add OSD parameters, fix egs_syslog, protect RTSP streams by default
* Fix Fanvil 'Memory' keys (#3932)
* Expand Fanvil DSS-Key support for templating
* Fanvil vendor key fixes.
* Fanvil - Edit device keys to type 'memory' only
* Add Fanvil SpeedDial memory key support
* Update recordings.lua (#3937)
Bug fix. Allow for nil and blank entries.
* Add DSS key programming to Fanvil X6
* Fanvil 'icon' key for dss key profiles
* Fanvil 'icon' key for dss key profiles
Add new Advanced SIP Var (#3859)
Add the following advanced SIP variable. Disabling this allows Yealink phones to display the SIP error reason in the format sent by the carrier rather than Q.850 format e.g. "User Busy" rather than "NORMAL_CLEARING"
sip.call_fail_use_reason.enable = {$yealink_sip_call_fail_use_reason_enable}
Variables for DP750 Handset Assignment, Ring Type (#3772)
New variables for the DP750 to allow the following settings:
$grandstream_repeater_mode_enable
(Enables or disables repeater mode on DP750 base)
$grandstream_hanging_group_mode
(Allows users to set hanging group mode (e.g. ring handsets at the same time, sequentially, etc.)
$grandstream_handset_X_line_Y_enable
(Allows setting of handset to line assignment)
Update app_config.php
Update 520_follow_me_bridge.xml (#3893)
Search through all SIP Profiles when looking up the Contact.
Update xml_cdr_delete.php (#3891)
Fix typo in delete() query
Make storage_path and storage_type = http_cache work (#3892)
* Make storage_path work
if storage_path was set, the script would fail. I have fixed it by removing the references to unset variables. I also made the recordings use the path.
* Update ivr.conf.lua
Add storage_path definition so storage_type of http_cache works correctly
Fix IVR (#3898)
IVR was broken after previous update/change.
Add Fanvil one-hit privisioning support for X6 and i30 devices (#3894)
Update directory.xml
Update directory.xml
Update directory.xml
Update directory.xml
Update directory.xml (#3931)
Update directory.xml (#3929)
Update directory.xml (#3928)
Update directory.xml (#3930)
Update directory.xml (#3927)
Update directory.xml (#3924)
Update directory.xml (#3922)
Update directory.xml (#3921)
Update directory.xml (#3923)
Update directory.xml (#3926)
Update directory.xml (#3925)
Update directory.xml (#3920)
Update directory.xml (#3916)
Update directory.xml (#3906)
Update directory.xml (#3919)
Update directory.xml (#3918)
Update directory.xml (#3917)
Update directory.xml (#3915)
Update directory.xml (#3914)
Update directory.xml (#3912)
Update directory.xml (#3911)
Update directory.xml (#3910)
Update directory.xml (#3909)
Update directory.xml (#3913)
Update directory.xml (#3908)
Update directory.xml (#3901)
Update directory.xml (#3902)
Update directory.xml (#3904)
Update directory.xml (#3907)
Update directory.xml (#3905)
Update directory.xml (#3903)
Update extensions.php
Update domains.php
Update dialplans.php
Update users.php
Update click_to_call.php
Update app_config.php
Update app_languages.php
Update dialplan_edit.php
Show enabled extension only on operator panel (#3900)
Add e.enabled = 'true' to SQL where and show only enabled extensions on the operator panel.
Add new default_settings for Fanvil products (#3895)
* Add new default_settings for Fanvil products
* Set setting names too lowercase.
* Add additional firmware auto upgrade options
Update app_config.php
Update dialplan.php (#3934)
Adds the ability to set "dialplan_destination" db field from Upgrade App Defaults and xml dialplan templates.
Update dialplan.php
Fanvil x6 template (#3936)
* Allow Fanvil x6 template to dynamically provision DSS memory and expansion keys
* Expand Fanvil X6 template options to match latest firmware. Use more FusionPBX default settings.
* Remove TR069 CPE serial number from template
* Have template use the 'admin_name' and 'admin_pass' default settings for admin webui login
Fanvil i30 template fixes (#3933)
* Make varible names lowercase. follows cf76c39e977eaadc3cd1fb5d5160f432ce4e1486
* Additional i30 fixs around FusionPBX and feature enhancements.
* Add dynamic memory key programming
* Add support for configuring time to leave switch relay open on i-series devices
* Add OSD parameters, fix egs_syslog, protect RTSP streams by default
Fix Fanvil 'Memory' keys (#3932)
* Expand Fanvil DSS-Key support for templating
* Fanvil vendor key fixes.
* Fanvil - Edit device keys to type 'memory' only
* Add Fanvil SpeedDial memory key support
Update recordings.lua (#3937)
Bug fix. Allow for nil and blank entries.
Add DSS key programming to Fanvil X6
* resync3
2018-12-12 18:08:21 +01:00
$device_key_icon = $row [ 'device_key_icon' ]; //icon
2017-06-13 07:09:36 +02:00
//add general variables
$device_key_value = str_replace ( " \$ { domain_name} " , $domain_name , $device_key_value );
$device_key_extension = str_replace ( " \$ { domain_name} " , $domain_name , $device_key_extension );
$device_key_label = str_replace ( " \$ { domain_name} " , $domain_name , $device_key_label );
Add device key icon for dss programming (#3896)
* Expand Fanvil DSS-Key support for templating
* Add DSS key programming to Fanvil X6
* Add device key icon support.
* Additional device key icon fixes
* Fix SQL for device_key_label
* Add device_key_icon varible to X6 dss key programming
* Add new Advanced SIP Var (#3859)
Add the following advanced SIP variable. Disabling this allows Yealink phones to display the SIP error reason in the format sent by the carrier rather than Q.850 format e.g. "User Busy" rather than "NORMAL_CLEARING"
sip.call_fail_use_reason.enable = {$yealink_sip_call_fail_use_reason_enable}
* Variables for DP750 Handset Assignment, Ring Type (#3772)
New variables for the DP750 to allow the following settings:
$grandstream_repeater_mode_enable
(Enables or disables repeater mode on DP750 base)
$grandstream_hanging_group_mode
(Allows users to set hanging group mode (e.g. ring handsets at the same time, sequentially, etc.)
$grandstream_handset_X_line_Y_enable
(Allows setting of handset to line assignment)
* Update app_config.php
* Update 520_follow_me_bridge.xml (#3893)
Search through all SIP Profiles when looking up the Contact.
* Update xml_cdr_delete.php (#3891)
Fix typo in delete() query
* Make storage_path and storage_type = http_cache work (#3892)
* Make storage_path work
if storage_path was set, the script would fail. I have fixed it by removing the references to unset variables. I also made the recordings use the path.
* Update ivr.conf.lua
Add storage_path definition so storage_type of http_cache works correctly
* Fix IVR (#3898)
IVR was broken after previous update/change.
* Add Fanvil one-hit privisioning support for X6 and i30 devices (#3894)
* Update directory.xml
* Update directory.xml
* Update directory.xml
* Update directory.xml
* Update directory.xml (#3931)
* Update directory.xml (#3929)
* Update directory.xml (#3928)
* Update directory.xml (#3930)
* Update directory.xml (#3927)
* Update directory.xml (#3924)
* Update directory.xml (#3922)
* Update directory.xml (#3921)
* Update directory.xml (#3923)
* Update directory.xml (#3926)
* Update directory.xml (#3925)
* Update directory.xml (#3920)
* Update directory.xml (#3916)
* Update directory.xml (#3906)
* Update directory.xml (#3919)
* Update directory.xml (#3918)
* Update directory.xml (#3917)
* Update directory.xml (#3915)
* Update directory.xml (#3914)
* Update directory.xml (#3912)
* Update directory.xml (#3911)
* Update directory.xml (#3910)
* Update directory.xml (#3909)
* Update directory.xml (#3913)
* Update directory.xml (#3908)
* Update directory.xml (#3901)
* Update directory.xml (#3902)
* Update directory.xml (#3904)
* Update directory.xml (#3907)
* Update directory.xml (#3905)
* Update directory.xml (#3903)
* Update extensions.php
* Update domains.php
* Update dialplans.php
* Update users.php
* Update click_to_call.php
* Update app_config.php
* Update app_languages.php
* Update dialplan_edit.php
* Show enabled extension only on operator panel (#3900)
Add e.enabled = 'true' to SQL where and show only enabled extensions on the operator panel.
* Add new default_settings for Fanvil products (#3895)
* Add new default_settings for Fanvil products
* Set setting names too lowercase.
* Add additional firmware auto upgrade options
* Add intial Fanvil i30 device support (#3897)
* Update app_config.php
* Update dialplan.php (#3934)
Adds the ability to set "dialplan_destination" db field from Upgrade App Defaults and xml dialplan templates.
* Update dialplan.php
* Fanvil x6 template (#3936)
* Allow Fanvil x6 template to dynamically provision DSS memory and expansion keys
* Expand Fanvil X6 template options to match latest firmware. Use more FusionPBX default settings.
* Remove TR069 CPE serial number from template
* Have template use the 'admin_name' and 'admin_pass' default settings for admin webui login
* Fanvil i30 template fixes (#3933)
* Make varible names lowercase. follows cf76c39e977eaadc3cd1fb5d5160f432ce4e1486
* Additional i30 fixs around FusionPBX and feature enhancements.
* Add dynamic memory key programming
* Add support for configuring time to leave switch relay open on i-series devices
* Add OSD parameters, fix egs_syslog, protect RTSP streams by default
* Fix Fanvil 'Memory' keys (#3932)
* Expand Fanvil DSS-Key support for templating
* Fanvil vendor key fixes.
* Fanvil - Edit device keys to type 'memory' only
* Add Fanvil SpeedDial memory key support
* Update recordings.lua (#3937)
Bug fix. Allow for nil and blank entries.
* Add DSS key programming to Fanvil X6
* Fanvil 'icon' key for dss key profiles
* Fanvil 'icon' key for dss key profiles
Add new Advanced SIP Var (#3859)
Add the following advanced SIP variable. Disabling this allows Yealink phones to display the SIP error reason in the format sent by the carrier rather than Q.850 format e.g. "User Busy" rather than "NORMAL_CLEARING"
sip.call_fail_use_reason.enable = {$yealink_sip_call_fail_use_reason_enable}
Variables for DP750 Handset Assignment, Ring Type (#3772)
New variables for the DP750 to allow the following settings:
$grandstream_repeater_mode_enable
(Enables or disables repeater mode on DP750 base)
$grandstream_hanging_group_mode
(Allows users to set hanging group mode (e.g. ring handsets at the same time, sequentially, etc.)
$grandstream_handset_X_line_Y_enable
(Allows setting of handset to line assignment)
Update app_config.php
Update 520_follow_me_bridge.xml (#3893)
Search through all SIP Profiles when looking up the Contact.
Update xml_cdr_delete.php (#3891)
Fix typo in delete() query
Make storage_path and storage_type = http_cache work (#3892)
* Make storage_path work
if storage_path was set, the script would fail. I have fixed it by removing the references to unset variables. I also made the recordings use the path.
* Update ivr.conf.lua
Add storage_path definition so storage_type of http_cache works correctly
Fix IVR (#3898)
IVR was broken after previous update/change.
Add Fanvil one-hit privisioning support for X6 and i30 devices (#3894)
Update directory.xml
Update directory.xml
Update directory.xml
Update directory.xml
Update directory.xml (#3931)
Update directory.xml (#3929)
Update directory.xml (#3928)
Update directory.xml (#3930)
Update directory.xml (#3927)
Update directory.xml (#3924)
Update directory.xml (#3922)
Update directory.xml (#3921)
Update directory.xml (#3923)
Update directory.xml (#3926)
Update directory.xml (#3925)
Update directory.xml (#3920)
Update directory.xml (#3916)
Update directory.xml (#3906)
Update directory.xml (#3919)
Update directory.xml (#3918)
Update directory.xml (#3917)
Update directory.xml (#3915)
Update directory.xml (#3914)
Update directory.xml (#3912)
Update directory.xml (#3911)
Update directory.xml (#3910)
Update directory.xml (#3909)
Update directory.xml (#3913)
Update directory.xml (#3908)
Update directory.xml (#3901)
Update directory.xml (#3902)
Update directory.xml (#3904)
Update directory.xml (#3907)
Update directory.xml (#3905)
Update directory.xml (#3903)
Update extensions.php
Update domains.php
Update dialplans.php
Update users.php
Update click_to_call.php
Update app_config.php
Update app_languages.php
Update dialplan_edit.php
Show enabled extension only on operator panel (#3900)
Add e.enabled = 'true' to SQL where and show only enabled extensions on the operator panel.
Add new default_settings for Fanvil products (#3895)
* Add new default_settings for Fanvil products
* Set setting names too lowercase.
* Add additional firmware auto upgrade options
Update app_config.php
Update dialplan.php (#3934)
Adds the ability to set "dialplan_destination" db field from Upgrade App Defaults and xml dialplan templates.
Update dialplan.php
Fanvil x6 template (#3936)
* Allow Fanvil x6 template to dynamically provision DSS memory and expansion keys
* Expand Fanvil X6 template options to match latest firmware. Use more FusionPBX default settings.
* Remove TR069 CPE serial number from template
* Have template use the 'admin_name' and 'admin_pass' default settings for admin webui login
Fanvil i30 template fixes (#3933)
* Make varible names lowercase. follows cf76c39e977eaadc3cd1fb5d5160f432ce4e1486
* Additional i30 fixs around FusionPBX and feature enhancements.
* Add dynamic memory key programming
* Add support for configuring time to leave switch relay open on i-series devices
* Add OSD parameters, fix egs_syslog, protect RTSP streams by default
Fix Fanvil 'Memory' keys (#3932)
* Expand Fanvil DSS-Key support for templating
* Fanvil vendor key fixes.
* Fanvil - Edit device keys to type 'memory' only
* Add Fanvil SpeedDial memory key support
Update recordings.lua (#3937)
Bug fix. Allow for nil and blank entries.
Add DSS key programming to Fanvil X6
* resync3
2018-12-12 18:08:21 +01:00
$device_key_icon = str_replace ( " \$ { domain_name} " , $domain_name , $device_key_icon );
2017-06-13 07:09:36 +02:00
//grandstream modes are different based on the category
if ( $device_vendor == " grandstream " ) {
if ( $device_key_category == " line " ) {
switch ( $device_key_type ) {
case " line " : $device_key_type = " 0 " ; break ;
case " shared line " : $device_key_type = " 1 " ; break ;
case " speed dial " : $device_key_type = " 10 " ; break ;
case " blf " : $device_key_type = " 11 " ; break ;
case " presence watcher " : $device_key_type = " 12 " ; break ;
case " eventlist blf " : $device_key_type = " 13 " ; break ;
case " speed dial active " : $device_key_type = " 14 " ; break ;
case " dial dtmf " : $device_key_type = " 15 " ; break ;
case " voicemail " : $device_key_type = " 16 " ; break ;
case " call return " : $device_key_type = " 17 " ; break ;
case " transfer " : $device_key_type = " 18 " ; break ;
case " call park " : $device_key_type = " 19 " ; break ;
2018-08-22 05:21:03 +02:00
case " monitored call park " : $device_key_type = " 26 " ; break ;
2017-06-13 07:09:36 +02:00
case " intercom " : $device_key_type = " 20 " ; break ;
case " ldap search " : $device_key_type = " 21 " ; break ;
}
}
if ( $device_key_category == " memory " || $device_key_category == " expansion " ) {
switch ( $device_key_type ) {
case " speed dial " : $device_key_type = " 0 " ; break ;
case " blf " : $device_key_type = " 1 " ; break ;
case " presence watcher " : $device_key_type = " 2 " ; break ;
case " eventlist blf " : $device_key_type = " 3 " ; break ;
case " speed dial active " : $device_key_type = " 4 " ; break ;
case " dial dtmf " : $device_key_type = " 5 " ; break ;
case " voicemail " : $device_key_type = " 6 " ; break ;
case " call return " : $device_key_type = " 7 " ; break ;
case " transfer " : $device_key_type = " 8 " ; break ;
case " call park " : $device_key_type = " 9 " ; break ;
2018-08-22 05:23:43 +02:00
case " monitored call park " : $device_key_type = " 16 " ; break ;
2017-06-13 07:09:36 +02:00
case " intercom " : $device_key_type = " 10 " ; break ;
case " ldap search " : $device_key_type = " 11 " ; break ;
}
}
}
//assign the variables
if ( strlen ( $device_key_category ) == 0 ) {
$view -> assign ( " key_id_ " . $device_key_id , $device_key_id );
$view -> assign ( " key_type_ " . $device_key_id , $device_key_type );
$view -> assign ( " key_line_ " . $device_key_id , $device_key_line );
$view -> assign ( " key_value_ " . $device_key_id , $device_key_value );
$view -> assign ( " key_extension_ " . $device_key_id , $device_key_extension );
$view -> assign ( " key_label_ " . $device_key_id , $device_key_label );
Add device key icon for dss programming (#3896)
* Expand Fanvil DSS-Key support for templating
* Add DSS key programming to Fanvil X6
* Add device key icon support.
* Additional device key icon fixes
* Fix SQL for device_key_label
* Add device_key_icon varible to X6 dss key programming
* Add new Advanced SIP Var (#3859)
Add the following advanced SIP variable. Disabling this allows Yealink phones to display the SIP error reason in the format sent by the carrier rather than Q.850 format e.g. "User Busy" rather than "NORMAL_CLEARING"
sip.call_fail_use_reason.enable = {$yealink_sip_call_fail_use_reason_enable}
* Variables for DP750 Handset Assignment, Ring Type (#3772)
New variables for the DP750 to allow the following settings:
$grandstream_repeater_mode_enable
(Enables or disables repeater mode on DP750 base)
$grandstream_hanging_group_mode
(Allows users to set hanging group mode (e.g. ring handsets at the same time, sequentially, etc.)
$grandstream_handset_X_line_Y_enable
(Allows setting of handset to line assignment)
* Update app_config.php
* Update 520_follow_me_bridge.xml (#3893)
Search through all SIP Profiles when looking up the Contact.
* Update xml_cdr_delete.php (#3891)
Fix typo in delete() query
* Make storage_path and storage_type = http_cache work (#3892)
* Make storage_path work
if storage_path was set, the script would fail. I have fixed it by removing the references to unset variables. I also made the recordings use the path.
* Update ivr.conf.lua
Add storage_path definition so storage_type of http_cache works correctly
* Fix IVR (#3898)
IVR was broken after previous update/change.
* Add Fanvil one-hit privisioning support for X6 and i30 devices (#3894)
* Update directory.xml
* Update directory.xml
* Update directory.xml
* Update directory.xml
* Update directory.xml (#3931)
* Update directory.xml (#3929)
* Update directory.xml (#3928)
* Update directory.xml (#3930)
* Update directory.xml (#3927)
* Update directory.xml (#3924)
* Update directory.xml (#3922)
* Update directory.xml (#3921)
* Update directory.xml (#3923)
* Update directory.xml (#3926)
* Update directory.xml (#3925)
* Update directory.xml (#3920)
* Update directory.xml (#3916)
* Update directory.xml (#3906)
* Update directory.xml (#3919)
* Update directory.xml (#3918)
* Update directory.xml (#3917)
* Update directory.xml (#3915)
* Update directory.xml (#3914)
* Update directory.xml (#3912)
* Update directory.xml (#3911)
* Update directory.xml (#3910)
* Update directory.xml (#3909)
* Update directory.xml (#3913)
* Update directory.xml (#3908)
* Update directory.xml (#3901)
* Update directory.xml (#3902)
* Update directory.xml (#3904)
* Update directory.xml (#3907)
* Update directory.xml (#3905)
* Update directory.xml (#3903)
* Update extensions.php
* Update domains.php
* Update dialplans.php
* Update users.php
* Update click_to_call.php
* Update app_config.php
* Update app_languages.php
* Update dialplan_edit.php
* Show enabled extension only on operator panel (#3900)
Add e.enabled = 'true' to SQL where and show only enabled extensions on the operator panel.
* Add new default_settings for Fanvil products (#3895)
* Add new default_settings for Fanvil products
* Set setting names too lowercase.
* Add additional firmware auto upgrade options
* Add intial Fanvil i30 device support (#3897)
* Update app_config.php
* Update dialplan.php (#3934)
Adds the ability to set "dialplan_destination" db field from Upgrade App Defaults and xml dialplan templates.
* Update dialplan.php
* Fanvil x6 template (#3936)
* Allow Fanvil x6 template to dynamically provision DSS memory and expansion keys
* Expand Fanvil X6 template options to match latest firmware. Use more FusionPBX default settings.
* Remove TR069 CPE serial number from template
* Have template use the 'admin_name' and 'admin_pass' default settings for admin webui login
* Fanvil i30 template fixes (#3933)
* Make varible names lowercase. follows cf76c39e977eaadc3cd1fb5d5160f432ce4e1486
* Additional i30 fixs around FusionPBX and feature enhancements.
* Add dynamic memory key programming
* Add support for configuring time to leave switch relay open on i-series devices
* Add OSD parameters, fix egs_syslog, protect RTSP streams by default
* Fix Fanvil 'Memory' keys (#3932)
* Expand Fanvil DSS-Key support for templating
* Fanvil vendor key fixes.
* Fanvil - Edit device keys to type 'memory' only
* Add Fanvil SpeedDial memory key support
* Update recordings.lua (#3937)
Bug fix. Allow for nil and blank entries.
* Add DSS key programming to Fanvil X6
* Fanvil 'icon' key for dss key profiles
* Fanvil 'icon' key for dss key profiles
Add new Advanced SIP Var (#3859)
Add the following advanced SIP variable. Disabling this allows Yealink phones to display the SIP error reason in the format sent by the carrier rather than Q.850 format e.g. "User Busy" rather than "NORMAL_CLEARING"
sip.call_fail_use_reason.enable = {$yealink_sip_call_fail_use_reason_enable}
Variables for DP750 Handset Assignment, Ring Type (#3772)
New variables for the DP750 to allow the following settings:
$grandstream_repeater_mode_enable
(Enables or disables repeater mode on DP750 base)
$grandstream_hanging_group_mode
(Allows users to set hanging group mode (e.g. ring handsets at the same time, sequentially, etc.)
$grandstream_handset_X_line_Y_enable
(Allows setting of handset to line assignment)
Update app_config.php
Update 520_follow_me_bridge.xml (#3893)
Search through all SIP Profiles when looking up the Contact.
Update xml_cdr_delete.php (#3891)
Fix typo in delete() query
Make storage_path and storage_type = http_cache work (#3892)
* Make storage_path work
if storage_path was set, the script would fail. I have fixed it by removing the references to unset variables. I also made the recordings use the path.
* Update ivr.conf.lua
Add storage_path definition so storage_type of http_cache works correctly
Fix IVR (#3898)
IVR was broken after previous update/change.
Add Fanvil one-hit privisioning support for X6 and i30 devices (#3894)
Update directory.xml
Update directory.xml
Update directory.xml
Update directory.xml
Update directory.xml (#3931)
Update directory.xml (#3929)
Update directory.xml (#3928)
Update directory.xml (#3930)
Update directory.xml (#3927)
Update directory.xml (#3924)
Update directory.xml (#3922)
Update directory.xml (#3921)
Update directory.xml (#3923)
Update directory.xml (#3926)
Update directory.xml (#3925)
Update directory.xml (#3920)
Update directory.xml (#3916)
Update directory.xml (#3906)
Update directory.xml (#3919)
Update directory.xml (#3918)
Update directory.xml (#3917)
Update directory.xml (#3915)
Update directory.xml (#3914)
Update directory.xml (#3912)
Update directory.xml (#3911)
Update directory.xml (#3910)
Update directory.xml (#3909)
Update directory.xml (#3913)
Update directory.xml (#3908)
Update directory.xml (#3901)
Update directory.xml (#3902)
Update directory.xml (#3904)
Update directory.xml (#3907)
Update directory.xml (#3905)
Update directory.xml (#3903)
Update extensions.php
Update domains.php
Update dialplans.php
Update users.php
Update click_to_call.php
Update app_config.php
Update app_languages.php
Update dialplan_edit.php
Show enabled extension only on operator panel (#3900)
Add e.enabled = 'true' to SQL where and show only enabled extensions on the operator panel.
Add new default_settings for Fanvil products (#3895)
* Add new default_settings for Fanvil products
* Set setting names too lowercase.
* Add additional firmware auto upgrade options
Update app_config.php
Update dialplan.php (#3934)
Adds the ability to set "dialplan_destination" db field from Upgrade App Defaults and xml dialplan templates.
Update dialplan.php
Fanvil x6 template (#3936)
* Allow Fanvil x6 template to dynamically provision DSS memory and expansion keys
* Expand Fanvil X6 template options to match latest firmware. Use more FusionPBX default settings.
* Remove TR069 CPE serial number from template
* Have template use the 'admin_name' and 'admin_pass' default settings for admin webui login
Fanvil i30 template fixes (#3933)
* Make varible names lowercase. follows cf76c39e977eaadc3cd1fb5d5160f432ce4e1486
* Additional i30 fixs around FusionPBX and feature enhancements.
* Add dynamic memory key programming
* Add support for configuring time to leave switch relay open on i-series devices
* Add OSD parameters, fix egs_syslog, protect RTSP streams by default
Fix Fanvil 'Memory' keys (#3932)
* Expand Fanvil DSS-Key support for templating
* Fanvil vendor key fixes.
* Fanvil - Edit device keys to type 'memory' only
* Add Fanvil SpeedDial memory key support
Update recordings.lua (#3937)
Bug fix. Allow for nil and blank entries.
Add DSS key programming to Fanvil X6
* resync3
2018-12-12 18:08:21 +01:00
$view -> assign ( " key_icon_ " . $device_key_id , $device_key_icon );
2017-06-13 07:09:36 +02:00
}
else {
$view -> assign ( $device_key_category . " _key_id_ " . $device_key_id , $device_key_id );
$view -> assign ( $device_key_category . " _key_type_ " . $device_key_id , $device_key_type );
$view -> assign ( $device_key_category . " _key_line_ " . $device_key_id , $device_key_line );
$view -> assign ( $device_key_category . " _key_value_ " . $device_key_id , $device_key_value );
$view -> assign ( $device_key_category . " _key_extension_ " . $device_key_id , $device_key_extension );
$view -> assign ( $device_key_category . " _key_label_ " . $device_key_id , $device_key_label );
Add device key icon for dss programming (#3896)
* Expand Fanvil DSS-Key support for templating
* Add DSS key programming to Fanvil X6
* Add device key icon support.
* Additional device key icon fixes
* Fix SQL for device_key_label
* Add device_key_icon varible to X6 dss key programming
* Add new Advanced SIP Var (#3859)
Add the following advanced SIP variable. Disabling this allows Yealink phones to display the SIP error reason in the format sent by the carrier rather than Q.850 format e.g. "User Busy" rather than "NORMAL_CLEARING"
sip.call_fail_use_reason.enable = {$yealink_sip_call_fail_use_reason_enable}
* Variables for DP750 Handset Assignment, Ring Type (#3772)
New variables for the DP750 to allow the following settings:
$grandstream_repeater_mode_enable
(Enables or disables repeater mode on DP750 base)
$grandstream_hanging_group_mode
(Allows users to set hanging group mode (e.g. ring handsets at the same time, sequentially, etc.)
$grandstream_handset_X_line_Y_enable
(Allows setting of handset to line assignment)
* Update app_config.php
* Update 520_follow_me_bridge.xml (#3893)
Search through all SIP Profiles when looking up the Contact.
* Update xml_cdr_delete.php (#3891)
Fix typo in delete() query
* Make storage_path and storage_type = http_cache work (#3892)
* Make storage_path work
if storage_path was set, the script would fail. I have fixed it by removing the references to unset variables. I also made the recordings use the path.
* Update ivr.conf.lua
Add storage_path definition so storage_type of http_cache works correctly
* Fix IVR (#3898)
IVR was broken after previous update/change.
* Add Fanvil one-hit privisioning support for X6 and i30 devices (#3894)
* Update directory.xml
* Update directory.xml
* Update directory.xml
* Update directory.xml
* Update directory.xml (#3931)
* Update directory.xml (#3929)
* Update directory.xml (#3928)
* Update directory.xml (#3930)
* Update directory.xml (#3927)
* Update directory.xml (#3924)
* Update directory.xml (#3922)
* Update directory.xml (#3921)
* Update directory.xml (#3923)
* Update directory.xml (#3926)
* Update directory.xml (#3925)
* Update directory.xml (#3920)
* Update directory.xml (#3916)
* Update directory.xml (#3906)
* Update directory.xml (#3919)
* Update directory.xml (#3918)
* Update directory.xml (#3917)
* Update directory.xml (#3915)
* Update directory.xml (#3914)
* Update directory.xml (#3912)
* Update directory.xml (#3911)
* Update directory.xml (#3910)
* Update directory.xml (#3909)
* Update directory.xml (#3913)
* Update directory.xml (#3908)
* Update directory.xml (#3901)
* Update directory.xml (#3902)
* Update directory.xml (#3904)
* Update directory.xml (#3907)
* Update directory.xml (#3905)
* Update directory.xml (#3903)
* Update extensions.php
* Update domains.php
* Update dialplans.php
* Update users.php
* Update click_to_call.php
* Update app_config.php
* Update app_languages.php
* Update dialplan_edit.php
* Show enabled extension only on operator panel (#3900)
Add e.enabled = 'true' to SQL where and show only enabled extensions on the operator panel.
* Add new default_settings for Fanvil products (#3895)
* Add new default_settings for Fanvil products
* Set setting names too lowercase.
* Add additional firmware auto upgrade options
* Add intial Fanvil i30 device support (#3897)
* Update app_config.php
* Update dialplan.php (#3934)
Adds the ability to set "dialplan_destination" db field from Upgrade App Defaults and xml dialplan templates.
* Update dialplan.php
* Fanvil x6 template (#3936)
* Allow Fanvil x6 template to dynamically provision DSS memory and expansion keys
* Expand Fanvil X6 template options to match latest firmware. Use more FusionPBX default settings.
* Remove TR069 CPE serial number from template
* Have template use the 'admin_name' and 'admin_pass' default settings for admin webui login
* Fanvil i30 template fixes (#3933)
* Make varible names lowercase. follows cf76c39e977eaadc3cd1fb5d5160f432ce4e1486
* Additional i30 fixs around FusionPBX and feature enhancements.
* Add dynamic memory key programming
* Add support for configuring time to leave switch relay open on i-series devices
* Add OSD parameters, fix egs_syslog, protect RTSP streams by default
* Fix Fanvil 'Memory' keys (#3932)
* Expand Fanvil DSS-Key support for templating
* Fanvil vendor key fixes.
* Fanvil - Edit device keys to type 'memory' only
* Add Fanvil SpeedDial memory key support
* Update recordings.lua (#3937)
Bug fix. Allow for nil and blank entries.
* Add DSS key programming to Fanvil X6
* Fanvil 'icon' key for dss key profiles
* Fanvil 'icon' key for dss key profiles
Add new Advanced SIP Var (#3859)
Add the following advanced SIP variable. Disabling this allows Yealink phones to display the SIP error reason in the format sent by the carrier rather than Q.850 format e.g. "User Busy" rather than "NORMAL_CLEARING"
sip.call_fail_use_reason.enable = {$yealink_sip_call_fail_use_reason_enable}
Variables for DP750 Handset Assignment, Ring Type (#3772)
New variables for the DP750 to allow the following settings:
$grandstream_repeater_mode_enable
(Enables or disables repeater mode on DP750 base)
$grandstream_hanging_group_mode
(Allows users to set hanging group mode (e.g. ring handsets at the same time, sequentially, etc.)
$grandstream_handset_X_line_Y_enable
(Allows setting of handset to line assignment)
Update app_config.php
Update 520_follow_me_bridge.xml (#3893)
Search through all SIP Profiles when looking up the Contact.
Update xml_cdr_delete.php (#3891)
Fix typo in delete() query
Make storage_path and storage_type = http_cache work (#3892)
* Make storage_path work
if storage_path was set, the script would fail. I have fixed it by removing the references to unset variables. I also made the recordings use the path.
* Update ivr.conf.lua
Add storage_path definition so storage_type of http_cache works correctly
Fix IVR (#3898)
IVR was broken after previous update/change.
Add Fanvil one-hit privisioning support for X6 and i30 devices (#3894)
Update directory.xml
Update directory.xml
Update directory.xml
Update directory.xml
Update directory.xml (#3931)
Update directory.xml (#3929)
Update directory.xml (#3928)
Update directory.xml (#3930)
Update directory.xml (#3927)
Update directory.xml (#3924)
Update directory.xml (#3922)
Update directory.xml (#3921)
Update directory.xml (#3923)
Update directory.xml (#3926)
Update directory.xml (#3925)
Update directory.xml (#3920)
Update directory.xml (#3916)
Update directory.xml (#3906)
Update directory.xml (#3919)
Update directory.xml (#3918)
Update directory.xml (#3917)
Update directory.xml (#3915)
Update directory.xml (#3914)
Update directory.xml (#3912)
Update directory.xml (#3911)
Update directory.xml (#3910)
Update directory.xml (#3909)
Update directory.xml (#3913)
Update directory.xml (#3908)
Update directory.xml (#3901)
Update directory.xml (#3902)
Update directory.xml (#3904)
Update directory.xml (#3907)
Update directory.xml (#3905)
Update directory.xml (#3903)
Update extensions.php
Update domains.php
Update dialplans.php
Update users.php
Update click_to_call.php
Update app_config.php
Update app_languages.php
Update dialplan_edit.php
Show enabled extension only on operator panel (#3900)
Add e.enabled = 'true' to SQL where and show only enabled extensions on the operator panel.
Add new default_settings for Fanvil products (#3895)
* Add new default_settings for Fanvil products
* Set setting names too lowercase.
* Add additional firmware auto upgrade options
Update app_config.php
Update dialplan.php (#3934)
Adds the ability to set "dialplan_destination" db field from Upgrade App Defaults and xml dialplan templates.
Update dialplan.php
Fanvil x6 template (#3936)
* Allow Fanvil x6 template to dynamically provision DSS memory and expansion keys
* Expand Fanvil X6 template options to match latest firmware. Use more FusionPBX default settings.
* Remove TR069 CPE serial number from template
* Have template use the 'admin_name' and 'admin_pass' default settings for admin webui login
Fanvil i30 template fixes (#3933)
* Make varible names lowercase. follows cf76c39e977eaadc3cd1fb5d5160f432ce4e1486
* Additional i30 fixs around FusionPBX and feature enhancements.
* Add dynamic memory key programming
* Add support for configuring time to leave switch relay open on i-series devices
* Add OSD parameters, fix egs_syslog, protect RTSP streams by default
Fix Fanvil 'Memory' keys (#3932)
* Expand Fanvil DSS-Key support for templating
* Fanvil vendor key fixes.
* Fanvil - Edit device keys to type 'memory' only
* Add Fanvil SpeedDial memory key support
Update recordings.lua (#3937)
Bug fix. Allow for nil and blank entries.
Add DSS key programming to Fanvil X6
* resync3
2018-12-12 18:08:21 +01:00
$view -> assign ( $device_key_category . " _key_icon_ " . $device_key_id , $device_key_icon );
2017-06-13 07:09:36 +02:00
}
}
}
}
unset ( $prep_statement );
//set the mac address in the correct format
$mac = $this -> format_mac ( $mac , $device_vendor );
2018-05-16 03:53:43 +02:00
// set date/time for versioning provisioning templates
if ( strlen ( $_SESSION [ 'provision' ][ 'version_format' ][ 'text' ]) > 0 ) {
$time = date ( $_SESSION [ 'provision' ][ 'version_format' ][ 'text' ]);
} else {
$time = date ( " dmyHi " );
}
2017-06-13 07:09:36 +02:00
//replace the variables in the template in the future loop through all the line numbers to do a replace for each possible line number
$view -> assign ( " mac " , $mac );
2018-05-16 03:53:43 +02:00
$view -> assign ( " time " , $time );
2017-06-13 07:09:36 +02:00
$view -> assign ( " label " , $device_label );
$view -> assign ( " device_label " , $device_label );
$view -> assign ( " firmware_version " , $device_firmware_version );
$view -> assign ( " domain_name " , $domain_name );
$view -> assign ( " project_path " , PROJECT_PATH );
$view -> assign ( " server1_address " , $server1_address );
$view -> assign ( " proxy1_address " , $proxy1_address );
$view -> assign ( " user_id " , $user_id );
$view -> assign ( " password " , $password );
$view -> assign ( " template " , $device_template );
2019-06-10 02:44:33 +02:00
$view -> assign ( " microtime " , microtime ( true ));
2017-06-13 07:09:36 +02:00
// personal ldap password
global $laddr_salt ;
2019-06-10 02:44:33 +02:00
if ( isset ( $device_user_uuid )) {
2017-06-13 07:09:36 +02:00
$sql = " SELECT contact_uuid FROM v_users WHERE user_uuid=' " . $device_user_uuid . " ' " ;
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$c_uuid = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
$view -> assign ( " ldap_username " , " uid= " . $c_uuid [ 0 ][ 'contact_uuid' ] . " , " . $_SESSION [ 'provision' ][ 'gs_ldap_user_base' ][ 'text' ]);
$view -> assign ( " ldap_password " , md5 ( $laddr_salt . $device_user_uuid ));
}
//get the time zone
$time_zone_name = $_SESSION [ 'domain' ][ 'time_zone' ][ 'name' ];
if ( strlen ( $time_zone_name ) > 0 ) {
$time_zone_offset_raw = get_time_zone_offset ( $time_zone_name ) / 3600 ;
$time_zone_offset_hours = floor ( $time_zone_offset_raw );
$time_zone_offset_minutes = ( $time_zone_offset_raw - $time_zone_offset_hours ) * 60 ;
$time_zone_offset_minutes = number_pad ( $time_zone_offset_minutes , 2 );
if ( $time_zone_offset_raw > 0 ) {
$time_zone_offset_hours = number_pad ( $time_zone_offset_hours , 2 );
$time_zone_offset_hours = " + " . $time_zone_offset_hours ;
}
else {
$time_zone_offset_hours = str_replace ( " - " , " " , $time_zone_offset_hours );
$time_zone_offset_hours = " - " . number_pad ( $time_zone_offset_hours , 2 );
}
$time_zone_offset = $time_zone_offset_hours . " : " . $time_zone_offset_minutes ;
if ( ! isset ( $provision [ " time_zone_offset " ])) {
$provision [ " time_zone_offset " ] = $time_zone_offset ;
}
}
//set the daylight savings time
if ( ! isset ( $provision [ " yealink_time_zone_start_time " ])) {
$provision [ " yealink_time_zone_start_time " ] = $provision [ " daylight_savings_start_month " ] . " / " . $provision [ " daylight_savings_start_day " ] . " / " . $provision [ " daylight_savings_start_time " ];
}
if ( ! isset ( $provision [ " yealink_time_zone_end_time " ])) {
$provision [ " yealink_time_zone_end_time " ] = $provision [ " daylight_savings_stop_month " ] . " / " . $provision [ " daylight_savings_stop_day " ] . " / " . $provision [ " daylight_savings_stop_time " ];
}
//replace the dynamic provision variables that are defined in default, domain, and device settings
if ( is_array ( $provision )) {
foreach ( $provision as $key => $val ) {
$view -> assign ( $key , $val );
}
}
//if $file is not provided then look for a default file that exists
if ( strlen ( $file ) == 0 ) {
if ( file_exists ( $template_dir . " / " . $device_template . " / { \$ mac} " )) {
$file = " { \$ mac} " ;
}
elseif ( file_exists ( $template_dir . " / " . $device_template . " / { \$ mac}.xml " )) {
$file = " { \$ mac}.xml " ;
}
elseif ( file_exists ( $template_dir . " / " . $device_template . " / { \$ mac}.cfg " )) {
$file = " { \$ mac}.cfg " ;
}
else {
2017-12-03 20:24:56 +01:00
$this -> http_error ( '404' );
2017-06-13 07:09:36 +02:00
exit ;
}
}
else {
//make sure the file exists
if ( ! file_exists ( $template_dir . " / " . $device_template . " / " . $file )) {
echo " file not found " . $template_dir . " / " . $device_template . " / " . $file ;
2019-06-10 02:44:33 +02:00
if ( $_SESSION [ 'provision' ][ 'debug' ][ 'boolean' ] == 'true' ) {
2017-06-13 07:09:36 +02:00
echo " : $template_dir / $device_template / $file <br/> " ;
echo " template_dir: $template_dir <br/> " ;
echo " device_template: $device_template <br/> " ;
echo " file: $file " ;
}
exit ;
}
}
//output template to string for header processing
$file_contents = $view -> render ( $file );
//log file for testing
2019-06-10 02:44:33 +02:00
if ( $_SESSION [ 'provision' ][ 'debug' ][ 'boolean' ] == 'true' ) {
2017-06-13 07:09:36 +02:00
$tmp_file = " /tmp/provisioning_log.txt " ;
$fh = fopen ( $tmp_file , 'w' ) or die ( " can't open file " );
$tmp_string = $mac . " \n " ;
fwrite ( $fh , $tmp_string );
fclose ( $fh );
}
$this -> file = $file ;
//returned the rendered template
return $file_contents ;
} //end render function
function write () {
//build the provision array
$provision = Array ();
if ( is_array ( $_SESSION [ 'provision' ])) {
foreach ( $_SESSION [ 'provision' ] as $key => $val ) {
if ( strlen ( $val [ 'var' ]) > 0 ) { $value = $val [ 'var' ]; }
if ( strlen ( $val [ 'text' ]) > 0 ) { $value = $val [ 'text' ]; }
if ( strlen ( $val [ 'boolean' ]) > 0 ) { $value = $val [ 'boolean' ]; }
if ( strlen ( $val [ 'numeric' ]) > 0 ) { $value = $val [ 'numeric' ]; }
if ( strlen ( $value ) > 0 ) { $provision [ $key ] = $value ; }
unset ( $value );
}
}
//check either we have destination path to write files
2019-06-10 02:44:33 +02:00
if ( strlen ( $provision [ " path " ]) == 0 ) {
2017-06-13 07:09:36 +02:00
return ;
}
//get the devices from database
$sql = " select * from v_devices " ;
//$sql .= "where domain_uuid = '".$this->domain_uuid."' ";
$prep_statement = $this -> db -> prepare ( check_sql ( $sql ));
$prep_statement -> execute ();
$result = $prep_statement -> fetchAll ( PDO :: FETCH_NAMED );
unset ( $prep_statement );
//process each device
if ( is_array ( $result )) foreach ( $result as & $row ) {
//get the values from the database and set as variables
$domain_uuid = $row [ " domain_uuid " ];
$device_uuid = $row [ " device_uuid " ];
$device_mac_address = $row [ " device_mac_address " ];
$device_label = $row [ " device_label " ];
$device_vendor = strtolower ( $row [ " device_vendor " ]);
$device_model = $row [ " device_model " ];
$device_firmware_version = $row [ " device_firmware_version " ];
$device_enabled = $row [ " device_enabled " ];
$device_template = $row [ " device_template " ];
$device_username = $row [ " device_username " ];
$device_password = $row [ " device_password " ];
$device_description = $row [ " device_description " ];
clearstatcache ();
//loop through the provision template directory
$dir_array = array ();
if ( strlen ( $device_template ) > 0 ) {
$template_path = path_join ( $this -> template_dir , $device_template );
$dir_list = opendir ( $template_path );
if ( $dir_list ) {
$x = 0 ;
while ( false !== ( $file = readdir ( $dir_list ))) {
$ignore = $file == " . " || $file == " .. " || substr ( $file , - 3 ) == " .db " ||
substr ( $file , - 4 ) == " .svn " || substr ( $file , - 4 ) == " .git " ;
if ( ! $ignore ) {
$dir_array [] = path_join ( $template_path , $file );
if ( $x > 1000 ) { break ; };
$x ++ ;
}
}
closedir ( $dir_list );
unset ( $x , $file );
}
unset ( $dir_list , $template_path );
}
//loop through the provision templates
if ( is_array ( $dir_array )) foreach ( $dir_array as & $template_path ) {
if ( is_dir ( $template_path )) continue ;
if ( ! file_exists ( $template_path )) continue ;
//template file name
$file_name = basename ( $template_path );
//configure device object
$this -> domain_uuid = $domain_uuid ;
$this -> mac = $device_mac_address ;
$this -> file = $file_name ;
//format the mac address
$mac = $this -> format_mac ( $device_mac_address , $device_vendor );
//replace {$mac} in the file name
$file_name = str_replace ( " { \$ mac} " , $mac , $file_name );
//render and write configuration to file
$provision_dir_array = explode ( " ; " , $provision [ " path " ]);
if ( is_array ( $provision_dir_array )) foreach ( $provision_dir_array as $directory ) {
//destinatino file path
$dest_path = path_join ( $directory , $file_name );
2019-06-10 02:44:33 +02:00
if ( $device_enabled == 'true' ) {
2017-06-13 07:09:36 +02:00
//output template to string for header processing
$file_contents = $this -> render ();
//write the file
2018-10-05 04:30:31 +02:00
if ( ! is_dir ( $directory )) {
mkdir ( $directory , 0777 , true );
}
2017-06-13 07:09:36 +02:00
$fh = fopen ( $dest_path , " w " ) or die ( " Unable to write to $directory for provisioning. Make sure the path exists and permissons are set correctly. " );
fwrite ( $fh , $file_contents );
fclose ( $fh );
}
2019-06-10 02:44:33 +02:00
else { // device disabled
2017-06-13 07:09:36 +02:00
//remove only files with `{$mac}` name
if ( strpos ( $template_path , '{$mac}' ) !== false ){
unlink ( $dest_path );
}
}
unset ( $dest_path );
}
//unset variables
unset ( $file_name , $provision_dir_array );
} //end for each
//unset variables
unset ( $dir_array );
}
} //end write function
} //end provision class
?>