Author: tripod
Date: Tue Feb 11 05:43:23 2014
New Revision: 1566986
URL: http://svn.apache.org/r1566986
Log:
OAK-1412 Make Whiteboard available to LoginModules via Callback
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/callback/WhiteboardCallback.java
Modified:
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/AuthenticationConfigurationImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/CallbackHandlerImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/LoginContextProviderImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java
Modified:
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java?rev=1566986&r1=1566985&r2=1566986&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
(original)
+++
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
Tue Feb 11 05:43:23 2014
@@ -111,7 +111,11 @@ public class ExternalLoginModule extends
options = ConfigurationParameters.of(osgiConfig, options);
}
- Whiteboard whiteboard =
getSecurityProvider().getConfiguration(Whiteboard.class);
+ Whiteboard whiteboard = getWhiteboard();
+ if (whiteboard == null) {
+ log.error("External login module needs whiteboard. Will not be
used for login.");
+ return;
+ }
String idpName = options.getConfigValue(PARAM_IDP_NAME, "");
if (idpName.length() == 0) {
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java?rev=1566986&r1=1566985&r2=1566986&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java
Tue Feb 11 05:43:23 2014
@@ -192,8 +192,6 @@ public class SecurityProviderImpl implem
return (T) privilegeConfiguration;
} else if (TokenConfiguration.class == configClass) {
return (T) tokenConfiguration;
- } else if (Whiteboard.class == configClass) {
- return (T) whiteboard;
} else {
throw new IllegalArgumentException("Unsupported security
configuration class " + configClass);
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/AuthenticationConfigurationImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/AuthenticationConfigurationImpl.java?rev=1566986&r1=1566985&r2=1566986&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/AuthenticationConfigurationImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/AuthenticationConfigurationImpl.java
Tue Feb 11 05:43:23 2014
@@ -28,6 +28,8 @@ import org.apache.jackrabbit.oak.spi.sec
import
org.apache.jackrabbit.oak.spi.security.authentication.AuthenticationConfiguration;
import org.apache.jackrabbit.oak.spi.security.authentication.ConfigurationUtil;
import
org.apache.jackrabbit.oak.spi.security.authentication.LoginContextProvider;
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,16 +45,23 @@ import org.slf4j.LoggerFactory;
* </ul>
*
*/
-@Component()
+@Component
@Service({AuthenticationConfiguration.class, SecurityConfiguration.class})
public class AuthenticationConfigurationImpl extends ConfigurationBase
implements AuthenticationConfiguration {
private static final Logger log =
LoggerFactory.getLogger(AuthenticationConfigurationImpl.class);
+ /**
+ * Constructor for OSGi
+ */
public AuthenticationConfigurationImpl() {
super();
}
+ /**
+ * Constructor for non-OSGi
+ * @param securityProvider
+ */
public AuthenticationConfigurationImpl(SecurityProvider securityProvider) {
super(securityProvider);
}
@@ -107,6 +116,14 @@ public class AuthenticationConfiguration
log.debug("No login configuration available for {}; using
default", appName);
loginConfig =
ConfigurationUtil.getDefaultConfiguration(getParameters());
}
- return new LoginContextProviderImpl(appName, loginConfig,
contentRepository, getSecurityProvider());
+ // todo: temporary workaround
+ SecurityProvider provider = getSecurityProvider();
+ Whiteboard whiteboard = null;
+ if (provider instanceof WhiteboardAware) {
+ whiteboard = ((WhiteboardAware) provider).getWhiteboard();
+ } else {
+ log.warn("Unable to obtain whiteboard from SecurityProvider");
+ }
+ return new LoginContextProviderImpl(appName, loginConfig,
contentRepository, getSecurityProvider(), whiteboard);
}
}
\ No newline at end of file
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/CallbackHandlerImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/CallbackHandlerImpl.java?rev=1566986&r1=1566985&r2=1566986&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/CallbackHandlerImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/CallbackHandlerImpl.java
Tue Feb 11 05:43:23 2014
@@ -29,6 +29,8 @@ import org.apache.jackrabbit.oak.api.Con
import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
import
org.apache.jackrabbit.oak.spi.security.authentication.callback.CredentialsCallback;
import
org.apache.jackrabbit.oak.spi.security.authentication.callback.RepositoryCallback;
+import
org.apache.jackrabbit.oak.spi.security.authentication.callback.WhiteboardCallback;
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
/**
* Default implementation of the {@link CallbackHandler} interface. It
currently
@@ -47,14 +49,17 @@ class CallbackHandlerImpl implements Cal
private final String workspaceName;
private final ContentRepository contentRepository;
private final SecurityProvider securityProvider;
+ private final Whiteboard whiteboard;
CallbackHandlerImpl(Credentials credentials, String workspaceName,
ContentRepository contentRepository,
- SecurityProvider securityProvider) {
+ SecurityProvider securityProvider,
+ Whiteboard whiteboard) {
this.credentials = credentials;
this.workspaceName = workspaceName;
this.contentRepository = contentRepository;
this.securityProvider = securityProvider;
+ this.whiteboard = whiteboard;
}
//----------------------------------------------------< CallbackHandler
>---
@@ -72,6 +77,8 @@ class CallbackHandlerImpl implements Cal
repositoryCallback.setContentRepository(contentRepository);
repositoryCallback.setSecurityProvider(securityProvider);
repositoryCallback.setWorkspaceName(workspaceName);
+ } else if (callback instanceof WhiteboardCallback) {
+ ((WhiteboardCallback) callback).setWhiteboard(whiteboard);
} else {
throw new UnsupportedCallbackException(callback);
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/LoginContextProviderImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/LoginContextProviderImpl.java?rev=1566986&r1=1566985&r2=1566986&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/LoginContextProviderImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/LoginContextProviderImpl.java
Tue Feb 11 05:43:23 2014
@@ -31,6 +31,7 @@ import org.apache.jackrabbit.oak.spi.sec
import org.apache.jackrabbit.oak.spi.security.authentication.LoginContext;
import
org.apache.jackrabbit.oak.spi.security.authentication.LoginContextProvider;
import org.apache.jackrabbit.oak.spi.security.authentication.PreAuthContext;
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -45,14 +46,17 @@ class LoginContextProviderImpl implement
private final Configuration configuration;
private final ContentRepository contentRepository;
private final SecurityProvider securityProvider;
+ private final Whiteboard whiteboard;
LoginContextProviderImpl(String appName, Configuration configuration,
ContentRepository contentRepository,
- SecurityProvider securityProvider) {
+ SecurityProvider securityProvider,
+ Whiteboard whiteboard) {
this.appName = appName;
this.configuration = configuration;
this.contentRepository = contentRepository;
this.securityProvider = securityProvider;
+ this.whiteboard = whiteboard;
}
@Override
@@ -86,6 +90,6 @@ class LoginContextProviderImpl implement
@Nonnull
private CallbackHandler getCallbackHandler(Credentials credentials, String
workspaceName) {
- return new CallbackHandlerImpl(credentials, workspaceName,
contentRepository, securityProvider);
+ return new CallbackHandlerImpl(credentials, workspaceName,
contentRepository, securityProvider, whiteboard);
}
}
\ No newline at end of file
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java?rev=1566986&r1=1566985&r2=1566986&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java
Tue Feb 11 05:43:23 2014
@@ -46,9 +46,11 @@ import org.apache.jackrabbit.oak.spi.sec
import
org.apache.jackrabbit.oak.spi.security.authentication.callback.PrincipalProviderCallback;
import
org.apache.jackrabbit.oak.spi.security.authentication.callback.RepositoryCallback;
import
org.apache.jackrabbit.oak.spi.security.authentication.callback.UserManagerCallback;
+import
org.apache.jackrabbit.oak.spi.security.authentication.callback.WhiteboardCallback;
import org.apache.jackrabbit.oak.spi.security.principal.PrincipalConfiguration;
import org.apache.jackrabbit.oak.spi.security.principal.PrincipalProvider;
import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -168,6 +170,8 @@ public abstract class AbstractLoginModul
private SecurityProvider securityProvider;
+ private Whiteboard whiteboard;
+
private ContentSession systemSession;
private Root root;
@@ -323,16 +327,37 @@ public abstract class AbstractLoginModul
try {
callbackHandler.handle(new Callback[]{rcb});
securityProvider = rcb.getSecurityProvider();
- } catch (UnsupportedCallbackException e) {
- log.debug(e.getMessage());
- } catch (IOException e) {
- log.debug(e.getMessage());
+ } catch (Exception e) {
+ log.debug("Unable to retrieve the SecurityProvider via
callback", e);
}
}
return securityProvider;
}
/**
+ * Tries to obtain the {@code Whiteboard} object from the callback
+ * handler using a new WhiteboardCallback and keeps the value as
+ * private field. If the callback handler isn't able to handle the
+ * WhiteboardCallback this method returns {@code null}.
+ *
+ * @return The {@code Whiteboard} associated with this
+ * {@code LoginModule} or {@code null}.
+ */
+ @CheckForNull
+ protected Whiteboard getWhiteboard() {
+ if (whiteboard == null && callbackHandler != null) {
+ WhiteboardCallback cb = new WhiteboardCallback();
+ try {
+ callbackHandler.handle(new Callback[]{cb});
+ whiteboard = cb.getWhiteboard();
+ } catch (Exception e) {
+ log.debug("Unable to retrieve the Whiteboard via callback", e);
+ }
+ }
+ return whiteboard;
+ }
+
+ /**
* Tries to obtain a {@code Root} object from the callback handler using
* a new RepositoryCallback and keeps the value as private field.
* If the callback handler isn't able to handle the RepositoryCallback
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/callback/WhiteboardCallback.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/callback/WhiteboardCallback.java?rev=1566986&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/callback/WhiteboardCallback.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/callback/WhiteboardCallback.java
Tue Feb 11 05:43:23 2014
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.spi.security.authentication.callback;
+
+import javax.security.auth.callback.Callback;
+
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+
+/**
+ * Callback implementation to set and retrieve the {@link
org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard}.
+ */
+public class WhiteboardCallback implements Callback {
+
+ private Whiteboard whiteboard;
+
+ /**
+ * Returns the whiteboard as set using
+ * {@link #setWhiteboard(Whiteboard)}
+ * or {@code null}.
+ *
+ * @return an instance of {@code Whiteboard} or {@code null} if no
+ * provider has been set before.
+ */
+ public Whiteboard getWhiteboard() {
+ return whiteboard;
+ }
+
+ /**
+ * Sets the {@code Whiteboard} that is being used during the
+ * authentication process.
+ *
+ * @param whiteboard The {@code Whiteboard} to use during the
+ * authentication process.
+ */
+ public void setWhiteboard(Whiteboard whiteboard) {
+ this.whiteboard = whiteboard;
+ }
+}
\ No newline at end of file