|
|
|
@ -55,47 +55,54 @@ sub init { |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub name { |
|
|
|
|
my ( $self, $req, $type ) = @_; |
|
|
|
|
return $req->sessionInfo->{ ( $type eq 'auth' ? '_auth' : '_userDB' ) } |
|
|
|
|
|| 'Combination'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub extractFormInfo { |
|
|
|
|
my ( $self, $req ) = @_; |
|
|
|
|
|
|
|
|
|
# Get available authentication schemes for this user |
|
|
|
|
$self->getStack($req) or return PE_ERROR; |
|
|
|
|
return $self->try->( 0, 'extractFormInfo', $req ); |
|
|
|
|
$self->getStack( $req, 'extractFormInfo' ) or return PE_ERROR; |
|
|
|
|
return $self->try( 0, 'extractFormInfo', $req ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub getUser { |
|
|
|
|
return $_[0]->try->( 1, 'getUser', $_[1] ); |
|
|
|
|
return $_[0]->try( 1, 'getUser', $_[1] ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub authenticate { |
|
|
|
|
return $_[0]->try->( 0, 'authenticate', $_[1] ); |
|
|
|
|
return $_[0]->try( 0, 'authenticate', $_[1] ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub setAuthSessionInfo { |
|
|
|
|
return $_[0]->try->( 0, 'authenticate', $_[1] ); |
|
|
|
|
return $_[0]->try( 0, 'setAuthSessionInfo', $_[1] ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub setSessionInfo { |
|
|
|
|
return $_[0]->try->( 1, 'authenticate', $_[1] ); |
|
|
|
|
return $_[0]->try( 1, 'setSessionInfo', $_[1] ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub setGroups { |
|
|
|
|
return $_[0]->try->( 1, 'authenticate', $_[1] ); |
|
|
|
|
return $_[0]->try( 1, 'setGroups', $_[1] ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub getDisplayType { |
|
|
|
|
return $_[0]->try->( 0, 'getDisplayType', {} ); |
|
|
|
|
return $_[0]->try( 0, 'getDisplayType', {} ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
# TODO: authLogout |
|
|
|
|
|
|
|
|
|
sub getStack { |
|
|
|
|
my ( $self, $req ) = @_; |
|
|
|
|
my $stack = $req->datas->{multiStack} = $self->stackSub($req); |
|
|
|
|
my ( $self, $req, @steps ) = @_; |
|
|
|
|
return $req->datas->{multiStack} if ( $req->datas->{multiStack} ); |
|
|
|
|
my $stack = $req->datas->{multiStack} = $self->stackSub->($req); |
|
|
|
|
unless ($stack) { |
|
|
|
|
$self->lmLog( 'No authentication scheme for this user', 'error' ); |
|
|
|
|
} |
|
|
|
|
@{ $req->datas->{multiSteps} } = @{ $req->steps }; |
|
|
|
|
@{ $req->datas->{multiSteps} } = ( @steps, @{ $req->steps } ); |
|
|
|
|
$req->datas->{multiTry} = 0; |
|
|
|
|
return $stack; |
|
|
|
|
} |
|
|
|
@ -105,20 +112,26 @@ sub try { |
|
|
|
|
my ( $nb, $stack ) = ( $req->datas->{multiTry}, $req->datas->{multiStack} ); |
|
|
|
|
|
|
|
|
|
# If more than 1 scheme is available |
|
|
|
|
my ( $res, $name ); |
|
|
|
|
if ( $nb < @$stack ) { |
|
|
|
|
|
|
|
|
|
# TODO: change logLevel for userLog() |
|
|
|
|
my $res = $stack->[$nb]->[$type]->$subname($req); |
|
|
|
|
( $res, $name ) = $stack->[$nb]->[$type]->( $subname, $req ); |
|
|
|
|
|
|
|
|
|
# On error, restart authentication with next scheme |
|
|
|
|
if ( $res > PE_OK ) { |
|
|
|
|
$self->lmLog( qq'Scheme "$name" has return $res, trying next', |
|
|
|
|
'info' ); |
|
|
|
|
$req->datas->{multiTry}++; |
|
|
|
|
$req->steps( [ @{ $req->datas->{multiSteps} } ] ); |
|
|
|
|
return PE_OK; |
|
|
|
|
} |
|
|
|
|
return $res; |
|
|
|
|
} |
|
|
|
|
return $stack->[$nb]->[$type]->$subname($req); |
|
|
|
|
else { |
|
|
|
|
( $res, $name ) = $stack->[$nb]->[$type]->$subname($req); |
|
|
|
|
} |
|
|
|
|
$req->sessionInfo->{ [ '_auth', '_userDB' ]->[$type] } = $name; |
|
|
|
|
return $res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
1; |
|
|
|
|