Subversion Repositories eFlore/Applications.del

Rev

Rev 2078 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2078 Rev 2087
1
package org.tela_botanica.del.client.services.rest;
1
package org.tela_botanica.del.client.services.rest;
-
 
2
 
2
 
3
import org.tela_botanica.del.client.Del;
3
import org.tela_botanica.del.client.config.Config;
4
import org.tela_botanica.del.client.config.Config;
4
import org.tela_botanica.del.client.modeles.AuthInfo;
5
import org.tela_botanica.del.client.modeles.AuthInfo;
5
import org.tela_botanica.del.client.modeles.Utilisateur;
6
import org.tela_botanica.del.client.modeles.Utilisateur;
6
import org.tela_botanica.del.client.services.rest.async.ActiviteUtilisateurCallback;
7
import org.tela_botanica.del.client.services.rest.async.ActiviteUtilisateurCallback;
7
import org.tela_botanica.del.client.services.rest.async.AuthCallback;
8
import org.tela_botanica.del.client.services.rest.async.AuthCallback;
8
import org.tela_botanica.del.client.services.rest.async.UtilisateurCallback;
9
import org.tela_botanica.del.client.services.rest.async.UtilisateurCallback;
9
import org.tela_botanica.del.client.services.rest.async.PHPCallback.ModeRequete;
10
import org.tela_botanica.del.client.services.rest.async.PHPCallback.ModeRequete;
10
import org.tela_botanica.del.client.services.RequestBuilderWithCredentials;
11
import org.tela_botanica.del.client.services.RequestBuilderWithCredentials;
11
import org.tela_botanica.del.client.utils.StringUtils;
12
import org.tela_botanica.del.client.utils.StringUtils;
12
 
13
 
13
import com.google.gwt.core.shared.GWT;
14
import com.google.gwt.core.shared.GWT;
14
import com.google.gwt.user.client.Window;
15
import com.google.gwt.user.client.Window;
15
import com.google.gwt.user.client.Timer;
16
import com.google.gwt.user.client.Timer;
16
 
17
 
17
public class UtilisateurServiceConcret implements UtilisateurService {
18
public class UtilisateurServiceConcret implements UtilisateurService {
18
	
19
	
19
	private String baseUrl;
20
	private String baseUrl;
20
	private String authBaseUrl;
21
	private String authBaseUrl;
21
 
22
 
22
	private static Timer rafraichisseurJeton = null;
23
	private static Timer rafraichisseurJeton = null;
23
	
24
	
24
	public UtilisateurServiceConcret() {
25
	public UtilisateurServiceConcret() {
25
		this(new Config());
26
		this(new Config());
26
	}
27
	}
27
	
28
	
28
	public UtilisateurServiceConcret(Config config) {
29
	public UtilisateurServiceConcret(Config config) {
29
		this.baseUrl = config.getUrl("serviceUtilisateursBaseUrl");
30
		this.baseUrl = config.getUrl("serviceUtilisateursBaseUrl");
30
		this.authBaseUrl = config.getUrl("serviceAuthBaseUrl");
31
		this.authBaseUrl = config.getUrl("serviceAuthBaseUrl");
31
	}
32
	}
32
 
33
 
33
	/**
34
	/**
34
	 * Connecte l'utilisateur en appelant l'annuaire (auth::connexion, SSO), puis enchaîne avec
35
	 * Connecte l'utilisateur en appelant l'annuaire (auth::connexion, SSO), puis enchaîne avec
35
	 * le service "utilisateur" de Del, pour retourner les infos requises par l'interface
36
	 * le service "utilisateur" de Del, pour retourner les infos requises par l'interface
36
	 */
37
	 */
37
	@Override
38
	@Override
38
	public void connecterUtilisateur(String login, String motDePasse, final UtilisateurCallback callback) {
39
	public void connecterUtilisateur(String login, String motDePasse, final UtilisateurCallback callback) {
39
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "connexion?login=" + login + "&password=" + motDePasse);
40
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "connexion?login=" + login + "&password=" + motDePasse);
40
		try {
41
		try {
41
			// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
42
			// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
42
			rb.sendRequest(null, new AuthCallback() {
43
			rb.sendRequest(null, new AuthCallback() {
43
				public void surErreur(String message) {
44
				public void surErreur(String message) {
44
					// merci, de rien, au revoir messieurs-dames
45
					// merci, de rien, au revoir messieurs-dames
45
					callback.surErreur("");
46
					callback.surErreur("");
46
				}
47
				}
47
				@Override
48
				@Override
48
				public void surRetour(AuthInfo objetRetour) {
49
				public void surRetour(AuthInfo objetRetour) {
49
					gererRetourAuthInfo(objetRetour, callback);
50
					gererRetourAuthInfo(objetRetour, callback);
50
				}
51
				}
51
			});
52
			});
52
		} catch (Exception e) {
53
		} catch (Exception e) {
53
			Window.alert("Exception : " + e.getMessage());
54
			Window.alert("Exception : " + e.getMessage());
54
		}
55
		}
55
	}
56
	}
56
 
57
 
57
	/**
58
	/**
58
	 * Déconnecte l'utilisateur en appelant l'annuaire (auth::deconnexion, SSO), puis enchaîne avec
59
	 * Déconnecte l'utilisateur en appelant l'annuaire (auth::deconnexion, SSO), puis enchaîne avec
59
	 * le service "utilisateur" de Del, pour retourner les infos requises par l'interface
60
	 * le service "utilisateur" de Del, pour retourner les infos requises par l'interface
60
	 */
61
	 */
61
	@Override
62
	@Override
62
	public void deconnecterUtilisateur(final UtilisateurCallback callback) {
63
	public void deconnecterUtilisateur(final UtilisateurCallback callback) {
63
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "deconnexion");
64
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "deconnexion");
64
		try {
65
		try {
65
			// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
66
			// Callback intermédiaire qui lit les infos de l'annuaire et appelle le service de préférences
66
			rb.sendRequest(null, new AuthCallback() {
67
			rb.sendRequest(null, new AuthCallback() {
67
				public void surErreur(String message) {
68
				public void surErreur(String message) {
68
					callback.surErreur("");
69
					callback.surErreur("");
69
				}
70
				}
70
				@Override
71
				@Override
71
				public void surRetour(AuthInfo objetRetour) {
72
				public void surRetour(AuthInfo objetRetour) {
72
					gererRetourAuthInfo(objetRetour, callback);
73
					gererRetourAuthInfo(objetRetour, callback);
73
				}
74
				}
74
			});
75
			});
75
		} catch (Exception e) {
76
		} catch (Exception e) {
76
			GWT.log("Exception : " + e.getMessage());
77
			GWT.log("Exception : " + e.getMessage());
77
		}
78
		}
78
	}
79
	}
79
 
80
 
80
	/**
81
	/**
81
	 * Va chercher les infos de l'utilisateur en vérifiant d'abord l'identité auprès de l'annuaire
82
	 * Va chercher les infos de l'utilisateur en vérifiant d'abord l'identité auprès de l'annuaire
82
	 * @param callback
83
	 * @param callback
83
	 */
84
	 */
84
	@Override
85
	@Override
85
	public void obtenirUtilisateur(UtilisateurCallback callback) {
86
	public void obtenirUtilisateur(UtilisateurCallback callback) {
86
		obtenirUtilisateur(callback, false);
87
		obtenirUtilisateur(callback, false);
87
	}
88
	}
88
 
89
 
89
	/**
90
	/**
90
	 * Va chercher les infos de l'utilisateur; si ignorerAnnuaire est false, vérifiera d'abord
91
	 * Va chercher les infos de l'utilisateur; si ignorerAnnuaire est false, vérifiera d'abord
91
	 * l'identité auprès de l'annuaire (service annuaire:auth/identite)
92
	 * l'identité auprès de l'annuaire (service annuaire:auth/identite)
92
	 * @param callback
93
	 * @param callback
93
	 */
94
	 */
94
	@Override
95
	@Override
95
	public void obtenirUtilisateur(final UtilisateurCallback callback, boolean ignorerAnnuaire) {
96
	public void obtenirUtilisateur(final UtilisateurCallback callback, boolean ignorerAnnuaire) {
96
		// par défaut, on appelle d'abord le service auth/identite de l'annuaire, afin de connaître
97
		// par défaut, on appelle d'abord le service auth/identite de l'annuaire, afin de connaître
97
		// le statut de l'utilisateur vis à vis du SSO (connecté ou non) et rafraîchir le jeton
98
		// le statut de l'utilisateur vis à vis du SSO (connecté ou non) et rafraîchir le jeton
98
		if (! ignorerAnnuaire) {
99
		if (! ignorerAnnuaire) {
-
 
100
			// ne transmet pas le header Authorization, sans quoi l'annuaire rafraîchit le
-
 
101
			// jeton mis en cache et on ne peut pas se déconnecter depuis une autre application
99
			RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "identite");
102
			RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, authBaseUrl + "identite", false);
100
			try {
103
			try {
101
				rb.sendRequest(null, new AuthCallback() {
104
				rb.sendRequest(null, new AuthCallback() {
102
					public void surErreur(String message) {
105
					public void surErreur(String message) {
103
						// Même si l'annuaire n'est pas content, on va chercher un profil utilisateur "anonyme"
106
						// Si l'annuaire n'est pas content (déconnecté depuis ailleurs ou jeton expiré), on va
-
 
107
						// chercher un profil utilisateur "anonyme" et on déconnecte dans l'interface
104
						obtenirUtilisateurSansAnnuaire(callback);
108
						gererRetourAuthInfo(new AuthInfo(), callback);
105
					}
109
					}
106
					@Override
110
					@Override
107
					public void surRetour(AuthInfo objetRetour) {
111
					public void surRetour(AuthInfo objetRetour) {
108
						gererRetourAuthInfo(objetRetour, callback);
112
						gererRetourAuthInfo(objetRetour, callback);
109
					}
113
					}
110
				});
114
				});
111
			} catch (Exception e) {
115
			} catch (Exception e) {
112
				// TODO: handle exception
116
				// TODO: handle exception
113
			}
117
			}
114
		} else { // sinon on optimise, quand on vient de se (de)connecter, pas la peine de rappeler l'annuaire
118
		} else { // sinon on optimise, quand on vient de se (de)connecter, pas la peine de rappeler l'annuaire
115
			obtenirUtilisateurSansAnnuaire(callback);
119
			obtenirUtilisateurSansAnnuaire(callback);
116
		}
120
		}
117
	}
121
	}
118
 
122
 
119
	/**
123
	/**
120
	 * Va chercher les infos de l'utilisateur sans vérifier l'identité auprès de l'annuaire
124
	 * Va chercher les infos de l'utilisateur sans vérifier l'identité auprès de l'annuaire
121
	 * @param callback
125
	 * @param callback
122
	 */
126
	 */
123
	public void obtenirUtilisateurSansAnnuaire(UtilisateurCallback callback) {
127
	public void obtenirUtilisateurSansAnnuaire(UtilisateurCallback callback) {
124
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/");
128
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/");
125
		try {
129
		try {
126
			rb.sendRequest(null, callback);
130
			rb.sendRequest(null, callback);
127
		} catch (Exception e) {
131
		} catch (Exception e) {
128
			// TODO: handle exception
132
			// TODO: handle exception
129
		}
133
		}
130
	}
134
	}
131
 
135
 
132
	@Override
136
	@Override
133
	public void obtenirActiviteUtilisateur(String idUtilisateur, ActiviteUtilisateurCallback callback) {
137
	public void obtenirActiviteUtilisateur(String idUtilisateur, ActiviteUtilisateurCallback callback) {
134
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/"+idUtilisateur+"/activite");
138
		RequestBuilderWithCredentials rb = new RequestBuilderWithCredentials(RequestBuilderWithCredentials.GET, baseUrl + "utilisateurs/"+idUtilisateur+"/activite");
135
		try {
139
		try {
136
			rb.sendRequest(null, callback);
140
			rb.sendRequest(null, callback);
137
		} catch (Exception e) {
141
		} catch (Exception e) {
138
			// TODO: handle exception
142
			// TODO: handle exception
139
		}
143
		}
140
	}
144
	}
141
 
145
 
142
	/**
146
	/**
143
	 * Enregistre le jeton (potentiellement NULL), sa durée de vie, et appelle
147
	 * Enregistre le jeton (potentiellement NULL), sa durée de vie, et appelle
144
	 * le service Del pour obtenir le profil utilisateur associé; lorsque le jeton
148
	 * le service Del pour obtenir le profil utilisateur associé; lorsque le jeton
145
	 * n'est pas nul et que sa durée de vie est spécifiée, déclenche un rafraîchissement
149
	 * n'est pas nul et que sa durée de vie est spécifiée, déclenche un rafraîchissement
146
	 * périodique du jeton
150
	 * périodique du jeton
147
	 * 
151
	 * 
148
	 * @param objetRetour le retour de l'appel au service annuaire:auth (connexion, deconnexion ou identite)
152
	 * @param objetRetour le retour de l'appel au service annuaire:auth (connexion, deconnexion ou identite)
149
	 * @param callback
153
	 * @param callback
150
	 */
154
	 */
151
	protected void gererRetourAuthInfo(AuthInfo objetRetour, UtilisateurCallback callback) {
155
	protected void gererRetourAuthInfo(AuthInfo objetRetour, final UtilisateurCallback callback) {
152
		// Stockage du jeton rafraîchi et de sa durée (pourrait avoir changé)
156
		// Stockage du jeton rafraîchi et de sa durée (pourrait avoir changé)
153
		Utilisateur.setJeton(objetRetour.token);
157
		Utilisateur.setJeton(objetRetour.token);
154
		Utilisateur.setDureeJeton(objetRetour.duration);
158
		Utilisateur.setDureeJeton(objetRetour.duration);
155
 
159
 
156
		// Rafraîchissement automatique du jeton - s'annule lorsque le jeton devient nul
160
		// Rafraîchissement automatique du jeton - s'annule lorsque le jeton devient nul
157
		if (Utilisateur.getJeton() != null && Utilisateur.getDureeJeton() > 0) {
161
		if (Utilisateur.getJeton() != null && Utilisateur.getDureeJeton() > 0) {
158
			if (rafraichisseurJeton == null) { // on sait jamais
162
			if (rafraichisseurJeton == null) { // on sait jamais
159
				// 3/4 de la durée de vie du jeton, en millisecondes (ça laisse de la marge)
163
				// 3/4 de la durée de vie du jeton, en millisecondes (ça laisse de la marge)
160
				int delaiRepetition = (Utilisateur.getDureeJeton() * 1000) * 3 / 4;
164
				int delaiRepetition = (Utilisateur.getDureeJeton() * 1000) * 3 / 4;
161
				rafraichisseurJeton = new Timer() {
165
				rafraichisseurJeton = new Timer() {
162
					@Override
166
					@Override
163
					public void run() {
167
					public void run() {
164
						// Appel de l'annuaire pour rafraîchir le jeton (cb nul pour l'instant)
168
						// Appel de l'annuaire pour rafraîchir le jeton (cb nul pour l'instant)
165
						// @TODO gérer le possible changement de profil / coordonnées de l'utilisateur
169
						// @TODO gérer le possible changement de profil / coordonnées de l'utilisateur
166
						// en cours de connexion
170
						// en cours de connexion
167
						obtenirUtilisateur(null);
171
						obtenirUtilisateur(callback);
168
					}
172
					}
169
				};
173
				};
170
				rafraichisseurJeton.scheduleRepeating(delaiRepetition);
174
				rafraichisseurJeton.scheduleRepeating(delaiRepetition);
171
			}
175
			}
172
		} else {
176
		} else {
173
			if (rafraichisseurJeton != null) { // on sait jamais non plus
177
			if (rafraichisseurJeton != null) { // on sait jamais non plus
174
				rafraichisseurJeton.cancel();
178
				rafraichisseurJeton.cancel();
175
				rafraichisseurJeton = null;
179
				rafraichisseurJeton = null;
176
			}
180
			}
177
		}
181
		}
178
 
182
 
179
		// Obtention de l'utilisateur final d'après le service de préférences
183
		// Obtention de l'utilisateur final d'après le service de préférences
180
		obtenirUtilisateurSansAnnuaire(callback);
184
		obtenirUtilisateurSansAnnuaire(callback);
181
	}
185
	}
182
 
186
 
183
}
187
}