Subversion Repositories eFlore/Applications.del

Compare Revisions

Ignore whitespace Rev 2076 → Rev 2077

/trunk/src/org/tela_botanica/del/client/utils/UtilitairesServiceResultat.java
12,6 → 12,7
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.i18n.I18n;
import org.tela_botanica.del.client.modeles.ActiviteUtilisateur;
import org.tela_botanica.del.client.modeles.AuthInfo;
import org.tela_botanica.del.client.modeles.Commentaire;
import org.tela_botanica.del.client.modeles.Contributeur;
import org.tela_botanica.del.client.modeles.EvenementObs;
29,12 → 30,14
import org.tela_botanica.del.client.modeles.VoteProtocole;
 
import com.google.gwt.core.shared.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Window;
 
/**
* Centralisation des methodes de parsing du code JSON retourné par les
491,7 → 494,6
String courrielUtilisateur = utilisateurJson.get("courriel").isString().stringValue();
String nomUtilisateur = utilisateurJson.get("nom").isString().stringValue();
String prenomUtilisateur = utilisateurJson.get("prenom").isString().stringValue();
String mdpHashUtilisateur = utilisateurJson.get("mot_de_passe").isString().stringValue();
String adminNiveau = "";
if (utilisateurJson.get("admin").isString() != null) {
502,7 → 504,7
String dateDerniereConsultationEvts = utilisateurJson.get("date_derniere_consultation_evenements").isString().stringValue();
 
utilisateur = new Utilisateur(sessionId, idUtilisateur, prenomUtilisateur, nomUtilisateur,
courrielUtilisateur, mdpHashUtilisateur, adminNiveau);
courrielUtilisateur, adminNiveau);
ActiviteUtilisateur activite = new ActiviteUtilisateur();
activite.setNbEvenements(nbEvtsUtilisateur);
514,6 → 516,61
}
return utilisateur;
}
 
/**
* Recupere des informations d'authentification à partir du JSON renvoyé par les
* services Auth de l'annuaire (SSO)
*
* @param valeurJson
* @return AuthInfo
*/
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();
}
}
}
}
//GWT.log(valeurJson.toString());
return authInfo;
}
/**
* Recupere un utilisateur à partir du JSON
/trunk/src/org/tela_botanica/del/client/services/rest/async/PHPCallback.java
29,6 → 29,7
protected ModeRequete mode;
 
public PHPCallback() {
this.mode = ModeRequete.LECTURE;
}
 
public void setMode(ModeRequete mode) {
56,10 → 57,10
codeAttendu = Arrays.asList(500);
break;
}
GWT.log("Codes attendus:"+codeAttendu.toString());
GWT.log("Code:"+statusCode);
if (codeAttendu.contains(statusCode)) {
GWT.log("Code: OK");
//GWT.log("Codes attendus:"+codeAttendu.toString());
//GWT.log("Code:"+statusCode);
if (codeAttendu != null && codeAttendu.contains(statusCode)) {
//GWT.log("Code: OK");
try {
T reponseParsee = parserJSON(response.getText());
surRetour(reponseParsee);
/trunk/src/org/tela_botanica/del/client/services/rest/async/AuthCallback.java
New file
0,0 → 1,20
package org.tela_botanica.del.client.services.rest.async;
 
import org.tela_botanica.del.client.modeles.AuthInfo;
import org.tela_botanica.del.client.utils.UtilitairesServiceResultat;
 
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.user.client.Window;
 
/**
* Retour des services annuaire:auth : connexion, deconnexion, identite - un jeton
* JWT si identifié, false sinon
*/
public abstract class AuthCallback extends PHPCallback<AuthInfo> {
 
@Override
public AuthInfo parserJSON(String retourService) {
AuthInfo authInfo = UtilitairesServiceResultat.parserAuthJson(JSONParser.parseStrict(retourService));
return authInfo;
}
}
/trunk/src/org/tela_botanica/del/client/services/rest/async/UtilisateurCallback.java
4,6 → 4,7
import org.tela_botanica.del.client.utils.UtilitairesServiceResultat;
 
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.user.client.Window;
 
/**
* Objet passé en paramètre d'un service de recuperation d'un utilisateur
14,7 → 15,9
 
@Override
public Utilisateur parserJSON(String retourService) {
return UtilitairesServiceResultat.parserUtilisateurJson(JSONParser.parseStrict(retourService));
Utilisateur util = UtilitairesServiceResultat.parserUtilisateurJson(JSONParser.parseStrict(retourService));
return util;
}
 
}
/trunk/src/org/tela_botanica/del/client/services/rest/UtilisateurServiceConcret.java
1,15 → 1,21
package org.tela_botanica.del.client.services.rest;
 
import org.tela_botanica.del.client.config.Config;
import org.tela_botanica.del.client.modeles.AuthInfo;
import org.tela_botanica.del.client.modeles.Utilisateur;
import org.tela_botanica.del.client.services.rest.async.ActiviteUtilisateurCallback;
import org.tela_botanica.del.client.services.rest.async.AuthCallback;
import org.tela_botanica.del.client.services.rest.async.UtilisateurCallback;
import org.tela_botanica.del.client.services.rest.async.PHPCallback.ModeRequete;
 
import org.tela_botanica.del.client.services.RequestBuilderWithCredentials;
 
import com.google.gwt.core.shared.GWT;
import com.google.gwt.user.client.Window;
 
public class UtilisateurServiceConcret implements UtilisateurService {
private String baseUrl;
private String authBaseUrl;
public UtilisateurServiceConcret() {
this(new Config());
17,34 → 23,110
public UtilisateurServiceConcret(Config config) {
this.baseUrl = config.getUrl("serviceUtilisateursBaseUrl");
this.authBaseUrl = config.getUrl("serviceAuthBaseUrl");
}
 
/**
* Connecte l'utilisateur en appelant l'annuaire (auth::connexion, SSO), puis enchaîne avec
* le service "utilisateur" de Del, pour retourner les infos requises par l'interface
*/
@Override
public void connecterUtilisateur(String login, String motDePasse, UtilisateurCallback callback) {
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/" + login + "/" + motDePasse);
callback.setMode(ModeRequete.LECTURE);
public void connecterUtilisateur(String login, String motDePasse, final UtilisateurCallback callback) {
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "connexion?login=" + login + "&password=" + motDePasse);
try {
rb.sendRequest(null, callback);
// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
rb.sendRequest(null, new AuthCallback() {
public void surErreur(String message) {
// merci, de rien, au revoir messieurs-dames
callback.surErreur("");
}
@Override
public void surRetour(AuthInfo objetRetour) {
// Stockage du jeton
Utilisateur.setJeton(objetRetour.token);
// Obtention de l'utilisateur final d'après le service de préférences
obtenirUtilisateurSansAnnuaire(callback); // RequestBulledair passe le jeton dans les headers HTTP
}
});
} catch (Exception e) {
// TODO: handle exception
Window.alert("Exception : " + e.getMessage());
}
}
 
/**
* Déconnecte l'utilisateur en appelant l'annuaire (auth::deconnexion, SSO), puis enchaîne avec
* le service "utilisateur" de Del, pour retourner les infos requises par l'interface
*/
@Override
public void deconnecterUtilisateur(UtilisateurCallback callback) {
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/deconnecter");
callback.setMode(ModeRequete.LECTURE);
public void deconnecterUtilisateur(final UtilisateurCallback callback) {
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "deconnexion");
try {
rb.sendRequest(null, callback);
// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
rb.sendRequest(null, new AuthCallback() {
public void surErreur(String message) {
callback.surErreur("");
}
@Override
public void surRetour(AuthInfo objetRetour) {
// Stockage du jeton, qui devrait être NULL (mais on sait jamais à l'avenir)
Utilisateur.setJeton(objetRetour.token);
// Obtention du pseudo-utilisateur non connecté (id de session) d'après le service de préférences
obtenirUtilisateurSansAnnuaire(callback);
}
});
} catch (Exception e) {
// TODO: handle exception
GWT.log("Exception : " + e.getMessage());
}
}
 
/**
* Va chercher les infos de l'utilisateur en vérifiant d'abord l'identité auprès de l'annuaire
* @param callback
*/
@Override
public void obtenirUtilisateur(UtilisateurCallback callback) {
obtenirUtilisateur(callback, 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)
* @param callback
*/
@Override
public void obtenirUtilisateur(final UtilisateurCallback callback, 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) {
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "identite");
try {
rb.sendRequest(null, new AuthCallback() {
public void surErreur(String message) {
// Même si l'annuaire n'est pas content, on va chercher un profil utilisateur "anonyme"
obtenirUtilisateurSansAnnuaire(callback);
}
@Override
public void surRetour(AuthInfo objetRetour) {
// Stockage du jeton rafraîchi
Utilisateur.setJeton(objetRetour.token);
// Obtention de l'utilisateur final d'après le service de préférences
obtenirUtilisateurSansAnnuaire(callback);
}
});
} catch (Exception e) {
// TODO: handle exception
}
} else { // sinon on optimise, quand on vient de se (de)connecter, pas la peine de rappeler l'annuaire
obtenirUtilisateurSansAnnuaire(callback);
}
}
 
/**
* Va chercher les infos de l'utilisateur sans vérifier l'identité auprès de l'annuaire
* @param callback
*/
public void obtenirUtilisateurSansAnnuaire(UtilisateurCallback callback) {
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/");
callback.setMode(ModeRequete.LECTURE);
try {
rb.sendRequest(null, callback);
} catch (Exception e) {
55,7 → 137,6
@Override
public void obtenirActiviteUtilisateur(String idUtilisateur, ActiviteUtilisateurCallback callback) {
RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/"+idUtilisateur+"/activite");
callback.setMode(ModeRequete.LECTURE);
try {
rb.sendRequest(null, callback);
} catch (Exception e) {
/trunk/src/org/tela_botanica/del/client/services/rest/UtilisateurService.java
8,5 → 8,6
public void connecterUtilisateur(String login, String motDePasse, UtilisateurCallback callback);
public void deconnecterUtilisateur(UtilisateurCallback callback);
public void obtenirUtilisateur(UtilisateurCallback callback);
public void obtenirUtilisateur(UtilisateurCallback callback, boolean ignorerAnnuaire);
public void obtenirActiviteUtilisateur(String idUtilisateur, ActiviteUtilisateurCallback callback);
}
/trunk/src/org/tela_botanica/del/client/services/RequestBuilderWithCredentials.java
1,5 → 1,7
package org.tela_botanica.del.client.services;
 
import org.tela_botanica.del.client.modeles.Utilisateur;
 
import com.google.gwt.http.client.RequestBuilder;
 
public class RequestBuilderWithCredentials extends RequestBuilder {
6,6 → 8,9
 
public RequestBuilderWithCredentials(Method httpMethod, String url) {
super(httpMethod, url);
if(Utilisateur.getJeton() != null && ! Utilisateur.getJeton().isEmpty()) {
this.setHeader("Authorization", Utilisateur.getJeton());
}
this.setIncludeCredentials(true);
}
}
/trunk/src/org/tela_botanica/del/client/config/Config.java
46,6 → 46,7
urls.put("profil", configuration.get("profilUrl"));
urls.put("images", configuration.get("imagesUrl"));
urls.put("serviceUtilisateursBaseUrl", configuration.get("serviceUtilisateursBaseUrl"));
urls.put("serviceAuthBaseUrl", configuration.get("serviceAuthBaseUrl"));
 
infos.put("popupOptions", "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes");
}
/trunk/src/org/tela_botanica/del/client/composants/formulaires/identification/identification.css
52,7 → 52,7
.erreur {
color: red;
position:absolute;
margin-top:13px;
margin-top:7px;
}
 
.boutonOK {
/trunk/src/org/tela_botanica/del/client/modeles/Utilisateur.java
13,7 → 13,6
private String nom = "";
private String prenom = "";
private String courriel = "";
private String motDePasseHash = "";
private String id = "0";
private String sessionId = "";
private String adminNiveau = "0";
22,31 → 21,24
// TODO: avoir une liste d'activités avec des types différents
private ActiviteUtilisateur activiteUtilisateur = new ActiviteUtilisateur();
 
// Jeton encodé en base64 passé de manière automatique aux services dans un header
private static String jeton = "";
 
public Utilisateur(String sessionId, String id) {
this.id = id;
this.sessionId = sessionId;
}
public Utilisateur(String sessionId, String id, String prenom, String nom, String courriel,
String motDePasseHash, String adminNiveau) {
public Utilisateur(String sessionId, String id, String prenom, String nom, String courriel, String adminNiveau) {
this(sessionId, id);
this.prenom = prenom;
this.nom = nom;
this.courriel = courriel;
this.motDePasseHash = motDePasseHash;
this.adminNiveau = adminNiveau;
identifie = true;
}
public String getMotDePasseHash() {
return motDePasseHash;
}
public void setMotDePasseHash(String motDePasseHash) {
this.motDePasseHash = motDePasseHash;
}
public String getNom() {
return nom;
}
99,7 → 91,7
}
public String toString() {
String utilisateur = id + "\n" + nom + "\n" + prenom + "\n" + courriel + "\n" + motDePasseHash + "\n" +
String utilisateur = id + "\n" + nom + "\n" + prenom + "\n" + courriel + "\n" +
sessionId + "\n" + adminNiveau + "\n";
return utilisateur;
}
111,4 → 103,12
public ActiviteUtilisateur getActivite() {
return this.activiteUtilisateur;
}
 
public static String getJeton() {
return jeton;
}
 
public static void setJeton(String jeton) {
Utilisateur.jeton = jeton;
}
}
/trunk/src/org/tela_botanica/del/client/modeles/AuthInfo.java
New file
0,0 → 1,30
package org.tela_botanica.del.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);
}
}