Commit 977c4753 by Tuukka Kivilahti

Merge branch 'master' of codecrew.fi:codecrew/moya into infoPlaceReservation

Conflicts:
	code/moya-beans/ejbModule/fi/codecrew/moya/beans/BarcodeBean.java
2 parents dd5e62d2 75b63e13
...@@ -51,8 +51,6 @@ public interface BarcodeBeanLocal { ...@@ -51,8 +51,6 @@ public interface BarcodeBeanLocal {
public EventUser getUserFromTextCode(String textcode); public EventUser getUserFromTextCode(String textcode);
public String getUserLongTextCode(EventUser user);
public EventUser getUserFromLongTextCode(String textcode); public EventUser getUserFromLongTextCode(String textcode);
public Product getProduct(String barcode); public Product getProduct(String barcode);
......
...@@ -192,4 +192,11 @@ public interface UserBeanLocal { ...@@ -192,4 +192,11 @@ public interface UserBeanLocal {
* @return List of moya -surperusers * @return List of moya -surperusers
*/ */
List<User> findSuperusers(); List<User> findSuperusers();
/**
* There is a textcode type that looks up the code in EventUser object. Do the lookup.
* @param code
* @return EventUser with the matching code
*/
EventUser findUserByCodeToken(String code);
} }
...@@ -26,6 +26,7 @@ import javax.ejb.EJB; ...@@ -26,6 +26,7 @@ import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.codecrew.moya.utilities.PasswordFunctions;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -50,8 +51,12 @@ public class BarcodeBean implements BarcodeBeanLocal { ...@@ -50,8 +51,12 @@ public class BarcodeBean implements BarcodeBeanLocal {
private static final String PRINTED_CARD_TEXTCODEPREFIX = "10"; private static final String PRINTED_CARD_TEXTCODEPREFIX = "10";
private static final String PLACE_TEXTCODEPREFIX = "11"; private static final String PLACE_TEXTCODEPREFIX = "11";
// Code from EventUser ID with symmetric an encryption of a fixed key ;)
private static final String EVENTUSER_TEXTCODEPREFIX = "12"; private static final String EVENTUSER_TEXTCODEPREFIX = "12";
// Code stored in EventUser object in database.
private static final String EVENTUSER_TOKEN_TEXTCODEPREFIX = "13";
// DO NOT ACCIDENTLY ADD '=' -char to this list // DO NOT ACCIDENTLY ADD '=' -char to this list
private static final int TEXTCODE_ROTATE_COUNT = 500; private static final int TEXTCODE_ROTATE_COUNT = 500;
...@@ -99,20 +104,6 @@ public class BarcodeBean implements BarcodeBeanLocal { ...@@ -99,20 +104,6 @@ public class BarcodeBean implements BarcodeBeanLocal {
} }
@Override @Override
public String getUserLongTextCode(EventUser user) {
String textcode = getUserTextCode(user, 38, 16);
EventUser user2 = getUserFromLongTextCode(textcode);
if(!user.equals(user2))
throw new RuntimeException("Koodigenerointivirhe"); // TODO: use seculogger or something
return textcode;
}
@Override
public EventUser getUserFromLongTextCode(String textcode) { public EventUser getUserFromLongTextCode(String textcode) {
// check if it is some url // check if it is some url
...@@ -120,28 +111,64 @@ public class BarcodeBean implements BarcodeBeanLocal { ...@@ -120,28 +111,64 @@ public class BarcodeBean implements BarcodeBeanLocal {
textcode = textcode.substring(textcode.lastIndexOf("=")+1); textcode = textcode.substring(textcode.lastIndexOf("=")+1);
} }
if (isEventUserTokenCode(textcode)) {
logger.info("Getting user from textcode {}", textcode); return getEventUserFromTokenCode(textcode);
}
return getUserFromTextCode(textcode, 38, 16); return getUserFromTextCode(textcode, 38, 16);
} }
/**
* Return the EventUser's textCode or generate one if EventUser has no code yet.
* @param eventUser
* @return
*/
@Override @Override
public String getUserTextCode(EventUser user) { public String getUserTextCode(EventUser eventUser) {
String textcode = getUserTextCode(user, 12, 5);
EventUser user2 = getUserFromTextCode(textcode); // Loop and generate new code until a free code is found.
if (eventUser.getTokenCode() == null) {
String newCode = null;
do {
newCode = EVENTUSER_TOKEN_TEXTCODEPREFIX + PasswordFunctions.generateRandomString(10, BarcodeBeanLocal.TEXTCODE_CHARACTER_MAP);
} while (userBean.findUserByCodeToken(newCode) != null);
logger.info("Updating EventUser {} with code {}", eventUser.getId(), newCode);
if (eventUser.getTokenCode() != null) {
throw new IllegalStateException("EventUser " + eventUser.getId() + " had a tokencode already and we attempted to set it! Something is fishy!");
}
eventUser.setTokenCode(newCode);
eventUser = userBean.mergeChanges(eventUser);
}
if(!user.equals(user2)) return eventUser.getTokenCode();
throw new RuntimeException("Koodigenerointivirhe"); }
return textcode; /**
* Is this a EventUser token code (stored in database).
* @param code
* @return
*/
private boolean isEventUserTokenCode(String code) {
if (code != null && code.startsWith(EVENTUSER_TOKEN_TEXTCODEPREFIX)) {
return true;
} else {
return false;
}
} }
private EventUser getEventUserFromTokenCode(String code) {
return userBean.findUserByCodeToken(code);
}
@Override @Override
public EventUser getUserFromTextCode(String textcode) { public EventUser getUserFromTextCode(String textcode) {
if (isEventUserTokenCode(textcode)) {
return getEventUserFromTokenCode(textcode);
}
return getUserFromTextCode(textcode,12,5); return getUserFromTextCode(textcode,12,5);
} }
......
...@@ -334,6 +334,13 @@ public class BootstrapBean implements BootstrapBeanLocal { ...@@ -334,6 +334,13 @@ public class BootstrapBean implements BootstrapBeanLocal {
"CREATE INDEX idx_place_slots_products ON place_slots (product_id, place_id)", "CREATE INDEX idx_place_slots_products ON place_slots (product_id, place_id)",
}); });
dbUpdates.add(new String[] {
"ALTER TABLE event_users ADD tokencode text"
});
dbUpdates.add(new String[] {
"ALTER TABLE event_users ADD UNIQUE (tokencode)"
});
} }
......
...@@ -119,16 +119,11 @@ public class TicketBean implements TicketBeanLocal { ...@@ -119,16 +119,11 @@ public class TicketBean implements TicketBeanLocal {
} }
@Override @Override
public void sendTicketEmail(EventUser user , String url) { public void sendTicketEmail(EventUser user, String url) {
String token = barcodeBean.getUserLongTextCode(user); //String token = barcodeBean.getUserLongTextCode(user);
String token = barcodeBean.getUserTextCode(user);
MailMessage msg = new MailMessage(); MailMessage msg = new MailMessage();
msg.setSubject(eventbean.getPropertyString(LanEventPropertyKey.ETICKETMAIL_SUBJECT)); msg.setSubject(eventbean.getPropertyString(LanEventPropertyKey.ETICKETMAIL_SUBJECT));
......
...@@ -1138,6 +1138,22 @@ public class UserBean implements UserBeanLocal { ...@@ -1138,6 +1138,22 @@ public class UserBean implements UserBeanLocal {
return userFacade.findSuperusers(); return userFacade.findSuperusers();
} }
@Override
public EventUser findUserByCodeToken(String code) {
EventUser eventUser = eventUserFacade.findByTokenCode(code);
// Event mismatch?
if (eventUser != null) {
Integer eventId = eventUser.getEvent().getId();
Integer currentEventId = eventBean.getCurrentEvent().getId();
if (eventId != currentEventId) {
throw new IllegalStateException("Looked up code " + code + " and got EventUser " + eventUser.getId() + " from event " + eventId + " which is not the current event " + currentEventId);
}
}
return eventUser;
}
@PermitAll @PermitAll
public EventUser findEventuserByLoginUnsecure(String username) { public EventUser findEventuserByLoginUnsecure(String username) {
return eventUserFacade.findByLogin(username); return eventUserFacade.findByLogin(username);
......
...@@ -199,6 +199,14 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> { ...@@ -199,6 +199,14 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
} }
public EventUser findByTokenCode(String code) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<EventUser> cq = cb.createQuery(EventUser.class);
Root<EventUser> root = cq.from(EventUser.class);
cq.where(cb.equal(root.get(EventUser_.tokenCode), code));
return getSingleNullableResult(getEm().createQuery(cq));
}
// private Predicate addAcPredicate(CriteriaBuilder cb, UserSearchQuery // private Predicate addAcPredicate(CriteriaBuilder cb, UserSearchQuery
// query, Root<AccountEvent> root) { // query, Root<AccountEvent> root) {
// Expression<BigDecimal> sum = // Expression<BigDecimal> sum =
......
...@@ -56,8 +56,10 @@ public class MoyaChangedFieldsOptimisticLockingPolicy extends ChangedFieldsLocki ...@@ -56,8 +56,10 @@ public class MoyaChangedFieldsOptimisticLockingPolicy extends ChangedFieldsLocki
for (DatabaseField f : changedFields) { for (DatabaseField f : changedFields) {
// log.info("Field with typeName={}: {}", f.toString(), // log.info("Field with typeName={}: {}", f.toString(),
// f.getTypeName()); // f.getTypeName());
if (!f.getTypeName().equals("org.postgresql.util.PGobject")) { if (f.getTypeName().equals("org.postgresql.util.PGobject")) {
log.debug("Ignoring a PGobject field from changed fields optimistic locking policy: {}", f); log.debug("Ignoring a PGobject field from changed fields optimistic locking policy: {}", f);
} else {
// Add the field to OptimisticLockingPolicy
fieldsToCompare.add(f); fieldsToCompare.add(f);
} }
} }
......
...@@ -30,19 +30,7 @@ import java.util.Calendar; ...@@ -30,19 +30,7 @@ import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import javax.persistence.CascadeType; import javax.persistence.*;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import fi.codecrew.moya.enums.Gender; import fi.codecrew.moya.enums.Gender;
...@@ -121,11 +109,13 @@ public class EventUser extends GenericEntity { ...@@ -121,11 +109,13 @@ public class EventUser extends GenericEntity {
@OneToMany(mappedBy = "eventUser") @OneToMany(mappedBy = "eventUser")
private List<GameID> gameIDs; private List<GameID> gameIDs;
@ManyToMany(mappedBy = "participants") @ManyToMany(mappedBy = "participants")
private List<Lecture> lectures = new ArrayList<Lecture>(); private List<Lecture> lectures = new ArrayList<Lecture>();
@Column(name = "tokencode")
private String tokenCode;
public List<GameID> getGameIDs() { public List<GameID> getGameIDs() {
return gameIDs; return gameIDs;
} }
...@@ -531,4 +521,12 @@ public class EventUser extends GenericEntity { ...@@ -531,4 +521,12 @@ public class EventUser extends GenericEntity {
public void setLectures(List<Lecture> lectures) { public void setLectures(List<Lecture> lectures) {
this.lectures = lectures; this.lectures = lectures;
} }
public String getTokenCode() {
return tokenCode;
}
public void setTokenCode(String tokenCode) {
this.tokenCode = tokenCode;
}
} }
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<ui:define name="content"> <ui:define name="content">
<h:form id="vipform"> <h:form id="vipform">
<p:dataTable id="vip" value="#{vipListView.viplist}" widgetVar="viplist" styleClass="moya_datatable4" var="vip" filteredValue="#{vipListView.filteredVips}"> <p:dataTable id="vip" value="#{vipListView.viplist}" widgetVar="viplist" styleClass="moya_datatable4" var="vip" >
<!-- f:facet name="header"> <!-- f:facet name="header">
<p:outputPanel> <p:outputPanel>
<h:outputText value="Search all fields:" /> <h:outputText value="Search all fields:" />
...@@ -29,9 +29,8 @@ ...@@ -29,9 +29,8 @@
</p:column> </p:column>
<!-- p:column headerText="#{i18n['vip.description']}" filterBy="#{vip.description}" filterMatchMode="contains" --> <!-- p:column headerText="#{i18n['vip.description']}" filterBy="#{vip.description}" filterMatchMode="contains" -->
<p:column headerText="#{i18n['vip.description']}" style="width: 170px;"> <p:column headerText="#{i18n['vip.shortdescr']}" style="width: 170px;">
<h:outputText id="vipdescr" value="#{vip.shortDisplayDescr}" title="#{vip.description}" /> <h:outputText id="vipdescr" value="#{vip.shortDisplayDescr}" title="#{vip.description}" />
<p:tooltip id="toolTipVipdescr" for="vipdescr" value="#{vip.description}" />
</p:column> </p:column>
<p:column headerText="#{i18n['vip.description']}" > <p:column headerText="#{i18n['vip.description']}" >
......
...@@ -9,7 +9,8 @@ ...@@ -9,7 +9,8 @@
#{sessionHandler.flushCache()} #{sessionHandler.flushCache()}
<h:form> <h:form>
<!-- Enable only when needed: h:commandButton action="#{testView.sendMultibuggageSpam}" value="MULTIUSERSPAM" onclick="return confirm('SPAMSPAMSPAMS?!');" / --> <!-- Enable only when needed: -->
<h:commandButton action="#{testView.sendMultibuggageSpam}" value="MULTIUSERSPAM" onclick="return confirm('SPAMSPAMSPAMS?!');" />
<h:commandButton action="#{testView.resetMenu()}" value="Reset to newui menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" /> <h:commandButton action="#{testView.resetMenu()}" value="Reset to newui menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" />
<h:commandButton action="#{testView.resetOldMenu()}" value="Reset to old menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" /> <h:commandButton action="#{testView.resetOldMenu()}" value="Reset to old menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" />
</h:form> </h:form>
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<br /> <br />
<h:form id="vipform"> <h:form id="vipform">
<p:dataTable id="vipList" value="#{vipListView.viplist}" widgetVar="viplist" styleClass="moya_datatable4" var="vip" filteredValue="#{vipListView.filteredVips}"> <p:dataTable id="vipList" value="#{vipListView.viplist}" widgetVar="viplist" styleClass="moya_datatable4" var="vip" >
<!-- f:facet name="header"> <!-- f:facet name="header">
<p:outputPanel> <p:outputPanel>
<h:outputText value="Search all fields:" /> <h:outputText value="Search all fields:" />
...@@ -31,9 +31,8 @@ ...@@ -31,9 +31,8 @@
</p:column> </p:column>
<!-- p:column headerText="#{i18n['vip.description']}" filterBy="#{vip.description}" filterMatchMode="contains" --> <!-- p:column headerText="#{i18n['vip.description']}" filterBy="#{vip.description}" filterMatchMode="contains" -->
<p:column headerText="#{i18n['vip.description']}" style="width: 170px;"> <p:column headerText="#{i18n['vip.shortdescr']}" style="width: 170px;">
<h:outputText id="vipdescr" value="#{vip.shortDisplayDescr}" title="#{vip.description}" /> <h:outputText id="vipdescr" value="#{vip.shortDisplayDescr}" title="#{vip.description}" />
<p:tooltip id="toolTipVipdescr" for="vipdescr" value="#{vip.description}" />
</p:column> </p:column>
<p:column headerText="#{i18n['vip.description']}" > <p:column headerText="#{i18n['vip.description']}" >
......
...@@ -91,9 +91,9 @@ public class TestDataView extends GenericCDIView { ...@@ -91,9 +91,9 @@ public class TestDataView extends GenericCDIView {
public void sendMultibuggageSpam() { public void sendMultibuggageSpam() {
if(true) if (!permbean.getCurrentUser().isSuperadmin()) {
throw new RuntimeException("Remove this exception when you want to reactivate multiuserspammer!"); throw new RuntimeException("Remove this exception when you want to reactivate multiuserspammer!");
}
if(super.requirePermissions(EventPermission.MANAGE_PRIVATE_PROPERTIES)) { if(super.requirePermissions(EventPermission.MANAGE_PRIVATE_PROPERTIES)) {
List<EventUser> usersWithTickets = ticketBean.getSendToAllUsers(); List<EventUser> usersWithTickets = ticketBean.getSendToAllUsers();
......
...@@ -84,7 +84,7 @@ public class VipListView extends PaginationView<Vip> { ...@@ -84,7 +84,7 @@ public class VipListView extends PaginationView<Vip> {
public void setViplist(ListDataModel<Vip> viplist) { public void setViplist(ListDataModel<Vip> viplist) {
this.viplist = viplist; this.viplist = viplist;
} }
/*
public List<Vip> getFilteredVips() { public List<Vip> getFilteredVips() {
return filteredVips; return filteredVips;
} }
...@@ -92,7 +92,7 @@ public class VipListView extends PaginationView<Vip> { ...@@ -92,7 +92,7 @@ public class VipListView extends PaginationView<Vip> {
public void setFilteredVips(List<Vip> filteredVips) { public void setFilteredVips(List<Vip> filteredVips) {
this.filteredVips = filteredVips; this.filteredVips = filteredVips;
} }
*/
public VipDeliverView getDeliverView() { public VipDeliverView getDeliverView() {
return deliverView; return deliverView;
} }
......
...@@ -520,7 +520,7 @@ vip.backToList = Takaisin listaukseen ...@@ -520,7 +520,7 @@ vip.backToList = Takaisin listaukseen
vip.create = Luo vip.create = Luo
vip.createNew = Luo uusi vip.createNew = Luo uusi
vip.deliver = Toimita vip.deliver = Toimita
vip.description = Kuvaus vip.description = Lis\u00E4tietoja
vip.edit = Muokkaa vip.edit = Muokkaa
vip.host = Is\u00E4nt\u00E4 vip.host = Is\u00E4nt\u00E4
vip.hostsName = Is\u00E4nt\u00E4 vip.hostsName = Is\u00E4nt\u00E4
...@@ -528,7 +528,7 @@ vip.productDelivered = Toimitettu ...@@ -528,7 +528,7 @@ vip.productDelivered = Toimitettu
vip.productQuantity = Lkm vip.productQuantity = Lkm
vip.products = Tuote vip.products = Tuote
vip.save = Tallenna vip.save = Tallenna
vip.shortdescr = Lyhyt kuvaus vip.shortdescr = Nimi
vipProduct.create = Lis\u00E4\u00E4 vipProduct.create = Lis\u00E4\u00E4
vipProduct.deliver = Toimita vipProduct.deliver = Toimita
......
...@@ -1726,7 +1726,7 @@ vip.productDelivered = Delivered ...@@ -1726,7 +1726,7 @@ vip.productDelivered = Delivered
vip.productQuantity = Qty vip.productQuantity = Qty
vip.products = Product vip.products = Product
vip.save = Save vip.save = Save
vip.shortdescr = Short description vip.shortdescr = Name
vipProduct.create = Create vipProduct.create = Create
vipProduct.deliver = Deliver vipProduct.deliver = Deliver
......
...@@ -1703,7 +1703,7 @@ vip.backToList = Takaisin listaukseen ...@@ -1703,7 +1703,7 @@ vip.backToList = Takaisin listaukseen
vip.create = Luo vip.create = Luo
vip.createNew = Luo uusi vip.createNew = Luo uusi
vip.deliver = Toimita vip.deliver = Toimita
vip.description = Kuvaus vip.description = Lis\u00E4tietoja
vip.edit = Muokkaa vip.edit = Muokkaa
vip.host = Is\u00E4nt\u00E4 vip.host = Is\u00E4nt\u00E4
vip.hostsName = Is\u00E4nt\u00E4 vip.hostsName = Is\u00E4nt\u00E4
...@@ -1711,7 +1711,7 @@ vip.productDelivered = Toimitettu ...@@ -1711,7 +1711,7 @@ vip.productDelivered = Toimitettu
vip.productQuantity = Lkm vip.productQuantity = Lkm
vip.products = Tuote vip.products = Tuote
vip.save = Tallenna vip.save = Tallenna
vip.shortdescr = Lyhyt kuvaus vip.shortdescr = Nimi
vipProduct.create = Lis\u00E4\u00E4 vipProduct.create = Lis\u00E4\u00E4
vipProduct.deliver = Toimita vipProduct.deliver = Toimita
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!