Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1905 → Rev 1906

/trunk/src/org/tela_botanica/client/util/UtilDAO.java
18,6 → 18,7
public class UtilDAO {
private static String baseUrl = ((Configuration) Registry.get(RegistreId.CONFIG)).getServiceBaseUrl();
private static String baseAuthUrl = ((Configuration) Registry.get(RegistreId.CONFIG)).getAuthServiceBaseUrl();
public static final String GET = "GET";
public static final String POST = "POST";
public static final String DELETE = "DELETE";
95,9 → 96,32
}
return cheminUrl;
}
 
/**
* Construit un JsonRestRequestBuilder avec le header Authorization
*/
public static JsonRestRequestBuilder construireRequeteAuth(String nomService, HashMap<String, String> parametres) {
return construireRequeteAuth(nomService, parametres, true);
}
 
/**
* Construit un JsonRestRequestBuilder simple; si authorizationHeader vaut true, ajoute le header
* "Authorization" pour le service d'authentification SSO (annuaire::auth)
*
* @param nomService le nom du service (identite, login, logout...)
* @param parametres tableau de paramètres
* @param boolean authorizationHeader si true, enverra le jeton (si existant) dans un header Authorization
* @return JsonRestRequestBuilder
*/
public static JsonRestRequestBuilder construireRequeteAuth(String nomService, HashMap<String, String> parametres, boolean authorizationHeader) {
String parametresUrl = construireUrlParametres(parametres);
String urlComplete = baseAuthUrl + nomService + parametresUrl;
String urlCompleteEncodee = URL.encode(urlComplete);
JsonRestRequestBuilder jrrb = new JsonRestRequestBuilder(JsonRestRequestBuilder.GET, urlCompleteEncodee, authorizationHeader);
return jrrb;
}
 
public static String getUrlService(String nomService) {
return baseUrl + nomService;
}
}
/trunk/src/org/tela_botanica/client/http/JsonRestRequestBuilder.java
11,9 → 11,15
 
public class JsonRestRequestBuilder extends RequestBuilderWithCredentials {
 
// avec header "Authorization"
public JsonRestRequestBuilder(Method httpMethod, String url) {
super(httpMethod, url);
}
 
// ajoute le header "Authorization" si authorizationHeader vaut true
public JsonRestRequestBuilder(Method httpMethod, String url, boolean authorizationHeader) {
super(httpMethod, url, authorizationHeader);
}
public Request envoyerRequete(String donneesRequete, RequestCallback retour) {
Request requeteSortie = null;
/trunk/src/org/tela_botanica/client/http/RequestBuilderWithCredentials.java
1,11 → 1,27
package org.tela_botanica.client.http;
 
import org.tela_botanica.client.modeles.Utilisateur;
 
import com.google.gwt.http.client.RequestBuilder;
 
public class RequestBuilderWithCredentials extends RequestBuilder {
 
/**
* Crée une requête AJAX avec les headers "Credentials" (pour CORS) et "Authorization" (pour SSO)
*/
public RequestBuilderWithCredentials(Method httpMethod, String url) {
this(httpMethod, url, true);
}
 
/**
* Crée une requête AJAX avec les headers "Credentials" (pour CORS); si authorizationHeader est true,
* ajoute le header "Authorization" pour SSO
*/
public RequestBuilderWithCredentials(Method httpMethod, String url, boolean authorizationHeader) {
super(httpMethod, url);
if(authorizationHeader && Utilisateur.getJeton() != null && ! Utilisateur.getJeton().isEmpty()) {
this.setHeader("Authorization", Utilisateur.getJeton());
}
this.setIncludeCredentials(true);
}
}
/trunk/src/org/tela_botanica/client/http/JsonRestRequestCallback.java
37,7 → 37,7
// Affichage du débogage.
afficherDebug(response);
// Si le code de réponse HTTP ne vaut pas 200 OK, on lance le mécanise d'erreur HTTP
// Si le code de réponse HTTP ne vaut pas 200 OK, on lance le mécanisme d'erreur HTTP
if (response.getStatusCode() != 200) {
onErrorHTTP(request, response);
} else {
/trunk/src/org/tela_botanica/client/Modele.java
92,6 → 92,11
uDao.deconnecterUtilisateur();
}
public void getEtatUtilisateur(Rafraichissable vue) {
UtilisateurAsyncDao uDao = new UtilisateurAsyncDao(vue);
uDao.getEtatUtilisateur();
}
public void accepterLicence(Rafraichissable vue) {
UtilisateurAsyncDao uDao = new UtilisateurAsyncDao(vue);
uDao.accepterLicence();
/trunk/src/org/tela_botanica/client/modeles/Utilisateur.java
1,6 → 1,5
package org.tela_botanica.client.modeles;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
 
9,6 → 8,11
public class Utilisateur extends aDonnee {
 
private static final long serialVersionUID = -4016615552202089985L;
 
// Jeton encodé en base64 passé de manière automatique aux services dans un header
private static String jeton = "";
// Durée de vie du jeton en secondes (sert au rafraîchissement automatique)
private static int duree = 0;
public static final String PREFIXE = "cp";
public static String[] champsObligatoires = {"cp_id_personne"};
141,6 → 145,22
public void setParametre(String param) {
set("parametre", param);
}
 
public static String getJeton() {
return Utilisateur.jeton;
}
 
public static void setJeton(String jeton) {
Utilisateur.jeton = jeton;
}
 
public static int getDureeJeton() {
return Utilisateur.duree;
}
 
public static void setDureeJeton(int duree) {
Utilisateur.duree = duree;
}
// +---------------------------------------------------------------------------------------------------------------+
// IDENTIFIÉ
/trunk/src/org/tela_botanica/client/modeles/AuthInfo.java
New file
0,0 → 1,30
package org.tela_botanica.client.modeles;
 
/**
* Une mini classe pour stocker facilement le retour d'un appel aux services
* annuaire:auth (connexion, deconnexion, identite)
*
* @author mathias
*/
public class AuthInfo {
 
public String token;
public boolean session;
public String tokenId;
public int duration;
public Integer lastModif; // Integer pour pouvoir mettre null dedans
public String error;
 
public AuthInfo(String token, boolean session, String tokenId, int duration, Integer lastModif, String error) {
this.token = token;
this.session = session;
this.tokenId = tokenId;
this.duration = duration;
this.lastModif = lastModif;
this.error = error;
}
 
public AuthInfo() {
this(null, false, null, 0, null, null);
}
}
/trunk/src/org/tela_botanica/client/modeles/UtilisateurAsyncDao.java
1,5 → 1,8
package org.tela_botanica.client.modeles;
 
import java.util.HashMap;
 
import org.tela_botanica.client.Coel;
import org.tela_botanica.client.RegistreId;
import org.tela_botanica.client.http.JsonRestRequestBuilder;
import org.tela_botanica.client.http.JsonRestRequestCallback;
7,11 → 10,15
import org.tela_botanica.client.util.UtilDAO;
 
import com.extjs.gxt.ui.client.Registry;
import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.Response;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Timer;
 
/**
* Modele DAO, specifique, permettant la validation, l'acces aux donnees distantes et la présentation des donnees en retour
22,6 → 29,8
private Utilisateur utilisateur = null;
private Rafraichissable vueARafraichir = null;
 
private static Timer rafraichisseurJeton = null;
/**
* Constructeur
31,72 → 40,196
vueARafraichir = vueARafraichirCourrante;
utilisateur = (Utilisateur) Registry.get(RegistreId.UTILISATEUR_COURANT);
}
 
/**
* Méthode de classe d'appel du service des gestion d'identification.
* Recupere des informations d'authentification à partir du JSON renvoyé par les
* services Auth de l'annuaire (SSO)
*
* @param valeurJson
* @return AuthInfo
*/
public void getEtatUtilisateur() {
final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM);
rb.envoyerRequete(null, new JsonRestRequestCallback() {
@Override
public void surReponse(JSONValue responseValue) {
if (responseValue.isArray() != null) {
final JSONArray reponse = responseValue.isArray();
// Identifiant utilisateur ou identifiant de session si non identifié
String login = ((JSONString) reponse.get(2)).stringValue();
// Drapeau leve si utilisateur deja identifié
boolean identifie = ((JSONBoolean) reponse.get(3)).booleanValue();
utilisateur.setIdentification(identifie);
utilisateur.setLogin(login);
vueARafraichir.rafraichir(utilisateur);
public static AuthInfo parserAuthJson(JSONValue valeurJson) {
AuthInfo authInfo = new AuthInfo();
JSONObject authJson = valeurJson.isObject();
 
JSONValue erreurJSON = authJson.get("error");
// test si erreur
if (erreurJSON != null) {
JSONString erreur = erreurJSON.isString();
if (erreur != null) {
authInfo.error = erreur.stringValue();
} else {
authInfo.error = "erreur d'authentification";
}
} else {
boolean session = authJson.get("session").isBoolean().booleanValue();
authInfo.session = session;
// test si session ouverte
if (session) {
JSONValue tokenJson = authJson.get("token");
String token = null;
// protection paranoïaque
if (tokenJson != null) {
JSONString tokenString = tokenJson.isString();
if (tokenString != null) {
token = tokenString.stringValue();
}
}
String tokenId = authJson.get("token_id").isString().stringValue();
int duration = (int) authJson.get("duration").isNumber().doubleValue();
JSONValue lastModifJson = authJson.get("last_modif");
 
authInfo.token = token;
authInfo.tokenId = tokenId;
authInfo.duration = duration;
// test si lastModif est null
if (lastModifJson != null) {
JSONNumber lastModif = lastModifJson.isNumber();
if (lastModif != null) {
authInfo.lastModif = (int) lastModif.doubleValue();
}
}
}
});
}
return authInfo;
}
 
/**
* Enregistre le jeton (potentiellement NULL), sa durée de vie; appelle le service Coel pour
* obtenir les données de l'utilisateur relatives à l'application; lorsque le jeton
* n'est pas nul et que sa durée de vie est spécifiée, déclenche un rafraîchissement
* périodique du jeton
*
* @param objetRetour le retour de l'appel au service annuaire:auth (connexion, deconnexion ou identite)
*/
protected void gererRetourAuthInfo(AuthInfo objetRetour) {
// Stockage du jeton rafraîchi et de sa durée (pourrait avoir changé)
Utilisateur.setJeton(objetRetour.token);
Utilisateur.setDureeJeton(objetRetour.duration);
 
// Rafraîchissement automatique du jeton - s'annule lorsque le jeton devient nul
if (Utilisateur.getJeton() != null && Utilisateur.getDureeJeton() > 0) {
if (rafraichisseurJeton == null) { // on sait jamais
// 3/4 de la durée de vie du jeton, en millisecondes (ça laisse de la marge)
int delaiRepetition = (Utilisateur.getDureeJeton() * 1000) * 3 / 4;
delaiRepetition = 10000; // debug
rafraichisseurJeton = new Timer() {
@Override
public void run() {
//Coel.LogVersFirebug("rafraichir utilisateur");
// Appel de l'annuaire pour rafraîchir le jeton (cb nul pour l'instant)
getEtatUtilisateur();
}
};
rafraichisseurJeton.scheduleRepeating(delaiRepetition);
}
} else {
if (rafraichisseurJeton != null) { // on sait jamais non plus
rafraichisseurJeton.cancel();
rafraichisseurJeton = null;
}
}
 
// Obtention de l'utilisateur final d'après le service de préférences
//Coel.LogVersFirebug("va chercher utilisateur Coel");
getEtatUtilisateurSansAnnuaire();
}
 
/**
* Méthode déconnectant un utilisateur de l'application.
* @param identifiant de l'utilisateur à déconnecter.
*/
public void deconnecterUtilisateur() {
String[] parametres = {utilisateur.getId()};
final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, parametres);
//Coel.LogVersFirebug("deconnexion");
final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("deconnexion", null);
rb.envoyerRequete(null, new JsonRestRequestCallback() {
@Override
public void surReponse(JSONValue responseValue) {
if (responseValue.isArray() != null) {
final JSONArray reponse = responseValue.isArray();
// Identifiant utilisateur ou identifiant de session si non identifié
String id = ((JSONString) reponse.get(1)).stringValue();
// Drapeau levé si l'utilisateur est déjà identifié
boolean identifie = ((JSONBoolean) reponse.get(2)).booleanValue();
// Nous réinitialisons l'utilisateur
utilisateur = new Utilisateur(id, identifie);
GWT.log(utilisateur.toString(), null);
vueARafraichir.rafraichir(utilisateur);
}
//Coel.LogVersFirebug(responseValue.toString());
AuthInfo info = parserAuthJson(responseValue);
gererRetourAuthInfo(info);
}
});
}
/**
* Méthode connectant un utilisateur à l'application.
* @param Utilisateur l'utilisateur courant.
* Méthode connectant un utilisateur à l'application
*/
public void connecterUtilisateur() {
String[] parametres = {utilisateur.getLogin(), utilisateur.getMotDePasse()};
HashMap<String, String> parametres = new HashMap<String, String>();
parametres.put("login", utilisateur.getLogin());
parametres.put("password", utilisateur.getMotDePasse());
//Coel.LogVersFirebug("connexion");
final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("connexion", parametres);
final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, parametres);
rb.envoyerRequete(null, new JsonRestRequestCallback() {
@Override
public void surReponse(JSONValue responseValue) {
if (responseValue.isArray() != null) {
final JSONArray reponse = responseValue.isArray();
AuthInfo info = parserAuthJson(responseValue);
gererRetourAuthInfo(info);
}
});
}
 
/**
* Va chercher les infos de l'utilisateur en vérifiant d'abord l'identité auprès de l'annuaire
*/
public void getEtatUtilisateur() {
getEtatUtilisateur(false);
}
 
/**
* Va chercher les infos de l'utilisateur; si ignorerAnnuaire est false, vérifiera d'abord
* l'identité auprès de l'annuaire (service annuaire:auth/identite)
*/
public void getEtatUtilisateur(boolean ignorerAnnuaire) {
// par défaut, on appelle d'abord le service auth/identite de l'annuaire, afin de connaître
// le statut de l'utilisateur vis à vis du SSO (connecté ou non) et rafraîchir le jeton
if (! ignorerAnnuaire) {
//Coel.LogVersFirebug("get état");
// sans header Authorization, sinon une déconnexion depuis une autre appli ne sera pas
// prise en compte et le jeton sera rafraîchi indéfiniment
final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("identite", null, false);
rb.envoyerRequete(null, new JsonRestRequestCallback() {
@Override
public void surReponse(JSONValue responseValue) {
AuthInfo info = parserAuthJson(responseValue);
gererRetourAuthInfo(info);
}
@Override
public void onErrorHTTP(Request request, Response reponse) {
// Si on a été déconnecté, on va chercher un profil utilisateur "anonyme" et
// on avertit l'interface
gererRetourAuthInfo(new AuthInfo());
}
});
} else { // sinon on optimise, quand on vient de se (de)connecter, pas la peine de rappeler l'annuaire
getEtatUtilisateurSansAnnuaire();
}
}
 
/**
* Va chercher les infos de l'utilisateur Coel sans vérifier l'identité auprès de l'annuaire;
* transmet un jeton SSO à chaque fois pour que le service se base dessus
*/
public void getEtatUtilisateurSansAnnuaire() {
final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM);
rb.envoyerRequete(null, new JsonRestRequestCallback() {
@Override
public void surReponse(JSONValue responseValue) {
//Coel.LogVersFirebug("réponse reçue");
JSONArray reponse = responseValue.isArray();
if (reponse != null) {
// Identifiant utilisateur ou identifiant de session si non identifié
String login = ((JSONString) reponse.get(1)).stringValue();
 
// Drapeau leve si utilisateur deja identifié
boolean identifie = ((JSONBoolean) reponse.get(2)).booleanValue();
 
utilisateur.setIdentification(identifie);
utilisateur.setLogin(login);
 
//Ajout des informations licence
if (reponse.get(0).isString() != null) {
utilisateur.setLicence(reponse.get(0).isString().stringValue());
103,46 → 236,55
} else {
utilisateur.setLicence("");
}
if (reponse.size() > 0) {
 
//Coel.LogVersFirebug("Utilisateur CoeL chargé !!");
//Coel.LogVersFirebug("id: " + identifie + ", login: " + login + ", licence: " + utilisateur.getLicence());
//Coel.LogVersFirebug("Taille réponse:" + reponse.size());
 
// Utilisateur connecté (non anonyme)
if (reponse.size() > 3) {
//Coel.LogVersFirebug("Utilisateur identifié, on charge plus de trucs !");
// Identifiant de l'utilisateur ou identifiant de session si non identifié
utilisateur.setId(((JSONString) reponse.get(1)).stringValue());
// Drapeau levé si l'utilisateur est déjà identifié
utilisateur.setIdentification(((JSONBoolean) reponse.get(2)).booleanValue());
// Plus de deux valeurs, l'utilisateur est identifié nous récupérons des données supplémentaires
if (reponse.size() > 3) {
// Nom complet de l'utilisateur
if (reponse.get(3).isString() != null) {
utilisateur.setNomComplet(((JSONString) reponse.get(3)).stringValue());
}
// Prénom de l'utilisateur
if (reponse.get(4).isString() != null) {
utilisateur.setPrenom(((JSONString) reponse.get(4)).stringValue());
}
// Nom de l'utilisateur
if (reponse.get(5).isString() != null) {
utilisateur.setNom(((JSONString) reponse.get(5)).stringValue());
}
// Paramètres
if (reponse.get(6).isString() != null) {
utilisateur.setParametre(((JSONString) reponse.get(6)).stringValue());
}
String idUtilisateur = ((JSONString) reponse.get(1)).stringValue();
//Coel.LogVersFirebug("ID utilisateur: " + idUtilisateur);
utilisateur.setId(idUtilisateur);
 
// Nom complet de l'utilisateur
if (reponse.get(3).isString() != null) {
String nomComplet = ((JSONString) reponse.get(3)).stringValue();
//Coel.LogVersFirebug("Nom complet: " + nomComplet);
utilisateur.setNomComplet(nomComplet);
}
vueARafraichir.rafraichir(utilisateur);
// Prénom de l'utilisateur
if (reponse.get(4).isString() != null) {
String prenom = ((JSONString) reponse.get(4)).stringValue();
utilisateur.setPrenom(prenom);
//Coel.LogVersFirebug("Prénom: " + prenom);
}
// Nom de l'utilisateur
if (reponse.get(5).isString() != null) {
String nom = ((JSONString) reponse.get(5)).stringValue();
utilisateur.setNom(nom);
//Coel.LogVersFirebug("Nom: " + nom);
}
// Paramètre => was ist das ?
if (reponse.get(6).isString() != null) {
String parametre = ((JSONString) reponse.get(6)).stringValue();
utilisateur.setParametre(parametre);
//Coel.LogVersFirebug("Paramètre: " + parametre);
}
}
 
//Coel.LogVersFirebug("Rafraîchissement vue");
vueARafraichir.rafraichir(utilisateur);
}
}
});
}
/*
* */
 
/**
* @TODO CHANGER ÇA !
*/
public void accepterLicence() {
String[] parametres = {utilisateur.getLogin(), utilisateur.getMotDePasse(), utilisateur.getId()};
/trunk/src/org/tela_botanica/client/Mediateur.java
160,9 → 160,9
creerPanneauSud();
fenetreJournal = new FenetreJournal(this);
// Connection de l'utilisateur
connecterUtilisateur(null, null);
// Connexion de l'utilisateur
getEtatUtilisateur();
 
// Creer la table qui gère le panneau de chargement/déchargement
fileDAttenteChargement = new HashMap<Object, Integer>();
440,6 → 440,10
public void deconnecterUtilisateur() {
modele.deconnecterUtilisateur(this);
}
 
public void getEtatUtilisateur() {
modele.getEtatUtilisateur(this);
}
public void repandreEtatIdentification(Utilisateur utilisateur) {
// Mise à jour du registre
/trunk/src/org/tela_botanica/client/configuration/Configuration.java
89,6 → 89,7
listesId.put("nbElementsPage", Integer.valueOf(configuration.get("nbElementsPage")));
listesId.put("relationPersonnePublication", Integer.valueOf(configuration.get("relationPersonnePublication")));
urls.put("base", configuration.get("serviceBaseUrl"));
urls.put("baseAuth", configuration.get("serviceAuthBaseUrl"));
urls.put("cel", configuration.get("celUrl"));
urls.put("remarques", configuration.get("remarquesUrl"));
urls.put("bogue", configuration.get("bogueUrl"));
117,7 → 118,15
public String getServiceBaseUrl() {
return getUrl("base");
}
/**
* Accesseur pour l'url de base du service annuaire::auth
*/
public String getAuthServiceBaseUrl() {
return getUrl("baseAuth");
}
 
 
public String getUrl(String code) {
if (urls.containsKey(code)) {
return urls.get(code);