();
+ for (UserRepresentation userRep : rep.getUsers()) userReps.put(userRep.getUsername(), userRep);
+
+ // override enabled to false if user does not have at least all of browser or client credentials
+ for (UserRepresentation userRep : rep.getUsers())
+ {
+ if (userRep.getCredentials() == null)
+ {
+ userRep.setEnabled(false);
+ }
+ else
+ {
+ boolean hasBrowserCredentials = true;
+ for (RequiredCredentialRepresentation credential : rep.getRequiredCredentials())
+ {
+ boolean hasCredential = false;
+ for (UserRepresentation.Credential cred : userRep.getCredentials())
+ {
+ if (cred.getType().equals(credential.getType()))
+ {
+ hasCredential = true;
+ break;
+ }
+ }
+ if (!hasCredential)
+ {
+ hasBrowserCredentials = false;
+ break;
+ }
+ }
+ if (!hasBrowserCredentials)
+ {
+ userRep.setEnabled(false);
+ }
+
+ }
+ }
+
+ if (rep.getResources() != null)
+ {
+ // check mappings
+ for (ResourceRepresentation resourceRep : rep.getResources())
+ {
+ if (resourceRep.getRoleMappings() != null)
+ {
+ for (RoleMappingRepresentation mapping : resourceRep.getRoleMappings())
+ {
+ if (!userReps.containsKey(mapping.getUsername()))
+ {
+ throw new WebApplicationException(Response.status(Response.Status.BAD_REQUEST)
+ .entity("No users declared for role mapping").type("text/plain").build());
+
+ }
+ }
+ }
+ }
+ }
+ }
+
+}
diff --git a/services/src/main/java/org/keycloak/services/service/RealmResource.java b/services/src/main/java/org/keycloak/services/resources/RealmResource.java
similarity index 57%
rename from services/src/main/java/org/keycloak/services/service/RealmResource.java
rename to services/src/main/java/org/keycloak/services/resources/RealmResource.java
index a5baf404fcc..a2ec89a3cae 100755
--- a/services/src/main/java/org/keycloak/services/service/RealmResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/RealmResource.java
@@ -1,48 +1,42 @@
-package org.keycloak.services.service;
+package org.keycloak.services.resources;
-import org.keycloak.services.IdentityManagerAdapter;
-import org.keycloak.services.model.data.RealmModel;
+import org.keycloak.services.models.RealmManager;
import org.jboss.resteasy.logging.Logger;
import org.keycloak.representations.idm.PublishedRealmRepresentation;
+import org.keycloak.services.models.RealmModel;
import javax.ws.rs.GET;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
-import javax.ws.rs.core.GenericEntity;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
-import java.util.ArrayList;
-import java.util.List;
/**
* @author Bill Burke
* @version $Revision: 1 $
*/
-@Path("/")
+@Path("/realms")
public class RealmResource
{
protected Logger logger = Logger.getLogger(RealmResource.class);
- protected IdentityManagerAdapter identityManager;
+ protected RealmManager adapter;
@Context
protected UriInfo uriInfo;
- public RealmResource(IdentityManagerAdapter identityManager)
+ public RealmResource(RealmManager adapter)
{
- this.identityManager = identityManager;
+ this.adapter = adapter;
}
@GET
- @Path("realms/{realm}")
+ @Path("{realm}")
@Produces("application/json")
public PublishedRealmRepresentation getRealm(@PathParam("realm") String id)
{
- RealmModel realm = identityManager.getRealm(id);
+ RealmModel realm = adapter.getRealm(id);
if (realm == null)
{
logger.debug("realm not found");
@@ -52,11 +46,11 @@ public class RealmResource
}
@GET
- @Path("realms/{realm}.html")
+ @Path("{realm}.html")
@Produces("text/html")
public String getRealmHtml(@PathParam("realm") String id)
{
- RealmModel realm = identityManager.getRealm(id);
+ RealmModel realm = adapter.getRealm(id);
if (realm == null)
{
logger.debug("realm not found");
@@ -82,10 +76,15 @@ public class RealmResource
grant.path(TokenService.class).path(TokenService.class, "accessTokenGrant");
String grantUrl = grant.build(realm.getId()).toString();
+ UriBuilder idGrant = uriInfo.getBaseUriBuilder();
+ grant.path(TokenService.class).path(TokenService.class, "identityTokenGrant");
+ String idGrantUrl = idGrant.build(realm.getId()).toString();
+
html.append("Realm: ").append(realm.getName()).append("
");
html.append("auth: ").append(authUri).append("
");
html.append("code: ").append(codeUri).append("
");
html.append("grant: ").append(grantUrl).append("
");
+ html.append("identity grant: ").append(idGrantUrl).append("
");
html.append("public key: ").append(realm.getPublicKeyPem()).append("
");
html.append("");
@@ -93,46 +92,6 @@ public class RealmResource
}
- @GET
- @Path("realms")
- @Produces("application/json")
- public Response getRealmsByName(@QueryParam("name") String name)
- {
- if (name == null) return Response.noContent().build();
- List realms = identityManager.getRealmsByName(name);
- if (realms.size() == 0) return Response.noContent().build();
-
- List list = new ArrayList();
- for (RealmModel realm : realms)
- {
- list.add(realmRep(realm, uriInfo));
- }
- GenericEntity> entity = new GenericEntity>(list){};
- return Response.ok(entity).type(MediaType.APPLICATION_JSON_TYPE).build();
- }
-
- @GET
- @Path("realms.html")
- @Produces("text/html")
- public String getRealmsByNameHtml(@QueryParam("name") String name)
- {
- if (name == null) return "No realms with that name
";
- List realms = identityManager.getRealmsByName(name);
- if (realms.size() == 0) return "No realms with that name
";
- if (realms.size() == 1) return realmHtml(realms.get(0));
-
- StringBuffer html = new StringBuffer();
- html.append("Realms
");
- for (RealmModel realm : realms)
- {
- html.append("").append(realm.getId()).append("
");
- }
- html.append("");
- return html.toString();
- }
-
-
public static PublishedRealmRepresentation realmRep(RealmModel realm, UriInfo uriInfo)
{
PublishedRealmRepresentation rep = new PublishedRealmRepresentation();
@@ -153,6 +112,11 @@ public class RealmResource
grant.path(TokenService.class).path(TokenService.class, "accessTokenGrant");
String grantUrl = grant.build(realm.getId()).toString();
rep.setGrantUrl(grantUrl);
+
+ UriBuilder idGrant = uriInfo.getBaseUriBuilder();
+ grant.path(TokenService.class).path(TokenService.class, "identityTokenGrant");
+ String idGrantUrl = idGrant.build(realm.getId()).toString();
+ rep.setIdentityGrantUrl(idGrantUrl);
return rep;
}
}
diff --git a/services/src/main/java/org/keycloak/services/service/RegistrationService.java b/services/src/main/java/org/keycloak/services/resources/RegistrationService.java
similarity index 77%
rename from services/src/main/java/org/keycloak/services/service/RegistrationService.java
rename to services/src/main/java/org/keycloak/services/resources/RegistrationService.java
index e8ff93deb22..c4c9b050156 100755
--- a/services/src/main/java/org/keycloak/services/service/RegistrationService.java
+++ b/services/src/main/java/org/keycloak/services/resources/RegistrationService.java
@@ -1,10 +1,11 @@
-package org.keycloak.services.service;
+package org.keycloak.services.resources;
import org.keycloak.representations.idm.UserRepresentation;
-import org.keycloak.services.model.RealmManager;
-import org.keycloak.services.model.RealmModel;
-import org.keycloak.services.model.UserCredentialModel;
+import org.keycloak.services.models.RealmManager;
+import org.keycloak.services.models.RealmModel;
+import org.keycloak.services.models.UserCredentialModel;
import org.picketlink.idm.model.Realm;
+import org.picketlink.idm.model.Role;
import org.picketlink.idm.model.SimpleUser;
import org.picketlink.idm.model.User;
@@ -24,6 +25,7 @@ import java.net.URI;
@Path("/registrations")
public class RegistrationService
{
+ public static final String REALM_CREATOR_ROLE = "realm-creator";
protected RealmManager adapter;
protected RealmModel defaultRealm;
@@ -57,6 +59,8 @@ public class RegistrationService
credModel.setValue(cred.getValue());
defaultRealm.updateCredential(user, credModel);
}
+ Role realmCreator = defaultRealm.getIdm().getRole(REALM_CREATOR_ROLE);
+ defaultRealm.getIdm().grantRole(user, realmCreator);
URI uri = uriInfo.getBaseUriBuilder().path(RealmFactory.class).path(user.getLoginName()).build();
return Response.created(uri).build();
}
diff --git a/services/src/main/java/org/keycloak/services/service/SkeletonKeyApplication.java b/services/src/main/java/org/keycloak/services/resources/SkeletonKeyApplication.java
similarity index 89%
rename from services/src/main/java/org/keycloak/services/service/SkeletonKeyApplication.java
rename to services/src/main/java/org/keycloak/services/resources/SkeletonKeyApplication.java
index 96ead5ea1f5..6517a870d86 100755
--- a/services/src/main/java/org/keycloak/services/service/SkeletonKeyApplication.java
+++ b/services/src/main/java/org/keycloak/services/resources/SkeletonKeyApplication.java
@@ -1,10 +1,9 @@
-package org.keycloak.services.service;
+package org.keycloak.services.resources;
import org.infinispan.Cache;
import org.infinispan.manager.DefaultCacheManager;
import org.keycloak.SkeletonKeyContextResolver;
-import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.io.IOException;
import java.io.InputStream;
@@ -15,7 +14,6 @@ import java.util.Set;
* @author Bill Burke
* @version $Revision: 1 $
*/
-@ApplicationPath("/")
public class SkeletonKeyApplication extends Application
{
protected Set