Subversion Repositories eFlore/Applications.del

Rev

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

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