/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/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/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/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/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/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); |
} |
} |
/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 |