|
Lines 23-28
use Digest::MD5 qw(md5_base64);
Link Here
|
| 23 |
use JSON qw/encode_json/; |
23 |
use JSON qw/encode_json/; |
| 24 |
use URI::Escape; |
24 |
use URI::Escape; |
| 25 |
use CGI::Session; |
25 |
use CGI::Session; |
|
|
26 |
use Scalar::Util qw(blessed); |
| 26 |
|
27 |
|
| 27 |
require Exporter; |
28 |
require Exporter; |
| 28 |
use C4::Context; |
29 |
use C4::Context; |
|
Lines 31-41
use C4::Languages;
Link Here
|
| 31 |
use C4::Branch; # GetBranches |
32 |
use C4::Branch; # GetBranches |
| 32 |
use C4::Search::History; |
33 |
use C4::Search::History; |
| 33 |
use Koha; |
34 |
use Koha; |
|
|
35 |
use Koha::Borrowers; |
| 34 |
use Koha::AuthUtils qw(hash_password); |
36 |
use Koha::AuthUtils qw(hash_password); |
| 35 |
use POSIX qw/strftime/; |
37 |
use POSIX qw/strftime/; |
| 36 |
use List::MoreUtils qw/ any /; |
38 |
use List::MoreUtils qw/ any /; |
| 37 |
use Encode qw( encode is_utf8); |
39 |
use Encode qw( encode is_utf8); |
| 38 |
|
40 |
|
|
|
41 |
use Koha::Exception::BadParameter; |
| 42 |
use Koha::Exception::UnknownObject; |
| 43 |
|
| 39 |
# use utf8; |
44 |
# use utf8; |
| 40 |
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $debug $ldap $cas $caslogout $shib $shib_login); |
45 |
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $debug $ldap $cas $caslogout $shib $shib_login); |
| 41 |
|
46 |
|
|
Lines 1915-1936
sub get_all_subpermissions {
Link Here
|
| 1915 |
} |
1920 |
} |
| 1916 |
|
1921 |
|
| 1917 |
=head2 haspermission |
1922 |
=head2 haspermission |
|
|
1923 |
PUBLIC |
| 1924 |
|
| 1925 |
my ($failedPermission, $borrowerPermissions) = C4::Auth::haspermission($borrowerOrIdentifier, $flagsrequired); |
| 1926 |
#or |
| 1927 |
#If you don't care about the reason why the permission check failed |
| 1928 |
my $borrowerPermissions = C4::Auth::haspermission($borrowerOrIdentifier, $flagsrequired); |
| 1929 |
#or |
| 1930 |
#Just get the borrower permissions |
| 1931 |
my $borrowerPermissions = C4::Auth::haspermission($borrowerOrIdentifier); |
| 1932 |
|
| 1933 |
Finds the borrower's permission flags or checks if the borrower has the proper |
| 1934 |
permissions if $flagsrequired is given. |
| 1935 |
|
| 1936 |
C<$borrowerOrIdentifier> MANDATORY, either the userid of the borrower |
| 1937 |
or a Koha::Borrower-object |
| 1938 |
C<$flagsrequired> OPTIONAL, is a hashref of required flags |
| 1939 |
{ borrowers => 1, #Must have all borrowers permission |
| 1940 |
circulate => *, #Must have any circulate permission |
| 1941 |
tools => 'stage_marc_import', #Must have the specific permission |
| 1942 |
} |
| 1918 |
|
1943 |
|
| 1919 |
$flags = ($userid, $flagsrequired); |
1944 |
C<RETURNS> A List of String and a Reference to a HASH of HASHes, member's flags. Eg. |
| 1920 |
|
1945 |
C<A successful permissions check> |
| 1921 |
C<$userid> the userid of the member |
1946 |
( |
| 1922 |
C<$flags> is a hashref of required flags like C<$borrower-<{authflags}> |
1947 |
undef, ##No failed permission |
| 1923 |
|
1948 |
{ tools => 1, ##borrower permissions |
| 1924 |
Returns member's flags or 0 if a permission is not met. |
1949 |
catalogue => 1, #All catalogue permissions |
| 1925 |
|
1950 |
circulate => { override_renewals => 1, |
|
|
1951 |
force_checkout => 1, |
| 1952 |
}, |
| 1953 |
lists => 0, #No lists permissions |
| 1954 |
... |
| 1955 |
} |
| 1956 |
) |
| 1957 |
C<A failed permissions check> |
| 1958 |
( |
| 1959 |
"circulate => force_checkout", ##The failed permission, see. C4::Auth::check_permissions() |
| 1960 |
0 ##Notify that the check failed. |
| 1961 |
) |
| 1962 |
|
| 1963 |
C<THROWS> Koha::Exception::UnknownObject, if no borrower is found. |
| 1964 |
Koha::Exception::BadParameter, if parameters are not properly given. |
| 1926 |
=cut |
1965 |
=cut |
| 1927 |
|
1966 |
|
| 1928 |
sub haspermission { |
1967 |
sub haspermission { |
| 1929 |
my ( $userid, $flagsrequired ) = @_; |
1968 |
my ( $borrOrId, $flagsrequired ) = @_; |
| 1930 |
my $sth = C4::Context->dbh->prepare("SELECT flags FROM borrowers WHERE userid=?"); |
1969 |
my ($borrower); |
| 1931 |
$sth->execute($userid); |
1970 |
|
| 1932 |
my $row = $sth->fetchrow(); |
1971 |
##Validate parameters since this is a public subroutine |
| 1933 |
my $flags = getuserflags( $row, $userid ); |
1972 |
#The best thing would be to get a honest reference to the Borrower-object, |
|
|
1973 |
#but currently we can only prepare that some day somebody will use me properly. |
| 1974 |
if (blessed($borrOrId) && $borrOrId->isa('Koha::Borrower')) { |
| 1975 |
$borrower = $borrOrId; |
| 1976 |
} |
| 1977 |
#We can get back to the DBIx to refetch the Borrower-object from the given borrower identifier, again. |
| 1978 |
elsif ($borrOrId && length($borrOrId) > 0) { |
| 1979 |
my @b = Koha::Borrowers->search( {userid => $borrOrId} ); |
| 1980 |
unless (scalar(@b)) { |
| 1981 |
Koha::Exception::UnknownObject->throw(error => __PACKAGE__."::haspermission():> No borrower found with the given borrower identifier '$borrOrId'."); |
| 1982 |
} |
| 1983 |
$borrower = $b[0]; |
| 1984 |
} |
| 1985 |
else { |
| 1986 |
Koha::Exception::BadParameter->throw(error => __PACKAGE__."::haspermission():> No borrower or borrowerIdentifier given."); |
| 1987 |
} |
| 1988 |
|
| 1989 |
##Parameters validated, time to get the flags! |
| 1990 |
my $userid = $borrower->userid(); |
| 1991 |
my $flags = getuserflags( $borrower->flags(), $userid ); |
| 1934 |
if ( $userid eq C4::Context->config('user') ) { |
1992 |
if ( $userid eq C4::Context->config('user') ) { |
| 1935 |
|
1993 |
|
| 1936 |
# Super User Account from /etc/koha.conf |
1994 |
# Super User Account from /etc/koha.conf |
|
Lines 1942-1967
sub haspermission {
Link Here
|
| 1942 |
$flags->{'superlibrarian'} = 1; |
2000 |
$flags->{'superlibrarian'} = 1; |
| 1943 |
} |
2001 |
} |
| 1944 |
|
2002 |
|
| 1945 |
return $flags if $flags->{superlibrarian}; |
2003 |
#This fcn returns the failed permission so a suitable error msg can be delivered. |
|
|
2004 |
my $failedPermission = ($flagsrequired) ? check_permissions($flagsrequired, $flags) : undef; |
| 2005 |
if ($failedPermission) { |
| 2006 |
return ($failedPermission, 0); |
| 2007 |
} |
| 2008 |
return ($failedPermission, $flags); |
| 2009 |
} |
| 2010 |
|
| 2011 |
=head check_permissions |
| 2012 |
PUBLIC |
| 2013 |
|
| 2014 |
my $failedPermission = check_permissions($permissionsRequired, $permissions); |
| 2015 |
|
| 2016 |
Check if the given $permissions satisfy the $permissionsRequired. |
| 2017 |
@PARAM1 Reference to HASH of HASHes, see. C4::Auth::haspermission() $flagsrequired |
| 2018 |
@PARAM2 Reference to HASH of HASHes, see. C4::Auth::haspermission() @RETURNS |
| 2019 |
@RETURNS String, the failed permission, eg: |
| 2020 |
"circulate == 1", or "circulate == *", or "circulate => force_checkout" |
| 2021 |
or |
| 2022 |
undef if everything went ok. |
| 2023 |
@THROWS Koha::Exception::BadParameter, if all parameters are not properly given. |
| 2024 |
=cut |
| 2025 |
|
| 2026 |
sub check_permissions { |
| 2027 |
my ($permissionsRequired, $permissions) = @_; |
| 1946 |
|
2028 |
|
| 1947 |
foreach my $module ( keys %$flagsrequired ) { |
2029 |
##Validate parameters, since this is a public subroutine |
| 1948 |
my $subperm = $flagsrequired->{$module}; |
2030 |
unless ($permissionsRequired && ref($permissionsRequired) eq 'HASH' && scalar(%$permissionsRequired)) { |
|
|
2031 |
Koha::Exception::BadParameter->throw(error => __PACKAGE__."::check_permission():> Mandatory parameter \$permissionsRequired is not given or is not a reference to HASH, or the HASH is empty."); |
| 2032 |
} |
| 2033 |
unless ($permissions && ref($permissions) eq 'HASH' && scalar(%$permissions)) { |
| 2034 |
Koha::Exception::BadParameter->throw(error => __PACKAGE__."::check_permission():> Mandatory parameter \$permissions is not given or is not a reference to HASH, or the HASH is empty."); |
| 2035 |
} |
| 2036 |
|
| 2037 |
##Start checking permissions |
| 2038 |
return undef if $permissions->{superlibrarian}; |
| 2039 |
|
| 2040 |
my $failedPermission; |
| 2041 |
foreach my $module ( keys %$permissionsRequired ) { |
| 2042 |
my $subperm = $permissionsRequired->{$module}; |
| 1949 |
if ( $subperm eq '*' ) { |
2043 |
if ( $subperm eq '*' ) { |
| 1950 |
return 0 unless ( $flags->{$module} == 1 or ref( $flags->{$module} ) ); |
2044 |
$failedPermission = {$module => '*'} unless ( $permissions->{$module} == 1 or |
|
|
2045 |
ref( $permissions->{$module} ) ); |
| 1951 |
} else { |
2046 |
} else { |
| 1952 |
return 0 unless ( |
2047 |
$failedPermission = {$module => '1'} unless ( defined($permissions->{$module}) and |
| 1953 |
( defined $flags->{$module} and |
2048 |
$permissions->{$module} == 1 ); |
| 1954 |
$flags->{$module} == 1 ) |
2049 |
$failedPermission = {$module => $subperm} unless ( ref($permissions->{$module}) and |
| 1955 |
or |
2050 |
exists($permissions->{$module}->{$subperm}) and |
| 1956 |
( ref( $flags->{$module} ) and |
2051 |
$permissions->{$module}->{$subperm} == 1 ); |
| 1957 |
exists $flags->{$module}->{$subperm} and |
|
|
| 1958 |
$flags->{$module}->{$subperm} == 1 ) |
| 1959 |
); |
| 1960 |
} |
2052 |
} |
|
|
2053 |
last() if $failedPermission; |
| 1961 |
} |
2054 |
} |
| 1962 |
return $flags; |
2055 |
return $failedPermission || undef; |
| 1963 |
|
|
|
| 1964 |
#FIXME - This fcn should return the failed permission so a suitable error msg can be delivered. |
| 1965 |
} |
2056 |
} |
| 1966 |
|
2057 |
|
| 1967 |
sub getborrowernumber { |
2058 |
sub getborrowernumber { |
| 1968 |
- |
|
|