Logout from spip when where are not connected to the idp

Fixes #3237
This commit is contained in:
Jérôme Schneider 2013-07-17 16:10:20 +02:00
parent 539bffc866
commit c7d7a3a621
4 changed files with 84 additions and 37 deletions

View File

@ -13,6 +13,7 @@
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/cookie');
include_spip('inc/my_auth');
/* Loading simplesamlphp */
include_spip('inc/simplesamlphp/lib/_autoload');
@ -20,44 +21,15 @@ include_spip('inc/simplesamlphp/lib/_autoload');
// http://doc.spip.org/@action_logout_dist
function action_logout_dist()
{
global $auteur_session, $ignore_auth_http;
$simplesaml = new SimpleSAML_Auth_Simple('default-sp');
$logout =_request('logout');
$url = _request('url');
spip_log("logout $logout $url" . $auteur_session['id_auteur']);
// cas particulier, logout dans l'espace public
if ($logout == 'public' AND !$url)
$url = url_de_base();
// Spip logout
my_spip_logout();
// seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
if (is_numeric($auteur_session['id_auteur'])) {
spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 15 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
// le logout explicite vaut destruction de toutes les sessions
if ($_COOKIE['spip_session']) {
$session = charger_fonction('session', 'inc');
$session($auteur_session['id_auteur']);
preg_match(',^[^/]*//[^/]*(.*)/$,',
url_de_base(),
$r);
spip_setcookie('spip_session', '', -1,$r[1]);
spip_setcookie('spip_session', '', -1);
}
if ($_SERVER['PHP_AUTH_USER'] AND !$ignore_auth_http) {
include_spip('inc/actions');
if (verifier_php_auth()) {
ask_php_auth(_T('login_deconnexion_ok'),
_T('login_verifiez_navigateur'),
_T('login_retour_public'),
"redirect=". _DIR_RESTREINT_ABS,
_T('login_test_navigateur'),
true);
exit;
}
}
}
// Logout SAML
spip_log("[auth_saml] logout " . url_de_base());
$simplesaml->logout(url_de_base());
if ($simplesaml->isAuthenticated())
{
spip_log("[auth_saml] logout " . url_de_base());
$simplesaml->logout(url_de_base());
}
}
?>

49
inc/my_auth.php Normal file
View File

@ -0,0 +1,49 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/cookie');
function my_spip_logout()
{
global $auteur_session;
spip_log("[auth_saml] logout from spip");
$logout =_request('logout');
$url = _request('url');
spip_log("logout $logout $url" . $auteur_session['id_auteur']);
// cas particulier, logout dans l'espace public
if ($logout == 'public' AND !$url)
$url = url_de_base();
// seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
if (is_numeric($auteur_session['id_auteur'])) {
spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 15 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
// le logout explicite vaut destruction de toutes les sessions
if ($_COOKIE['spip_session']) {
$session = charger_fonction('session', 'inc');
$session($auteur_session['id_auteur']);
preg_match(',^[^/]*//[^/]*(.*)/$,',
url_de_base(),
$r);
spip_setcookie('spip_session', '', -1,$r[1]);
spip_setcookie('spip_session', '', -1);
spip_setcookie('spip_admin', '', -1, $r[1]);
spip_setcookie('spip_admin', '', -1);
}
if ($_SERVER['PHP_AUTH_USER']) {
include_spip('inc/actions');
if (verifier_php_auth()) {
ask_php_auth(_T('login_deconnexion_ok'),
_T('login_verifiez_navigateur'),
_T('login_retour_public'),
"redirect=". _DIR_RESTREINT_ABS,
_T('login_test_navigateur'),
true);
exit;
}
}
}
}
?>

View File

@ -12,6 +12,9 @@
<lien>
[http://repos.entrouvert.org/spip-saml.git->http://repos.entrouvert.org/spip-saml.git]
</lien>
<!-- <fonctions>mes_fonctions.php</fonctions> -->
<prefix>saml</prefix>
<pipeline>
<nom>definir_session</nom>
<inclure>saml_pipelines.php</inclure>
</pipeline>
</plugin>

23
saml_pipelines.php Normal file
View File

@ -0,0 +1,23 @@
<?php
/* Loading simplesamlphp */
include_spip('inc/simplesamlphp/lib/_autoload');
include_spip('inc/my_auth');
include_spip('inc/session');
function saml_definir_session($session)
{
// Vérification de la connection à l'idp
if (verifier_session())
{
$simplesaml = new SimpleSAML_Auth_Simple('default-sp');
if (!$simplesaml->isAuthenticated())
{
my_spip_logout();
}
}
return $session;
}
?>