2017-08-28 09:14:43 +02:00
|
|
|
<?php
|
2019-11-29 23:27:51 +01:00
|
|
|
/*
|
|
|
|
|
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>
|
2021-06-03 01:12:01 +02:00
|
|
|
Portions created by the Initial Developer are Copyright (C) 2008-2021
|
2019-11-29 23:27:51 +01:00
|
|
|
the Initial Developer. All Rights Reserved.
|
2017-08-28 09:14:43 +02:00
|
|
|
|
2019-11-29 23:27:51 +01:00
|
|
|
Contributor(s):
|
|
|
|
|
Mark J Crane <markjcrane@fusionpbx.com>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
//define the registrations class
|
2017-08-28 09:14:43 +02:00
|
|
|
if (!class_exists('registrations')) {
|
|
|
|
|
class registrations {
|
|
|
|
|
|
|
|
|
|
/**
|
2019-11-29 23:27:51 +01:00
|
|
|
* declare private variables
|
|
|
|
|
*/
|
|
|
|
|
private $app_name;
|
|
|
|
|
private $app_uuid;
|
|
|
|
|
private $permission_prefix;
|
|
|
|
|
private $list_page;
|
2019-12-03 03:01:41 +01:00
|
|
|
public $show;
|
2019-11-29 23:27:51 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* called when the object is created
|
2017-08-28 09:14:43 +02:00
|
|
|
*/
|
|
|
|
|
public function __construct() {
|
2019-09-02 23:57:18 +02:00
|
|
|
|
2019-11-29 23:27:51 +01:00
|
|
|
//assign private variables
|
|
|
|
|
$this->app_name = 'registrations';
|
|
|
|
|
$this->app_uuid = '5d9e7cd7-629e-3553-4cf5-f26e39fefa39';
|
|
|
|
|
$this->permission_prefix = 'registration_';
|
|
|
|
|
$this->list_page = 'registrations.php';
|
2019-12-03 03:01:41 +01:00
|
|
|
$this->show = 'local';
|
2019-11-29 23:27:51 +01:00
|
|
|
|
2017-08-28 09:14:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2019-11-29 23:27:51 +01:00
|
|
|
* called when there are no references to a particular object
|
2017-08-28 09:14:43 +02:00
|
|
|
* unset the variables used in the class
|
|
|
|
|
*/
|
|
|
|
|
public function __destruct() {
|
|
|
|
|
foreach ($this as $key => $value) {
|
|
|
|
|
unset($this->$key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* get the registrations
|
|
|
|
|
*/
|
2022-06-15 18:52:11 +02:00
|
|
|
public function get($profile = 'all') {
|
2017-08-28 09:14:43 +02:00
|
|
|
|
|
|
|
|
//initialize the id used in the registrations array
|
|
|
|
|
$id = 0;
|
|
|
|
|
|
|
|
|
|
//create the event socket connection
|
|
|
|
|
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
|
|
|
|
|
|
|
|
|
|
//get the default settings
|
2017-08-28 09:49:03 +02:00
|
|
|
$sql = "select sip_profile_name from v_sip_profiles ";
|
|
|
|
|
$sql .= "where sip_profile_enabled = 'true' ";
|
2019-09-02 23:57:18 +02:00
|
|
|
if ($profile != 'all' && $profile != '') {
|
|
|
|
|
$sql .= "and sip_profile_name = :sip_profile_name ";
|
|
|
|
|
$parameters['sip_profile_name'] = $profile;
|
2017-08-28 09:49:03 +02:00
|
|
|
}
|
2020-04-08 21:32:49 +02:00
|
|
|
$sql .= "and sip_profile_enabled = 'true' ";
|
2019-09-02 23:57:18 +02:00
|
|
|
$database = new database;
|
|
|
|
|
$sip_profiles = $database->select($sql, $parameters, 'all');
|
|
|
|
|
if (is_array($sip_profiles) && @sizeof($sip_profiles) != 0) {
|
|
|
|
|
foreach ($sip_profiles as $field) {
|
|
|
|
|
|
|
|
|
|
//get sofia status profile information including registrations
|
2020-08-17 21:42:38 +02:00
|
|
|
$cmd = "api sofia xmlstatus profile '".$field['sip_profile_name']."' reg";
|
2019-09-02 23:57:18 +02:00
|
|
|
$xml_response = trim(event_socket_request($fp, $cmd));
|
2021-03-26 23:31:51 +01:00
|
|
|
if (function_exists('iconv')) { $xml_response = iconv("utf-8", "utf-8//IGNORE", $xml_response); }
|
2020-05-14 05:06:10 +02:00
|
|
|
$xml_response = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', '', $xml_response);
|
2019-09-02 23:57:18 +02:00
|
|
|
if ($xml_response == "Invalid Profile!") { $xml_response = "<error_msg>".$text['label-message']."</error_msg>"; }
|
|
|
|
|
$xml_response = str_replace("<profile-info>", "<profile_info>", $xml_response);
|
|
|
|
|
$xml_response = str_replace("</profile-info>", "</profile_info>", $xml_response);
|
2019-10-09 00:04:36 +02:00
|
|
|
$xml_response = str_replace("<", "", $xml_response);
|
|
|
|
|
$xml_response = str_replace(">", "", $xml_response);
|
2019-09-02 23:57:18 +02:00
|
|
|
if (strlen($xml_response) > 101) {
|
|
|
|
|
try {
|
|
|
|
|
$xml = new SimpleXMLElement($xml_response);
|
|
|
|
|
}
|
|
|
|
|
catch(Exception $e) {
|
2020-05-14 05:06:10 +02:00
|
|
|
echo basename(__FILE__)."<br />\n";
|
|
|
|
|
echo "line: ".__line__."<br />\n";
|
|
|
|
|
echo "error: ".$e->getMessage()."<br />\n";
|
|
|
|
|
//echo $xml_response;
|
2019-09-02 23:57:18 +02:00
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
$array = json_decode(json_encode($xml), true);
|
2017-08-28 09:14:43 +02:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
|
|
|
|
|
//normalize the array
|
|
|
|
|
if (is_array($array) && !is_array($array['registrations']['registration'][0])) {
|
|
|
|
|
$row = $array['registrations']['registration'];
|
|
|
|
|
unset($array['registrations']['registration']);
|
|
|
|
|
$array['registrations']['registration'][0] = $row;
|
2017-08-28 09:14:43 +02:00
|
|
|
}
|
|
|
|
|
|
2019-09-02 23:57:18 +02:00
|
|
|
//set the registrations array
|
|
|
|
|
if (is_array($array)) {
|
|
|
|
|
foreach ($array['registrations']['registration'] as $row) {
|
|
|
|
|
|
|
|
|
|
//build the registrations array
|
|
|
|
|
//$registrations[0] = $row;
|
|
|
|
|
$user_array = explode('@', $row['user']);
|
|
|
|
|
$registrations[$id]['user'] = $row['user'] ?: '';
|
|
|
|
|
$registrations[$id]['call-id'] = $row['call-id'] ?: '';
|
|
|
|
|
$registrations[$id]['contact'] = $row['contact'] ?: '';
|
|
|
|
|
$registrations[$id]['sip-auth-user'] = $row['sip-auth-user'] ?: '';
|
|
|
|
|
$registrations[$id]['agent'] = $row['agent'] ?: '';
|
|
|
|
|
$registrations[$id]['host'] = $row['host'] ?: '';
|
|
|
|
|
$registrations[$id]['network-port'] = $row['network-port'] ?: '';
|
|
|
|
|
$registrations[$id]['sip-auth-realm'] = $row['sip-auth-realm'] ?: '';
|
|
|
|
|
$registrations[$id]['mwi-account'] = $row['mwi-account'] ?: '';
|
|
|
|
|
$registrations[$id]['status'] = $row['status'] ?: '';
|
|
|
|
|
$registrations[$id]['ping-time'] = $row['ping-time'] ?: '';
|
|
|
|
|
$registrations[$id]['sip_profile_name'] = $field['sip_profile_name'];
|
|
|
|
|
|
|
|
|
|
//get network-ip to url or blank
|
|
|
|
|
if (isset($row['network-ip'])) {
|
|
|
|
|
$registrations[$id]['network-ip'] = $row['network-ip'];
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$registrations[$id]['network-ip'] = '';
|
|
|
|
|
}
|
2017-08-28 09:14:43 +02:00
|
|
|
|
2019-09-02 23:57:18 +02:00
|
|
|
//get the LAN IP address if it exists replace the external ip
|
|
|
|
|
$call_id_array = explode('@', $row['call-id']);
|
|
|
|
|
if (isset($call_id_array[1])) {
|
|
|
|
|
$agent = $row['agent'];
|
|
|
|
|
$lan_ip = $call_id_array[1];
|
|
|
|
|
if (false !== stripos($agent, 'grandstream')) {
|
|
|
|
|
$lan_ip = str_ireplace(
|
|
|
|
|
array('A','B','C','D','E','F','G','H','I','J'),
|
|
|
|
|
array('0','1','2','3','4','5','6','7','8','9'),
|
|
|
|
|
$lan_ip);
|
|
|
|
|
}
|
2020-04-08 21:32:49 +02:00
|
|
|
elseif (1 === preg_match('/\ACL750A/', $agent)) {
|
2019-09-02 23:57:18 +02:00
|
|
|
//required for GIGASET Sculpture CL750A puts _ in it's lan ip account
|
|
|
|
|
$lan_ip = preg_replace('/_/', '.', $lan_ip);
|
2020-04-08 21:32:49 +02:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
$registrations[$id]['lan-ip'] = $lan_ip;
|
|
|
|
|
}
|
2019-10-09 00:04:36 +02:00
|
|
|
else if (preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $row['contact'], $ip_match)) {
|
2020-04-08 21:32:49 +02:00
|
|
|
$lan_ip = preg_replace('/_/', '.', $ip_match[0]);
|
|
|
|
|
$registrations[$id]['lan-ip'] = "$lan_ip";
|
2019-10-09 00:04:36 +02:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
else {
|
|
|
|
|
$registrations[$id]['lan-ip'] = '';
|
2017-08-28 09:14:43 +02:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
|
|
|
|
|
//remove unrelated domains
|
2020-08-05 04:28:33 +02:00
|
|
|
if (!permission_exists('registration_all') || $this->show != 'all') {
|
|
|
|
|
if ($registrations[$id]['sip-auth-realm'] == $_SESSION['domain_name']) {}
|
|
|
|
|
else if ($user_array[1] == $_SESSION['domain_name']) {}
|
|
|
|
|
else {
|
|
|
|
|
unset($registrations[$id]);
|
2017-08-28 09:14:43 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-02 23:57:18 +02:00
|
|
|
//increment the array id
|
|
|
|
|
$id++;
|
|
|
|
|
}
|
|
|
|
|
unset($array);
|
2017-08-28 09:14:43 +02:00
|
|
|
}
|
2020-04-08 21:32:49 +02:00
|
|
|
|
2019-09-02 23:57:18 +02:00
|
|
|
}
|
2017-08-28 09:14:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//return the registrations array
|
|
|
|
|
return $registrations;
|
|
|
|
|
}
|
2017-10-29 07:24:52 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* get the registration count
|
|
|
|
|
*/
|
2018-01-26 05:01:12 +01:00
|
|
|
public function count($profile = 'all') {
|
2017-10-29 07:24:52 +01:00
|
|
|
|
2022-06-15 18:52:11 +02:00
|
|
|
//use get the registrations to count
|
|
|
|
|
$registrations = $this->get($profile);
|
2017-10-29 07:24:52 +01:00
|
|
|
|
2022-06-15 18:52:11 +02:00
|
|
|
//set the count
|
|
|
|
|
$count = @sizeof($registrations);
|
2017-10-29 07:24:52 +01:00
|
|
|
|
|
|
|
|
//return the registrations count
|
|
|
|
|
return $count;
|
2022-06-15 18:52:11 +02:00
|
|
|
|
2017-10-29 07:24:52 +01:00
|
|
|
}
|
|
|
|
|
|
2019-11-29 23:27:51 +01:00
|
|
|
/**
|
|
|
|
|
* unregister registrations
|
|
|
|
|
*/
|
|
|
|
|
public function unregister($registrations) {
|
2019-12-02 13:07:08 +01:00
|
|
|
$this->switch_api('unregister', $registrations);
|
2019-11-29 23:27:51 +01:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
|
2019-11-29 23:27:51 +01:00
|
|
|
/**
|
|
|
|
|
* provision registrations
|
|
|
|
|
*/
|
|
|
|
|
public function provision($registrations) {
|
2019-12-02 13:07:08 +01:00
|
|
|
$this->switch_api('provision', $registrations);
|
2019-11-29 23:27:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* reboot registrations
|
|
|
|
|
*/
|
|
|
|
|
public function reboot($registrations) {
|
2019-12-02 13:07:08 +01:00
|
|
|
$this->switch_api('reboot', $registrations);
|
2019-11-29 23:27:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* switch api calls
|
|
|
|
|
*/
|
2019-12-02 13:07:08 +01:00
|
|
|
private function switch_api($action, $records) {
|
2019-11-29 23:27:51 +01:00
|
|
|
if (permission_exists($this->permission_prefix.'domain') || permission_exists($this->permission_prefix.'all') || if_group('superadmin')) {
|
|
|
|
|
|
|
|
|
|
//add multi-lingual support
|
|
|
|
|
$language = new text;
|
|
|
|
|
$text = $language->get();
|
|
|
|
|
|
|
|
|
|
//validate the token
|
|
|
|
|
$token = new token;
|
|
|
|
|
if (!$token->validate($_SERVER['PHP_SELF'])) {
|
|
|
|
|
message::add($text['message-invalid_token'],'negative');
|
|
|
|
|
header('Location: '.$this->list_page);
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//filter out unchecked registrations
|
|
|
|
|
if (is_array($records) && @sizeof($records) != 0) {
|
|
|
|
|
foreach($records as $record) {
|
|
|
|
|
if (
|
|
|
|
|
$record['checked'] == 'true' &&
|
|
|
|
|
$record['user'] != '' &&
|
|
|
|
|
$record['profile'] != ''
|
|
|
|
|
) {
|
|
|
|
|
$registrations[] = $record;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//process checked registrations
|
|
|
|
|
if (is_array($registrations) && @sizeof($registrations) != 0) {
|
|
|
|
|
|
|
|
|
|
//retrieve sip profiles list
|
|
|
|
|
$sql = "select sip_profile_name as name from v_sip_profiles ";
|
|
|
|
|
$database = new database;
|
|
|
|
|
$sip_profiles = $database->select($sql, null, 'all');
|
|
|
|
|
unset($sql);
|
|
|
|
|
|
|
|
|
|
//create the event socket connection
|
|
|
|
|
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
|
|
|
|
|
|
|
|
|
|
//loop through registrations
|
|
|
|
|
if ($fp) {
|
2021-06-03 01:12:01 +02:00
|
|
|
//check if registrations exist
|
|
|
|
|
if (is_array($registrations)) {
|
|
|
|
|
foreach ($registrations as $registration) {
|
|
|
|
|
|
|
|
|
|
//validate the submitted profile
|
|
|
|
|
if ($registration['profile'] != '' && is_array($sip_profiles) && @sizeof($sip_profiles) != 0) {
|
|
|
|
|
foreach ($sip_profiles as $field) {
|
|
|
|
|
if ($field['name'] == $registration['profile']) {
|
|
|
|
|
$profile = $registration['profile'];
|
|
|
|
|
break;
|
|
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
}
|
|
|
|
|
}
|
2021-06-03 01:12:01 +02:00
|
|
|
else {
|
|
|
|
|
header('Location: '.$this->list_page);
|
|
|
|
|
exit;
|
|
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
|
2021-06-03 01:12:01 +02:00
|
|
|
//validate the submitted user
|
|
|
|
|
if ($registration['user'] != '') {
|
|
|
|
|
$user = preg_replace('#[^a-zA-Z0-9_\-\.\@]#', '', $registration['user']);
|
|
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
|
2021-06-03 01:12:01 +02:00
|
|
|
//validate the submitted host
|
|
|
|
|
if ($registration['host'] != '') {
|
|
|
|
|
$host = preg_replace('#[^a-zA-Z0-9_\-\.]#', '', $registration['host']);
|
|
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
|
2021-06-03 01:12:01 +02:00
|
|
|
//lookup vendor by agent
|
|
|
|
|
if ($registration['agent'] != '') {
|
|
|
|
|
$vendor = device::get_vendor_by_agent($registration['agent']);
|
|
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
|
2021-06-03 01:12:01 +02:00
|
|
|
//prepare the api command
|
|
|
|
|
if ($profile && $user) {
|
|
|
|
|
switch ($action) {
|
|
|
|
|
case 'unregister':
|
|
|
|
|
$command = "sofia profile ".$profile." flush_inbound_reg ".$user." reboot";
|
|
|
|
|
$response_message = $text['message-registrations_unregistered'];
|
|
|
|
|
break;
|
|
|
|
|
case 'provision':
|
|
|
|
|
if ($vendor && $host) {
|
|
|
|
|
$command = "lua app.lua event_notify ".$profile." check_sync ".$user." ".$vendor." ".$host;
|
|
|
|
|
$response_message = $text['message-registrations_provisioned'];
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'reboot':
|
|
|
|
|
if ($vendor && $host) {
|
|
|
|
|
$command = "lua app.lua event_notify ".$profile." reboot ".$user." ".$vendor." ".$host;
|
|
|
|
|
$response_message = $text['message-registrations_rebooted'];
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
header('Location: '.$this->list_page);
|
|
|
|
|
exit;
|
|
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
}
|
|
|
|
|
|
2021-06-03 01:12:01 +02:00
|
|
|
//send the api command
|
|
|
|
|
if ($command && $fp) {
|
|
|
|
|
$response_api[$registration['user']]['command'] = event_socket_request($fp, "api ".$command);
|
|
|
|
|
$response_api[$registration['user']]['log'] = event_socket_request($fp, "api log notice ".$command);
|
|
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
|
2021-06-03 01:12:01 +02:00
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//set message
|
|
|
|
|
if (is_array($response_api)) {
|
|
|
|
|
$message = $response_message;
|
|
|
|
|
foreach ($response_api as $registration_user => $response) {
|
2021-06-03 01:12:01 +02:00
|
|
|
if (trim($response['command']) != '-ERR no reply') {
|
|
|
|
|
$message .= "<br>\n<strong>".$registration_user."</strong>: ".$response['command'];
|
|
|
|
|
}
|
2019-11-29 23:27:51 +01:00
|
|
|
}
|
|
|
|
|
message::add($message, 'positive', '7000');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
message::add($text['error-event-socket'], 'negative', 5000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
} //method
|
|
|
|
|
|
|
|
|
|
} //class
|
|
|
|
|
}
|
2017-08-28 09:14:43 +02:00
|
|
|
|
2020-04-08 21:32:49 +02:00
|
|
|
?>
|