package org.activityinfo.ui.client.inject;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.Cookies;
import com.google.inject.Provider;
import org.activityinfo.legacy.shared.exception.InvalidAuthTokenException;
import org.activityinfo.model.auth.AuthenticatedUser;
import java.util.Date;
/**
* Supplies user <code>Authentication</code> information from the
* <code>authToken</code> and <code>email</code> cookies, or failing that, from
* the <code>UserInfo</code> dictionary.
*
* @author Alex Bertram
*/
public class ClientSideAuthProvider implements Provider<AuthenticatedUser> {
private static final long ONE_YEAR = 365L * 24L * 60L * 60L * 1000L;
@Override
public AuthenticatedUser get() {
String authToken = Cookies.getCookie(AuthenticatedUser.AUTH_TOKEN_COOKIE);
String userId = Cookies.getCookie(AuthenticatedUser.USER_ID_COOKIE);
String email = Cookies.getCookie(AuthenticatedUser.EMAIL_COOKIE);
if (authToken != null && userId != null && email != null) {
return new AuthenticatedUser(authToken,
Integer.parseInt(userId),
email.replaceAll("\"", ""),
currentLocale());
}
throw new InvalidAuthTokenException("Request is not authenticated");
}
private String currentLocale() {
return LocaleInfo.getCurrentLocale().getLocaleName();
}
/**
* unless the user requests to stay logged in, the authToken is set to expire at the end of the user's session,
* which means that it won't be available if the user opens the app via the appcache later on. Since
* BootstrapScriptServlet relies on the token to select the appropriate locale, without the cookie set, trying to
* retrieve the latest manifest will fail
*/
public static void persistAuthentication() {
AuthenticatedUser user = new ClientSideAuthProvider().get();
Cookies.setCookie(AuthenticatedUser.AUTH_TOKEN_COOKIE, user.getAuthToken(), oneYearLater());
Cookies.setCookie(AuthenticatedUser.USER_ID_COOKIE, Integer.toString(user.getUserId()), oneYearLater());
Cookies.setCookie(AuthenticatedUser.EMAIL_COOKIE, user.getEmail(), oneYearLater());
}
private static Date oneYearLater() {
long time = new Date().getTime();
return new Date(time + ONE_YEAR);
}
}