/* Transit - Remote procedure calls made simple Copyright (c) 2012 Ulrich Hilger This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.transit.web; import java.security.Principal; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; /** * Basisklasse mit gemeinsamem Code fuer die TransitServlets * * @author Copyright (c) Ulrich Hilger, http://uhilger.de * @author Published under the terms and conditions of the * GNU Affero * General Public License * * @version 1, September 16, 2012 */ public abstract class AbstractServlet extends HttpServlet { public static final String MIME_JSON = "application/json"; public static final String MIME_XML = "text/xml"; public static final String KLASSEN_TRENNER = ";"; private static final String[] specialChars = {new String("\u00c4"), new String("\u00d6"), new String("\u00dc"), new String("\u00e4"), new String("\u00f6"), new String("\u00fc"), new String("\u00df")}; /** Name, der als Benutzername verwendet wird, wenn kein Benutzer angemeldet ist */ public static final String ANONYMER_NUTZER = "anonymous"; protected String[] klassen; @Override public void init(ServletConfig servletConfig) throws ServletException{ this.klassen = servletConfig.getInitParameter("klassen").split(KLASSEN_TRENNER); super.init(servletConfig); } /** * Den Namen des angemeldeten Benutzers ermitteln. * * @param req die Anfrage, deren Benutzer ermittelt werden soll * @return Name des Benutzers oder anonymous, wenn * kein Benutzer angemeldet ist */ protected String getUserName(HttpServletRequest req) { String userName = null; Principal p = req.getUserPrincipal(); if(p != null) { userName = p.getName(); } if(userName == null) { userName = ANONYMER_NUTZER; } return userName; } public String escapeHtml(String text) { text = text.replace(specialChars[0], "Ä"); text = text.replace(specialChars[1], "Ö"); text = text.replace(specialChars[2], "Ü"); text = text.replace(specialChars[3], "ä"); text = text.replace(specialChars[4], "ö"); text = text.replace(specialChars[5], "ü"); text = text.replace(specialChars[6], "ß"); return text; } /** * Hier wird geprueft, ob der Name einer Klasse der Liste der erlaubten * Klassen bzw. Packages entspricht. Im Deployment Descriptor wird ein * Ausdruck wie z.B. * * de.uhilger.test.web;de.uhilger.test.api;de.uhilger.test.db.KlassenName * * erwartet. Diese Methode spaltet diesen Ausdruck an den ';' auf und prueft * fuer jeden Ausdruck, ob der KlassenName mit diesem Ausdruck beginnt. * Beginnt der Klassenname mit einem der Ausdruecke, wird der Zugriff erlaubt * * @param klassenName Name der Klasse, fuer die der Zugriff geprueft * werden soll * @return true, wenn die Klasse laut dem Eintrag im Deployment Desccriptor * aufgerufen werden darf, false wenn nicht */ protected boolean istErlaubt(String klassenName) { boolean erlaubt = false; for(int i = 0; i < klassen.length && !erlaubt; i++) { erlaubt = klassenName.startsWith(klassen[i]); } return erlaubt; } }