Merge branch 'v2.0' into 1783

This commit is contained in:
Christophe Maudoux 2019-06-25 20:23:48 +02:00
commit 0b567d6c15
6 changed files with 101 additions and 23 deletions

View File

@ -227,9 +227,11 @@ sub save {
Lemonldap::NG::Handler::Main->tsv->{cipher}->encrypt(time);
};
print STDERR "$@\n" if ($@);
$req->content( to_json( $self->{data} ) );
my $content = to_json( $self->{data} );
$req->content($content);
delete $self->{data}->{__secret};
$req->header( 'Content-Type' => 'application/json' );
$req->header( 'Content-Type' => 'application/json' );
$req->header( 'Content-Length' => length($content) );
my $resp = $self->ua->request($req);
if ( $resp->is_success ) {
@ -267,23 +269,47 @@ sub delete {
return ( $resp->is_success ? 1 : 0 );
}
sub searchOn {
my ( $class, $args, $selectField, $value, @fields ) = @_;
return $class->_getAll( "all=1&search=$selectField,$value",
$args, ( @fields ? \@fields : () ) );
}
## @method get_key_from_all_sessions()
# Not documented.
sub get_key_from_all_sessions() {
my ( $class, $args, $data ) = @_;
my $res = $class->_getAll( 'all=1', $args, $data );
return unless $res;
if ( ref($data) eq 'CODE' ) {
my $r;
foreach my $k ( keys %$res ) {
my $tmp = &$data( $res->{$k}, $k );
$r->{$k} = $tmp if ( defined($tmp) );
}
$res = $r;
}
return $res;
}
sub _getAll {
my ( $class, $query, $args, $data ) = @_;
my $self = bless {}, $class;
foreach (qw(baseUrl user password realm lwpOpts lwpSslOpts kind)) {
$self->{$_} = $args->{$_};
}
$self->{data} = { data => ( ref($data) eq 'CODE' ? undef : $data ) };
die('baseUrl is required') unless ( $self->{baseUrl} );
my $req = HTTP::Request->new( POST => $self->base . '?all=1' );
$self->{data} = { data => ( ref($data) eq 'CODE' ? {} : $data ) };
my $req = HTTP::Request->new( POST => $self->base . "?$query" );
eval {
$self->{data}->{__secret} =
Lemonldap::NG::Handler::Main->tsv->{cipher}->encrypt(time);
};
print STDERR "$@\n" if ($@);
$req->content( to_json( $self->{data} ) );
my $content = to_json( $self->{data} );
$req->content($content);
$req->header( 'Content-Length' => length($content) );
delete $self->{data}->{__secret};
$req->header( 'Content-Type' => 'application/json' );
my $resp = $self->ua->request($req);
@ -294,18 +320,10 @@ sub get_key_from_all_sessions() {
if ($@) {
die "Bad REST response: $@";
}
if ( ref($data) eq 'CODE' ) {
my $r;
foreach my $k ( keys %$res ) {
my $tmp = &$data( $res->{$k}, $k );
$r->{$k} = $tmp if ( defined($tmp) );
}
$res = $r;
}
return $res;
}
else {
print STDERR "REST server returns " . $resp->status_line;
print STDERR "REST server returns " . $resp->status_line . "\n";
return;
}
}

View File

@ -60,7 +60,7 @@ ok( @values == 2, 'Found 2 service header values' )
count(2);
diag 'Waiting';
sleep 2;
sleep 1;
ok(
$res = $client->_get(
@ -82,7 +82,7 @@ ok( @values == 2, 'Found 2 service header values' )
count(2);
diag 'Waiting';
sleep 1;
sleep 2;
ok(
$res = $client->_get(

View File

@ -160,7 +160,7 @@ sub authLogout {
sub deleteSession {
my ( $self, $req ) = @_;
if ( my $id = $req->id || $req->userData->{_session_id} ) {
my $apacheSession = $self->getApacheSession( $req->id );
my $apacheSession = $self->getApacheSession( $id );
unless ($apacheSession) {
$self->logger->debug("Session $id already deleted");
return PE_OK;

View File

@ -6,6 +6,8 @@
# * GET /sessions/<type>/<session-id>/<key> : get a session key value
# * GET /sessions/<type>/<session-id>/[k1,k2] : get some session key value
# * POST /sessions/<type> : create a session
# * POST /sessions/<type>?all=1 : get all sessions (needs a token)
# * POST /sessions/<type>?all=1&search=uid,dwho: search all sessions where uid=dwho (needs a token)
# * PUT /sessions/<type>/<session-id> : update some keys
# * DELETE /sessions/<type>/<session-id> : delete a session
#
@ -219,9 +221,20 @@ sub newSession {
my $data = $infos->{data};
my $opts = $self->conf->{globalStorageOptions} || {};
$opts->{backend} = $self->conf->{globalStorage};
my $sessions =
Lemonldap::NG::Common::Apache::Session->get_key_from_all_sessions(
$opts, $data );
my $sessions;
if ( my $query = $req->param('search') ) {
my ( $field, @values ) = split /,/, $query;
$sessions = Lemonldap::NG::Common::Apache::Session->searchOn(
$opts, $field,
join( ',', @values ),
( $data ? @$data : () )
);
}
else {
$sessions =
Lemonldap::NG::Common::Apache::Session
->get_key_from_all_sessions( $opts, $data );
}
return $self->p->sendJSONresponse( $req, $sessions );
}
my $session = $self->getApacheSession( $mod, $id, $infos, $force );

View File

@ -216,7 +216,7 @@
"serviceProvidedBy":"Ce service est fourni par",
"sessionsDeleted":"Les sessions suivantes ont été fermées",
"sfaManager":"Gestionnaire 2ndFA",
"spoofId":"Identifiant usurpé",
"spoofId":"Identifiant simulé",
"SSOSessionInactive":"Session SSO inactive",
"stayConnected": "Rester connecté sur cet appareil",
"submit":"Envoyer",

View File

@ -179,19 +179,66 @@ ok(
'Search all sessions'
);
my ( $c1, $c2 ) = ( 0, 0 );
if ( ok( ref($res) eq 'HASH', ' Result is an hash' ) ) {
my $tmp = 1;
foreach ( keys %$res ) {
unless ( $res->{$_}->{_session_id}, ' session id exists' ) {
$c1++;
unless ( $res->{$_}->{_session_id} ) {
$tmp = 0;
diag "Bad session:\n" . Dumper( $res->{$_} );
}
}
ok( $c1, " Found $c1 sessions" );
ok( $tmp, ' All sessions are valid' );
count(1);
count(2);
}
count(3);
ok($res=Lemonldap::NG::Common::Apache::Session::REST->get_key_from_all_sessions( {baseUrl => 'http://auth.idp.com/sessions/global/'},sub{return 'a'}),'Search all sessions with a code');
if ( ok( ref($res) eq 'HASH', ' Result is an hash' ) ) {
my $tmp = 1;
my $c = 0;
foreach ( keys %$res ) {
$c++;
unless ( $res->{$_} eq 'a' ) {
$tmp = 0;
diag "Bad session:\n" . Dumper( $res->{$_} );
}
}
ok( $c == $c1, " Found the same count") or explain($c,$c1);
ok( $tmp, ' All sessions are valid' );
count(2);
}
count(2);
ok(
$res = Lemonldap::NG::Common::Apache::Session::REST->searchOn( {
baseUrl => 'http://auth.idp.com/sessions/global/'
},
'uid', 'dwho'
),
'Search dwho sessions'
);
if ( ok( ref($res) eq 'HASH', ' Result is an hash' ) ) {
my $tmp = 1;
foreach ( keys %$res ) {
$c2++;
unless ( $res->{$_}->{_session_id} ) {
$tmp = 0;
diag "Bad session:\n" . Dumper( $res->{$_} );
}
}
ok( $c2, " Found $c2 sessions" );
ok( $tmp, ' All sessions are valid' );
count(2);
}
ok( $c2 < $c1,
'searchOn() count is lower than get_key_from_all_sessions() count' );
count(3);
# Del new session
ok(
$res = $issuer->app->( {