N°2311 - Login Page extensibility

This commit is contained in:
Eric
2019-08-29 10:59:12 +02:00
parent 9bd1da95e0
commit b2ab07aa69
35 changed files with 974 additions and 291 deletions

View File

@@ -8,4 +8,6 @@
Dict::Add('EN US', 'English', 'English', array(
'CAS:Error:UserNotAllowed' => 'User not allowed',
'CAS:Login:SignIn' => 'Sign in with CAS',
'CAS:Login:SignInTooltip' => 'Click here to authenticate yourself with the CAS server',
));

View File

@@ -8,4 +8,6 @@
Dict::Add('FR FR', 'French', 'Français', array(
'CAS:Error:UserNotAllowed' => 'Utilisateur non autorisé',
'CAS:Login:SignIn' => 'S\'identifier avec CAS',
'CAS:Login:SignInTooltip' => 'Cliquer ici pour s\'identifier avec le serveur CAS',
));

View File

@@ -11,7 +11,10 @@ use AbstractLoginFSMExtension;
use DBObjectSearch;
use DBObjectSet;
use Dict;
use iLoginDataExtension;
use iLogoutExtension;
use LoginBlockData;
use LoginTwigData;
use LoginWebPage;
use MetaModel;
use phpCAS;
@@ -23,7 +26,7 @@ use utils;
/**
* Class CASLoginExtension
*/
class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExtension
class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExtension, iLoginDataExtension
{
/**
* Return the list of supported login modes for this plugin
@@ -45,24 +48,29 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
{
if (!isset($_SESSION['login_mode']) || ($_SESSION['login_mode'] == 'cas'))
{
$_SESSION['login_mode'] = 'cas';
static::InitCASClient();
if (phpCAS::isAuthenticated())
{
$_SESSION['login_mode'] = 'cas';
$_SESSION['auth_user'] = phpCAS::getUser();
unset($_SESSION['login_will_redirect']);
}
else
{
if (!isset($_SESSION['cas_count']))
if ($_SESSION['login_mode'] == 'cas')
{
$_SESSION['cas_count'] = 1;
}
else
{
unset($_SESSION['cas_count']);
$iErrorCode = LoginWebPage::EXIT_CODE_MISSINGLOGIN;
return LoginWebPage::LOGIN_FSM_RETURN_ERROR;
if (!isset($_SESSION['login_will_redirect']))
{
$_SESSION['login_will_redirect'] = true;
}
else
{
unset($_SESSION['login_will_redirect']);
$iErrorCode = LoginWebPage::EXIT_CODE_MISSINGLOGIN;
return LoginWebPage::LOGIN_FSM_RETURN_ERROR;
}
}
$_SESSION['login_mode'] = 'cas';
phpCAS::forceAuthentication(); // Redirect to CAS and exit
}
}
@@ -110,8 +118,8 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
{
$oLoginWebPage = new LoginWebPage();
$oLoginWebPage->DisplayLogoutPage(false, Dict::S('CAS:Error:UserNotAllowed'));
exit();
}
exit();
}
return LoginWebPage::LOGIN_FSM_RETURN_CONTINUE;
}
@@ -169,18 +177,6 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
}
}
public function GetSocialButtons()
{
return array(
array(
'login_mode' => 'cas',
'label' => 'Sign in with CAS',
'tooltip' => 'Click here to authenticate yourself with the CAS server',
'twig' => 'cas_button.twig',
),
);
}
private function DoUserProvisioning($sLogin)
{
$bCASUserSynchro = Config::Get('cas_user_synchro');
@@ -200,6 +196,26 @@ class CASLoginExtension extends AbstractLoginFSMExtension implements iLogoutExte
}
CASUserProvisioning::CreateUser($sLogin, '', 'external');
}
/**
* @return LoginTwigData
*/
public function GetLoginData()
{
$sPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/authent-cas/view';
$oLoginData = new LoginTwigData(array(), $sPath);
$aData = array(
'sLoginMode' => 'cas',
'sLabel' => Dict::S('CAS:Login:SignIn'),
'sTooltip' => Dict::S('CAS:Login:SignInTooltip'),
);
$oBlockData = new LoginBlockData('cas_sso_button.html.twig', $aData);
$oLoginData->AddBlockData('login_sso_buttons', $oBlockData);
return $oLoginData;
}
}
/**

View File

@@ -0,0 +1,33 @@
{# @copyright Copyright (C) 2010-2019 Combodo SARL #}
{# @license http://opensource.org/licenses/AGPL-3.0 #}
<tr>
<td style="text-align:center" colspan="2">
<div class="sso-button">
<div style="width:19em; cursor: pointer; margin-left: auto; margin-right: auto; padding: 0.5em; background-color: #eee; border-radius: 0.25em;" title="{{ aData.sTooltip }}" onclick="$('#login_mode').val('{{ aData.sLoginMode }}'); $('#login_form').submit(); return false;">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 336.82 167.83" class="logo" style="height: 1em; vertical-align: middle; margin-right: 1em;">
<defs>
<style>
.cls-1 {
fill: #024d71;
}
.cls-2 {
fill: #74c163;
}
</style>
</defs>
<title>{{ aData.sTooltip }}</title>
<g id="Layer_2" data-name="Layer 2">
<path class="cls-1" d="M217.72,469.85c-17.68,1.31-38.31,1-54.18-7.87-12.59-7-23.71-18.52-28.72-32.14a82,82,0,0,1-4.49-27.49c0-36.26,16.11-64.23,40.29-80.34,16.59-11.38,36-16.83,58.54-16.83,17.3,0,30.34,4,35.08,6.64l-9.48,27.73c-4.5-2.38-15.17-5.22-28.92-5.22s-26.78,4.27-36.5,12.33c-13.27,11.13-22,29.39-22,51.66,0,25.6,14.46,42.67,42.43,42.67a161.48,161.48,0,0,0,22.38-1.19Z" transform="translate(-130.33 -305.18)"></path>
<path class="cls-1" d="M322.77,398.75l-2.72-30.4c-.71-8.76-1.42-21.56-2.14-31.28h-.71c-4,9.72-8.53,22-12.8,31.28l-13.69,30.08-13.53,33.43-17.33,38.41h-36.5l78-159.75h43.85l18.49,159.75H327.87l-3.05-38.12Z" transform="translate(-130.33 -305.18)"></path>
<path class="cls-1" d="M364.31,438.85c12.27,3.81,21.29,5.19,36.22,5.19,13,0,20.87-6.71,20.87-19,0-9.24-6.87-14.93-21.57-22.75-16.82-9-32.94-21.8-32.94-42.42,0-32.24,28-51.91,62.81-51.91,19.19,0,30.57,4.27,37.44,7.82l-10.66,28.44a62.94,62.94,0,0,0-29.63-6.87c-15.88,0-24.17,7.82-24.17,16.59,0,9.48,9.72,15.17,23.23,22.75,19.43,10.19,31.52,23.23,31.52,42.43,0,35.55-29.44,55.72-64.71,53.8a231.52,231.52,0,0,1-24.78-2.61Z" transform="translate(-130.33 -305.18)"></path>
</g>
<g id="swoosh">
<path class="cls-2" d="M257.45,432.24a41.64,41.64,0,0,1,13.11-.32,39.17,39.17,0,0,1,16.89,6.2l0,0c10.55-15,29.11-25,50.24-25,19.75,0,37.34,8.85,48.16,22.28l1-.77c-12.85-17.31-37.44-29-65.67-29-26.92,0-50.54,10.65-63.81,26.65Z" transform="translate(-130.33 -305.18)"></path>
</g>
</svg>
{{ aData.sLabel }}
</div>
</div>
</td>
</tr>