Commit 985936b9 by Juho Juopperi

Storing EventUser's QR code in database.

1 parent 5c961ce1
......@@ -51,8 +51,6 @@ public interface BarcodeBeanLocal {
public EventUser getUserFromTextCode(String textcode);
public String getUserLongTextCode(EventUser user);
public EventUser getUserFromLongTextCode(String textcode);
public Product getProduct(String barcode);
......
......@@ -192,4 +192,11 @@ public interface UserBeanLocal {
* @return List of moya -surperusers
*/
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;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import fi.codecrew.moya.utilities.PasswordFunctions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -50,8 +51,12 @@ public class BarcodeBean implements BarcodeBeanLocal {
private static final String PRINTED_CARD_TEXTCODEPREFIX = "10";
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";
// Code stored in EventUser object in database.
private static final String EVENTUSER_TOKEN_TEXTCODEPREFIX = "13";
// DO NOT ACCIDENTLY ADD '=' -char to this list
private static final int TEXTCODE_ROTATE_COUNT = 500;
......@@ -99,20 +104,6 @@ public class BarcodeBean implements BarcodeBeanLocal {
}
@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) {
// check if it is some url
......@@ -120,25 +111,64 @@ public class BarcodeBean implements BarcodeBeanLocal {
textcode = textcode.substring(textcode.lastIndexOf("=")+1);
}
if (isEventUserTokenCode(textcode)) {
return getEventUserFromTokenCode(textcode);
}
return getUserFromTextCode(textcode, 38, 16);
}
/**
* Return the EventUser's textCode or generate one if EventUser has no code yet.
* @param eventUser
* @return
*/
@Override
public String getUserTextCode(EventUser user) {
String textcode = getUserTextCode(user, 12, 5);
EventUser user2 = getUserFromTextCode(textcode);
public String getUserTextCode(EventUser eventUser) {
// Loop and generate new code until a free code is found.
if (eventUser.getTokenCode() == null) {
String newCode = null;
do {
newCode = 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))
throw new RuntimeException("Koodigenerointivirhe");
return eventUser.getTokenCode();
}
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
public EventUser getUserFromTextCode(String textcode) {
if (isEventUserTokenCode(textcode)) {
return getEventUserFromTokenCode(textcode);
}
return getUserFromTextCode(textcode,12,5);
}
......
......@@ -334,6 +334,10 @@ public class BootstrapBean implements BootstrapBeanLocal {
"CREATE INDEX idx_place_slots_products ON place_slots (product_id, place_id)",
});
dbUpdates.add(new String[] {
"ALTER TABLE event_users ADD tokencode text"
});
}
......
......@@ -119,16 +119,11 @@ public class TicketBean implements TicketBeanLocal {
}
@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();
msg.setSubject(eventbean.getPropertyString(LanEventPropertyKey.ETICKETMAIL_SUBJECT));
......
......@@ -1138,6 +1138,11 @@ public class UserBean implements UserBeanLocal {
return userFacade.findSuperusers();
}
@Override
public EventUser findUserByCodeToken(String code) {
return eventUserFacade.findByTokenCode(code);
}
@PermitAll
public EventUser findEventuserByLoginUnsecure(String username) {
return eventUserFacade.findByLogin(username);
......
......@@ -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
// query, Root<AccountEvent> root) {
// Expression<BigDecimal> sum =
......
......@@ -30,19 +30,7 @@ import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
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 javax.persistence.*;
import fi.codecrew.moya.enums.Gender;
......@@ -121,11 +109,13 @@ public class EventUser extends GenericEntity {
@OneToMany(mappedBy = "eventUser")
private List<GameID> gameIDs;
@ManyToMany(mappedBy = "participants")
private List<Lecture> lectures = new ArrayList<Lecture>();
@Column(name = "tokencode")
private String tokenCode;
public List<GameID> getGameIDs() {
return gameIDs;
}
......@@ -531,4 +521,12 @@ public class EventUser extends GenericEntity {
public void setLectures(List<Lecture> lectures) {
this.lectures = lectures;
}
public String getTokenCode() {
return tokenCode;
}
public void setTokenCode(String tokenCode) {
this.tokenCode = tokenCode;
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!