Subversion Repositories Applications.papyrus

Compare Revisions

Ignore whitespace Rev 2154 → Rev 2155

/trunk/papyrus/bibliotheque/classes/pap_identificationsso.class.php
49,10 → 49,11
 
class identificationSso {
// Attention bien vérifier la présence des variables suivantes :
// 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 = "";
/** Une tentative par minute pour s'identifier suffit largement */
private $delai_tentative_identification = 60;
private $auth_header = 'Authorization';
73,8 → 74,8
$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)
// 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);
88,9 → 89,9
// 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é
// 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;
}
118,7 → 119,7
return rtrim(preg_replace('/([?&])'.$var.'=[^&]+(&|$)/','$1',$url), '&?');
}
function connecterEtRediriger($utilisateur, $pass) {
function connecterEtRediriger() {
$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;
138,59 → 139,80
}
function verifierIdentiteEtRediriger() {
if(empty($_COOKIE['sso_tentative_identification'])) {
// si on fait autre chose qu'un GET, on ne vérifie pas l'identité, car
// cela conduirait à une redirection en GET (avec le jeton), qui
// supprimerait les données du corps de la requête
if ($_SERVER['REQUEST_METHOD'] == "GET") {
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($this->communs_papyrus['pear_auth']->getAuth()) {
 
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';
$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, '/');
}
if (isset($this->communs_papyrus['pear_auth']->storage->options)) {
$this->communs_papyrus['pear_auth']->storage->options['cryptType'] = 'none';
 
$url_redirect = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$url = $this->annuaire_url."identite?redirect_url=".urlencode($url_redirect);
 
// une tentative toutes les $this->delai_tentative_identification
setcookie($this->cookie_tentative_identification, 1, time() + $this->delai_tentative_identification, '/');
 
header('Location: '.$url);
 
} else {
$jeton = $this->getToken();
 
if($jeton != null) {
// Verification du jeton aupres de l'annuaire
$valide = $this->verifierToken($jeton);
if ($valide === true) {
$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';
}
}
}
}
}
}
 
/**
* Vérifie un jeton auprès de l'annuaire
*/
protected function verifierToken($token) {
$verificationServiceURL = $this->annuaire_url . "verifytoken";
$verificationServiceURL .= "?token=" . $token;
 
$info = file_get_contents($verificationServiceURL);
$info = json_decode($info, true);
 
return ($info === true);
}
}
?>
/trunk/papyrus/applettes/identification/identification.php
23,9 → 23,9
/**
* Applette : identification
*
* Génére un formulaire les champs nécessaires pour s'identifier.
* Nécessite :
* - Variable globale de Génésia.
* G�n�re un formulaire les champs n�cessaires pour s'identifier.
* N�cessite :
* - Variable globale de G�n�sia.
* - Pear Auth
* - Pear Net_URL
*
43,7 → 43,7
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTéTE du PROGRAMME |
// | ENT�TE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
$GLOBALS['_GEN_commun']['info_applette_nom_fonction'] = 'afficherFormIdentification';
$GLOBALS['_GEN_commun']['info_applette_balise'] = '(?:<!-- '.$GLOBALS['_GEN_commun']['balise_prefixe'].'(IDENTIFICATION) -->|'.
60,10 → 60,10
 
// Inclusion des fichiers de traduction de l'applette.
if (file_exists(IDEN_CHEMIN_LANGUE.'iden_langue_'.$GLOBALS['_GEN_commun']['i18n'].'.inc.php')) {
/** Inclusion du fichier de traduction suite é la transaction avec le navigateur.*/
/** Inclusion du fichier de traduction suite � la transaction avec le navigateur.*/
require_once IDEN_CHEMIN_LANGUE.'iden_langue_'.$GLOBALS['_GEN_commun']['i18n'].'.inc.php';
} else {
/** Inclusion du fichier de traduction par défaut.*/
/** Inclusion du fichier de traduction par d�faut.*/
require_once IDEN_CHEMIN_LANGUE.'iden_langue_'.IDEN_I18N_DEFAUT.'.inc.php';
}
// +------------------------------------------------------------------------------------------------------+
80,7 → 80,7
$cookie_persistant_nom = session_name().'-memo';
$cookie_utilisateur_nom = session_name().'-utilisateur';
// Si un formulaire nous renvoie en POST une variable "deconnexion", nous délogons l'utilisateur.
// Si un formulaire nous renvoie en POST une variable "deconnexion", nous d�logons l'utilisateur.
if ((isset($_REQUEST['deconnexion']) || isset($_REQUEST['logout']))) {
$GLOBALS['_GEN_commun']['pear_auth']->logout();
// Destruction du cookie de session de Papyrus : est ce utile?
97,11 → 97,11
} else if (isset($_REQUEST['connexion'])) {
// Si un formulaire nous renvoie en POST une variable "connexion", nous logons l'utilisateur.
$cookie_val = md5($_POST['password']).$_POST['username'];
// Nous vérifions que l'utilisateur est coché "Mémoriser mon compte"
// Nous v�rifions que l'utilisateur est coch� "M�moriser mon compte"
if (isset($_POST['persistant']) && $_POST['persistant'] == 'o' && IDEN_AUTH_SESSION_DUREE != 0) {
// Expiration si l'utilisateur ne referme pas son navigateur
$GLOBALS['_GEN_commun']['pear_auth']->setExpire((int)IDEN_AUTH_SESSION_DUREE);
// Création d'un cookie pour rendre permanente l'identification de Papyrus
// Cr�ation d'un cookie pour rendre permanente l'identification de Papyrus
setcookie($cookie_persistant_nom, $cookie_val, (int)IDEN_AUTH_SESSION_DUREE, '/');
} else {
setcookie($cookie_utilisateur_nom, $cookie_val, 0, '/');
109,7 → 109,7
if(IDEN_UTILISE_SSO) {
// On propage la connexion sur le sso, attention ceci provoque une redirection suivie d'un exit
$identification->connecterEtRediriger($_POST['username'], $_POST['password']);
$identification->connecterEtRediriger();
}
} else if (isset($_COOKIE[$cookie_persistant_nom])) {
117,7 → 117,7
$GLOBALS['_GEN_commun']['pear_auth']->password = substr($_COOKIE[$cookie_persistant_nom], 0, 32 );
$GLOBALS['_GEN_commun']['pear_auth']->username = substr($_COOKIE[$cookie_persistant_nom], 32);
 
// Le mot de passe est déjé crypté dans cookie donc il faut indiquer é pear de ne pas le re crytper
// Le mot de passe est d�j� crypt� dans cookie donc il faut indiquer � pear de ne pas le re crytper
if (isset($GLOBALS['_GEN_commun']['pear_auth']->storage_options)) {
$GLOBALS['_GEN_commun']['pear_auth']->storage_options['cryptType'] = 'none';
}
128,7 → 128,7
$GLOBALS['_GEN_commun']['pear_auth']->password = substr($_COOKIE[$cookie_utilisateur_nom], 0, 32 );
$GLOBALS['_GEN_commun']['pear_auth']->username = substr($_COOKIE[$cookie_utilisateur_nom], 32);
 
// Le mot de passe est déjé crypté dans cookie donc il faut indiquer é pear de ne pas le re crytper
// Le mot de passe est d�j� crypt� dans cookie donc il faut indiquer � pear de ne pas le re crytper
if (isset($GLOBALS['_GEN_commun']['pear_auth']->storage_options)) {
$GLOBALS['_GEN_commun']['pear_auth']->storage_options['cryptType'] = 'none';
}
138,7 → 138,7
}
if(IDEN_UTILISE_SSO) {
// Si nous n'avons pas de cookie, on redirige vers le sso pour vérifier la présence du jeton
// Si nous n'avons pas de cookie, on redirige vers le sso pour v�rifier la pr�sence du jeton
// attention ceci entraine une redirection suivie d'un exit
$identification->verifierIdentiteEtRediriger();
}
152,12 → 152,12
 
/** Fonction afficherFormIdentification() - Retourne une formulaire pour s'identifier.
*
* Retourne un formulaire d'identificatin ou de déconnexion suivant que l'utilisateur est
* identifié ou pas.
* Retourne un formulaire d'identificatin ou de d�connexion suivant que l'utilisateur est
* identifi� ou pas.
*
* @param array tableau d'éventuel arguments présent dans la balise transmis é la fonction.
* @param array tableau d'�ventuel arguments pr�sent dans la balise transmis � la fonction.
* @param array tableau global de Papyrus.
* @return string formulaire de connexion ou de déconnexion.
* @return string formulaire de connexion ou de d�connexion.
*/
function afficherFormIdentification($tab_arguments, $_GEN_commun)
{
189,14 → 189,14
$objet_url->addQueryString('logout', 1);
$url_deconnect = $objet_url->getURL();
$objet_url->removeQueryString('logout');
// Récupération des valeurs pour le login et le mot de passe
// R�cup�ration des valeurs pour le login et le mot de passe
$mot_de_passe = (! isset($_POST['password'])) ? '' : $_POST['password'];
$login = (! isset($_POST['username'])) ? '' : $_POST['username'];
 
$url_inscription_aide = $InfoAuthBdd->url_erreur;
 
// ATTENTION : Partie é supprimer une fois les mise é jour effectué dans l'annuaire de Tela Botanica
// Devrait étre déplacer dans l'appli inscription de Tela.
// ATTENTION : Partie � supprimer une fois les mise � jour effectu� dans l'annuaire de Tela Botanica
// Devrait �tre d�placer dans l'appli inscription de Tela.
if (isset($InfoAuthBdd->gsab_nom_table) && $InfoAuthBdd->gsab_nom_table == 'annuaire_tela') {
verification_mot_de_passe($objet_pear_db, $mot_de_passe, $login);
if (isset($_POST['connexion'])) {
204,7 → 204,7
}
}
 
// L'utilisateur a essayé de s'identifier mais a échoué
// L'utilisateur a essay� de s'identifier mais a �chou�
$url_erreur = false;
if ($login != '') {
$url_erreur = '#';
269,7 → 269,7
* Fusion avec la livraison AHA : 18 avril 2008
*
* Revision 1.35.2.2 2008-04-18 14:14:55 jp_milcent
* Gestion de plusieurs applettes identifications sur la même page html.
* Gestion de plusieurs applettes identifications sur la m�me page html.
* Correction de bogues.
*
* Revision 1.36 2007-11-27 11:26:55 jp_milcent
285,17 → 285,17
* modification de la balise identification pour permettre de preciser un template.
*
* Revision 1.33 2007-08-28 14:23:35 jp_milcent
* Amélioration de la gestion des mots de passe perdus.
* Am�lioration de la gestion des mots de passe perdus.
*
* Revision 1.32 2007-08-28 14:14:35 jp_milcent
* Ajout de la gestion des erreurs d'identification.
*
* Revision 1.31 2006-12-15 14:49:47 jp_milcent
* Correction bogue : le type de cryptage est stocké é 2 endroits...
* Correction bogue : le type de cryptage est stock� � 2 endroits...
*
* Revision 1.30 2006/12/14 15:01:05 jp_milcent
* Utilisation d'un systéme permettant de mémoriser les idenitifications.
* Passage é Auth 1.4.3 et DB 1.7.6.
* Utilisation d'un syst�me permettant de m�moriser les idenitifications.
* Passage � Auth 1.4.3 et DB 1.7.6.
*
* Revision 1.29 2006/12/12 13:53:54 jp_milcent
* Mise en place du nouveau format des balises d'applette.
307,18 → 307,18
* Correction bogue : l'identification ne tenait pas...
*
* Revision 1.26 2006/12/01 16:33:40 florian
* Amélioration de la gestion des applettes et compatibilité avec le nouveau mode de gestion de l'inclusion des applettes.
* Am�lioration de la gestion des applettes et compatibilit� avec le nouveau mode de gestion de l'inclusion des applettes.
*
* Revision 1.25 2006/11/20 18:40:33 jp_milcent
* Amélioration de la gestion des infos sur l'inscription.
* Ajout du paramétre url_inscription_aide permettant d'indiquer l'url vers une page d'aide sur l'inscription.
* Am�lioration de la gestion des infos sur l'inscription.
* Ajout du param�tre url_inscription_aide permettant d'indiquer l'url vers une page d'aide sur l'inscription.
*
* Revision 1.24 2006/11/20 17:42:40 jp_milcent
* Ajout d'un test activant ou pas la mémorisation de l'identification.
* Ajout d'un test activant ou pas la m�morisation de l'identification.
*
* Revision 1.23 2006/11/20 17:30:40 jp_milcent
* Amélioration de la gestion de l'identification.
* Utilisation des durées de session correcte.
* Am�lioration de la gestion de l'identification.
* Utilisation des dur�es de session correcte.
* Suppression du code pour Spip non fonctionnel.
*
* Revision 1.22 2006/09/21 15:25:17 jp_milcent
328,22 → 328,22
* Fusion branche multilinguisme dans branche principale
*
* Revision 1.20 2005/12/13 11:13:35 alexandre_tb
* ajout d'un message si l'identification échoue
* ajout d'un message si l'identification �choue
*
* Revision 1.19.2.1 2005/12/20 14:40:24 ddelon
* Fusion Head vers Livraison
*
* Revision 1.20 2005/12/13 11:13:35 alexandre_tb
* ajout d'un message si l'identification échoue
* ajout d'un message si l'identification �choue
*
* Revision 1.19 2005/10/31 17:09:28 ddelon
* Suppression auth start suite é deconnexion ... attention aux effets de bord
* Suppression auth start suite � deconnexion ... attention aux effets de bord
*
* Revision 1.18 2005/09/27 09:07:32 ddelon
* size applette et squelettes
*
* Revision 1.17 2005/09/12 09:17:17 alexandre_tb
* utilisation de l'objet Net_URL pour ajouter la variable logout dans le lien de déconnexion
* utilisation de l'objet Net_URL pour ajouter la variable logout dans le lien de d�connexion
*
* Revision 1.16 2005/06/09 17:06:28 jpm
* Ajout de constantes de langue.
352,32 → 352,32
* Modification de l'affichage de l'identification.
*
* Revision 1.14 2005/05/19 14:00:58 jpm
* Déplacement du menu de modif de l'inscription.
* D�placement du menu de modif de l'inscription.
*
* Revision 1.13 2005/04/14 16:37:22 jpm
* Ajout de la gestion de la modification de son inscription.
*
* Revision 1.12 2005/03/25 14:40:51 jpm
* Prise en compte du paramétre url_inscription permettant de faire figurer dans l'applette inscription un lien vers la page d'inscription.
* Prise en compte du param�tre url_inscription permettant de faire figurer dans l'applette inscription un lien vers la page d'inscription.
*
* Revision 1.11 2005/03/17 15:52:17 jpm
* Suppression d'un / causant un bogue.
*
* Revision 1.10 2005/03/15 14:47:14 jpm
* Utilisation d'un lien é la place d'un formulaire pour la déconnexion.
* Utilisation d'un lien � la place d'un formulaire pour la d�connexion.
*
* Revision 1.9 2005/03/15 14:17:46 jpm
* Ajout d'un fichier de config et de traduction.
* Début gestion des constantes de langue.
* D�but gestion des constantes de langue.
*
* Revision 1.8 2005/03/10 12:50:44 alex
* remplacement de & par &amp;
*
* Revision 1.7 2005/01/07 12:43:03 alex
* réauction de la taille des champs texte é 12
* r�auction de la taille des champs texte � 12
*
* Revision 1.6 2004/12/13 18:07:09 alex
* désauthentification spip presque parfaite
* d�sauthentification spip presque parfaite
*
* Revision 1.5 2004/09/23 14:31:12 jpm
* Correction bogue sur l'identification de l'annuaire_tela.
395,13 → 395,13
* Changement de nom et d'arborescence de Genesia en Papyrus.
*
* Revision 1.5 2004/05/05 06:44:15 jpm
* Complément des commentaires indiquant les paquetages nécessaire é l'applette.
* Compl�ment des commentaires indiquant les paquetages n�cessaire � l'applette.
*
* Revision 1.4 2004/05/03 11:18:55 jpm
* Intégration de la variable globale de Génésia dans les arguments de la fonction de l'applette.
* Int�gration de la variable globale de G�n�sia dans les arguments de la fonction de l'applette.
*
* Revision 1.3 2004/05/01 17:21:16 jpm
* Ajout d'un fieldset et d'une légende au formulaire.
* Ajout d'un fieldset et d'une l�gende au formulaire.
*
* Revision 1.2 2004/05/01 16:13:07 jpm
* Ajout du nom de la balise de l'applette dans le code de l'applette.