diff --git a/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java b/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java index 8dfb009d4797ca8cd63bda42353ab46ad153cc62..b22307926415a4a44210d0562bb65ac343749655 100644 --- a/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java +++ b/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java @@ -24,6 +24,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import org.olat.core.commons.persistence.DB; import org.olat.core.configuration.AbstractSpringModule; import org.olat.core.configuration.ConfigOnOff; import org.olat.core.logging.OLog; @@ -84,18 +85,31 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO private String vatNumber; @Autowired - private ACMethodDAO acMethodManager; + private DB dbInstance; + private final ACMethodDAO acMethodManager; @Autowired private List<AccessMethodHandler> methodHandlers; @Autowired - public AccessControlModule(CoordinatorManager coordinatorManager) { + public AccessControlModule(CoordinatorManager coordinatorManager, ACMethodDAO acMethodManager) { super(coordinatorManager); + this.acMethodManager = acMethodManager; } @Override public void init() { //module enabled/disabled + updateProperties(); + updateAccessMethods(); + log.info("Access control module is enabled: " + Boolean.toString(enabled)); + } + + @Override + protected void initFromChangedProperties() { + updateProperties(); + } + + private void updateProperties() { String enabledObj = getStringPropertyValue(AC_ENABLED, true); if(StringHelper.containsNonWhitespace(enabledObj)) { enabled = "true".equals(enabledObj); @@ -144,12 +158,14 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO if(StringHelper.containsNonWhitespace(vatNrObj)) { vatNumber = vatNrObj; } - log.info("Access control module is enabled: " + Boolean.toString(enabled)); } - - @Override - protected void initFromChangedProperties() { - init(); + + private void updateAccessMethods() { + acMethodManager.enableMethod(TokenAccessMethod.class, isTokenEnabled()); + acMethodManager.enableMethod(FreeAccessMethod.class, isFreeEnabled()); + acMethodManager.enableMethod(PaypalAccessMethod.class, isPaypalEnabled()); + acMethodManager.enableAutoMethods(isAutoEnabled()); + dbInstance.commitAndCloseSession(); } @Override @@ -158,9 +174,8 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO } public void setEnabled(boolean enabled) { - if(this.enabled != enabled) { - setStringProperty(AC_ENABLED, Boolean.toString(enabled), true); - } + this.enabled = enabled; + setStringProperty(AC_ENABLED, Boolean.toString(enabled), true); } public boolean isTokenEnabled() { @@ -168,12 +183,9 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO } public void setTokenEnabled(boolean tokenEnabled) { - if(this.tokenEnabled != tokenEnabled) { - setStringProperty(TOKEN_ENABLED, Boolean.toString(tokenEnabled), true); - } - if(acMethodManager != null) { - acMethodManager.enableMethod(TokenAccessMethod.class, tokenEnabled); - } + this.tokenEnabled = tokenEnabled; + setStringProperty(TOKEN_ENABLED, Boolean.toString(tokenEnabled), true); + acMethodManager.enableMethod(TokenAccessMethod.class, tokenEnabled); } public boolean isFreeEnabled() { @@ -181,9 +193,8 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO } public void setFreeEnabled(boolean freeEnabled) { - if(this.freeEnabled != freeEnabled) { - setStringProperty(FREE_ENABLED, Boolean.toString(freeEnabled), true); - } + this.freeEnabled = freeEnabled; + setStringProperty(FREE_ENABLED, Boolean.toString(freeEnabled), true); if(acMethodManager != null) { acMethodManager.enableMethod(FreeAccessMethod.class, freeEnabled); } @@ -194,12 +205,9 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO } public void setAutoEnabled(boolean autoEnabled) { - if(this.autoEnabled != autoEnabled) { - setStringProperty(AUTO_ENABLED, Boolean.toString(autoEnabled), true); - } - if(acMethodManager != null) { - acMethodManager.enableAutoMethods(autoEnabled); - } + this.autoEnabled = autoEnabled; + setStringProperty(AUTO_ENABLED, Boolean.toString(autoEnabled), true); + acMethodManager.enableAutoMethods(autoEnabled); } public boolean isPaypalEnabled() { @@ -207,12 +215,9 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO } public void setPaypalEnabled(boolean paypalEnabled) { - if(this.paypalEnabled != paypalEnabled) { - setStringProperty(PAYPAL_ENABLED, Boolean.toString(paypalEnabled), true); - } - if(acMethodManager != null) { - acMethodManager.enableMethod(PaypalAccessMethod.class, paypalEnabled); - } + this.paypalEnabled = paypalEnabled; + setStringProperty(PAYPAL_ENABLED, Boolean.toString(paypalEnabled), true); + acMethodManager.enableMethod(PaypalAccessMethod.class, paypalEnabled); } public boolean isHomeOverviewEnabled() { diff --git a/src/main/java/org/olat/resource/accesscontrol/manager/ACFrontendManager.java b/src/main/java/org/olat/resource/accesscontrol/manager/ACFrontendManager.java index a517ed0173b7f314ef63370b40f63b68eefa950e..5c80e7b49a1e9275202ef14252b0e6023d919163 100644 --- a/src/main/java/org/olat/resource/accesscontrol/manager/ACFrontendManager.java +++ b/src/main/java/org/olat/resource/accesscontrol/manager/ACFrontendManager.java @@ -68,6 +68,7 @@ import org.olat.resource.accesscontrol.method.AccessMethodHandler; import org.olat.resource.accesscontrol.model.ACResourceInfo; import org.olat.resource.accesscontrol.model.ACResourceInfoImpl; import org.olat.resource.accesscontrol.model.AccessMethod; +import org.olat.resource.accesscontrol.model.AccessMethodSecurityCallback; import org.olat.resource.accesscontrol.model.AccessTransactionStatus; import org.olat.resource.accesscontrol.model.OLATResourceAccess; import org.olat.resource.accesscontrol.model.PSPTransactionStatus; @@ -599,7 +600,18 @@ public class ACFrontendManager implements ACService { @Override public List<AccessMethod> getAvailableMethods(Identity identity, Roles roles) { - return methodManager.getAvailableMethods(identity, roles); + List<AccessMethod> methods = methodManager.getAvailableMethods(); + + List<AccessMethod> allowedMethods = new ArrayList<>(); + for(AccessMethod method:methods) { + AccessMethodHandler handler = accessModule.getAccessMethodHandler(method.getType()); + AccessMethodSecurityCallback secCallback = handler.getSecurityCallback(identity, roles); + if(secCallback.canUse()) { + allowedMethods.add(method); + } + } + + return methods; } @Override diff --git a/src/main/java/org/olat/resource/accesscontrol/manager/ACMethodDAO.java b/src/main/java/org/olat/resource/accesscontrol/manager/ACMethodDAO.java index 65e609bf5e9242da0a34d1584a2d3c631c531a05..3ce2a2dd17caa0d8860ca5a1f0e010df6f8bc950 100644 --- a/src/main/java/org/olat/resource/accesscontrol/manager/ACMethodDAO.java +++ b/src/main/java/org/olat/resource/accesscontrol/manager/ACMethodDAO.java @@ -35,28 +35,21 @@ import javax.persistence.TypedQuery; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.PersistenceHelper; -import org.olat.core.id.Identity; -import org.olat.core.id.Roles; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceImpl; -import org.olat.resource.accesscontrol.AccessControlModule; import org.olat.resource.accesscontrol.Offer; import org.olat.resource.accesscontrol.OfferAccess; import org.olat.resource.accesscontrol.Price; -import org.olat.resource.accesscontrol.method.AccessMethodHandler; import org.olat.resource.accesscontrol.model.AbstractAccessMethod; import org.olat.resource.accesscontrol.model.AccessMethod; -import org.olat.resource.accesscontrol.model.AccessMethodSecurityCallback; import org.olat.resource.accesscontrol.model.FreeAccessMethod; import org.olat.resource.accesscontrol.model.OLATResourceAccess; import org.olat.resource.accesscontrol.model.OfferAccessImpl; import org.olat.resource.accesscontrol.model.TokenAccessMethod; -import org.olat.resource.accesscontrol.provider.paypal.model.PaypalAccessMethod; import org.olat.shibboleth.manager.ShibbolethAutoAccessMethod; -import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -72,24 +65,12 @@ import org.springframework.stereotype.Service; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ @Service -public class ACMethodDAO implements InitializingBean { +public class ACMethodDAO { private static final OLog log = Tracing.createLoggerFor(ACMethodDAO.class); @Autowired private DB dbInstance; - @Autowired - private AccessControlModule acModule; - - @Override - public void afterPropertiesSet() throws Exception { - enableMethod(TokenAccessMethod.class, acModule.isTokenEnabled()); - enableMethod(FreeAccessMethod.class, acModule.isFreeEnabled()); - enableMethod(PaypalAccessMethod.class, acModule.isPaypalEnabled()); - enableAutoMethods(acModule.isAutoEnabled()); - dbInstance.commitAndCloseSession(); - } - public void enableAutoMethods(boolean autoEnabled) { enableMethod(ShibbolethAutoAccessMethod.class, autoEnabled); @@ -108,7 +89,7 @@ public class ACMethodDAO implements InitializingBean { Date now = new Date(); ((AbstractAccessMethod)method).setCreationDate(now); ((AbstractAccessMethod)method).setLastModified(now); - dbInstance.saveObject(method); + dbInstance.getCurrentEntityManager().persist(method); } catch (InstantiationException e) { log.error("Failed to instantiate an access method", e); } catch (IllegalAccessException e) { @@ -119,7 +100,7 @@ public class ACMethodDAO implements InitializingBean { if(method.isEnabled() != enable) { ((AbstractAccessMethod)method).setEnabled(enable); ((AbstractAccessMethod)method).setLastModified(new Date()); - dbInstance.updateObject(method); + dbInstance.getCurrentEntityManager().merge(method); } } } @@ -162,26 +143,14 @@ public class ACMethodDAO implements InitializingBean { .getResultList(); } - public List<AccessMethod> getAvailableMethods(Identity identity, Roles roles) { + public List<AccessMethod> getAvailableMethods() { StringBuilder sb = new StringBuilder(); sb.append("select method from ").append(AbstractAccessMethod.class.getName()).append(" method") .append(" where method.valid=true and method.enabled=true"); - TypedQuery<AccessMethod> query = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), AccessMethod.class); - if(identity != null) { - //query.setLong("identityKey", identity.getKey()); - } - - List<AccessMethod> methods = query.getResultList(); - List<AccessMethod> allowedMethods = new ArrayList<AccessMethod>(); - for(AccessMethod method:methods) { - AccessMethodHandler handler = acModule.getAccessMethodHandler(method.getType()); - AccessMethodSecurityCallback secCallback = handler.getSecurityCallback(identity, roles); - if(secCallback.canUse()) { - allowedMethods.add(method); - } - } - return allowedMethods; + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), AccessMethod.class) + .getResultList(); } public List<AccessMethod> getAvailableMethodsByType(Class<? extends AccessMethod> type) { @@ -346,7 +315,7 @@ public class ACMethodDAO implements InitializingBean { access.setValid(false); if(link.getKey() == null) return; - dbInstance.updateObject(access); + dbInstance.getCurrentEntityManager().merge(access); } /** @@ -363,13 +332,13 @@ public class ACMethodDAO implements InitializingBean { TokenAccessMethod method = new TokenAccessMethod(); method.setCreationDate(new Date()); method.setLastModified(method.getCreationDate()); - dbInstance.saveObject(method); + dbInstance.getCurrentEntityManager().persist(method); } else { for(AccessMethod method:methods) { if(method.isEnabled() != enable) { ((AbstractAccessMethod)method).setEnabled(enable); ((AbstractAccessMethod)method).setLastModified(new Date()); - dbInstance.updateObject(method); + dbInstance.getCurrentEntityManager().merge(method); } } } @@ -386,13 +355,13 @@ public class ACMethodDAO implements InitializingBean { FreeAccessMethod method = new FreeAccessMethod(); method.setCreationDate(new Date()); method.setLastModified(method.getCreationDate()); - dbInstance.saveObject(method); + dbInstance.getCurrentEntityManager().persist(method); } else { for(AccessMethod method:methods) { if(method.isEnabled() != enable) { ((AbstractAccessMethod)method).setEnabled(enable); ((AbstractAccessMethod)method).setLastModified(new Date()); - dbInstance.updateObject(method); + dbInstance.getCurrentEntityManager().merge(method); } } } diff --git a/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java b/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java index 89bc082f964d5444bd5a380980357fd4b41f029b..764d236a5fc2df145ac7c02bc78491e78c2cbe39 100644 --- a/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java +++ b/src/test/java/org/olat/resource/accesscontrol/ACFrontendManagerTest.java @@ -24,7 +24,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.UUID; import org.junit.Assert; @@ -34,6 +36,7 @@ import org.olat.basesecurity.GroupRoles; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.Roles; import org.olat.core.util.CodeHelper; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; @@ -361,6 +364,34 @@ public class ACFrontendManagerTest extends OlatTestCase { dbInstance.commit(); CodeHelper.printNanoTime(start, "One click"); } + + @Test + public void testStandardMethods() { + Identity ident = JunitTestHelper.createAndPersistIdentityAsRndUser("ac-method-mgr"); + + Roles roles = new Roles(false, false, false, true, false, false, false); + List<AccessMethod> methods = acService.getAvailableMethods(ident, roles); + assertNotNull(methods); + assertTrue(methods.size() >= 2); + + Set<String> duplicateTypes = new HashSet<>(); + + boolean foundFree = false; + boolean foundToken = false; + for(AccessMethod method:methods) { + Assert.assertFalse(duplicateTypes.contains(method.getType())); + if(method instanceof FreeAccessMethod) { + foundFree = true; + } else if(method instanceof TokenAccessMethod) { + foundToken = true; + } + assertTrue(method.isEnabled()); + assertTrue(method.isValid()); + duplicateTypes.add(method.getType()); + } + assertTrue(foundFree); + assertTrue(foundToken); + } private RepositoryEntry createRepositoryEntry() { //create a repository entry diff --git a/src/test/java/org/olat/resource/accesscontrol/ACMethodManagerTest.java b/src/test/java/org/olat/resource/accesscontrol/ACMethodManagerTest.java index ad635fa556fa1ee8f8e6542cacb160306f9223de..b64f1fe52193c3f5ade33bab00a32b901c80dc2f 100644 --- a/src/test/java/org/olat/resource/accesscontrol/ACMethodManagerTest.java +++ b/src/test/java/org/olat/resource/accesscontrol/ACMethodManagerTest.java @@ -35,9 +35,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.olat.core.commons.persistence.DB; -import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; -import org.olat.core.id.Roles; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; import org.olat.resource.accesscontrol.manager.ACMethodDAO; @@ -46,7 +44,6 @@ import org.olat.resource.accesscontrol.model.AccessMethod; import org.olat.resource.accesscontrol.model.FreeAccessMethod; import org.olat.resource.accesscontrol.model.TokenAccessMethod; import org.olat.shibboleth.manager.ShibbolethAutoAccessMethod; -import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.springframework.beans.factory.annotation.Autowired; @@ -61,9 +58,6 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class ACMethodManagerTest extends OlatTestCase { - private static Identity ident1; - private static boolean isInitialized = false; - @Autowired private DB dbInstance; @@ -81,9 +75,6 @@ public class ACMethodManagerTest extends OlatTestCase { @Before public void setUp() { - if(!isInitialized) { - ident1 = JunitTestHelper.createAndPersistIdentityAsRndUser("ac-method-mgr"); - } acMethodManager.enableMethod(ShibbolethAutoAccessMethod.class, true); } @@ -118,8 +109,7 @@ public class ACMethodManagerTest extends OlatTestCase { @Test public void testStandardMethods() { - Roles roles = new Roles(false, false, false, true, false, false, false); - List<AccessMethod> methods = acMethodManager.getAvailableMethods(ident1, roles); + List<AccessMethod> methods = acMethodManager.getAvailableMethods(); assertNotNull(methods); assertTrue(methods.size() >= 2);