From 6d487452bbdd027e8d6bc772615bb6cbcf755466 Mon Sep 17 00:00:00 2001 From: Kirill Solomko Date: Fri, 23 Dec 2022 00:16:57 +0100 Subject: [PATCH] MT#56234 susbcriber preferences related changes * fix customer_view role name typo so that it's correctly limited to for 'subscriberadmin' role * revert behaviour of get_usr_preference_rs() to return undef if no preference is found (no access) * get_usr_preference_rs() now also fetches all internal preferences for internal work for 'subscriber' and 'subscriberadmin' roles but they remain invisible for them and not accesible for direct changes (only when requested by internal logic) * new get_usr_preference_rs() 'as_admin' parameter that enables for internal requests to return the preference value for 'subscriberadmin' and 'subscriber' roles, currently used to show 'lock' status and 'display_name', which are otherwise inaccessible as those preferences do not have expose_to_customer, expose_to_subscriber flags * fix api_prference_defs() correct filtering of preferences for 'subscriber' and 'subscriberadmin' roles Change-Id: I1a0e51ace1c649f9061deaccb7d6e9f8459f0ed8 --- lib/NGCP/Panel/Controller/Subscriber.pm | 9 +++++-- lib/NGCP/Panel/Role/API/Subscribers.pm | 2 +- lib/NGCP/Panel/Utils/Preferences.pm | 33 +++++++++++++------------ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index 891f045790..aa046890a0 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -2652,7 +2652,7 @@ sub load_preference_list :Private { NGCP::Panel::Utils::Preferences::load_preference_list( c => $c, pref_values => \%pref_values, usr_pref => 1, - customer_view => ($c->user->roles eq 'subscriberdmin' ? 1 : 0), + customer_view => ($c->user->roles eq 'subscriberadmin' ? 1 : 0), subscriber_view => ($c->user->roles eq 'subscriber' ? 1 : 0), ); } @@ -2705,6 +2705,7 @@ sub master :Chained('base') :PathPart('details') :CaptureArgs(0) { c => $c, attribute => 'lock', prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, + as_admin => 1, ); } @@ -2717,6 +2718,7 @@ sub details :Chained('master') :PathPart('') :Args(0) :Does(ACL) :ACLDetachTo('/ c => $c, attribute => 'lock', prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, + as_admin => 1, ); my $locklevel = $c->stash->{prov_lock}->first ? $c->stash->{prov_lock}->first->value : 0; $c->stash->{prov_lock_string} = NGCP::Panel::Utils::Subscriber::get_lock_string($locklevel); @@ -2879,7 +2881,10 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet } my $display_pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - c => $c, attribute => 'display_name', prov_subscriber => $prov_subscriber); + c => $c, attribute => 'display_name', + prov_subscriber => $prov_subscriber, + as_admin => 1, + ); if($display_pref->first) { $params->{display_name} = $display_pref->first->value; } diff --git a/lib/NGCP/Panel/Role/API/Subscribers.pm b/lib/NGCP/Panel/Role/API/Subscribers.pm index b916525219..53e8fabfa0 100644 --- a/lib/NGCP/Panel/Role/API/Subscribers.pm +++ b/lib/NGCP/Panel/Role/API/Subscribers.pm @@ -143,7 +143,7 @@ sub resource_from_item { })->all; $pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - c => $c, attribute => 'display_name', + c => $c, attribute => 'display_name', as_admin => 1, prov_subscriber => $item->provisioning_voip_subscriber); if($pref->first && $pref->first->value) { $resource{display_name} = $pref->first->value; diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index b0de2cb5c8..e5ce88d587 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -2418,7 +2418,6 @@ sub get_chained_preference_rs { $preference_type, $preference_elem, $attr, - { exists $params->{subscriberadmin} ? (subscriberadmin => $params->{subscriberadmin} ) : () }, ); if ($attribute_value_rs->first) { return $attribute_value_rs; @@ -2435,21 +2434,19 @@ sub get_usr_preference_rs { my $attribute = $params{attribute}; my $prov_subscriber = $params{prov_subscriber}; my $schema = $params{schema} // $c->model('DB'); + my $as_admin = $params{as_admin} // 0; my $pref_rs = $schema->resultset('voip_preferences')->search_rs({ - attribute => $attribute, - usr_pref => 1, - $c->user->roles eq 'subscriberadmin' - ? (expose_to_customer => 1) : (), - $c->user->roles eq 'subscriber' - ? (expose_to_subscriber => 1) : (), - }); - unless ($pref_rs && $pref_rs->first) { - # an ResultSet object is expected as the return value - return $pref_rs; - } + attribute => $attribute, + usr_pref => 1, + !$as_admin && $c->user->roles eq 'subscriberadmin' + ? (-or => [ expose_to_customer => 1, internal => { '!=' => 0 } ]) : (), + !$as_admin && $c->user->roles eq 'subscriber' + ? (-or => [ expose_to_subscriber => 1, internal => { '!=' => 0 } ]) : (), + })->first; + return unless $pref_rs; - my $attribute_id = $pref_rs->first->id; + my $attribute_id = $pref_rs->id; # filter by allowed attrs from profile if (($c->user->roles eq 'subscriberadmin' || $c->user->roles eq 'subscriber') && @@ -2457,11 +2454,11 @@ sub get_usr_preference_rs { my $found_attr = $prov_subscriber->voip_subscriber_profile ->profile_attributes->search_rs({ attribute_id => $attribute_id, - }); - return $found_attr unless $found_attr->first; + })->first; + return unless $found_attr; } - $pref_rs = $pref_rs->first->voip_usr_preferences; + $pref_rs = $pref_rs->voip_usr_preferences; if ($prov_subscriber) { $pref_rs = $pref_rs->search({ subscriber_id => $prov_subscriber->id, @@ -2727,6 +2724,10 @@ sub api_preferences_defs { my $preferences = $c->model('DB')->resultset('voip_preferences')->search({ internal => { '!=' => 1 }, # also fetch -1 for ncos, rwr $preferences_group => 1, + $c->user->roles eq 'subscriberadmin' + ? (expose_to_customer => 1) : (), + $c->user->roles eq 'subscriber' + ? (expose_to_subscriber => 1) : (), }); my $resource = {};