Backport
[platal.git] / include / xnet / session.inc.php
CommitLineData
0337d704 1<?php
2/***************************************************************************
50a40a33 3 * Copyright (C) 2003-2006 Polytechnique.org *
0337d704 4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
22require_once('platal/session.inc.php');
23
24// {{{ class XorgSession
25
4869f665 26class XnetSession
0337d704 27{
4869f665 28 var $challenge;
29
0337d704 30 // {{{ function XnetSession()
31
32 function XnetSession()
33 {
4869f665 34 $this->challenge = md5(uniqid(rand(), 1));
0337d704 35 }
36
37 // }}}
38 // {{{ function init
39
40 function init() {
41 global $globals;
42
43 @session_start();
44 if (!Session::has('session')) {
45 $_SESSION['session'] = new XnetSession;
46 }
47 if (!logged()) {
48 // prevent connexion to be linked to deconnexion
71fe935c 49 if (($i = strpos($_SERVER['REQUEST_URI'], 'exit')) !== false)
0337d704 50 $returl = "http://{$_SERVER['SERVER_NAME']}".substr($_SERVER['REQUEST_URI'], 0, $i);
51 else
52 $returl = "http://{$_SERVER['SERVER_NAME']}{$_SERVER['REQUEST_URI']}";
53 $url = "https://www.polytechnique.org/auth-groupex.php";
54 $url .= "?session=" . session_id();
55 $url .= "&challenge=" . $_SESSION['session']->challenge;
56 $url .= "&pass=" . md5($_SESSION['session']->challenge . $globals->xnet->secret);
57 $url .= "&url=".urlencode($returl);
58 $_SESSION['session']->loginX = $url;
59 }
60 }
61
62 // }}}
63 // {{{ function destroy()
64
65 function destroy() {
66 @session_destroy();
67 unset($_SESSION);
68 XnetSession::init();
69 }
70
71 // }}}
72 // {{{ function doAuth()
73
74 /** Try to do an authentication.
75 *
76 * @param page the calling page (by reference)
77 */
78 function doAuth(&$page)
79 {
0337d704 80 if (identified()) { // ok, c'est bon, on n'a rien à faire
81 return true;
82 }
83
84 if (Get::has('auth')) {
85 return $this->doAuthX($page);
86 } elseif (Post::has('challenge') && Post::has('username') && Post::has('response')) {
87 return $this->doAuthOther($page);
88 } else {
89 $this->doLogin($page);
90 }
91 }
92
93 // }}}
94 // {{{ doAuthX
95
96 function doAuthX(&$page) {
97 global $globals;
98
99 if (md5('1'.$this->challenge.$globals->xnet->secret.Get::getInt('uid').'1') != Get::get('auth')) {
100 $page->kill("Erreur d'authentification avec polytechnique.org !");
101 }
102
08cce2ff 103 $res = XDB::query("
0337d704 104 SELECT u.user_id AS uid, prenom, nom, perms, promo, password, FIND_IN_SET('femme', u.flags) AS femme,
105 a.alias AS forlife, a2.alias AS bestalias, q.core_mail_fmt AS mail_fmt, q.core_rss_hash
106 FROM auth_user_md5 AS u
107 INNER JOIN auth_user_quick AS q USING(user_id)
108 INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type='a_vie')
109 INNER JOIN aliases AS a2 ON (u.user_id = a2.id AND FIND_IN_SET('bestalias',a2.flags))
110 WHERE u.user_id = {?} AND u.perms IN('admin','user')
111 LIMIT 1", Get::getInt('uid'));
112 $_SESSION = array_merge($_SESSION, $res->fetchOneAssoc());
113 $_SESSION['auth'] = AUTH_MDP;
114 unset($this->challenge);
115 unset($this->loginX);
116 Get::kill('auth');
117 Get::kill('uid');
118 $args = array();
119 foreach($_GET as $key=>$val) {
120 $args[] = urlencode($key).'='.urlencode($val);
121 }
fa36e526 122 redirect($_SERVER['PHP_SELF'] . '?' . join('&', $args));
0337d704 123 }
124
125 // }}}
126 // {{{ doAuthOther
127
128 function doAuthOther(&$page) {
129 if (Post::has('challenge') && Post::has('username') && Post::has('response')) {
130 $username = Post::get('username');
131 }
132 $this->doLogin($page);
133 }
134
135 // }}}
136 // {{{ doLogin
137
138 function doLogin(&$page) {
2bd5b7f8 139 redirect($_SESSION['session']->loginX);
0337d704 140 }
141
142 // }}}
143}
144
145// }}}
146// {{{ may_update
147
148function may_update() {
149 global $globals;
150 if (!$globals->asso('id')) { return false; }
151 if (has_perms()) { return true; }
08cce2ff 152 $res = XDB::query(
0337d704 153 "SELECT perms
154 FROM groupex.membres
155 WHERE uid={?} AND asso_id={?}", Session::getInt('uid'), $globals->asso('id'));
156 return $res->fetchOneCell() == 'admin';
157}
158
159// }}}
160// {{{ is_member
161
162function is_member() {
163 global $globals;
258b9710 164 $asso_id = $globals->asso('id');
165 if (!$asso_id) { return false; }
166 static $is_member;
167 if (!$is_member) $is_member = array();
168 if (!isset($is_member[$asso_id]))
169 {
08cce2ff 170 $res = XDB::query(
0337d704 171 "SELECT COUNT(*)
172 FROM groupex.membres
258b9710 173 WHERE uid={?} AND asso_id={?}",
174 Session::getInt('uid'), $asso_id);
175 $is_member[$asso_id] = $res->fetchOneCell() == 1;
176 }
177 return $is_member[$asso_id];
0337d704 178}
179
180// }}}
181// vim:set et sw=4 sts=4 sws=4 foldmethod=marker:
182?>