$value) {
$data = $this->getProtocolRecordSettings($value['table'],$_SESSION['ari_user']['extension']);
if (count($data)) {
$this->protocol_table = $value['table'];
$this->protocol_config_files = $value['config_files'];
break;
}
}
}
/*
* Adds menu item to nav menu
*
* @param $args
* Common arguments
*/
function navMenu($args) {
$ret = "";
$exten = $_SESSION['ari_user']['extension'];
// and we are not logged in as admin
if ($exten!=$ARI_ADMIN_USERNAME) {
$ret .= "
" . _("Phone Settings") . "
";
}
return $ret;
}
/*
* Acts on the user settings
*
* @param $args
* Common arguments
* @param $a
* action
*/
function action($args) {
global $ARI_ADMIN_USERNAME;
global $ASTERISK_VOICEMAIL_CONF;
global $SETTINGS_ALLOW_VOICEMAIL_SETTINGS;
global $SETTINGS_ALLOW_VOICEMAIL_PASSWORD_SET;
global $SETTINGS_VOICEMAIL_PASSWORD_LENGTH;
global $SETTINGS_VOICEMAIL_PASSWORD_EXACT;
global $SETTINGS_ALLOW_CALL_RECORDING_SET;
// args
$m = getArgument($args,'m');
$a = getArgument($args,'a');
$voicemail_password = getArgument($args,'voicemail_password');
$voicemail_password_confirm = getArgument($args,'voicemail_password_confirm');
$voicemail_email_address = getArgument($args,'voicemail_email_address');
$voicemail_pager_address = getArgument($args,'voicemail_pager_address');
$voicemail_email_enable = getArgument($args,'voicemail_email_enable');
$voicemail_audio_format = getArgument($args,'voicemail_audio_format');
$record_in = getArgument($args,'record_in');
$record_out = getArgument($args,'record_out');
if (isset($_SESSION['ari_user']['voicemail_email'])) {
foreach (array_keys($_SESSION['ari_user']['voicemail_email']) as $key) {
$var = "voicemail_email_$key";
$$var = getArgument($args,$var);
}
}
if ($a=='update') {
$exten = $_SESSION['ari_user']['extension'];
if ($exten!=$ARI_ADMIN_USERNAME) {
// Make sure Follow-Me setup has not been deleted for this user since the last refresh
$follow_me_disabled_delayed = $_COOKIE['ari_follow_me_disabled'];
// voicemail settings
if ($SETTINGS_ALLOW_VOICEMAIL_SETTINGS && $_SESSION['ari_user']['voicemail_enabled']==1) {
// update voicemail password
if ($SETTINGS_ALLOW_VOICEMAIL_PASSWORD_SET) {
// update voicemail password
if ($voicemail_password=='' || $voicemail_password_confirm=='') {
$_SESSION['ari_error'] =
_("Voicemail password not changed") . " " .
_("Password and password confirm must not be blank");
}
else if ((strlen($voicemail_password)<$SETTINGS_VOICEMAIL_PASSWORD_LENGTH) || !is_numeric($voicemail_password)) {
$_SESSION['ari_error'] =
_("Voicemail password not changed") . " " .
sprintf(_("Passwords must be all numbers and greater than %d digits"),$SETTINGS_VOICEMAIL_PASSWORD_LENGTH);
}
else if (strlen($voicemail_password)!=$SETTINGS_VOICEMAIL_PASSWORD_LENGTH && $SETTINGS_VOICEMAIL_PASSWORD_EXACT || !is_numeric($voicemail_password)) {
$_SESSION['ari_error'] =
_("Voicemail password not changed") . " " .
sprintf(_("Passwords must be all numbers and only %d digits"),$SETTINGS_VOICEMAIL_PASSWORD_LENGTH);
}
else if ($voicemail_password!=$voicemail_password_confirm) {
$_SESSION['ari_error'] =
_("Voicemail password not changed") . " " .
_("Password and password confirm do not match");
}
else {
// check for writable the files
$temp_file = $ASTERISK_VOICEMAIL_CONF . ".tmp";
$fp = fopen($temp_file, "w");
if (!$fp) {
$_SESSION['ari_error'] =
_("Voicemail password not changed") . " " .
sprintf(_("%s does not exist or is not writable"),$temp_file);
}
else if (!is_writable($ASTERISK_VOICEMAIL_CONF)) {
$_SESSION['ari_error'] =
_("Voicemail password not changed") . " " .
sprintf(_("%s does not exist or is not writable"),$ASTERISK_VOICEMAIL_CONF);
}
else {
// update session
$_SESSION['ari_user']['voicemail_password'] = $voicemail_password;
// save password
$lines = file($ASTERISK_VOICEMAIL_CONF);
foreach ($lines as $key => $line) {
unset($value);
list($var,$value) = split('=>',$line);
$var = trim($var);
if ($var==$exten && $value) {
// write out line with password change
$buf = split(',',$value);
$buf[0] = $voicemail_password;
$line = $var . " => " . join(',', $buf);
fwrite($fp, $line);
}
else {
// write out original line with no changes
fwrite($fp, $line);
}
}
fclose($fp);
unlink($ASTERISK_VOICEMAIL_CONF);
rename($temp_file,$ASTERISK_VOICEMAIL_CONF);
$voicemail_reload = 1;
}
}
// voicemail email address
if ($voicemail_email_enable &&
($voicemail_email_address && !preg_match('/@/',$voicemail_email_address) ||
($voicemail_pager_address && !preg_match('/@/',$voicemail_pager_address)))) {
$_SESSION['ari_error'] =
_("Voicemail email and pager address not changed") . " " .
("'$voicemail_email_address' and '$voicemail_pager_address' must be a valid email addresses");
}
else {
// check for writable the files
$temp_file = $ASTERISK_VOICEMAIL_CONF . ".tmp";
$fp = fopen($temp_file, "w");
if (!$fp) {
$_SESSION['ari_error'] =
_("Voicemail email settings not changed") . " " .
sprintf(_("%s does not exist or is not writable"),$temp_file);
}
else if (!is_writable($ASTERISK_VOICEMAIL_CONF)) {
$_SESSION['ari_error'] =
_("Voicemail email settings not changed") . " " .
sprintf(_("%s does not exist or is not writable"),$ASTERISK_VOICEMAIL_CONF);
}
else {
// store cookie
if ($voicemail_email_enable) {
setcookie("ari_voicemail_email_address", $voicemail_email_address, time()+365*24*60*60);
setcookie("ari_voicemail_pager_address", $voicemail_pager_address, time()+365*24*60*60);
foreach (array_keys($_SESSION['ari_user']['voicemail_email']) as $key) {
$var = "voicemail_email_$key";
$var_cookie = "ari_" . $var;
setcookie("$var_cookie", $$var, time()+365*24*60*60);
}
}
// update session
$_SESSION['ari_user']['voicemail_email_enable'] = $voicemail_email_enable;
if ($voicemail_email_enable) {
$_SESSION['ari_user']['voicemail_email_address'] = $voicemail_email_address;
$_SESSION['ari_user']['voicemail_pager_address'] = $voicemail_pager_address;
foreach (array_keys($_SESSION['ari_user']['voicemail_email']) as $key) {
$option = "voicemail_email_$key";
$_SESSION['ari_user']['voicemail_email'][$key] = $$option;
}
}
// save settings
if (!$voicemail_email_enable) {
$voicemail_email_address = '';
$voicemail_pager_address = '';
}
$lines = file($ASTERISK_VOICEMAIL_CONF);
foreach ($lines as $key => $line) {
unset($value);
list($var,$value) = split('=>',$line);
$var = trim($var);
if ($var==$exten && $value) {
// write out line with voicemail email change
$buf = split(',',$value);
$buf[2] = $voicemail_email_address;
$buf[3] = $voicemail_pager_address;
foreach ($_SESSION['ari_user']['voicemail_email'] as $key => $value) {
$option = "voicemail_email_$key";
if ($$option && $key) {
$options .= $key . "=" . $value;
}
else {
$options .= $key . "=no";
}
$options .= "|";
}
$buf[4] = substr($options, 0, -1);
$line = $var . " =>" . join(',', $buf);
if (substr($line, 0, -1)!="\n") {
$line .= "\n";
}
fwrite($fp, $line);
}
else {
// write out original line with no changes
fwrite($fp, $line);
}
}
fclose($fp);
unlink($ASTERISK_VOICEMAIL_CONF);
rename($temp_file,$ASTERISK_VOICEMAIL_CONF);
$voicemail_reload = 1;
}
}
// reload asterisk voicemail
if ($voicemail_reload) {
$this->reloadAsteriskVoicemail();
}
}
// update voicemail audio format setting
setcookie("ari_voicemail_audio_format", $voicemail_audio_format, time()+365*24*60*60);
}
// update call monitor record setting
if ($SETTINGS_ALLOW_CALL_RECORDING_SET) {
if ($record_in && $record_out) {
$this->setRecordSettings($exten,$record_in,$record_out);
}
}
}
}
// redirect to see updated page
$ret .= "
";
return $ret;
}
/*
* Displays stats page
*
* @param $args
* Common arguments
*/
function display($args) {
global $SETTINGS_ALLOW_VOICEMAIL_SETTINGS;
global $SETTINGS_ALLOW_VOICEMAIL_PASSWORD_SET;
global $SETTINGS_VOICEMAIL_PASSWORD_LENGTH;
global $SETTINGS_VOICEMAIL_EMAIL_OPTION_DESCRIPTIONS;
global $ARI_VOICEMAIL_AUDIO_FORMAT_DEFAULT;
global $SETTINGS_ALLOW_CALL_RECORDING_SET;
global $loaded_modules;
// args
$m = getArgument($args,'m');
$q = getArgument($args,'q');
$start = getArgument($args,'start');
$span = getArgument($args,'span');
$displayname = $_SESSION['ari_user']['displayname'];
$exten = $_SESSION['ari_user']['extension'];
$language = new Language();
$display = new DisplaySearch();
// get data
$data = $this->getRecordSettings($_SESSION['ari_user']['extension']);
// lang setting options
if (extension_loaded('gettext')) {
$setLangText = "" . _("Language:") . " " . $language->GetForm() . "
";
}
// voicemail settings
if ($SETTINGS_ALLOW_VOICEMAIL_SETTINGS && $_SESSION['ari_user']['voicemail_enabled']==1 &&
in_array('voicemail',array_keys($loaded_modules))) {
if ($SETTINGS_ALLOW_VOICEMAIL_PASSWORD_SET) {
if ($SETTINGS_VOICEMAIL_PASSWORD_EXACT) {
$voicemail_password_length_message = sprintf(_("Passwords must be all numbers and only %s digits"),$SETTINGS_VOICEMAIL_PASSWORD_LENGTH);
}
else {
$voicemail_password_length_message = sprintf(_("Passwords must be all numbers and at least %s digits"),$SETTINGS_VOICEMAIL_PASSWORD_LENGTH);
}
$set_voicemail_password_text = "
" . _("Voicemail Password:") . "
" . _("Enter again to confirm:") . "
" . $voicemail_password_length_message . "
";
}
if (isset($_SESSION['ari_user']['voicemail_email'])) {
if ($_SESSION['ari_user']['voicemail_email_enable']) {
$voicemail_email_address = $_SESSION['ari_user']['voicemail_email_address'];
$voicemail_pager_address = $_SESSION['ari_user']['voicemail_pager_address'];
$voicemail_email_enable = 'checked';
foreach (array_keys($_SESSION['ari_user']['voicemail_email']) as $key) {
$var = "voicemail_email_$key";
$var_enable = $var . "enable";
if ($_SESSION['ari_user']['voicemail_email'][$key]=='yes') {
$$var_enable = 'checked';
}
}
}
else {
$voicemail_email_address = $_COOKIE['ari_voicemail_email_address'];
$voicemail_email_text_box_options = "disabled style='background: #DDD;'";
$voicemail_pager_address = $_COOKIE['ari_voicemail_pager_address'];
$voicemail_pager_text_box_options = "disabled style='background: #DDD;'";
foreach ($_SESSION['ari_user']['voicemail_email'] as $key => $value) {
$var = "voicemail_email_$key";
$var_cookie = "ari_" . $var;
$var_enable = $var . "enable";
$var_text_box_options = $var . "text_box_options";
$$var_text_box_options = "disabled";
if ($_COOKIE[$var_cookie]=='yes') {
$$var_enable = 'checked';
}
}
}
$set_voicemail_email_text = "
" . _("Email Notification") . "
" ._("Enable") . "
" . _("Email Voicemail To:") . "" . ("Email a notification, including audio file if indicated below.") . "
" . _("Pager Email Notification To:") . "" . ("Email a short notification") . "
";
foreach ($_SESSION['ari_user']['voicemail_email'] as $key => $value) {
$var = "voicemail_email_$key";
$var_enable = $var . "enable";
$var_text_box_options = $var . "text_box_options";
if ($SETTINGS_VOICEMAIL_EMAIL_OPTION_DESCRIPTIONS[$key]) {
$var_text = $SETTINGS_VOICEMAIL_EMAIL_OPTION_DESCRIPTIONS[$key];
}
else {
$var_text = $key;
}
if ($value != 'yes' && $value != 'no' && $value !='') {
$size = strlen($value) - 1;
$set_voicemail_email_text .= "
" . $var_text . "
";
}
else {
$set_voicemail_email_text .= "
" . $var_text . "
";
}
}
}
$wav_enable = 'selected';
if ($_COOKIE['ari_voicemail_audio_format']=='.gsm'||
($_COOKIE['ari_voicemail_audio_format']=='' && $ARI_VOICEMAIL_AUDIO_FORMAT_DEFAULT='.gsm')) {
$wav_enable = '';
$gsm_enable = 'selected';
}
$set_voicemail_audio_format_text = "
" . _("Audio Format:") . "
" . _("Best Quality") . " (.wav)
" . _("Smallest Download") . " (.gsm)
";
$set_voicemail_text = "
" . _("Voicemail Settings") . "
" . $set_voicemail_password_text . "
" . $set_voicemail_email_text . "
" . $set_voicemail_audio_format_text . "
";
}
// call monitor settings
if ($this->getFreePBXVersion() &&
$SETTINGS_ALLOW_CALL_RECORDING_SET &&
in_array('callmonitor',array_keys($loaded_modules))) {
foreach($data as $key=>$value) {
if ($key=='record_in') {
if ($value=='Always') {
$ri_always = 'checked=checked';
}
elseif ($value=='Never') {
$ri_never = 'checked=checked';
}
elseif ($value=='Adhoc') {
$ri_on_demand = 'checked=checked';
}
}
if ($key=='record_out') {
if ($value=='Always') {
$ro_always = 'checked=checked';
}
elseif ($value=='Never') {
$ro_never = 'checked=checked';
}
elseif ($value=='Adhoc') {
$ro_on_demand = 'checked=checked';
}
}
}
$set_callmonitor_text = "
";
}
// javascript enable options
if (isset($_SESSION['ari_user']['voicemail_email']) &&
in_array('voicemail',array_keys($loaded_modules))) {
foreach ($_SESSION['ari_user']['voicemail_email'] as $key => $value) {
$var = "voicemail_email_$key";
$js_voicemail_email_disable .= "
document.ari_settings.$var.disabled = false;";
$js_voicemail_email_enable .= "
document.ari_settings.$var.disabled = true;";
}
$js_voicemail_script = "
if (document.ari_settings.voicemail_email_enable.checked) {
document.ari_settings.voicemail_email_address.style.backgroundColor = '#FFF';
document.ari_settings.voicemail_email_address.disabled = false;
document.ari_settings.voicemail_email_address.value='" . $voicemail_email_address . "';
document.ari_settings.voicemail_pager_address.style.backgroundColor = '#FFF';
document.ari_settings.voicemail_pager_address.disabled = false;
document.ari_settings.voicemail_pager_address.value='" . $voicemail_pager_address . "';
" . $js_voicemail_email_disable . "
}
else {
document.ari_settings.voicemail_email_address.style.backgroundColor = '#DDD';
document.ari_settings.voicemail_email_address.disabled = true;
document.ari_settings.voicemail_pager_address.style.backgroundColor = '#DDD';
document.ari_settings.voicemail_pager_address.disabled = true;
" . $js_voicemail_email_enable . "
}";
}
// build page content
$ret .= checkErrorMessage();
$headerText = sprintf(_("Phone Settings for %s (%s)"),$displayname,$exten);
$ret .= $display->displayHeaderText($headerText);
$ret .= $display->displayLine();
$ret .= "
";
$ret .= "
" . $setLangText . "
";
return $ret;
}
/*
* Sets Asterisk call recording setting
*
* @param $exten
* Extension to modify
* @param $direction
* Call direction
* @param $state
* State to set to
*/
function setRecordSettings($exten,$state_in,$state_out) {
global $asterisk_manager_interface;
if (version_compare($this->getFreePBXVersion(), '1.10', '<')) {
if ($state_in=="Always") {
$type_opt = "put";
$value_opt = " " . "ENABLED";
}
elseif ($state_in=="Never") {
$type_opt = "put";
$value_opt = " " . "DISABLED";
}
else {
$type_opt = "del";
$value_opt = "";
}
$response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database $type_opt RECORD-IN $exten $value_opt\r\n\r\n");
if ($state_out=="Always") {
$type_opt = "put";
$value_opt = " " . "ENABLED";
}
elseif ($state_out=="Never") {
$type_opt = "put";
$value_opt = " " . "DISABLED";
}
else {
$type_opt = "del";
$value_opt = "";
}
$response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database $type_opt RECORD-OUT $exten $value_opt\r\n\r\n");
}
else {
$value_opt= "out=".$state_out."|in=".$state_in;
$response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database put AMPUSER $exten/recording $value_opt\r\n\r\n");
}
}
/*
* Gets record settings for a protocol
*
* @param $table
* Table to pull information from
* @param $exten
* Extension to get information about
* @return $data
* call monitor record settings
*/
function getProtocolRecordSettings($table,$exten) {
global $asterisk_manager_interface;
$data = array();
if (version_compare($this->getFreePBXVersion(), '1.10', '<')) {
$response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get RECORD-IN $exten\r\n\r\n");
if (preg_match("/ENABLED/",$response)) {
$data['record_in'] = 'Always';
}
elseif (preg_match("/DISABLED/",$response)) {
$data['record_in'] = 'Never';
}
else {
$data['record_in'] = 'Adhoc';
}
$response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get RECORD-OUT $exten\r\n\r\n");
if (preg_match("/ENABLED/",$response)) {
$data['record_out'] = 'Always';
}
elseif (preg_match("/DISABLED/",$response)) {
$data['record_out'] = 'Never';
}
else {
$data['record_out'] = 'Adhoc';
}
}
else {
$response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: database get AMPUSER $exten/recording\r\n\r\n");
if (strstr($response,"in=Always")) {
$data['record_in'] = 'Always';
}
elseif (strstr($response,"in=Never")) {
$data['record_in'] = 'Never';
}
else {
$data['record_in'] = 'Adhoc';
}
if (strstr($response,"out=Always")) {
$data['record_out'] = 'Always';
}
elseif (strstr($response,"out=Never")) {
$data['record_out'] = 'Never';
}
else {
$data['record_out'] = 'Adhoc';
}
}
return $data;
}
/*
* Gets record settings
*
* @param $exten
* Extension to get information about
* @param $data
* Reference to the variable to store the data in
*/
function getRecordSettings($exten) {
// check protocol tables first
$data = $this->getProtocolRecordSettings($this->protocol_table,$exten);
return $data;
}
/*
* Reloads Asterisk Configuration
*/
function reloadAsteriskVoicemail() {
global $asterisk_manager_interface;
$response = $asterisk_manager_interface->Command("Action: Command\r\nCommand: Reload app_voicemail.so\r\n\r\n");
}
/*
* Gets FreePBX Version
*/
function getFreePBXVersion() {
if (isset($_SESSION['dbh_asterisk'])) {
$sql = "SELECT * FROM admin WHERE variable = 'version'";
$results = $_SESSION['dbh_asterisk']->getAll($sql);
if(DB::IsError($results)) {
$_SESSION['ari_error'] = $results->getMessage();
}
return $results[0][1];
}
}
function lookupSetExtensionFormat($exten) {
if (trim($exten) == "") return $exten;
$exten = preg_replace("/[^0-9*]/", "", $exten);
$sql = "SELECT extension FROM users WHERE extension = '".$exten."'";
$asa = $_SESSION['dbh_asterisk']->getrow($sql, DB_FETCHMODE_ASSOC);
if (!is_array($asa)) {
return $exten.'#';
} else {
return $exten;
}
}
} // class
?>