2010-09-28 12:30:57 +02:00
|
|
|
## @file
|
|
|
|
# Display functions for LemonLDAP::NG Portal
|
|
|
|
|
|
|
|
## @class
|
|
|
|
# Display functions for LemonLDAP::NG Portal
|
|
|
|
package Lemonldap::NG::Portal::Display;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
use Lemonldap::NG::Portal::Simple;
|
2010-10-04 16:50:33 +02:00
|
|
|
use utf8;
|
2010-09-28 12:30:57 +02:00
|
|
|
|
2011-11-07 15:54:22 +01:00
|
|
|
our $VERSION = '1.2.0';
|
2010-09-28 12:30:57 +02:00
|
|
|
|
|
|
|
## @method array display()
|
|
|
|
# Call portal process and set template parameters
|
|
|
|
# @return template name and template parameters
|
|
|
|
sub display {
|
|
|
|
my $self = shift;
|
|
|
|
|
|
|
|
my $skin = $self->{portalSkin};
|
2011-02-04 13:50:24 +01:00
|
|
|
my $skin_dir = $self->getApacheHtdocsPath() . "/skins";
|
2010-09-28 12:30:57 +02:00
|
|
|
my ( $skinfile, %templateParams );
|
2010-09-28 16:40:50 +02:00
|
|
|
my $http_error = $self->param('lmError');
|
2010-09-28 12:30:57 +02:00
|
|
|
|
2010-09-28 16:40:50 +02:00
|
|
|
# 0. Display error page
|
|
|
|
if ($http_error) {
|
|
|
|
|
|
|
|
$skinfile = 'error.tpl';
|
|
|
|
|
|
|
|
# Error code
|
|
|
|
my $error500 = 1 if ( $http_error eq "500" );
|
|
|
|
my $error403 = 1 if ( $http_error eq "403" );
|
|
|
|
|
|
|
|
# Check URL
|
|
|
|
$self->_sub('controlUrlOrigin');
|
2010-09-28 12:30:57 +02:00
|
|
|
|
2010-09-28 16:40:50 +02:00
|
|
|
%templateParams = (
|
|
|
|
PORTAL_URL => $self->{portal},
|
|
|
|
LOGOUT_URL => $self->{portal} . "?logout=1",
|
2010-10-22 12:03:42 +02:00
|
|
|
ANTIFRAME => $self->{portalAntiFrame},
|
2010-09-28 16:40:50 +02:00
|
|
|
URL => $self->{urldc},
|
|
|
|
SKIN => $self->{portalSkin},
|
|
|
|
ERROR403 => $error403,
|
|
|
|
ERROR500 => $error500,
|
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
# 1. Good authentication
|
|
|
|
elsif ( $self->process() ) {
|
2010-09-28 12:30:57 +02:00
|
|
|
|
|
|
|
# 1.1 Image mode
|
|
|
|
if ( $self->{error} == PE_IMG_OK || $self->{error} == PE_IMG_NOK ) {
|
|
|
|
$skinfile = "$skin_dir/common/"
|
|
|
|
. (
|
|
|
|
$self->{error} == PE_IMG_OK
|
|
|
|
? 'ok.png'
|
|
|
|
: 'warning.png'
|
|
|
|
);
|
|
|
|
$self->printImage( $skinfile, 'image/png' );
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
# 1.2 Case : there is a message to display
|
|
|
|
elsif ( my $info = $self->info() ) {
|
|
|
|
$skinfile = 'info.tpl';
|
|
|
|
%templateParams = (
|
|
|
|
AUTH_ERROR_TYPE => $self->error_type,
|
2010-10-22 12:03:42 +02:00
|
|
|
ANTIFRAME => $self->{portalAntiFrame},
|
2010-09-28 12:30:57 +02:00
|
|
|
MSG => $info,
|
|
|
|
SKIN => $skin,
|
|
|
|
URL => $self->{urldc},
|
|
|
|
HIDDEN_INPUTS => $self->buildHiddenForm(),
|
|
|
|
ACTIVE_TIMER => $self->{activeTimer},
|
|
|
|
FORM_METHOD => $self->{infoFormMethod},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2012-02-01 15:18:41 +01:00
|
|
|
# 1.3 Redirection
|
|
|
|
if ( $self->{error} == PE_REDIRECT ) {
|
|
|
|
$skinfile = "../common/redirect.tpl";
|
|
|
|
%templateParams = (
|
|
|
|
URL => $self->{urldc},
|
|
|
|
HIDDEN_INPUTS => $self->buildHiddenForm(),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# 1.4 Case : display menu
|
2010-09-28 12:30:57 +02:00
|
|
|
else {
|
|
|
|
|
|
|
|
# Initialize menu elements
|
|
|
|
$self->_sub('menuInit');
|
|
|
|
|
|
|
|
$skinfile = 'menu.tpl';
|
2010-10-04 16:50:33 +02:00
|
|
|
my $auth_user = $self->{sessionInfo}->{ $self->{portalUserAttr} };
|
|
|
|
utf8::decode($auth_user);
|
2010-09-28 12:30:57 +02:00
|
|
|
|
|
|
|
%templateParams = (
|
2010-10-04 16:50:33 +02:00
|
|
|
AUTH_USER => $auth_user,
|
2010-09-28 12:30:57 +02:00
|
|
|
AUTOCOMPLETE => $self->{portalAutocomplete},
|
2011-01-04 15:35:59 +01:00
|
|
|
NEWWINDOW => $self->{portalOpenLinkInNewWindow},
|
2010-10-22 12:03:42 +02:00
|
|
|
ANTIFRAME => $self->{portalAntiFrame},
|
2010-09-28 12:30:57 +02:00
|
|
|
SKIN => $skin,
|
|
|
|
AUTH_ERROR => $self->error( undef, $self->{menuError} ),
|
|
|
|
AUTH_ERROR_TYPE => $self->error_type( $self->{menuError} ),
|
|
|
|
DISPLAY_TAB => $self->{menuDisplayTab},
|
|
|
|
LOGOUT_URL => "$ENV{SCRIPT_NAME}?logout=1",
|
|
|
|
REQUIRE_OLDPASSWORD => $self->{portalRequireOldPassword},
|
2011-05-20 11:45:18 +02:00
|
|
|
HIDE_OLDPASSWORD =>
|
|
|
|
0, # Do not hide old password if it is required
|
|
|
|
DISPLAY_MODULES => $self->{menuDisplayModules},
|
2010-09-28 12:30:57 +02:00
|
|
|
APPSLIST_MENU => $self->{menuAppslistMenu}, # For old templates
|
|
|
|
APPSLIST_DESC => $self->{menuAppslistDesc}, # For old templates
|
2010-10-25 08:25:20 +02:00
|
|
|
SCRIPT_NAME => $ENV{SCRIPT_NAME},
|
2010-09-28 12:30:57 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# 2. Authentication not complete
|
|
|
|
|
|
|
|
# 2.1 A notification has to be done (session is created but hidden and unusable
|
|
|
|
# until the user has accept the message)
|
|
|
|
elsif ( my $notif = $self->notification ) {
|
|
|
|
$skinfile = 'notification.tpl';
|
|
|
|
%templateParams = (
|
|
|
|
AUTH_ERROR_TYPE => $self->error_type,
|
2010-10-22 12:03:42 +02:00
|
|
|
ANTIFRAME => $self->{portalAntiFrame},
|
2010-09-28 12:30:57 +02:00
|
|
|
NOTIFICATION => $notif,
|
|
|
|
SKIN => $skin,
|
|
|
|
HIDDEN_INPUTS => $self->buildHiddenForm(),
|
|
|
|
AUTH_URL => $self->get_url,
|
2011-06-09 23:08:43 +02:00
|
|
|
CHOICE_PARAM => $self->{authChoiceParam},
|
|
|
|
CHOICE_VALUE => $self->{_authChoice},
|
2010-09-28 12:30:57 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# 2.2 An authentication (or userDB) module needs to ask a question
|
|
|
|
# before processing to the request
|
|
|
|
elsif ( $self->{error} == PE_CONFIRM ) {
|
|
|
|
$skinfile = 'confirm.tpl';
|
|
|
|
%templateParams = (
|
|
|
|
AUTH_ERROR => $self->error,
|
|
|
|
AUTH_ERROR_TYPE => $self->error_type,
|
|
|
|
AUTH_URL => $self->get_url,
|
2010-10-22 12:03:42 +02:00
|
|
|
ANTIFRAME => $self->{portalAntiFrame},
|
2010-09-28 12:30:57 +02:00
|
|
|
MSG => $self->info(),
|
|
|
|
SKIN => $skin,
|
|
|
|
HIDDEN_INPUTS => $self->buildHiddenForm(),
|
|
|
|
ACTIVE_TIMER => $self->{activeTimer},
|
|
|
|
FORM_METHOD => $self->{confirmFormMethod},
|
|
|
|
CHOICE_PARAM => $self->{authChoiceParam},
|
|
|
|
CHOICE_VALUE => $self->{_authChoice},
|
|
|
|
CONFIRMKEY => $self->stamp(),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# 2.3 There is a message to display
|
|
|
|
elsif ( my $info = $self->info() ) {
|
|
|
|
$skinfile = 'info.tpl';
|
|
|
|
%templateParams = (
|
|
|
|
AUTH_ERROR => $self->error,
|
|
|
|
AUTH_ERROR_TYPE => $self->error_type,
|
2010-10-22 12:03:42 +02:00
|
|
|
ANTIFRAME => $self->{portalAntiFrame},
|
2010-09-28 12:30:57 +02:00
|
|
|
MSG => $info,
|
|
|
|
SKIN => $skin,
|
|
|
|
URL => $self->{urldc},
|
|
|
|
HIDDEN_INPUTS => $self->buildHiddenForm(),
|
|
|
|
ACTIVE_TIMER => $self->{activeTimer},
|
|
|
|
FORM_METHOD => $self->{infoFormMethod},
|
|
|
|
CHOICE_PARAM => $self->{authChoiceParam},
|
|
|
|
CHOICE_VALUE => $self->{_authChoice},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# 2.4 OpenID menu page
|
|
|
|
elsif ($self->{error} == PE_OPENID_EMPTY
|
|
|
|
or $self->{error} == PE_OPENID_BADID )
|
|
|
|
{
|
|
|
|
$skinfile = 'openid.tpl';
|
|
|
|
my $p = $self->{portal} . $self->{issuerDBOpenIDPath};
|
|
|
|
$p =~ s#(?<!:)/\^?/#/#g;
|
|
|
|
%templateParams = (
|
|
|
|
AUTH_ERROR => $self->error,
|
|
|
|
AUTH_ERROR_TYPE => $self->error_type,
|
2010-10-22 12:03:42 +02:00
|
|
|
ANTIFRAME => $self->{portalAntiFrame},
|
2010-09-28 12:30:57 +02:00
|
|
|
SKIN => $skin,
|
|
|
|
PROVIDERURI => $p,
|
|
|
|
ID => $self->{_openidPortal}
|
|
|
|
. $self->{sessionInfo}
|
2010-10-04 11:55:50 +02:00
|
|
|
->{ $self->{openIdAttr} || $self->{whatToTrace} },
|
2010-10-01 09:48:50 +02:00
|
|
|
PORTAL_URL => $self->{portal},
|
|
|
|
MSG => $self->info(),
|
2010-09-28 12:30:57 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# 2.5 Authentication has been refused OR this is the first access
|
|
|
|
else {
|
|
|
|
$skinfile = 'login.tpl';
|
|
|
|
%templateParams = (
|
|
|
|
AUTH_ERROR => $self->error,
|
|
|
|
AUTH_ERROR_TYPE => $self->error_type,
|
|
|
|
AUTH_URL => $self->get_url,
|
2010-10-22 12:03:42 +02:00
|
|
|
ANTIFRAME => $self->{portalAntiFrame},
|
2010-09-28 12:30:57 +02:00
|
|
|
LOGIN => $self->get_user,
|
|
|
|
AUTOCOMPLETE => $self->{portalAutocomplete},
|
|
|
|
SKIN => $skin,
|
|
|
|
DISPLAY_RESETPASSWORD => $self->{portalDisplayResetPassword},
|
|
|
|
DISPLAY_FORM => 1,
|
|
|
|
MAIL_URL => $self->{mailUrl},
|
|
|
|
HIDDEN_INPUTS => $self->buildHiddenForm(),
|
|
|
|
LOGIN_INFO => $self->loginInfo(),
|
|
|
|
);
|
|
|
|
|
|
|
|
# Authentication loop
|
|
|
|
if ( $self->{authLoop} ) {
|
|
|
|
%templateParams = (
|
|
|
|
%templateParams,
|
2011-04-18 11:16:17 +02:00
|
|
|
AUTH_LOOP => $self->{authLoop},
|
|
|
|
CHOICE_PARAM => $self->{authChoiceParam},
|
|
|
|
CHOICE_VALUE => $self->{_authChoice},
|
|
|
|
DISPLAY_FORM => 0,
|
|
|
|
DISPLAY_OPENID_FORM => 0,
|
|
|
|
DISPLAY_YUBIKEY_FORM => 0,
|
2010-09-28 12:30:57 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# Adapt template if password policy error
|
|
|
|
if (
|
2011-06-21 12:11:02 +02:00
|
|
|
|
|
|
|
$self->{error} == PE_PP_CHANGE_AFTER_RESET
|
|
|
|
or $self->{error} == PE_PP_MUST_SUPPLY_OLD_PASSWORD
|
|
|
|
or $self->{error} == PE_PP_INSUFFICIENT_PASSWORD_QUALITY
|
|
|
|
or $self->{error} == PE_PP_PASSWORD_TOO_SHORT
|
|
|
|
or $self->{error} == PE_PP_PASSWORD_TOO_YOUNG
|
|
|
|
or $self->{error} == PE_PP_PASSWORD_IN_HISTORY
|
|
|
|
or $self->{error} == PE_PASSWORD_MISMATCH
|
|
|
|
or $self->{error} == PE_BADOLDPASSWORD
|
2011-11-07 15:54:22 +01:00
|
|
|
or $self->{error} == PE_PASSWORDFORMEMPTY
|
2010-09-28 12:30:57 +02:00
|
|
|
)
|
|
|
|
{
|
|
|
|
%templateParams = (
|
|
|
|
%templateParams,
|
2011-05-20 11:45:18 +02:00
|
|
|
REQUIRE_OLDPASSWORD =>
|
|
|
|
1, # Old password is required to check user credentials
|
2010-09-28 12:30:57 +02:00
|
|
|
DISPLAY_PASSWORD => 1,
|
|
|
|
DISPLAY_RESETPASSWORD => 0,
|
2010-11-27 18:23:11 +01:00
|
|
|
DISPLAY_FORM => 0,
|
|
|
|
AUTH_LOOP => [],
|
2011-01-25 17:41:31 +01:00
|
|
|
CHOICE_PARAM => $self->{authChoiceParam},
|
|
|
|
CHOICE_VALUE => $self->{_authChoice},
|
2011-05-20 11:45:18 +02:00
|
|
|
OLDPASSWORD =>
|
|
|
|
$self->checkXSSAttack( 'oldpassword', $self->{oldpassword} )
|
|
|
|
? ""
|
|
|
|
: $self->{oldpassword},
|
|
|
|
HIDE_OLDPASSWORD => $self->{hideOldPassword},
|
2010-09-28 12:30:57 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# Adapt template for OpenID
|
|
|
|
if ( $self->get_module("auth") =~ /openid/i and !$self->{authLoop} ) {
|
|
|
|
%templateParams = (
|
|
|
|
%templateParams,
|
|
|
|
DISPLAY_RESETPASSWORD => 0,
|
|
|
|
DISPLAY_FORM => 0,
|
|
|
|
DISPLAY_OPENID_FORM => 1,
|
2011-04-18 11:16:17 +02:00
|
|
|
DISPLAY_YUBIKEY_FORM => 0,
|
|
|
|
AUTH_LOOP => [],
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# Adapt template for Yubikey
|
|
|
|
if ( $self->get_module("auth") =~ /yubikey/i and !$self->{authLoop} ) {
|
|
|
|
%templateParams = (
|
|
|
|
%templateParams,
|
|
|
|
DISPLAY_RESETPASSWORD => 0,
|
|
|
|
DISPLAY_FORM => 0,
|
|
|
|
DISPLAY_OPENID_FORM => 0,
|
|
|
|
DISPLAY_YUBIKEY_FORM => 1,
|
2010-11-27 18:23:11 +01:00
|
|
|
AUTH_LOOP => [],
|
2010-09-28 12:30:57 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
# Adapt template if external authentication error
|
2012-01-12 18:30:06 +01:00
|
|
|
# or session not granted, or logout is OK
|
2010-09-28 12:30:57 +02:00
|
|
|
if ( $self->{error} == PE_BADCERTIFICATE
|
|
|
|
or $self->{error} == PE_CERTIFICATEREQUIRED
|
|
|
|
or $self->{error} == PE_ERROR
|
2011-11-15 10:11:53 +01:00
|
|
|
or $self->{error} == PE_BADURL
|
2010-09-28 12:30:57 +02:00
|
|
|
or $self->{error} == PE_SAML_ERROR
|
|
|
|
or $self->{error} == PE_SAML_LOAD_SERVICE_ERROR
|
|
|
|
or $self->{error} == PE_SAML_LOAD_IDP_ERROR
|
|
|
|
or $self->{error} == PE_SAML_SSO_ERROR
|
|
|
|
or $self->{error} == PE_SAML_UNKNOWN_ENTITY
|
|
|
|
or $self->{error} == PE_SAML_DESTINATION_ERROR
|
|
|
|
or $self->{error} == PE_SAML_CONDITIONS_ERROR
|
|
|
|
or $self->{error} == PE_SAML_IDPSSOINITIATED_NOTALLOWED
|
|
|
|
or $self->{error} == PE_SAML_SLO_ERROR
|
|
|
|
or $self->{error} == PE_SAML_SIGNATURE_ERROR
|
|
|
|
or $self->{error} == PE_SAML_ART_ERROR
|
|
|
|
or $self->{error} == PE_SAML_SESSION_ERROR
|
|
|
|
or $self->{error} == PE_SAML_LOAD_SP_ERROR
|
|
|
|
or $self->{error} == PE_SAML_ATTR_ERROR
|
2010-10-22 11:03:10 +02:00
|
|
|
or $self->{error} == PE_OPENID_EMPTY
|
|
|
|
or $self->{error} == PE_OPENID_BADID
|
|
|
|
or $self->{error} == PE_MISSINGREQATTR
|
|
|
|
or $self->{error} == PE_BADPARTNER
|
2011-09-15 11:42:25 +02:00
|
|
|
or $self->{error} == PE_CAS_SERVICE_NOT_ALLOWED
|
2012-01-12 18:30:06 +01:00
|
|
|
or $self->{error} == PE_SESSIONNOTGRANTED
|
2010-09-28 12:30:57 +02:00
|
|
|
or $self->{error} == PE_LOGOUT_OK )
|
|
|
|
{
|
|
|
|
%templateParams = (
|
|
|
|
%templateParams,
|
|
|
|
DISPLAY_RESETPASSWORD => 0,
|
|
|
|
DISPLAY_FORM => 0,
|
|
|
|
DISPLAY_OPENID_FORM => 0,
|
2011-04-18 11:16:17 +02:00
|
|
|
DISPLAY_YUBIKEY_FORM => 0,
|
2010-09-28 12:30:57 +02:00
|
|
|
AUTH_LOOP => [],
|
|
|
|
PORTAL_URL => $self->{portal},
|
|
|
|
MSG => $self->info(),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ( "$skin_dir/$skin/$skinfile", %templateParams );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|
|
|
|
|
|
|
|
__END__
|
|
|
|
|
|
|
|
=head1 NAME
|
|
|
|
|
|
|
|
=encoding utf8
|
|
|
|
|
|
|
|
Lemonldap::NG::Portal::Display - Display functions for LemonLDAP::NG Portal
|
|
|
|
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
|
|
|
|
use Lemonldap::NG::Portal::SharedConf;
|
|
|
|
use HTML::Template;
|
|
|
|
|
|
|
|
my $portal = Lemonldap::NG::Portal::SharedConf->new();
|
|
|
|
|
|
|
|
my($templateName,%templateParams) = $portal->display();
|
|
|
|
|
|
|
|
my $template = HTML::Template->new(
|
|
|
|
filename => $templateName,
|
|
|
|
die_on_bad_params => 0,
|
|
|
|
cache => 0,
|
|
|
|
global_vars => 1,
|
|
|
|
filter => sub { $portal->translate_template(@_) }
|
|
|
|
);
|
|
|
|
while ( my ( $k, $v ) = each %templateParams ) { $template->param( $k, $v ); }
|
|
|
|
|
|
|
|
print $portal->header('text/html; charset=utf-8');
|
|
|
|
print $template->output;
|
|
|
|
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
|
|
|
|
This module is used to build all templates parameters to display
|
|
|
|
LemonLDAP::NG Portal
|
|
|
|
|
|
|
|
=head1 SEE ALSO
|
|
|
|
|
|
|
|
L<Lemonldap::NG::Portal>
|
|
|
|
|
|
|
|
=head1 AUTHOR
|
|
|
|
|
|
|
|
Clement Oudot, E<lt>clement@oodo.netE<gt>
|
|
|
|
|
|
|
|
=head1 BUG REPORT
|
|
|
|
|
|
|
|
Use OW2 system to report bug or ask for features:
|
|
|
|
L<http://jira.ow2.org>
|
|
|
|
|
|
|
|
=head1 DOWNLOAD
|
|
|
|
|
|
|
|
Lemonldap::NG is available at
|
|
|
|
L<http://forge.objectweb.org/project/showfiles.php?group_id=274>
|
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE
|
|
|
|
|
2010-10-23 10:35:38 +02:00
|
|
|
Copyright (C) 2005, 2010 by Xavier Guimard E<lt>x.guimard@free.frE<gt>,
|
2010-09-28 12:30:57 +02:00
|
|
|
Clement Oudot E<lt>clement@oodo.netE<gt>
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or modify
|
2010-10-24 09:25:44 +02:00
|
|
|
it under the same terms as Perl itself, either Perl version 5.10.0 or,
|
2010-09-28 12:30:57 +02:00
|
|
|
at your option, any later version of Perl 5 you may have available.
|
|
|
|
|
|
|
|
=cut
|
|
|
|
|