From 70a614a0d43b3a8a614e751df442aac1900aedba Mon Sep 17 00:00:00 2001 From: ulrich <ulrich@uhilger.de> Date: Fri, 10 Feb 2017 06:55:52 +0000 Subject: [PATCH] SessionManager hinzugefuegt, abstrakte Api-Klasse hinzugefuegt --- web/WEB-INF/web.xml | 12 ++++ src/java/de/uhilger/um/pub/SessionManager.java | 40 +++++++++++++ web/WEB-INF/sql.properties | 3 + src/java/de/uhilger/um/web/Initialiser.java | 19 ++++++ src/java/de/uhilger/um/api/UserMgr.java | 42 ++++++++++---- src/java/de/uhilger/um/api/Api.java | 64 +++++++++++++++++++++ 6 files changed, 168 insertions(+), 12 deletions(-) diff --git a/src/java/de/uhilger/um/api/Api.java b/src/java/de/uhilger/um/api/Api.java new file mode 100644 index 0000000..8134006 --- /dev/null +++ b/src/java/de/uhilger/um/api/Api.java @@ -0,0 +1,64 @@ +package de.uhilger.um.api; + +import de.uhilger.baselink.PersistenceManager; +import de.uhilger.baselink.Record; +import de.uhilger.transit.web.RequestKontext; +import de.uhilger.transit.web.WebKontext; +import static de.uhilger.um.api.UserMgr.UM_DB; +import java.util.Properties; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; + +/** + * + */ +public abstract class Api implements WebKontext, RequestKontext { + + /** Zeiger zum Servlet-Kontext dieser Anwendung */ + private ServletContext ctx; + + private HttpServletRequest request; + + protected PersistenceManager getDb() { + return (PersistenceManager) ctx.getAttribute(UM_DB); + } + + protected String getSql(String id) { + Properties sql = (Properties) ctx.getAttribute(UserMgr.UM_SQL_PROPERTIES); + return sql.getProperty(id); + } + + protected Record getMapper(String mapperName) { + Record record = null; + Object o = getServletContext().getAttribute(mapperName); + if(o instanceof Record) { + record = (Record) o; + } + return record; + } + + /* ------------- Implementierung WebKontext ------------- */ + + @Override + public ServletContext getServletContext() { + return ctx; + } + + @Override + public void setServletContext(ServletContext servletContext) { + this.ctx = servletContext; + } + + /* ------------- Implementierung RequestKontext ------------- */ + + @Override + public HttpServletRequest getRequest() { + return request; + } + + @Override + public void setRequest(HttpServletRequest r) { + this.request = r; + } + +} diff --git a/src/java/de/uhilger/um/api/UserMgr.java b/src/java/de/uhilger/um/api/UserMgr.java index f32072a..3f06be7 100644 --- a/src/java/de/uhilger/um/api/UserMgr.java +++ b/src/java/de/uhilger/um/api/UserMgr.java @@ -59,14 +59,14 @@ * * @version 2, December 27, 2016 */ -public class UserMgr implements WebKontext, RequestKontext { +public class UserMgr extends Api /*implements WebKontext, RequestKontext*/ { private static final Logger logger = Logger.getLogger(UserMgr.class.getName()); /** Zeiger zum Servlet-Kontext dieser Anwendung */ - private ServletContext ctx; + //private ServletContext ctx; - private HttpServletRequest request; + //private HttpServletRequest request; /** Name, unter dem das Properties-Objekt mit den SQL-Befehlen im ServletContext hinterlegt ist */ public static final String UM_SQL_PROPERTIES = "umSqlProperties"; @@ -90,19 +90,24 @@ public static final String SQL_GET_USER_ROLES = "getUserRoles"; /** Referenz zum SQL-Befehl zum Loeschen aller Rollen eines Nutzers */ public static final String SQL_DELETE_USER_ROLES = "deleteUserRoles"; + public static final String SQL_GET_USER_DATA = "getUserData"; + + public static final String MP_USER = "userMapper"; + public static final String MP_USER_DATA = "userDataMapper"; + public static final String MP_USER_ROLE = "userRoleMapper"; /** Mapper-Objekt fuer Benutzer */ - private static final Record UserMapper = new GenericRecord(User.class); + //private static final Record UserMapper = new GenericRecord(User.class); /** Mapper-Objekt fuer Benutzerdaten */ //private static final Record UserDataMapper = new GenericRecord(UserData.class); /** Mapper-Objekt fuer Benutzerrollen */ - private static final Record UserRoleMapper = new GenericRecord(UserRole.class); + //private static final Record UserRoleMapper = new GenericRecord(UserRole.class); /* ----------- Benutzer -------------- */ public User createUser(User user) throws ClassNotFoundException, InstantiationException, IllegalAccessException { String kw = user.getPw(); - String digesterClassName = ctx.getInitParameter(P_DIGESTER); + String digesterClassName = getServletContext().getInitParameter(P_DIGESTER); Digester digester = (Digester) Class.forName(digesterClassName).newInstance(); /* MD5 geht nicht mehr, @@ -110,7 +115,7 @@ */ String digestedPw = digester.digest(kw, Digester.SHA256, null); user.setPw(digestedPw); - getDb().insert(user, UserMapper); + getDb().insert(user, getMapper(MP_USER)); return user; } @@ -123,11 +128,11 @@ Connection c = pm.getConnection(); pm.startTransaction(c); pm.execute(c, getSql(SQL_DELETE_USER_ROLES), user.getId()); - User deletedUser = (User) pm.delete(c, user, UserMapper); + User deletedUser = (User) pm.delete(c, user, getMapper(MP_USER)); pm.commit(c); return deletedUser; } - + public String logout() { getRequest().getSession().invalidate(); return "logged out"; @@ -136,12 +141,12 @@ /* ------------ Rollen ------------------ */ public UserRole grantRole(UserRole role) { - getDb().insert(role, UserRoleMapper); + getDb().insert(role, getMapper(MP_USER_ROLE)); return role; } public UserRole revokeRole(UserRole role) { - getDb().delete(role, UserRoleMapper); + getDb().delete(role, getMapper(MP_USER_ROLE)); return role; } @@ -167,6 +172,7 @@ * @param id Name des gewuenschten SQL-Kommandos * @return das SQL-Kommando mit der in id angegebenen Bezeichnung */ + /* private String getSql(String id) { Properties sql = (Properties) ctx.getAttribute(UserMgr.UM_SQL_PROPERTIES); return sql.getProperty(id); @@ -176,8 +182,18 @@ return (PersistenceManager) ctx.getAttribute(UM_DB); } + private Record getMapper(String mapperName) { + Record record = null; + Object o = getServletContext().getAttribute(mapperName); + if(o instanceof Record) { + record = (Record) o; + } + return record; + } + */ /* ------------- Implementierung WebKontext ------------- */ + /* @Override public ServletContext getServletContext() { return ctx; @@ -187,9 +203,11 @@ public void setServletContext(ServletContext servletContext) { this.ctx = servletContext; } + */ /* ------------- Implementierung RequestKontext ------------- */ + /* @Override public HttpServletRequest getRequest() { return request; @@ -199,6 +217,6 @@ public void setRequest(HttpServletRequest r) { this.request = r; } - + */ } diff --git a/src/java/de/uhilger/um/pub/SessionManager.java b/src/java/de/uhilger/um/pub/SessionManager.java new file mode 100644 index 0000000..a1a3af6 --- /dev/null +++ b/src/java/de/uhilger/um/pub/SessionManager.java @@ -0,0 +1,40 @@ +package de.uhilger.um.pub; + +import de.uhilger.baselink.PersistenceManager; +import de.uhilger.um.api.Api; +import static de.uhilger.um.api.UserMgr.MP_USER_DATA; +import static de.uhilger.um.api.UserMgr.SQL_GET_USER_DATA; +import static de.uhilger.um.api.UserMgr.WITHOUT_BLOBS; +import de.uhilger.um.daten.UserData; +import java.security.Principal; +import java.util.List; + +/** + * + */ +public class SessionManager extends Api { + + // /um/pub?c=de.uhilger.um.pub.SessionManager&m=getSessionUser + public UserData getSessionUser() { + UserData userData = new UserData(); + userData.setFirstName("nicht angemeldet"); + userData.setLastName("nicht angemeldet"); + userData.setId("nicht angemeldet"); + userData.setEmail("nicht angemeldet"); + Object p = getRequest().getUserPrincipal(); + if(p instanceof Principal) { + String id = ((Principal) p).getName(); + PersistenceManager pm = getDb(); + List userDataList = getDb().select(getSql(SQL_GET_USER_DATA), getMapper(MP_USER_DATA), WITHOUT_BLOBS, id); + if(userDataList != null && userDataList.size() > 0) { + Object o = userDataList.get(0); + if(o instanceof UserData) { + userData = (UserData) o; + } + } + } + return userData; + } + + +} diff --git a/src/java/de/uhilger/um/web/Initialiser.java b/src/java/de/uhilger/um/web/Initialiser.java index 0feeecd..21b4420 100644 --- a/src/java/de/uhilger/um/web/Initialiser.java +++ b/src/java/de/uhilger/um/web/Initialiser.java @@ -18,10 +18,13 @@ package de.uhilger.um.web; +import de.uhilger.baselink.GenericRecord; import de.uhilger.baselink.PersistenceManager; import de.uhilger.baselink.Record; import de.uhilger.um.api.UserMgr; import de.uhilger.um.daten.User; +import de.uhilger.um.daten.UserData; +import de.uhilger.um.daten.UserRole; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -124,6 +127,7 @@ PersistenceManager db = new PersistenceManager(); db.setDataSourceName(servletContext.getInitParameter(P_DSNAME)); servletContext.setAttribute(UserMgr.UM_DB, db); + initMapper(servletContext); Properties sql = (Properties) servletContext.getAttribute(UserMgr.UM_SQL_PROPERTIES); if(!dbVorhanden(db, sql.getProperty(SQL_DB_VORHANDEN))) { logger.info("Datenbank ist nicht vorhanden"); @@ -143,6 +147,21 @@ } } + /** + * Mapper erzeugen + * @param servletContext der ServletContext dieser Webanwendung + */ + /* + TODO: das noch auf on demand anlegen: GenericRecord wird erst angelegt + wenn er erstmals benoetigt wird. Ggf. auch einen Mechanismus zum entfernen + laenger nicht benoetigter Mapper hinzufuegen + */ + private void initMapper(ServletContext servletContext) { + servletContext.setAttribute(UserMgr.MP_USER, new GenericRecord(User.class)); + servletContext.setAttribute(UserMgr.MP_USER_DATA, new GenericRecord(UserData.class)); + servletContext.setAttribute(UserMgr.MP_USER_ROLE, new GenericRecord(UserRole.class)); + } + @SuppressWarnings("rawtypes") private boolean dbVorhanden(PersistenceManager pm, String sql) { boolean istVorhanden = false; diff --git a/web/WEB-INF/sql.properties b/web/WEB-INF/sql.properties index 8de6b17..b94548e 100644 --- a/web/WEB-INF/sql.properties +++ b/web/WEB-INF/sql.properties @@ -38,6 +38,9 @@ <entry key="deleteUserRoles"> delete from app.user_roles where user_name = ? </entry> + <entry key="getUserData"> + select user_name,user_first,user_last,user_email from app.users where user_name = ? + </entry> <entry key="getDateList"> select substr(or_zeit,1,8) as tag, count(*) as anz from app.orte as orte where or_pers_id = ? diff --git a/web/WEB-INF/web.xml b/web/WEB-INF/web.xml index 912ca8f..6f037ac 100644 --- a/web/WEB-INF/web.xml +++ b/web/WEB-INF/web.xml @@ -29,10 +29,22 @@ <param-value>de.uhilger.um.api</param-value> </init-param> </servlet> + <servlet> + <servlet-name>PublicTransit</servlet-name> + <servlet-class>de.uhilger.transit.web.TransitServlet</servlet-class> + <init-param> + <param-name>klassen</param-name> + <param-value>de.uhilger.um.pub</param-value> + </init-param> + </servlet> <servlet-mapping> <servlet-name>TransitServlet</servlet-name> <url-pattern>/api</url-pattern> </servlet-mapping> + <servlet-mapping> + <servlet-name>PublicTransit</servlet-name> + <url-pattern>/pub</url-pattern> + </servlet-mapping> <session-config> <session-timeout> 30 -- Gitblit v1.9.3