Subversion Repositories eFlore/Applications.coel

Rev

Rev 1732 | Rev 1908 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
64 jpm 1
package org.tela_botanica.client.modeles;
2
 
1906 mathias 3
import java.util.HashMap;
4
 
5
import org.tela_botanica.client.Coel;
64 jpm 6
import org.tela_botanica.client.RegistreId;
772 jpm 7
import org.tela_botanica.client.http.JsonRestRequestBuilder;
8
import org.tela_botanica.client.http.JsonRestRequestCallback;
64 jpm 9
import org.tela_botanica.client.interfaces.Rafraichissable;
346 gduche 10
import org.tela_botanica.client.util.UtilDAO;
64 jpm 11
 
12
import com.extjs.gxt.ui.client.Registry;
1906 mathias 13
import com.google.gwt.http.client.Request;
14
import com.google.gwt.http.client.Response;
64 jpm 15
import com.google.gwt.json.client.JSONArray;
16
import com.google.gwt.json.client.JSONBoolean;
1906 mathias 17
import com.google.gwt.json.client.JSONNumber;
18
import com.google.gwt.json.client.JSONObject;
64 jpm 19
import com.google.gwt.json.client.JSONString;
20
import com.google.gwt.json.client.JSONValue;
1906 mathias 21
import com.google.gwt.user.client.Timer;
64 jpm 22
 
268 jp_milcent 23
/**
24
 * Modele DAO, specifique, permettant la validation, l'acces aux donnees distantes et la présentation des donnees en retour
25
 *
26
 */
69 jpm 27
public class UtilisateurAsyncDao {
268 jp_milcent 28
	private static final String SERVICE_NOM = "CoelUtilisateur";
29
 
65 jpm 30
	private Utilisateur utilisateur = null;
358 jp_milcent 31
	private Rafraichissable vueARafraichir = null;
1906 mathias 32
 
33
	private static Timer rafraichisseurJeton = null;
64 jpm 34
 
35
	/**
36
	 * Constructeur
37
	 * @param retour : méthode appellée en retour d'appel.
38
	 */
772 jpm 39
	public UtilisateurAsyncDao(Rafraichissable vueARafraichirCourrante) {
40
		vueARafraichir = vueARafraichirCourrante;
277 jp_milcent 41
		utilisateur = (Utilisateur) Registry.get(RegistreId.UTILISATEUR_COURANT);
64 jpm 42
	}
1906 mathias 43
 
64 jpm 44
	/**
1906 mathias 45
	 * Recupere des informations d'authentification à partir du JSON renvoyé par les
46
	 * services Auth de l'annuaire (SSO)
47
	 *
48
	 * @param valeurJson
49
	 * @return AuthInfo
64 jpm 50
	 */
1906 mathias 51
	public static AuthInfo parserAuthJson(JSONValue valeurJson) {
52
		AuthInfo authInfo = new AuthInfo();
53
		JSONObject authJson = valeurJson.isObject();
54
 
55
		JSONValue erreurJSON = authJson.get("error");
56
		// test si erreur
57
		if (erreurJSON != null) {
58
			JSONString erreur = erreurJSON.isString();
59
			if (erreur != null) {
60
				authInfo.error = erreur.stringValue();
61
			} else {
62
				authInfo.error = "erreur d'authentification";
63
			}
64
		} else {
65
			boolean session = authJson.get("session").isBoolean().booleanValue();
66
			authInfo.session = session;
67
			// test si session ouverte
68
			if (session) {
69
				JSONValue tokenJson = authJson.get("token");
70
				String token = null;
71
				// protection paranoïaque
72
				if (tokenJson != null) {
73
					JSONString tokenString = tokenJson.isString();
74
					if (tokenString != null) {
75
						token = tokenString.stringValue();
76
					}
64 jpm 77
				}
1906 mathias 78
				String tokenId = authJson.get("token_id").isString().stringValue();
79
				int duration = (int) authJson.get("duration").isNumber().doubleValue();
80
				JSONValue lastModifJson = authJson.get("last_modif");
81
 
82
				authInfo.token = token;
83
				authInfo.tokenId = tokenId;
84
				authInfo.duration = duration;
85
				// test si lastModif est null
86
				if (lastModifJson != null) {
87
					JSONNumber lastModif = lastModifJson.isNumber();
88
					if (lastModif != null) {
89
						authInfo.lastModif = (int) lastModif.doubleValue();
90
					}
91
				}
772 jpm 92
			}
1906 mathias 93
		}
94
 
95
		return authInfo;
64 jpm 96
	}
97
 
98
	/**
1906 mathias 99
	 * Enregistre le jeton (potentiellement NULL), sa durée de vie; appelle le service Coel pour
100
	 * obtenir les données de l'utilisateur relatives à l'application; lorsque le jeton
101
	 * n'est pas nul et que sa durée de vie est spécifiée, déclenche un rafraîchissement
102
	 * périodique du jeton
103
	 *
104
	 * @param objetRetour le retour de l'appel au service annuaire:auth (connexion, deconnexion ou identite)
105
	 */
106
	protected void gererRetourAuthInfo(AuthInfo objetRetour) {
107
		// Stockage du jeton rafraîchi et de sa durée (pourrait avoir changé)
108
		Utilisateur.setJeton(objetRetour.token);
109
		Utilisateur.setDureeJeton(objetRetour.duration);
110
 
111
		// Rafraîchissement automatique du jeton - s'annule lorsque le jeton devient nul
112
		if (Utilisateur.getJeton() != null && Utilisateur.getDureeJeton() > 0) {
113
			if (rafraichisseurJeton == null) { // on sait jamais
114
				// 3/4 de la durée de vie du jeton, en millisecondes (ça laisse de la marge)
115
				int delaiRepetition = (Utilisateur.getDureeJeton() * 1000) * 3 / 4;
116
				delaiRepetition = 10000; // debug
117
				rafraichisseurJeton = new Timer() {
118
					@Override
119
					public void run() {
120
						//Coel.LogVersFirebug("rafraichir utilisateur");
121
						// Appel de l'annuaire pour rafraîchir le jeton (cb nul pour l'instant)
122
						getEtatUtilisateur();
123
					}
124
				};
125
				rafraichisseurJeton.scheduleRepeating(delaiRepetition);
126
			}
127
		} else {
128
			if (rafraichisseurJeton != null) { // on sait jamais non plus
129
				rafraichisseurJeton.cancel();
130
				rafraichisseurJeton = null;
131
			}
132
		}
133
 
134
		// Obtention de l'utilisateur final d'après le service de préférences
135
		//Coel.LogVersFirebug("va chercher utilisateur Coel");
136
		getEtatUtilisateurSansAnnuaire();
137
	}
138
 
139
	/**
64 jpm 140
	 * Méthode déconnectant un utilisateur de l'application.
141
	 * @param identifiant de l'utilisateur à déconnecter.
142
	 */
65 jpm 143
	public void deconnecterUtilisateur() {
1906 mathias 144
		//Coel.LogVersFirebug("deconnexion");
145
		final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("deconnexion", null);
772 jpm 146
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
147
			@Override
148
			public void surReponse(JSONValue responseValue) {
1906 mathias 149
				//Coel.LogVersFirebug(responseValue.toString());
150
				AuthInfo info = parserAuthJson(responseValue);
151
				gererRetourAuthInfo(info);
772 jpm 152
			}
153
		});
64 jpm 154
	}
155
 
156
	/**
1906 mathias 157
	 * Méthode connectant un utilisateur à l'application
64 jpm 158
	 */
772 jpm 159
	public void connecterUtilisateur() {
1906 mathias 160
		HashMap<String, String> parametres = new HashMap<String, String>();
161
		parametres.put("login", utilisateur.getLogin());
162
		parametres.put("password", utilisateur.getMotDePasse());
163
		//Coel.LogVersFirebug("connexion");
164
		final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("connexion", parametres);
65 jpm 165
 
772 jpm 166
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
167
			@Override
168
			public void surReponse(JSONValue responseValue) {
1906 mathias 169
				AuthInfo info = parserAuthJson(responseValue);
170
				gererRetourAuthInfo(info);
171
			}
172
		});
173
	}
174
 
175
	/**
176
	 * Va chercher les infos de l'utilisateur en vérifiant d'abord l'identité auprès de l'annuaire
177
	 */
178
	public void getEtatUtilisateur() {
179
		getEtatUtilisateur(false);
180
	}
181
 
182
	/**
183
	 * Va chercher les infos de l'utilisateur; si ignorerAnnuaire est false, vérifiera d'abord
184
	 * l'identité auprès de l'annuaire (service annuaire:auth/identite)
185
	 */
186
	public void getEtatUtilisateur(boolean ignorerAnnuaire) {
187
		// par défaut, on appelle d'abord le service auth/identite de l'annuaire, afin de connaître
188
		// le statut de l'utilisateur vis à vis du SSO (connecté ou non) et rafraîchir le jeton
189
		if (! ignorerAnnuaire) {
190
			//Coel.LogVersFirebug("get état");
191
			// sans header Authorization, sinon une déconnexion depuis une autre appli ne sera pas
192
			// prise en compte et le jeton sera rafraîchi indéfiniment
193
			final JsonRestRequestBuilder rb = UtilDAO.construireRequeteAuth("identite", null, false);
194
			rb.envoyerRequete(null, new JsonRestRequestCallback() {
195
				@Override
196
				public void surReponse(JSONValue responseValue) {
197
					AuthInfo info = parserAuthJson(responseValue);
198
					gererRetourAuthInfo(info);
199
				}
200
				@Override
201
				public void onErrorHTTP(Request request, Response reponse) {
202
					// Si on a été déconnecté, on va chercher un profil utilisateur "anonyme" et
203
					// on avertit l'interface
204
					gererRetourAuthInfo(new AuthInfo());
205
				}
206
			});
207
		} else { // sinon on optimise, quand on vient de se (de)connecter, pas la peine de rappeler l'annuaire
208
			getEtatUtilisateurSansAnnuaire();
209
		}
210
	}
211
 
212
	/**
213
	 * Va chercher les infos de l'utilisateur Coel sans vérifier l'identité auprès de l'annuaire;
214
	 * transmet un jeton SSO à chaque fois pour que le service se base dessus
215
	 */
216
	public void getEtatUtilisateurSansAnnuaire() {
217
		final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM);
218
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
219
			@Override
220
			public void surReponse(JSONValue responseValue) {
221
				//Coel.LogVersFirebug("réponse reçue");
222
				JSONArray reponse = responseValue.isArray();
223
				if (reponse != null) {
224
					// Identifiant utilisateur ou identifiant de session si non identifié
225
					String login = ((JSONString) reponse.get(1)).stringValue();
226
 
227
					// Drapeau leve si utilisateur deja identifié
228
					boolean identifie = ((JSONBoolean) reponse.get(2)).booleanValue();
229
 
230
					utilisateur.setIdentification(identifie);
231
					utilisateur.setLogin(login);
232
 
897 gduche 233
					//Ajout des informations licence
1197 jpm 234
					if (reponse.get(0).isString() != null)	{
235
						utilisateur.setLicence(reponse.get(0).isString().stringValue());
897 gduche 236
					} else {
237
						utilisateur.setLicence("");
238
					}
1906 mathias 239
 
240
					//Coel.LogVersFirebug("Utilisateur CoeL chargé !!");
241
					//Coel.LogVersFirebug("id: " + identifie + ", login: " + login + ", licence: " + utilisateur.getLicence());
242
					//Coel.LogVersFirebug("Taille réponse:" + reponse.size());
243
 
244
					// Utilisateur connecté (non anonyme)
245
					if (reponse.size() > 3) {
246
						//Coel.LogVersFirebug("Utilisateur identifié, on charge plus de trucs !");
772 jpm 247
						// Identifiant de l'utilisateur ou identifiant de session si non identifié
1906 mathias 248
						String idUtilisateur = ((JSONString) reponse.get(1)).stringValue();
249
						//Coel.LogVersFirebug("ID utilisateur: " + idUtilisateur);
250
						utilisateur.setId(idUtilisateur);
251
 
252
						// Nom complet de l'utilisateur
253
						if (reponse.get(3).isString() != null) {
254
							String nomComplet = ((JSONString) reponse.get(3)).stringValue();
255
							//Coel.LogVersFirebug("Nom complet: " + nomComplet);
256
							utilisateur.setNomComplet(nomComplet);
132 jpm 257
						}
1906 mathias 258
						// Prénom de l'utilisateur
259
						if (reponse.get(4).isString() != null) {
260
							String prenom = ((JSONString) reponse.get(4)).stringValue();
261
							utilisateur.setPrenom(prenom);
262
							//Coel.LogVersFirebug("Prénom: " + prenom);
263
						}
264
						// Nom de l'utilisateur
265
						if (reponse.get(5).isString() != null) {
266
							String nom = ((JSONString) reponse.get(5)).stringValue();
267
							utilisateur.setNom(nom);
268
							//Coel.LogVersFirebug("Nom: " + nom);
269
						}
270
						// Paramètre => was ist das ?
271
						if (reponse.get(6).isString() != null) {
272
							String parametre = ((JSONString) reponse.get(6)).stringValue();
273
							utilisateur.setParametre(parametre);
274
							//Coel.LogVersFirebug("Paramètre: " + parametre);
275
						}
358 jp_milcent 276
					}
1906 mathias 277
 
278
					//Coel.LogVersFirebug("Rafraîchissement vue");
279
					vueARafraichir.rafraichir(utilisateur);
64 jpm 280
				}
772 jpm 281
			}
282
		});
64 jpm 283
	}
1906 mathias 284
 
285
	/**
286
	 * @TODO CHANGER ÇA !
287
	 */
897 gduche 288
	public void accepterLicence()	{
289
		String[] parametres = {utilisateur.getLogin(), utilisateur.getMotDePasse(), utilisateur.getId()};
290
 
291
		final JsonRestRequestBuilder rb = UtilDAO.construireRequete(SERVICE_NOM, parametres);
292
		rb.envoyerRequete(null, new JsonRestRequestCallback() {
293
			@Override
294
			public void surReponse(JSONValue responseValue) {
295
				if (responseValue.isArray() != null) {
296
					final JSONArray reponse = responseValue.isArray();
1329 cyprien 297
					if (reponse.get(0).isString() != null)	{
298
						String licenceAcceptee = reponse.get(0).isString().stringValue();
897 gduche 299
						Information info = new Information("maj_licence");
300
						info.setDonnee(0, licenceAcceptee);
301
						vueARafraichir.rafraichir(info);
302
					}
303
				}
304
			}
305
		});
306
	}
307
}