Skip to content

Commit

Permalink
SLING-5868 : API to define and retrieve login path with along with au…
Browse files Browse the repository at this point in the history
…thentication requirements (adjust to final version API defined with SLING-5792)
  • Loading branch information
anchela committed Aug 17, 2016
1 parent be7102f commit 5cad189
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.auth.core.spi.BundleAuthenticationRequirement;
import org.apache.sling.commons.osgi.OsgiUtil;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.osgi.framework.BundleContext;
Expand Down Expand Up @@ -88,12 +89,10 @@ public class DefaultRequirementHandler implements RequirementHandler, Constants

@SuppressWarnings("UnusedDeclaration")
@Reference
private AuthenticationRequirement authenticationRequirement;
private BundleAuthenticationRequirement authenticationRequirement;

private ServiceRegistration registration;

private String id;

private String[] supportedPaths;

private Map<String, String> loginPathMapping = new TreeMap<String, String>(Collections.reverseOrder());
Expand All @@ -105,7 +104,6 @@ protected void activate(BundleContext bundleContext, Map<String, Object> propert
supportedPaths = Utils.getValidPaths(PropertiesUtil.toStringArray(properties.get(PARAM_SUPPORTED_PATHS), new String[0]));

registration = bundleContext.registerService(RequirementHandler.class.getName(), this, new Hashtable(properties));
id = getID(registration);
updateRequirements();
}

Expand Down Expand Up @@ -143,21 +141,17 @@ private void unbindResourceResolverFactory(@Nonnull ResourceResolverFactory reso
}

@SuppressWarnings("UnusedDeclaration")
private void bindAuthenticationRequirement(@Nonnull AuthenticationRequirement authenticationRequirement) {
private void bindAuthenticationRequirement(@Nonnull BundleAuthenticationRequirement authenticationRequirement) {
this.authenticationRequirement = authenticationRequirement;
}

@SuppressWarnings("UnusedDeclaration")
private void unbindAuthenticationRequirement(@Nonnull AuthenticationRequirement authenticationRequirement) {
private void unbindAuthenticationRequirement(@Nonnull BundleAuthenticationRequirement authenticationRequirement) {
if (authenticationRequirement == this.authenticationRequirement) {
this.authenticationRequirement = null;
}
}

private static String getID(@Nonnull ServiceRegistration registration) {
return OsgiUtil.toString(registration.getReference().getProperty(org.osgi.framework.Constants.SERVICE_ID), UUID.randomUUID().toString());
}

//-------------------------------------------------< RequirementHandler >---

public void requirementAdded(@Nonnull String path, @Nullable String loginPath) {
Expand All @@ -168,7 +162,7 @@ public void requirementAdded(@Nonnull String path, @Nullable String loginPath) {
if (loginPath != null) {
loginPathMapping.put(path, loginPath);
}
authenticationRequirement.appendRequirements(id, buildRequirement(path, loginPath, resourceResolver));
authenticationRequirement.appendRequirements(buildRequirement(path, loginPath, resourceResolver));
} catch (LoginException e) {
log.error("Unable to add authentication requirements: failed to get service resolver.", e.getMessage());
} finally {
Expand All @@ -186,7 +180,7 @@ public void requirementRemoved(@Nonnull String path, @Nullable String loginPath)
try {
resourceResolver = getServiceResolver();
loginPathMapping.remove(path);
authenticationRequirement.removeRequirements(id, buildRequirement(path, loginPath, resourceResolver));
authenticationRequirement.removeRequirements(buildRequirement(path, loginPath, resourceResolver));
} catch (LoginException e) {
log.error("Unable to remove authentication requirements: failed to get service resolver.", e.getMessage());
} finally {
Expand All @@ -204,7 +198,7 @@ public void loginPathAdded(@Nonnull String path, @Nonnull String loginPath) {
try {
resourceResolver = getServiceResolver();
loginPathMapping.put(path, loginPath);
authenticationRequirement.appendRequirements(id, buildLoginPathRequirement(loginPath, resourceResolver));
authenticationRequirement.appendRequirements(buildLoginPathRequirement(loginPath, resourceResolver));
} catch (LoginException e) {
log.error("Unable to add login path to requirements: failed to get service resolver.", e.getMessage());
} finally {
Expand All @@ -224,8 +218,8 @@ public void loginPathChanged(@Nonnull String path, @Nonnull String loginPathBefo
loginPathMapping.put(path, loginPathAfter);

ServiceReference reference = registration.getReference();
authenticationRequirement.removeRequirements(id, buildLoginPathRequirement(loginPathBefore, resourceResolver));
authenticationRequirement.appendRequirements(id, buildLoginPathRequirement(loginPathAfter, resourceResolver));
authenticationRequirement.removeRequirements(buildLoginPathRequirement(loginPathBefore, resourceResolver));
authenticationRequirement.appendRequirements(buildLoginPathRequirement(loginPathAfter, resourceResolver));
} catch (LoginException e) {
log.error("Unable to update login path in authentication requirements: failed to get service resolver.", e.getMessage());
} finally {
Expand All @@ -242,7 +236,7 @@ public void loginPathRemoved(@Nonnull String path, @Nonnull String loginPath) {
try {
resourceResolver = getServiceResolver();
loginPathMapping.remove(path);
authenticationRequirement.removeRequirements(id, buildLoginPathRequirement(loginPath, resourceResolver));
authenticationRequirement.removeRequirements(buildLoginPathRequirement(loginPath, resourceResolver));
} catch (LoginException e) {
log.error("Unable to remove login path from authentication requirements: failed to get service resolver.", e.getMessage());
} finally {
Expand Down Expand Up @@ -282,7 +276,7 @@ private void updateRequirements() throws LoginException, RepositoryException {
if (supportedPaths.length > 0) {
Map<String, Boolean> requirements = new HashMap<String, Boolean>();
loadAll(loginPathMapping, requirements, Utils.getCommonAncestor(supportedPaths));
authenticationRequirement.setRequirements(id, requirements);
authenticationRequirement.setRequirements(requirements);
}
}

Expand Down Expand Up @@ -317,7 +311,7 @@ private void loadAll(@Nonnull Map<String, String> loginPathMapping, @Nonnull Map

private void clearRequirements() {
loginPathMapping.clear();
authenticationRequirement.clearRequirements(id);
authenticationRequirement.clearRequirements();
}

private static Map<String, Boolean> buildRequirement(@Nonnull String path, @Nullable String loginPath,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.auth.core.spi.BundleAuthenticationRequirement;
import org.apache.sling.testing.mock.osgi.MockOsgi;
import org.apache.sling.testing.resourceresolver.MockResource;
import org.junit.Before;
Expand Down Expand Up @@ -65,7 +66,7 @@ public class DefaultRequirementHandlerTest extends RequirementBaseTest {
public void before() throws Exception {
super.before();

context.registerService(AuthenticationRequirement.class, authenticationRequirement);
context.registerService(BundleAuthenticationRequirement.class, authenticationRequirement);
context.registerService(ResourceResolverFactory.class, resourceResolverFactory);

Map<String, Object> properties = ImmutableMap.<String, Object>of(DefaultRequirementHandler.PARAM_SUPPORTED_PATHS, SUPPORTED_PATHS);
Expand Down Expand Up @@ -331,28 +332,28 @@ public void deactivate() {
assertAuthReq(new AuthReq("clearRequirements", ImmutableMap.<String, Boolean>of()));
}

private static final class TestAuthRequirement implements AuthenticationRequirement {
private static final class TestAuthRequirement implements BundleAuthenticationRequirement {

private List<AuthReq> calls = new ArrayList<AuthReq>();

@Override
public void setRequirements(@Nonnull String id, @Nonnull Map<String, Boolean> requirements) {
public void setRequirements(@Nonnull Map<String, Boolean> requirements) {
calls.add(new AuthReq("setRequirements", requirements));

}

@Override
public void appendRequirements(@Nonnull String id, @Nonnull Map<String, Boolean> requirements) {
public void appendRequirements(@Nonnull Map<String, Boolean> requirements) {
calls.add(new AuthReq("appendRequirements", requirements));
}

@Override
public void removeRequirements(@Nonnull String id, @Nonnull Map<String, Boolean> requirements) {
public void removeRequirements(@Nonnull Map<String, Boolean> requirements) {
calls.add(new AuthReq("removeRequirements", requirements));
}

@Override
public void clearRequirements(@Nonnull String id) {
public void clearRequirements() {
calls.add(new AuthReq("clearRequirements", ImmutableMap.<String, Boolean>of()));
}
}
Expand Down

0 comments on commit 5cad189

Please sign in to comment.