From 2180ca9a92b84b251d940991a7454f598cc76105 Mon Sep 17 00:00:00 2001 From: gonzalad Date: Fri, 3 Mar 2017 12:51:14 +0100 Subject: [PATCH] CXF-7264: NPE on OAuth RO/CC flows using JPA * UserSubject can already be an OidcUserSubject in database while in current request (when using RO flow) it is a UserSubject. Merging UserSubject produces an error. We fix this by avoiding merge when userSubject already exists in db. * client.subject can be null when using CC flow. --- .../oauth2/provider/JPAOAuthDataProvider.java | 14 +++++++------ .../provider/JPAOAuthDataProviderTest.java | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/JPAOAuthDataProvider.java b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/JPAOAuthDataProvider.java index befd05f9a30..c3b07dd81f9 100644 --- a/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/JPAOAuthDataProvider.java +++ b/rt/rs/security/oauth-parent/oauth2/src/main/java/org/apache/cxf/rs/security/oauth2/provider/JPAOAuthDataProvider.java @@ -263,12 +263,14 @@ public Void execute(EntityManager em) { } serverToken.setScopes(perms); - UserSubject sub = em.find(UserSubject.class, serverToken.getSubject().getLogin()); - if (sub == null) { - em.persist(serverToken.getSubject()); - } else { - sub = em.merge(serverToken.getSubject()); - serverToken.setSubject(sub); + if (serverToken.getSubject() != null) { + UserSubject sub = em.find(UserSubject.class, serverToken.getSubject().getLogin()); + if (sub == null) { + em.persist(serverToken.getSubject()); + } else { + sub = serverToken.getSubject(); + serverToken.setSubject(sub); + } } // ensure we have a managed association // (needed for OpenJPA : InvalidStateException: Encountered unmanaged object) diff --git a/rt/rs/security/oauth-parent/oauth2/src/test/java/org/apache/cxf/rs/security/oauth2/provider/JPAOAuthDataProviderTest.java b/rt/rs/security/oauth-parent/oauth2/src/test/java/org/apache/cxf/rs/security/oauth2/provider/JPAOAuthDataProviderTest.java index e42f2b9da87..25da9e26b91 100644 --- a/rt/rs/security/oauth-parent/oauth2/src/test/java/org/apache/cxf/rs/security/oauth2/provider/JPAOAuthDataProviderTest.java +++ b/rt/rs/security/oauth-parent/oauth2/src/test/java/org/apache/cxf/rs/security/oauth2/provider/JPAOAuthDataProviderTest.java @@ -176,6 +176,27 @@ public void testAddGetDeleteAccessToken2() { assertEquals(0, tokens.size()); } + @Test + public void testAddGetDeleteAccessTokenWithNullSubject() { + Client c = addClient("102", "bob"); + + AccessTokenRegistration atr = new AccessTokenRegistration(); + atr.setClient(c); + atr.setApprovedScope(Collections.singletonList("a")); + atr.setSubject(null); + + getProvider().createAccessToken(atr); + List tokens = getProvider().getAccessTokens(c, null); + assertNotNull(tokens); + assertEquals(1, tokens.size()); + + getProvider().removeClient(c.getClientId()); + + tokens = getProvider().getAccessTokens(c, null); + assertNotNull(tokens); + assertEquals(0, tokens.size()); + } + @Test public void testAddGetDeleteRefreshToken() { Client c = addClient("101", "bob");