MT#59979 add license control

* UI and API parts are now under license control
* new Util::License::get_license($c, $name)
  - fetches license status by name (1 if enabled, and also if
    /proc/ngcp/check if 'ok')
* add Catalyst::Plugins::NGCP::License with license($name)
  to fetch valid license by name from anywhere using
  $c->license('pbx') or from the templates using c.license('pbx').
  It internally uses Util::License::get_license($c, $name)
* License::get_license_status($c) now requires $c as first argument
  as well logs license status check errors.
* new ActionRoles::License that enables usage of
  :Does(License) RequiresLicense('pbx') LicenseDetachTo('/denied_page')
  in the Controller chains
* Add license control for UI elements and return 403 Forbidden
  if a resource is covered by licenses and the license is not active
* Hide UI elements if a license is not active
* API/Entities/Entities new $c->set_config key:
    - per endpoint:
      $c->set_config({
        required_licenses => [qw/pbx device_provisioning/]
      }
    - or per method:
      $c->set_config({
        required_licenses => {
            POST => [qw/pbx device_provisioning/]
        }
      }
  }
* In case if an API endpoint does not have a license:
  403 Forbidden "Invalid license" reply is returned.
* Add license based restrictions to API endpoints
* /api documentation:
  - completely hide endpoints that do not have an active license
  - hide only methods that does not have an active license

Change-Id: Iba45fc5068b02306a617fed7b5405f2210574b61
mr13.0
Kirill Solomko 11 months ago
parent 9c103302c8
commit 9d021be65a

@ -0,0 +1,33 @@
package Catalyst::Plugin::NGCP::License;
use warnings;
use strict;
use MRO::Compat;
use NGCP::Panel::Utils::Generic qw();
sub licenses {
return NGCP::Panel::Utils::License::get_licenses(@_);
}
sub license {
return NGCP::Panel::Utils::License::get_license(@_);
}
sub license_meta {
return NGCP::Panel::Utils::License::get_license_meta(@_);
}
sub license_max_pbx_groups {
return NGCP::Panel::Utils::License::get_max_pbx_groups(@_);
}
sub license_max_subscribers {
return NGCP::Panel::Utils::License::get_max_subscribers(@_);
}
sub license_max_pbx_subscribers {
return NGCP::Panel::Utils::License::get_max_pbx_subscribers(@_);
}
1;

@ -29,6 +29,7 @@ use Catalyst qw/
NGCP::EscapeSensitiveValue
NGCP::EscapeJs
NGCP::EscapeURI
NGCP::License
I18N
/;
use Log::Log4perl::Catalyst qw();

@ -0,0 +1,93 @@
package NGCP::Panel::ActionRole::License;
use Moose::Role;
use namespace::autoclean;
sub BUILD { }
after BUILD => sub {
my $class = shift;
my ($args) = @_;
my $attr = $args->{attributes};
unless (exists $attr->{RequiresLicense} || exists $attr->{AllowedLicense}) {
Catalyst::Exception->throw(
"Action '$args->{reverse}' requires at least one RequiresLicense or AllowedLicense attribute");
}
unless (exists $attr->{LicenseDetachTo} && $attr->{LicenseDetachTo}) {
Catalyst::Exception->throw(
"Action '$args->{reverse}' requires the LicenseDetachTo(<action>) attribute");
}
};
around execute => sub {
my $orig = shift;
my $self = shift;
my ($controller, $c) = @_;
if ($self->check_license($c)) {
return $self->$orig(@_);
}
my $denied = $self->attributes->{ACLDetachTo}[0];
$c->detach($denied);
};
sub check_license {
my ($self, $c) = @_;
my $required = $self->attributes->{RequiresLicense};
my $allowed = $self->attributes->{AllowedLicense};
if ($required && $allowed) {
for my $license (@$required) {
return unless $c->license($license);
}
for my $license (@$allowed) {
return 1 if $c->license($license);
}
return;
}
elsif ($required) {
for my $license (@$required) {
return unless $c->license($license);
}
return 1;
}
elsif ($allowed) {
for my $license (@$allowed) {
return 1 if $c->license($license);
}
return;
}
return;
}
1;
__END__
=pod
=head1 NAME
NGCP::Panel::ActionRole::License
=head1 DESCRIPTION
A helper to check NGCP License info
=head1 AUTHOR
Sipwise Development Team <support@sipwise.com>
=head1 LICENSE
This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.
=cut
# vim: set tabstop=4 expandtab:

@ -82,6 +82,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -56,6 +56,7 @@ sub query_params {
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare/],
required_licenses => [qw/billing/],
action_add => {
item_base => {
Chained => '/',

@ -61,6 +61,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub auto :Private {

@ -31,6 +31,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -70,6 +70,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -43,7 +43,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller/],
Journal => [qw/admin reseller/],
}
},
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -62,6 +62,9 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare/],
required_licenses => {
POST => [qw/billing/],
}
});
sub GET :Allow {

@ -40,7 +40,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller ccareadmin ccare/],
Journal => [qw/admin reseller ccareadmin ccare/],
}
},
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -55,6 +55,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -38,7 +38,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller/],
Journal => [qw/admin reseller/],
}
},
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -34,6 +34,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/call_recording/],
});
1;

@ -29,6 +29,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/call_recording/],
});
sub GET :Allow {

@ -67,6 +67,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/call_recording/],
});
sub GET :Allow {

@ -30,6 +30,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/call_recording/],
});
sub GET :Allow {

@ -7,6 +7,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::CallRecordings
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/call_recording/],
});
sub allowed_methods{

@ -10,6 +10,7 @@ use HTTP::Status qw(:constants);
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/call_recording/],
});
sub allowed_methods{

@ -112,6 +112,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -39,7 +39,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller ccareadmin ccare/],
Journal => [qw/admin reseller ccareadmin ccare/],
}
},
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -15,6 +15,7 @@ __PACKAGE__->set_config({
},
allowed_roles => [qw/admin reseller subscriberadmin/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/phonebook/],
});
sub allowed_methods {

@ -8,6 +8,7 @@ use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::CustomerPh
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/phonebook/],
});
sub allowed_methods{

@ -65,6 +65,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -34,6 +34,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -34,6 +34,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/fax/],
});
1;

@ -34,6 +34,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/fax/],
});
sub GET :Allow {

@ -15,6 +15,7 @@ use NGCP::Panel::Utils::Fax;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/fax/],
dont_validate_hal => 1,
no_item_created => 1,
backward_allow_empty_upload => 1,

@ -7,6 +7,7 @@ use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::Faxes/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/fax/],
dont_validate_hal => 1,
});

@ -7,6 +7,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::FaxserverSetti
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare subscriber subscriberadmin/],
required_licenses => [qw/fax/],
});
sub allowed_methods{

@ -14,6 +14,7 @@ __PACKAGE__->set_config({
Default => [qw/admin reseller ccareadmin ccare subscriber subscriberadmin/],
Journal => [qw/admin reseller ccareadmin ccare subscriber subscriberadmin/],
},
required_licenses => [qw/fax/],
PATCH => { ops => [qw/add replace remove copy/] },
});

@ -10,6 +10,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::HeaderRuleActi
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/header_manipulation/],
});
sub allowed_methods {

@ -13,6 +13,7 @@ __PACKAGE__->set_config({
Journal => [qw/admin reseller/],
},
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/header_manipulation/],
PATCH => { ops => [qw/add replace remove copy/] },
});

@ -10,6 +10,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::HeaderRuleCond
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/header_manipulation/],
});
sub allowed_methods {

@ -13,6 +13,7 @@ __PACKAGE__->set_config({
Journal => [qw/admin reseller/],
},
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/header_manipulation/],
PATCH => { ops => [qw/add replace remove copy/] },
});

@ -9,6 +9,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::HeaderRuleSets
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/header_manipulation/],
});
sub allowed_methods {

@ -13,6 +13,7 @@ __PACKAGE__->set_config({
Journal => [qw/admin reseller/],
},
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/header_manipulation/],
PATCH => { ops => [qw/add replace remove copy/] },
});

@ -10,6 +10,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::HeaderRules/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/header_manipulation/],
});
sub allowed_methods {

@ -13,6 +13,7 @@ __PACKAGE__->set_config({
Journal => [qw/admin reseller/],
},
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/header_manipulation/],
PATCH => { ops => [qw/add replace remove copy/] },
});

@ -55,6 +55,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare/],
required_licenses => [qw/invoice/],
});
sub GET :Allow {

@ -31,6 +31,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare/],
required_licenses => [qw/invoice/],
});
sub GET :Allow {

@ -6,7 +6,9 @@ use HTTP::Status qw(:constants);
use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::Invoices/;
__PACKAGE__->set_config();
__PACKAGE__->set_config({
required_licenses => [qw/invoice/],
});
sub allowed_methods{
return [qw/GET POST OPTIONS HEAD/];

@ -6,6 +6,7 @@ use NGCP::Panel::Utils::Generic qw(:all);
use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::Invoices/;
__PACKAGE__->set_config({
required_licenses => [qw/invoice/],
log_response => 0,
GET => {
#first element of array is default, if no accept header was received.

@ -72,6 +72,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare subscriberadmin subscriber/],
required_licenses => [qw/fax/],
});
sub GET :Allow {

@ -39,7 +39,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller ccareadmin ccare subscriberadmin subscriber/],
Journal => [qw/admin reseller ccareadmin ccare subscriberadmin subscriber/],
}
},
required_licenses => [qw/fax/],
});
sub GET :Allow {

@ -39,6 +39,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub auto :Private {

@ -31,6 +31,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -72,6 +72,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -31,6 +31,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -39,6 +39,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub auto :Private {

@ -32,6 +32,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -73,6 +73,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -31,6 +31,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -5,7 +5,9 @@ use NGCP::Panel::Utils::Generic qw(:all);
use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::PbxDeviceModelImages NGCP::Panel::Role::API::PbxDeviceModels/;
__PACKAGE__->set_config();
__PACKAGE__->set_config({
required_licenses => [qw/pbx device_provisioning/],
});
sub config_allowed_roles {
return [qw/admin reseller subscriberadmin subscriber/];

@ -13,6 +13,7 @@ __PACKAGE__->set_config({
},
log_response => 0,
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/pbx device_provisioning/],
});
sub allowed_methods{

@ -19,7 +19,8 @@ __PACKAGE__->set_config({
allowed_roles => {
'Default' => [qw/admin reseller subscriberadmin subscriber/],
'POST' => [qw/admin reseller/],
}
},
required_licenses => [qw/pbx device_provisioning/],
});
# curl -v -X POST --user $USER --insecure -F front_image=@sandbox/spa504g-front.png -F mac_image=@sandbox/spa504g-back.png -F front_thumbnail=@sandbox/spa504g-front-small.png -F json='{"reseller_id":1, "vendor":"Cisco", "model":"SPA999", "linerange":[{"name": "Phone Keys", "can_private":true, "can_shared":true, "can_blf":true, "can_speeddial":true, "can_forward":true, "can_transfer":true, "keys":[{"labelpos":"top", "x":5110, "y":5120},{"labelpos":"top", "x":5310, "y":5320}]}]}' https://localhost:4443/api/pbxdevicemodels/

@ -14,7 +14,8 @@ __PACKAGE__->set_config({
'Default' => [qw/admin reseller subscriberadmin subscriber/],
'PUT' => [qw/admin reseller/],
'PATCH' => [qw/admin reseller/],
}
},
required_licenses => [qw/pbx device_provisioning/],
});
sub allowed_methods{

@ -13,6 +13,7 @@ sub allowed_methods{
__PACKAGE__->set_config({
preferences_group => 'dev_pref',
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
1;

@ -8,6 +8,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::Preferences/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub allowed_methods{

@ -10,7 +10,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller/],
Journal => [qw/admin reseller/],
}
},
required_licenses => [qw/pbx device_provisioning/],
});
sub allowed_methods{

@ -13,6 +13,7 @@ sub allowed_methods{
__PACKAGE__->set_config({
preferences_group => 'devprof_pref',
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
1;

@ -7,6 +7,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::Preferences/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
sub allowed_methods{

@ -10,7 +10,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller/],
Journal => [qw/admin reseller/],
}
},
required_licenses => [qw/pbx device_provisioning/],
});
sub allowed_methods{

@ -50,6 +50,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -34,6 +34,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -104,6 +104,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -34,6 +34,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin/],
required_licenses => [qw/pbx device_provisioning/],
});
sub GET :Allow {

@ -13,6 +13,7 @@ sub allowed_methods{
__PACKAGE__->set_config({
preferences_group => 'fielddev_pref',
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/pbx device_provisioning/],
});
1;

@ -7,6 +7,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::Preferences/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin/],
required_licenses => [qw/pbx device_provisioning/],
});
sub allowed_methods{

@ -10,7 +10,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller subscriberadmin/],
Journal => [qw/admin reseller/],
}
},
required_licenses => [qw/pbx device_provisioning/],
});
sub allowed_methods{

@ -84,6 +84,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -38,7 +38,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller ccareadmin ccare/],
Journal => [qw/admin reseller ccareadmin ccare/],
}
},
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -54,6 +54,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller ccareadmin ccare/],
required_licenses => [qw/batch_provisioning/],
});
sub create_item {

@ -42,6 +42,7 @@ sub get_journal_methods{
}
__PACKAGE__->set_config({
required_licenses => [qw/batch_provisioning/],
action_add => {
item_base => {
Chained => '/',

@ -10,6 +10,9 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::ResellerBrandi
__PACKAGE__->set_config({
log_response => 0,
allowed_roles => [qw/admin reseller subscriberadmin/],
required_licenses => {
POST => [qw/reseller/],
}
});
sub allowed_methods {

@ -10,6 +10,7 @@ use HTTP::Status qw(:constants);
__PACKAGE__->set_config({
log_response => 0,
allowed_roles => [qw/admin reseller subscriberadmin/],
required_licenses => [qw/reseller/],
});
sub allowed_methods {

@ -18,6 +18,9 @@ __PACKAGE__->set_config({
allowed_roles => {
'Default' => [qw/admin reseller subscriberadmin subscriber/],
'POST' => [qw/admin reseller/],
},
required_licenses => {
POST => [qw/reseller/],
}
});

@ -14,7 +14,8 @@ __PACKAGE__->set_config({
'Default' => [qw/admin reseller subscriberadmin subscriber/],
'PUT' => [qw/admin reseller/],
'PATCH' => [qw/admin reseller/],
}
},
required_licenses => [qw/reseller/],
});
sub allowed_methods{

@ -15,6 +15,7 @@ __PACKAGE__->set_config({
},
allowed_roles => [qw/admin reseller/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/phonebook/],
});
sub allowed_methods {

@ -8,6 +8,7 @@ use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::ResellerPh
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/phonebook/],
});
sub allowed_methods{

@ -13,6 +13,7 @@ sub allowed_methods{
__PACKAGE__->set_config({
preferences_group => 'reseller_pref',
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/reseller/],
});
1;

@ -7,6 +7,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::Preferences/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/reseller/],
});
sub allowed_methods{

@ -8,6 +8,7 @@ use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::Preference
__PACKAGE__->set_config({
PATCH => { ops => [qw/add replace remove copy/] },
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/reseller/],
});
sub allowed_methods{

@ -57,6 +57,9 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin/],
required_licenses => {
POST => [qw/reseller/],
}
});
sub GET :Allow {

@ -39,7 +39,8 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin/],
Journal => [qw/admin/],
}
},
required_licenses => [qw/reseller/],
});
sub GET :Allow {

@ -13,7 +13,7 @@ use JSON qw(to_json encode_json decode_json);
use YAML::XS qw/Dump/;
use Safe::Isa qw($_isa);
use NGCP::Panel::Utils::API;
use List::Util qw(none);
use List::Util qw(none all);
use parent qw/Catalyst::Controller NGCP::Panel::Role::API/;
use NGCP::Panel::Utils::Journal qw();
@ -103,10 +103,20 @@ sub GET : Allow {
next unless $user_roles{$role};
}
my $allowed_ngcp_types = $full_mod->config->{allowed_ngcp_types} // [];
if (@{$allowed_ngcp_types}) {
next if none { $_ eq $c->config->{general}{ngcp_type} }
@{$allowed_ngcp_types};
if ($full_mod->can('config')) {
my $allowed_ngcp_types = $full_mod->config->{allowed_ngcp_types} // [];
if (@{$allowed_ngcp_types}) {
next if none { $_ eq $c->config->{general}{ngcp_type} }
@{$allowed_ngcp_types};
}
my $required_licenses = $full_mod->config->{required_licenses} // undef;
if (ref $required_licenses eq 'ARRAY') {
if (@{$required_licenses} &&
! all { $c->license($_) } @{$required_licenses}) {
next;
}
}
}
my $query_params = [];
@ -122,6 +132,21 @@ sub GET : Allow {
} else {
$actions = [ sort keys %{ $full_mod->config->{action} } ];
}
if ($full_mod->can('config')) {
my $required_licenses = $full_mod->config->{required_licenses} // undef;
if (ref $required_licenses eq 'HASH') {
foreach my $method (qw/GET HEAD OPTIONS POST/) {
if (my $method_licenses = $required_licenses->{$method}) {
if (@{$method_licenses} &&
! all { $c->license($_) } @{$method_licenses}) {
$actions = [grep { $_ ne $method } @{$actions}];
}
}
}
}
}
my $uri = "/api/$rel/";
my $item_actions = [];
my $journal_resource_config = {};
@ -137,6 +162,24 @@ sub GET : Allow {
push @{ $item_actions }, $m;
}
}
my $required_licenses = $full_item_mod->config->{required_licenses} // undef;
if (ref $required_licenses eq 'ARRAY') {
if (@{$required_licenses} &&
! all { $c->license($_) } @{$required_licenses}) {
$item_actions = [];
}
} elsif (ref $required_licenses eq 'HASH') {
foreach my $method (qw/GET HEAD OPTIONS PUT PATCH DELETE/) {
if (my $method_licenses = $required_licenses->{$method}) {
if (@{$method_licenses} &&
! all { $c->license($_) } @{$method_licenses}) {
$item_actions = [grep { $_ ne $method } @{$actions}];
}
}
}
}
if($full_item_mod->can('resource_name')) {
my @operations = ();
my $op_config = {};

@ -9,6 +9,7 @@ use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::SIPCaptures/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/voisniff-mysql_dump/],
});

@ -16,6 +16,7 @@ use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::SIPCapture
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
required_licenses => [qw/voisniff-mysql_dump/],
log_response => 0,
});

@ -10,7 +10,9 @@ use NGCP::Panel::Utils::Preferences;
use UUID;
__PACKAGE__->set_config();
__PACKAGE__->set_config({
required_licenses => [qw/sms/],
});
sub allowed_methods{
return [qw/GET POST OPTIONS HEAD/];

@ -6,7 +6,9 @@ use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::SMS/;
use HTTP::Status qw(:constants);
__PACKAGE__->set_config();
__PACKAGE__->set_config({
required_licenses => [qw/sms/],
});
sub allowed_methods{
return [qw/GET OPTIONS HEAD/];

@ -15,6 +15,7 @@ __PACKAGE__->set_config({
},
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/phonebook/],
});
sub allowed_methods {

@ -8,6 +8,7 @@ use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::Subscriber
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller subscriberadmin subscriber/],
allowed_ngcp_types => [qw/carrier sppro/],
required_licenses => [qw/phonebook/],
});
sub allowed_methods{

@ -19,7 +19,7 @@ __PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller ccareadmin ccare subscriberadmin subscriber/],
Journal => [qw/admin reseller ccareadmin ccare subscriberadmin subscriber/],
}
},
});
sub allowed_methods{

@ -44,6 +44,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub POST :Allow {

@ -167,6 +167,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -31,6 +31,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -44,6 +44,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub POST :Allow {

@ -61,6 +61,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -31,6 +31,7 @@ sub relation{
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
required_licenses => [qw/billing/],
});
sub GET :Allow {

@ -13,7 +13,7 @@ use NGCP::Panel::Utils::Generic qw(run_module_method get_module_var);
use NGCP::Panel::Form::ProvisioningTemplate::Admin qw();
use NGCP::Panel::Form::ProvisioningTemplate::Reseller qw();
sub auto :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) :AllowedRole(ccareadmin) :AllowedRole(ccare) {
sub auto :Does(License) :RequiresLicense('batch_provisioning') :LicenseDetachTo('/denied_page') :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) :AllowedRole(ccareadmin) :AllowedRole(ccare) {
my ($self, $c) = @_;
$c->log->debug(__PACKAGE__ . '::auto');
NGCP::Panel::Utils::Navigation::check_redirect_chain(c => $c);

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save