From 5e210651aa78f5747ad27a16cc0a112a76d159fb Mon Sep 17 00:00:00 2001 From: Maxime Besson Date: Wed, 18 May 2022 09:05:26 +0200 Subject: [PATCH] Add CAS server resolution rules (#2753) --- .../lib/Lemonldap/NG/Portal/Auth/CAS.pm | 22 ++++++++++++++----- .../lib/Lemonldap/NG/Portal/Lib/CAS.pm | 13 +++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Auth/CAS.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Auth/CAS.pm index 35bf39478..97e3d6516 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Auth/CAS.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Auth/CAS.pm @@ -133,14 +133,24 @@ sub extractFormInfo { else { - # Server list - my $portalPath = $self->conf->{portal}; - $portalPath =~ s#^https?://[^/]+/?#/#; + # Try to use server resolution ruls + foreach ( keys %{ $self->srvRules } ) { + my $cond = $self->srvRules->{$_} or next; + if ( $cond->( $req, $req->sessionInfo ) ) { + $self->logger->debug( + "CAS Server $_ selected from resolution rule"); + $srv = $_; + last; + } + } - $req->data->{list} = $self->srvList; + unless ($srv) { - $req->data->{login} = 1; - return PE_IDPCHOICE; + # Server list + $req->data->{list} = $self->srvList; + $req->data->{login} = 1; + return PE_IDPCHOICE; + } } } diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/CAS.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/CAS.pm index 0d1e36553..2e587f7e9 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/CAS.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/CAS.pm @@ -26,6 +26,7 @@ has ua => ( has casSrvList => ( is => 'rw', default => sub { {} }, ); has casAppList => ( is => 'rw', default => sub { {} }, ); +has srvRules => ( is => 'rw', default => sub { {} }, ); has spRules => ( is => 'rw', default => sub { {} }, ); has spMacros => ( is => 'rw', default => sub { {} }, ); @@ -41,6 +42,18 @@ sub loadSrv { return 0; } $self->casSrvList( $self->conf->{casSrvMetaDataOptions} ); + + # Set rule + foreach ( keys %{ $self->conf->{casSrvMetaDataOptions} } ) { + my $cond = $self->conf->{casSrvMetaDataOptions}->{$_} + ->{casSrvMetaDataOptionsResolutionRule}; + if ( length $cond ) { + my $rule_sub = $self->p->buildRule( $cond, "CAS server resolution" ); + if ($rule_sub) { + $self->srvRules->{$_} = $rule_sub; + } + } + } return 1; }