package de.skuzzle.polly.sdk.httpv2; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import de.skuzzle.polly.http.api.AlternativeAnswerException; import de.skuzzle.polly.http.api.Controller; import de.skuzzle.polly.http.api.answers.HttpAnswer; import de.skuzzle.polly.http.api.answers.HttpAnswers; import de.skuzzle.polly.sdk.Messages; import de.skuzzle.polly.sdk.MyPolly; import de.skuzzle.polly.sdk.User; import de.skuzzle.polly.sdk.httpv2.html.HTMLTools; import de.skuzzle.polly.sdk.resources.Constants; import de.skuzzle.polly.sdk.roles.RoleManager; import de.skuzzle.polly.sdk.time.Time; public abstract class PollyController extends Controller { protected final static String STYLE_SHEET_NAME = "template.css"; //$NON-NLS-1$ protected final static String PAGE_PREFIX = "PAGE_"; //$NON-NLS-1$ private final MyPolly myPolly; public PollyController(MyPolly myPolly) { this.myPolly = myPolly; this.setHandlerPrefix(PAGE_PREFIX); } @Override public void putHandledURL(Map<String, String> target, String handlerName, String url) { handlerName = handlerName.replaceAll("\\s+", "_").toUpperCase(); //$NON-NLS-1$ //$NON-NLS-2$ super.putHandledURL(target, handlerName, url); } protected MyPolly getMyPolly() { return this.myPolly; } protected Map<String, Object> createContext(String content) { final Map<String, Object> c = new HashMap<String, Object>(); c.put("myPolly", this.myPolly); //$NON-NLS-1$ c.put("httpServer", this.getServer()); //$NON-NLS-1$ c.put("user", this.getSessionUser()); //$NON-NLS-1$ c.put("session", this.getSession()); //$NON-NLS-1$ c.put("menu", this.myPolly.webInterface().getMenuCategories()); //$NON-NLS-1$ c.put("topMenu", this.myPolly.webInterface().getTopMenuEntries()); //$NON-NLS-1$ c.put("uptime", Time.currentTimeMillis() //$NON-NLS-1$ - this.getMyPolly().getStartTime().getTime()); c.put("startTime", this.getMyPolly().getStartTime()); //$NON-NLS-1$ c.put("sessionTimeOut", this.getEvent().getSource().sessionLiveTime()); //$NON-NLS-1$ c.put("content", content); //$NON-NLS-1$ c.put("executionTime", //$NON-NLS-1$ Time.currentTimeMillis() - this.getEvent().getEventTime().getTime()); c.put("Constants", Constants.class); //$NON-NLS-1$ c.put("HTML", HTMLTools.class); //$NON-NLS-1$ c.putAll(this.getServer().getHandledUrls()); return c; } protected HttpAnswer makeAnswer(Map<String, Object> context) { return HttpAnswers.newTemplateAnswer("template.html", context); //$NON-NLS-1$ } protected HttpAnswer makeAnswer(int responseCode, Map<String, Object> context) { return HttpAnswers.newTemplateAnswer(responseCode, "template.html", context); //$NON-NLS-1$ } protected final User getSessionUser() { return (User) this.getSession().get(WebinterfaceManager.USER); } protected void requirePermissions(String... permissions) throws AlternativeAnswerException { final User u = this.getSessionUser(); final RoleManager rm = this.myPolly.roles(); final Set<String> p = new HashSet<>(Arrays.asList(permissions)); if (!rm.hasPermission(u, p)) { final Map<String, Object> c = this.createContext( "templatesv2/no_permission.html"); //$NON-NLS-1$ c.put("permissions", p); //$NON-NLS-1$ c.put("resource", this.getEvent().getPlainUri()); //$NON-NLS-1$ throw new AlternativeAnswerException(this.makeAnswer(c)); } } protected User checkLogin(String userName, String pwHash) throws AlternativeAnswerException { final User u = this.getMyPolly().users().getUser(userName); if (u == null || !u.getHashedPassword().equalsIgnoreCase(pwHash)) { throw new AlternativeAnswerException(new GsonHttpAnswer(200, new SuccessResult(false, Messages.illegalLogin))); } return u; } }