lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Auth/SSL.pm

111 lines
3.0 KiB
Perl
Raw Normal View History

2016-08-05 13:56:16 +02:00
package Lemonldap::NG::Portal::Auth::SSL;
use strict;
use Mouse;
2017-04-11 21:19:59 +02:00
use Lemonldap::NG::Portal::Main::Constants qw(
2019-02-05 23:12:17 +01:00
PE_CERTIFICATEREQUIRED
2021-02-01 22:30:37 +01:00
PE_BADCERTIFICATE
2019-02-05 23:12:17 +01:00
PE_FIRSTACCESS
PE_OK
2017-04-11 21:19:59 +02:00
);
2016-08-05 13:56:16 +02:00
2021-02-01 22:30:37 +01:00
our $VERSION = '2.0.12';
2016-08-05 13:56:16 +02:00
2018-02-19 22:11:43 +01:00
extends 'Lemonldap::NG::Portal::Main::Auth';
2016-08-05 13:56:16 +02:00
# INITIALIZATION
2019-02-02 17:34:44 +01:00
has AjaxInitScript => ( is => 'rw', default => '' );
has Name => ( is => 'ro', default => 'SSL' );
2016-08-05 13:56:16 +02:00
sub init {
2019-02-02 17:34:44 +01:00
my ($self) = @_;
$self->AjaxInitScript( '<script type="application/init">{"sslHost":"'
2019-02-05 23:12:17 +01:00
. $self->conf->{sslHost}
. '"}</script>' )
if $self->conf->{sslByAjax};
2017-01-30 22:00:54 +01:00
return 1;
2016-08-05 13:56:16 +02:00
}
# Read username in SSL environment variables, or return an error
# @return Lemonldap::NG::Portal constant
sub extractFormInfo {
my ( $self, $req ) = @_;
2020-03-26 20:21:09 +01:00
# If this is the ajax query, allow response to contain HTML code
# to update the portal error message
if ( $req->wantJSON ) {
$req->wantErrorRender(1);
}
my $field = $self->conf->{SSLVar};
2020-01-31 17:43:49 +01:00
if ( $req->env->{SSL_CLIENT_I_DN} ) {
$self->logger->debug(
2020-01-31 17:48:21 +01:00
'Received SSL issuer ' . $req->env->{SSL_CLIENT_I_DN} );
2020-01-31 17:43:49 +01:00
if ( my $tmp =
$self->conf->{SSLVarIf}->{ $req->env->{SSL_CLIENT_I_DN} } )
{
$field = $tmp;
}
2017-02-24 07:29:50 +01:00
}
$req->env->{$field}
? $self->logger->debug("Using SSL environment variable $field")
: $self->logger->notice(
"No name found in certificate, check your configuration");
if ( $req->env->{$field} and $req->user( $req->env->{$field} ) ) {
2019-02-05 23:12:17 +01:00
$self->userLogger->notice( "GoodSSL authentication for " . $req->user );
2017-04-11 21:19:59 +02:00
return PE_OK;
}
elsif ( $req->env->{SSL_CLIENT_S_DN} ) {
2017-02-24 07:29:50 +01:00
$self->userLogger->warn("$field was not found in user certificate");
2016-08-05 13:56:16 +02:00
return PE_BADCERTIFICATE;
}
2017-04-11 21:19:59 +02:00
elsif ( $self->conf->{sslByAjax} and not $req->param('nossl') ) {
2020-03-26 20:21:09 +01:00
# If this is the AJAX query
if ( $req->wantJSON ) {
return PE_CERTIFICATEREQUIRED;
}
$self->logger->debug( 'Append ' . $self->{Name} . ' init/script' );
$req->data->{customScript} .= $self->{AjaxInitScript};
2019-02-02 17:34:44 +01:00
$self->logger->debug(
"Send init/script -> " . $req->data->{customScript} );
$req->data->{waitingMessage} = 1;
2017-04-11 21:19:59 +02:00
return PE_FIRSTACCESS;
}
2016-08-05 13:56:16 +02:00
else {
if ( $self->conf->{sslByAjax} ) {
2019-02-05 23:12:17 +01:00
$self->logger->debug( 'Append ' . $self->{Name} . ' init/script' );
$req->data->{customScript} .= $self->{AjaxInitScript};
$self->logger->debug(
"Send init/script -> " . $req->data->{customScript} );
2020-03-26 20:21:09 +01:00
return PE_BADCERTIFICATE;
}
2017-04-11 21:19:59 +02:00
$self->userLogger->warn('No certificate found');
2016-08-05 13:56:16 +02:00
return PE_CERTIFICATEREQUIRED;
}
}
sub authenticate {
2021-02-01 22:30:37 +01:00
return PE_OK;
2016-08-05 13:56:16 +02:00
}
2016-12-01 23:25:05 +01:00
sub setAuthSessionInfo {
my ( $self, $req ) = @_;
2019-04-05 22:58:48 +02:00
$req->sessionInfo->{authenticationLevel} = $self->conf->{SSLAuthnLevel};
2021-02-01 22:30:37 +01:00
return PE_OK;
2016-12-01 23:25:05 +01:00
}
2016-08-05 13:56:16 +02:00
sub getDisplayType {
2018-11-26 14:40:21 +01:00
my ($self) = @_;
return ( $self->{conf}->{sslByAjax} ? "sslform" : "logo" );
2016-08-05 13:56:16 +02:00
}
sub authLogout {
2021-02-01 22:30:37 +01:00
return PE_OK;
}
2016-08-05 13:56:16 +02:00
1;