Commit 46b17589 by Tuomas Riihimäki

foobar

1 parent a362cd15
Showing with 212 additions and 126 deletions
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
<attribute name="owner.project.facets" value="java"/> <attribute name="owner.project.facets" value="java"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="lib" path="/Users/tuomari/bin/glassfishv3_b10-07_12_2010/glassfish/lib/appserv-rt.jar"/> <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<classpathentry kind="lib" path="/Users/tuomari/bin/glassfishv31_b21_2010_09_18/glassfish/lib/appserv-rt.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<classpath> <classpath>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes> <attributes>
<attribute name="owner.project.facets" value="java"/> <attribute name="owner.project.facets" value="java"/>
</attributes> </attributes>
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faceted-project> <faceted-project>
<runtime name="GlassFish v3 Java EE 6"/>
<fixed facet="java"/> <fixed facet="java"/>
<fixed facet="jst.utility"/> <fixed facet="jst.utility"/>
<installed facet="jst.utility" version="1.0"/> <installed facet="jst.utility" version="1.0"/>
......
...@@ -4,15 +4,11 @@ ...@@ -4,15 +4,11 @@
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry combineaccessrules="false" kind="src" path="/LanBortalBeansClient"/> <classpathentry combineaccessrules="false" kind="src" path="/LanBortalBeansClient"/>
<classpathentry combineaccessrules="false" kind="src" path="/LanBortalAuthModuleClient"/> <classpathentry combineaccessrules="false" kind="src" path="/LanBortalAuthModuleClient"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="owner.project.facets" value="jst.ejb"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6">
<attributes> <attributes>
<attribute name="owner.project.facets" value="java"/> <attribute name="owner.project.facets" value="java"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<classpathentry kind="output" path="build/classes"/> <classpathentry kind="output" path="build/classes"/>
</classpath> </classpath>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faceted-project> <faceted-project>
<runtime name="GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<fixed facet="jst.ejb"/> <fixed facet="jst.ejb"/>
<fixed facet="jst.java"/> <fixed facet="jst.java"/>
<installed facet="jst.java" version="6.0"/> <installed facet="jst.java" version="6.0"/>
......
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
......
...@@ -46,7 +46,7 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote { ...@@ -46,7 +46,7 @@ public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
if (user.checkPassword(password)) { if (user.checkPassword(password)) {
ret = user; ret = user;
} else { } else {
secubean.logMessage(SecurityLogType.permissionDenied, user, "Login failed: wrong password!"); secubean.logMessage(SecurityLogType.permissionDenied, user, "Login failed: wrong password! ");
} }
} else { } else {
secubean.logMessage(SecurityLogType.permissionDenied, "Login failed: Username not found: " + username); secubean.logMessage(SecurityLogType.permissionDenied, "Login failed: Username not found: " + username);
......
...@@ -19,8 +19,12 @@ import fi.insomnia.bortal.enums.Permission; ...@@ -19,8 +19,12 @@ import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission; import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.exceptions.BortalCatchableException; import fi.insomnia.bortal.exceptions.BortalCatchableException;
import fi.insomnia.bortal.exceptions.PermissionDeniedException; import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.GroupMembershipFacade;
import fi.insomnia.bortal.facade.PlaceFacade; import fi.insomnia.bortal.facade.PlaceFacade;
import fi.insomnia.bortal.facade.PlaceGroupFacade;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Place; import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.PlaceGroup; import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.Product; import fi.insomnia.bortal.model.Product;
...@@ -45,7 +49,8 @@ import org.slf4j.LoggerFactory; ...@@ -45,7 +49,8 @@ import org.slf4j.LoggerFactory;
public class PlaceBean implements PlaceBeanLocal { public class PlaceBean implements PlaceBeanLocal {
private static final String PLACE_RESERVE_TIMEOUTER = "Map reserve timeouter"; private static final String PLACE_RESERVE_TIMEOUTER = "Map reserve timeouter";
private static final Logger logger = LoggerFactory.getLogger(PlaceBean.class); private static final Logger logger = LoggerFactory.getLogger(PlaceBean.class);
@EJB
private GroupMembershipFacade gmemfacade;
@Resource @Resource
private TimerService ts; private TimerService ts;
...@@ -53,6 +58,8 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -53,6 +58,8 @@ public class PlaceBean implements PlaceBeanLocal {
private PlaceFacade placeFacade; private PlaceFacade placeFacade;
@EJB @EJB
private PlaceGroupFacade pgfacade;
@EJB
private UserBeanLocal userbean; private UserBeanLocal userbean;
@EJB @EJB
...@@ -167,13 +174,18 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -167,13 +174,18 @@ public class PlaceBean implements PlaceBeanLocal {
@Override @Override
public boolean buySelectedPlaces(EventMap e) throws BortalCatchableException { public boolean buySelectedPlaces(EventMap e) throws BortalCatchableException {
userbean.fatalPermission(Permission.MAP, RolePermission.EXECUTE, "User does not have rights to reserve ( and buy) a place"); userbean.fatalPermission(Permission.MAP, RolePermission.EXECUTE, "User does not have rights to reserve ( and buy) a place");
LanEvent event = eventBean.getCurrentEvent();
User user = userbean.getCurrentUser(); User user = userbean.getCurrentUser();
List<Place> places = placeFacade.findUsersReservations(e, user); List<Place> places = placeFacade.findUsersReservations(e, user);
if (places.size() <= 0) { if (places.size() <= 0) {
return false; return false;
} }
PlaceGroup pg = pgbean.createPlaceGroup(user); PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true);
pg.setCreator(user);
pgfacade.create(pg);
// PlaceGroup pg = pgbean.createPlaceGroup(user);
BigDecimal totalprice = totalReservationPrice(e, null); BigDecimal totalprice = totalReservationPrice(e, null);
BigDecimal balance = userbean.getCurrentUser().getAccountBalance(); BigDecimal balance = userbean.getCurrentUser().getAccountBalance();
if (balance.compareTo(totalprice) < 0) { if (balance.compareTo(totalprice) < 0) {
...@@ -186,7 +198,8 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -186,7 +198,8 @@ public class PlaceBean implements PlaceBeanLocal {
throw new BortalCatchableException("Error while buying places"); throw new BortalCatchableException("Error while buying places");
} }
placeFacade.merge(p); placeFacade.merge(p);
pgbean.createGroupMembership(pg, p); GroupMembership membership = new GroupMembership(event, pg, p, gmemfacade.createInviteToken(event));
pg.getMembers().add(membership);
} }
for (Entry<Product, Integer> line : getPlaceProductcount(places).entrySet()) { for (Entry<Product, Integer> line : getPlaceProductcount(places).entrySet()) {
...@@ -198,14 +211,19 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -198,14 +211,19 @@ public class PlaceBean implements PlaceBeanLocal {
@Override @Override
public void lockPlaces(User user, Product prod, BigDecimal quantity) { public void lockPlaces(User user, Product prod, BigDecimal quantity) {
BigDecimal loop = BigDecimal.ZERO; BigDecimal loop = BigDecimal.ZERO;
PlaceGroup pg = pgbean.createPlaceGroup(user); LanEvent event = eventBean.getCurrentEvent();
PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true);
pg.setCreator(user);
pgfacade.create(pg);
for (Place p : prod.getPlaces()) { for (Place p : prod.getPlaces()) {
if (!p.isTaken()) { if (!p.isTaken()) {
p.reserve(user); p.reserve(user);
p.buy(pg); p.buy(pg);
pg.getMembers().add(new GroupMembership(event, pg, p, gmemfacade.createInviteToken(event)));
placeFacade.merge(p); placeFacade.merge(p);
pgbean.createGroupMembership(pg, p); // pgbean.createGroupMembership(pg, p);
loop = loop.add(BigDecimal.ONE); loop = loop.add(BigDecimal.ONE);
if (loop.compareTo(quantity) >= 0) { if (loop.compareTo(quantity) >= 0) {
break; break;
...@@ -217,7 +235,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -217,7 +235,7 @@ public class PlaceBean implements PlaceBeanLocal {
@Override @Override
public int setBuyable(EventMap map, String like, boolean b) { public int setBuyable(EventMap map, String like, boolean b) {
userbean.fatalPermission(Permission.MAP, RolePermission.WRITE, "User tried to change place buyable: " + like + " to " + b); userbean.fatalPermission(Permission.MAP, RolePermission.WRITE, "User tried to change place buyable: " + like + " to " + b);
return placeFacade.setBuyable(map, like, b); return placeFacade.setBuyable(map, like, b);
} }
......
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.GroupMembershipFacade; import fi.insomnia.bortal.facade.GroupMembershipFacade;
import fi.insomnia.bortal.facade.PlaceGroupFacade; import fi.insomnia.bortal.facade.PlaceGroupFacade;
import fi.insomnia.bortal.model.GroupMembership; import fi.insomnia.bortal.model.GroupMembership;
...@@ -18,6 +26,7 @@ import fi.insomnia.bortal.model.User; ...@@ -18,6 +26,7 @@ import fi.insomnia.bortal.model.User;
@Stateless @Stateless
public class PlaceGroupBean implements PlaceGroupBeanLocal { public class PlaceGroupBean implements PlaceGroupBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(PlaceGroupBean.class);
@EJB @EJB
private EventBeanLocal eventbean; private EventBeanLocal eventbean;
...@@ -25,6 +34,10 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -25,6 +34,10 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
private PlaceGroupFacade pgfacade; private PlaceGroupFacade pgfacade;
@EJB @EJB
private GroupMembershipFacade gmemfacade; private GroupMembershipFacade gmemfacade;
@EJB
private UserBeanLocal userbean;
@EJB
private SecurityBeanLocal secubean;
/** /**
* Default constructor. * Default constructor.
...@@ -33,19 +46,51 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -33,19 +46,51 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }
// @Override
// public PlaceGroup createPlaceGroup(User creator) {
// }
// @Override
// public GroupMembership createGroupMembership(PlaceGroup pg, Place p) {
//
// GroupMembership membership = new
// GroupMembership(eventbean.getCurrentEvent(), pg, p,
// gmemfacade.createInviteToken());
// gmemfacade.create(membership);
// return membership;
// }
@Override @Override
public PlaceGroup createPlaceGroup(User creator) { public List<GroupMembership> getMemberships(User user) {
PlaceGroup pg = new PlaceGroup(eventbean.getCurrentEvent(), Calendar.getInstance(), Calendar.getInstance(), true); userbean.fatalNotLoggedIn();
pg.setCreator(creator); List<GroupMembership> ret = gmemfacade.find(eventbean.getCurrentEvent(), user);
pgfacade.create(pg); return ret;
return pg;
} }
@Override @Override
public GroupMembership createGroupMembership(PlaceGroup pg, Place p) { public boolean associateToToken(User user, String token) {
userbean.fatalNotLoggedIn();
GroupMembership mem = gmemfacade.findByToken(token);
boolean ret = false;
GroupMembership membership = new GroupMembership(eventbean.getCurrentEvent(), pg, p, gmemfacade.createInviteToken()); if (mem != null && mem.getUser() == null) {
gmemfacade.create(membership); mem.setUser(user);
return membership; gmemfacade.merge(mem);
ret = true;
}
return ret;
}
@Override
public void releaseAndGenerateToken(GroupMembership gmem) {
if (!userbean.getCurrentUser().equals(gmem.getPlaceGroup().getCreator()) ||
!userbean.hasCurrentUserPermission(Permission.MAP, RolePermission.WRITE)) {
throw new PermissionDeniedException(secubean, userbean.getCurrentUser(), "User tried to release and generate group membership: " + gmem);
}
gmem.setUser(null);
gmem.setInviteToken(gmemfacade.createInviteToken(eventbean.getCurrentEvent()));
gmemfacade.merge(gmem);
} }
} }
...@@ -130,7 +130,6 @@ public class UserBean implements UserBeanLocal { ...@@ -130,7 +130,6 @@ public class UserBean implements UserBeanLocal {
return defaultUser; return defaultUser;
} }
// TODO: Voisi olla hyvä idea cachettaa... Tätä kutsutaan aika paljon..
public boolean hasPermission(Permission target, RolePermission permission) { public boolean hasPermission(Permission target, RolePermission permission) {
User user = getCurrentUser(); User user = getCurrentUser();
......
package fi.insomnia.bortal.facade; package fi.insomnia.bortal.facade;
import java.util.List;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
...@@ -10,6 +12,8 @@ import org.slf4j.Logger; ...@@ -10,6 +12,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.model.GroupMembership; import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.utilities.PasswordFunctions; import fi.insomnia.bortal.utilities.PasswordFunctions;
@Stateless @Stateless
...@@ -28,14 +32,15 @@ public class GroupMembershipFacade extends EventChildGenericFacade<GroupMembersh ...@@ -28,14 +32,15 @@ public class GroupMembershipFacade extends EventChildGenericFacade<GroupMembersh
return em; return em;
} }
public String createInviteToken() { public String createInviteToken(LanEvent event) {
String token = null; String token = null;
GroupMembership gm = null; GroupMembership gm = null;
do { do {
if (token != null) { if (token != null) {
logger.info("Generated token {} found from GoupMembership: {} Generating new!", token, gm); logger.info("Generated token {} found from GoupMembership: {} Generating new!", token, gm);
} }
token = PasswordFunctions.generateRandomString(15); token = event.getId().toString();
token += PasswordFunctions.generateRandomString(15);
gm = findByToken(token); gm = findByToken(token);
} while (gm != null); } while (gm != null);
return token; return token;
...@@ -46,4 +51,11 @@ public class GroupMembershipFacade extends EventChildGenericFacade<GroupMembersh ...@@ -46,4 +51,11 @@ public class GroupMembershipFacade extends EventChildGenericFacade<GroupMembersh
q.setParameter("token", token); q.setParameter("token", token);
return getSingleNullableResult(q); return getSingleNullableResult(q);
} }
public List<GroupMembership> find(LanEvent event, User user) {
TypedQuery<GroupMembership> p = em.createQuery("select gm from GroupMembership gm where gm.id.eventId = :eventid and (gm.placeGroup.creator = :user or gm.user = :user) order by gm.placeReservation.name",GroupMembership.class);
p.setParameter("eventid", event.getId());
p.setParameter("user", user);
return p.getResultList();
}
} }
...@@ -3,15 +3,11 @@ ...@@ -3,15 +3,11 @@
<classpathentry kind="src" path="ejbModule"/> <classpathentry kind="src" path="ejbModule"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry combineaccessrules="false" kind="src" path="/LanBortalAuthModuleClient"/> <classpathentry combineaccessrules="false" kind="src" path="/LanBortalAuthModuleClient"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="owner.project.facets" value="jst.utility"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6">
<attributes> <attributes>
<attribute name="owner.project.facets" value="java"/> <attribute name="owner.project.facets" value="java"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<classpathentry kind="output" path="ejbModule"/> <classpathentry kind="output" path="ejbModule"/>
</classpath> </classpath>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faceted-project> <faceted-project>
<runtime name="GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<fixed facet="jst.utility"/> <fixed facet="jst.utility"/>
<fixed facet="jst.java"/> <fixed facet="jst.java"/>
<installed facet="jst.utility" version="1.0"/> <installed facet="jst.utility" version="1.0"/>
......
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.util.List;
import javax.ejb.Local; import javax.ejb.Local;
import fi.insomnia.bortal.model.GroupMembership; import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
@Local @Local
public interface PlaceGroupBeanLocal { public interface PlaceGroupBeanLocal {
PlaceGroup createPlaceGroup(User currentUser); // PlaceGroup createPlaceGroup(User currentUser);
// GroupMembership createGroupMembership(PlaceGroup pg, Place p);
List<GroupMembership> getMemberships(User user);
boolean associateToToken(User user, String token);
GroupMembership createGroupMembership(PlaceGroup pg, Place p); void releaseAndGenerateToken(GroupMembership gmem);
} }
...@@ -3,20 +3,11 @@ ...@@ -3,20 +3,11 @@
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry combineaccessrules="false" kind="src" path="/LanBortalUtilities"/> <classpathentry combineaccessrules="false" kind="src" path="/LanBortalUtilities"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes>
<attribute name="owner.project.facets" value="jst.utility"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6">
<attributes> <attributes>
<attribute name="owner.project.facets" value="java"/> <attribute name="owner.project.facets" value="java"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="lib" path="/Users/tuomari/bin/glassfishv31_0507_2/glassfish/modules/org.eclipse.persistence.core.jar" sourcepath="/Users/tuomari/bin/glassfishv31_b16_2010_08_16/glassfish/modules/org.eclipse.persistence.core.jar"> <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<attributes>
<attribute name="javadoc_location" value="jar:file:/Applications/eclipse_Helios_m6/plugins/com.sun.enterprise.jst.server.sunappsrv_1.0.53.jar!/javaee6doc"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="build/classes"/> <classpathentry kind="output" path="build/classes"/>
</classpath> </classpath>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faceted-project> <faceted-project>
<runtime name="GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<fixed facet="jst.utility"/> <fixed facet="jst.utility"/>
<fixed facet="jst.java"/> <fixed facet="jst.java"/>
<fixed facet="jpt.jpa"/> <fixed facet="jpt.jpa"/>
......
...@@ -2,16 +2,12 @@ ...@@ -2,16 +2,12 @@
<classpath> <classpath>
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"> <classpathentry kind="src" path="/LanBortalBeansClient"/>
<attributes> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attribute name="owner.project.facets" value="jst.utility"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6">
<attributes> <attributes>
<attribute name="owner.project.facets" value="java"/> <attribute name="owner.project.facets" value="java"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="src" path="/LanBortalBeansClient"/> <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<classpathentry kind="output" path="build/classes"/> <classpathentry kind="output" path="build/classes"/>
</classpath> </classpath>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<faceted-project> <faceted-project>
<runtime name="GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<fixed facet="jst.java"/> <fixed facet="jst.java"/>
<fixed facet="jst.utility"/> <fixed facet="jst.utility"/>
<installed facet="jst.java" version="6.0"/> <installed facet="jst.java" version="6.0"/>
......
...@@ -11,17 +11,23 @@ import fi.insomnia.bortal.utilities.apachecodec.binary.Base64; ...@@ -11,17 +11,23 @@ import fi.insomnia.bortal.utilities.apachecodec.binary.Base64;
public class PasswordFunctions { public class PasswordFunctions {
private static final Logger logger = LoggerFactory private static final Logger logger = LoggerFactory
.getLogger(PasswordFunctions.class); .getLogger(PasswordFunctions.class);
private static final boolean UGLY_FIX = true;
public static String getEncryptedPassword(String password) { public static String getEncryptedPassword(String password) {
String salt = generateSalt(); byte[] salt = new byte[SALT_LENGTH];
Random random = new Random();
random.nextBytes(salt);
String base64Str = shaWithSaltToBase64(password, salt); String base64Str = shaWithSaltToBase64(password, salt);
String ssha = "{SSHA}" + base64Str; String ssha = "{SSHA}" + base64Str;
return ssha; return ssha;
} }
private static String shaWithSaltToBase64(String password, String salt) { private static String shaWithSaltToBase64(String password, byte[] salt) {
MessageDigest algo = null; MessageDigest algo = null;
try { try {
algo = MessageDigest.getInstance("SHA"); algo = MessageDigest.getInstance("SHA");
...@@ -29,29 +35,54 @@ public class PasswordFunctions { ...@@ -29,29 +35,54 @@ public class PasswordFunctions {
logger.error("WTF!! digest function not found!!", e); logger.error("WTF!! digest function not found!!", e);
return null; return null;
} }
byte[] prehash = concatBytearrays(password.getBytes(), salt);
byte[] hashed = algo.digest(prehash);
String hashed = new String(algo.digest((password + salt).getBytes())); byte[] both = concatBytearrays(hashed, salt);
String both = hashed + salt;
String base64Str = new String(Base64.encodeBase64(both.getBytes())); String base64Str = new String(Base64.encodeBase64(both));
logger.debug("Encoded {} to {}", both, base64Str); logger.debug("Encoded {} to {}", both, base64Str);
return base64Str; return base64Str;
} }
public static byte[] concatBytearrays(byte[]... arrays) {
int length = 0;
for (byte[] arr : arrays) {
length += arr.length;
}
byte[] ret = new byte[length];
int addpoint = 0;
for (byte[] arr : arrays) {
System.arraycopy(arr, 0, ret, addpoint, arr.length);
addpoint += arr.length;
}
return ret;
}
public static boolean checkPlainPassword(String plainPassword, public static boolean checkPlainPassword(String plainPassword,
String saltedPassword) { String saltedPassword) {
String oldBase64 = saltedPassword.substring("{SSHA}".length()); String oldBase64 = saltedPassword.substring("{SSHA}".length());
String decodedHashedAndSalt; byte[] decodedHashedAndSalt = Base64.decodeBase64(oldBase64);
decodedHashedAndSalt = new String(Base64.decodeBase64(oldBase64.getBytes()));
logger.debug("Decoded Str {} to {}", oldBase64, decodedHashedAndSalt); logger.debug("Decoded Str {} to {}", oldBase64, decodedHashedAndSalt);
logger.debug("HashAndSalt: {}", decodedHashedAndSalt);
String salt = decodedHashedAndSalt.substring(decodedHashedAndSalt.length() byte[] salt = new byte[SALT_LENGTH];
- SALT_LENGTH, decodedHashedAndSalt.length()); System.arraycopy(decodedHashedAndSalt, decodedHashedAndSalt.length - SALT_LENGTH, salt, 0, SALT_LENGTH);
String newBase64 = shaWithSaltToBase64(plainPassword, salt); // String salt =
// decodedHashedAndSalt.substring(decodedHashedAndSalt.length()
// - SALT_LENGTH, decodedHashedAndSalt.length());
logger.debug("Hash : {} salt: {}", decodedHashedAndSalt, salt);
String newBase64 = shaWithSaltToBase64(plainPassword, salt);
logger.debug("comparing old {} to new {}", oldBase64, newBase64);
boolean theSame = oldBase64.equals(newBase64); boolean theSame = oldBase64.equals(newBase64);
if (!theSame && UGLY_FIX) {
theSame = new UglyFix(newBase64, oldBase64).check();
}
return theSame; return theSame;
} }
...@@ -59,10 +90,6 @@ public class PasswordFunctions { ...@@ -59,10 +90,6 @@ public class PasswordFunctions {
private static final String ALLOWED_RANDOM_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static final String ALLOWED_RANDOM_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static String generateSalt() {
return generateRandomString(SALT_LENGTH);
}
public static String generateRandomString(int length) { public static String generateRandomString(int length) {
Random random = new Random(); Random random = new Random();
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish v3 Java EE 6"/> <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.sun.enterprise.jst.server.runtimeTarget/GlassFish Server Open Source Edition 3 (Java EE 6)"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
<attributes> <attributes>
<attribute name="owner.project.facets" value="java"/> <attribute name="owner.project.facets" value="java"/>
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
<li><h:link outcome="/user/sendPicture" value="#{i18n['user.sendPicture']}"/></li> <li><h:link outcome="/user/sendPicture" value="#{i18n['user.sendPicture']}"/></li>
<li><h:link outcome="/user/changePassword" value="#{i18n['user.changePassword']}"/></li> <li><h:link outcome="/user/changePassword" value="#{i18n['user.changePassword']}"/></li>
<li><h:link outcome="/user/accountEvents" value="#{i18n['user.accountEvents']}"/></li> <li><h:link outcome="/user/accountEvents" value="#{i18n['user.accountEvents']}"/></li>
<li><h:link outcome="/place/myGroups" value="#{i18n['user.myGroups']}"/></li>
<li><h:link outcome="/place/insertToken" value="#{i18n['user.insertToken']}"/></li>
</ul> </ul>
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:users="http://java.sun.com/jsf/composite/tools/user"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<ui:param name="thispage" value="page.user.mygroups" />
<ui:define name="content">
#{placeGroupView.editSelf()}
<h:dataTable value="#{placeGroupView.user.placeGroups}" var="group">
<h:column>
<p>Id: #{group.id.id} name #{group.name}
<h:dataTable border="1" id="user" value="#{group.members}" var="member">
<h:column>
<f:facet name="header">
<h:outputText value="Id" />
</f:facet>
<h:outputText value="#{member.id.id}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="product" />
</f:facet>
<h:outputText value="#{member.placeReservation.name}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="token" />
</f:facet>
<h:outputText value="#{member.inviteToken}" />
</h:column>
</h:dataTable></p>
</h:column>
</h:dataTable>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
...@@ -3,23 +3,32 @@ package fi.insomnia.bortal.view; ...@@ -3,23 +3,32 @@ package fi.insomnia.bortal.view;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped; import javax.faces.bean.SessionScoped;
import javax.faces.model.ListDataModel;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.beans.PlaceGroupBeanLocal;
import fi.insomnia.bortal.beans.UserBeanLocal; import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
@ManagedBean(name = "placeGroupView") @ManagedBean(name = "placeGroupView")
@SessionScoped @SessionScoped
public class PlaceGroupView { public class PlaceGroupView extends GenericView{
private static final Logger logger = LoggerFactory.getLogger(PlaceGroupView.class); private static final Logger logger = LoggerFactory.getLogger(PlaceGroupView.class);
private User user; private User user;
@EJB @EJB
private UserBeanLocal userBean; private UserBeanLocal userBean;
@EJB
private PlaceGroupBeanLocal placegroupBean;
private ListDataModel<GroupMembership> memberlist;
private String token;
public void editSelf() { public void editSelf() {
userBean.fatalNotLoggedIn();
setUser(userBean.getCurrentUser()); setUser(userBean.getCurrentUser());
} }
...@@ -28,11 +37,36 @@ public class PlaceGroupView { ...@@ -28,11 +37,36 @@ public class PlaceGroupView {
} }
public User getUser() { public User getUser() {
if (user != null) userBean.fatalNotLoggedIn();
{ if (user != null) {
logger.debug("User {}", user.getPlaceGroups().size()); logger.debug("User {}", user.getPlaceGroups().size());
} }
return user; return user;
} }
public ListDataModel<GroupMembership> getGroupMemberships() {
userBean.fatalNotLoggedIn();
memberlist = new ListDataModel<GroupMembership>(placegroupBean.getMemberships(user));
return memberlist;
}
public String saveToken() {
userBean.fatalNotLoggedIn();
User thisuser = userBean.getCurrentUser();
String ret = "myGroups";
if (!placegroupBean.associateToToken(thisuser, getToken())) {
this.addFaceMessage("placetoken.tokenNotFound");
ret = null;
}
return ret;
}
public void setToken(String token) {
this.token = token;
}
public String getToken() {
return token;
}
} }
...@@ -42,6 +42,12 @@ page.role.list.pagegroup=admin ...@@ -42,6 +42,12 @@ page.role.list.pagegroup=admin
page.place.placemap.pagegroup=placemap page.place.placemap.pagegroup=placemap
page.place.placemap.header=Varaa paikka page.place.placemap.header=Varaa paikka
page.place.mygroups.pagegroup=user
page.place.mygroups.header=Omat paikat
page.place.insertToken.pagegroup=user
page.place.insertToken.header=Syt konepaikkakoodi
page.user.create.pagegroup=user page.user.create.pagegroup=user
page.user.create.header=Uusi kyttj page.user.create.header=Uusi kyttj
page.user.edit.pagegroup=user page.user.edit.pagegroup=user
......
...@@ -77,6 +77,15 @@ user.sendPicture=Kuvan lhetys ...@@ -77,6 +77,15 @@ user.sendPicture=Kuvan lhetys
user.changePassword=Vaihda salasana user.changePassword=Vaihda salasana
user.accountBalance=Tilin saldo user.accountBalance=Tilin saldo
userview.passwordsDontMatch=Salasanat eivt ole samat! Ole hyv ja syt salasanat uudelleen. userview.passwordsDontMatch=Salasanat eivt ole samat! Ole hyv ja syt salasanat uudelleen.
user.myGroups=Omat paikkavaraukset
user.insertToken=Syt paikkakoodi
placetoken.token=Paikkakoodi
placetoken.commit=Liit
placetoken.pageHeader=Lis konepaikkakoodi
placetoken.topText=Voit yhdist ryhmnjohtajasi ostaman paikan omaan kyttjtunnukseesi syttmll paikkakoodin allaolevaan kenttn.
placetoken.tokenNotFound=Paikkakoodia ei lytynyt! Tarkista koodi.
bill.billNumber=Laskun numero bill.billNumber=Laskun numero
bill.sentDate=Pivys bill.sentDate=Pivys
bill.totalPrice=Laskun summa bill.totalPrice=Laskun summa
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!