summaryrefslogtreecommitdiffstats
path: root/balise/login_saml.php
blob: 031705aee6950ba6a74b2e1d1d4583a3d85f33aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2007                                                *
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/

if (!defined("_ECRIRE_INC_VERSION")) return;    #securite

include_spip('inc/headers');
include_spip('inc/session');
include_spip('inc/cookie');
include_spip('inc/texte');

/* Loading simplesamlphp */
include_spip('inc/simplesamlphp/lib/_autoload');

// http://doc.spip.org/@balise_URL_LOGOUT
function balise_LOGIN_SAML ($p) {
    spip_log("[auth_saml] balise_LOGIN_SAML");
    return calculer_balise_dynamique($p,'LOGIN_SAML', array());
}

// $args[0] = url destination apres logout [(#URL_LOGOUT{url})]
// http://doc.spip.org/@balise_URL_LOGOUT_stat
function balise_LOGIN_SAML_stat ($args, $filtres) {
        return array($args[0]);
}

// http://doc.spip.org/@balise_URL_LOGOUT_dyn
function balise_LOGIN_SAML_dyn() 
{
    $simplesaml = new SimpleSAML_Auth_Simple('default-sp');

    spip_log("[auth_saml] balise_LOGIN_SAML_dyn");

    if (!$simplesaml->isAuthenticated()) {
        spip_log("[auth_saml] required auth");
        $simplesaml->requireAuth();
    }
    else return login_saml_successfull();
}

function generate_password($length = 15) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789*\_-~#/!+={[]}()&$%';
    $count = mb_strlen($chars);

    for ($i = 0, $result = ''; $i < $length; $i++) {
        $index = rand(0, $count - 1);
        $result .= mb_substr($chars, $index, 1);
    }

    return $result;
}

function login_saml_successfull()
{
    $simplesaml = new SimpleSAML_Auth_Simple('default-sp');

    spip_log("[auth_saml] Traitement login SAML");

    $attributes = $simplesaml->getAttributes();
    $login = $attributes['uid'][0];
    $first_name = $attributes['gn'][0];
    $last_name = $attributes['sn'][0];
    $email = $attributes['email'][0];
    $display_name = $first_name . ' ' . $last_name;

    spip_log("[auth_saml] authentification reussi pour l'utilisateur =".$login);

    // Si l'utilisateur figure deja dans la base, y recuperer les infos
    $result = spip_query("SELECT * FROM spip_auteurs WHERE login=" ._q($login). " AND statut<>'5poubelle'" );
    $row_auteur = spip_fetch_array($result);

    spip_log("[auth_saml] attribus utilisateur =".$row_auteur['login']);

    if ($row_auteur) {
        $GLOBALS['auteur_session'] =  $row_auteur;

        spip_log("[auth_saml] updating user [" . $login . "]");
        spip_log("[auth_saml] display name : $display_name and email : $email");
        spip_query("UPDATE spip_auteurs SET nom=" . _q($display_name) . ", email=" . _q($email) . " WHERE login="._q($login));

    }
    else
    {
        spip_log("[auth_saml] creating user [" . $login . "]");
        spip_log("[auth_saml] display name : $display_name and email : $email");
        $pass = generate_password();
        spip_query("INSERT INTO spip_auteurs (nom, login, email, pass, statut)  VALUES ('$display_name', '$login', '$email', '$pass', '1comite')");
        // Si l'utilisateur figure deja dans la base, y recuperer les infos
        $result = spip_query("SELECT * FROM spip_auteurs WHERE login=" ._q($login). " AND statut<>'5poubelle'" );
        $row_auteur = spip_fetch_array($result);
    }
    $session = charger_fonction('session', 'inc');
    $cookie_session = $session($row_auteur);
    spip_setcookie('spip_session', $cookie_session);
    $redirect = _DIR_RESTREINT_ABS. "?bonjour=oui";
    redirige_par_entete($redirect);
}

?>