Subversion Repositories Applications.papyrus

Compare Revisions

No changes between revisions

Ignore whitespace Rev 2153 → Rev 2154

/trunk/papyrus/bibliotheque/classes/pap_identificationsso.class.php
New file
0,0 → 1,196
<?php
 
// Remplacement de apache_request_headers pour les vieux serveurs
// http://stackoverflow.com/questions/2916232/call-to-undefined-function-apache-request-headers
if(!function_exists('apache_request_headers')) {
function apache_request_headers() {
// Based on: http://www.iana.org/assignments/message-headers/message-headers.xml#perm-headers
$arrCasedHeaders = array(
// HTTP
'Dasl' => 'DASL',
'Dav' => 'DAV',
'Etag' => 'ETag',
'Mime-Version' => 'MIME-Version',
'Slug' => 'SLUG',
'Te' => 'TE',
'Www-Authenticate' => 'WWW-Authenticate',
// MIME
'Content-Md5' => 'Content-MD5',
'Content-Id' => 'Content-ID',
'Content-Features' => 'Content-features',
);
$arrHttpHeaders = array();
 
foreach($_SERVER as $strKey => $mixValue) {
if('HTTP_' !== substr($strKey, 0, 5)) {
continue;
}
 
$strHeaderKey = strtolower(substr($strKey, 5));
 
if(0 < substr_count($strHeaderKey, '_')) {
$arrHeaderKey = explode('_', $strHeaderKey);
$arrHeaderKey = array_map('ucfirst', $arrHeaderKey);
$strHeaderKey = implode('-', $arrHeaderKey);
}
else {
$strHeaderKey = ucfirst($strHeaderKey);
}
 
if(array_key_exists($strHeaderKey, $arrCasedHeaders)) {
$strHeaderKey = $arrCasedHeaders[$strHeaderKey];
}
 
$arrHttpHeaders[$strHeaderKey] = $mixValue;
}
return $arrHttpHeaders;
}
}
 
class identificationSso {
// Attention bien vérifier la présence des variables suivantes :
// IDEN_UTILISE_SSO, IDEN_URL_SSO, IDEN_HEADER_SSO, IDEN_COOKIE_SSO
// dans le fichier iden_config.inc.php
private $cookie_tentative_identification = "";
private $delai_tentative_identification = 60;
private $auth_header = 'Authorization';
private $annuaire_url = '';
private $bdd_annuaire = '';
private $table_annuaire = '';
private $champ_login = '';
private $champ_mdp = '';
private $communs_papyrus = null;
 
public function __construct() {
$this->communs_papyrus = $GLOBALS['_GEN_commun'];
$this->cookie_tentative_identification = IDEN_COOKIE_SSO;
$this->auth_header = IDEN_HEADER_SSO;
$this->annuaire_url = IDEN_URL_SSO;
// c'est moche mais je n'ai pas trouvé plus simple pour récuperer la table annuaire en cours
// d'utilisation pour le site actuel (la bdd annuaire est la dernière partie du dsn)
$dsn_annuaire = $this->communs_papyrus['info_auth_bdd']->gsab_dsn;
$dsn_annuaire = explode('/', $dsn_annuaire);
$this->bdd_annuaire = end($dsn_annuaire);
$this->table_annuaire = $this->communs_papyrus['info_auth_bdd']->gsab_nom_table;
$this->champ_login = $this->communs_papyrus['info_auth_bdd']->gsab_nom_champ_login;
$this->champ_mdp = $this->communs_papyrus['info_auth_bdd']->gsab_nom_champ_mdp;
}
 
function getToken() {
// Premier essai, dans le header
$headers = @apache_request_headers();
$token = !empty($headers['Authorization']) ? $headers['Authorization'] : null;
// Eventuellement, le jeton a pu être passé dans un header non standard, comme dans
// le cas où le header Authorization est supprimé par le mod cgi d'apache
// Dans ce cas là on vérifie aussi dans un header alternatif si celui ci a été renseigné
if($token == null && $this->auth_header != 'Authorization') {
$token = !empty($headers[$this->auth_header]) ? $headers[$this->auth_header] : null;
}
 
// Sinon dans $_REQUEST ?
if($token == null) {
$token = !empty($_REQUEST['Authorization']) ? $_REQUEST['Authorization'] : null;
}
// Sinon dans $_COOKIE ?
if($token == null) {
$token = !empty($_COOKIE['tb_auth']) ? $_COOKIE['tb_auth'] : null;
}
 
return $token;
}
 
public function decoderToken($token) {
$token_parts = explode('.', $token);
return json_decode(base64_decode($token_parts[1]), true);
}
 
// http://stackoverflow.com/questions/1251582/beautiful-way-to-remove-get-variables-with-php?lq=1
function supprimerUrlVar($url, $var) {
return rtrim(preg_replace('/([?&])'.$var.'=[^&]+(&|$)/','$1',$url), '&?');
}
function connecterEtRediriger($utilisateur, $pass) {
$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$params = 'login='.$_POST['username'].'&password='.$_POST['password'].'&redirect_url='.urlencode($url_redirect);
$connexion_url = $this->annuaire_url."connexion?".$params;
header('Location: '.$connexion_url);
exit;
}
function deconnecterEtRediriger() {
$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$url_redirect = $this->supprimerUrlVar($url_redirect, 'logout');
$deconnexion_url = $this->annuaire_url."deconnexion?".'redirect_url='.urlencode($url_redirect);
header('Location: '.$deconnexion_url);
exit;
}
function verifierIdentiteEtRediriger() {
if(empty($_COOKIE['sso_tentative_identification'])) {
 
if($this->communs_papyrus['pear_auth']->getAuth()) {
$cookie_persistant_nom = session_name().'-memo';
$cookie_utilisateur_nom = session_name().'-utilisateur';
// Si l'utilisateur est déjà connecté par pear
// on fait tout de même une opération de logout
// pour coordonner la déconnection depuis une autre application
$this->communs_papyrus['pear_auth']->logout();
// Destruction du cookie de session de Papyrus : est ce utile?
setcookie(session_name(), session_id(), time()-3600, '/');
// Destruction du cookie de permanence de l'identitification de Papyrus
setcookie($cookie_persistant_nom, '', time()-3600, '/');
setcookie($cookie_utilisateur_nom, '', time()-3600, '/');
}
$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$url = $this->annuaire_url."identite?redirect_url=".urlencode($url_redirect);
// une tentative par minute pour s'identifier suffit largement
setcookie($this->cookie_tentative_identification, 1, time()+60, '/');
header('Location: '.$url);
} else {
$jeton = $this->getToken();
 
if($jeton != null) {
$jeton_decode = $this->decoderToken($jeton);
// Récupération du mot de passe pour remplir les infos de l'objet PEAR Auth
$requete = 'SELECT '.$this->champ_mdp.' '.
'FROM '.$this->bdd_annuaire.'.'.$this->table_annuaire.' '.
'WHERE '.$this->champ_login.' = "'.$jeton_decode['sub'].'" ';
// TODO: normalement ça n'est jamais le cas mais que fait t'on si l'utilisateur n'existe pas
// dans notre base de données ? (au pire il ne sera pas connecté)
$this->communs_papyrus['pear_auth']->username = $jeton_decode['sub'];
$this->communs_papyrus['pear_auth']->password = $this->communs_papyrus['pear_db']->getOne($requete);
// Le mot de passe est déjà crypté dans la bdd donc il faut indiquer à pear de ne pas le re crytper
if (isset($this->communs_papyrus['pear_auth']->storage_options)) {
$this->communs_papyrus['pear_auth']->storage_options['cryptType'] = 'none';
}
if (isset($this->communs_papyrus['pear_auth']->storage->options)) {
$this->communs_papyrus['pear_auth']->storage->options['cryptType'] = 'none';
}
}
}
}
}
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property