This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-resource.git
The following commit(s) were added to refs/heads/master by this push:
new 882a538 SLING-7805 - NPE in Oak SessionImpl when starting up
882a538 is described below
commit 882a53869c4918828c5cbd5aa5776340a950efde
Author: Robert Munteanu <[email protected]>
AuthorDate: Wed Aug 8 15:15:04 2018 +0300
SLING-7805 - NPE in Oak SessionImpl when starting up
This reverts commit 335d0aec54d8674b275b51286a18fff92e0eaccc, reversing
changes made to bf18d14584cacbadcaec443821433e78669a43a6.
It also reverts commits 5a36b33e05b1b05827993ad09bd4e389674cd8a1 and
dde168f8e1c205a04a972b8b1997c002b41055d3.
---
pom.xml | 3 +-
.../helper/jcr/JcrProviderStateFactory.java | 37 ++--
.../JcrResourceProviderSessionHandlingTest.java | 199 ---------------------
.../helper/jcr/JcrResourceProviderTest.java | 29 ++-
4 files changed, 35 insertions(+), 233 deletions(-)
diff --git a/pom.xml b/pom.xml
index b1059c9..1d18f59 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,7 +54,6 @@
<plugin>
<groupId>org.apache.sling</groupId>
<artifactId>maven-sling-plugin</artifactId>
- <version>2.3.2</version>
<executions>
<execution>
<id>generate-adapter-metadata</id>
@@ -177,7 +176,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.api</artifactId>
- <version>2.18.2</version>
+ <version>2.16.4</version>
<scope>provided</scope>
</dependency>
<dependency>
diff --git
a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
index 2f43526..8767fa9 100644
---
a/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
+++
b/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrProviderStateFactory.java
@@ -145,12 +145,7 @@ public class JcrProviderStateFactory {
@Nonnull final Map<String, Object> authenticationInfo,
@Nullable final BundleContext ctx
) throws LoginException {
- boolean explicitSessionUsed = (getSession(authenticationInfo) != null);
- final Session impersonatedSession = handleImpersonation(session,
authenticationInfo, logoutSession, explicitSessionUsed);
- if (impersonatedSession != session && explicitSessionUsed) {
- // update the session in the auth info map in case the resolver
gets cloned in the future
-
authenticationInfo.put(JcrResourceConstants.AUTHENTICATION_INFO_SESSION,
impersonatedSession);
- }
+ final Session impersonatedSession = handleImpersonation(session,
authenticationInfo, logoutSession);
// if we're actually impersonating, we're responsible for closing the
session we've created, regardless
// of what the original logoutSession value was.
boolean doLogoutSession = logoutSession || (impersonatedSession !=
session);
@@ -172,35 +167,25 @@ public class JcrProviderStateFactory {
* @param logoutSession
* whether to logout the <code>session</code> after
impersonation
* or not.
- * @param explicitSessionUsed
- * whether the JCR session was explicitly given in the auth
info or not.
* @return The original session or impersonated session.
* @throws LoginException
* If something goes wrong.
*/
private static Session handleImpersonation(final Session session, final
Map<String, Object> authenticationInfo,
- final boolean logoutSession, boolean explicitSessionUsed) throws
LoginException {
+ final boolean logoutSession) throws LoginException {
final String sudoUser = getSudoUser(authenticationInfo);
- // Do we need session.impersonate() because we are asked to
impersonate another user?
- boolean needsSudo = (sudoUser != null) &&
!session.getUserID().equals(sudoUser);
- // Do we need session.impersonate() to get an independent copy of the
session we were given in the auth info?
- boolean needsCloning = !needsSudo && explicitSessionUsed &&
authenticationInfo.containsKey(ResourceProvider.AUTH_CLONE);
- try {
- if (needsSudo) {
- SimpleCredentials creds = new SimpleCredentials(sudoUser, new
char[0]);
+ if (sudoUser != null && !session.getUserID().equals(sudoUser)) {
+ try {
+ final SimpleCredentials creds = new
SimpleCredentials(sudoUser, new char[0]);
copyAttributes(creds, authenticationInfo);
creds.setAttribute(ResourceResolver.USER_IMPERSONATOR,
session.getUserID());
return session.impersonate(creds);
- } else if (needsCloning) {
- SimpleCredentials creds = new
SimpleCredentials(session.getUserID(), new char[0]);
- copyAttributes(creds, authenticationInfo);
- return session.impersonate(creds);
- }
- } catch (final RepositoryException re) {
- throw getLoginException(re);
- } finally {
- if (logoutSession) {
- session.logout();
+ } catch (final RepositoryException re) {
+ throw getLoginException(re);
+ } finally {
+ if (logoutSession) {
+ session.logout();
+ }
}
}
return session;
diff --git
a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderSessionHandlingTest.java
b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderSessionHandlingTest.java
deleted file mode 100644
index a471446..0000000
---
a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderSessionHandlingTest.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * 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.sling.jcr.resource.internal.helper.jcr;
-
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-import static org.hamcrest.Matchers.sameInstance;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeThat;
-import static org.junit.Assume.assumeTrue;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Session;
-
-import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.api.resource.ResourceResolverFactory;
-import org.apache.sling.commons.testing.jcr.RepositoryProvider;
-import org.apache.sling.jcr.api.SlingRepository;
-import org.apache.sling.jcr.resource.api.JcrResourceConstants;
-import org.apache.sling.spi.resource.provider.ResolveContext;
-import org.apache.sling.spi.resource.provider.ResourceProvider;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-import org.mockito.Mockito;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.component.ComponentContext;
-
-@RunWith(Parameterized.class)
-public class JcrResourceProviderSessionHandlingTest {
-
- private enum LoginStyle {USER, SESSION};
-
- private static final String AUTH_USER = "admin";
- private static final char[] AUTH_PASSWORD = "admin".toCharArray();
- private static final String SUDO_USER = "anonymous";
-
- @Parameters(name = "loginStyle= {0}, sudo = {1}, clone = {2}")
- public static List<Object[]> data() {
-
- LoginStyle[] loginStyles = LoginStyle.values();
- boolean[] sudoOptions = new boolean[] {false, true};
- boolean[] cloneOptions = new boolean[] {false, true};
-
- // Generate all possible combinations into data.
- List<Object[]> data = new ArrayList<>();
- Object[] dataPoint = new Object[3];
- for (LoginStyle loginStyle : loginStyles) {
- dataPoint[0] = loginStyle;
- for (boolean sudo : sudoOptions) {
- dataPoint[1] = sudo;
- for (boolean clone : cloneOptions) {
- dataPoint[2] = clone;
- data.add(dataPoint.clone());
- }
- }
- }
- return data;
- }
-
- @Parameter(0)
- public LoginStyle loginStyle;
-
- @Parameter(1)
- public boolean useSudo;
-
- @Parameter(2)
- public boolean doClone;
-
- // Session we're using when loginStyle == SESSION, null otherwise.
- private Session explicitSession;
-
- private JcrResourceProvider jcrResourceProvider;
- private JcrProviderState jcrProviderState;
-
- @Before
- public void setUp() throws Exception {
- SlingRepository repo = RepositoryProvider.instance().getRepository();
- Map<String, Object> authInfo = new HashMap<>();
- switch (loginStyle) {
- case USER:
- authInfo.put(ResourceResolverFactory.USER, AUTH_USER);
- authInfo.put(ResourceResolverFactory.PASSWORD, AUTH_PASSWORD);
- break;
- case SESSION:
- explicitSession = repo.loginAdministrative(null);
- authInfo.put(JcrResourceConstants.AUTHENTICATION_INFO_SESSION,
explicitSession);
- break;
- }
-
- if (useSudo) {
- authInfo.put(ResourceResolverFactory.USER_IMPERSONATION,
SUDO_USER);
- }
-
- if (doClone) {
- authInfo.put(ResourceProvider.AUTH_CLONE, true);
- }
-
- ComponentContext ctx = mock(ComponentContext.class);
- when(ctx.locateService(anyString(),
Mockito.<ServiceReference<Object>>any())).thenReturn(repo);
-
- jcrResourceProvider = new JcrResourceProvider();
- jcrResourceProvider.activate(ctx);
-
- jcrProviderState = jcrResourceProvider.authenticate(authInfo);
- }
-
- @After
- public void tearDown() throws Exception {
-
- // Some tests do a logout, so check for liveness before trying to log
out.
- if (jcrProviderState.getSession().isLive()) {
- jcrResourceProvider.logout(jcrProviderState);
- }
-
- jcrResourceProvider.deactivate();
-
- if (explicitSession != null) {
- explicitSession.logout();
- }
- }
-
- @Test
- public void sessionUsesCorrectUser() {
- String expectedUser = useSudo ? SUDO_USER : AUTH_USER;
- assertEquals(expectedUser, jcrProviderState.getSession().getUserID());
- }
-
- @Test
- public void explicitSessionNotClosedOnLogout() {
- assumeTrue(loginStyle == LoginStyle.SESSION);
-
- jcrResourceProvider.logout(jcrProviderState);
-
- assertTrue(explicitSession.isLive());
- }
-
- @Test
- public void sessionsDoNotLeak() {
- // This test is only valid if we either didn't pass an explicit
session,
- // or the provider had to clone it. Sessions created by the provider
- // must be closed by the provider, or we have a session leak.
- assumeThat(jcrProviderState.getSession(),
is(not(sameInstance(explicitSession))));
-
- jcrResourceProvider.logout(jcrProviderState);
-
- assertFalse(jcrProviderState.getSession().isLive());
- }
-
- @Test
- public void impersonatorIsReportedCorrectly() {
- assumeTrue(useSudo);
-
- @SuppressWarnings("unchecked")
- ResolveContext<JcrProviderState> mockContext =
mock(ResolveContext.class);
- when(mockContext.getProviderState()).thenReturn(jcrProviderState);
- Object reportedImpersonator =
jcrResourceProvider.getAttribute(mockContext,
ResourceResolver.USER_IMPERSONATOR);
-
- assertEquals(AUTH_USER, reportedImpersonator);
- }
-
- @Test
- public void clonesAreIndependent() {
- assumeTrue(loginStyle == LoginStyle.SESSION && doClone);
-
- assertNotSame(explicitSession, jcrProviderState.getSession());
- }
-
-}
diff --git
a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
index 32c6bfb..aa40162 100644
---
a/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
+++
b/src/test/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderTest.java
@@ -19,11 +19,18 @@
package org.apache.sling.jcr.resource.internal.helper.jcr;
import java.security.Principal;
+import java.util.HashMap;
+import java.util.Map;
import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import javax.naming.NamingException;
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.commons.testing.jcr.RepositoryTestBase;
+import org.apache.sling.jcr.resource.api.JcrResourceConstants;
import org.apache.sling.spi.resource.provider.ResolveContext;
import org.junit.Assert;
import org.mockito.Mockito;
@@ -40,24 +47,34 @@ public class JcrResourceProviderTest extends
RepositoryTestBase {
super.setUp();
// create the session
session = getSession();
- Repository repo = getRepository();
- ComponentContext ctx = Mockito.mock(ComponentContext.class);
- Mockito.when(ctx.locateService(Mockito.anyString(),
Mockito.any(ServiceReference.class))).thenReturn(repo);
- jcrResourceProvider = new JcrResourceProvider();
- jcrResourceProvider.activate(ctx);
}
@Override
protected void tearDown() throws Exception {
- jcrResourceProvider.deactivate();
super.tearDown();
}
public void testAdaptTo_Principal() {
+ jcrResourceProvider = new JcrResourceProvider();
ResolveContext ctx = Mockito.mock(ResolveContext.class);
Mockito.when(ctx.getProviderState()).thenReturn(new
JcrProviderState(session, null, false));
Assert.assertNotNull(jcrResourceProvider.adaptTo(ctx,
Principal.class));
}
+
+ public void testLeakOnSudo() throws LoginException, RepositoryException,
NamingException {
+ Repository repo = getRepository();
+ ComponentContext ctx = Mockito.mock(ComponentContext.class);
+ Mockito.when(ctx.locateService(Mockito.anyString(),
Mockito.any(ServiceReference.class))).thenReturn(repo);
+ jcrResourceProvider = new JcrResourceProvider();
+ jcrResourceProvider.activate(ctx);
+ Map<String, Object> authInfo = new HashMap<String, Object>();
+ authInfo.put(JcrResourceConstants.AUTHENTICATION_INFO_SESSION,
session);
+ authInfo.put(ResourceResolverFactory.USER_IMPERSONATION, "anonymous");
+ JcrProviderState providerState =
jcrResourceProvider.authenticate(authInfo);
+ Assert.assertNotEquals("Impersonation didn't start new session",
session, providerState.getSession());
+ jcrResourceProvider.logout(providerState);
+ assertFalse("Impersonated session wasn't closed.",
providerState.getSession().isLive());
+ }
}