package org.iatoki.judgels.raguel; import com.google.common.collect.ImmutableList; import org.iatoki.judgels.api.JudgelsAPIClientException; import org.iatoki.judgels.api.jophiel.JophielClientAPI; import org.iatoki.judgels.api.jophiel.JophielPublicAPI; import org.iatoki.judgels.api.jophiel.JophielUser; import org.iatoki.judgels.jophiel.viewpoint.ViewpointForm; import org.iatoki.judgels.jophiel.avatar.BaseAvatarCacheService; import org.iatoki.judgels.jophiel.activity.UserActivityMessageService; import org.iatoki.judgels.play.jid.BaseJidCacheService; import org.iatoki.judgels.raguel.controllers.securities.Authenticated; import org.iatoki.judgels.raguel.controllers.securities.HasRole; import org.iatoki.judgels.raguel.controllers.securities.LoggedIn; import org.iatoki.judgels.raguel.user.User; import org.iatoki.judgels.raguel.user.UserService; import play.data.Form; import play.db.jpa.Transactional; import play.mvc.Result; import javax.inject.Inject; import javax.inject.Singleton; import java.util.List; @Singleton public final class ApplicationController extends AbstractRaguelController { private final JophielPublicAPI jophielPublicAPI; private final UserService userService; @Inject public ApplicationController(BaseJidCacheService jidCacheService, BaseAvatarCacheService avatarCacheService, JophielClientAPI jophielClientAPI, JophielPublicAPI jophielPublicAPI, UserActivityMessageService userActivityMessageService, JophielPublicAPI jophielPublicAPI1, UserService userService) { super(jidCacheService, avatarCacheService, jophielClientAPI, jophielPublicAPI, userActivityMessageService); this.jophielPublicAPI = jophielPublicAPI1; this.userService = userService; } public Result index() { return redirect(org.iatoki.judgels.raguel.forum.routes.ForumController.index()); } public Result auth(String returnUri) { if (session().containsKey("username") && session().containsKey("role")) { return redirect(returnUri); } else if (session().containsKey("username")) { return redirect(routes.ApplicationController.authRole(returnUri)); } else { String newReturnUri = routes.ApplicationController.afterLogin(returnUri).absoluteURL(request(), request().secure()); return redirect(org.iatoki.judgels.jophiel.routes.JophielClientController.login(newReturnUri)); } } @Transactional public Result authRole(String returnUri) { if (session().containsKey("username") && session().containsKey("role")) { return redirect(returnUri); } String userJid = getCurrentUserJid(); if (!userService.existsByUserJid(userJid)) { userService.createUser(userJid, getDefaultRoles(), getCurrentUserJid(), getCurrentUserIpAddress()); setCurrentUserRoles(getDefaultRoles()); return redirect(returnUri); } User userRole = userService.findUserByJid(userJid); setCurrentUserRoles(userRole.getRoles()); return redirect(returnUri); } @Transactional public Result afterLogin(String returnUri) { if (!session().containsKey("role")) { String newReturnUri = routes.ApplicationController.afterLogin(returnUri).absoluteURL(request(), request().secure()); return redirect(routes.ApplicationController.authRole(newReturnUri)); } updateUserJidCache(); updateUserAvatarCache(); if (hasViewPoint()) { try { backUpCurrentUserSession(); setCurrentUserSession(jophielPublicAPI.findUserByJid(getViewPoint()), userService.findUserByJid(getViewPoint()).getRoles()); } catch (JudgelsAPIClientException e) { removeViewPoint(); restoreBackedUpUserSession(); } } return redirect(returnUri); } @Authenticated(value = {LoggedIn.class, HasRole.class}) @Transactional public Result postViewAs() { Form<ViewpointForm> viewpointForm = Form.form(ViewpointForm.class).bindFromRequest(); if (!formHasErrors(viewpointForm) && backedUpOrCurrentUserHasRole("admin")) { ViewpointForm viewpointData = viewpointForm.get(); try { JophielUser jophielUser = jophielPublicAPI.findUserByUsername(viewpointData.username); if (jophielUser != null) { userService.upsertUserFromJophielUser(jophielUser, getCurrentUserJid(), getCurrentUserIpAddress()); if (!hasViewPoint()) { backUpCurrentUserSession(); } setViewPointInSession(jophielUser.getJid()); setCurrentUserSession(jophielUser, userService.findUserByJid(jophielUser.getJid()).getRoles()); addActivityLog("View as user " + viewpointData.username + "."); } } catch (JudgelsAPIClientException e) { // do nothing e.printStackTrace(); } } return redirectToReferer(); } @Authenticated(value = {LoggedIn.class, HasRole.class}) public Result resetViewAs() { removeViewPoint(); restoreBackedUpUserSession(); return redirectToReferer(); } @Authenticated(value = {LoggedIn.class, HasRole.class}) public Result logout(String returnUri) { session().clear(); return redirect(returnUri); } private List<String> getDefaultRoles() { return ImmutableList.of("user"); } }