Subversion Repositories Applications.papyrus

Rev

Rev 2154 | Rev 2156 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2154 Rev 2155
Line 47... Line 47...
47
	}
47
	}
48
}
48
}
Line 49... Line 49...
49
 
49
 
Line 50... Line 50...
50
class identificationSso {
50
class identificationSso {
51
	
51
	
52
	// Attention bien vérifier la présence des variables suivantes :
52
	// Attention bien v�rifier la pr�sence des variables suivantes :
53
	// IDEN_UTILISE_SSO, IDEN_URL_SSO, IDEN_HEADER_SSO, IDEN_COOKIE_SSO
53
	// IDEN_UTILISE_SSO, IDEN_URL_SSO, IDEN_HEADER_SSO, IDEN_COOKIE_SSO
-
 
54
	// dans le fichier iden_config.inc.php
54
	// dans le fichier iden_config.inc.php
55
	private $cookie_tentative_identification = "";
Line 55... Line 56...
55
	private $cookie_tentative_identification = "";
56
	/** Une tentative par minute pour s'identifier suffit largement */
Line 56... Line 57...
56
	private $delai_tentative_identification = 60;
57
	private $delai_tentative_identification = 60;
Line 71... Line 72...
71
		
72
		
72
		$this->cookie_tentative_identification = IDEN_COOKIE_SSO;
73
		$this->cookie_tentative_identification = IDEN_COOKIE_SSO;
73
		$this->auth_header = IDEN_HEADER_SSO;	
74
		$this->auth_header = IDEN_HEADER_SSO;	
Line 74... Line 75...
74
		$this->annuaire_url = IDEN_URL_SSO;
75
		$this->annuaire_url = IDEN_URL_SSO;
75
		
76
		
76
		// c'est moche mais je n'ai pas trouvé plus simple pour récuperer la table annuaire en cours 
77
		// c'est moche mais je n'ai pas trouv� plus simple pour r�cuperer la table annuaire en cours 
77
		// d'utilisation pour le site actuel (la bdd annuaire est la dernière partie du dsn)
78
		// d'utilisation pour le site actuel (la bdd annuaire est la derni�re partie du dsn)
78
		$dsn_annuaire = $this->communs_papyrus['info_auth_bdd']->gsab_dsn;
79
		$dsn_annuaire = $this->communs_papyrus['info_auth_bdd']->gsab_dsn;
Line 79... Line 80...
79
		$dsn_annuaire = explode('/', $dsn_annuaire);
80
		$dsn_annuaire = explode('/', $dsn_annuaire);
Line 86... Line 87...
86
 
87
 
87
	function getToken() {
88
	function getToken() {
88
		// Premier essai, dans le header
89
		// Premier essai, dans le header
89
		$headers = @apache_request_headers();
90
		$headers = @apache_request_headers();
90
		$token = !empty($headers['Authorization']) ? $headers['Authorization'] : null;
91
		$token = !empty($headers['Authorization']) ? $headers['Authorization'] : null;
91
		// Eventuellement, le jeton a pu être passé dans un header non standard, comme dans 
92
		// Eventuellement, le jeton a pu �tre pass� dans un header non standard, comme dans 
92
		// le cas où le header Authorization est supprimé par le mod cgi d'apache
93
		// le cas o� le header Authorization est supprim� par le mod cgi d'apache
93
		// Dans ce cas là on vérifie aussi dans un header alternatif si celui ci a été renseigné
94
		// Dans ce cas l� on v�rifie aussi dans un header alternatif si celui ci a �t� renseign�
94
		if($token == null && $this->auth_header != 'Authorization') {
95
		if($token == null && $this->auth_header != 'Authorization') {
95
			$token = !empty($headers[$this->auth_header]) ? $headers[$this->auth_header] : null;
96
			$token = !empty($headers[$this->auth_header]) ? $headers[$this->auth_header] : null;
Line 96... Line 97...
96
		}
97
		}
Line 116... Line 117...
116
	// http://stackoverflow.com/questions/1251582/beautiful-way-to-remove-get-variables-with-php?lq=1
117
	// http://stackoverflow.com/questions/1251582/beautiful-way-to-remove-get-variables-with-php?lq=1
117
	function supprimerUrlVar($url, $var) {
118
	function supprimerUrlVar($url, $var) {
118
		 return rtrim(preg_replace('/([?&])'.$var.'=[^&]+(&|$)/','$1',$url), '&?');
119
		 return rtrim(preg_replace('/([?&])'.$var.'=[^&]+(&|$)/','$1',$url), '&?');
119
	}
120
	}
Line 120... Line 121...
120
	
121
	
121
	function connecterEtRediriger($utilisateur, $pass) {
122
	function connecterEtRediriger() {
122
		$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
123
		$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
123
		$params = 'login='.$_POST['username'].'&password='.$_POST['password'].'&redirect_url='.urlencode($url_redirect);
124
		$params = 'login='.$_POST['username'].'&password='.$_POST['password'].'&redirect_url='.urlencode($url_redirect);
Line 124... Line 125...
124
		$connexion_url = $this->annuaire_url."connexion?".$params;
125
		$connexion_url = $this->annuaire_url."connexion?".$params;
Line 136... Line 137...
136
		header('Location: '.$deconnexion_url);
137
		header('Location: '.$deconnexion_url);
137
		exit;
138
		exit;
138
	}
139
	}
Line 139... Line 140...
139
	
140
	
140
	function verifierIdentiteEtRediriger() {
-
 
-
 
141
	function verifierIdentiteEtRediriger() {
-
 
142
		// si on fait autre chose qu'un GET, on ne vérifie pas l'identité, car
-
 
143
		// cela conduirait à une redirection en GET (avec le jeton), qui
-
 
144
		// supprimerait les données du corps de la requête
141
				
145
		if ($_SERVER['REQUEST_METHOD'] == "GET") {
Line 142... Line 146...
142
		if(empty($_COOKIE['sso_tentative_identification'])) {
146
			if(empty($_COOKIE['sso_tentative_identification'])) {
Line 143... Line 147...
143
 
147
 
144
			if($this->communs_papyrus['pear_auth']->getAuth()) {
148
				if($this->communs_papyrus['pear_auth']->getAuth()) {
Line 145... Line 149...
145
				
149
 
146
				$cookie_persistant_nom = session_name().'-memo';
150
					$cookie_persistant_nom = session_name().'-memo';
147
				$cookie_utilisateur_nom = session_name().'-utilisateur';
151
					$cookie_utilisateur_nom = session_name().'-utilisateur';
148
				
152
 
149
				// Si l'utilisateur est déjà connecté par pear
153
					// Si l'utilisateur est d�j� connect� par pear
150
				// on fait tout de même une opération de logout
154
					// on fait tout de m�me une op�ration de logout
151
				// pour coordonner la déconnection depuis une autre application
155
					// pour coordonner la d�connection depuis une autre application
152
				$this->communs_papyrus['pear_auth']->logout();
156
					$this->communs_papyrus['pear_auth']->logout();
Line 158... Line 162...
158
			}
162
				}
Line 159... Line 163...
159
		
163
 
160
			$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
164
				$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
Line 161... Line 165...
161
			$url = $this->annuaire_url."identite?redirect_url=".urlencode($url_redirect);
165
				$url = $this->annuaire_url."identite?redirect_url=".urlencode($url_redirect);
162
						
166
 
Line 163... Line 167...
163
			// une tentative par minute pour s'identifier suffit largement
167
				// une tentative toutes les $this->delai_tentative_identification
Line 164... Line 168...
164
			setcookie($this->cookie_tentative_identification, 1, time()+60, '/');
168
				setcookie($this->cookie_tentative_identification, 1, time() + $this->delai_tentative_identification, '/');
165
	
169
 
Line 166... Line 170...
166
			header('Location: '.$url);
170
				header('Location: '.$url);
-
 
171
 
-
 
172
			} else {
-
 
173
				$jeton = $this->getToken();
167
		
174
 
Line 168... Line 175...
168
		} else {	
175
				if($jeton != null) {
169
			$jeton = $this->getToken();
176
					// Verification du jeton aupres de l'annuaire
170
 
177
					$valide = $this->verifierToken($jeton);
171
			if($jeton != null) {
178
					if ($valide === true) {
Line 172... Line 179...
172
				$jeton_decode = $this->decoderToken($jeton);
179
						$jeton_decode = $this->decoderToken($jeton);
173
				
180
 
Line 174... Line 181...
174
				// Récupération du mot de passe pour remplir les infos de l'objet PEAR Auth
181
						// R�cup�ration du mot de passe pour remplir les infos de l'objet PEAR Auth
175
				$requete =  'SELECT '.$this->champ_mdp.' '.
182
						$requete =  'SELECT '.$this->champ_mdp.' '.
Line 176... Line 183...
176
						'FROM '.$this->bdd_annuaire.'.'.$this->table_annuaire.' '.
183
								'FROM '.$this->bdd_annuaire.'.'.$this->table_annuaire.' '.
177
						'WHERE '.$this->champ_login.' = "'.$jeton_decode['sub'].'" ';
184
								'WHERE '.$this->champ_login.' = "'.$jeton_decode['sub'].'" ';
178
				
185
 
179
				// TODO: normalement ça n'est jamais le cas mais que fait t'on si l'utilisateur n'existe pas
186
						// TODO: normalement �a n'est jamais le cas mais que fait t'on si l'utilisateur n'existe pas
180
				// dans notre base de données ? (au pire il ne sera pas connecté)
187
						// dans notre base de donn�es ? (au pire il ne sera pas connect�)
181
	
188
 
182
				$this->communs_papyrus['pear_auth']->username = $jeton_decode['sub'];
189
						$this->communs_papyrus['pear_auth']->username = $jeton_decode['sub'];
183
				$this->communs_papyrus['pear_auth']->password = $this->communs_papyrus['pear_db']->getOne($requete);
190
						$this->communs_papyrus['pear_auth']->password = $this->communs_papyrus['pear_db']->getOne($requete);
184
					
191
 
185
				// Le mot de passe est déjà crypté dans la bdd donc il faut indiquer à pear de ne pas le re crytper
192
						// Le mot de passe est d�j� crypt� dans la bdd donc il faut indiquer � pear de ne pas le re crytper
186
				if (isset($this->communs_papyrus['pear_auth']->storage_options)) {
193
						if (isset($this->communs_papyrus['pear_auth']->storage_options)) {
-
 
194
							$this->communs_papyrus['pear_auth']->storage_options['cryptType'] = 'none';
-
 
195
						}
-
 
196
						if (isset($this->communs_papyrus['pear_auth']->storage->options)) {
-
 
197
							$this->communs_papyrus['pear_auth']->storage->options['cryptType'] = 'none';
-
 
198
						}
-
 
199
					}
-
 
200
				}
-
 
201
			}
-
 
202
		}
-
 
203
	}
-
 
204
 
-
 
205
	/**
-
 
206
	 * Vérifie un jeton auprès de l'annuaire
-
 
207
	 */
-
 
208
	protected function verifierToken($token) {
187
					$this->communs_papyrus['pear_auth']->storage_options['cryptType'] = 'none';
209
		$verificationServiceURL = $this->annuaire_url . "verifytoken";
188
				}
210
		$verificationServiceURL .= "?token=" . $token;