keycloak-aplcache

Merge pull request #4740 from pedroigor/KEYCLOAK-5909 [KEYCLOAK-5909]

11/24/2017 5:57:50 PM

Details

diff --git a/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java b/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
index df7a69c..e2d97ec 100755
--- a/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
+++ b/server-spi-private/src/main/java/org/keycloak/models/utils/RepresentationToModel.java
@@ -2285,6 +2285,12 @@ public class RepresentationToModel {
             throw new RuntimeException("No owner specified for resource [" + resource.getName() + "].");
         }
 
+        ClientModel clientModel = authorization.getRealm().getClientById(resourceServer.getId());
+
+        if (ownerId.equals(clientModel.getClientId())) {
+            ownerId = resourceServer.getId();
+        }
+
         if (!resourceServer.getId().equals(ownerId)) {
             RealmModel realm = authorization.getRealm();
             KeycloakSession keycloakSession = authorization.getKeycloakSession();
@@ -2299,7 +2305,7 @@ public class RepresentationToModel {
                 throw new RuntimeException("Owner must be a valid username or user identifier. If the resource server, the client id or null.");
             }
 
-            owner.setId(ownerModel.getId());
+            ownerId = ownerModel.getId();
         }
 
         Resource model = resourceStore.create(resource.getName(), resourceServer, ownerId);
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/authorization/AbstractPhotozAdminTest.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/authorization/AbstractPhotozAdminTest.java
index 7be8fb4..8115596 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/authorization/AbstractPhotozAdminTest.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/authorization/AbstractPhotozAdminTest.java
@@ -37,6 +37,7 @@ import org.keycloak.common.ClientConnection;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.RoleModel;
+import org.keycloak.models.UserModel;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.representations.idm.authorization.PolicyRepresentation;
 import org.keycloak.representations.idm.authorization.ResourceRepresentation;
@@ -57,6 +58,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -72,6 +74,7 @@ public abstract class AbstractPhotozAdminTest extends AbstractAuthorizationTest 
 
     protected Resource albumResource;
     protected Policy anyUserPolicy;
+    protected UserModel aliceUser;
 
     @Before
     public void onBefore() {
@@ -84,6 +87,12 @@ public abstract class AbstractPhotozAdminTest extends AbstractAuthorizationTest 
 
         this.albumResource = createAlbumResource();
         this.anyUserPolicy = createAnyUserPolicy();
+        this.aliceUser = onAuthorizationSession(new Function<AuthorizationProvider, UserModel>() {
+            @Override
+            public UserModel apply(AuthorizationProvider authorizationProvider) {
+                return authorizationProvider.getKeycloakSession().users().getUserByUsername("alice", authorizationProvider.getRealm());
+            }
+        });
     }
 
     protected ResourceServer createResourceServer() {
diff --git a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/authorization/ResourceManagementTest.java b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/authorization/ResourceManagementTest.java
index b9a75a4..ef34cf7 100644
--- a/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/authorization/ResourceManagementTest.java
+++ b/testsuite/integration-deprecated/src/test/java/org/keycloak/testsuite/authorization/ResourceManagementTest.java
@@ -20,6 +20,7 @@ package org.keycloak.testsuite.authorization;
 
 import org.junit.Test;
 import org.keycloak.authorization.model.Resource;
+import org.keycloak.representations.idm.authorization.ResourceOwnerRepresentation;
 import org.keycloak.representations.idm.authorization.ResourceRepresentation;
 
 import javax.ws.rs.client.Entity;
@@ -38,7 +39,7 @@ import static org.junit.Assert.assertNull;
 public class ResourceManagementTest extends AbstractPhotozAdminTest {
 
     @Test
-    public void testCreate() throws Exception {
+    public void testCreateWithoutOwner() throws Exception {
         ResourceRepresentation newResource = new ResourceRepresentation();
 
         newResource.setName("New Resource");
@@ -52,17 +53,88 @@ public class ResourceManagementTest extends AbstractPhotozAdminTest {
 
         ResourceRepresentation resource = response.readEntity(ResourceRepresentation.class);
 
-        onAuthorizationSession(authorizationProvider -> {
-            Resource resourceModel = authorizationProvider.getStoreFactory().getResourceStore().findById(resource.getId(), resourceServer.getId());
+        response = newResourceRequest(resource.getId()).get();
 
-            assertNotNull(resourceModel);
-            assertEquals(resource.getId(), resourceModel.getId());
-            assertEquals("New Resource", resourceModel.getName());
-            assertEquals("Resource Type", resourceModel.getType());
-            assertEquals("Resource Icon URI", resourceModel.getIconUri());
-            assertEquals("Resource URI", resourceModel.getUri());
-            assertEquals(resourceServer.getId(), resourceModel.getResourceServer().getId());
-        });
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+
+        resource = response.readEntity(ResourceRepresentation.class);
+
+        assertEquals("New Resource", resource.getName());
+        assertEquals("Resource Type", resource.getType());
+        assertEquals("Resource Icon URI", resource.getIconUri());
+        assertEquals("Resource URI", resource.getUri());
+        assertEquals(resourceServer.getId(), resource.getOwner().getId());
+        assertEquals("photoz-restful-api", resource.getOwner().getName());
+    }
+
+    @Test
+    public void testCreateWithOwnerUser() throws Exception {
+        ResourceRepresentation newResource = new ResourceRepresentation();
+
+        newResource.setName("New Resource");
+        newResource.setType("Resource Type");
+        newResource.setIconUri("Resource Icon URI");
+        newResource.setUri("Resource URI");
+
+        ResourceOwnerRepresentation owner = new ResourceOwnerRepresentation();
+
+        owner.setId("alice");
+
+        newResource.setOwner(owner);
+
+        Response response = newResourceRequest().post(Entity.entity(newResource, MediaType.APPLICATION_JSON_TYPE));
+
+        assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
+
+        ResourceRepresentation resource = response.readEntity(ResourceRepresentation.class);
+
+        response = newResourceRequest(resource.getId()).get();
+
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+
+        resource = response.readEntity(ResourceRepresentation.class);
+
+        assertEquals("New Resource", resource.getName());
+        assertEquals("Resource Type", resource.getType());
+        assertEquals("Resource Icon URI", resource.getIconUri());
+        assertEquals("Resource URI", resource.getUri());
+        assertEquals(aliceUser.getId(), resource.getOwner().getId());
+        assertEquals(aliceUser.getUsername(), resource.getOwner().getName());
+    }
+
+    @Test
+    public void testCreateWithOwnerResourceServer() throws Exception {
+        ResourceRepresentation newResource = new ResourceRepresentation();
+
+        newResource.setName("New Resource");
+        newResource.setType("Resource Type");
+        newResource.setIconUri("Resource Icon URI");
+        newResource.setUri("Resource URI");
+
+        ResourceOwnerRepresentation owner = new ResourceOwnerRepresentation();
+
+        owner.setId("photoz-restful-api");
+
+        newResource.setOwner(owner);
+
+        Response response = newResourceRequest().post(Entity.entity(newResource, MediaType.APPLICATION_JSON_TYPE));
+
+        assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
+
+        ResourceRepresentation resource = response.readEntity(ResourceRepresentation.class);
+
+        response = newResourceRequest(resource.getId()).get();
+
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+
+        resource = response.readEntity(ResourceRepresentation.class);
+
+        assertEquals("New Resource", resource.getName());
+        assertEquals("Resource Type", resource.getType());
+        assertEquals("Resource Icon URI", resource.getIconUri());
+        assertEquals("Resource URI", resource.getUri());
+        assertEquals(resourceServer.getId(), resource.getOwner().getId());
+        assertEquals("photoz-restful-api", resource.getOwner().getName());
     }
 
     @Test
@@ -109,6 +181,12 @@ public class ResourceManagementTest extends AbstractPhotozAdminTest {
         newResource.setIconUri("Resource Icon URI");
         newResource.setUri("Resource URI");
 
+        ResourceOwnerRepresentation owner = new ResourceOwnerRepresentation();
+
+        owner.setId("alice");
+
+        newResource.setOwner(owner);
+
         Response response = newResourceRequest().post(Entity.entity(newResource, MediaType.APPLICATION_JSON_TYPE));
 
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());