Commit 49b8d99e by Tuomas Riihimäki

Access permission rewrite on beans!

1 parent f4074e4d
Showing with 2090 additions and 2186 deletions
...@@ -13,5 +13,6 @@ ...@@ -13,5 +13,6 @@
</classpathentry> </classpathentry>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/> <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="src" path="/LanBortalUtilities"/> <classpathentry kind="src" path="/LanBortalUtilities"/>
<classpathentry kind="src" path="/UtilClasses"/>
<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"?>
<!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd"> <!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd">
<sun-ejb-jar> <sun-ejb-jar>
<security-role-mapping>
<role-name>ANONYMOUS</role-name>
<group-name>ANONYMOUS</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ORGANIZATION_ROOT</role-name>
<group-name>ORGANIZATION_ROOT</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>SUPERADMIN</role-name>
<group-name>SUPERADMIN</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ADMIN_BASE</role-name>
<group-name>ADMIN_BASE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>USER_BASE</role-name>
<group-name>USER_BASE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>LOGIN/READ</role-name>
<group-name>LOGIN/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>LOGIN/WRITE</role-name>
<group-name>LOGIN/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>LOGIN/EXECUTE</role-name>
<group-name>LOGIN/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>USER_MANAGEMENT/READ</role-name>
<group-name>USER_MANAGEMENT/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>USER_MANAGEMENT/WRITE</role-name>
<group-name>USER_MANAGEMENT/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>USER_MANAGEMENT/EXECUTE</role-name>
<group-name>USER_MANAGEMENT/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ACCOUNT_MANAGEMENT/READ</role-name>
<group-name>ACCOUNT_MANAGEMENT/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ACCOUNT_MANAGEMENT/WRITE</role-name>
<group-name>ACCOUNT_MANAGEMENT/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ACCOUNT_MANAGEMENT/EXECUTE</role-name>
<group-name>ACCOUNT_MANAGEMENT/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>BILL/READ</role-name>
<group-name>BILL/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>BILL/WRITE</role-name>
<group-name>BILL/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>BILL/EXECUTE</role-name>
<group-name>BILL/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>MAP/READ</role-name>
<group-name>MAP/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>MAP/WRITE</role-name>
<group-name>MAP/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>MAP/EXECUTE</role-name>
<group-name>MAP/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ROLE_MANAGEMENT/READ</role-name>
<group-name>ROLE_MANAGEMENT/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ROLE_MANAGEMENT/WRITE</role-name>
<group-name>ROLE_MANAGEMENT/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ROLE_MANAGEMENT/EXECUTE</role-name>
<group-name>ROLE_MANAGEMENT/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>PRODUCT/READ</role-name>
<group-name>PRODUCT/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>PRODUCT/WRITE</role-name>
<group-name>PRODUCT/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>PRODUCT/EXECUTE</role-name>
<group-name>PRODUCT/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>SHOP/READ</role-name>
<group-name>SHOP/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>SHOP/WRITE</role-name>
<group-name>SHOP/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>SHOP/EXECUTE</role-name>
<group-name>SHOP/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>GAME/READ</role-name>
<group-name>GAME/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>GAME/WRITE</role-name>
<group-name>GAME/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>GAME/EXECUTE</role-name>
<group-name>GAME/EXECUTE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>POLL/READ</role-name>
<group-name>POLL/READ</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>POLL/WRITE</role-name>
<group-name>POLL/WRITE</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>POLL/EXECUTE</role-name>
<group-name>POLL/EXECUTE</group-name>
</security-role-mapping>
<enterprise-beans/> <enterprise-beans/>
</sun-ejb-jar> </sun-ejb-jar>
...@@ -7,19 +7,18 @@ import java.util.List; ...@@ -7,19 +7,18 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.AccountEventFacade; import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.model.AccountEvent; import fi.insomnia.bortal.model.AccountEvent;
import fi.insomnia.bortal.model.EventPk; import fi.insomnia.bortal.model.EventPk;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.Product; import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
...@@ -28,95 +27,98 @@ import fi.insomnia.bortal.model.User; ...@@ -28,95 +27,98 @@ import fi.insomnia.bortal.model.User;
* Session Bean implementation class AccountEventBean * Session Bean implementation class AccountEventBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "ACCOUNT_MANAGEMENT/READ", "ACCOUNT_MANAGEMENT/WRITE", "SHOP/EXECUTE" })
public class AccountEventBean implements AccountEventBeanLocal { public class AccountEventBean implements AccountEventBeanLocal {
@EJB @EJB
private AccountEventFacade accountfacade; private AccountEventFacade accountfacade;
@EJB @EJB
private UserBeanLocal userbean; private UserBeanLocal userbean;
@EJB @EJB
private SecurityBeanLocal sessionbean; private LoggingBeanLocal loggingbean;
@EJB @EJB
private EventBeanLocal eventBean; private EventBeanLocal eventBean;
@EJB @EJB
private ProductBeanLocal prodbean; private ProductBeanLocal prodbean;
@EJB @EJB
private PlaceBeanLocal placebean; private PlaceBeanLocal placebean;
@EJB
private static final Logger logger = LoggerFactory.getLogger(AccountEventBean.class); private PermissionBeanLocal permbean;
public AccountEventBean() { private static final Logger logger = LoggerFactory.getLogger(AccountEventBean.class);
super();
} public AccountEventBean() {
super();
@Override }
public AccountEvent merge(AccountEvent account) {
userbean.fatalPermission(Permission.ACCOUNT_MANAGEMENT, RolePermission.WRITE, "Error mergin account event", account); @Override
return accountfacade.merge(account); @RolesAllowed("ACCOUNT_MANAGEMENT/WRITE")
} public AccountEvent merge(AccountEvent account) {
return accountfacade.merge(account);
@Override }
public void delete(AccountEvent account) {
userbean.fatalPermission(Permission.ACCOUNT_MANAGEMENT, RolePermission.WRITE, "Error deleting account event: ", account); @Override
@RolesAllowed("ACCOUNT_MANAGEMENT/WRITE")
AccountEvent acco = accountfacade.find(account.getId()); public void delete(AccountEvent account) {
sessionbean.logMessage(SecurityLogType.accountEvent, userbean.getCurrentUser(), "Deleting AccountEvent '", acco.getProduct().getName(), "' count: '", acco.getQuantity().toString(), "' unitprice: '", acco.getUnitPrice().toString(), "' accouser: '", acco.getUser().getLogin(), "'");
acco.getProduct().getAccountEvents().remove(acco); AccountEvent acco = accountfacade.find(account.getId());
if (acco.getBill() != null) { loggingbean.logMessage(SecurityLogType.accountEvent, permbean.getCurrentUser(), "Deleting AccountEvent '", acco.getProduct().getName(), "' count: '", acco.getQuantity().toString(), "' unitprice: '", acco.getUnitPrice().toString(), "' accouser: '", acco.getUser().getLogin(), "'");
acco.getBill().setAccountEvent(null); acco.getProduct().getAccountEvents().remove(acco);
} if (acco.getBill() != null) {
acco.getUser().getAccountEvents().remove(acco); acco.getBill().setAccountEvent(null);
}
accountfacade.remove(acco); acco.getUser().getAccountEvents().remove(acco);
} accountfacade.remove(acco);
@Override }
public AccountEvent find(EventPk id) {
return accountfacade.find(id); @Override
} public AccountEvent find(EventPk id) {
return accountfacade.find(id);
@Override }
public List<Role> getRolesFromAccountEvents(User u) {
return accountfacade.findProvidedRoles(eventBean.getCurrentEvent(), u); @Override
} public List<Role> getRolesFromAccountEvents(User u) {
return accountfacade.findProvidedRoles(eventBean.getCurrentEvent(), u);
@Override }
public List<AccountEvent> shopCash(User shoppingUser, Map<Product, BigDecimal> shopMap, boolean buyInstant) {
logger.debug("Shoping cash. buyinstant {}", buyInstant); @Override
userbean.fatalPermission(Permission.SHOP, RolePermission.EXECUTE, "User tried to create accountEvents via shop without SHOP:EXECUTE"); @RolesAllowed("SHOP/EXECUTE")
ArrayList<AccountEvent> ret = new ArrayList<AccountEvent>(); public List<AccountEvent> shopCash(User shoppingUser, Map<Product, BigDecimal> shopMap, boolean buyInstant) throws PermissionDeniedException {
LanEvent ev = eventBean.getCurrentEvent(); logger.debug("Shoping cash. buyinstant {}", buyInstant);
User seller = userbean.getCurrentUser(); ArrayList<AccountEvent> ret = new ArrayList<AccountEvent>();
BigDecimal tot = BigDecimal.ZERO; LanEvent ev = eventBean.getCurrentEvent();
User seller = permbean.getCurrentUser();
for (Entry<Product, BigDecimal> prodentry : shopMap.entrySet()) { BigDecimal tot = BigDecimal.ZERO;
AccountEvent ac = new AccountEvent(ev, shoppingUser, prodentry.getKey(), prodentry.getKey().getPrice(), prodentry.getValue(), Calendar.getInstance());
if (buyInstant && prodentry.getKey().getPrice().compareTo(BigDecimal.ZERO) > 0) { for (Entry<Product, BigDecimal> prodentry : shopMap.entrySet()) {
tot = tot.add(prodentry.getValue().multiply(prodentry.getKey().getPrice())); AccountEvent ac = new AccountEvent(ev, shoppingUser, prodentry.getKey(), prodentry.getKey().getPrice(), prodentry.getValue(), Calendar.getInstance());
} if (buyInstant && prodentry.getKey().getPrice().compareTo(BigDecimal.ZERO) > 0) {
tot = tot.add(prodentry.getValue().multiply(prodentry.getKey().getPrice()));
if (prodentry.getKey().isPrepaidInstant() && prodentry.getKey().getPlaces() != null && prodentry.getKey().getPlaces().size() > 0) { }
logger.debug("Prepaidplace");
if (prodentry.getKey().isPrepaidInstant() && prodentry.getKey().getPlaces() != null && prodentry.getKey().getPlaces().size() > 0) {
placebean.lockPlaceProduct(shoppingUser, prodentry.getKey(), BigDecimal.ONE); logger.debug("Prepaidplace");
} placebean.lockPlaceProduct(shoppingUser, prodentry.getKey(), BigDecimal.ONE);
ac.setSeller(seller);
shoppingUser.getAccountEvents().add(ac); }
} ac.setSeller(seller);
shoppingUser.getAccountEvents().add(ac);
logger.debug("ShopCash price {}", tot); }
if (buyInstant && tot.compareTo(BigDecimal.ZERO) > 0) {
logger.debug("Creating buy instant product!"); logger.debug("ShopCash price {}", tot);
Product creditProd = prodbean.findCreditProduct(); if (buyInstant && tot.compareTo(BigDecimal.ZERO) > 0) {
AccountEvent ac = new AccountEvent(ev, shoppingUser, creditProd, creditProd.getPrice(), tot, Calendar.getInstance()); logger.debug("Creating buy instant product!");
shoppingUser.getAccountEvents().add(ac); Product creditProd = prodbean.findCreditProduct();
} AccountEvent ac = new AccountEvent(ev, shoppingUser, creditProd, creditProd.getPrice(), tot, Calendar.getInstance());
shoppingUser.getAccountEvents().add(ac);
userbean.mergeChanges(shoppingUser); }
return ret; userbean.mergeChanges(shoppingUser);
}
return ret;
}
} }
...@@ -7,6 +7,8 @@ import java.util.Calendar; ...@@ -7,6 +7,8 @@ import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
...@@ -19,7 +21,6 @@ import fi.insomnia.bortal.beanutil.PdfPrinter; ...@@ -19,7 +21,6 @@ import fi.insomnia.bortal.beanutil.PdfPrinter;
import fi.insomnia.bortal.bortal.views.BillSummary; import fi.insomnia.bortal.bortal.views.BillSummary;
import fi.insomnia.bortal.enums.Permission; import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission; import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.BillFacade; import fi.insomnia.bortal.facade.BillFacade;
import fi.insomnia.bortal.facade.BillLineFacade; import fi.insomnia.bortal.facade.BillLineFacade;
import fi.insomnia.bortal.model.AccountEvent; import fi.insomnia.bortal.model.AccountEvent;
...@@ -34,179 +35,173 @@ import fi.insomnia.bortal.model.User; ...@@ -34,179 +35,173 @@ import fi.insomnia.bortal.model.User;
* Session Bean implementation class BillBean * Session Bean implementation class BillBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "BILL/READ", "USER_MANAGEMENT/EXECUTE", "USER_MANAGEMENT/READ" })
public class BillBean implements BillBeanLocal { public class BillBean implements BillBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(BillBean.class); private static final Logger logger = LoggerFactory.getLogger(BillBean.class);
@EJB
@EJB private BillFacade billFacade;
private BillFacade billFacade;
@EJB
@EJB private EventBeanLocal eventbean;
private UserBeanLocal userBean; @EJB
private BillLineFacade billLineFacade;
@EJB @PersistenceContext
private SecurityBeanLocal secubean; private EntityManager em;
@EJB @EJB
private EventBeanLocal eventbean; private PermissionBeanLocal permbean;
@EJB @EJB
private BillLineFacade billLineFacade; private ProductBeanLocal productBean;
@PersistenceContext
private EntityManager em; @EJB
private PlaceBeanLocal placebean;
@EJB
private ProductBeanLocal productBean; @EJB
private PermissionBeanLocal permissionbean;
@EJB
private PlaceBeanLocal placebean; /**
* Default constructor.
/** */
* Default constructor. public BillBean() {
*/ // TODO Auto-generated constructor stub
public BillBean() { }
// TODO Auto-generated constructor stub
} @Override
public Bill findById(int id) throws PermissionDeniedException {
public Bill findById(int id) { LanEvent event = eventbean.getCurrentEvent();
LanEvent event = eventbean.getCurrentEvent(); if (id <= 0) {
if (id <= 0) { return null;
return null; }
} Bill bill = billFacade.find(event.getId(), id);
Bill bill = billFacade.find(event.getId(), id); User currentuser = permbean.getCurrentUser();
User currentuser = userBean.getCurrentUser(); logger.debug("bill {} user {}", bill, currentuser);
if (!currentuser.equals(bill.getUser())) { if (bill == null || !currentuser.equals(bill.getUser())) {
userBean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.READ, "User tried to print the bill with insufficient rights. Bill id: ", bill); bill = null;
} permbean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.READ, "No right to read bill: ", bill);
return bill; }
return bill;
}
}
@Override
public void getPdfBillStream(Bill bill, OutputStream ostream) { @Override
if (bill == null) { public void getPdfBillStream(Bill bill, OutputStream ostream) {
return; if (bill == null) {
} return;
if (bill.getBillNumber() == null || bill.getBillNumber() <= 0) { }
generateBillNumber(bill); if (bill.getBillNumber() == null || bill.getBillNumber() <= 0) {
} generateBillNumber(bill);
new PdfPrinter(bill).output(ostream); }
} new PdfPrinter(bill).output(ostream);
}
private void generateBillNumber(Bill bill) {
if (bill.getBillNumber() == null || bill.getBillNumber() == 0) { private void generateBillNumber(Bill bill) {
LanEvent currEvent = eventbean.getCurrentEvent(); if (bill.getBillNumber() == null || bill.getBillNumber() == 0) {
Integer billnr = billFacade.getBiggestBillNumber(currEvent); LanEvent currEvent = eventbean.getCurrentEvent();
if (billnr == null || billnr < currEvent.getNextBillNumber()) { Integer billnr = billFacade.getBiggestBillNumber(currEvent);
billnr = currEvent.getNextBillNumber(); if (billnr == null || billnr < currEvent.getNextBillNumber()) {
} else { billnr = currEvent.getNextBillNumber();
++billnr; } else {
} ++billnr;
bill.setBillNumber(billnr); }
billFacade.merge(bill); bill.setBillNumber(billnr);
} billFacade.merge(bill);
}
}
}
@Override
public Bill createEmptyBill(User shoppingUser) { @Override
public Bill createEmptyBill(User shoppingUser) throws PermissionDeniedException {
if (shoppingUser != null && !userBean.isCurrentUser(shoppingUser)) { if (permbean.isCurrentUser(shoppingUser)) {
userBean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE, "User tried to shop to ", shoppingUser, " another without sufficient rights"); permbean.fatalPermission(Permission.SHOP, RolePermission.EXECUTE, "No permission to create empty bill for self");
} } else if (!permbean.hasPermission(Permission.ACCOUNT_MANAGEMENT, RolePermission.EXECUTE)) {
}
if (shoppingUser == null) { LanEvent event = eventbean.getCurrentEvent();
shoppingUser = userBean.getCurrentUser(); Bill ret = new Bill(event, shoppingUser);
} billFacade.create(ret);
LanEvent event = eventbean.getCurrentEvent(); ret.setUser(shoppingUser);
Bill ret = new Bill(event, shoppingUser); em.flush();
billFacade.create(ret); logger.debug("Created bill with id {} and user {}", ret.getId(), ret.getUser());
ret.setUser(shoppingUser); return ret;
em.flush(); }
logger.debug("Created bill with id {} and user {}", ret.getId(), ret.getUser());
return ret; @Override
} @RolesAllowed("SHOP/EXECUTE")
public BillLine addProductToBill(Bill bill, Product product, BigDecimal count) throws PermissionDeniedException {
@Override
public BillLine addProductToBill(Bill bill, Product product, BigDecimal count) { // If bill number > 0 bill has been sent and extra privileges are needed
userBean.fatalPermission(Permission.BILL, RolePermission.EXECUTE, "User tried to add a product to bill"); // to modify.
boolean iscurrent = permissionbean.isCurrentUser(bill.getUser());
// If bill number > 0 bill has been sent and extra privileges are needed Integer billnr = bill.getBillNumber();
// to modify. if (!iscurrent || billnr != null) {
boolean iscurrent = userBean.isCurrentUser(bill.getUser()); permbean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE, "User tried to modify bill ", bill, "without sufficient permissions");
Integer billnr = bill.getBillNumber(); }
if (!iscurrent || billnr != null) { BillLine line = new BillLine(bill, product.getName(), product.getUnitName(), count, product.getPrice(), product.getVat());
userBean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE, "User tried to modify bill ", bill, "without sufficient permissions"); line.setLineProduct(product);
} billLineFacade.create(line);
BillLine line = new BillLine(bill, product.getName(), product.getUnitName(), count, product.getPrice(), product.getVat());
line.setLineProduct(product); List<Discount> discounts = productBean.getActiveDiscounts(product, count);
billLineFacade.create(line);
for (Discount disc : discounts) {
List<Discount> discounts = productBean.getActiveDiscounts(product, count); BigDecimal unitPrice = product.getPrice().subtract(product.getPrice().multiply(disc.getPercentage())).negate().setScale(2, RoundingMode.HALF_UP);
BigDecimal vatPrice = product.getVat().subtract(product.getVat().multiply(disc.getPercentage())).negate().setScale(2, RoundingMode.HALF_UP);
for (Discount disc : discounts) {
BigDecimal unitPrice = product.getPrice().subtract(product.getPrice().multiply(disc.getPercentage())).negate().setScale(2, RoundingMode.HALF_UP); BillLine discountLine = new BillLine(bill, disc.getShortdesc(), product.getUnitName(), count, unitPrice, vatPrice);
BigDecimal vatPrice = product.getVat().subtract(product.getVat().multiply(disc.getPercentage())).negate().setScale(2, RoundingMode.HALF_UP); billLineFacade.create(discountLine);
BillLine discountLine = new BillLine(bill, disc.getShortdesc(), product.getUnitName(), count, unitPrice, vatPrice); }
billLineFacade.create(discountLine);
em.flush();
} return line;
}
em.flush();
return line; @Override
} @RolesAllowed("BILL/WRITE")
public List<Bill> findAll() {
@Override
public List<Bill> findAll() { return billFacade.findAll(eventbean.getCurrentEvent());
if (!userBean.hasPermission(Permission.BILL, RolePermission.WRITE)) { }
throw new PermissionDeniedException(secubean, userBean.getCurrentUser(), "User tried to list all bills without sufficient permissions");
} @Override
return billFacade.findAll(eventbean.getCurrentEvent()); @RolesAllowed("BILL/READ")
} public Collection<BillSummary> getBillLineSummary() {
Collection<BillSummary> ret = billLineFacade.getLineSummary(eventbean.getCurrentEvent());
@Override
public Collection<BillSummary> getBillLineSummary() { return ret;
userBean.fatalPermission(Permission.BILL, RolePermission.READ, "User tried to view the bill summary"); }
Collection<BillSummary> ret = billLineFacade.getLineSummary(eventbean.getCurrentEvent()); @Override
for (BillSummary foo : ret) { @RolesAllowed("BILL/WRITE")
logger.debug("linesum {}", foo); public void markPaid(Bill bill, Calendar when) {
}
return ret; Product creditproduct = productBean.findCreditProduct();
}
AccountEvent ac = productBean.createAccountEvent(creditproduct, bill.totalPrice(), bill.getUser());
@Override ac.setDelivered(when);
public void markPaid(Bill bill, Calendar when) { ac.setEventTime(when);
userBean.fatalPermission(Permission.BILL, RolePermission.WRITE, "User tried to mark the bill paid"); ac.setBill(bill);
ac.setSeller(permbean.getCurrentUser());
Product creditproduct = productBean.findCreditProduct();
bill.setAccountEvent(ac);
AccountEvent ac = productBean.createAccountEvent(creditproduct, bill.totalPrice(), bill.getUser()); bill.setPaidDate(when);
ac.setDelivered(when);
ac.setEventTime(when); billFacade.merge(bill);
ac.setBill(bill);
ac.setSeller(userBean.getCurrentUser()); for (BillLine bl : bill.getBillLines()) {
Product prod = bl.getLineProduct();
bill.setAccountEvent(ac); if (prod != null) {
bill.setPaidDate(when); if (prod.isPrepaidInstant()) {
logger.debug("Creating Bill prepaidInstant product {}, {}", prod.getName(), bl.getQuantity());
billFacade.merge(bill); if (prod.getPlaces().size() > 0) {
placebean.lockPlaceProduct(bill.getUser(), prod, bl.getQuantity());
for (BillLine bl : bill.getBillLines()) { }
Product prod = bl.getLineProduct();
if (prod != null) { productBean.createAccountEvent(prod, bl.getQuantity(), bill.getUser());
if (prod.isPrepaidInstant()) {
logger.debug("Creating Bill prepaidInstant product {}, {}", prod.getName(), bl.getQuantity()); }
if (prod.getPlaces().size() > 0) { }
placebean.lockPlaceProduct(bill.getUser(), prod, bl.getQuantity()); }
}
}
productBean.createAccountEvent(prod, bl.getQuantity(), bill.getUser());
}
}
}
}
} }
...@@ -2,14 +2,14 @@ package fi.insomnia.bortal.beans; ...@@ -2,14 +2,14 @@ package fi.insomnia.bortal.beans;
import java.util.List; import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.CardTemplateFacade; import fi.insomnia.bortal.facade.CardTemplateFacade;
import fi.insomnia.bortal.facade.PrintedCardFacade; import fi.insomnia.bortal.facade.PrintedCardFacade;
import fi.insomnia.bortal.model.CardTemplate; import fi.insomnia.bortal.model.CardTemplate;
...@@ -23,150 +23,154 @@ import fi.insomnia.bortal.util.MailMessage; ...@@ -23,150 +23,154 @@ import fi.insomnia.bortal.util.MailMessage;
* Session Bean implementation class CardTemplateBean * Session Bean implementation class CardTemplateBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "USER_MANAGEMENT/WRITE", "USER_MANAGEMENT/READ" })
public class CardTemplateBean implements CardTemplateBeanLocal { public class CardTemplateBean implements CardTemplateBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(CardTemplateBean.class); private static final Logger logger = LoggerFactory.getLogger(CardTemplateBean.class);
/** /**
* Default constructor. * Default constructor.
*/ */
public CardTemplateBean() { public CardTemplateBean() {
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }
@EJB @EJB
private CardTemplateFacade cdFacade; private CardTemplateFacade cdFacade;
@EJB @EJB
private EventBeanLocal eventBean; private EventBeanLocal eventBean;
@EJB @EJB
private UserBeanLocal userbean; private UserBeanLocal userbean;
@EJB @EJB
private PrintedCardFacade printedcardfacade; private PrintedCardFacade printedcardfacade;
@EJB @EJB
private UtilBeanLocal mailbean; private UtilBeanLocal mailbean;
@EJB
private PlaceGroupBeanLocal pgbean; @Override
@RolesAllowed("USER_MANAGEMENT/WRITE")
public List<CardTemplate> findAll() { public List<CardTemplate> findAll() {
userbean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.WRITE); return cdFacade.findAll(eventBean.getCurrentEvent());
return cdFacade.findAll(eventBean.getCurrentEvent()); }
}
@Override
@Override @RolesAllowed("USER_MANAGEMENT/WRITE")
public void create(CardTemplate card) { public void create(CardTemplate card) {
userbean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.WRITE); cdFacade.create(card);
cdFacade.create(card); }
}
@Override
@Override @RolesAllowed("USER_MANAGEMENT/READ")
public CardTemplate findById(Integer id) { public CardTemplate findById(Integer id) {
userbean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.READ); LanEvent ev = eventBean.getCurrentEvent();
LanEvent ev = eventBean.getCurrentEvent(); return cdFacade.find(ev.getId(), id);
return cdFacade.find(ev.getId(), id); }
}
@Override
public void checkAllUsersCardRights() { public void checkAllUsersCardRights() throws PermissionDeniedException {
for (User u : userbean.getUsers()) { for (User u : userbean.getUsers()) {
checkPrintedCard(u); checkPrintedCard(u);
} }
} }
/** /**
* Checks users printed card roles and return the biggestCard * Checks users printed card roles and return the biggestCard
*/ *
public PrintedCard checkPrintedCard(User user) { * @throws PermissionDeniedException
LanEvent currEvent = eventBean.getCurrentEvent(); */
List<PrintedCard> myCards = printedcardfacade.findForUser(currEvent, user); @Override
public PrintedCard checkPrintedCard(User user) throws PermissionDeniedException {
PrintedCard biggestCard = null; LanEvent currEvent = eventBean.getCurrentEvent();
PrintedCard smallestCard = null; List<PrintedCard> myCards = printedcardfacade.findForUser(currEvent, user);
for (PrintedCard card : myCards) {
if (card.getEnabled()) { PrintedCard biggestCard = null;
if (biggestCard == null || biggestCard.getTemplate().getPower() < card.getTemplate().getPower()) { PrintedCard smallestCard = null;
biggestCard = card; for (PrintedCard card : myCards) {
} if (card.getEnabled()) {
if (smallestCard == null || smallestCard.getTemplate().getPower() > card.getTemplate().getPower()) { if (biggestCard == null || biggestCard.getTemplate().getPower() < card.getTemplate().getPower()) {
smallestCard = card; biggestCard = card;
} }
} if (smallestCard == null || smallestCard.getTemplate().getPower() > card.getTemplate().getPower()) {
} smallestCard = card;
}
CardTemplate roleCard = getUsersCardtype(user); }
}
int existingPower = -999;
int newPower = -999; CardTemplate roleCard = getUsersCardtype(user);
if (roleCard != null) {
newPower = roleCard.getPower(); int existingPower = -999;
} int newPower = -999;
if (biggestCard != null) { if (roleCard != null) {
existingPower = biggestCard.getTemplate().getPower(); newPower = roleCard.getPower();
} }
if (biggestCard != null) {
if (existingPower < newPower) { existingPower = biggestCard.getTemplate().getPower();
}
if (biggestCard != null) {
biggestCard.setEnabled(false); if (existingPower < newPower) {
printedcardfacade.merge(biggestCard);
} if (biggestCard != null) {
PrintedCard pc = new PrintedCard(currEvent); biggestCard.setEnabled(false);
pc.setTemplate(roleCard); printedcardfacade.merge(biggestCard);
pc.setUser(user); }
PrintedCard pc = new PrintedCard(currEvent);
// user.getPrintedCards().add(pc); pc.setTemplate(roleCard);
printedcardfacade.create(pc); pc.setUser(user);
biggestCard = pc;
logger.debug("User {} has too little power old role {} New role {}", new Object[] { user.getLogin(), existingPower, newPower }); // user.getPrintedCards().add(pc);
} else if (existingPower > newPower) { printedcardfacade.create(pc);
MailMessage msg = new MailMessage(); biggestCard = pc;
User admin = eventBean.getCurrentEvent().getOrganiser().getAdmin(); logger.debug("User {} has too little power old role {} New role {}", new Object[] { user.getLogin(), existingPower, newPower });
String adminmail = admin.getEmail(); } else if (existingPower > newPower) {
MailMessage msg = new MailMessage();
msg.setFromAddress(adminmail); User admin = eventBean.getCurrentEvent().getOrganiser().getAdmin();
msg.setFromName("Lippukauppa"); String adminmail = admin.getEmail();
msg.setTo(admin);
msg.setSubject("User " + user.getLogin() + " has too powerful card!"); msg.setFromAddress(adminmail);
msg.setMessage("User ", user.getLogin(), "has too powerful card!\nCurrent power ", existingPower, ". Should be ", newPower, "\n\n-- \nLippukauppa"); msg.setFromName("Lippukauppa");
mailbean.sendMail(msg); msg.setTo(admin);
logger.debug("User {} has too much power old role {} New role {}", new Object[] { user.getLogin(), existingPower, newPower }); msg.setSubject("User " + user.getLogin() + " has too powerful card!");
msg.setMessage("User ", user.getLogin(), "has too powerful card!\nCurrent power ", existingPower, ". Should be ", newPower, "\n\n-- \nLippukauppa");
} else { mailbean.sendMail(msg);
logger.debug("User {} has power {} and roles has power {}", new Object[] { user.getLogin(), existingPower, newPower }); logger.debug("User {} has too much power old role {} New role {}", new Object[] { user.getLogin(), existingPower, newPower });
}
return biggestCard; } else {
logger.debug("User {} has power {} and roles has power {}", new Object[] { user.getLogin(), existingPower, newPower });
} }
return biggestCard;
public CardTemplate getUsersCardtype(User user) {
List<Role> roles = userbean.findUsersRoles(user); }
CardTemplate greatestTemplate = null; public CardTemplate getUsersCardtype(User user) throws PermissionDeniedException {
for (Role listrole : roles) { List<Role> roles = userbean.findUsersRoles(user);
if (greatestTemplate == null || (listrole.getCardTemplate() != null && greatestTemplate.getPower() < listrole.getCardTemplate().getPower())) { CardTemplate greatestTemplate = null;
greatestTemplate = listrole.getCardTemplate(); for (Role listrole : roles) {
}
if (greatestTemplate == null || (listrole.getCardTemplate() != null && greatestTemplate.getPower() < listrole.getCardTemplate().getPower())) {
} greatestTemplate = listrole.getCardTemplate();
return greatestTemplate; }
} }
return greatestTemplate;
@Override
public PrintedCard setRfidUid(String tag, User user) { }
PrintedCard ct = checkPrintedCard(user);
return setRfidUid(tag, ct); @Override
} public PrintedCard setRfidUid(String tag, User user) throws PermissionDeniedException {
PrintedCard ct = checkPrintedCard(user);
@Override return setRfidUid(tag, ct);
public PrintedCard setRfidUid(String tag, PrintedCard card) { }
card.setRfidUid(tag);
return printedcardfacade.merge(card); @Override
} public PrintedCard setRfidUid(String tag, PrintedCard card) {
card.setRfidUid(tag);
@Override return printedcardfacade.merge(card);
public List<PrintedCard> findActiveCards() { }
return this.printedcardfacade.findAllEnabled(eventBean.getCurrentEvent());
} @Override
public List<PrintedCard> findActiveCards() {
return this.printedcardfacade.findAllEnabled(eventBean.getCurrentEvent());
}
} }
...@@ -8,9 +8,7 @@ import javax.persistence.PersistenceContext; ...@@ -8,9 +8,7 @@ import javax.persistence.PersistenceContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder; import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.EventFacade; import fi.insomnia.bortal.facade.EventFacade;
import fi.insomnia.bortal.facade.EventOrganiserFacade; import fi.insomnia.bortal.facade.EventOrganiserFacade;
import fi.insomnia.bortal.model.EventOrganiser; import fi.insomnia.bortal.model.EventOrganiser;
...@@ -23,96 +21,95 @@ import fi.insomnia.bortal.model.User; ...@@ -23,96 +21,95 @@ import fi.insomnia.bortal.model.User;
@Stateless @Stateless
public class EventBean implements EventBeanLocal { public class EventBean implements EventBeanLocal {
private static final String DEFAULT_EVENT_NAME = "Default event"; private static final String DEFAULT_EVENT_NAME = "Default event";
private static final String DEFAULT_ORGANISATION_NAME = "Default organisation"; private static final String DEFAULT_ORGANISATION_NAME = "Default organisation";
private static final Logger logger = LoggerFactory.getLogger(EventBean.class); private static final Logger logger = LoggerFactory.getLogger(EventBean.class);
@EJB @EJB
private EventFacade eventFacade; private EventFacade eventFacade;
@EJB @EJB
private EventOrganiserFacade eventOrganiserFacade; private EventOrganiserFacade eventOrganiserFacade;
@EJB @EJB
private UserBeanLocal userBean; private EventStatusBeanLocal eventStatusBean;
@PersistenceContext
@EJB private EntityManager em;
private EventStatusBeanLocal eventStatusBean; @EJB
@PersistenceContext private LoggingBeanLocal loggingbean;
private EntityManager em; @EJB
@EJB private PermissionBeanLocal permbean;
private SecurityBeanLocal secubean;
@Override
@Override public LanEvent getEventByHostname(String hostname) {
public LanEvent getEventByHostname(String hostname) {
LanEvent ret = eventFacade.findByHostname(hostname);
LanEvent ret = eventFacade.findByHostname(hostname); if (ret == null) {
if (ret == null) { ret = findOrCreateDefaultEvent();
ret = findOrCreateDefaultEvent(); }
} return ret;
return ret; }
}
public LanEvent findOrCreateDefaultEvent() {
public LanEvent findOrCreateDefaultEvent() { LanEvent ret = eventFacade.findByName(DEFAULT_EVENT_NAME);
LanEvent ret = eventFacade.findByName(DEFAULT_EVENT_NAME); if (ret == null) {
if (ret == null) { logger.info("Default Event does not exist! creating new.");
logger.info("Default Event does not exist! creating new."); ret = new LanEvent();
ret = new LanEvent();
ret.setName(DEFAULT_EVENT_NAME);
ret.setName(DEFAULT_EVENT_NAME); ret.setOrganiser(findOrCreateDefaultEventOrganisation());
ret.setOrganiser(findOrCreateDefaultEventOrganisation()); ret.setStatus(eventStatusBean.findOrCreateDefaultEventStatus());
ret.setStatus(eventStatusBean.findOrCreateDefaultEventStatus()); eventFacade.create(ret);
eventFacade.create(ret); em.flush();
em.flush(); }
} return ret;
return ret; }
}
public EventOrganiser findOrCreateDefaultEventOrganisation() {
public EventOrganiser findOrCreateDefaultEventOrganisation() { EventOrganiser settings = eventOrganiserFacade.findByOrganisation(DEFAULT_ORGANISATION_NAME);
EventOrganiser settings = eventOrganiserFacade.findByOrganisation(DEFAULT_ORGANISATION_NAME);
if (settings == null) {
if (settings == null) { settings = new EventOrganiser();
settings = new EventOrganiser(); settings.setOrganisation(DEFAULT_ORGANISATION_NAME);
settings.setOrganisation(DEFAULT_ORGANISATION_NAME);
User defaultUser = permbean.getAnonUser();
User defaultUser = userBean.getAnonUser(); settings.setAdmin(defaultUser);
settings.setAdmin(defaultUser); eventOrganiserFacade.create(settings);
eventOrganiserFacade.create(settings); }
}
return settings;
return settings; }
}
@Override
@Override public LanEvent getCurrentEvent() {
public LanEvent getCurrentEvent() {
LanEvent ret = getEventByHostname(BortalLocalContextHolder.getHostname());
LanEvent ret = getEventByHostname(BortalLocalContextHolder.getHostname());
return ret;
return ret; }
}
@Override
@Override public LanEvent mergeChanges(LanEvent event) throws PermissionDeniedException {
public LanEvent mergeChanges(LanEvent event) { // TODO: Hmm..
// TODO: Hmm.. if (!permbean.isCurrentUser(event.getOrganiser().getAdmin()) && !permbean.getCurrentUser().isSuperadmin()) {
if (!userBean.isCurrentUser(event.getOrganiser().getAdmin()) && !userBean.getCurrentUser().isSuperadmin()) { throw new PermissionDeniedException(loggingbean, permbean.getCurrentUser(), "User tried to merge event: " + event + " without being admin of that group");
throw new PermissionDeniedException(secubean, userBean.getCurrentUser(), "User tried to merge event: " + event + " without being admin of that group"); }
} return eventFacade.merge(event);
return eventFacade.merge(event); }
}
@Override
@Override public void create(LanEvent event) throws PermissionDeniedException {
public void create(LanEvent event) { // TODO: Hmm..
// TODO: Hmm.. if (!permbean.isCurrentUser(event.getOrganiser().getAdmin()) && !permbean.getCurrentUser().isSuperadmin()) {
if (!userBean.isCurrentUser(event.getOrganiser().getAdmin()) && !userBean.getCurrentUser().isSuperadmin()) { throw new PermissionDeniedException(loggingbean, permbean.getCurrentUser(), "User tried to create a new event for organiser " + event.getOrganiser() + " without being admin of that group");
throw new PermissionDeniedException(secubean, userBean.getCurrentUser(), "User tried to create a new event for organiser " + event.getOrganiser() + " without being admin of that group");
}
} eventFacade.create(event);
eventFacade.create(event);
}
}
@Override
@Override public String flushCache() {
public String flushCache() { return eventFacade.flushCache();
return eventFacade.flushCache();
}
}
} }
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.EventMapFacade; import fi.insomnia.bortal.facade.EventMapFacade;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
...@@ -13,45 +13,42 @@ import fi.insomnia.bortal.model.LanEvent; ...@@ -13,45 +13,42 @@ import fi.insomnia.bortal.model.LanEvent;
* Session Bean implementation class EventMapBean * Session Bean implementation class EventMapBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "MAP/WRITE" })
public class EventMapBean implements EventMapBeanLocal { public class EventMapBean implements EventMapBeanLocal {
@EJB @EJB
private EventMapFacade eventmapfacade; private EventMapFacade eventmapfacade;
@EJB @EJB
private EventBeanLocal eventbean; private EventBeanLocal eventbean;
@EJB
private UserBeanLocal userbean; @Override
@RolesAllowed("MAP/WRITE")
public EventMap saveMap(EventMap eventmap) {
return eventmapfacade.merge(eventmap);
@Override
public EventMap saveMap(EventMap eventmap) { }
userbean.fatalPermission(Permission.MAP, RolePermission.WRITE);
return eventmapfacade.merge(eventmap); @Override
@RolesAllowed("MAP/WRITE")
} public EventMap create(String mapname) throws PermissionDeniedException {
EventMap ret = new EventMap(eventbean.getCurrentEvent());
@Override ret.setName(mapname);
public EventMap create(String mapname) { LanEvent event = eventbean.getCurrentEvent();
userbean.fatalPermission(Permission.MAP, RolePermission.WRITE); event.getEventMaps().add(ret);
EventMap ret = new EventMap(eventbean.getCurrentEvent()); eventbean.mergeChanges(event);
ret.setName(mapname); return ret;
LanEvent event = eventbean.getCurrentEvent();
event.getEventMaps().add(ret); }
eventbean.mergeChanges(event);
return ret; @Override
@RolesAllowed("MAP/WRITE")
} public void sendImage(int destId, byte[] imagedata) {
LanEvent event = eventbean.getCurrentEvent();
@Override EventMap map = eventmapfacade.find(event.getId(), destId);
public void sendImage(int destId, byte[] imagedata) { if (map != null) {
userbean.fatalPermission(Permission.MAP, RolePermission.WRITE); map.setMapData(imagedata);
LanEvent event = eventbean.getCurrentEvent(); }
EventMap map = eventmapfacade.find(event.getId(), destId);
if (map != null) { }
map.setMapData(imagedata);
}
}
} }
...@@ -5,7 +5,6 @@ import java.util.List; ...@@ -5,7 +5,6 @@ import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.EventOrganiserFacade; import fi.insomnia.bortal.facade.EventOrganiserFacade;
import fi.insomnia.bortal.model.EventOrganiser; import fi.insomnia.bortal.model.EventOrganiser;
...@@ -15,48 +14,48 @@ import fi.insomnia.bortal.model.EventOrganiser; ...@@ -15,48 +14,48 @@ import fi.insomnia.bortal.model.EventOrganiser;
@Stateless @Stateless
public class EventOrganiserBean implements EventOrganiserBeanLocal { public class EventOrganiserBean implements EventOrganiserBeanLocal {
@EJB @EJB
private EventOrganiserFacade eventorgfacade; private EventOrganiserFacade eventorgfacade;
@EJB @EJB
private UserBeanLocal userbean; private LoggingBeanLocal loggingbean;
@EJB @EJB
private SecurityBeanLocal securitybean; private PermissionBeanLocal permbean;
/** /**
* Default constructor. * Default constructor.
*/ */
public EventOrganiserBean() { public EventOrganiserBean() {
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }
@Override @Override
public void save(EventOrganiser eventorg) { public void save(EventOrganiser eventorg) throws PermissionDeniedException {
fatalPermission(eventorg); fatalPermission(eventorg);
eventorgfacade.merge(eventorg); eventorgfacade.merge(eventorg);
} }
public void fatalPermission(EventOrganiser eventorg) { @Override
if (!userbean.isCurrentUser(eventorg.getAdmin()) && !userbean.getCurrentUser().isSuperadmin()) { public void fatalPermission(EventOrganiser eventorg) throws PermissionDeniedException {
throw new PermissionDeniedException(securitybean, userbean.getCurrentUser(), "Someone other than admin tried to access EventOrganiser: " + eventorg.toString()); if (!permbean.isCurrentUser(eventorg.getAdmin()) && !permbean.getCurrentUser().isSuperadmin()) {
} throw new PermissionDeniedException(loggingbean, permbean.getCurrentUser(), "Someone other than admin tried to access EventOrganiser: " + eventorg.toString());
} }
}
@Override
public List<EventOrganiser> getEventOrganisers() { @Override
if(!userbean.getCurrentUser().isSuperadmin()) public List<EventOrganiser> getEventOrganisers() throws PermissionDeniedException {
{ if (!permbean.getCurrentUser().isSuperadmin()) {
throw new PermissionDeniedException(securitybean, userbean.getCurrentUser(), "Non-superadmin tried to list all EventOrganisers"); throw new PermissionDeniedException(loggingbean, permbean.getCurrentUser(), "Non-superadmin tried to list all EventOrganisers");
} }
return eventorgfacade.findAll(); return eventorgfacade.findAll();
} }
@Override @Override
public EventOrganiser create(String name) { public EventOrganiser create(String name) {
EventOrganiser ret = new EventOrganiser(); EventOrganiser ret = new EventOrganiser();
ret.setAdmin(userbean.getCurrentUser()); ret.setAdmin(permbean.getCurrentUser());
ret.setOrganisation(name); ret.setOrganisation(name);
eventorgfacade.create(ret); eventorgfacade.create(ret);
return ret; return ret;
} }
} }
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.FoodWaveTemplateFacade; import fi.insomnia.bortal.facade.FoodWaveTemplateFacade;
import fi.insomnia.bortal.model.FoodWaveTemplate; import fi.insomnia.bortal.model.FoodWaveTemplate;
...@@ -12,31 +12,29 @@ import fi.insomnia.bortal.model.FoodWaveTemplate; ...@@ -12,31 +12,29 @@ import fi.insomnia.bortal.model.FoodWaveTemplate;
* Session Bean implementation class FoodWaveBean * Session Bean implementation class FoodWaveBean
*/ */
@Stateless @Stateless
@DeclareRoles("SHOP/WRITE")
public class FoodWaveBean implements FoodWaveBeanLocal { public class FoodWaveBean implements FoodWaveBeanLocal {
@EJB @EJB
private UserBeanLocal userbean; private FoodWaveTemplateFacade fwtFacade;
@EJB /**
private FoodWaveTemplateFacade fwtFacade; * Default constructor.
*/
/** public FoodWaveBean() {
* Default constructor. // TODO Auto-generated constructor stub
*/ }
public FoodWaveBean() {
// TODO Auto-generated constructor stub @Override
} @RolesAllowed("SHOP/WRITE")
public void createTemplate(FoodWaveTemplate waveTemplate) {
@Override fwtFacade.create(waveTemplate);
public void createTemplate(FoodWaveTemplate waveTemplate) { }
userbean.fatalPermission(Permission.SHOP, RolePermission.WRITE, "Need SHOP:WRITE to create foodwave templates");
fwtFacade.create(waveTemplate); @Override
} @RolesAllowed("SHOP/WRITE")
public FoodWaveTemplate saveTemplate(FoodWaveTemplate waveTemplate) {
@Override return fwtFacade.merge(waveTemplate);
public FoodWaveTemplate saveTemplate(FoodWaveTemplate waveTemplate) { }
userbean.fatalPermission(Permission.SHOP, RolePermission.WRITE, "Need SHOP:WRITE to create foodwave templates");
return fwtFacade.merge(waveTemplate);
}
} }
...@@ -7,10 +7,7 @@ import java.util.List; ...@@ -7,10 +7,7 @@ import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.NewsGroupFacade; import fi.insomnia.bortal.facade.NewsGroupFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.News; import fi.insomnia.bortal.model.News;
import fi.insomnia.bortal.model.NewsGroup; import fi.insomnia.bortal.model.NewsGroup;
...@@ -20,31 +17,31 @@ import fi.insomnia.bortal.model.NewsGroup; ...@@ -20,31 +17,31 @@ import fi.insomnia.bortal.model.NewsGroup;
@Stateless @Stateless
public class GameBean implements GameBeanLocal { public class GameBean implements GameBeanLocal {
@EJB @EJB
private EventBeanLocal eventbean; private EventBeanLocal eventbean;
@EJB @EJB
private NewsGroupFacade ngfacade; private NewsGroupFacade ngfacade;
/** /**
* Default constructor. * Default constructor.
*/ */
public GameBean() { public GameBean() {
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }
@Override @Override
public List<News> getNews() { public List<News> getNews() {
ArrayList<News> retlist = new ArrayList<News>(); ArrayList<News> retlist = new ArrayList<News>();
NewsGroup ng = ngfacade.findByName(eventbean.getCurrentEvent(), "game"); NewsGroup ng = ngfacade.findByName(eventbean.getCurrentEvent(), "game");
for (News n : ng.getNews()) { for (News n : ng.getNews()) {
if ((n.getPublish() == null || n.getPublish().after(Calendar.getInstance())) && (n.getExpire() == null || n.getExpire().before(Calendar.getInstance()))) { if ((n.getPublish() == null || n.getPublish().after(Calendar.getInstance())) && (n.getExpire() == null || n.getExpire().before(Calendar.getInstance()))) {
retlist.add(n); retlist.add(n);
} }
} }
return retlist; return retlist;
} }
} }
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Vector; import java.util.Vector;
import javax.ejb.EJB; import javax.ejb.EJB;
...@@ -10,8 +12,11 @@ import org.slf4j.Logger; ...@@ -10,8 +12,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.BeanRole; import fi.insomnia.bortal.enums.BeanRole;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.UserFacade; import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.RoleRight;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
/** /**
...@@ -20,66 +25,90 @@ import fi.insomnia.bortal.model.User; ...@@ -20,66 +25,90 @@ import fi.insomnia.bortal.model.User;
@Stateless @Stateless
public class JaasBean implements JaasBeanLocal, JaasBeanRemote { public class JaasBean implements JaasBeanLocal, JaasBeanRemote {
private static final Logger logger = LoggerFactory.getLogger(JaasBean.class); private static final Logger logger = LoggerFactory.getLogger(JaasBean.class);
@EJB @EJB
private UserFacade userfacade; private UserFacade userfacade;
@EJB @EJB
private SecurityBeanLocal secubean; private LoggingBeanLocal secubean;
@EJB @EJB
private UserBean userbean; private UserBean userbean;
@EJB
/** private PermissionBeanLocal permbean;
* Default constructor.
*/ public User tryLogin(String username, String password) {
public JaasBean() {
// TODO Auto-generated constructor stub User user = userfacade.findByLogin(username.trim());
} logger.debug("Trying to login as {}", username);
User ret = null;
public User tryLogin(String username, String password) { if (user != null) {
if (user.checkPassword(password)) {
ret = user;
User user = userfacade.findByLogin(username.trim()); } else {
logger.debug("Trying to login as {}", username); secubean.logMessage(SecurityLogType.permissionDenied, user, "Login failed: wrong password for username ", username);
User ret = null; }
if (user != null) { } else {
if (user.checkPassword(password)) { secubean.logMessage(SecurityLogType.permissionDenied, null, "Login failed: Username not found: ", username);
ret = user;
} else { }
secubean.logMessage(SecurityLogType.permissionDenied, user, "Login failed: wrong password for username ", username);
} return ret;
} else { }
secubean.logMessage(SecurityLogType.permissionDenied, null, "Login failed: Username not found: ", username);
@Override
} public boolean authenticate(String username, String password) {
boolean ret = (tryLogin(username, password) != null);
return ret;
} return ret;
}
@Override
public boolean authenticate(String username, String password) { @Override
boolean ret = (tryLogin(username, password) != null); public Enumeration<String> getGroupNames(String user) {
User usr = userbean.getUser(user);
return ret; HashSet<String> roleset = new HashSet<String>();
} if (usr != null) {
@Override HashSet<RoleRight> mappedRoles = new HashSet<RoleRight>();
public Enumeration<String> getGroupNames(String user) { List<Role> usrroles = userbean.localFindUsersRoles(usr);
User usr = userbean.getUser(user); for (Role r : usrroles) {
Vector<String> roles = new Vector<String>(); for (RoleRight rr : r.getRoleRights()) {
if (!mappedRoles.contains(rr)) {
if (usr != null) { mappedRoles.add(rr);
for (Role r : usr.getRoles()) { if (rr.isExecute()) {
roles.add(r.getName()); roleset.add(rr.getPermission().getName());
} roleset.add(rr.getPermission().append(RolePermission.EXECUTE));
if (usr.isSuperadmin()) { }
roles.add(BeanRole.SUPERADMIN.name()); if (rr.isRead()) {
} roleset.add(rr.getPermission().getName());
} roleset.add(rr.getPermission().append(RolePermission.READ));
}
logger.debug("group names for user {}: {}", user, roles); if (rr.isWrite()) {
return roles.elements(); roleset.add(rr.getPermission().getName());
} roleset.add(rr.getPermission().append(RolePermission.WRITE));
}
}
}
}
if (permbean.isLoggedIn()) {
roleset.add("USER");
}
if (usr.isSuperadmin()) {
for (Permission p : Permission.values()) {
roleset.add(p.getName());
roleset.add(p.append(RolePermission.EXECUTE));
roleset.add(p.append(RolePermission.READ));
roleset.add(p.append(RolePermission.WRITE));
}
roleset.add(BeanRole.SUPERADMIN.name());
}
}
Vector<String> retvect = new Vector<String>();
retvect.addAll(roleset);
logger.debug("group names for user {}: {}", user, retvect);
return retvect.elements();
}
} }
...@@ -15,10 +15,19 @@ import java.util.Map; ...@@ -15,10 +15,19 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import fi.insomnia.bortal.enums.Permission; import javax.annotation.Resource;
import fi.insomnia.bortal.enums.RolePermission; import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.exceptions.BortalCatchableException; import fi.insomnia.bortal.exceptions.BortalCatchableException;
import fi.insomnia.bortal.exceptions.PermissionDeniedException;
import fi.insomnia.bortal.facade.GroupMembershipFacade; 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.facade.PlaceGroupFacade;
...@@ -31,298 +40,285 @@ import fi.insomnia.bortal.model.PlaceGroup; ...@@ -31,298 +40,285 @@ import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.Product; import fi.insomnia.bortal.model.Product;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
import javax.persistence.RollbackException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* *
* @author tuukka * @author tuukka
*/ */
@Stateless @Stateless
@DeclareRoles({ "MAP/READ", "MAP/WRITE", "MAP/EXECUTE", "SHOP/EXECUTE" })
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 @EJB
private GroupMembershipFacade gmemfacade; private GroupMembershipFacade gmemfacade;
@Resource @Resource
private TimerService ts; private TimerService ts;
@EJB @EJB
private PlaceFacade placeFacade; private PlaceFacade placeFacade;
@EJB @EJB
private PlaceGroupFacade pgfacade; private PlaceGroupFacade pgfacade;
@EJB @EJB
private UserBeanLocal userbean; private UserBeanLocal userbean;
@EJB @EJB
private ProductBeanLocal productBean; private ProductBeanLocal productBean;
@EJB @EJB
private EventBeanLocal eventBean; private EventBeanLocal eventBean;
@EJB @EJB
private PlaceGroupBeanLocal pgbean; private LoggingBeanLocal secubean;
@EJB
@EJB private PermissionBeanLocal permbean;
private SecurityBeanLocal secubean;
@EJB @Override
private EventMapBeanLocal mapfacade; @RolesAllowed("MAP/WRITE")
public Place mergeChanges(Place place) {
@Override return placeFacade.merge(place);
public Place mergeChanges(Place place) { }
userbean.fatalPermission(Permission.MAP, RolePermission.WRITE, "User tried to modify place ", place);
return placeFacade.merge(place); @Override
} public BigDecimal totalReservationPrice(EventMap e, Place newPlace) {
@Override Set<Place> places = new HashSet<Place>();
public BigDecimal totalReservationPrice(EventMap e, Place newPlace) { places.addAll(placeFacade.findUsersReservations(e, permbean.getCurrentUser()));
Set<Place> places = new HashSet<Place>(); if (newPlace != null) {
places.addAll(placeFacade.findUsersReservations(e, userbean.getCurrentUser())); places.add(newPlace);
}
if (newPlace != null) {
places.add(newPlace); Map<Product, Integer> mockmap = getPlaceProductcount(places);
}
BigDecimal total = BigDecimal.ZERO;
Map<Product, Integer> mockmap = getPlaceProductcount(places);
for (Entry<Product, Integer> entry : mockmap.entrySet()) {
BigDecimal total = BigDecimal.ZERO; logger.debug("Adding to price {} of {}", entry.getValue(), entry.getKey().getName());
if (entry.getKey() != null) {
for (Entry<Product, Integer> entry : mockmap.entrySet()) { total = total.add(productBean.calculateTotal(entry.getKey(), new BigDecimal(entry.getValue())));
logger.debug("Adding to price {} of {}", entry.getValue(), entry.getKey().getName()); }
if (entry.getKey() != null) { }
total = total.add(productBean.calculateTotal(entry.getKey(), new BigDecimal(entry.getValue()))); return total;
} }
}
return total; private static Map<Product, Integer> getPlaceProductcount(Collection<Place> places) {
} HashMap<Product, Integer> mockmap = new HashMap<Product, Integer>();
private static Map<Product, Integer> getPlaceProductcount(Collection<Place> places) { for (Place p : places) {
HashMap<Product, Integer> mockmap = new HashMap<Product, Integer>(); if (p != null) {
Product prod = p.getProduct();
for (Place p : places) { Integer val = mockmap.get(prod);
if (p != null) { if (val == null) {
Product prod = p.getProduct(); val = 0;
Integer val = mockmap.get(prod); }
if (val == null) { mockmap.put(prod, ++val);
val = 0; }
} }
mockmap.put(prod, ++val);
} return mockmap;
}
}
return mockmap;
// TODO: Kantakysely tähän!
} @Override
public Place findPlace(EventMap e, int x, int y) {
// TODO: Kantakysely tähän! for (Place place : e.getPlaces()) {
@Override if (place.isCoordinateInPlace(x, y)) {
public Place findPlace(EventMap e, int x, int y) { return place;
for (Place place : e.getPlaces()) { }
if (place.isCoordinateInPlace(x, y)) { }
return place; return null;
}
} }
return null;
@Override
} @RolesAllowed("MAP/EXECUTE")
public boolean reservePlace(Place p, User user) {
@Override boolean ret = placeFacade.reservePlace(p, user);
public boolean reservePlace(Place p, User user) {
userbean.fatalPermission(Permission.MAP, RolePermission.EXECUTE, "User does not have rights to reserve ( and buy) a place"); boolean foundTimeout = false;
boolean ret = placeFacade.reservePlace(p, user); for (Timer t : ts.getTimers()) {
if (t.getInfo().equals(PLACE_RESERVE_TIMEOUTER)) {
boolean foundTimeout = false; foundTimeout = true;
for (Timer t : ts.getTimers()) { }
if (t.getInfo().equals(PLACE_RESERVE_TIMEOUTER)) { }
foundTimeout = true; if (!foundTimeout) {
} logger.info("Place timeout calculator not started. Starting new.");
} ts.createTimer(new Date(), 1000 * 60, PLACE_RESERVE_TIMEOUTER);
if (!foundTimeout) { }
logger.info("Place timeout calculator not started. Starting new."); return ret;
ts.createTimer(new Date(), 1000 * 60, PLACE_RESERVE_TIMEOUTER); }
}
return ret; @Timeout
} public void checkTimedOutPlaces(Timer timer) {
// logger.debug("Checking Timed out places at {}", new Date());
@Timeout placeFacade.timeoutPlaces();
public void checkTimedOutPlaces(Timer timer) { }
// logger.debug("Checking Timed out places at {}", new Date());
placeFacade.timeoutPlaces(); @Override
} public void releaseUsersPlaces() {
logger.debug("timeouting places");
@Override placeFacade.releasePlaces(permbean.getCurrentUser());
public void releaseUsersPlaces() { }
logger.debug("timeouting places");
placeFacade.releasePlaces(userbean.getCurrentUser()); @Override
} public boolean releasePlace(Place place, User user) {
return placeFacade.releasePlace(user, place);
@Override
public boolean releasePlace(Place place, User user) { }
return placeFacade.releasePlace(user, place);
@Override
} @RolesAllowed("MAP/EXECUTE")
public boolean buySelectedPlaces(EventMap e) throws BortalCatchableException {
@Override LanEvent event = eventBean.getCurrentEvent();
public boolean buySelectedPlaces(EventMap e) throws BortalCatchableException { User user = permbean.getCurrentUser();
userbean.fatalPermission(Permission.MAP, RolePermission.EXECUTE, "User does not have rights to reserve ( and buy) a place");
LanEvent event = eventBean.getCurrentEvent(); List<Place> places = placeFacade.findUsersReservations(e, user);
User user = userbean.getCurrentUser(); if (places.size() <= 0) {
return false;
List<Place> places = placeFacade.findUsersReservations(e, user); }
if (places.size() <= 0) { PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true);
return false; pg.setCreator(user);
} pgfacade.create(pg);
PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true);
pg.setCreator(user); // PlaceGroup pg = pgbean.createPlaceGroup(user);
pgfacade.create(pg); BigDecimal totalprice = totalReservationPrice(e, null);
BigDecimal balance = permbean.getCurrentUser().getAccountBalance();
// PlaceGroup pg = pgbean.createPlaceGroup(user); if (balance.compareTo(totalprice) < 0) {
BigDecimal totalprice = totalReservationPrice(e, null); logger.debug("User {} Could not buy things because account balance is too low!", user);
BigDecimal balance = userbean.getCurrentUser().getAccountBalance(); return false;
if (balance.compareTo(totalprice) < 0) { }
logger.debug("User {} Could not buy things because account balance is too low!", user);
return false; for (Place p : places) {
} if (!p.buy(pg)) {
throw new BortalCatchableException("Error while buying places");
for (Place p : places) { }
if (!p.buy(pg)) { placeFacade.merge(p);
throw new BortalCatchableException("Error while buying places"); GroupMembership membership = new GroupMembership(event, pg, p, gmemfacade.createInviteToken(event));
} pg.getMembers().add(membership);
placeFacade.merge(p); }
GroupMembership membership = new GroupMembership(event, pg, p, gmemfacade.createInviteToken(event));
pg.getMembers().add(membership); for (Entry<Product, Integer> line : getPlaceProductcount(places).entrySet()) {
} productBean.createAccountEvent(line.getKey(), new BigDecimal(line.getValue()), user);
}
for (Entry<Product, Integer> line : getPlaceProductcount(places).entrySet()) { return true;
productBean.createAccountEvent(line.getKey(), new BigDecimal(line.getValue()), user); }
}
return true; @Override
} public void lockPlaceProduct(User user, Product prod, BigDecimal quantity) {
@Override BigDecimal loop = BigDecimal.ZERO;
public void lockPlaceProduct(User user, Product prod, BigDecimal quantity) { LanEvent event = eventBean.getCurrentEvent();
PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true);
BigDecimal loop = BigDecimal.ZERO; pg.setCreator(user);
LanEvent event = eventBean.getCurrentEvent();
PlaceGroup pg = new PlaceGroup(event, Calendar.getInstance(), Calendar.getInstance(), true); for (Place p : prod.getPlaces()) {
pg.setCreator(user);
if (!p.isTaken()) {
for (Place p : prod.getPlaces()) {
p.buy(pg);
if (!p.isTaken()) { GroupMembership currgm = new GroupMembership(event, pg, p, gmemfacade.createInviteToken(event));
placeFacade.merge(p);
p.buy(pg); currgm.setPlaceGroup(pg);
GroupMembership currgm = new GroupMembership(event, pg, p, gmemfacade.createInviteToken(event)); pg.getMembers().add(currgm);
placeFacade.merge(p);
currgm.setPlaceGroup(pg); loop = loop.add(BigDecimal.ONE);
pg.getMembers().add(currgm); if (quantity.equals(BigDecimal.ONE)) {
boolean gmassoc = false;
loop = loop.add(BigDecimal.ONE); for (GroupMembership gm : user.getGroupMemberships()) {
if (quantity.equals(BigDecimal.ONE)) { if (gm.getId().getEventId().equals(event.getId())) {
boolean gmassoc = false; gmassoc = true;
for (GroupMembership gm : user.getGroupMemberships()) { break;
if (gm.getId().getEventId().equals(event.getId())) { }
gmassoc = true;
break; }
} if (!gmassoc) {
logger.debug("Group membership not found. Associating user {} to place {}", user.getNick(), currgm.getPlaceReservation().getName());
} user.getGroupMemberships().add(currgm);
if (!gmassoc) { currgm.setUser(user);
logger.debug("Group membership not found. Associating user {} to place {}", user.getNick(), currgm.getPlaceReservation().getName()); }
user.getGroupMemberships().add(currgm); }
currgm.setUser(user); if (loop.compareTo(quantity) >= 0) {
} break;
} }
if (loop.compareTo(quantity) >= 0) { }
break; }
} user.getPlaceGroups().add(pg);
}
} }
user.getPlaceGroups().add(pg);
@Override
} @RolesAllowed("MAP/WRITE")
public int setBuyable(EventMap map, String like, boolean b) {
@Override return placeFacade.setBuyable(map, like, 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); }
return placeFacade.setBuyable(map, like, b);
@Override
} @RolesAllowed("MAP/READ")
public Place find(EventPk id) {
@Override return placeFacade.find(id);
public Place find(EventPk id) { }
userbean.fatalPermission(Permission.MAP, RolePermission.READ, "error reading place ", id);
return placeFacade.find(id); @Override
} public void checkMemberships() {
List<Place> all = placeFacade.findAll(eventBean.getCurrentEvent());
@Override for (Place p : all) {
public void checkMemberships() { if (p.getGroup() != null && p.getPlaceReserver() == null) {
List<Place> all = placeFacade.findAll(eventBean.getCurrentEvent()); LanEvent event = eventBean.getCurrentEvent();
for (Place p : all) { String token = gmemfacade.createInviteToken(event);
if (p.getGroup() != null && p.getPlaceReserver() == null) {
LanEvent event = eventBean.getCurrentEvent(); GroupMembership gm = new GroupMembership(event, p.getGroup(), p, token);
String token = gmemfacade.createInviteToken(event); p.getGroup().getMembers().add(gm);
p.setPlaceReserver(gm);
GroupMembership gm = new GroupMembership(event, p.getGroup(), p, token);
p.getGroup().getMembers().add(gm); }
p.setPlaceReserver(gm);
}
}
}
}
@Override
} @RolesAllowed("SHOP/EXECUTE")
public Place lockPlaces(User user, Place place) throws PermissionDeniedException {
@Override if (place.isTaken()) {
public Place lockPlaces(User user, Place place) { logger.warn("Place {} is already taken", place);
if (place.isTaken()) { throw new PermissionDeniedException(secubean, permbean.getCurrentUser(), "Place already taken!");
logger.warn("Place {} is already taken", place); }
throw new PermissionDeniedException(secubean, userbean.getCurrentUser(), "NO RIGHT");
} LanEvent ev = eventBean.getCurrentEvent();
PlaceGroup pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), true);
userbean.fatalPermission(Permission.SHOP, RolePermission.EXECUTE, "User tried to lock place without SHOP:EXECUTE"); pg.setCreator(user);
LanEvent ev = eventBean.getCurrentEvent();
PlaceGroup pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), true); user.getPlaceGroups().add(pg);
pg.setCreator(user);
place.reserve(user);
user.getPlaceGroups().add(pg); place.buy(pg);
place.reserve(user); GroupMembership newgm = new GroupMembership(ev, pg, place, gmemfacade.createInviteToken(ev));
place.buy(pg);
pg.getMembers().add(newgm);
GroupMembership newgm = new GroupMembership(ev, pg, place, gmemfacade.createInviteToken(ev));
boolean foundGm = false;
pg.getMembers().add(newgm); for (GroupMembership gm : user.getGroupMemberships()) {
logger.debug("Checking users gm:s found: {}", gm);
boolean foundGm = false; if (gm.getId().getEventId().equals(ev.getId())) {
for (GroupMembership gm : user.getGroupMemberships()) { foundGm = true;
logger.debug("Checking users gm:s found: {}", gm); break;
if (gm.getId().getEventId().equals(ev.getId())) { }
foundGm = true; }
break; logger.debug("Foundgm {}", foundGm);
} if (!foundGm) {
} logger.debug("Membership not found. associating");
logger.debug("Foundgm {}", foundGm); newgm.setUser(user);
if (!foundGm) { user.getGroupMemberships().add(newgm);
logger.debug("Membership not found. associating");
newgm.setUser(user); userbean.mergeChanges(user);
user.getGroupMemberships().add(newgm); }
pgfacade.create(pg);
userbean.mergeChanges(user); place = placeFacade.merge(place);
}
pgfacade.create(pg); return place;
place = placeFacade.merge(place); }
return place;
}
} }
...@@ -3,6 +3,8 @@ package fi.insomnia.bortal.beans; ...@@ -3,6 +3,8 @@ package fi.insomnia.bortal.beans;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.List; import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
...@@ -20,9 +22,7 @@ import com.pdfjet.TextLine; ...@@ -20,9 +22,7 @@ import com.pdfjet.TextLine;
import fi.insomnia.bortal.enums.Permission; import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission; 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.model.GroupMembership; import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
...@@ -30,139 +30,139 @@ import fi.insomnia.bortal.model.User; ...@@ -30,139 +30,139 @@ import fi.insomnia.bortal.model.User;
* Session Bean implementation class PlaceGroupBean * Session Bean implementation class PlaceGroupBean
*/ */
@Stateless @Stateless
@DeclareRoles("USER")
public class PlaceGroupBean implements PlaceGroupBeanLocal { public class PlaceGroupBean implements PlaceGroupBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(PlaceGroupBean.class); private static final Logger logger = LoggerFactory.getLogger(PlaceGroupBean.class);
private static final int YSTART = 30; private static final int YSTART = 30;
@EJB @EJB
private EventBeanLocal eventbean; private EventBeanLocal eventbean;
@EJB @EJB
private PlaceGroupFacade pgfacade; private GroupMembershipFacade gmemfacade;
@EJB @EJB
private GroupMembershipFacade gmemfacade; private LoggingBeanLocal loggingbean;
@EJB
private UserBeanLocal userbean; @EJB
@EJB private PermissionBeanLocal permbean;
private SecurityBeanLocal secubean;
/**
/** * Default constructor.
* Default constructor. */
*/ public PlaceGroupBean() {
public PlaceGroupBean() { // TODO Auto-generated constructor stub
// TODO Auto-generated constructor stub }
}
// @Override
// @Override // public PlaceGroup createPlaceGroup(User creator) {
// public PlaceGroup createPlaceGroup(User creator) { // }
// }
// @Override
// @Override // public GroupMembership createGroupMembership(PlaceGroup pg, Place p) {
// public GroupMembership createGroupMembership(PlaceGroup pg, Place p) { //
// // GroupMembership membership = new
// GroupMembership membership = new // GroupMembership(eventbean.getCurrentEvent(), pg, p,
// GroupMembership(eventbean.getCurrentEvent(), pg, p, // gmemfacade.createInviteToken());
// gmemfacade.createInviteToken()); // gmemfacade.create(membership);
// gmemfacade.create(membership); // return membership;
// return membership; // }
// }
@Override
@Override @RolesAllowed("USER")
public List<GroupMembership> getMembershipsAndCreations(User user) { public List<GroupMembership> getMembershipsAndCreations(User user) {
userbean.fatalNotLoggedIn(); List<GroupMembership> ret = gmemfacade.findMemberOrCreator(eventbean.getCurrentEvent(), user);
List<GroupMembership> ret = gmemfacade.findMemberOrCreator(eventbean.getCurrentEvent(), user); return ret;
return ret; }
}
@Override
@Override @RolesAllowed("USER")
public List<GroupMembership> getMemberships(User user) { public List<GroupMembership> getMemberships(User user) {
userbean.fatalNotLoggedIn(); List<GroupMembership> ret = gmemfacade.findMemberships(eventbean.getCurrentEvent(), user);
List<GroupMembership> ret = gmemfacade.findMemberships(eventbean.getCurrentEvent(), user); return ret;
return ret; }
}
@Override
@Override @RolesAllowed("USER")
public boolean associateToToken(User user, String token) { public boolean associateToToken(User user, String token) {
token = token.trim(); token = token.trim();
userbean.fatalNotLoggedIn(); GroupMembership mem = gmemfacade.findByToken(token);
GroupMembership mem = gmemfacade.findByToken(token); boolean ret = false;
boolean ret = false;
if (mem != null && mem.getUser() == null) {
if (mem != null && mem.getUser() == null) { mem.setUser(user);
mem.setUser(user); user.getGroupMemberships().add(mem);
user.getGroupMemberships().add(mem); gmemfacade.merge(mem);
gmemfacade.merge(mem); ret = true;
ret = true; }
}
return ret;
return ret;
}
}
@Override
@Override public void getGroupMembershipPdf(List<GroupMembership> memberships, OutputStream ostream) {
public void getGroupMembershipPdf(List<GroupMembership> memberships, OutputStream ostream) { try {
try { PDF pdf = new PDF(ostream);
PDF pdf = new PDF(ostream); Font font = new Font(pdf, CoreFont.TIMES_ROMAN);
Font font = new Font(pdf, CoreFont.TIMES_ROMAN); Font bigfont = new Font(pdf, CoreFont.TIMES_ROMAN);
Font bigfont = new Font(pdf, CoreFont.TIMES_ROMAN); bigfont.setSize(15);
bigfont.setSize(15);
Page page = new Page(pdf, A4.PORTRAIT);
Page page = new Page(pdf, A4.PORTRAIT); int y = YSTART;
int y = YSTART; for (GroupMembership membership : memberships) {
for (GroupMembership membership : memberships) {
if (y > 750) {
if (y > 750) { page = new Page(pdf, A4.PORTRAIT);
page = new Page(pdf, A4.PORTRAIT); y = YSTART;
y = YSTART; }
}
//
// // PNGImage jpeg = new
// PNGImage jpeg = new // PNGImage(BarcodeBean.getBarcode(membership.getInviteToken()));
// PNGImage(BarcodeBean.getBarcode(membership.getInviteToken())); // logger.debug("Jpeg: " + jpeg.getWidth() + " h. " +
// logger.debug("Jpeg: " + jpeg.getWidth() + " h. " + // jpeg.getHeight());
// jpeg.getHeight()); Image image = new Image(pdf, BarcodeBean.getBarcode(membership.getInviteToken()), ImageType.PNG);
Image image = new Image(pdf, BarcodeBean.getBarcode(membership.getInviteToken()), ImageType.PNG); image.scaleBy(0.8);
image.scaleBy(0.8); image.setPosition(50, y);
image.setPosition(50, y); image.drawOn(page);
image.drawOn(page);
TextLine name = new TextLine(bigfont, membership.getPlaceReservation().getName());
TextLine name = new TextLine(bigfont, membership.getPlaceReservation().getName()); name.setPosition(300, y + 10);
name.setPosition(300, y + 10); name.drawOn(page);
name.drawOn(page);
TextLine reserverLabel = new TextLine(font, "Varaaja: ");
TextLine reserverLabel = new TextLine(font, "Varaaja: "); reserverLabel.setPosition(300, y + 30);
reserverLabel.setPosition(300, y + 30); reserverLabel.drawOn(page);
reserverLabel.drawOn(page);
TextLine reserver = new TextLine(font, new StringBuilder(membership.getPlaceGroup().getCreator().getWholeName()).append(" (").append(membership.getPlaceGroup().getCreator().getNick()).append(")").toString());
TextLine reserver = new TextLine(font, new StringBuilder(membership.getPlaceGroup().getCreator().getWholeName()).append(" (").append(membership.getPlaceGroup().getCreator().getNick()).append(")").toString()); reserver.setPosition(310, y + 45);
reserver.setPosition(310, y + 45); reserver.drawOn(page);
reserver.drawOn(page);
TextLine assoclabel = new TextLine(font, "Yhdistetty käyttäjään: ");
TextLine assoclabel = new TextLine(font, "Yhdistetty käyttäjään: "); assoclabel.setPosition(300, y + 65);
assoclabel.setPosition(300, y + 65); assoclabel.drawOn(page);
assoclabel.drawOn(page);
TextLine assoc = new TextLine(font, ((membership.getUser() == null) ? "-----" : new StringBuilder(membership.getUser().getWholeName()).append(" (").append(membership.getUser().getNick()).append(")").toString()));
TextLine assoc = new TextLine(font, ((membership.getUser() == null) ? "-----" : new StringBuilder(membership.getUser().getWholeName()).append(" (").append(membership.getUser().getNick()).append(")").toString())); assoc.setPosition(310, y + 80);
assoc.setPosition(310, y + 80); assoc.drawOn(page);
assoc.drawOn(page);
y += 130;
y += 130; }
} pdf.flush();
pdf.flush(); } catch (Exception e) {
} catch (Exception e) { logger.info("Error getting printing group memberships", e);
logger.info("Error getting printing group memberships", e); }
}
}
}
@Override
@Override public void releaseAndGenerateToken(GroupMembership gmem) throws PermissionDeniedException {
public void releaseAndGenerateToken(GroupMembership gmem) { if (!permbean.getCurrentUser().getId().equals(gmem.getPlaceGroup().getCreator().getId()) ||
if (!userbean.getCurrentUser().getId().equals(gmem.getPlaceGroup().getCreator().getId()) || !permbean.hasPermission(Permission.MAP, RolePermission.WRITE)) {
!userbean.hasPermission(Permission.MAP, RolePermission.WRITE)) { throw new PermissionDeniedException(loggingbean, permbean.getCurrentUser(), "User tried to release and generate group membership: " + gmem);
throw new PermissionDeniedException(secubean, userbean.getCurrentUser(), "User tried to release and generate group membership: " + gmem); }
} gmem.setUser(null);
gmem.setUser(null); gmem.setInviteToken(gmemfacade.createInviteToken(eventbean.getCurrentEvent()));
gmem.setInviteToken(gmemfacade.createInviteToken(eventbean.getCurrentEvent())); gmemfacade.merge(gmem);
gmemfacade.merge(gmem); }
}
} }
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.imageio.ImageIO;
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.EventMapFacade; import fi.insomnia.bortal.facade.EventMapFacade;
import fi.insomnia.bortal.facade.PlaceFacade; import fi.insomnia.bortal.facade.PlaceFacade;
import fi.insomnia.bortal.model.EventMap; import fi.insomnia.bortal.model.EventMap;
import fi.insomnia.bortal.model.Place;
import fi.insomnia.bortal.model.PlaceGroup;
import fi.insomnia.bortal.model.User;
/** /**
* Session Bean implementation class PlaceMapBean * Session Bean implementation class PlaceMapBean
...@@ -30,34 +13,29 @@ import fi.insomnia.bortal.model.User; ...@@ -30,34 +13,29 @@ import fi.insomnia.bortal.model.User;
@Stateless @Stateless
public class PlaceMapBean implements PlaceMapBeanLocal { public class PlaceMapBean implements PlaceMapBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(PlaceMapBean.class); /**
* Default constructor.
/** */
* Default constructor. public PlaceMapBean() {
*/ // TODO Auto-generated constructor stub
public PlaceMapBean() { }
// TODO Auto-generated constructor stub
} @EJB
private PlaceFacade placeFacade;
@EJB @EJB
private PlaceFacade placeFacade; // private EventMapBean eventmapBean;
@EJB private EventMapFacade eventMapFacade;
// private EventMapBean eventmapBean; @EJB
private EventMapFacade eventMapFacade; private EventBeanLocal eventbean;
@EJB
private SecurityBeanLocal secubean; @Override
@EJB public Long selectablePlaceCount(EventMap map) {
private UserBeanLocal userbean;
@EJB return placeFacade.countSelectable(map);
private EventBeanLocal eventbean; }
public Long selectablePlaceCount(EventMap map) { @Override
public EventMap findMap(Integer mapId) {
return placeFacade.countSelectable(map); return eventMapFacade.find(eventbean.getCurrentEvent().getId(), mapId);
} }
@Override
public EventMap findMap(Integer mapId) {
return eventMapFacade.find(eventbean.getCurrentEvent().getId(), mapId);
}
} }
...@@ -4,13 +4,14 @@ import java.util.ArrayList; ...@@ -4,13 +4,14 @@ import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.facade.EventChildGenericFacade;
import fi.insomnia.bortal.facade.PollAnswerFacade; import fi.insomnia.bortal.facade.PollAnswerFacade;
import fi.insomnia.bortal.facade.PollFacade; import fi.insomnia.bortal.facade.PollFacade;
import fi.insomnia.bortal.facade.PollQuestionFacade; import fi.insomnia.bortal.facade.PollQuestionFacade;
...@@ -25,109 +26,110 @@ import fi.insomnia.bortal.model.PossibleAnswer; ...@@ -25,109 +26,110 @@ import fi.insomnia.bortal.model.PossibleAnswer;
*/ */
@Stateless @Stateless
@DeclareRoles("USER")
public class PollBean implements PollBeanLocal { public class PollBean implements PollBeanLocal {
@EJB @EJB
private PollFacade pollFacade; private PollFacade pollFacade;
@EJB @EJB
private PollAnswerFacade pollAnswerFacade; private PollAnswerFacade pollAnswerFacade;
@EJB @EJB
private EventBeanLocal eventBean; private EventBeanLocal eventBean;
@EJB @EJB
private UserBeanLocal userBean; private PermissionBeanLocal permbean;
@EJB @EJB
private PossibleAnswerFacade possibleAnswerFacade; private PossibleAnswerFacade possibleAnswerFacade;
@EJB @EJB
private PollQuestionFacade pqfacade; private PollQuestionFacade pqfacade;
private static final Logger logger = LoggerFactory.getLogger(PollBean.class); private static final Logger logger = LoggerFactory.getLogger(PollBean.class);
/** /**
* Default constructor. * Default constructor.
*/ */
public PollBean() { public PollBean() {
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }
@Override @Override
public List<Poll> findPolls() { @RolesAllowed("USER")
List<Poll> list = new ArrayList<Poll>(); public List<Poll> findPolls() {
List<Poll> list = new ArrayList<Poll>();
userBean.fatalNotLoggedIn();
for (Poll p : pollFacade.findAll(eventBean.getCurrentEvent())) {
for (Poll p : pollFacade.findAll(eventBean.getCurrentEvent())) { if (pollIsUsable(p)) {
if (pollIsUsable(p)) { list.add(p);
list.add(p); }
} logger.debug("Checked poll {}. listsize {}", p, list.size());
logger.debug("Checked poll {}. listsize {}", p, list.size());
}
}
logger.debug("Returning poll");
logger.debug("Returning poll"); return list;
return list; }
}
private boolean pollIsUsable(Poll poll) {
private boolean pollIsUsable(Poll poll) { Calendar now = Calendar.getInstance();
Calendar now = Calendar.getInstance();
// Already valid
// Already valid if (poll.getBegin().after(now)) {
if (poll.getBegin().after(now)) { logger.debug("Poll {} not opened yet", poll);
logger.debug("Poll {} not opened yet", poll); return false;
return false; }
}
// Still valid
// Still valid if (poll.getEnd().before(now)) {
if (poll.getEnd().before(now)) { logger.debug("Poll {} already closed", poll);
logger.debug("Poll {} already closed", poll); return false;
return false; }
}
logger.debug("Poll has {} questions", poll.getQuestions());
logger.debug("Poll has {} questions", poll.getQuestions()); // At least one question that is on a page
// At least one question that is on a page for (PollQuestion q : poll.getQuestions()) {
for (PollQuestion q : poll.getQuestions()) { logger.debug("Check question {} page {}", q, q.getPage());
logger.debug("Check question {} page {}", q, q.getPage()); if (q.getPage() > 0) {
if (q.getPage() > 0) { return true;
return true; }
} }
}
// No usable questions
// No usable questions return false;
return false; }
}
@Override
@Override @RolesAllowed("USER")
public boolean createAnswers(List<PollAnswer> answers) { public boolean createAnswers(List<PollAnswer> answers) {
userBean.fatalNotLoggedIn();
for (PollAnswer answer : answers) {
for (PollAnswer answer : answers) { answer.setUser(permbean.getCurrentUser());
answer.setUser(userBean.getCurrentUser()); if (answer.getId().getId() == null) {
if (answer.getId().getId() == null) pollAnswerFacade.create(answer);
pollAnswerFacade.create(answer); }
} }
return false; return false;
} }
@Override @Override
public PossibleAnswer findPossibleAnwerById(int id) { public PossibleAnswer findPossibleAnwerById(int id) {
PossibleAnswer ans = possibleAnswerFacade.find(eventBean.getCurrentEvent().getId(), new Integer(id)); PossibleAnswer ans = possibleAnswerFacade.find(eventBean.getCurrentEvent().getId(), new Integer(id));
logger.debug("Searching from facade {} found {}", id, ans.getId().getId()); logger.debug("Searching from facade {} found {}", id, ans.getId().getId());
return ans; return ans;
} }
@Override @Override
public void createPoll(Poll poll) { public void createPoll(Poll poll) {
pollFacade.create(poll); pollFacade.create(poll);
} }
@Override @Override
public void createAnswers(PollQuestion q) { public void createAnswers(PollQuestion q) {
pqfacade.create(q); pqfacade.create(q);
} }
} }
...@@ -6,11 +6,11 @@ import java.util.ArrayList; ...@@ -6,11 +6,11 @@ import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.AccountEventFacade; import fi.insomnia.bortal.facade.AccountEventFacade;
import fi.insomnia.bortal.facade.DiscountInstanceFacade; import fi.insomnia.bortal.facade.DiscountInstanceFacade;
import fi.insomnia.bortal.facade.ProductFacade; import fi.insomnia.bortal.facade.ProductFacade;
...@@ -26,133 +26,136 @@ import fi.insomnia.bortal.model.User; ...@@ -26,133 +26,136 @@ import fi.insomnia.bortal.model.User;
* Session Bean implementation class ProductBean * Session Bean implementation class ProductBean
*/ */
@Stateless @Stateless
@DeclareRoles({ "PRODUCT/WRITE", "PRODUCT/READ", "SHOP/EXECUTE" })
public class ProductBean implements ProductBeanLocal { public class ProductBean implements ProductBeanLocal {
private static final String DEFAULT_CREDIT_PRODCT = "Automagic Credit product"; private static final String DEFAULT_CREDIT_PRODCT = "Automagic Credit product";
@EJB @EJB
private ProductFacade productFacade; private ProductFacade productFacade;
@EJB @EJB
private EventBeanLocal eventBean; private EventBeanLocal eventBean;
@EJB
private UserBeanLocal userbean; @EJB
private AccountEventFacade accounteventfacade;
@EJB @EJB
private AccountEventFacade accounteventfacade; private DiscountInstanceFacade discountinstancefacade;
@EJB @EJB
private DiscountInstanceFacade discountinstancefacade; private UserFacade userFacade;
@EJB
private UserFacade userFacade; @EJB
private PermissionBeanLocal permbean;
/**
* Default constructor. /**
*/ * Default constructor.
public ProductBean() { */
// TODO Auto-generated constructor stub public ProductBean() {
} // TODO Auto-generated constructor stub
}
@Override
public List<Product> listUserShoppableProducts() { @Override
return productFacade.findPrepaidProducts(eventBean.getCurrentEvent()); @RolesAllowed("SHOP/EXECUTE")
} public List<Product> listUserShoppableProducts() {
return productFacade.findPrepaidProducts(eventBean.getCurrentEvent());
@Override }
public Product createProduct(String name, BigDecimal price) {
userbean.fatalPermission(Permission.PRODUCT, RolePermission.WRITE, "User tried to create product: ", name); @Override
@RolesAllowed("PRODUCT/WRITE")
Product entity = new Product(eventBean.getCurrentEvent(), name, price); public Product createProduct(String name, BigDecimal price) {
productFacade.create(entity);
return entity; Product entity = new Product(eventBean.getCurrentEvent(), name, price);
} productFacade.create(entity);
return entity;
@Override }
public List<Product> getProducts() {
userbean.fatalPermission(Permission.PRODUCT, RolePermission.READ, "User tried to fetch all products"); @Override
return productFacade.findAll(eventBean.getCurrentEvent()); @RolesAllowed("PRODUCT/READ")
} public List<Product> getProducts() {
return productFacade.findAll(eventBean.getCurrentEvent());
@Override }
public Product mergeChanges(Product product) {
userbean.fatalPermission(Permission.PRODUCT, RolePermission.WRITE, "User tried to save changes for product: ", product); @Override
return productFacade.merge(product); @RolesAllowed("PRODUCT/WRITE")
} public Product mergeChanges(Product product) {
return productFacade.merge(product);
@Override }
public Product findCreditProduct() {
Product ret = productFacade.findProductByPrice(eventBean.getCurrentEvent(), BigDecimal.ONE.negate()); @Override
if (ret == null) { public Product findCreditProduct() {
ret = new Product(eventBean.getCurrentEvent(), DEFAULT_CREDIT_PRODCT, BigDecimal.ONE.negate()); Product ret = productFacade.findProductByPrice(eventBean.getCurrentEvent(), BigDecimal.ONE.negate());
productFacade.create(ret); if (ret == null) {
} ret = new Product(eventBean.getCurrentEvent(), DEFAULT_CREDIT_PRODCT, BigDecimal.ONE.negate());
return ret; productFacade.create(ret);
} }
return ret;
@Override }
public BigDecimal calculateTotal(Product product, BigDecimal quantity) {
if (product == null || quantity == null) { @Override
throw new RuntimeException("Some parameter is null!"); public BigDecimal calculateTotal(Product product, BigDecimal quantity) {
} if (product == null || quantity == null) {
BigDecimal total = product.getPrice(); throw new RuntimeException("Some parameter is null!");
for (Discount d : getActiveDiscounts(product, quantity)) { }
total = total.multiply(d.getPercentage()); BigDecimal total = product.getPrice();
} for (Discount d : getActiveDiscounts(product, quantity)) {
return total.setScale(2, RoundingMode.HALF_UP).multiply(quantity); total = total.multiply(d.getPercentage());
}
} return total.setScale(2, RoundingMode.HALF_UP).multiply(quantity);
// TODO: alennukset lasketaan täällä. HUOMHUOM!! }
@Override
public List<Discount> getActiveDiscounts(Product product, BigDecimal quantity) { // TODO: alennukset lasketaan täällä. HUOMHUOM!!
ArrayList<Discount> ret = new ArrayList<Discount>(); @Override
for (Discount d : product.getDiscounts()) { public List<Discount> getActiveDiscounts(Product product, BigDecimal quantity) {
if (d.isActive() && quantity.compareTo(d.getAmountMax()) <= 0 && quantity.compareTo(d.getAmountMin()) >= 0) { ArrayList<Discount> ret = new ArrayList<Discount>();
ret.add(d); for (Discount d : product.getDiscounts()) {
} if (d.isActive() && quantity.compareTo(d.getAmountMax()) <= 0 && quantity.compareTo(d.getAmountMin()) >= 0) {
} ret.add(d);
return ret; }
} }
return ret;
@Override }
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, User user) {
BigDecimal unitPrice = product.getPrice().negate(); @Override
List<Discount> discounts = getActiveDiscounts(product, quantity); public AccountEvent createAccountEvent(Product product, BigDecimal quantity, User user) {
for (Discount d : discounts) { BigDecimal unitPrice = product.getPrice().negate();
unitPrice = unitPrice.multiply(d.getPercentage()); List<Discount> discounts = getActiveDiscounts(product, quantity);
} for (Discount d : discounts) {
unitPrice = unitPrice.multiply(d.getPercentage());
AccountEvent ret = new AccountEvent(eventBean.getCurrentEvent(), user, product, unitPrice, quantity, Calendar.getInstance()); }
ret.setDelivered(Calendar.getInstance());
ret.setSeller(userbean.getCurrentUser()); AccountEvent ret = new AccountEvent(eventBean.getCurrentEvent(), user, product, unitPrice, quantity, Calendar.getInstance());
// user.getAccountEvents().add(ret); ret.setDelivered(Calendar.getInstance());
accounteventfacade.create(ret); ret.setSeller(permbean.getCurrentUser());
LanEvent event = eventBean.getCurrentEvent(); // user.getAccountEvents().add(ret);
accounteventfacade.create(ret);
// List<DiscountInstance> discountsArray = ret.getDiscountInstances(); LanEvent event = eventBean.getCurrentEvent();
for (Discount d : discounts) {
DiscountInstance discInst = new DiscountInstance(event, ret, d); // List<DiscountInstance> discountsArray = ret.getDiscountInstances();
// discountsArray.add(discInst); for (Discount d : discounts) {
discountinstancefacade.create(discInst); DiscountInstance discInst = new DiscountInstance(event, ret, d);
} // discountsArray.add(discInst);
// userbean.mergeChanges(user); discountinstancefacade.create(discInst);
}
accounteventfacade.evict(ret); // userbean.mergeChanges(user);
userFacade.evict(user);
accounteventfacade.evict(ret);
product.getUnitName(); userFacade.evict(user);
return ret; product.getUnitName();
}
return ret;
@Override }
public Product findById(int id) {
return productFacade.find(eventBean.getCurrentEvent().getId(), id); @Override
} public Product findById(int id) {
return productFacade.find(eventBean.getCurrentEvent().getId(), id);
@Override }
public List<Product> findForStaffshop() {
userbean.fatalPermission(Permission.SHOP, RolePermission.EXECUTE, "user tried to get adminshoppable products from productbean without SHOP:EXECUTE"); @Override
return productFacade.findAll(eventBean.getCurrentEvent()); @RolesAllowed("SHOP/EXECUTE")
} public List<Product> findForStaffshop() {
return productFacade.findAll(eventBean.getCurrentEvent());
}
} }
...@@ -2,14 +2,14 @@ package fi.insomnia.bortal.beans; ...@@ -2,14 +2,14 @@ package fi.insomnia.bortal.beans;
import java.util.Calendar; import java.util.Calendar;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.exceptions.BortalCatchableException; import fi.insomnia.bortal.exceptions.BortalCatchableException;
import fi.insomnia.bortal.facade.GroupMembershipFacade; import fi.insomnia.bortal.facade.GroupMembershipFacade;
import fi.insomnia.bortal.facade.PrintedCardFacade; import fi.insomnia.bortal.facade.PrintedCardFacade;
...@@ -25,99 +25,98 @@ import fi.insomnia.bortal.model.ReaderEvent; ...@@ -25,99 +25,98 @@ import fi.insomnia.bortal.model.ReaderEvent;
* Session Bean implementation class ReaderBean * Session Bean implementation class ReaderBean
*/ */
@Stateless @Stateless
@DeclareRoles("GAME/EXECUTE")
public class ReaderBean implements ReaderBeanLocal { public class ReaderBean implements ReaderBeanLocal {
@EJB @EJB
private ReaderFacade readerfacade; private ReaderFacade readerfacade;
@EJB @EJB
private EventBeanLocal eventbean; private EventBeanLocal eventbean;
@EJB @EJB
private PrintedCardFacade cardfacade; private PrintedCardFacade cardfacade;
@EJB @EJB
private ReaderEventFacade readerEventFacade; private ReaderEventFacade readerEventFacade;
@EJB @EJB
private GroupMembershipFacade gmfacade; private GroupMembershipFacade gmfacade;
@EJB @EJB
private CardTemplateBeanLocal cardtemplatebean; private CardTemplateBeanLocal cardtemplatebean;
@EJB private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class);
private UserBeanLocal userbean;
private static final Logger logger = LoggerFactory.getLogger(ReaderBean.class); @Override
public ReaderEvent checkTag(String ident, String tag, String hash) {
@Override
public ReaderEvent checkTag(String ident, String tag, String hash) { LanEvent ev = eventbean.getCurrentEvent();
PrintedCard card = cardfacade.findByRfid(ev, tag);
LanEvent ev = eventbean.getCurrentEvent(); ReaderEvent ret = null;
PrintedCard card = cardfacade.findByRfid(ev, tag); logger.debug("Found card by rfid: {}", card);
ReaderEvent ret = null; if (card != null) {
logger.debug("Found card by rfid: {}", card);
if (card != null) { ret = createReaderEvent(ident, card);
ret = createReaderEvent(ident, card); }
} return ret;
}
return ret;
} @Override
public ReaderEvent assocTagToPlacecode(String tag, String readerIdent, String placecode) throws BortalCatchableException, PermissionDeniedException {
@Override
public ReaderEvent assocTagToPlacecode(String tag, String readerIdent, String placecode) throws BortalCatchableException { GroupMembership gm = gmfacade.findByToken(placecode);
if (gm == null) {
GroupMembership gm = gmfacade.findByToken(placecode); throw new BortalCatchableException("Token" + placecode + " not found!", "readerbean.tokenNotFound");
if (gm == null) { }
throw new BortalCatchableException("Token" + placecode + " not found!", "readerbean.tokenNotFound"); if (gm.getUser() == null) {
} throw new BortalCatchableException("Token " + placecode + "found but not assoc to user!", "readerbean.userNotAssociateToMembership");
if (gm.getUser() == null) { }
throw new BortalCatchableException("Token " + placecode + "found but not assoc to user!", "readerbean.userNotAssociateToMembership");
} PrintedCard card = cardtemplatebean.setRfidUid(tag, gm.getUser());
PrintedCard card = cardtemplatebean.setRfidUid(tag, gm.getUser()); return createReaderEvent(readerIdent, card);
return createReaderEvent(readerIdent, card); }
} private ReaderEvent createReaderEvent(String readerIdent, PrintedCard card) {
private ReaderEvent createReaderEvent(String readerIdent, PrintedCard card) { LanEvent ev = eventbean.getCurrentEvent();
LanEvent ev = eventbean.getCurrentEvent(); Reader reader = readerfacade.findOrCreateByIdent(ev, readerIdent);
logger.debug("Creating new readerevent for reader {} and events {}", reader, reader.getMaxEvents());
Reader reader = readerfacade.findOrCreateByIdent(ev, readerIdent); logger.debug("maxevents for reder {}. readerevents at the moment {}", reader.getMaxEvents(), reader.getEvents().size());
logger.debug("Creating new readerevent for reader {} and events {}", reader, reader.getMaxEvents()); if (reader.getMaxEvents() > 0 && reader.getMaxEvents() <= reader.getEvents().size()) {
logger.debug("maxevents for reder {}. readerevents at the moment {}", reader.getMaxEvents(), reader.getEvents().size()); logger.debug("Max events {} found. returning null");
if (reader.getMaxEvents() > 0 && reader.getMaxEvents() <= reader.getEvents().size()) { return null;
logger.debug("Max events {} found. returning null"); }
return null; if (reader.getGamepoints() > 0 && card.getUser() != null) {
} logger.debug("Checking if user has been here");
if (reader.getGamepoints() > 0 && card.getUser() != null) {
logger.debug("Checking if user has been here"); for (ReaderEvent oldRe : card.getReaderEvents()) {
for (ReaderEvent oldRe : card.getReaderEvents()) { if (oldRe.getReader().getId().equals(reader.getId())) {
logger.debug("Found already an event for user! returning null");
if (oldRe.getReader().getId().equals(reader.getId())) { return null;
logger.debug("Found already an event for user! returning null"); }
return null; }
} }
} ReaderEvent ret = new ReaderEvent(ev, Calendar.getInstance(), card, reader);
} ret.setGamePoint(reader.getGamepoints());
ReaderEvent ret = new ReaderEvent(ev, Calendar.getInstance(), card, reader); ret.setReader(reader);
ret.setGamePoint(reader.getGamepoints()); reader.getEvents().add(ret);
ret.setReader(reader); card.getReaderEvents().add(ret);
reader.getEvents().add(ret); cardfacade.merge(card);
card.getReaderEvents().add(ret);
cardfacade.merge(card); return ret;
}
return ret;
} @Override
public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) {
@Override card = cardtemplatebean.setRfidUid(tag, card);
public ReaderEvent assocTagToCard(String tag, String readerIdent, PrintedCard card) {
card = cardtemplatebean.setRfidUid(tag, card); return createReaderEvent(readerIdent, card);
}
return createReaderEvent(readerIdent, card);
} @Override
@RolesAllowed("GAME/EXECUTE")
@Override public ReaderEvent merge(ReaderEvent e) {
public ReaderEvent merge(ReaderEvent e) { return readerEventFacade.merge(e);
userbean.fatalPermission(Permission.GAME, RolePermission.EXECUTE, "Tried to change readerevent"); }
return readerEventFacade.merge(e);
}
} }
...@@ -9,14 +9,17 @@ import java.util.HashSet; ...@@ -9,14 +9,17 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.SessionContext;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.enums.Permission; import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.facade.RoleFacade; import fi.insomnia.bortal.facade.RoleFacade;
import fi.insomnia.bortal.facade.RoleRightFacade; import fi.insomnia.bortal.facade.RoleRightFacade;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
...@@ -28,124 +31,116 @@ import fi.insomnia.bortal.model.RoleRight; ...@@ -28,124 +31,116 @@ import fi.insomnia.bortal.model.RoleRight;
* @author tuukka * @author tuukka
*/ */
@Stateless @Stateless
@DeclareRoles({ "ROLE_MANAGEMENT/READ", "ROLE_MANAGEMENT/WRITE" })
public class RoleBean implements RoleBeanLocal { public class RoleBean implements RoleBeanLocal {
// private static final String PUBLIC_ROLE_NAME = BeanRole.ANONYMOUS.toString(); // private static final String PUBLIC_ROLE_NAME =
// BeanRole.ANONYMOUS.toString();
@EJB private static final Logger logger = LoggerFactory.getLogger(RoleBean.class);
private EventBeanLocal eventBean; @Resource
@EJB private SessionContext sc;
private RoleFacade roleFacade; @EJB
@EJB private EventBeanLocal eventBean;
private RoleRightFacade rrfacade; @EJB
private RoleFacade roleFacade;
@EJB @EJB
private UserBeanLocal userbean; private RoleRightFacade rrfacade;
@Override
private static final Logger logger = LoggerFactory.getLogger(RoleBean.class); @RolesAllowed("ROLE_MANAGEMENT/READ")
public List<Role> listRoles() {
public List<Role> listRoles() { return listRoles(eventBean.getCurrentEvent());
userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.READ, "User tried to listRoles"); }
return listRoles(eventBean.getCurrentEvent());
} @Override
@Override @RolesAllowed("ROLE_MANAGEMENT/READ")
public List<Role> listRoles(LanEvent event) { public List<Role> listRoles(LanEvent event) {
return roleFacade.findAll(event);
return roleFacade.findAll(event); }
}
public Role mergeChanges(Role role) { @Override
userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.WRITE, "User tried merge role changes for ", role); @RolesAllowed("ROLE_MANAGEMENT/WRITE")
return roleFacade.merge(role); public Role mergeChanges(Role role) {
} return roleFacade.merge(role);
}
public Role create(Role role) {
userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.WRITE, "User tried to create role", role.getName()); @Override
roleFacade.create(role); @RolesAllowed("ROLE_MANAGEMENT/WRITE")
return role; public Role create(Role role) {
} roleFacade.create(role);
return role;
public List<Role> getPossibleParents(Role role) { }
userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.READ, "User tried to get possible parents for role ", role);
@Override
List<Role> roleList = listRoles(); @RolesAllowed("ROLE_MANAGEMENT/READ")
if (role == null) public List<Role> getPossibleParents(Role role) {
return roleList;
List<Role> roleList = listRoles();
List<Role> children = getAllChilds(role, new HashSet<Role>()); if (role == null) {
return roleList;
for (Role unit : children) { }
if (roleList.contains(unit)) {
roleList.remove(unit); List<Role> children = getAllChilds(role, new HashSet<Role>());
}
} for (Role unit : children) {
roleList.remove(role); if (roleList.contains(unit)) {
return roleList; roleList.remove(unit);
} }
}
private static List<Role> getAllChilds(Role role, Set<Role> checkedRoles) { roleList.remove(role);
return roleList;
List<Role> returnList = new ArrayList<Role>(); }
if (checkedRoles.contains(role) || role == null) { private static List<Role> getAllChilds(Role role, Set<Role> checkedRoles) {
return returnList;
} List<Role> returnList = new ArrayList<Role>();
for (Role unit : role.getChildren()) { if (checkedRoles.contains(role) || role == null) {
List<Role> someList = getAllChilds(unit, checkedRoles); return returnList;
}
returnList.addAll(someList);
} for (Role unit : role.getChildren()) {
checkedRoles.add(role); List<Role> someList = getAllChilds(unit, checkedRoles);
return returnList; returnList.addAll(someList);
} }
checkedRoles.add(role);
public List<RoleRight> getRoleRights(Role r) {
return returnList;
List<RoleRight> ret = new ArrayList<RoleRight>(); }
for (Permission perm : Permission.values()) {
ret.add(findRoleRight(r, perm)); @Override
} @RolesAllowed("ROLE_MANAGEMENT/READ")
return ret; public List<RoleRight> getRoleRights(Role r) {
}
List<RoleRight> ret = new ArrayList<RoleRight>();
@Override for (Permission perm : Permission.values()) {
public RoleRight mergeChanges(RoleRight row) { ret.add(findRoleRight(r, perm));
userbean.fatalPermission(Permission.ROLE_MANAGEMENT, RolePermission.WRITE, "User tried merge changes for RoleRight", row); }
return ret;
return rrfacade.merge(row); }
}
@Override
@RolesAllowed("ROLE_MANAGEMENT/WRITE")
// public Role getOrCreatePublicRole() { public RoleRight mergeChanges(RoleRight row) {
//
// Role ret = roleFacade.findByName(PUBLIC_ROLE_NAME); return rrfacade.merge(row);
// if (ret == null) { }
//
// ret = roleFacade.createRole(eventBean.getCurrentEvent(), PUBLIC_ROLE_NAME); @RolesAllowed("ROLE_MANAGEMENT/READ")
// AccessRight perm = accessRightFacade.findByPermission(Permission.LOGIN); public RoleRight findRoleRight(Role role, Permission perm) {
// RoleRight rr = rrfacade.createRoleRight(ret, perm); RoleRight rr = rrfacade.find(perm, role);
// rr.setRead(true); if (rr == null) {
// } rr = new RoleRight(role, perm, false, false, false);
// return ret; rrfacade.create(rr);
// }
// } return rr;
}
public RoleRight findRoleRight(Role role, Permission perm) { @Override
RoleRight rr = rrfacade.find(perm, role); @RolesAllowed("ROLE_MANAGEMENT/READ")
if (rr == null) { public Role find(int id, LanEvent event) {
rr = new RoleRight(role, perm, false, false, false); return roleFacade.find(event.getId(), id);
rrfacade.create(rr); }
}
return rr;
}
@Override
public Role find(int id, LanEvent event) {
return roleFacade.find(event.getId(), id);
}
} }
package fi.insomnia.bortal.beans;
import java.util.Calendar;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.transaction.UserTransaction;
import org.slf4j.Logger;
import fi.insomnia.bortal.facade.LogEntryFacade;
import fi.insomnia.bortal.facade.LogEntryTypeFacade;
import fi.insomnia.bortal.model.LogEntry;
import fi.insomnia.bortal.model.LogEntryType;
import fi.insomnia.bortal.model.User;
/**
* Session Bean implementation class SercurityBean
*/
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class SecurityBean implements SecurityBeanLocal {
private static final boolean DEBUG = true;
private final Logger logger = org.slf4j.LoggerFactory.getLogger(SecurityBean.class);
@EJB
private LogEntryTypeFacade typeFacade;
@EJB
private LogEntryFacade entryFacade;
@Resource
UserTransaction utx;
// @Override
// public LogEntry logPermissionDenied(User user, Exception exception) {
// LogEntry entry = null;
//
// entry = logMessage(SecurityLogType.permissionDenied, user,
// exception.getMessage());
// logger.debug(entry.toString(), exception);
//
// return entry;
//
// }
//
// public LogEntry logException(User user, Exception exception) {
//
// LogEntry entry = logMessage(SecurityLogType.unknownException, user,
// exception.getMessage());
// logger.debug(entry.toString(), exception);
// return entry;
// }
//
// public LogEntry logMessage(User user, String... description) {
//
// LogEntry entry = logMessage(SecurityLogType.genericMessage, user,
// toString(description));
//
// return entry;
// }
//
// private static final String toString(String... desc) {
// StringBuilder msg = new StringBuilder();
// for (String msgpart : desc) {
// msg.append(msgpart);
// }
// return msg.toString();
// }
//
// public LogEntry logMessage(String... description) {
// LogEntry entry = logMessage(SecurityLogType.genericMessage,
// toString(description));
// return entry;
//
// }
// public LogEntry logPermissionDenied(User currentuser, String... message)
// {
// return logMessage(SecurityLogType.permissionDenied, currentuser,
// toString(message));
// }
public LogEntry logMessage(SecurityLogType paramType, User user, String... description) {
LogEntry entry = null;
try {
String desc = toString(description);
utx.begin();
LogEntryType type = typeFacade.findOrCreate(paramType);
entry = new LogEntry(Calendar.getInstance());
entry.setType(type);
entry.setDescription(desc);
entry.setUser(user);
entryFacade.create(entry);
if (DEBUG) {
logger.debug("SECURITY DEBUG: Type: \"{}\" user \"{}\", description \"{}\"", new String[] { paramType.name(), (user == null) ? "null" : user.getLogin(), desc });
}
utx.commit();
} catch (Exception e) {
logger.warn("Exception at SecurityBean", e);
}
return entry;
}
private static final String toString(String... desc) {
StringBuilder msg = new StringBuilder();
for (String msgpart : desc) {
msg.append(msgpart);
}
return msg.toString();
}
}
package fi.insomnia.bortal.beans; package fi.insomnia.bortal.beans;
import java.security.Principal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import javax.annotation.Resource; import javax.annotation.security.RolesAllowed;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.ejb.LocalBean; import javax.ejb.LocalBean;
import javax.ejb.SessionContext;
import javax.ejb.Stateless; import javax.ejb.Stateless;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
...@@ -19,17 +16,14 @@ import javax.persistence.PersistenceContext; ...@@ -19,17 +16,14 @@ import javax.persistence.PersistenceContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import fi.insomnia.bortal.clientutils.BortalLocalContextHolder;
import fi.insomnia.bortal.enums.Permission; import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission; 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.UserFacade; import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.facade.UserImageFacade; import fi.insomnia.bortal.facade.UserImageFacade;
import fi.insomnia.bortal.model.GroupMembership; import fi.insomnia.bortal.model.GroupMembership;
import fi.insomnia.bortal.model.LanEvent; import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role; import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.RoleRight;
import fi.insomnia.bortal.model.User; import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.model.UserImage; import fi.insomnia.bortal.model.UserImage;
import fi.insomnia.bortal.util.MailMessage; import fi.insomnia.bortal.util.MailMessage;
...@@ -42,337 +36,227 @@ import fi.insomnia.bortal.utilities.I18n; ...@@ -42,337 +36,227 @@ import fi.insomnia.bortal.utilities.I18n;
@Stateless @Stateless
public class UserBean implements UserBeanLocal { public class UserBean implements UserBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(UserBean.class); private static final Logger logger = LoggerFactory.getLogger(UserBean.class);
public static final String DEFAULT_USER_LOGIN = "ANONYMOUS";
/**
/** * Java EE container injektoi tämän luokkamuuttujan luokan luonnin
* Java EE container injektoi tämän luokkamuuttujan luokan luonnin * yhteydessä.
* yhteydessä. */
*/ @EJB
@EJB private UserFacade userFacade;
private UserFacade userFacade; @PersistenceContext
@PersistenceContext private EntityManager em;
private EntityManager em;
@Resource @EJB
private SessionContext context; private EventBeanLocal eventBean;
@EJB @EJB
private SecurityBeanLocal secubean; private UserImageFacade userimagefacade;
@EJB @EJB
private EventBeanLocal eventBean; private UtilBeanLocal utilbean;
@EJB @EJB
private UserImageFacade userimagefacade; private CardTemplateBeanLocal ctbean;
@EJB
@EJB private AccountEventBeanLocal acbean;
private UtilBeanLocal utilbean; @EJB
private GroupMembershipFacade groupMembershipFacade;
@EJB
private CardTemplateBeanLocal ctbean; @EJB
@EJB private PermissionBeanLocal permbean;
private PlaceGroupBeanLocal pgbean;
@EJB @Override
private AccountEventBeanLocal acbean; @RolesAllowed("USER_MANAGEMENT/READ")
@EJB public List<User> getUsers() {
private GroupMembershipFacade groupMembershipFacade;
List<User> ret = userFacade.findAll();
@Override return ret;
public List<User> getUsers() { }
fatalPermission(Permission.USER_MANAGEMENT, RolePermission.READ);
@Override
List<User> ret = userFacade.findAll(); public User mergeChanges(User user) throws PermissionDeniedException {
return ret; if (!permbean.isCurrentUser(user)) {
}
permbean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.WRITE);
@Override }
public User mergeChanges(User user) {
if (!isCurrentUser(user)) { ctbean.checkPrintedCard(user);
fatalPermission(Permission.USER_MANAGEMENT, RolePermission.WRITE); User ret = userFacade.merge(user);
}
userFacade.evict(ret);
ctbean.checkPrintedCard(user); return ret;
User ret = userFacade.merge(user); }
userFacade.evict(ret); @Override
return ret; public User getUser(String nick) {
} return userFacade.findByLogin(nick);
}
@Override
public User getUser(String nick) { @Override
return userFacade.findByLogin(nick); public List<Role> findUsersRoles(User u) throws PermissionDeniedException {
} User currusr = permbean.getCurrentUser();
if (!currusr.equals(u)) {
@Override permbean.fatalNotLoggedIn();
public boolean isCurrentUser(User user) { }
return (context.getCallerPrincipal() == null || user == null) ? false : context.getCallerPrincipal().getName().equals(user.getLogin());
} return localFindUsersRoles(u);
@Override }
public boolean isLoggedIn() {
return !getAnonUser().equals(getCurrentUser()) || getCurrentUser().isSuperadmin(); public List<Role> localFindUsersRoles(User u) {
} Set<Role> checkedRoles = new HashSet<Role>();
addRecursive(checkedRoles, u.getRoles());
@Override
public User getCurrentUser() { if (permbean.isLoggedIn()) {
Principal principal = context.getCallerPrincipal();
LanEvent event = eventBean.getCurrentEvent();
User ret = userFacade.findByLogin(principal.getName()); // add roles from events default role.
if (ret == null) { addRecursive(checkedRoles, event.getDefaultRole());
ret = getAnonUser();
} // add roles from accountEvents of the user
return ret; addRecursive(checkedRoles, acbean.getRolesFromAccountEvents(u));
}
for (GroupMembership member : groupMembershipFacade.findMemberships(event, u)) {
/** addRecursive(checkedRoles, member.getPlaceReservation().getProvidesRole());
* Makes sure default user and public role exist and the user is member of
* the role. }
*/ }
@Override return new ArrayList<Role>(checkedRoles);
public User getAnonUser() { }
User defaultUser = userFacade.findByLogin(DEFAULT_USER_LOGIN);
if (defaultUser == null) { private void addRecursive(Set<Role> checkedRoles, Collection<Role> roles) {
defaultUser = new User(); for (Role r : roles) {
defaultUser.setLogin(DEFAULT_USER_LOGIN); addRecursive(checkedRoles, r);
defaultUser.setNick(DEFAULT_USER_LOGIN); }
userFacade.create(defaultUser); }
defaultUser.setSuperadmin(true); private void addRecursive(Set<Role> checkedRoles, Role role) {
} if (role == null || checkedRoles.contains(role)) {
return defaultUser; return;
} }
checkedRoles.add(role);
@Override for (Role r : role.getParents()) {
public boolean hasPermission(Permission target, RolePermission permission) { addRecursive(checkedRoles, r);
}
User user = getCurrentUser();
Calendar start = Calendar.getInstance(); }
Boolean ret = BortalLocalContextHolder.hasPermission(target, permission); @Override
// Boolean ret = BortalLocalContextHolder.hasPermission(target, @RolesAllowed("USER")
// permission); public UserImage uploadImage(Integer userid, String contentType, byte[] image, String filename, String description) throws PermissionDeniedException {
if (ret == null) { User user = permbean.getCurrentUser();
for (Role role : this.findUsersRoles(user)) { logger.debug("uploading image to userid {}", userid);
if (role == null) { if (userid == null || userid.equals(0)) {
continue; userid = user.getId();
} }
for (RoleRight rr : role.getRoleRights()) { if (!permbean.getCurrentUser().getId().equals(userid)) {
BortalLocalContextHolder.setPermission(rr); permbean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE, "usert tried to save picture to userid " + userid + " without sufficient permissions!");
user = userFacade.find(userid);
ret = BortalLocalContextHolder.hasPermission(target, permission); }
if (ret != null) { UserImage userimage = new UserImage(user);
break; userimage.setMimeType(contentType);
} userimage.setImageData(image);
userimage.setName(filename);
} userimage.setDescription(description);
if (ret != null) { userimagefacade.create(userimage);
break;
} // setting uploaded image as the default.
} user.setCurrentImage(userimage);
} user.getUserImageList().add(userimage);
// TODO: FIX THIS!! really bad idea.... userFacade.merge(user);
if (user.isSuperadmin()) { return userimage;
return true; }
}
@Override
if (ret == null) { public UserImage findUserImage(int id) throws PermissionDeniedException {
ret = false;
BortalLocalContextHolder.setPermission(target, permission, ret); UserImage ret = null;
} if (id == 0 && permbean.isLoggedIn()) {
ret = permbean.getCurrentUser().getCurrentImage();
return ret; } else {
ret = userimagefacade.find(id);
} if (ret != null && !permbean.isCurrentUser(ret.getUser())) {
permbean.fatalPermission(Permission.USER_MANAGEMENT, RolePermission.READ, "Not enough rights to access image id: " + id + " for user " + ret.getUser());
@Override }
public List<Role> findUsersRoles(User u) { }
User currusr = getCurrentUser(); return ret;
if (!currusr.equals(u)) { }
fatalNotLoggedIn();
} @Override
public List<User> searchName(String name) {
Set<Role> checkedRoles = new HashSet<Role>(); return userFacade.searchForName(name);
addRecursive(checkedRoles, u.getRoles()); }
if (isLoggedIn()) { @Override
LanEvent event = eventBean.getCurrentEvent(); public User createNewUser(User user, String password) {
addRecursive(checkedRoles, event.getDefaultRole()); user.resetPassword(password);
// Tallennetaan olio kantaan...
addRecursive(checkedRoles, acbean.getRolesFromAccountEvents(u)); userFacade.create(user);
em.flush();
for (GroupMembership member : groupMembershipFacade.findMemberships(event, u)) { return user;
addRecursive(checkedRoles, member.getPlaceReservation().getProvidesRole()); }
} @Override
} public User findPasswordResetUser(Integer id, String hash) {
return new ArrayList<Role>(checkedRoles); User ret = null;
if (id != null && hash != null && id > 0 && !hash.isEmpty()) {
} User user = userFacade.find(id);
if (user != null && hash.equals(user.getConfirmHash())) {
private void addRecursive(Set<Role> checkedRoles, Collection<Role> roles) { ret = user;
for (Role r : roles) { }
addRecursive(checkedRoles, r); }
} return ret;
} }
private void addRecursive(Set<Role> checkedRoles, Role role) { @Override
if (role == null || checkedRoles.contains(role)) { public boolean resetPassword(User user, String password, String hash) {
return; User nuser = userFacade.find(user.getId());
} if (user.equals(nuser) && hash.equals(nuser.getConfirmHash())) {
checkedRoles.add(role); logger.debug("Changing user {} password with confirmhash {}", user, hash);
for (Role r : role.getParents()) { nuser.setConfirmHash(null);
addRecursive(checkedRoles, r); nuser.resetPassword(password);
} userFacade.merge(nuser);
return true;
} }
return false;
@Override }
public void fatalPermission(Permission target, RolePermission permission, Object... failmessage) {
boolean ret = hasPermission(target, permission); @Override
if (!ret) { public boolean initPasswordReset(User user, String hash, String mailpath) {
StringBuilder message = new StringBuilder("Target: ").append(target).append(" permission: ").append(permission); logger.debug("sending mail! user {} hash {} path {}", new Object[] { user, hash, mailpath });
if (failmessage == null || failmessage.length == 0) { if (hash == null || hash.length() < 20 || user == null || user.getEmail() == null || user.getEmail().length() <= 5) {
message.append(" MSG: SessionHandler mbean permission exception: Target: ") return false;
.append(target) }
.append(", Permission: ") MailMessage msg = new MailMessage();
.append(permission); msg.setTo(user);
} else { msg.setSubject(I18n.get("passwordreset.mailSubject"));
for (Object part : failmessage) { msg.setMessage(I18n.get("passwordreset.mailBody", mailpath));
message.append(part == null ? "NULL" : part.toString());
} utilbean.sendMail(msg);
}
// throw new SecurityException("Foobar"); user.setConfirmHash(hash);
userFacade.merge(user);
throw new PermissionDeniedException(secubean, getCurrentUser(), message.toString()); return true;
}
} }
@Override @Override
public void fatalNotLoggedIn() { public User findById(Integer id) {
if (!isLoggedIn()) { return userFacade.find(id);
throw new PermissionDeniedException(secubean, getCurrentUser(), "User is not logged in!"); }
}
} @Override
public List<User> getUsers(int page, int pagesize, String sort, String search) {
@Override return userFacade.searchUser(page, pagesize, sort, search);
public UserImage uploadImage(Integer userid, String contentType, byte[] image, String filename, String description) { }
fatalNotLoggedIn();
User user = getCurrentUser(); @Override
logger.debug("uploading image to userid {}", userid); public long getUsersCount(String search) {
if (userid == null || userid.equals(0)) { return userFacade.searchUserCount(search);
userid = user.getId(); }
}
if (!getCurrentUser().getId().equals(userid)) {
fatalPermission(Permission.USER_MANAGEMENT, RolePermission.EXECUTE, "usert tried to save picture to userid " + userid + " without sufficient permissions!");
user = userFacade.find(userid);
}
UserImage userimage = new UserImage(user);
userimage.setMimeType(contentType);
userimage.setImageData(image);
userimage.setName(filename);
userimage.setDescription(description);
userimagefacade.create(userimage);
// setting uploaded image as the default.
user.setCurrentImage(userimage);
user.getUserImageList().add(userimage);
userFacade.merge(user);
return userimage;
}
@Override
public UserImage findUserImage(int id) {
UserImage ret = null;
if (id == 0 && isLoggedIn()) {
ret = getCurrentUser().getCurrentImage();
} else {
ret = userimagefacade.find(id);
if (ret != null && !this.isCurrentUser(ret.getUser())) {
fatalPermission(Permission.USER_MANAGEMENT, RolePermission.READ, "Not enough rights to access image id: " + id + " for user " + ret.getUser());
}
}
return ret;
}
@Override
public List<User> searchName(String name) {
return userFacade.searchForName(name);
}
@Override
public User createNewUser(User user, String password) {
user.resetPassword(password);
// Tallennetaan olio kantaan...
userFacade.create(user);
em.flush();
return user;
}
@Override
public User findPasswordResetUser(Integer id, String hash) {
User ret = null;
if (id != null && hash != null && id > 0 && !hash.isEmpty()) {
User user = userFacade.find(id);
if (user != null && hash.equals(user.getConfirmHash())) {
ret = user;
}
}
return ret;
}
@Override
public boolean resetPassword(User user, String password, String hash) {
User nuser = userFacade.find(user.getId());
if (user.equals(nuser) && hash.equals(nuser.getConfirmHash())) {
logger.debug("Changing user {} password with confirmhash {}", user, hash);
nuser.setConfirmHash(null);
nuser.resetPassword(password);
userFacade.merge(nuser);
return true;
}
return false;
}
@Override
public boolean initPasswordReset(User user, String hash, String mailpath) {
logger.debug("sending mail! user {} hash {} path {}", new Object[] { user, hash, mailpath });
if (hash == null || hash.length() < 20 || user == null || user.getEmail() == null || user.getEmail().length() <= 5) {
return false;
}
MailMessage msg = new MailMessage();
msg.setTo(user);
msg.setSubject(I18n.get("passwordreset.mailSubject"));
msg.setMessage(I18n.get("passwordreset.mailBody", mailpath));
utilbean.sendMail(msg);
user.setConfirmHash(hash);
userFacade.merge(user);
return true;
}
@Override
public User findById(Integer id) {
return userFacade.find(id);
}
@Override
public List<User> getUsers(int page, int pagesize, String sort, String search) {
return userFacade.searchUser(page, pagesize, sort, search);
}
@Override
public long getUsersCount(String search) {
return userFacade.searchUserCount(search);
}
} }
...@@ -2,7 +2,6 @@ package fi.insomnia.bortal.beans; ...@@ -2,7 +2,6 @@ package fi.insomnia.bortal.beans;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.RenderingHints; import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
...@@ -22,10 +21,6 @@ import javax.jms.Queue; ...@@ -22,10 +21,6 @@ import javax.jms.Queue;
import javax.jms.QueueConnection; import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory; import javax.jms.QueueConnectionFactory;
import javax.jms.Session; import javax.jms.Session;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceUnit;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -41,109 +36,105 @@ import fi.insomnia.bortal.util.MailMessage; ...@@ -41,109 +36,105 @@ import fi.insomnia.bortal.util.MailMessage;
@Local @Local
public class UtilBean implements UtilBeanLocal { public class UtilBean implements UtilBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(UtilBean.class); private static final Logger logger = LoggerFactory.getLogger(UtilBean.class);
private static final int SCALEWIDTH = 640; private static final int SCALEWIDTH = 640;
@PersistenceContext @EJB
private EntityManager em; private UserBean userbean;
@PersistenceUnit /**
private EntityManagerFactory emf; * Default constructor.
*/
@EJB public UtilBean() {
private UserBean userbean; // TODO Auto-generated constructor stub
}
/**
* Default constructor. @Resource(name = "jmsQueue", mappedName = "jms/mailque")
*/ private Queue mailQueue;
public UtilBean() { @Resource(name = "connFactory", mappedName = "jms/mailconnectionfactory")
// TODO Auto-generated constructor stub private QueueConnectionFactory mailQuefactory;
}
@Override
@Resource(name = "jmsQueue", mappedName = "jms/mailque") public boolean sendMail(MailMessage message) {
private Queue mailQueue; Date d = new Date();
@Resource(name = "connFactory", mappedName = "jms/mailconnectionfactory") try {
private QueueConnectionFactory mailQuefactory; QueueConnection conn = mailQuefactory.createQueueConnection();
Session session = conn.createSession(false, 1);
@Override ObjectMessage objmessage = session.createObjectMessage(message);
public boolean sendMail(MailMessage message) {
Date d = new Date(); session.createProducer(mailQueue).send(objmessage);
try { conn.close();
QueueConnection conn = mailQuefactory.createQueueConnection(); } catch (JMSException e) {
Session session = conn.createSession(false, 1); logger.debug("Got exception sending mail", e);
ObjectMessage objmessage = session.createObjectMessage(message); }
logger.debug("Message time {}", new Date().getTime() - d.getTime());
session.createProducer(mailQueue).send(objmessage); return true;
conn.close(); }
} catch (JMSException e) {
logger.debug("Got exception sending mail", e); @Override
} public void checkAllUsersImages() throws PermissionDeniedException {
logger.debug("Message time {}", new Date().getTime() - d.getTime());
return true; for (User usr : userbean.getUsers()) {
} convertImage(usr);
}
public void checkAllUsersImages() {
}
for (User usr : userbean.getUsers()) {
convertImage(usr); @Override
} public boolean convertImage(User user) throws PermissionDeniedException {
UserImage oldpic = user.getCurrentImage();
} if (oldpic == null || oldpic.getMimeType() == null || oldpic.getMimeType().isEmpty()) {
return false;
public boolean convertImage(User user) { }
UserImage oldpic = user.getCurrentImage(); for (String imgtype : ImageIO.getReaderFormatNames()) {
if (oldpic == null || oldpic.getMimeType() == null || oldpic.getMimeType().isEmpty()) { logger.debug("found imgtype {}", imgtype);
return false; }
}
for (String imgtype : ImageIO.getReaderFormatNames()) { logger.debug("converting users image id {}, type {} to jpeg", oldpic.getId(), oldpic.getMimeType());
logger.debug("found imgtype {}", imgtype);
} ByteArrayInputStream naamastream = new ByteArrayInputStream(oldpic.getImageData());
logger.debug("converting users image id {}, type {} to jpeg", oldpic.getId(), oldpic.getMimeType()); try {
BufferedImage face = ImageIO.read(naamastream);
ByteArrayInputStream naamastream = new ByteArrayInputStream(oldpic.getImageData()); boolean isJpeg = oldpic.getMimeType().contains("jpeg");
if (face == null) {
try { return false;
BufferedImage face = ImageIO.read(naamastream); }
boolean isJpeg = oldpic.getMimeType().contains("jpeg"); if (face.getWidth() > 700) {
if (face == null) { logger.debug("Scaling from {} {} ", face.getWidth(), face.getHeight());
return false; BigDecimal scale = new BigDecimal(SCALEWIDTH).divide(new BigDecimal(face.getWidth()), 5, RoundingMode.HALF_UP);
} int height = scale.multiply(new BigDecimal(face.getHeight())).intValue();
if (face.getWidth() > 700) {
logger.debug("Scaling from {} {} ", face.getWidth(), face.getHeight()); BufferedImage scaledImage = new BufferedImage(
BigDecimal scale = new BigDecimal(SCALEWIDTH).divide(new BigDecimal(face.getWidth()), 5, RoundingMode.HALF_UP); SCALEWIDTH, height, face.getType());
int height = scale.multiply(new BigDecimal(face.getHeight())).intValue();
Graphics2D graphics2D = scaledImage.createGraphics();
BufferedImage scaledImage = new BufferedImage( graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
SCALEWIDTH, height, face.getType()); RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.drawImage(face, 0, 0, SCALEWIDTH, height, null);
Graphics2D graphics2D = scaledImage.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, face = scaledImage;
RenderingHints.VALUE_INTERPOLATION_BILINEAR); } else if (isJpeg) {
graphics2D.drawImage(face, 0, 0, SCALEWIDTH, height, null); return false;
}
face = scaledImage;
} else if (isJpeg) { ByteArrayOutputStream naamaout = new ByteArrayOutputStream();
return false; ImageIO.write(face, "jpeg", naamaout);
}
UserImage img = new UserImage(user);
ByteArrayOutputStream naamaout = new ByteArrayOutputStream(); img.setDescription("changed imagetype from image id: " + oldpic.getId());
ImageIO.write(face, "jpeg", naamaout); img.setImageData(naamaout.toByteArray());
img.setMimeType("image/jpeg");
UserImage img = new UserImage(user); img.setName("regenerated.jpg");
img.setDescription("changed imagetype from image id: " + oldpic.getId());
img.setImageData(naamaout.toByteArray()); user.setCurrentImage(img);
img.setMimeType("image/jpeg"); user.getUserImageList().add(img);
img.setName("regenerated.jpg");
userbean.mergeChanges(user);
user.setCurrentImage(img); } catch (IOException e) {
user.getUserImageList().add(img); logger.warn("error converting image ", e);
}
userbean.mergeChanges(user); return true;
} catch (IOException e) { }
logger.warn("error converting image ", e);
}
return true;
}
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!