diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index 1c585711e5..09ba879f81 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -31,7 +31,7 @@ Catalyst Controller. =cut -sub auto :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) { +sub auto :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) :AllowedRole(subscriberadmin) { my ($self, $c) = @_; $c->log->debug(__PACKAGE__ . '::auto'); NGCP::Panel::Utils::Navigation::check_redirect_chain(c => $c); @@ -56,7 +56,7 @@ sub list_customer :Chained('/') :PathPart('customer') :CaptureArgs(0) { ); } -sub root :Chained('list_customer') :PathPart('') :Args(0) { +sub root :Chained('list_customer') :PathPart('') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) { my ($self, $c) = @_; } @@ -71,12 +71,20 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) { my $contract = $c->model('DB')->resultset('contracts') ->search('me.id' => $contract_id); - unless($c->user->is_superuser) { + if($c->user->roles eq 'reseller') { $contract = $contract->search({ 'contact.reseller_id' => $c->user->reseller_id, }, { join => 'contact', }); + } elsif($c->user->roles eq 'subscriberadmin') { + $contract = $contract->search({ + 'me.id' => $c->user->account_id, + }); + unless($contract->count) { + $c->log->error("unauthorized access of subscriber uuid '".$c->user->uuid."' to contract id '$contract_id'"); + $c->detach('/denied_page'); + } } my $stime = NGCP::Panel::Utils::DateTime::current_local()->truncate(to => 'month'); diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index e4746e0a51..83f9fbb7fb 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -75,7 +75,7 @@ sub sub_list :Chained('/') :PathPart('subscriber') :CaptureArgs(0) { },{ join => { 'contract' => 'contact'}, }); - } elsif($c->user->roles eq 'subscriber' || $c->user->roles eq 'subscriberadmin') { + } elsif($c->user->roles eq 'subscriber') { $c->stash->{subscribers_rs} = $c->stash->{subscribers_rs}->search({ 'username' => $c->user->username },{ @@ -88,6 +88,12 @@ sub sub_list :Chained('/') :PathPart('subscriber') :CaptureArgs(0) { join => 'domain' }); } + } elsif($c->user->roles eq 'subscriberadmin') { + $c->stash->{subscribers_rs} = $c->stash->{subscribers_rs}->search({ + 'contract.id' => $c->user->account_id, + },{ + join => { 'contract' => 'contact'}, + }); } $c->stash->{dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ diff --git a/share/templates/customer/details.tt b/share/templates/customer/details.tt index 74ccb1df93..8bb8c00269 100644 --- a/share/templates/customer/details.tt +++ b/share/templates/customer/details.tt @@ -14,7 +14,7 @@ Back - [% UNLESS c.user.read_only -%] + [% IF !c.user.read_only && (c.user.roles == 'admin' || c.user.roles == 'reseller') -%] Edit @@ -63,6 +63,7 @@ [% END -%] + [% IF c.user.roles == 'admin' || c.user.roles == 'reseller' %]