From f4cb6933b4a5fe3f8fc8740ba302c770cd993873 Mon Sep 17 00:00:00 2001 From: Flaviu Mates Date: Wed, 28 Apr 2021 19:29:59 +0300 Subject: [PATCH] TT#119550 Allow subscribers to manage their registrations * give access to subscribers roles to see, create and update own registrations * subscriberadmins can manage all registrations of subscribers under same customer Change-Id: I643121da901b0ed99fc718106a1632da4e1e1936 --- .../Controller/API/SubscriberRegistrations.pm | 2 +- .../API/SubscriberRegistrationsItem.pm | 2 +- .../Panel/Role/API/SubscriberRegistrations.pm | 58 ++++++++++++++++++- lib/NGCP/Panel/Utils/Subscriber.pm | 16 +++++ 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/lib/NGCP/Panel/Controller/API/SubscriberRegistrations.pm b/lib/NGCP/Panel/Controller/API/SubscriberRegistrations.pm index 7af2baa5e1..0cde29d021 100644 --- a/lib/NGCP/Panel/Controller/API/SubscriberRegistrations.pm +++ b/lib/NGCP/Panel/Controller/API/SubscriberRegistrations.pm @@ -82,7 +82,7 @@ sub relation{ } __PACKAGE__->set_config({ - allowed_roles => [qw/admin reseller ccareadmin ccare/], + allowed_roles => [qw/admin reseller ccareadmin ccare subscriber subscriberadmin/], }); sub GET :Allow { diff --git a/lib/NGCP/Panel/Controller/API/SubscriberRegistrationsItem.pm b/lib/NGCP/Panel/Controller/API/SubscriberRegistrationsItem.pm index b013263e4b..380233f941 100644 --- a/lib/NGCP/Panel/Controller/API/SubscriberRegistrationsItem.pm +++ b/lib/NGCP/Panel/Controller/API/SubscriberRegistrationsItem.pm @@ -30,7 +30,7 @@ sub relation{ } __PACKAGE__->set_config({ - allowed_roles => [qw/admin reseller ccareadmin ccare/], + allowed_roles => [qw/admin reseller ccareadmin ccare subscriber subscriberadmin/], }); sub GET :Allow { diff --git a/lib/NGCP/Panel/Role/API/SubscriberRegistrations.pm b/lib/NGCP/Panel/Role/API/SubscriberRegistrations.pm index bdfa55ac51..0bbd19d627 100644 --- a/lib/NGCP/Panel/Role/API/SubscriberRegistrations.pm +++ b/lib/NGCP/Panel/Role/API/SubscriberRegistrations.pm @@ -55,6 +55,47 @@ sub _item_rs { if ($c->user->roles eq "admin" || $c->user->roles eq "ccareadmin") { } elsif ($c->user->roles eq "reseller" || $c->user->roles eq "ccare") { $filter->{reseller_id} = $c->user->reseller_id; + } elsif ($c->user->roles eq "subscriber") { + if ($c->req->param('subscriber_id')) { + my $sub = $c->model('DB')->resultset('voip_subscribers')->find($c->req->param('subscriber_id')); + if ($sub && $sub->provisioning_voip_subscriber->id == $c->user->id) { + $filter->{username} = NGCP::Panel::Utils::Subscriber::get_sub_username_and_aliases($sub->provisioning_voip_subscriber); + } else { + $filter->{username} = undef; + } + } else { + $filter->{username} = NGCP::Panel::Utils::Subscriber::get_sub_username_and_aliases($c->user); + } + if($c->config->{features}->{multidomain}) { + $filter->{domain} = $c->user->domain->domain; + } else { + $filter->{domain} = undef; + } + } elsif ($c->user->roles eq "subscriberadmin") { + if ($c->req->param('subscriber_id')) { + my $sub = $c->model('DB')->resultset('voip_subscribers')->search( + { + id => $c->req->param('subscriber_id'), + contract_id => $c->user->account_id + } + )->first; + if ($sub) { + $filter->{username} = NGCP::Panel::Utils::Subscriber::get_sub_username_and_aliases($sub->provisioning_voip_subscriber); + } else { + $filter->{username} = undef; + } + } else { + my @customer_subscribers = $c->model('DB')->resultset('voip_subscribers')->search({contract_id => $c->user->account_id})->all(); + foreach my $sub (@customer_subscribers) { + my $sub_username_aliases = NGCP::Panel::Utils::Subscriber::get_sub_username_and_aliases($sub->provisioning_voip_subscriber); + push (@{ $filter->{username} }, @$sub_username_aliases); + } + } + if($c->config->{features}->{multidomain}) { + $filter->{domain} = $c->user->domain->domain; + } else { + $filter->{domain} = undef; + } } } $item_rs = NGCP::Panel::Utils::Subscriber::get_subscriber_location_rs($c, $filter, $opt); @@ -76,6 +117,12 @@ sub _item_rs { },{ join => [@joins, { 'subscriber' => { 'voip_subscriber' => { 'contract' => 'contact' }}} ], }); + } elsif($c->user->roles eq "subscriber" || $c->user->roles eq "subscriberadmin") { + $item_rs = $item_rs->search({ + 'subscriber.uuid' => $c->user->uuid + },{ + join => [@joins,'subscriber'], + }); } } return $item_rs; @@ -150,7 +197,12 @@ sub item_by_id { my ($self, $c, $id) = @_; my $item_rs = $self->item_rs($c,{ id => $id, }); - return $item_rs->find($id); + my $item = $item_rs->find($id); + if ($c->user->roles eq "subscriber" || $c->user->roles eq "subscriberadmin") { + my $sub = $self->subscriber_from_item($c, $item); + return unless($sub->provisioning_voip_subscriber->id == $c->user->id); + } + return $item; } sub subscriber_from_item { @@ -197,6 +249,10 @@ sub subscriber_from_id { },{ join => { contract => 'contact' }, }); + } elsif($c->user->roles eq "subscriber" || $c->user->roles eq "subscriberadmin") { + $sub_rs = $sub_rs->search({ + 'me.uuid' => $c->user->uuid, + }); } my $sub = $sub_rs->first; unless($sub && $sub->provisioning_voip_subscriber) { diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 02724f9ced..212f1f5369 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -2531,6 +2531,22 @@ sub check_pbx_extension_range { return 1 } +sub get_sub_username_and_aliases { + my ($prov_subscriber) = @_; + my @usernames; + push @usernames, $prov_subscriber->username; + my $devid_aliases = $prov_subscriber->voip_dbaliases->search( + { + is_devid => 1, + subscriber_id => $prov_subscriber->id, + } + ); + foreach my $devid ($devid_aliases->all) { + push @usernames, $devid->username; + } + return \@usernames; +} + 1; =head1 NAME