2013-01-02 00:22:07 +01: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>
|
2019-12-10 01:05:31 +01:00
|
|
|
Portions created by the Initial Developer are Copyright (C) 2008-2019
|
2013-01-02 00:22:07 +01:00
|
|
|
the Initial Developer. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
Contributor(s):
|
|
|
|
|
Mark J Crane <markjcrane@fusionpbx.com>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
//define the voicemail class
|
|
|
|
|
class voicemail {
|
2019-12-10 01:05:31 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* declare public variables
|
|
|
|
|
*/
|
2013-01-02 00:22:07 +01:00
|
|
|
public $domain_uuid;
|
|
|
|
|
public $domain_name;
|
|
|
|
|
public $voicemail_uuid;
|
|
|
|
|
public $voicemail_id;
|
|
|
|
|
public $voicemail_message_uuid;
|
|
|
|
|
public $order_by;
|
|
|
|
|
public $order;
|
2020-02-13 15:15:59 +01:00
|
|
|
public $type;
|
2023-05-05 18:46:37 +02:00
|
|
|
public $db;
|
2019-12-10 01:05:31 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* declare private variables
|
|
|
|
|
*/
|
|
|
|
|
private $app_name;
|
|
|
|
|
private $app_uuid;
|
|
|
|
|
private $permission_prefix;
|
|
|
|
|
private $list_page;
|
|
|
|
|
private $table;
|
|
|
|
|
private $uuid_prefix;
|
|
|
|
|
private $toggle_field;
|
|
|
|
|
private $toggle_values;
|
2016-07-22 18:31:08 +02:00
|
|
|
|
|
|
|
|
public function __construct() {
|
2019-12-10 01:05:31 +01:00
|
|
|
|
|
|
|
|
//assign private variables
|
|
|
|
|
$this->app_name = 'voicemail';
|
2016-07-22 18:31:08 +02:00
|
|
|
$this->app_uuid = 'b523c2d2-64cd-46f1-9520-ca4b4098e044';
|
2019-12-10 01:05:31 +01:00
|
|
|
$this->permission_prefix = 'voicemail_';
|
|
|
|
|
$this->list_page = 'voicemails.php';
|
|
|
|
|
$this->table = 'voicemails';
|
|
|
|
|
$this->uuid_prefix = 'voicemail_';
|
|
|
|
|
$this->toggle_field = 'voicemail_enabled';
|
|
|
|
|
$this->toggle_values = ['true','false'];
|
2013-01-02 00:22:07 +01:00
|
|
|
|
2016-07-22 18:31:08 +02:00
|
|
|
//set the domain_uuid if not provided
|
2023-05-05 18:46:37 +02:00
|
|
|
if (strlen($this->domain_uuid ?? '') === 0) {
|
2016-07-22 18:31:08 +02:00
|
|
|
$this->domain_uuid = $_SESSION['domain_uuid'];
|
|
|
|
|
}
|
2019-12-10 01:05:31 +01:00
|
|
|
|
2016-07-22 18:31:08 +02:00
|
|
|
}
|
|
|
|
|
|
2016-12-01 19:53:12 +01:00
|
|
|
public function get_voicemail_id() {
|
2016-12-03 20:02:14 +01:00
|
|
|
|
|
|
|
|
//check if for valid input
|
2019-09-02 23:57:18 +02:00
|
|
|
if (!is_uuid($this->voicemail_uuid) || !is_uuid($this->domain_uuid)) {
|
2016-12-03 20:02:14 +01:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//get the voicemail id if it isn't set already
|
|
|
|
|
if (!isset($this->voicemail_id)) {
|
|
|
|
|
$sql = "select voicemail_id from v_voicemails ";
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "where domain_uuid = :domain_uuid ";
|
|
|
|
|
$sql .= "and voicemail_uuid = :voicemail_uuid ";
|
|
|
|
|
$parameters['domain_uuid'] = $this->domain_uuid;
|
|
|
|
|
$parameters['voicemail_uuid'] = $this->voicemail_uuid;
|
|
|
|
|
$database = new database;
|
|
|
|
|
$voicemail_id = $database->select($sql, $parameters, 'column');
|
|
|
|
|
if (is_numeric($voicemail_id)) {
|
|
|
|
|
$this->voicemail_id = $voicemail_id;
|
2016-12-03 20:02:14 +01:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
unset($sql, $parameters, $voicemail_id);
|
2016-12-01 19:53:12 +01:00
|
|
|
}
|
|
|
|
|
}
|
2016-07-22 18:31:08 +02:00
|
|
|
|
|
|
|
|
public function voicemails() {
|
2013-11-23 05:19:37 +01:00
|
|
|
|
2016-12-03 20:02:14 +01:00
|
|
|
//check if for valid input
|
2019-09-02 23:57:18 +02:00
|
|
|
if (!is_uuid($this->domain_uuid)) {
|
2016-12-03 20:02:14 +01:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-06 23:57:06 +02:00
|
|
|
//set the voicemail id and voicemail uuid arrays
|
2019-09-02 23:57:18 +02:00
|
|
|
if (isset($_SESSION['user']['extension'])) {
|
|
|
|
|
foreach ($_SESSION['user']['extension'] as $index => $row) {
|
2019-12-24 08:13:15 +01:00
|
|
|
$voicemail_ids[$index] = is_numeric($row['number_alias']) ? $row['number_alias'] : $row['user'];
|
2015-04-06 23:57:06 +02:00
|
|
|
}
|
|
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
if (isset($_SESSION['user']['voicemail'])) {
|
|
|
|
|
foreach ($_SESSION['user']['voicemail'] as $row) {
|
2023-05-05 18:46:37 +02:00
|
|
|
if (!empty($row['voicemail_uuid'])) {
|
2019-09-02 23:57:18 +02:00
|
|
|
$voicemail_uuids[]['voicemail_uuid'] = $row['voicemail_uuid'];
|
|
|
|
|
}
|
2014-11-15 01:16:29 +01:00
|
|
|
}
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//get the uuid and voicemail_id
|
|
|
|
|
$sql = "select * from v_voicemails ";
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "where domain_uuid = :domain_uuid ";
|
|
|
|
|
if (is_uuid($this->voicemail_uuid)) {
|
2013-11-23 05:19:37 +01:00
|
|
|
if (permission_exists('voicemail_delete')) {
|
|
|
|
|
//view specific voicemail box usually reserved for an admin or superadmin
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "and voicemail_uuid = :voicemail_uuid ";
|
|
|
|
|
$parameters['voicemail_uuid'] = $this->voicemail_uuid;
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
|
|
|
|
else {
|
2015-04-06 23:57:06 +02:00
|
|
|
//ensure that the requested voicemail box is assigned to this user
|
2013-11-23 05:19:37 +01:00
|
|
|
$found = false;
|
2016-12-03 20:02:14 +01:00
|
|
|
if (is_array($voicemail_uuids)) {
|
|
|
|
|
foreach($voicemail_uuids as $row) {
|
|
|
|
|
if ($voicemail_uuid == $row['voicemail_uuid']) {
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "and voicemail_uuid = :voicemail_uuid ";
|
|
|
|
|
$parameters['voicemail_uuid'] = $row['voicemail_uuid'];
|
2016-12-03 20:02:14 +01:00
|
|
|
$found = true;
|
|
|
|
|
}
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//id requested is not owned by the user return no results
|
|
|
|
|
if (!$found) {
|
2015-04-06 23:57:06 +02:00
|
|
|
$sql .= "and voicemail_uuid is null ";
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
2019-09-02 23:57:18 +02:00
|
|
|
if (is_array($voicemail_ids) && @sizeof($voicemail_ids) != 0) {
|
2013-11-23 05:19:37 +01:00
|
|
|
//show only the assigned voicemail ids
|
2019-12-24 08:13:15 +01:00
|
|
|
$sql .= "and ";
|
|
|
|
|
if (is_numeric($this->voicemail_id) && in_array($this->voicemail_id, $voicemail_ids)) {
|
|
|
|
|
$sql_where = 'voicemail_id = :voicemail_id ';
|
|
|
|
|
$parameters['voicemail_id'] = $this->voicemail_id;
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
2019-12-24 08:13:15 +01:00
|
|
|
else {
|
|
|
|
|
$x = 0;
|
|
|
|
|
foreach($voicemail_ids as $voicemail_id) {
|
|
|
|
|
$sql_where_or[] = "voicemail_id = :voicemail_id_".$x;
|
|
|
|
|
$parameters['voicemail_id_'.$x] = $voicemail_id;
|
|
|
|
|
$x++;
|
|
|
|
|
}
|
|
|
|
|
$sql_where .= '('.implode(' or ', $sql_where_or).') ';
|
|
|
|
|
}
|
|
|
|
|
$sql .= $sql_where;
|
2019-09-02 23:57:18 +02:00
|
|
|
unset($sql_where_or);
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
//no assigned voicemail ids so return no results
|
2015-04-06 23:57:06 +02:00
|
|
|
$sql .= "and voicemail_uuid is null ";
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
|
|
|
|
}
|
2015-01-29 08:18:29 +01:00
|
|
|
$sql .= "order by voicemail_id asc ";
|
2019-09-02 23:57:18 +02:00
|
|
|
$parameters['domain_uuid'] = $this->domain_uuid;
|
|
|
|
|
$database = new database;
|
|
|
|
|
$result = $database->select($sql, $parameters, 'all');
|
|
|
|
|
unset($sql, $parameters);
|
2013-11-23 05:19:37 +01:00
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-02 00:22:07 +01:00
|
|
|
public function messages() {
|
2013-11-23 05:19:37 +01:00
|
|
|
//get the voicemails
|
|
|
|
|
$voicemails = $this->voicemails();
|
|
|
|
|
|
|
|
|
|
//add the voicemail messages to the array
|
2019-09-02 23:57:18 +02:00
|
|
|
if (is_array($voicemails)) {
|
|
|
|
|
foreach ($voicemails as &$row) {
|
|
|
|
|
//get the voicemail messages
|
|
|
|
|
$this->voicemail_uuid = $row['voicemail_uuid'];
|
|
|
|
|
$this->voicemail_id = $row['voicemail_id'];
|
|
|
|
|
$result = $this->voicemail_messages();
|
|
|
|
|
$voicemail_count = count($result);
|
|
|
|
|
$row['messages'] = $result;
|
|
|
|
|
}
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
2013-01-02 00:22:07 +01:00
|
|
|
|
2013-11-23 05:19:37 +01:00
|
|
|
//return the array
|
|
|
|
|
return $voicemails;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function voicemail_messages() {
|
2016-12-03 20:02:14 +01:00
|
|
|
|
|
|
|
|
//check if for valid input
|
2019-09-02 23:57:18 +02:00
|
|
|
if (!is_numeric($this->voicemail_id) || !is_uuid($this->domain_uuid)) {
|
2016-12-03 20:02:14 +01:00
|
|
|
return false;
|
2013-01-02 00:22:07 +01:00
|
|
|
}
|
|
|
|
|
|
2016-12-03 20:02:14 +01:00
|
|
|
//get the message from the database
|
|
|
|
|
$sql = "select * from v_voicemail_messages as m, v_voicemails as v ";
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "where m.domain_uuid = :domain_uuid ";
|
2016-12-03 20:02:14 +01:00
|
|
|
$sql .= "and m.voicemail_uuid = v.voicemail_uuid ";
|
2019-09-02 23:57:18 +02:00
|
|
|
if (is_array($this->voicemail_id) && @sizeof($this->voicemail_id) != 0) {
|
2016-12-03 20:02:14 +01:00
|
|
|
$x = 0;
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "and ( ";
|
|
|
|
|
foreach ($this->voicemail_id as $row) {
|
|
|
|
|
$sql_where_or[] = "v.voicemail_id = :voicemail_id_".$x;
|
|
|
|
|
$parameters['voicemail_id_'.$x] = $row['voicemail_id'];
|
2016-12-03 20:02:14 +01:00
|
|
|
$x++;
|
2013-01-02 00:22:07 +01:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= implode(' or ', $sql_where_or);
|
2016-12-03 20:02:14 +01:00
|
|
|
$sql .= ") ";
|
2019-09-02 23:57:18 +02:00
|
|
|
unset($sql_where_or);
|
2016-12-03 20:02:14 +01:00
|
|
|
}
|
|
|
|
|
else {
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "and v.voicemail_id = :voicemail_id ";
|
|
|
|
|
$parameters['voicemail_id'] = $this->voicemail_id;
|
2016-12-03 20:02:14 +01:00
|
|
|
}
|
2023-05-05 18:46:37 +02:00
|
|
|
if (empty($this->order_by)) {
|
2016-12-03 20:02:14 +01:00
|
|
|
$sql .= "order by v.voicemail_id, m.created_epoch desc ";
|
|
|
|
|
}
|
|
|
|
|
else {
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "order by v.voicemail_id, m.".$this->order_by." ".$this->order." ";
|
2016-12-03 20:02:14 +01:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
$parameters['domain_uuid'] = $this->domain_uuid;
|
|
|
|
|
$database = new database;
|
|
|
|
|
$result = $database->select($sql, $parameters, 'all');
|
|
|
|
|
unset($sql, $parameters);
|
2016-12-03 20:02:14 +01:00
|
|
|
|
|
|
|
|
//update the array with additional information
|
|
|
|
|
if (is_array($result)) {
|
|
|
|
|
foreach($result as &$row) {
|
|
|
|
|
//set the greeting directory
|
|
|
|
|
$path = $_SESSION['switch']['voicemail']['dir'].'/default/'.$_SESSION['domain_name'].'/'.$row['voicemail_id'];
|
|
|
|
|
if (file_exists($path.'/msg_'.$row['voicemail_message_uuid'].'.wav')) {
|
|
|
|
|
$row['file_path'] = $path.'/msg_'.$row['voicemail_message_uuid'].'.wav';
|
|
|
|
|
}
|
|
|
|
|
if (file_exists($path.'/msg_'.$row['voicemail_message_uuid'].'.mp3')) {
|
|
|
|
|
$row['file_path'] = $path.'/msg_'.$row['voicemail_message_uuid'].'.mp3';
|
|
|
|
|
}
|
|
|
|
|
$row['file_size'] = filesize($row['file_path']);
|
|
|
|
|
$row['file_size_label'] = byte_convert($row['file_size']);
|
|
|
|
|
$row['file_ext'] = substr($row['file_path'], -3);
|
2019-12-13 20:56:48 +01:00
|
|
|
|
|
|
|
|
$message_minutes = floor($row['message_length'] / 60);
|
|
|
|
|
$message_seconds = $row['message_length'] % 60;
|
|
|
|
|
//use International System of Units (SI) - Source: https://en.wikipedia.org/wiki/International_System_of_Units
|
|
|
|
|
$row['message_length_label'] = ($message_minutes > 0 ? $message_minutes.' min' : null).($message_seconds > 0 ? ' '.$message_seconds.' s' : null);
|
2016-12-03 20:02:14 +01:00
|
|
|
$row['created_date'] = date("j M Y g:i a",$row['created_epoch']);
|
2013-01-02 00:22:07 +01:00
|
|
|
}
|
|
|
|
|
}
|
2016-12-03 20:02:14 +01:00
|
|
|
return $result;
|
2013-01-02 00:22:07 +01:00
|
|
|
}
|
|
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
public function voicemail_delete($records) {
|
|
|
|
|
if (permission_exists($this->permission_prefix.'delete')) {
|
2016-12-03 20:02:14 +01:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//add multi-lingual support
|
|
|
|
|
$language = new text;
|
|
|
|
|
$text = $language->get();
|
2016-12-03 21:32:55 +01:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//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;
|
|
|
|
|
}
|
2016-12-03 20:02:14 +01:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//delete multiple records
|
|
|
|
|
if (is_array($records) && @sizeof($records) != 0) {
|
2016-03-17 01:48:42 +01:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//filter out unchecked sip profiles
|
|
|
|
|
foreach ($records as $x => $record) {
|
|
|
|
|
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
|
|
|
|
|
$uuids[] = "'".$record['uuid']."'";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//get necessary voicemail details
|
|
|
|
|
if (is_array($uuids) && @sizeof($uuids) != 0) {
|
|
|
|
|
$sql = "select ".$this->uuid_prefix."uuid as uuid, voicemail_id from v_".$this->table." ";
|
|
|
|
|
$sql .= "where ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
|
|
|
|
|
$database = new database;
|
|
|
|
|
$rows = $database->select($sql, $parameters, 'all');
|
|
|
|
|
if (is_array($rows) && @sizeof($rows) != 0) {
|
|
|
|
|
foreach ($rows as $row) {
|
|
|
|
|
$voicemail_ids[$row['uuid']] = $row['voicemail_id'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
unset($sql, $parameters, $rows, $row);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//loop through voicemail ids
|
|
|
|
|
if (is_array($voicemail_ids) && @sizeof($voicemail_ids) != 0) {
|
|
|
|
|
$x = 0;
|
|
|
|
|
foreach ($voicemail_ids as $voicemail_uuid => $voicemail_id) {
|
|
|
|
|
|
|
|
|
|
//delete voicemail message recording and greeting files
|
|
|
|
|
if (is_numeric($voicemail_id)) {
|
|
|
|
|
$file_path = $_SESSION['switch']['voicemail']['dir']."/default/".$_SESSION['domain_name']."/".$voicemail_id;
|
|
|
|
|
foreach (glob($file_path."/*.*") as $file_name) {
|
|
|
|
|
@unlink($file_name);
|
|
|
|
|
}
|
|
|
|
|
@rmdir($file_path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//reset message waiting indicator status
|
|
|
|
|
$this->voicemail_id = $voicemail_id;
|
|
|
|
|
$this->voicemail_uuid = $voicemail_uuid;
|
|
|
|
|
$this->domain_uuid = $_SESSION['domain_uuid'];
|
|
|
|
|
$this->message_waiting();
|
|
|
|
|
|
|
|
|
|
//build the delete array
|
|
|
|
|
$array[$this->table][$x]['voicemail_uuid'] = $voicemail_uuid;
|
|
|
|
|
$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
|
|
|
|
|
$array['voicemail_options'][$x]['voicemail_uuid'] = $voicemail_uuid;
|
2020-03-04 03:13:16 +01:00
|
|
|
$array['voicemail_options'][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
|
2019-12-10 01:05:31 +01:00
|
|
|
$array['voicemail_messages'][$x]['voicemail_uuid'] = $voicemail_uuid;
|
2020-03-04 03:13:16 +01:00
|
|
|
$array['voicemail_messages'][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
|
2019-12-10 01:05:31 +01:00
|
|
|
$array['voicemail_destinations'][$x]['voicemail_uuid'] = $voicemail_uuid;
|
2020-03-04 03:13:16 +01:00
|
|
|
$array['voicemail_destinations'][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
|
2019-12-10 01:05:31 +01:00
|
|
|
if (is_numeric($voicemail_id)) {
|
|
|
|
|
$array['voicemail_greetings'][$x]['voicemail_id'] = $voicemail_id;
|
2020-03-04 03:13:16 +01:00
|
|
|
$array['voicemail_greetings'][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
|
2019-12-10 01:05:31 +01:00
|
|
|
}
|
2019-12-11 22:52:50 +01:00
|
|
|
$x++;
|
2019-12-10 01:05:31 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//delete the checked rows
|
|
|
|
|
if (is_array($array) && @sizeof($array) != 0) {
|
|
|
|
|
|
|
|
|
|
//grant temporary permissions
|
|
|
|
|
$p = new permissions;
|
|
|
|
|
$p->add('voicemail_delete', 'temp');
|
|
|
|
|
$p->add('voicemail_option_delete', 'temp');
|
|
|
|
|
$p->add('voicemail_message_delete', 'temp');
|
|
|
|
|
$p->add('voicemail_destination_delete', 'temp');
|
|
|
|
|
$p->add('voicemail_greeting_delete', 'temp');
|
|
|
|
|
|
|
|
|
|
//execute delete
|
|
|
|
|
$database = new database;
|
|
|
|
|
$database->app_name = $this->app_name;
|
|
|
|
|
$database->app_uuid = $this->app_uuid;
|
|
|
|
|
$database->delete($array);
|
|
|
|
|
unset($array);
|
|
|
|
|
|
|
|
|
|
//revoke temporary permissions
|
|
|
|
|
$p->delete('voicemail_delete', 'temp');
|
|
|
|
|
$p->delete('voicemail_option_delete', 'temp');
|
|
|
|
|
$p->delete('voicemail_message_delete', 'temp');
|
|
|
|
|
$p->delete('voicemail_destination_delete', 'temp');
|
|
|
|
|
$p->delete('voicemail_greeting_delete', 'temp');
|
|
|
|
|
|
2020-11-30 22:15:57 +01:00
|
|
|
//clear the destinations session array
|
|
|
|
|
if (isset($_SESSION['destinations']['array'])) {
|
|
|
|
|
unset($_SESSION['destinations']['array']);
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//set message
|
|
|
|
|
message::add($text['message-delete']);
|
|
|
|
|
}
|
|
|
|
|
unset($records, $voicemail_ids);
|
2016-12-03 21:32:55 +01:00
|
|
|
}
|
2019-12-10 01:05:31 +01:00
|
|
|
}
|
|
|
|
|
}
|
2016-03-17 01:48:42 +01:00
|
|
|
|
2020-03-04 03:13:16 +01:00
|
|
|
public function voicemail_options_delete($records) {
|
|
|
|
|
//assign private variables
|
|
|
|
|
$this->permission_prefix = 'voicemail_option_';
|
|
|
|
|
$this->list_page = 'voicemail_edit.php?id='.$this->voicemail_uuid;
|
|
|
|
|
$this->table = 'voicemail_options';
|
|
|
|
|
$this->uuid_prefix = 'voicemail_option_';
|
|
|
|
|
|
|
|
|
|
if (permission_exists($this->permission_prefix.'delete')) {
|
|
|
|
|
|
|
|
|
|
//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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//delete multiple records
|
|
|
|
|
if (is_array($records) && @sizeof($records) != 0) {
|
|
|
|
|
|
|
|
|
|
//filter out unchecked sip profiles
|
|
|
|
|
foreach ($records as $x => $record) {
|
|
|
|
|
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
|
|
|
|
|
//build the delete array
|
|
|
|
|
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
|
|
|
|
|
$array[$this->table][$x]['voicemail_uuid'] = $this->voicemail_uuid;
|
|
|
|
|
$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//delete the checked rows
|
|
|
|
|
if (is_array($array) && @sizeof($array) != 0) {
|
|
|
|
|
//execute delete
|
|
|
|
|
$database = new database;
|
|
|
|
|
$database->app_name = $this->app_name;
|
|
|
|
|
$database->app_uuid = $this->app_uuid;
|
|
|
|
|
$database->delete($array);
|
|
|
|
|
unset($array);
|
|
|
|
|
}
|
|
|
|
|
unset($records);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function voicemail_destinations_delete($records) {
|
|
|
|
|
//assign private variables
|
|
|
|
|
$this->list_page = 'voicemail_edit.php?id='.$this->voicemail_uuid;
|
|
|
|
|
$this->table = 'voicemail_destinations';
|
|
|
|
|
$this->uuid_prefix = 'voicemail_destination_';
|
|
|
|
|
|
|
|
|
|
if (permission_exists('voicemail_forward')) {
|
|
|
|
|
|
|
|
|
|
//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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//delete multiple records
|
|
|
|
|
if (is_array($records) && @sizeof($records) != 0) {
|
|
|
|
|
|
|
|
|
|
//filter out unchecked sip profiles
|
|
|
|
|
foreach ($records as $x => $record) {
|
|
|
|
|
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
|
|
|
|
|
//build the delete array
|
|
|
|
|
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $record['uuid'];
|
|
|
|
|
$array[$this->table][$x]['voicemail_uuid'] = $this->voicemail_uuid;
|
|
|
|
|
$array[$this->table][$x]['domain_uuid'] = $_SESSION['domain_uuid'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//delete the checked rows
|
|
|
|
|
if (is_array($array) && @sizeof($array) != 0) {
|
|
|
|
|
//grant temporary permissions
|
|
|
|
|
$p = new permissions;
|
|
|
|
|
$p->add('voicemail_destination_delete', 'temp');
|
|
|
|
|
|
|
|
|
|
//execute delete
|
|
|
|
|
$database = new database;
|
|
|
|
|
$database->app_name = $this->app_name;
|
|
|
|
|
$database->app_uuid = $this->app_uuid;
|
|
|
|
|
$database->delete($array);
|
|
|
|
|
unset($array);
|
|
|
|
|
|
|
|
|
|
//revoke temporary permissions
|
|
|
|
|
$p->delete('voicemail_destination_delete', 'temp');
|
|
|
|
|
}
|
|
|
|
|
unset($records);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
public function voicemail_toggle($records) {
|
|
|
|
|
if (permission_exists($this->permission_prefix.'edit')) {
|
2019-09-02 23:57:18 +02:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//add multi-lingual support
|
|
|
|
|
$language = new text;
|
|
|
|
|
$text = $language->get();
|
2019-09-02 23:57:18 +02:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//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;
|
|
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//toggle the checked records
|
|
|
|
|
if (is_array($records) && @sizeof($records) != 0) {
|
2019-09-02 23:57:18 +02:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//filter out unchecked sip profiles
|
|
|
|
|
foreach ($records as $x => $record) {
|
|
|
|
|
if ($record['checked'] == 'true' && is_uuid($record['uuid'])) {
|
|
|
|
|
$uuids[] = "'".$record['uuid']."'";
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//get necessary voicemail details
|
|
|
|
|
if (is_array($uuids) && @sizeof($uuids) != 0) {
|
|
|
|
|
$sql = "select ".$this->uuid_prefix."uuid as uuid, voicemail_id, ".$this->toggle_field." as toggle from v_".$this->table." ";
|
|
|
|
|
$sql .= "where (domain_uuid = :domain_uuid or domain_uuid is null) ";
|
|
|
|
|
$sql .= "and ".$this->uuid_prefix."uuid in (".implode(', ', $uuids).") ";
|
|
|
|
|
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
|
|
|
|
|
$database = new database;
|
|
|
|
|
$rows = $database->select($sql, $parameters, 'all');
|
|
|
|
|
if (is_array($rows) && @sizeof($rows) != 0) {
|
|
|
|
|
foreach ($rows as $row) {
|
|
|
|
|
$voicemails[$row['uuid']]['state'] = $row['toggle'];
|
|
|
|
|
$voicemails[$row['uuid']]['id'] = $row['voicemail_id'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
unset($sql, $parameters, $rows, $row);
|
|
|
|
|
}
|
2016-03-17 01:48:42 +01:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//loop through voicemails
|
|
|
|
|
if (is_array($voicemails) && @sizeof($voicemails) != 0) {
|
|
|
|
|
$x = 0;
|
|
|
|
|
foreach ($voicemails as $voicemail_uuid => $voicemail) {
|
|
|
|
|
|
|
|
|
|
//reset message waiting indicator status
|
|
|
|
|
$this->voicemail_id = $voicemail['id'];
|
|
|
|
|
$this->voicemail_uuid = $voicemail_uuid;
|
|
|
|
|
$this->domain_uuid = $_SESSION['domain_uuid'];
|
|
|
|
|
$this->message_waiting();
|
|
|
|
|
|
|
|
|
|
//build update array
|
|
|
|
|
$array[$this->table][$x][$this->uuid_prefix.'uuid'] = $voicemail_uuid;
|
|
|
|
|
$array[$this->table][$x][$this->toggle_field] = $voicemail['state'] == $this->toggle_values[0] ? $this->toggle_values[1] : $this->toggle_values[0];
|
|
|
|
|
$x++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//save the changes
|
|
|
|
|
if (is_array($array) && @sizeof($array) != 0) {
|
|
|
|
|
|
|
|
|
|
//save the array
|
|
|
|
|
$database = new database;
|
|
|
|
|
$database->app_name = $this->app_name;
|
|
|
|
|
$database->app_uuid = $this->app_uuid;
|
|
|
|
|
$database->save($array);
|
|
|
|
|
unset($array);
|
|
|
|
|
|
2020-11-30 22:15:57 +01:00
|
|
|
//clear the destinations session array
|
|
|
|
|
if (isset($_SESSION['destinations']['array'])) {
|
|
|
|
|
unset($_SESSION['destinations']['array']);
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-10 01:05:31 +01:00
|
|
|
//set message
|
|
|
|
|
message::add($text['message-toggle']);
|
|
|
|
|
}
|
|
|
|
|
unset($records, $voicemails);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2016-03-17 01:48:42 +01:00
|
|
|
}
|
|
|
|
|
|
2013-01-02 00:22:07 +01:00
|
|
|
public function message_count() {
|
2016-07-22 18:31:08 +02:00
|
|
|
|
2016-12-03 20:02:14 +01:00
|
|
|
//check if for valid input
|
2019-09-02 23:57:18 +02:00
|
|
|
if (!is_uuid($this->voicemail_uuid) || !is_uuid($this->domain_uuid)) {
|
2016-12-03 20:02:14 +01:00
|
|
|
return false;
|
2013-01-02 00:22:07 +01:00
|
|
|
}
|
2016-12-03 20:02:14 +01:00
|
|
|
|
|
|
|
|
//return the message count
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql = "select count(*) from v_voicemail_messages ";
|
|
|
|
|
$sql .= "where domain_uuid = :domain_uuid ";
|
|
|
|
|
$sql .= "and voicemail_uuid = :voicemail_uuid ";
|
|
|
|
|
$parameters['domain_uuid'] = $this->domain_uuid;
|
|
|
|
|
$parameters['voicemail_uuid'] = $this->voicemail_uuid;
|
|
|
|
|
$database = new database;
|
|
|
|
|
return $database->select($sql, $parameters, 'column');
|
|
|
|
|
unset($sql, $parameters);
|
|
|
|
|
|
2013-01-02 00:22:07 +01:00
|
|
|
}
|
|
|
|
|
|
2013-01-13 07:47:28 +01:00
|
|
|
public function message_waiting() {
|
2017-08-02 00:02:08 +02:00
|
|
|
//get the voicemail id
|
|
|
|
|
$this->get_voicemail_id();
|
|
|
|
|
|
2013-01-13 07:47:28 +01:00
|
|
|
//send the message waiting status
|
2016-03-29 01:50:07 +02:00
|
|
|
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
|
|
|
|
|
if ($fp) {
|
|
|
|
|
$switch_cmd .= "luarun app.lua voicemail mwi ".$this->voicemail_id."@".$_SESSION['domain_name'];
|
|
|
|
|
$switch_result = event_socket_request($fp, 'api '.$switch_cmd);
|
|
|
|
|
}
|
2013-01-13 07:47:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function message_delete() {
|
2017-08-02 00:02:08 +02:00
|
|
|
|
2016-12-03 20:02:14 +01:00
|
|
|
//get the voicemail id
|
|
|
|
|
$this->get_voicemail_id();
|
|
|
|
|
|
|
|
|
|
//check if for valid input
|
2019-09-02 23:57:18 +02:00
|
|
|
if (!is_numeric($this->voicemail_id)
|
|
|
|
|
|| !is_uuid($this->voicemail_uuid)
|
|
|
|
|
|| !is_uuid($this->domain_uuid)
|
|
|
|
|
|| !is_uuid($this->voicemail_message_uuid)
|
|
|
|
|
) {
|
2016-12-03 20:02:14 +01:00
|
|
|
return false;
|
|
|
|
|
}
|
2013-01-02 00:22:07 +01:00
|
|
|
|
2013-01-13 07:47:28 +01:00
|
|
|
//delete the recording
|
2015-11-02 18:22:13 +01:00
|
|
|
$file_path = $_SESSION['switch']['voicemail']['dir']."/default/".$_SESSION['domain_name']."/".$this->voicemail_id;
|
2019-09-02 23:57:18 +02:00
|
|
|
if (is_uuid($this->voicemail_message_uuid)) {
|
2016-09-03 23:43:30 +02:00
|
|
|
foreach (glob($file_path."/intro_".$this->voicemail_message_uuid.".*") as $file_name) {
|
|
|
|
|
unlink($file_name);
|
|
|
|
|
}
|
2016-05-11 06:53:42 +02:00
|
|
|
foreach (glob($file_path."/msg_".$this->voicemail_message_uuid.".*") as $file_name) {
|
|
|
|
|
unlink($file_name);
|
2016-03-17 01:48:42 +01:00
|
|
|
}
|
2013-11-23 05:19:37 +01:00
|
|
|
}
|
2016-03-17 01:48:42 +01:00
|
|
|
else {
|
2019-12-10 01:05:31 +01:00
|
|
|
foreach (glob($file_path."/msg_*.*") as $file_name) {
|
2016-05-11 06:53:42 +02:00
|
|
|
unlink($file_name); //remove all recordings
|
2016-03-17 01:48:42 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-02 23:57:18 +02:00
|
|
|
//build delete array
|
|
|
|
|
$array['voicemail_messages'][0]['domain_uuid'] = $this->domain_uuid;
|
|
|
|
|
$array['voicemail_messages'][0]['voicemail_uuid'] = $this->voicemail_uuid;
|
|
|
|
|
if (is_uuid($this->voicemail_message_uuid)) {
|
|
|
|
|
$array['voicemail_messages'][0]['voicemail_message_uuid'] = $this->voicemail_message_uuid;
|
2016-03-17 01:48:42 +01:00
|
|
|
}
|
2019-09-02 23:57:18 +02:00
|
|
|
|
|
|
|
|
//grant temporary permissions
|
|
|
|
|
$p = new permissions;
|
|
|
|
|
$p->add('voicemail_message_delete', 'temp');
|
|
|
|
|
|
|
|
|
|
//execute delete
|
|
|
|
|
$database = new database;
|
|
|
|
|
$database->app_name = 'voicemails';
|
|
|
|
|
$database->app_uuid = 'b523c2d2-64cd-46f1-9520-ca4b4098e044';
|
|
|
|
|
$database->delete($array);
|
|
|
|
|
unset($array);
|
|
|
|
|
|
|
|
|
|
//revoke temporary permissions
|
|
|
|
|
$p->delete('voicemail_message_delete', 'temp');
|
2013-01-02 00:22:07 +01:00
|
|
|
|
2013-01-13 07:47:28 +01:00
|
|
|
//check the message waiting status
|
|
|
|
|
$this->message_waiting();
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-29 01:50:07 +02:00
|
|
|
public function message_toggle() {
|
|
|
|
|
|
2016-12-03 20:02:14 +01:00
|
|
|
//check if for valid input
|
2019-09-02 23:57:18 +02:00
|
|
|
if (!is_uuid($this->voicemail_uuid)
|
|
|
|
|
|| !is_uuid($this->domain_uuid)
|
|
|
|
|
|| !is_uuid($this->voicemail_message_uuid)
|
|
|
|
|
) {
|
2016-12-03 20:02:14 +01:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-29 01:50:07 +02:00
|
|
|
//get message status
|
|
|
|
|
$sql = "select message_status from v_voicemail_messages ";
|
2019-09-02 23:57:18 +02:00
|
|
|
$sql .= "where voicemail_message_uuid = :voicemail_message_uuid ";
|
|
|
|
|
$parameters['voicemail_message_uuid'] = $this->voicemail_message_uuid;
|
|
|
|
|
$database = new database;
|
|
|
|
|
$new_status = $database->select($sql, $parameters, 'column') != 'saved' ? 'saved' : null;
|
|
|
|
|
unset($sql, $parameters);
|
|
|
|
|
|
|
|
|
|
//build message status update array
|
|
|
|
|
$array['voicemail_messages'][0]['voicemail_message_uuid'] = $this->voicemail_message_uuid;
|
|
|
|
|
$array['voicemail_messages'][0]['message_status'] = $new_status;
|
|
|
|
|
|
|
|
|
|
//grant temporary permissions
|
|
|
|
|
$p = new permissions;
|
|
|
|
|
$p->add('voicemail_message_edit', 'temp');
|
|
|
|
|
|
|
|
|
|
//execute update
|
|
|
|
|
$database = new database;
|
|
|
|
|
$database->app_name = 'voicemails';
|
|
|
|
|
$database->app_uuid = 'b523c2d2-64cd-46f1-9520-ca4b4098e044';
|
|
|
|
|
$database->save($array);
|
|
|
|
|
unset($array);
|
|
|
|
|
|
|
|
|
|
//revoke temporary permissions
|
|
|
|
|
$p->delete('voicemail_message_edit', 'temp');
|
2016-03-29 01:50:07 +02:00
|
|
|
|
|
|
|
|
//check the message waiting status
|
|
|
|
|
$this->message_waiting();
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-13 07:47:28 +01:00
|
|
|
public function message_saved() {
|
2016-07-22 18:31:08 +02:00
|
|
|
|
2016-12-03 20:02:14 +01:00
|
|
|
//check if for valid input
|
2019-09-02 23:57:18 +02:00
|
|
|
if (!is_uuid($this->voicemail_uuid)
|
|
|
|
|
|| !is_uuid($this->domain_uuid)
|
|
|
|
|
|| !is_uuid($this->voicemail_message_uuid)
|
|
|
|
|
) {
|
2016-12-03 20:02:14 +01:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-02 23:57:18 +02:00
|
|
|
//build message status update array
|
|
|
|
|
$array['voicemail_messages'][0]['voicemail_message_uuid'] = $this->voicemail_message_uuid;
|
|
|
|
|
$array['voicemail_messages'][0]['message_status'] = 'saved';
|
|
|
|
|
|
|
|
|
|
//grant temporary permissions
|
|
|
|
|
$p = new permissions;
|
|
|
|
|
$p->add('voicemail_message_edit', 'temp');
|
|
|
|
|
|
|
|
|
|
//execute update
|
|
|
|
|
$database = new database;
|
|
|
|
|
$database->app_name = 'voicemails';
|
|
|
|
|
$database->app_uuid = 'b523c2d2-64cd-46f1-9520-ca4b4098e044';
|
|
|
|
|
$database->save($array);
|
|
|
|
|
unset($array);
|
|
|
|
|
|
|
|
|
|
//revoke temporary permissions
|
|
|
|
|
$p->delete('voicemail_message_edit', 'temp');
|
2016-03-19 20:54:24 +01:00
|
|
|
|
2013-01-13 07:47:28 +01:00
|
|
|
//check the message waiting status
|
|
|
|
|
$this->message_waiting();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function message_download() {
|
|
|
|
|
|
2016-12-03 20:02:14 +01:00
|
|
|
//check if for valid input
|
2023-03-30 01:46:51 +02:00
|
|
|
if (!is_numeric($this->voicemail_id)
|
|
|
|
|
|| !is_uuid($this->voicemail_uuid)
|
|
|
|
|
|| !is_uuid($this->domain_uuid)
|
|
|
|
|
|| !is_uuid($this->voicemail_message_uuid)
|
|
|
|
|
) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2016-12-03 20:02:14 +01:00
|
|
|
|
2013-01-13 07:47:28 +01:00
|
|
|
//change the message status
|
2023-03-30 01:46:51 +02:00
|
|
|
$this->message_saved();
|
2013-01-13 07:47:28 +01:00
|
|
|
|
2015-04-23 02:10:31 +02:00
|
|
|
//set source folder path
|
2023-03-30 01:46:51 +02:00
|
|
|
$path = $_SESSION['switch']['voicemail']['dir'].'/default/'.$_SESSION['domain_name'].'/'.$this->voicemail_id;
|
2015-04-23 02:10:31 +02:00
|
|
|
|
|
|
|
|
//prepare base64 content from db, if enabled
|
2023-03-30 01:46:51 +02:00
|
|
|
if ($_SESSION['voicemail']['storage_type']['text'] == 'base64') {
|
|
|
|
|
$sql = "select message_base64 ";
|
|
|
|
|
$sql .= "from ";
|
|
|
|
|
$sql .= "v_voicemail_messages as m, ";
|
|
|
|
|
$sql .= "v_voicemails as v ";
|
|
|
|
|
$sql .= "where ";
|
|
|
|
|
$sql .= "m.voicemail_uuid = v.voicemail_uuid ";
|
|
|
|
|
$sql .= "and v.voicemail_id = :voicemail_id ";
|
|
|
|
|
$sql .= "and m.voicemail_uuid = :voicemail_uuid ";
|
|
|
|
|
$sql .= "and m.domain_uuid = :domain_uuid ";
|
|
|
|
|
$sql .= "and m.voicemail_message_uuid = :voicemail_message_uuid ";
|
|
|
|
|
$parameters['voicemail_id'] = $this->voicemail_id;
|
|
|
|
|
$parameters['voicemail_uuid'] = $this->voicemail_uuid;
|
|
|
|
|
$parameters['domain_uuid'] = $this->domain_uuid;
|
|
|
|
|
$parameters['voicemail_message_uuid'] = $this->voicemail_message_uuid;
|
|
|
|
|
$database = new database;
|
|
|
|
|
$message_base64 = $database->select($sql, $parameters, 'column');
|
|
|
|
|
if ($message_base64 != '') {
|
|
|
|
|
$message_decoded = base64_decode($message_base64);
|
|
|
|
|
file_put_contents($path.'/msg_'.$this->voicemail_message_uuid.'.ext', $message_decoded);
|
|
|
|
|
$finfo = finfo_open(FILEINFO_MIME_TYPE); //determine mime type (requires PHP >= 5.3.0, must be manually enabled on Windows)
|
|
|
|
|
$file_mime = finfo_file($finfo, $path.'/msg_'.$this->voicemail_message_uuid.'.ext');
|
|
|
|
|
finfo_close($finfo);
|
|
|
|
|
switch ($file_mime) {
|
|
|
|
|
case 'audio/x-wav':
|
|
|
|
|
case 'audio/wav':
|
|
|
|
|
$file_ext = 'wav';
|
|
|
|
|
break;
|
|
|
|
|
case 'audio/mpeg':
|
|
|
|
|
case 'audio/mp3':
|
|
|
|
|
$file_ext = 'mp3';
|
|
|
|
|
break;
|
2015-04-23 02:10:31 +02:00
|
|
|
}
|
2023-03-30 01:46:51 +02:00
|
|
|
rename($path.'/msg_'.$this->voicemail_message_uuid.'.ext', $path.'/msg_'.$this->voicemail_message_uuid.'.'.$file_ext);
|
2015-04-23 02:10:31 +02:00
|
|
|
}
|
2023-03-30 01:46:51 +02:00
|
|
|
unset($sql, $parameters, $message_base64, $message_decoded);
|
|
|
|
|
}
|
2015-04-23 02:10:31 +02:00
|
|
|
|
|
|
|
|
//prepare and stream the file
|
2023-03-30 01:46:51 +02:00
|
|
|
if (file_exists($path.'/msg_'.$this->voicemail_message_uuid.'.wav')) {
|
|
|
|
|
$file_path = $path.'/msg_'.$this->voicemail_message_uuid.'.wav';
|
|
|
|
|
} else if (file_exists($path.'/msg_'.$this->voicemail_message_uuid.'.mp3')) {
|
|
|
|
|
$file_path = $path.'/msg_'.$this->voicemail_message_uuid.'.mp3';
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2020-03-31 04:08:45 +02:00
|
|
|
|
2023-03-30 01:46:51 +02:00
|
|
|
if ($file_path == '') {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//content-range
|
|
|
|
|
if (isset($_SERVER['HTTP_RANGE']) && $this->type != 'bin') {
|
|
|
|
|
$this->range_download($file_path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$fd = fopen($file_path, "rb");
|
|
|
|
|
if ($this->type == 'bin') {
|
|
|
|
|
header("Content-Type: application/force-download");
|
|
|
|
|
header("Content-Type: application/octet-stream");
|
|
|
|
|
header("Content-Type: application/download");
|
|
|
|
|
header("Content-Description: File Transfer");
|
|
|
|
|
$file_ext = pathinfo($file_path, PATHINFO_EXTENSION);
|
|
|
|
|
switch ($file_ext) {
|
|
|
|
|
case "wav" : header('Content-Disposition: attachment; filename="msg_'.$this->voicemail_message_uuid.'.wav"'); break;
|
|
|
|
|
case "mp3" : header('Content-Disposition: attachment; filename="msg_'.$this->voicemail_message_uuid.'.mp3"'); break;
|
|
|
|
|
case "ogg" : header('Content-Disposition: attachment; filename="msg_'.$this->voicemail_message_uuid.'.ogg"'); break;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$file_ext = pathinfo($file_path, PATHINFO_EXTENSION);
|
|
|
|
|
switch ($file_ext) {
|
|
|
|
|
case "wav" : header("Content-Type: audio/x-wav"); break;
|
|
|
|
|
case "mp3" : header("Content-Type: audio/mpeg"); break;
|
|
|
|
|
case "ogg" : header("Content-Type: audio/ogg"); break;
|
2013-01-02 00:22:07 +01:00
|
|
|
}
|
2023-03-30 01:46:51 +02:00
|
|
|
}
|
|
|
|
|
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
|
|
|
|
|
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // date in the past
|
|
|
|
|
if ($this->type == 'bin') {
|
|
|
|
|
header("Content-Length: ".filesize($file_path));
|
|
|
|
|
}
|
|
|
|
|
ob_end_clean();
|
|
|
|
|
fpassthru($fd);
|
2015-04-23 02:10:31 +02:00
|
|
|
|
|
|
|
|
//if base64, remove temp file
|
2023-03-30 01:46:51 +02:00
|
|
|
if ($_SESSION['voicemail']['storage_type']['text'] == 'base64') {
|
|
|
|
|
@unlink($path.'/msg_'.$this->voicemail_message_uuid.'.'.$file_ext);
|
|
|
|
|
}
|
2015-04-23 02:10:31 +02:00
|
|
|
|
2019-09-02 23:57:18 +02:00
|
|
|
}
|
|
|
|
|
|
2020-03-31 04:08:45 +02:00
|
|
|
/*
|
|
|
|
|
* range download method (helps safari play audio sources)
|
|
|
|
|
*/
|
|
|
|
|
private function range_download($file) {
|
|
|
|
|
$fp = @fopen($file, 'rb');
|
|
|
|
|
|
|
|
|
|
$size = filesize($file); // File size
|
|
|
|
|
$length = $size; // Content length
|
|
|
|
|
$start = 0; // Start byte
|
|
|
|
|
$end = $size - 1; // End byte
|
|
|
|
|
// Now that we've gotten so far without errors we send the accept range header
|
|
|
|
|
/* At the moment we only support single ranges.
|
|
|
|
|
* Multiple ranges requires some more work to ensure it works correctly
|
|
|
|
|
* and comply with the spesifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
|
|
|
|
|
*
|
|
|
|
|
* Multirange support annouces itself with:
|
|
|
|
|
* header('Accept-Ranges: bytes');
|
|
|
|
|
*
|
|
|
|
|
* Multirange content must be sent with multipart/byteranges mediatype,
|
|
|
|
|
* (mediatype = mimetype)
|
|
|
|
|
* as well as a boundry header to indicate the various chunks of data.
|
|
|
|
|
*/
|
|
|
|
|
header("Accept-Ranges: 0-$length");
|
|
|
|
|
// header('Accept-Ranges: bytes');
|
|
|
|
|
// multipart/byteranges
|
|
|
|
|
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2
|
|
|
|
|
if (isset($_SERVER['HTTP_RANGE'])) {
|
|
|
|
|
|
|
|
|
|
$c_start = $start;
|
|
|
|
|
$c_end = $end;
|
|
|
|
|
// Extract the range string
|
|
|
|
|
list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
|
|
|
|
|
// Make sure the client hasn't sent us a multibyte range
|
|
|
|
|
if (strpos($range, ',') !== false) {
|
|
|
|
|
// (?) Shoud this be issued here, or should the first
|
|
|
|
|
// range be used? Or should the header be ignored and
|
|
|
|
|
// we output the whole content?
|
|
|
|
|
header('HTTP/1.1 416 Requested Range Not Satisfiable');
|
|
|
|
|
header("Content-Range: bytes $start-$end/$size");
|
|
|
|
|
// (?) Echo some info to the client?
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
// If the range starts with an '-' we start from the beginning
|
|
|
|
|
// If not, we forward the file pointer
|
|
|
|
|
// And make sure to get the end byte if spesified
|
|
|
|
|
if ($range0 == '-') {
|
|
|
|
|
// The n-number of the last bytes is requested
|
|
|
|
|
$c_start = $size - substr($range, 1);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$range = explode('-', $range);
|
|
|
|
|
$c_start = $range[0];
|
|
|
|
|
$c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
|
|
|
|
|
}
|
|
|
|
|
/* Check the range and make sure it's treated according to the specs.
|
|
|
|
|
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
|
|
|
|
|
*/
|
|
|
|
|
// End bytes can not be larger than $end.
|
|
|
|
|
$c_end = ($c_end > $end) ? $end : $c_end;
|
|
|
|
|
// Validate the requested range and return an error if it's not correct.
|
|
|
|
|
if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) {
|
|
|
|
|
|
|
|
|
|
header('HTTP/1.1 416 Requested Range Not Satisfiable');
|
|
|
|
|
header("Content-Range: bytes $start-$end/$size");
|
|
|
|
|
// (?) Echo some info to the client?
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
$start = $c_start;
|
|
|
|
|
$end = $c_end;
|
|
|
|
|
$length = $end - $start + 1; // Calculate new content length
|
|
|
|
|
fseek($fp, $start);
|
|
|
|
|
header('HTTP/1.1 206 Partial Content');
|
|
|
|
|
}
|
|
|
|
|
// Notify the client the byte range we'll be outputting
|
|
|
|
|
header("Content-Range: bytes $start-$end/$size");
|
|
|
|
|
header("Content-Length: $length");
|
|
|
|
|
|
|
|
|
|
// Start buffered download
|
|
|
|
|
$buffer = 1024 * 8;
|
|
|
|
|
while(!feof($fp) && ($p = ftell($fp)) <= $end) {
|
|
|
|
|
if ($p + $buffer > $end) {
|
|
|
|
|
// In case we're only outputtin a chunk, make sure we don't
|
|
|
|
|
// read past the length
|
|
|
|
|
$buffer = $end - $p + 1;
|
|
|
|
|
}
|
|
|
|
|
set_time_limit(0); // Reset time limit for big files
|
|
|
|
|
echo fread($fp, $buffer);
|
|
|
|
|
flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fclose($fp);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2013-01-02 00:22:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//example voicemail messages
|
|
|
|
|
//require_once "app/voicemails/resources/classes/voicemail.php";
|
|
|
|
|
//$voicemail = new voicemail;
|
|
|
|
|
//$voicemail->db = $db;
|
|
|
|
|
//$voicemail->voicemail_uuid = $voicemail_uuid;
|
|
|
|
|
//$voicemail->order_by = $order_by;
|
|
|
|
|
//$voicemail->order = $order;
|
|
|
|
|
//$result = $voicemail->messages();
|
|
|
|
|
//$result_count = count($result);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Array
|
|
|
|
|
(
|
|
|
|
|
[user] => 1002
|
|
|
|
|
[extension_uuid] => e163fc03-f180-459b-aa12-7ed87fcb6e2c
|
|
|
|
|
[outbound_caller_id_name] => FusionPBX
|
2016-07-22 18:31:08 +02:00
|
|
|
[outbound_caller_id_number] => 12089068227
|
2013-01-02 00:22:07 +01:00
|
|
|
)
|
|
|
|
|
Array
|
|
|
|
|
(
|
|
|
|
|
[user] => 1020
|
|
|
|
|
[extension_uuid] => ecfb23df-7c59-4286-891e-2abdc48856ac
|
|
|
|
|
[outbound_caller_id_name] => Mark J Crane
|
2016-07-22 18:31:08 +02:00
|
|
|
[outbound_caller_id_number] => 12089068227
|
2013-01-02 00:22:07 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
foreach ($_SESSION['user']['extension'] as $value) {
|
2023-05-05 18:46:37 +02:00
|
|
|
if (!empty($value['user'])) {
|
2013-01-02 00:22:07 +01:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
2023-03-30 01:46:51 +02:00
|
|
|
?>
|