/** * 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.admin; import static play.data.Form.form; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.OptimisticLockException; import javax.persistence.PersistenceException; import meta.GridHeader; import meta.PageExtend; import models.AdminUser; import models.search.NameOnlySearchParam; import models.temporal.UserData; import models.temporal.UserMultiplierData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import play.data.Form; import play.i18n.Messages; import play.mvc.Controller; import play.mvc.Result; import utils.AuthManager; import utils.CacheUtils; import views.html.admins.user.form; import views.html.admins.user.list; import views.html.admins.user.multiplier; import views.html.admins.user.restricted_form; import com.avaje.ebean.Page; import controllers.Application; import controllers.global.Profiles; /** * @author mdpinar */ public class Users extends Controller { private final static Logger log = LoggerFactory.getLogger(Users.class); private final static Form<AdminUser> dataForm = form(AdminUser.class); private final static Form<NameOnlySearchParam> paramForm = form(NameOnlySearchParam.class); private static List<GridHeader> headerList; /** * Liste formu basliklarini doner * * @return List<GridHeader> */ private static List<GridHeader> getHeaderList() { if (headerList == null) { headerList = new ArrayList<GridHeader>(); headerList.add(new GridHeader(Messages.get("username"), "12%").sortable("username")); headerList.add(new GridHeader(Messages.get("name"), true).sortable("title")); headerList.add(new GridHeader("Email", "25%")); headerList.add(new GridHeader(Messages.get("group"), "15%")); headerList.add(new GridHeader(Messages.get("is_active"), "7%", true)); } return headerList; } /** * Liste formunda gosterilecek verileri doner * * @return PageExtend */ private static PageExtend<AdminUser> buildPage(NameOnlySearchParam searchParam) { List<Map<Integer, String>> dataList = new ArrayList<Map<Integer, String>>(); Page<AdminUser> page = AdminUser.page(searchParam); List<AdminUser> modelList = page.getList(); if (modelList != null && modelList.size() > 0) { for (AdminUser model : modelList) { Map<Integer, String> dataMap = new HashMap<Integer, String>(); int i = -1; dataMap.put(i++, model.id.toString()); dataMap.put(i++, model.username); dataMap.put(i++, model.title); dataMap.put(i++, model.email); dataMap.put(i++, (model.userGroup != null ? model.userGroup.toString() : "")); dataMap.put(i++, model.isActive.toString()); dataList.add(dataMap); } } return new PageExtend<AdminUser>(getHeaderList(), dataList, page); } public static Result GO_HOME = redirect( controllers.admin.routes.Users.list() ); /** * Uzerinde veri bulunan liste formunu doner */ public static Result list() { if (! CacheUtils.isSuperUser()) return Application.getForbiddenResult(); Form<NameOnlySearchParam> filledParamForm = paramForm.bindFromRequest(); return ok(list.render(buildPage(filledParamForm.get()), filledParamForm)); } /** * Kayit formundaki bilgileri kaydeder */ public static Result save() { if (! CacheUtils.isSuperUser()) return Application.getForbiddenResult(); Form<AdminUser> filledForm = dataForm.bindFromRequest(); if(filledForm.hasErrors()) { return badRequest(form.render(filledForm)); } else { AdminUser model = filledForm.get(); checkConstraints(filledForm); if(filledForm.hasErrors()) { return badRequest(form.render(filledForm)); } model.passwordHash = AuthManager.md5Hash(model.password); try { if (model.id == null) { model.save(); } else { model.update(); } } catch (OptimisticLockException e) { flash("error", Messages.get("exception.optimistic.lock")); return badRequest(form.render(dataForm.fill(model))); } flash("success", Messages.get("saved", model.username)); if (Profiles.chosen().gnel_continuouslyRecording) return create(); else return GO_HOME; } } /** * Yeni bir kayit formu olusturur */ public static Result create() { if (! CacheUtils.isSuperUser()) return Application.getForbiddenResult(); return ok(form.render(dataForm.fill(new AdminUser()))); } /** * Secilen kayit icin duzenleme formunu acar * * @param id */ public static Result edit(Integer id) { if (! CacheUtils.isSuperUser()) return Application.getForbiddenResult(); if (id == null) { flash("error", Messages.get("id.is.null")); } else { AdminUser model = AdminUser.findById(id); if (model == null) { flash("error", Messages.get("not.found", Messages.get("user"))); } else { return ok(form.render(dataForm.fill(model))); } } return GO_HOME; } /** * Duzenlemek icin acilmis olan kaydi siler * * @param id */ public static Result remove(Integer id) { if (! CacheUtils.isSuperUser()) return Application.getForbiddenResult(); if (id == null) { flash("error", Messages.get("id.is.null")); } else { AdminUser model = AdminUser.findById(id); if (model == null) { flash("error", Messages.get("not.found", Messages.get("user"))); } else { if (model.id == 1) { flash("error", Messages.get("cannot.delete", "super user")); } else { try { model.delete(); flash("success", Messages.get("deleted", model.username)); } catch (PersistenceException pe) { log.error(pe.getMessage()); flash("error", Messages.get("delete.violation", model.username)); return badRequest(form.render(dataForm.fill(model))); } } } } return GO_HOME; } /** * Secilen kaydin kopyasini olusturur * * @param id */ public static Result createClone(Integer id) { if (! CacheUtils.isSuperUser()) return Application.getForbiddenResult(); AdminUser source = AdminUser.findById(id); UserMultiplierData im = new UserMultiplierData(); im.id = id; im.title = source.title; Form<UserMultiplierData> imDataForm = form(UserMultiplierData.class); return ok( multiplier.render(imDataForm.fill(im)) ); } /** * Yeni kopyayi kaydeder */ public static Result saveClone() { if (! CacheUtils.isSuperUser()) return Application.getForbiddenResult(); Form<UserMultiplierData> filledForm = form(UserMultiplierData.class).bindFromRequest(); if(filledForm.hasErrors()) { return badRequest(multiplier.render(filledForm)); } else { checkConstraintsForMultiplier(filledForm); if (filledForm.hasErrors()) { return badRequest(multiplier.render(filledForm)); } UserMultiplierData im = filledForm.get(); AdminUser source = AdminUser.findById(im.id); AdminUser clone = new AdminUser(im.username); clone.username = im.username; clone.title = im.title; clone.email = im.email; clone.passwordHash = AuthManager.md5Hash(im.password); clone.userGroup = source.userGroup; clone.save(); return ok(Messages.get("saved", clone.username)); } } /** * Kayit isleminden once form uzerinde bulunan verilerin uygunlugunu kontrol eder * * @param filledForm */ private static void checkConstraintsForMultiplier(Form<UserMultiplierData> filledForm) { UserMultiplierData model = filledForm.get(); if (AdminUser.isUsedForElse("username", model.username, model.id)) { filledForm.reject("username", Messages.get("not.unique", model.username)); } if (! model.password.equals(model.repeatPassword)) { filledForm.reject("repeatPassword", Messages.get("passwords.arent.equal")); } } /** * Kayit isleminden once form uzerinde bulunan verilerin uygunlugunu kontrol eder * * @param filledForm */ private static void checkConstraints(Form<AdminUser> filledForm) { AdminUser model = filledForm.get(); if (AdminUser.isUsedForElse("username", model.username, model.id)) { filledForm.reject("username", Messages.get("not.unique", model.username)); } if (! model.password.equals(model.repeatPassword)) { filledForm.reject("repeatPassword", Messages.get("passwords.arent.equal")); } } public static Result saveRestricted() { if (! CacheUtils.isLoggedIn()) return Application.login(); Form<UserData> resFilledForm = form(UserData.class).bindFromRequest(); if(resFilledForm.hasErrors()) { return badRequest(restricted_form.render(resFilledForm)); } else { AdminUser model = AdminUser.findById(CacheUtils.getUser().id); checkRestrictedConstraints(model, resFilledForm); if(resFilledForm.hasErrors()) { return badRequest(restricted_form.render(resFilledForm)); } UserData resModel = resFilledForm.get(); model.title = resModel.title; model.email = resModel.email; model.passwordHash = AuthManager.md5Hash(resModel.password); model.update(); CacheUtils.setUser(model); return ok(Messages.get("saved", model.username)); } } public static Result editRestricted() { if (! CacheUtils.isLoggedIn()) return Application.login(); AdminUser user = CacheUtils.getUser(); UserData data = new UserData(); data.title = user.title; data.email = user.email; return ok(restricted_form.render(form(UserData.class).fill(data))); } private static void checkRestrictedConstraints(AdminUser model, Form<UserData> resFilledForm) { UserData resModel = resFilledForm.get(); resModel.passwordHash = AuthManager.md5Hash(resModel.oldPassword); if (! model.passwordHash.equals(resModel.passwordHash)) { resFilledForm.reject("oldPassword", Messages.get("old.password.is.wrong")); } if (! resModel.password.equals(resModel.repeatPassword)) { resFilledForm.reject("repeatPassword", Messages.get("passwords.arent.equal")); } } }