package org.bubblecloud.ilves.site; import com.vaadin.server.*; import com.vaadin.ui.Notification; import com.vaadin.ui.UI; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.bubblecloud.ilves.model.Company; import org.bubblecloud.ilves.model.Group; import org.bubblecloud.ilves.model.User; import org.bubblecloud.ilves.security.*; import org.joda.time.DateTime; import org.joda.time.Duration; import javax.persistence.EntityManager; import java.io.IOException; import java.util.List; import java.util.Locale; /** * Handler for credential post requests like password login post or oauth redirect post. * * @author Tommi S.E. Laukkanen */ public class CredentialPostRequestHandler implements RequestHandler { /** The logger. */ private static final Logger LOGGER = Logger.getLogger(CredentialPostRequestHandler.class); private DefaultSiteUI ui; public CredentialPostRequestHandler(DefaultSiteUI ui) { this.ui = ui; } @Override public boolean handleRequest(VaadinSession session, VaadinRequest request, VaadinResponse response) throws IOException { final VaadinServletResponse vaadinServletResponse = (VaadinServletResponse) response; final String pathInfo = request.getPathInfo(); if (pathInfo != null && pathInfo.contains("oauthredirect")) { final EntityManager entityManager = ui.getSite().getSiteContext().getEntityManager(); final Company company = DefaultSiteUI.resolveCompany(entityManager, ((VaadinServletRequest) VaadinService.getCurrentRequest()).getServerName()); if (VaadinSession.getCurrent().getSession().getAttribute("user") == null) { final String code = request.getParameter("code"); Locale locale = ui.getLocale(); if (locale == null) { locale = Locale.ENGLISH; } final User user = OAuthService.processOAuthRedirect(ui.getSite().getSiteContext(), company, code); if (user != null) { entityManager.refresh(user); login(locale, entityManager, company, user); } else { ui.setNotification(DefaultSiteUI.getLocalizationProvider().localize("message-login-failed", locale), Notification.Type.WARNING_MESSAGE); } } vaadinServletResponse.sendRedirect(company.getUrl()); return true; } /* if (!StringUtils.isEmpty(request.getParameter("username")) && !StringUtils.isEmpty(request.getParameter("password")) && VaadinSession.getCurrent() != null && VaadinSession.getCurrent().getSession().getAttribute("user") == null) { final String emailAddress = request.getParameter("username"); final String password = request.getParameter("password"); final String transactionId = request.getParameter("uiTransactionId"); Locale locale = ui.getLocale(); if (locale == null) { locale = Locale.ENGLISH; } final EntityManager entityManager = ui.getSite().getSiteContext().getEntityManager(); final Company company = DefaultSiteUI.resolveCompany(entityManager, (VaadinServletRequest) request); final User user = UserDao.getUser(entityManager, company, emailAddress); if (user == null) { return false; } entityManager.refresh(user); if (user.getGoogleAuthenticatorSecret() != null) { final String code = request.getParameter("code"); if (code == null || !GoogleAuthenticatorService.checkCode(SecurityUtil.decryptSecretKey(user.getGoogleAuthenticatorSecret()), code)) { if (ui.getSession() == null) { LOGGER.error("Vaadin UI not initialized when CredentialPostRequestHandler was invoked."); return false; } ui.setNotification(DefaultSiteUI.getLocalizationProvider().localize("message-login-failed", locale), Notification.Type.WARNING_MESSAGE); return false; } } final String errorKey = LoginService.login(ui.getSite().getSiteContext(), company, user, emailAddress, password.toCharArray(), VaadinSession.getCurrent().getSession().getId(), transactionId); if (errorKey == null) { login(locale, entityManager, company, user); } else if (errorKey.equals("message-login-failed-duplicate-login-for-login-transaction-id")) { // Silently fail. } else { // Login failure ui.setNotification(DefaultSiteUI.getLocalizationProvider().localize(errorKey, locale), Notification.Type.WARNING_MESSAGE); } } */ return false; // No response was written } public void login(Locale locale, EntityManager entityManager, Company company, User user) { final List<Group> groups = UserDao.getUserGroups(entityManager, company, user); DefaultSiteUI.getSecurityProvider().setUser(user, groups); // Check for imminent password expiration. if (user.getPasswordExpirationDate() != null && new DateTime().plusDays(14).toDate().getTime() > user.getPasswordExpirationDate().getTime() ) { final DateTime expirationDate = new DateTime(user.getPasswordExpirationDate()); final DateTime currentDate = new DateTime(); final long daysUntilExpiration = new Duration(currentDate.toDate().getTime(), expirationDate.toDate().getTime()).getStandardDays(); ui.setNotification(DefaultSiteUI.getLocalizationProvider().localize( "message-password-expires-in-days", locale) + ": " + daysUntilExpiration, Notification.Type.WARNING_MESSAGE); } else { ui.setNotification(DefaultSiteUI.getLocalizationProvider().localize( "message-login-success", locale), Notification.Type.TRAY_NOTIFICATION); } } }