/** * Copyright (c) 2015 Mustafa DUMLUPINAR, mdumlupinar@gmail.com * * This file is part of seyhan project. * * seyhan 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/>. */ package controllers; import static play.data.Form.form; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.Date; import java.util.HashSet; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; import java.util.Set; import models.AdminUserAudit; import models.AdminWorkspace; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import play.api.Play; import play.data.Form; import play.i18n.Messages; import play.mvc.Controller; import play.mvc.Http; import play.mvc.Http.Cookie; import play.mvc.Result; import utils.AuthManager; import utils.CacheUtils; import utils.CookieUtils; import utils.GlobalCons; import views.html.index; import views.html.login; import views.html.admins.workspace.selection; import views.html.tools.errors.bad_request; import views.html.tools.errors.forbidden; import views.html.tools.errors.no_workspace; import controllers.admin.Workspaces; import controllers.global.Profiles; import enums.UserLogLevel; /** * @author mdpinar */ public class Application extends Controller { private final static Logger log = LoggerFactory.getLogger(Application.class); private static ResourceBundle bundle; private static Set<String> localIPSet; static { localIPSet = new HashSet<String>(); localIPSet.add("localhost"); localIPSet.add("127.0.0.1"); localIPSet.add("0.0.0.0"); } public static Result index() { changeLang(getLang()); if (CacheUtils.isLoggedIn()) { if (! CacheUtils.isSuperUser() && CacheUtils.getWorkspaceId() == null) { return ok(selection.render(Workspaces.getAll())); } else { return ok(index.render()); } } else { return ok(login.render(form(Login.class))); } } private static boolean isLocalRequest() { String requestIP = null; try { requestIP = Http.Context.current().request().remoteAddress(); } catch (Exception e) {}; return requestIP != null && localIPSet.contains(requestIP); } public static Result stop() { if (isLocalRequest()) { Play.stop(); System.exit(0); return ok("seyhan application has been stopped!"); } else { return badRequest(); } } public static Result isAlive() { if (isLocalRequest()) { return ok(); } else { return badRequest(); } } public static Result login() { bundle = null; CookieUtils.cleanAll(); CacheUtils.cleanAll(); flash("success", Messages.get("please.login")); return redirect("/"); } public static Result authenticate() { Form<Login> loginForm = form(Login.class).bindFromRequest(); if(loginForm.hasErrors()) { return badRequest(login.render(loginForm)); } else { new AdminUserAudit(loginForm.get().username, new Date(), null, null, UserLogLevel.Login).save(); return redirect( routes.Application.index() ); } } public static Result logout() { if (CacheUtils.isLoggedIn()) { flash("success", Messages.get("logged.out")); new AdminUserAudit(CacheUtils.getUser().username, new Date(), null, null, UserLogLevel.Logout).save(); } return redirect( routes.Application.login() ); } public static Result workspaces() { return workspaces(null); } public static Result workspaces(String message) { if (CacheUtils.isLoggedIn()) { if (message != null) flash("success", message); return ok(selection.render(Workspaces.getAll())); } else { return ok(login.render(form(Login.class))); } } public static Result getNoWorkspaceResult() { return forbidden(no_workspace.render()); } public static Result getForbiddenResult() { return forbidden(forbidden.render()); } public static Result getBadRequestResult() { return badRequest(bad_request.render()); } public static Result getCurrentPageResult() { String referer = request().getHeader("referer"); if (referer.endsWith("login")) { return redirect("/"); } else { return redirect(request().getHeader("referer")); } } public static Result changeLanguage(String lang) { if (! CacheUtils.isLoggedIn() || lang == null || ! GlobalCons.getLangMap().containsKey(lang)) return login(); response().setCookie("PLAY_LANG", lang, 200000); changeLang(lang); bundle = null; CacheUtils.removeMenu(); return getCurrentPageResult(); } public static String getLang() { Cookie langCookie = request().cookies().get("PLAY_LANG"); if (langCookie == null) { response().setCookie("PLAY_LANG", GlobalCons.defaultLang, 200000); changeLang(GlobalCons.defaultLang); return GlobalCons.defaultLang; } else { return langCookie.value(); } } public static Result changeProfile(String profile) { if (! CacheUtils.isLoggedIn()) return login(); Profiles.setChoosen(profile); CacheUtils.removeMenu(); return getCurrentPageResult(); } public static Result changeWorkspace(String name) { if (! CacheUtils.isLoggedIn()) return login(); if (! isActiveWorkspace(name)) { AdminWorkspace ws = Workspaces.isRightUserForWS(CacheUtils.getUser(), name); if (ws != null) CacheUtils.setWorkspace(ws.id); } CacheUtils.removeMenu(); return getCurrentPageResult(); } public static boolean isActiveWorkspace(String name) { return (name != null && name.equals(CacheUtils.getWorkspaceName())); } public static boolean isActiveProfile(String name) { return (name != null && name.equals(CacheUtils.getProfile())); } public static boolean isActiveLang(String name) { return (name != null && name.equals(getLang())); } public static String getVersion() { return AppInfo.BuildInfo.version(); } public static ResourceBundle getResourceBundle() { if (bundle != null) { return bundle; } else { FileInputStream fis; try { fis = new FileInputStream(Play.current().path().getAbsolutePath() + "/conf/messages." + getLang()); return new PropertyResourceBundle(new InputStreamReader(fis, "UTF-8")); } catch (Exception e) { log.error(e.getMessage()); } } return null; } public static class Login { public String username; public String password; public String validate() { String result = AuthManager.authenticate(username, password); if(result != null) { return result; } return null; } } }