$OpenInteract2::Auth::Group::VERSION
=
sprintf
(
"%d.%02d"
,
q$Revision: 1.17 $
=~ /(\d+)\.(\d+)/);
my
(
$log
);
sub
get_groups {
my
(
$class
,
$auth
) =
@_
;
$log
||= get_logger( LOG_AUTH );
unless
(
$auth
->is_logged_in ) {
$log
->is_info &&
$log
->info(
"No logged-in user found, not retrieving groups."
);
return
$auth
->groups( [] );
}
$log
->is_info &&
$log
->info(
"Authenticated user exists; getting groups."
);
my
$groups
=
$class
->_get_cached_groups;
if
(
$groups
) {
return
$auth
->groups(
$groups
);
}
my
$user
=
$auth
->user;
$groups
=
eval
{
$user
->group({
skip_security
=>
'yes'
}) };
if
( $@ ) {
$log
->error(
"Failed to fetch groups from "
,
"[User: $user->{login_name}]: $@"
);
$groups
= [];
}
else
{
$class
->_set_cached_groups(
$groups
);
}
return
$auth
->groups(
$groups
);
}
sub
_get_cached_groups {
my
(
$class
) =
@_
;
my
$group_refresh
= CTX->lookup_session_config->{cache_group};
return
unless
(
$group_refresh
> 0 );
$log
||= get_logger( LOG_AUTH );
my
$groups
= [];
my
$session
= CTX->request->session;
if
(
$groups
=
$session
->{_oi_cache}{group} ) {
if
(
time
<
$session
->{_oi_cache}{group_refresh_on} ) {
$log
->is_debug &&
$log
->debug(
"Got groups from session ok"
);
}
else
{
$log
->is_debug &&
$log
->debug(
"Group session cache expired; refreshing from db"
);
delete
$session
->{_oi_cache}{group};
delete
$session
->{_oi_cache}{group_refresh_on};
}
}
return
$groups
;
}
sub
_set_cached_groups {
my
(
$class
,
$groups
) =
@_
;
my
$group_refresh
= CTX->lookup_session_config->{cache_group};
unless
(
ref
$groups
eq
'ARRAY'
and
scalar
@{
$groups
} > 0
and
$group_refresh
> 0 ) {
return
;
}
$log
||= get_logger( LOG_AUTH );
my
$session
= CTX->request->session;
$session
->{_oi_cache}{group} =
$groups
;
$session
->{_oi_cache}{group_refresh_on} =
time
+ (
$group_refresh
* 60 );
$log
->is_debug &&
$log
->debug(
"Set groups to session cache, expires in "
,
"[$group_refresh] minutes"
);
}
1;