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.
153 lines
4.7 KiB
153 lines
4.7 KiB
package NGCP::Panel::Controller::API::UserInfo;
|
|
|
|
use Sipwise::Base;
|
|
|
|
use Data::HAL qw();
|
|
use Data::HAL::Link qw();
|
|
use File::Basename;
|
|
use File::Find::Rule;
|
|
use HTTP::Headers qw();
|
|
use HTTP::Status qw(:constants);
|
|
|
|
|
|
sub allowed_methods{
|
|
return [qw/GET OPTIONS/];
|
|
}
|
|
|
|
use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::UserInfo/;
|
|
|
|
sub api_description {
|
|
return '';
|
|
};
|
|
|
|
sub query_params {
|
|
return [
|
|
];
|
|
}
|
|
|
|
sub resource_name{
|
|
return 'userinfo';
|
|
}
|
|
|
|
sub dispatch_path{
|
|
return '/api/userinfo/';
|
|
}
|
|
|
|
sub relation{
|
|
return 'http://purl.org/sipwise/ngcp-api/#rel-userinfo';
|
|
}
|
|
|
|
__PACKAGE__->set_config({
|
|
allowed_roles => [qw/admin reseller ccare ccareadmin subscriber subscriberadmin/],
|
|
});
|
|
|
|
sub GET :Allow {
|
|
my ($self, $c) = @_;
|
|
|
|
my $operations_map = {
|
|
'GET' => 'read',
|
|
'POST' => 'create',
|
|
'PATCH' => 'update',
|
|
'PUT' => 'update',
|
|
'DELETE' => 'delete',
|
|
};
|
|
|
|
my $blacklist = {
|
|
"DomainPreferenceDefs" => 1,
|
|
"SubscriberPreferenceDefs" => 1,
|
|
"CustomerPreferenceDefs" => 1,
|
|
"ProfilePreferenceDefs" => 1,
|
|
"PeeringServerPreferenceDefs" => 1,
|
|
"ResellerPreferenceDefs" => 1,
|
|
"PbxDevicePreferenceDefs" => 1,
|
|
"PbxDeviceProfilePreferenceDefs" => 1,
|
|
"PbxFieldDevicePreferenceDefs" => 1,
|
|
"MetaConfigDefs" => 1,
|
|
};
|
|
|
|
my $res = { username => $c->user->login, role => $c->user->roles };
|
|
|
|
my $colls = NGCP::Panel::Utils::API::get_collections_files;
|
|
my %user_roles = map {$_ => 1} $c->user->roles;
|
|
foreach my $coll (@$colls) {
|
|
my $mod = $coll;
|
|
$mod =~ s/^.+\/([a-zA-Z0-9_]+)\.pm$/$1/;
|
|
next if (exists $blacklist->{$mod});
|
|
my $rel = lc $mod;
|
|
my $full_mod = 'NGCP::Panel::Controller::API::' . $mod;
|
|
my $full_item_mod = 'NGCP::Panel::Controller::API::' . $mod . 'Item';
|
|
|
|
my $role = $full_mod->config->{action}->{OPTIONS}->{AllowedRole};
|
|
if ($role && ref $role eq "ARRAY") {
|
|
next unless grep { $user_roles{$_}; } @{ $role };
|
|
} elsif ($role) {
|
|
next unless $user_roles{$role};
|
|
}
|
|
|
|
$res->{permissions}->{entity}->{$rel}->{'$p'} = {
|
|
create => JSON::false,
|
|
read => JSON::false,
|
|
update => JSON::false,
|
|
delete => JSON::false,
|
|
};
|
|
my $actions = [];
|
|
if ($c->user->read_only) {
|
|
foreach my $m (sort keys %{ $full_mod->config->{action} }) {
|
|
next unless $m =~ /^(GET|HEAD|OPTIONS)$/;
|
|
push @{ $actions }, $m;
|
|
}
|
|
} else {
|
|
$actions = [ sort keys %{ $full_mod->config->{action} } ];
|
|
}
|
|
foreach my $action (@$actions) {
|
|
my $operation = $operations_map->{$action};
|
|
next unless $operation;
|
|
$res->{permissions}->{entity}->{$rel}->{'$p'}->{$operation} = JSON::true;
|
|
}
|
|
my $item_actions = [];
|
|
if ($full_item_mod->can('config')) {
|
|
if ($c->user->read_only) {
|
|
foreach my $m (sort keys %{ $full_item_mod->config->{action} }) {
|
|
next unless $m =~ /^(GET|HEAD|OPTIONS)$/;
|
|
push @{ $item_actions }, $m;
|
|
}
|
|
} else {
|
|
foreach my $m (sort keys %{ $full_item_mod->config->{action} }) {
|
|
next unless $m =~ /^(GET|HEAD|OPTIONS|PUT|PATCH|DELETE)$/;
|
|
push @{ $item_actions }, $m;
|
|
}
|
|
}
|
|
foreach my $action (@$item_actions) {
|
|
my $operation = $operations_map->{$action};
|
|
next unless $operation;
|
|
$res->{permissions}->{entity}->{$rel}->{'$p'}->{$operation} = JSON::true;
|
|
}
|
|
}
|
|
if ($full_item_mod->can('get_form')) {
|
|
my $form = $full_item_mod->get_form($c);
|
|
if ($form) {
|
|
foreach my $field ($form->fields) {
|
|
next if (
|
|
$field->type eq "Hidden" ||
|
|
$field->type eq "Button" ||
|
|
$field->type eq "Submit" ||
|
|
0);
|
|
$res->{permissions}->{entity}->{$rel}->{columns}->{$field->name}->{'$p'} = {
|
|
$field->{read_only} ? (create => JSON::false) : (create => JSON::true),
|
|
read => JSON::true,
|
|
$field->{read_only} ? (update => JSON::false) : (update => JSON::true),
|
|
$field->{read_only} ? (delete => JSON::false) : (delete => JSON::true),
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$c->response->status(HTTP_OK);
|
|
$c->response->body(JSON::to_json($res));
|
|
return;
|
|
}
|
|
|
|
1;
|
|
|
|
# vim: set tabstop=4 expandtab:
|