diff --git a/hsarback/conf/META-INF/persistence.xml b/hsarback/conf/META-INF/persistence.xml index 3174504..7f231f0 100644 --- a/hsarback/conf/META-INF/persistence.xml +++ b/hsarback/conf/META-INF/persistence.xml @@ -24,9 +24,30 @@ de.hsadmin.mods.db.Database de.hsadmin.mods.db.MySqlDatabase de.hsadmin.mods.db.PgSqlDatabase - - - - + + + HsarDataSource + de.hsadmin.core.qserv.QueueTask + de.hsadmin.mods.cust.Customer + de.hsadmin.mods.cust.Contact + de.hsadmin.mods.cust.BankAccount + de.hsadmin.mods.pac.Pac + de.hsadmin.mods.pac.BasePac + de.hsadmin.mods.pac.BaseComponent + de.hsadmin.mods.pac.Component + de.hsadmin.mods.pac.PacComponent + de.hsadmin.mods.pac.Hive + de.hsadmin.mods.pac.INetAddress + de.hsadmin.mods.user.UnixUser + de.hsadmin.mods.dom.Domain + de.hsadmin.mods.dom.DomainOption + de.hsadmin.mods.email.EMailAddress + de.hsadmin.mods.email.EMailAlias + de.hsadmin.mods.db.DatabaseUser + de.hsadmin.mods.db.MySqlUser + de.hsadmin.mods.db.PgSqlUser + de.hsadmin.mods.db.Database + de.hsadmin.mods.db.MySqlDatabase + de.hsadmin.mods.db.PgSqlDatabase diff --git a/hsarback/lib/enhance/asm-3.2.jar b/hsarback/lib/enhance/asm-3.2.jar new file mode 100644 index 0000000..ca9f8d2 Binary files /dev/null and b/hsarback/lib/enhance/asm-3.2.jar differ diff --git a/hsarback/lib/enhance/openjpa-2.1.1.jar b/hsarback/lib/enhance/openjpa-2.2.1.jar similarity index 57% rename from hsarback/lib/enhance/openjpa-2.1.1.jar rename to hsarback/lib/enhance/openjpa-2.2.1.jar index ba14cba..8a7b663 100644 Binary files a/hsarback/lib/enhance/openjpa-2.1.1.jar and b/hsarback/lib/enhance/openjpa-2.2.1.jar differ diff --git a/hsarback/src/de/hsadmin/core/model/LoginBean.java b/hsarback/src/de/hsadmin/core/model/LoginBean.java new file mode 100644 index 0000000..130591b --- /dev/null +++ b/hsarback/src/de/hsadmin/core/model/LoginBean.java @@ -0,0 +1,82 @@ +package de.hsadmin.core.model; + +import java.util.Set; + +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + +import de.hsadmin.core.util.Config; +import de.hsadmin.mods.cust.Customer; +import de.hsadmin.mods.pac.Pac; +import de.hsadmin.mods.user.UnixUser; + +@Stateless(name="LoginBean") +@LocalBean +public class LoginBean implements LoginBeanLocal { + + @PersistenceContext(unitName="hsar") + private EntityManager entityManager; + + @Override + public UnixUser login(String user, String ticket) throws AuthenticationException { + String ticketUser = TicketValidator.getInstance().validateTicket(ticket); + if (user != null && user.equals(ticketUser)) { + return readLoginUser(ticketUser); // user himself + } + if (ticketUser != null && ticketUser.length() == 2) { + return readLoginUser(ticketUser); // 2-letter hostmaster + } + String hostmasterAccountPrefix = Config.getInstance().getProperty("accountprefix.hostmaster", "hsh01") + "-"; + if (ticketUser != null && ticketUser.startsWith(hostmasterAccountPrefix) && ticketUser.length() == 8) { + return readLoginUser(ticketUser); // hsh01 hostmaster + } + if (ticketUser != null && ticketUser.length() == 5) { + Query userQuery = entityManager.createQuery("SELECT u FROM UnixUsers u WHERE u.name = :username"); + userQuery.setParameter("username", user); + UnixUser unixUser = (UnixUser) userQuery.getSingleResult(); + String pacName = unixUser.getPac().getName(); + boolean loginOk = ticketUser.equals(pacName); + if (loginOk) { + return readLoginUser(ticketUser); + } + throw new AuthenticationException("User " + ticketUser + " is not allowed to run as " + user); + } + String memberAccountPrefix = Config.getInstance().getProperty("accountprefix.customer", "hsh00") + "-"; + if (ticketUser != null && (ticketUser.length() == 3 || (ticketUser.length() >= 9 && ticketUser.startsWith(memberAccountPrefix)))) { + Query memberQuery = entityManager.createQuery("SELECT c FROM Customers c WHERE c.name = :membername"); + memberQuery.setParameter("membername", ticketUser.length() == 3 ? (memberAccountPrefix + ticketUser) : ticketUser); + Customer member = (Customer) memberQuery.getSingleResult(); + Set pacs = member.getPacs(); + for (Pac p : pacs) { + if (p.getName().equals(user)) { + return readLoginUser(ticketUser); // member as pac-admin + } + Set users = p.getUnixUser(); + for (UnixUser u : users) { + if (u.getName().equals(user)) { + return readLoginUser(ticketUser); // member as pac-user + } + } + } + } + throw new AuthenticationException("User " + ticketUser + " is not allowed to run as " + user); + } + + private UnixUser readLoginUser(String loginName) { + if (loginName != null && loginName.length() == 2) { + loginName = Config.getInstance().getProperty("accountprefix.hostmaster", "hsh01") + "-" + loginName; + } + if (loginName != null && loginName.length() == 3) { + loginName = Config.getInstance().getProperty("accountprefix.customer", "hsh00") + "-" + loginName; + } + Query userQuery = entityManager.createQuery("SELECT u FROM UnixUsers u WHERE u.name = :username"); + userQuery.setParameter("username", loginName); + UnixUser user = (UnixUser) userQuery.getSingleResult(); + user.getPac().getCustomer(); + return user; + } + +} diff --git a/hsarback/src/de/hsadmin/core/model/LoginBeanLocal.java b/hsarback/src/de/hsadmin/core/model/LoginBeanLocal.java new file mode 100644 index 0000000..5d6100c --- /dev/null +++ b/hsarback/src/de/hsadmin/core/model/LoginBeanLocal.java @@ -0,0 +1,12 @@ +package de.hsadmin.core.model; + +import javax.ejb.Local; + +import de.hsadmin.mods.user.UnixUser; + +@Local +public interface LoginBeanLocal { + + public abstract UnixUser login(String user, String ticket) throws AuthenticationException; + +} \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/core/model/LoginSession.java b/hsarback/src/de/hsadmin/core/model/LoginSession.java index 8285d18..7f5fd37 100644 --- a/hsarback/src/de/hsadmin/core/model/LoginSession.java +++ b/hsarback/src/de/hsadmin/core/model/LoginSession.java @@ -1,99 +1,29 @@ package de.hsadmin.core.model; -import java.util.Set; - import javax.ejb.LocalBean; import javax.ejb.Stateful; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.PersistenceContextType; -import javax.persistence.Query; -import de.hsadmin.core.util.Config; -import de.hsadmin.mods.cust.Customer; -import de.hsadmin.mods.pac.Pac; import de.hsadmin.mods.user.UnixUser; @Stateful(name="LoginSession") @LocalBean public class LoginSession implements LoginSessionLocal { - @PersistenceContext(unitName="hsadmin",type=PersistenceContextType.TRANSACTION) - private EntityManager entityManager; - - private String loginName; + private UnixUser loginUser; @Override public UnixUser getLoginUser() { - String loginName = getLoginName(); - if (loginName != null && loginName.length() == 2) { - loginName = Config.getInstance().getProperty("accountprefix.hostmaster", "hsh01") + "-" + loginName; - } - if (loginName != null && loginName.length() == 3) { - loginName = Config.getInstance().getProperty("accountprefix.customer", "hsh00") + "-" + loginName; - } - Query userQuery = entityManager.createQuery("SELECT u FROM UnixUsers u WHERE u.name = :username"); - userQuery.setParameter("username", loginName); - UnixUser unixUser = (UnixUser) userQuery.getSingleResult(); - return unixUser; + return loginUser; } @Override public String getLoginName() { - if (loginName != null) { - return loginName; - } - throw new TechnicalException("no login"); + return loginUser.getName(); } @Override - public boolean login(String user, String ticket) throws AuthenticationException { - String ticketUser = TicketValidator.getInstance().validateTicket(ticket); - if (user != null && user.equals(ticketUser)) { - loginName = ticketUser; - return true; // user himself - } - if (ticketUser != null && ticketUser.length() == 2) { - loginName = ticketUser; - return true; // 2-letter hostmaster - } - String hostmasterAccountPrefix = Config.getInstance().getProperty("accountprefix.hostmaster", "hsh01") + "-"; - if (ticketUser != null && ticketUser.startsWith(hostmasterAccountPrefix) && ticketUser.length() == 8) { - loginName = ticketUser; - return true; // hsh01 hostmaster - } - if (ticketUser != null && ticketUser.length() == 5) { - Query userQuery = entityManager.createQuery("SELECT u FROM UnixUsers u WHERE u.name = :username"); - userQuery.setParameter("username", user); - UnixUser unixUser = (UnixUser) userQuery.getSingleResult(); - String pacName = unixUser.getPac().getName(); - boolean loginOk = ticketUser.equals(pacName); - if (loginOk) { - loginName = ticketUser; - } - return loginOk; // pac-admin - } - String memberAccountPrefix = Config.getInstance().getProperty("accountprefix.customer", "hsh00") + "-"; - if (ticketUser != null && (ticketUser.length() == 3 || (ticketUser.length() >= 9 && ticketUser.startsWith(memberAccountPrefix)))) { - Query memberQuery = entityManager.createQuery("SELECT c FROM Customers c WHERE c.name = :membername"); - memberQuery.setParameter("membername", ticketUser.length() == 3 ? (memberAccountPrefix + ticketUser) : ticketUser); - Customer member = (Customer) memberQuery.getSingleResult(); - Set pacs = member.getPacs(); - for (Pac p : pacs) { - if (p.getName().equals(user)) { - loginName = ticketUser; - return true; // member as pac-admin - } - Set users = p.getUnixUser(); - for (UnixUser u : users) { - if (u.getName().equals(user)) { - loginName = ticketUser; - return true; // member as pac-user - } - } - } - } - throw new AuthenticationException("User " + ticketUser + " is not allowed to run as " + user); + public void setLoginUser(UnixUser user) { + loginUser = user; } } diff --git a/hsarback/src/de/hsadmin/core/model/LoginSessionLocal.java b/hsarback/src/de/hsadmin/core/model/LoginSessionLocal.java index 196bcce..160cac1 100644 --- a/hsarback/src/de/hsadmin/core/model/LoginSessionLocal.java +++ b/hsarback/src/de/hsadmin/core/model/LoginSessionLocal.java @@ -7,11 +7,10 @@ import de.hsadmin.mods.user.UnixUser; @Local public interface LoginSessionLocal { + public abstract void setLoginUser(UnixUser user); + public abstract UnixUser getLoginUser(); public abstract String getLoginName(); - public abstract boolean login(String user, String ticket) - throws AuthenticationException; - } \ No newline at end of file diff --git a/hsarback/src/de/hsadmin/core/model/Module.java b/hsarback/src/de/hsadmin/core/model/Module.java index e519f6e..fbcde9e 100644 --- a/hsarback/src/de/hsadmin/core/model/Module.java +++ b/hsarback/src/de/hsadmin/core/model/Module.java @@ -20,4 +20,6 @@ public interface Module { public AbstractEntity update(LoginSessionLocal session, AbstractEntity existingEntity) throws HSAdminException; public void delete(LoginSessionLocal session, AbstractEntity existingEntity) throws HSAdminException; + + public void detach(AbstractEntity update); } diff --git a/hsarback/src/de/hsadmin/mods/email/EMailAliasModuleImpl.java b/hsarback/src/de/hsadmin/mods/email/EMailAliasModuleImpl.java index ac31e00..61649a4 100644 --- a/hsarback/src/de/hsadmin/mods/email/EMailAliasModuleImpl.java +++ b/hsarback/src/de/hsadmin/mods/email/EMailAliasModuleImpl.java @@ -5,6 +5,7 @@ import java.util.LinkedList; import java.util.List; import javax.ejb.EJB; +import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.persistence.Entity; import javax.persistence.EntityManager; @@ -27,10 +28,11 @@ import de.hsadmin.hostsharing.MultiOption; import de.hsadmin.mods.pac.Pac; import de.hsadmin.mods.user.UnixUser; -@Stateless +@Stateless(name="EMailAliasModule") +@LocalBean public class EMailAliasModuleImpl implements Module { - @PersistenceContext(name="hsadmin") + @PersistenceContext(name="hsar") private EntityManager entityManager; @EJB diff --git a/hsarback/src/de/hsadmin/mods/user/UnixUser.java b/hsarback/src/de/hsadmin/mods/user/UnixUser.java index d71daf1..70e6408 100644 --- a/hsarback/src/de/hsadmin/mods/user/UnixUser.java +++ b/hsarback/src/de/hsadmin/mods/user/UnixUser.java @@ -26,7 +26,7 @@ import de.hsadmin.mods.pac.Pac; @Entity(name = "UnixUsers") @Table(name = "unixuser") @SequenceGenerator(name = "UnixUsersSeqGen", sequenceName = "unixuser_unixuser_id_seq") -@AnnModuleImpl(de.hsadmin.mods.user.UnixUserModuleImpl.class) +@AnnModuleImpl(UnixUserModuleImpl.class) public class UnixUser extends AbstractEntity implements Serializable { private static final long serialVersionUID = 7823071611805642906L; diff --git a/hsarback/src/de/hsadmin/remote/EMailAliasRemote.java b/hsarback/src/de/hsadmin/remote/EMailAliasRemote.java index 698f848..d0f3771 100644 --- a/hsarback/src/de/hsadmin/remote/EMailAliasRemote.java +++ b/hsarback/src/de/hsadmin/remote/EMailAliasRemote.java @@ -10,27 +10,24 @@ import java.util.Map; import java.util.Properties; import java.util.StringTokenizer; -import javax.ejb.EJB; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import de.hsadmin.core.model.AbstractEntity; -import de.hsadmin.core.model.AuthenticationException; import de.hsadmin.core.model.AuthorisationException; import de.hsadmin.core.model.HSAdminException; +import de.hsadmin.core.model.LoginBeanLocal; import de.hsadmin.core.model.LoginSessionLocal; +import de.hsadmin.core.model.Module; import de.hsadmin.mods.email.EMailAlias; -import de.hsadmin.mods.email.EMailAliasModuleImpl; import de.hsadmin.mods.user.UnixUser; public class EMailAliasRemote { - @EJB + private LoginBeanLocal login; private LoginSessionLocal session; - - @EJB - private EMailAliasModuleImpl module; + private Module module; public EMailAliasRemote() { Properties props = new Properties(); @@ -39,7 +36,8 @@ public class EMailAliasRemote { try { ctx = new InitialContext(props); session = (LoginSessionLocal) ctx.lookup("LoginSessionLocal"); - module = (EMailAliasModuleImpl) ctx.lookup("EMailAliasModuleLocal"); + login = (LoginBeanLocal) ctx.lookup("LoginBeanLocal"); + module = (Module) ctx.lookup("EMailAliasModuleLocal"); } catch (NamingException e) { e.printStackTrace(); } @@ -49,25 +47,22 @@ public class EMailAliasRemote { Map whereParams) throws HSAdminException { String user = runAsUser; try { - if (session.login(user, ticket)) { - UnixUser unixUser = session.getLoginUser(); - List list = module.search(session, getEntityClass(), - buildQueryCondition(whereParams), null); - if (list == null) { - throw new HSAdminException("result list is null, runtime-error?"); - } - ArrayList> result = new ArrayList>(); - for (AbstractEntity e : list) { - HashMap entry = new HashMap(); - entity2map(e, entry); - if (e.isReadAllowedFor(unixUser)) { - result.add(entry); - } - } - return result; - } else { - throw new AuthenticationException("authentication failed"); + session.setLoginUser(login.login(user, ticket)); + UnixUser unixUser = session.getLoginUser(); + List list = module.search(session, getEntityClass(), + buildQueryCondition(whereParams), null); + if (list == null) { + throw new HSAdminException("result list is null, runtime-error?"); } + ArrayList> result = new ArrayList>(); + for (AbstractEntity e : list) { + HashMap entry = new HashMap(); + entity2map(e, entry); + if (e.isReadAllowedFor(unixUser)) { + result.add(entry); + } + } + return result; } catch (SecurityException e) { throw new HSAdminException(e); } catch (IllegalArgumentException e) { @@ -79,19 +74,16 @@ public class EMailAliasRemote { Map setParams) throws HSAdminException { String user = runAsUser; try { - if (session.login(user, ticket)) { - Constructor constructor = + session.setLoginUser(login.login(user, ticket)); + Constructor constructor = getEntityClass().getConstructor(); - AbstractEntity entity = constructor.newInstance(); - module.initialize(session, entity); - map2entity(setParams, entity); - AbstractEntity insertedEntity = module.add(session, entity); - HashMap entry = new HashMap(); - entity2map(insertedEntity, entry); - return entry; - } else { - throw new AuthenticationException("authentication failed"); - } + AbstractEntity entity = constructor.newInstance(); + module.initialize(session, entity); + map2entity(setParams, entity); + AbstractEntity insertedEntity = module.add(session, entity); + HashMap entry = new HashMap(); + entity2map(insertedEntity, entry); + return entry; } catch (Exception e) { throw new HSAdminException(e); } @@ -101,24 +93,21 @@ public class EMailAliasRemote { Map whereParams) throws HSAdminException { String user = runAsUser; try { - if (session.login(user, ticket)) { - UnixUser unixUser = session.getLoginUser(); - String queryCondition = buildQueryCondition(whereParams); - if (queryCondition == null || queryCondition.length() == 0) { - throw new HSAdminException( - "better safe than sorry: no where parameter found"); + session.setLoginUser(login.login(user, ticket)); + UnixUser unixUser = session.getLoginUser(); + String queryCondition = buildQueryCondition(whereParams); + if (queryCondition == null || queryCondition.length() == 0) { + throw new HSAdminException( + "better safe than sorry: no where parameter found"); + } + List list = module.search(session, getEntityClass(), + queryCondition, null); + for (AbstractEntity e : list) { + if (e.isWriteAllowedFor(unixUser)) { + module.delete(session, e); + } else { + throw new AuthorisationException(unixUser, "delete", e); } - List list = module.search(session, getEntityClass(), - queryCondition, null); - for (AbstractEntity e : list) { - if (e.isWriteAllowedFor(unixUser)) { - module.delete(session, e); - } else { - throw new AuthorisationException(unixUser, "delete", e); - } - } - } else { - throw new AuthenticationException("authentication failed"); } } catch (SecurityException e) { throw new HSAdminException(e); @@ -132,32 +121,29 @@ public class EMailAliasRemote { throws HSAdminException { String user = runAsUser; try { - if (session.login(user, ticket)) { - UnixUser unixUser = session.getLoginUser(); - ArrayList> result = new ArrayList>(); - String queryCondition = buildQueryCondition(whereParams); - if (queryCondition == null || queryCondition.length() == 0) { - throw new HSAdminException( - "better safe than sorry: no where parameter found"); - } - List list = module.search(session, getEntityClass(), - queryCondition, getOrderBy()); - for (AbstractEntity update : list) { - if (update.isWriteAllowedFor(unixUser)) { - module.detach(update); - map2entity(setParams, update); - update = module.update(session, update); - HashMap entry = new HashMap(); - entity2map(update, entry); - result.add(entry); - } else { - throw new AuthorisationException(unixUser, "update", update); - } - } - return result; - } else { - throw new AuthenticationException("authentication failed"); + session.setLoginUser(login.login(user, ticket)); + UnixUser unixUser = session.getLoginUser(); + ArrayList> result = new ArrayList>(); + String queryCondition = buildQueryCondition(whereParams); + if (queryCondition == null || queryCondition.length() == 0) { + throw new HSAdminException( + "better safe than sorry: no where parameter found"); } + List list = module.search(session, getEntityClass(), + queryCondition, getOrderBy()); + for (AbstractEntity update : list) { + if (update.isWriteAllowedFor(unixUser)) { + module.detach(update); + map2entity(setParams, update); + update = module.update(session, update); + HashMap entry = new HashMap(); + entity2map(update, entry); + result.add(entry); + } else { + throw new AuthorisationException(unixUser, "update", update); + } + } + return result; } catch (SecurityException e) { throw new HSAdminException(e); } catch (IllegalArgumentException e) {