mirror of https://github.com/sipwise/www_admin.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
851 lines
35 KiB
851 lines
35 KiB
package admin::Controller::subscriber;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use base 'Catalyst::Controller';
|
|
|
|
=head1 NAME
|
|
|
|
admin::Controller::subscriber - Catalyst Controller
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
This provides functionality for VoIP subscriber administration.
|
|
|
|
=head1 METHODS
|
|
|
|
=head2 index
|
|
|
|
Display search form.
|
|
|
|
=cut
|
|
|
|
sub index : Private {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{template} = 'tt/subscriber.tt';
|
|
|
|
return 1;
|
|
}
|
|
|
|
=head2 search
|
|
|
|
Search for subscribers and display results.
|
|
|
|
=cut
|
|
|
|
sub search : Local {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{template} = 'tt/subscriber.tt';
|
|
|
|
my $limit = 10;
|
|
|
|
my $searchstring = $c->request->params->{search_string};
|
|
my $offset = $c->request->params->{offset} || 0;
|
|
$offset = 0 if $offset !~ /^\d+$/;
|
|
|
|
my $subscriber_list;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'search_subscribers',
|
|
{ filter => { username => '%'.$searchstring.'%',
|
|
limit => $limit,
|
|
offset => $limit * $offset,
|
|
},
|
|
},
|
|
\$subscriber_list
|
|
);
|
|
|
|
$c->stash->{search_string} = $searchstring;
|
|
$c->stash->{searched} = 1;
|
|
if(ref $$subscriber_list{subscribers} eq 'ARRAY' and @{$$subscriber_list{subscribers}}) {
|
|
$c->stash->{subscriber_list} = $$subscriber_list{subscribers};
|
|
$c->stash->{total_count} = $$subscriber_list{total_count};
|
|
$c->stash->{offset} = $offset;
|
|
if($$subscriber_list{total_count} > @{$$subscriber_list{subscribers}}) {
|
|
# paginate!
|
|
my @pagination;
|
|
foreach my $page (0 .. int(($$subscriber_list{total_count} - 1) / $limit)) {
|
|
push @pagination, { offset => $page };
|
|
}
|
|
$c->stash->{max_offset} = $#pagination;
|
|
if($#pagination > 10) {
|
|
if($offset <= 5) {
|
|
splice @pagination, 9, @pagination - (10), ({offset => -1});
|
|
} else {
|
|
if($offset < @pagination - 6) {
|
|
splice @pagination, $offset + 4, @pagination - ($offset + 5), ({offset => -1});
|
|
splice @pagination, 1, $offset - 4, ({offset => -1});
|
|
} else {
|
|
splice @pagination, 1, @pagination - 10, ({offset => -1});
|
|
}
|
|
}
|
|
}
|
|
$c->stash->{pagination} = \@pagination;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
=head2 detail
|
|
|
|
Display subscriber details.
|
|
|
|
=cut
|
|
|
|
sub detail : Local {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{template} = 'tt/subscriber_detail.tt';
|
|
|
|
my $is_new = $c->request->params->{new};
|
|
my $preferences;
|
|
|
|
unless($is_new) {
|
|
my $subscriber_id = $c->request->params->{subscriber_id};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_byid',
|
|
{ subscriber_id => $subscriber_id },
|
|
\$c->session->{subscriber}
|
|
);
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
},
|
|
\$preferences
|
|
);
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_voicebox_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
},
|
|
\$c->session->{subscriber}{voicebox_preferences}
|
|
);
|
|
|
|
$c->stash->{subscriber} = $c->session->{subscriber};
|
|
$c->stash->{subscriber}{subscriber_id} = $subscriber_id;
|
|
$c->stash->{subscriber}{is_locked} = $c->model('Provisioning')->localize($c->view($c->config->{view})->
|
|
config->{VARIABLES}{site_config}{language},
|
|
'Web.Subscriber.Lock'.$$preferences{lock})
|
|
if $$preferences{lock};
|
|
} else {
|
|
$c->stash->{account_id} = $c->request->params->{account_id};
|
|
$c->stash->{edit_subscriber} = 1;
|
|
my $domains;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_domains',
|
|
undef, \$domains
|
|
);
|
|
$c->stash->{domains} = $$domains{result};
|
|
}
|
|
|
|
my $db_prefs;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_preferences',
|
|
undef, \$db_prefs
|
|
);
|
|
$c->session->{voip_preferences} = $$db_prefs{result};
|
|
|
|
### restore data entered by the user ###
|
|
|
|
if(ref $c->session->{restore_subscriber_input} eq 'HASH') {
|
|
if(ref $c->stash->{subscriber} eq 'HASH') {
|
|
$c->stash->{subscriber} = { %{$c->stash->{subscriber}}, %{$c->session->{restore_subscriber_input}} };
|
|
} else {
|
|
$c->stash->{subscriber} = $c->session->{restore_subscriber_input};
|
|
}
|
|
$c->stash->{subscriber}{edit_pass} = $c->session->{restore_subscriber_input}{password}
|
|
if defined $c->session->{restore_subscriber_input}{password};
|
|
$c->stash->{subscriber}{edit_webpass} = $c->session->{restore_subscriber_input}{webpassword}
|
|
if defined $c->session->{restore_subscriber_input}{webpassword};
|
|
delete $c->session->{restore_subscriber_input};
|
|
}
|
|
if(ref $c->session->{restore_preferences_input} eq 'HASH') {
|
|
if(ref $preferences eq 'HASH') {
|
|
$preferences = { %$preferences, %{$c->session->{restore_preferences_input}} };
|
|
} else {
|
|
$preferences = $c->session->{restore_preferences_input};
|
|
}
|
|
delete $c->session->{restore_preferences_input};
|
|
}
|
|
if(ref $c->session->{restore_vboxprefs_input} eq 'HASH') {
|
|
if(ref $c->stash->{subscriber}{voicebox_preferences} eq 'HASH') {
|
|
$c->stash->{subscriber}{voicebox_preferences} = { %{$c->stash->{subscriber}{voicebox_preferences}},
|
|
%{$c->session->{restore_vboxprefs_input}} };
|
|
} else {
|
|
$c->stash->{subscriber}{voicebox_preferences} = $c->session->{restore_vboxprefs_input};
|
|
}
|
|
delete $c->session->{restore_vboxprefs_input};
|
|
}
|
|
|
|
### build preference array for TT ###
|
|
|
|
if(ref $c->session->{voip_preferences} eq 'ARRAY') {
|
|
|
|
my $cftarget;
|
|
my @stashprefs;
|
|
|
|
foreach my $pref (@{$c->session->{voip_preferences}}) {
|
|
|
|
# not a subscriber preference
|
|
next if $$pref{attribute} eq 'cc';
|
|
# managed separately
|
|
next if $$pref{attribute} eq 'lock';
|
|
|
|
# only for extensions enabled systems
|
|
next if ( $$pref{attribute} eq 'base_cli'
|
|
or $$pref{attribute} eq 'base_user'
|
|
or $$pref{attribute} eq 'extension'
|
|
or $$pref{attribute} eq 'has_extension' )
|
|
and !$c->config->{extension_features};
|
|
|
|
|
|
if($$pref{attribute} eq 'cfu'
|
|
or $$pref{attribute} eq 'cfb'
|
|
or $$pref{attribute} eq 'cft'
|
|
or $$pref{attribute} eq 'cfna')
|
|
{
|
|
if(defined $$preferences{$$pref{attribute}} and length $$preferences{$$pref{attribute}}) {
|
|
if($$preferences{$$pref{attribute}} =~ /voicebox\.local$/) {
|
|
$$cftarget{voicebox} = 1;
|
|
} else {
|
|
$$cftarget{sipuri} = $$preferences{$$pref{attribute}};
|
|
$$cftarget{sipuri} =~ s/^sip://i;
|
|
if($$cftarget{sipuri} =~ /^\+?\d+\@/) {
|
|
$$cftarget{sipuri} =~ s/\@.*$//;
|
|
}
|
|
}
|
|
}
|
|
} elsif($$pref{attribute} eq 'cli') {
|
|
if(defined $$preferences{$$pref{attribute}} and length $$preferences{$$pref{attribute}}) {
|
|
$$preferences{$$pref{attribute}} =~ s/^sip://i;
|
|
$$preferences{$$pref{attribute}} =~ s/\@.*$//
|
|
if $$preferences{$$pref{attribute}} =~ /^\+?\d+\@/;
|
|
}
|
|
}
|
|
|
|
push @stashprefs,
|
|
{ key => $$pref{attribute},
|
|
value => $$preferences{$$pref{attribute}},
|
|
max_occur => $$pref{max_occur},
|
|
error => $c->session->{messages}{$$pref{attribute}}
|
|
? $c->model('Provisioning')->localize($c->view($c->config->{view})->
|
|
config->{VARIABLES}{site_config}{language},
|
|
$c->session->{messages}{$$pref{attribute}})
|
|
: undef,
|
|
};
|
|
}
|
|
|
|
# OMG
|
|
# reorder preferences so "cftarget" appears just above "cfu" and friends
|
|
foreach my $stashpref (@stashprefs) {
|
|
if($$stashpref{key} eq 'cfu') {
|
|
push @{$c->stash->{subscriber}{preferences_array}},
|
|
{ key => 'cftarget',
|
|
value => $cftarget,
|
|
max_occur => 1,
|
|
error => $c->session->{messages}{cftarget}
|
|
? $c->model('Provisioning')->localize($c->view($c->config->{view})->
|
|
config->{VARIABLES}{site_config}{language},
|
|
$c->session->{messages}{cftarget})
|
|
: undef,
|
|
};
|
|
}
|
|
push @{$c->stash->{subscriber}{preferences_array}}, $stashpref;
|
|
}
|
|
}
|
|
|
|
$c->stash->{show_pass} = $c->request->params->{show_pass};
|
|
$c->stash->{show_webpass} = $c->request->params->{show_webpass};
|
|
$c->stash->{edit_subscriber} = $c->request->params->{edit_subscriber}
|
|
unless $is_new;
|
|
$c->stash->{edit_preferences} = $c->request->params->{edit_preferences};
|
|
$c->stash->{edit_voicebox} = $c->request->params->{edit_voicebox};
|
|
|
|
return 1;
|
|
}
|
|
|
|
=head2 update_subscriber
|
|
|
|
Update subscriber data or create a new subscriber.
|
|
|
|
=cut
|
|
|
|
sub update_subscriber : Local {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my (%settings, %messages);
|
|
|
|
my $subscriber_id = $c->request->params->{subscriber_id};
|
|
if($subscriber_id) {
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_byid',
|
|
{ subscriber_id => $subscriber_id },
|
|
\$c->session->{subscriber}
|
|
);
|
|
} else {
|
|
my $checkresult;
|
|
$c->session->{subscriber}{account_id} = $c->request->params->{account_id};
|
|
|
|
$c->session->{subscriber}{username} = $settings{webusername} = $c->request->params->{username};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'check_username',
|
|
$c->session->{subscriber}{username}, \$checkresult
|
|
);
|
|
$messages{username} = 'Client.Syntax.MalformedUsername' unless($checkresult);
|
|
|
|
$c->session->{subscriber}{domain} = $c->request->params->{domain};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'check_domain',
|
|
$c->session->{subscriber}{domain}, \$checkresult
|
|
);
|
|
$messages{domain} = 'Client.Syntax.MalformedDomain' unless($checkresult);
|
|
}
|
|
|
|
$settings{admin} = 1 if $c->request->params->{admin};
|
|
|
|
my $password = $c->request->params->{password};
|
|
if(length $password) {
|
|
$settings{password} = $password;
|
|
if(length $password < 6) {
|
|
$messages{password} = 'Client.Voip.PassLength';
|
|
}
|
|
}
|
|
my $webpassword = $c->request->params->{webpassword};
|
|
if(length $webpassword) {
|
|
$settings{webpassword} = $webpassword;
|
|
if(length $webpassword < 6) {
|
|
$messages{webpassword} = 'Client.Voip.PassLength';
|
|
}
|
|
}
|
|
|
|
my $cc = $c->request->params->{cc};
|
|
my $ac = $c->request->params->{ac};
|
|
my $sn = $c->request->params->{sn};
|
|
if(length $cc or length $ac or length $sn) {
|
|
$settings{cc} = $cc;
|
|
$settings{ac} = $ac;
|
|
$settings{sn} = $sn;
|
|
unless(length $cc and length $ac and length $sn) {
|
|
$messages{number} = 'Client.Voip.MissingNumberPart';
|
|
} else {
|
|
$messages{number_cc} = 'Client.Voip.MalformedCc'
|
|
unless $cc =~ /^[1-9][0-9]{0,2}$/;
|
|
$messages{number_ac} = 'Client.Voip.MalformedAc'
|
|
unless $ac =~ /^[1-9][0-9]{0,4}$/;
|
|
$messages{number_sn} = 'Client.Voip.MalformedSn'
|
|
unless $sn =~ /^[1-9][0-9]+$/;
|
|
}
|
|
}
|
|
my $timezone = $c->request->params->{timezone};
|
|
if(length $timezone) {
|
|
$settings{timezone} = $timezone;
|
|
$messages{timezone} = 'Client.Syntax.MalformedTimezone'
|
|
unless $timezone =~ m#^\w+/\w.+$#;
|
|
}
|
|
|
|
unless(keys %messages) {
|
|
if($c->model('Provisioning')->call_prov( $c, 'billing', ($subscriber_id
|
|
? 'update_voip_account_subscriber'
|
|
: 'add_voip_account_subscriber'),
|
|
{ id => $c->session->{subscriber}{account_id},
|
|
subscriber => { username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
%settings
|
|
},
|
|
},
|
|
undef))
|
|
{
|
|
$messages{submsg} = 'Server.Voip.SavedSettings';
|
|
$c->session->{messages} = \%messages;
|
|
if($subscriber_id) {
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=$subscriber_id");
|
|
} else {
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
},
|
|
\$c->session->{subscriber}
|
|
);
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=". $c->session->{subscriber}{subscriber_id});
|
|
}
|
|
return;
|
|
}
|
|
} else {
|
|
$messages{suberr} = 'Client.Voip.InputErrorFound';
|
|
}
|
|
|
|
$c->session->{messages} = \%messages;
|
|
$c->session->{restore_subscriber_input} = \%settings;
|
|
if($subscriber_id) {
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=$subscriber_id&edit_subscriber=1");
|
|
} else {
|
|
$c->session->{restore_subscriber_input}{username} = $c->session->{subscriber}{username};
|
|
$c->response->redirect("/subscriber/detail?account_id=". $c->session->{subscriber}{account_id} ."&new=1");
|
|
}
|
|
return;
|
|
}
|
|
|
|
=head2 lock
|
|
|
|
Locks a subscriber.
|
|
|
|
=cut
|
|
|
|
sub lock : Local {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $subscriber_id = $c->request->params->{subscriber_id};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_byid',
|
|
{ subscriber_id => $subscriber_id },
|
|
\$c->session->{subscriber}
|
|
);
|
|
|
|
my $lock = $c->request->params->{lock};
|
|
$c->model('Provisioning')->call_prov( $c, 'billing', 'lock_voip_account_subscriber',
|
|
{ id => $c->session->{subscriber}{account_id},
|
|
username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
lock => $lock,
|
|
},
|
|
undef
|
|
);
|
|
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=". $c->request->params->{subscriber_id});
|
|
}
|
|
|
|
=head2 terminate
|
|
|
|
Terminates a subscriber.
|
|
|
|
=cut
|
|
|
|
sub terminate : Local {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my %messages;
|
|
|
|
my $subscriber_id = $c->request->params->{subscriber_id};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_byid',
|
|
{ subscriber_id => $subscriber_id },
|
|
\$c->session->{subscriber}
|
|
);
|
|
|
|
if($c->model('Provisioning')->call_prov( $c, 'billing', 'terminate_voip_account_subscriber',
|
|
{ id => $c->session->{subscriber}{account_id},
|
|
username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
},
|
|
undef))
|
|
{
|
|
$messages{topmsg} = 'Server.Voip.SubscriberDeleted';
|
|
$c->session->{messages} = \%messages;
|
|
$c->response->redirect("/subscriber");
|
|
return;
|
|
}
|
|
|
|
$c->session->{messages} = \%messages;
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=$subscriber_id");
|
|
return;
|
|
}
|
|
|
|
sub update_preferences : Local {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my %messages;
|
|
|
|
my $subscriber_id = $c->request->params->{subscriber_id};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_byid',
|
|
{ subscriber_id => $subscriber_id },
|
|
\$c->session->{subscriber}
|
|
);
|
|
my $preferences;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
},
|
|
\$preferences
|
|
);
|
|
## remove preferences that can't be changed
|
|
delete $$preferences{prepaid};
|
|
delete $$preferences{base_cli};
|
|
delete $$preferences{extension};
|
|
delete $$preferences{base_user};
|
|
delete $$preferences{has_extension};
|
|
|
|
### blocklists ###
|
|
|
|
my $block_in_mode = $c->request->params->{block_in_mode};
|
|
if(defined $block_in_mode) {
|
|
$$preferences{block_in_mode} = $block_in_mode eq 'whitelist' ? 1 : 0;
|
|
}
|
|
my $block_out_mode = $c->request->params->{block_out_mode};
|
|
if(defined $block_out_mode) {
|
|
$$preferences{block_out_mode} = $block_out_mode eq 'whitelist' ? 1 : 0;
|
|
}
|
|
|
|
$$preferences{block_in_clir} = $c->request->params->{block_in_clir} ? 1 : undef;
|
|
|
|
my $block_in_list = $c->request->params->{block_in_list};
|
|
|
|
### call forwarding ###
|
|
|
|
my $fw_target_select = $c->request->params->{fw_target};
|
|
unless($fw_target_select) {
|
|
$messages{target} = 'Client.Voip.MalformedTargetClass';
|
|
}
|
|
my $fw_target;
|
|
if($fw_target_select eq 'sipuri') {
|
|
$fw_target = $c->request->params->{fw_sipuri};
|
|
|
|
# normalize, so we can do some checks.
|
|
$fw_target =~ s/^sip://i;
|
|
if($fw_target =~ /^\+?\d+\@[a-z0-9.-]+$/i) {
|
|
$fw_target =~ s/\@.+$//;
|
|
}
|
|
|
|
if($fw_target =~ /^\+?\d+$/) {
|
|
if($fw_target =~ /^\+[1-9][0-9]+$/) {
|
|
$fw_target = 'sip:'. $fw_target .'@'. $c->session->{subscriber}{domain};
|
|
} elsif($fw_target =~ /^00[1-9][0-9]+$/) {
|
|
$fw_target =~ s/^00/+/;
|
|
$fw_target = 'sip:'. $fw_target .'@'. $c->session->{subscriber}{domain};
|
|
} elsif($fw_target =~ /^0[1-9][0-9]+$/) {
|
|
$fw_target =~ s/^0/'+'.$c->session->{subscriber}{cc}/e;
|
|
$fw_target = 'sip:'. $fw_target .'@'. $c->session->{subscriber}{domain};
|
|
} else {
|
|
$messages{target} = 'Client.Voip.MalformedNumber';
|
|
$fw_target = $c->request->params->{fw_sipuri};
|
|
}
|
|
} elsif($fw_target =~ /^[a-z0-9&=+\$,;?\/_.!~*'()-]+\@[a-z0-9.-]+$/i) {
|
|
$fw_target = 'sip:'. lc $fw_target;
|
|
} elsif($fw_target =~ /^[a-z0-9&=+\$,;?\/_.!~*'()-]+$/) {
|
|
$fw_target = 'sip:'. lc($fw_target) .'@'. $c->session->{subscriber}{domain};
|
|
} else {
|
|
$messages{target} = 'Client.Voip.MalformedTarget';
|
|
$fw_target = $c->request->params->{fw_sipuri};
|
|
}
|
|
} elsif($fw_target_select eq 'voicebox') {
|
|
$fw_target = 'sip:vmu'.$c->session->{subscriber}{cc}.$c->session->{subscriber}{ac}.$c->session->{subscriber}{sn}.'@voicebox.local';
|
|
} else {
|
|
# wtf?
|
|
}
|
|
|
|
my $cfu = $c->request->params->{cfu};
|
|
my $cfb = $c->request->params->{cfb};
|
|
my $cft = $c->request->params->{cft};
|
|
my $cfna = $c->request->params->{cfna};
|
|
|
|
# clear all forwards
|
|
$$preferences{cfu} = undef;
|
|
$$preferences{cft} = undef;
|
|
$$preferences{cfb} = undef;
|
|
$$preferences{cfna} = undef;
|
|
$$preferences{ringtimeout} = undef;
|
|
|
|
unless(defined $cfu or defined $cfb or defined $cft or defined $cfna) {
|
|
delete $messages{target} if exists $messages{target};
|
|
} else {
|
|
if(defined $cfu) {
|
|
# forward unconditionally
|
|
$$preferences{cfu} = $fw_target;
|
|
} else {
|
|
if(defined $cfb) {
|
|
$$preferences{cfb} = $fw_target;
|
|
}
|
|
if(defined $cft) {
|
|
$$preferences{cft} = $fw_target;
|
|
}
|
|
if(defined $cfna) {
|
|
$$preferences{cfna} = $fw_target;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(defined $$preferences{cft}) {
|
|
$$preferences{ringtimeout} = $c->request->params->{ringtimeout};
|
|
unless(defined $$preferences{ringtimeout} and $$preferences{ringtimeout} =~ /^\d+$/
|
|
and $$preferences{ringtimeout} < 301 and $$preferences{ringtimeout} > 4)
|
|
{
|
|
$messages{ringtimeout} = 'Client.Voip.MissingRingtimeout';
|
|
}
|
|
}
|
|
|
|
### outgoing calls ###
|
|
|
|
$$preferences{cli} = $c->request->params->{cli} or undef;
|
|
if(defined $$preferences{cli} and $$preferences{cli} =~ /^\d+$/) {
|
|
$$preferences{cli} = 'sip:'.$$preferences{cli}.'@'.$c->session->{subscriber}{domain};
|
|
}
|
|
|
|
$$preferences{clir} = $c->request->params->{clir} ? 1 : undef;
|
|
|
|
$$preferences{cc} = $c->request->params->{cc} || undef;
|
|
if(defined $$preferences{cc} and $$preferences{cc} !~ /^[1-9]\d*$/) {
|
|
$messages{cc} = 'Client.Voip.MalformedCc';
|
|
}
|
|
$$preferences{ac} = $c->request->params->{ac} || undef;
|
|
if(defined $$preferences{ac} and $$preferences{ac} !~ /^[1-9]\d*$/) {
|
|
$messages{ac} = 'Client.Voip.MalformedAc';
|
|
}
|
|
$$preferences{svc_ac} = $c->request->params->{svc_ac} || undef;
|
|
if(defined $$preferences{svc_ac} and $$preferences{svc_ac} !~ /^[1-9]\d*$/) {
|
|
$messages{svc_ac} = 'Client.Voip.MalformedAc';
|
|
}
|
|
$$preferences{emerg_ac} = $c->request->params->{emerg_ac} || undef;
|
|
if(defined $$preferences{emerg_ac} and $$preferences{emerg_ac} !~ /^[1-9]\d*$/) {
|
|
$messages{emerg_ac} = 'Client.Voip.MalformedAc';
|
|
}
|
|
|
|
### save settings ###
|
|
|
|
unless(keys %messages) {
|
|
if($c->model('Provisioning')->call_prov( $c, 'voip', 'set_subscriber_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
preferences => $preferences,
|
|
},
|
|
undef
|
|
))
|
|
{
|
|
$messages{prefmsg} = 'Server.Voip.SavedSettings';
|
|
$c->session->{messages} = \%messages;
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=$subscriber_id#userprefs");
|
|
return;
|
|
|
|
}
|
|
} else {
|
|
$messages{preferr} = 'Client.Voip.InputErrorFound';
|
|
}
|
|
|
|
$c->session->{messages} = \%messages;
|
|
$c->session->{restore_preferences_input} = $preferences;
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=$subscriber_id&edit_preferences=1#userprefs");
|
|
return;
|
|
|
|
}
|
|
|
|
sub update_voicebox : Local {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my %messages;
|
|
|
|
my $subscriber_id = $c->request->params->{subscriber_id};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_byid',
|
|
{ subscriber_id => $subscriber_id },
|
|
\$c->session->{subscriber}
|
|
);
|
|
my $vboxprefs;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_voicebox_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
},
|
|
\$vboxprefs
|
|
);
|
|
$$vboxprefs{password} = $c->request->params->{password} || undef;
|
|
if(defined $$vboxprefs{password} and $$vboxprefs{password} !~ /^\d{4}$/) {
|
|
$messages{vpin} = 'Client.Syntax.VoiceBoxPin';
|
|
}
|
|
|
|
$$vboxprefs{email} = $c->request->params->{email};
|
|
if(defined $$vboxprefs{email} and length $$vboxprefs{email}) {
|
|
my $checkresult;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'check_email',
|
|
$$vboxprefs{email}, \$checkresult
|
|
);
|
|
$messages{vemail} = 'Client.Syntax.Email' unless($checkresult);
|
|
} else {
|
|
$$vboxprefs{email} = undef;
|
|
}
|
|
|
|
$$vboxprefs{attach} = $c->request->params->{attach} ? 1 : 0;
|
|
|
|
### save settings ###
|
|
|
|
unless(keys %messages) {
|
|
if($c->model('Provisioning')->call_prov( $c, 'voip', 'set_subscriber_voicebox_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
preferences => $vboxprefs,
|
|
},
|
|
undef
|
|
))
|
|
{
|
|
$messages{vboxmsg} = 'Server.Voip.SavedSettings';
|
|
$c->session->{messages} = \%messages;
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=$subscriber_id#vboxprefs");
|
|
return;
|
|
}
|
|
} else {
|
|
$messages{vboxerr} = 'Client.Voip.InputErrorFound';
|
|
}
|
|
|
|
$c->session->{messages} = \%messages;
|
|
$c->session->{restore_vboxprefs_input} = $vboxprefs;
|
|
$c->response->redirect("/subscriber/detail?subscriber_id=$subscriber_id&edit_voicebox=1#vboxprefs");
|
|
return;
|
|
}
|
|
|
|
sub edit_list : Local {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{template} = 'tt/subscriber_edit_list.tt';
|
|
|
|
my %messages;
|
|
|
|
my $subscriber_id = $c->request->params->{subscriber_id};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_byid',
|
|
{ subscriber_id => $subscriber_id },
|
|
\$c->session->{subscriber}
|
|
);
|
|
my $preferences;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
},
|
|
\$preferences
|
|
);
|
|
my $list = $c->request->params->{list_name};
|
|
|
|
if(defined $$preferences{$list}) {
|
|
my $block_list = ref $$preferences{$list} ? $$preferences{$list} : [ $$preferences{$list} ];
|
|
|
|
my @block_list_to_sort;
|
|
foreach my $blockentry (@$block_list) {
|
|
my $active = $blockentry =~ s/^#// ? 0 : 1;
|
|
$blockentry =~ s/^([1-9])/+$1/;
|
|
push @block_list_to_sort, { entry => $blockentry, active => $active };
|
|
}
|
|
my $bg = '';
|
|
my $i = 1;
|
|
foreach my $blockentry (sort {$a->{entry} cmp $b->{entry}} @block_list_to_sort) {
|
|
push @{$c->stash->{list_data}}, { number => $$blockentry{entry},
|
|
background => $bg ? '' : 'alt',
|
|
id => $i++,
|
|
active => $$blockentry{active},
|
|
};
|
|
$bg = !$bg;
|
|
}
|
|
}
|
|
|
|
$c->stash->{subscriber} = $c->session->{subscriber};
|
|
$c->stash->{subscriber_id} = $subscriber_id;
|
|
$c->stash->{list_name} = $list;
|
|
if(defined $c->session->{blockaddtxt}) {
|
|
$c->stash->{blockaddtxt} = $c->session->{blockaddtxt};
|
|
delete $c->session->{blockaddtxt};
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
sub do_edit_list : Local {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my %messages;
|
|
|
|
my $subscriber_id = $c->request->params->{subscriber_id};
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_byid',
|
|
{ subscriber_id => $subscriber_id },
|
|
\$c->session->{subscriber}
|
|
);
|
|
my $preferences;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
},
|
|
\$preferences
|
|
);
|
|
my $list = $c->request->params->{list_name};
|
|
|
|
# input text field to add new entry to block list
|
|
my $add = $c->request->params->{block_add};
|
|
if(defined $add) {
|
|
if($add =~ /^\+?[?*0-9\[\]]+$/) {
|
|
if($add =~ /^[1-9\[]/) {
|
|
$add =~ s/^/$c->session->{subscriber}{cc}.$c->session->{subscriber}{ac}/e;
|
|
} elsif($add =~ /^0[^0]/) {
|
|
$add =~ s/^0/$c->session->{subscriber}{cc}/e;
|
|
}
|
|
$add =~ s/^\+/00/;
|
|
$add =~ s/^00+//;
|
|
my $blocklist = $$preferences{$list};
|
|
$blocklist = [] unless defined $blocklist;
|
|
$blocklist = [ $blocklist ] unless ref $blocklist;
|
|
$$preferences{$list} = [ @$blocklist, $add ];
|
|
} else {
|
|
$messages{msgadd} = 'Client.Voip.MalformedNumberPattern';
|
|
$c->session->{blockaddtxt} = $add;
|
|
}
|
|
}
|
|
|
|
# delete link next to entries in block list
|
|
my $del = $c->request->params->{block_del};
|
|
if(defined $del) {
|
|
my $blocklist = $$preferences{$list};
|
|
if(defined $blocklist) {
|
|
$del =~ s/^\+//;
|
|
$del =~ s/^0/$c->session->{subscriber}{cc}/e;
|
|
$blocklist = [ $blocklist ] unless ref $blocklist;
|
|
if($c->request->params->{block_stat}) {
|
|
$$preferences{$list} = [ grep { $_ ne $del } @$blocklist ];
|
|
} else {
|
|
$$preferences{$list} = [ grep { $_ ne '#'.$del } @$blocklist ];
|
|
}
|
|
}
|
|
}
|
|
|
|
# activate/deactivate link next to entries in block list
|
|
my $act = $c->request->params->{block_act};
|
|
if(defined $act) {
|
|
print STDERR "Got request to de/activate $act...\n";
|
|
my $blocklist = $$preferences{$list};
|
|
if(defined $blocklist) {
|
|
$act =~ s/^\+//;
|
|
$act =~ s/^0/$c->session->{subscriber}{cc}/e;
|
|
$blocklist = [ $blocklist ] unless ref $blocklist;
|
|
if($c->request->params->{block_stat}) {
|
|
$$preferences{$list} = [ grep { $_ ne $act } @$blocklist ];
|
|
push @{$$preferences{$list}}, '#'.$act;
|
|
} else {
|
|
$$preferences{$list} = [ grep { $_ ne '#'.$act } @$blocklist ];
|
|
push @{$$preferences{$list}}, $act;
|
|
}
|
|
}
|
|
}
|
|
|
|
unless(keys %messages) {
|
|
$c->model('Provisioning')->call_prov( $c, 'voip', 'set_subscriber_preferences',
|
|
{ username => $c->session->{subscriber}{username},
|
|
domain => $c->session->{subscriber}{domain},
|
|
preferences => {
|
|
$list => $$preferences{$list},
|
|
},
|
|
},
|
|
undef
|
|
);
|
|
} else {
|
|
$messages{numerr} = 'Client.Voip.InputErrorFound';
|
|
}
|
|
|
|
$c->session->{messages} = \%messages;
|
|
$c->response->redirect("/subscriber/edit_list?subscriber_id=$subscriber_id&list_name=$list");
|
|
|
|
}
|
|
|
|
|
|
=head1 BUGS AND LIMITATIONS
|
|
|
|
=over
|
|
|
|
=item currently none
|
|
|
|
=back
|
|
|
|
=head1 SEE ALSO
|
|
|
|
Provisioning model, Catalyst
|
|
|
|
=head1 AUTHORS
|
|
|
|
Daniel Tiefnig <dtiefnig@sipwise.com>
|
|
|
|
=head1 COPYRIGHT
|
|
|
|
The subscriber controller is Copyright (c) 2007 Sipwise GmbH, Austria. All
|
|
rights reserved.
|
|
|
|
=cut
|
|
|
|
# ende gelaende
|
|
1;
|