App-Dochazka-REST
view release on metacpan or search on metacpan
lib/App/Dochazka/REST/Shared.pm view on Meta::CPAN
} elsif ( 'SCHEDULE' eq uc( $t ) ) {
$code = 'DISPATCH_EMPLOYEE_SCHEDULE';
} else {
die "AGHNEVERNEVERNEVERPRIVSCHED2";
}
return $CELL->status_ok( $code,
args => [ $emp->nick, $return_value ],
payload => {
eid => $eid += 0, # "numify"
nick => $emp->nick,
@privsched,
},
);
}
}
# There was a DBI error
return $return_value;
}
=head2 shared_employee_acl_part1
ACL check -- 'inactive' and 'active' employees can only operate on their own
EID. Returns boolean 1 or 0, where 1 means "ACL check passed".
=cut
sub shared_employee_acl_part1 {
my ( $d_obj, $this_emp ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::shared_employee_acl_part1" );
my $context = $d_obj->context;
my $cp = $context->{'current_priv'} || "none";
# insert
if ( ! defined( $this_emp ) ) {
if ( $cp ne 'admin' ) {
$d_obj->mrest_declare_status( code => 403,
explanation => "Only administrators can insert new employee records"
);
return 0;
}
}
# update
if ( $cp eq 'admin' ) {
return 1;
} else {
if ( $this_emp->eid == $context->{'current'}->{'eid'} ) {
return 1;
}
}
$d_obj->mrest_declare_status( code => 403, explanation => "DISPATCH_KEEP_TO_YOURSELF" );
return 0;
}
=head2 shared_employee_acl_part2
Apply ACL rules on which fields can be updated.
If privlevel is inactive or active, analyze which fields the user wants to update
(passerbies will be rejected earlier in Resource.pm, and admins can edit any field)
Returns boolean 1 or 0, where 1 means "ACL check passed".
=cut
sub shared_employee_acl_part2 {
my ( $d_obj ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::shared_employee_acl_part2" );
my $context = $d_obj->context;
my $cp = $context->{'current_priv'} || 'none';
if ( $cp eq 'admin' ) {
return 1;
} elsif ( $cp =~ m/^(inactive)|(active)$/i ) {
delete $context->{'request_entity'}->{'eid'};
my %lut;
map { $lut{$_} = ''; } @{ $site->DOCHAZKA_PROFILE_EDITABLE_FIELDS->{$cp} };
foreach my $prop ( keys %{ $context->{'request_entity'} } ) {
next if exists $lut{$prop};
$d_obj->mrest_declare_status(
$CELL->status_err(
'DISPATCH_ACL_VIOLATION',
args => [ $cp, "update $prop property" ],
http_code => 403,
uri_path => $context->{'uri_path'},
)
);
return 0;
}
return 1;
}
$d_obj->mrest_declare_status(
$CELL->status_err(
'DISPATCH_ACL_VIOLATION',
args => [ $cp, "update employee profiles" ],
http_code => 403,
)
);
return 0;
}
=head2 shared_update_activity
Takes three arguments:
- $d_obj is the dispatch object
- $act is an activity object (blessed hashref)
- $over is a hashref with zero or more activity properties and new values
The values from $over replace those in $act
=cut
sub shared_update_activity {
my ( $d_obj, $act, $over ) = @_;
$log->debug("Entering " . __PACKAGE__ . "::shared_update_activity" );
( run in 0.602 second using v1.01-cache-2.11-cpan-63c85eba8c4 )