diff --git a/examples/as7-eap-demo/server/src/main/java/org/keycloak/example/demo/DemoApplication.java b/examples/as7-eap-demo/server/src/main/java/org/keycloak/example/demo/DemoApplication.java index 2103030eb93..b9bbc82c175 100755 --- a/examples/as7-eap-demo/server/src/main/java/org/keycloak/example/demo/DemoApplication.java +++ b/examples/as7-eap-demo/server/src/main/java/org/keycloak/example/demo/DemoApplication.java @@ -1,13 +1,12 @@ package org.keycloak.example.demo; import org.jboss.resteasy.jwt.JsonSerialization; -import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.services.managers.ApplianceBootstrap; import org.keycloak.services.managers.RealmManager; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.services.resources.KeycloakApplication; -import org.keycloak.services.resources.SaasService; import javax.servlet.ServletContext; import javax.ws.rs.core.Context; @@ -24,27 +23,13 @@ public class DemoApplication extends KeycloakApplication { super(servletContext); KeycloakSession session = factory.createSession(); session.getTransaction().begin(); - RealmManager realmManager = new RealmManager(session); - if (realmManager.defaultRealm() == null) { - install(realmManager); - } + ApplianceBootstrap bootstrap = new ApplianceBootstrap(); + bootstrap.bootstrap(session); + install(new RealmManager(session)); session.getTransaction().commit(); } public void install(RealmManager manager) { - RealmModel defaultRealm = manager.createRealm(RealmModel.DEFAULT_REALM, RealmModel.DEFAULT_REALM); - defaultRealm.setName(RealmModel.DEFAULT_REALM); - defaultRealm.setEnabled(true); - defaultRealm.setTokenLifespan(300); - defaultRealm.setAccessCodeLifespan(60); - defaultRealm.setSslNotRequired(true); - defaultRealm.setCookieLoginAllowed(true); - defaultRealm.setRegistrationAllowed(true); - manager.generateRealmKeys(defaultRealm); - defaultRealm.addRequiredCredential(CredentialRepresentation.PASSWORD); - defaultRealm.addRole(SaasService.REALM_CREATOR_ROLE); - defaultRealm.addDefaultRole(SaasService.REALM_CREATOR_ROLE); - RealmRepresentation rep = loadJson("META-INF/testrealm.json"); RealmModel realm = manager.createRealm("demo", rep.getRealm()); manager.importRealm(rep, realm); diff --git a/examples/as7-eap-dev/server/src/main/java/org/keycloak/example/demo/DemoApplication.java b/examples/as7-eap-dev/server/src/main/java/org/keycloak/example/demo/DemoApplication.java index 2103030eb93..2f512e2807e 100755 --- a/examples/as7-eap-dev/server/src/main/java/org/keycloak/example/demo/DemoApplication.java +++ b/examples/as7-eap-dev/server/src/main/java/org/keycloak/example/demo/DemoApplication.java @@ -1,19 +1,19 @@ package org.keycloak.example.demo; import org.jboss.resteasy.jwt.JsonSerialization; -import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.RealmRepresentation; +import org.keycloak.services.managers.ApplianceBootstrap; import org.keycloak.services.managers.RealmManager; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.services.resources.KeycloakApplication; -import org.keycloak.services.resources.SaasService; import javax.servlet.ServletContext; import javax.ws.rs.core.Context; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; + /** * @author Bill Burke * @version $Revision: 1 $ @@ -24,27 +24,13 @@ public class DemoApplication extends KeycloakApplication { super(servletContext); KeycloakSession session = factory.createSession(); session.getTransaction().begin(); - RealmManager realmManager = new RealmManager(session); - if (realmManager.defaultRealm() == null) { - install(realmManager); - } + ApplianceBootstrap bootstrap = new ApplianceBootstrap(); + bootstrap.bootstrap(session); + install(new RealmManager(session)); session.getTransaction().commit(); } public void install(RealmManager manager) { - RealmModel defaultRealm = manager.createRealm(RealmModel.DEFAULT_REALM, RealmModel.DEFAULT_REALM); - defaultRealm.setName(RealmModel.DEFAULT_REALM); - defaultRealm.setEnabled(true); - defaultRealm.setTokenLifespan(300); - defaultRealm.setAccessCodeLifespan(60); - defaultRealm.setSslNotRequired(true); - defaultRealm.setCookieLoginAllowed(true); - defaultRealm.setRegistrationAllowed(true); - manager.generateRealmKeys(defaultRealm); - defaultRealm.addRequiredCredential(CredentialRepresentation.PASSWORD); - defaultRealm.addRole(SaasService.REALM_CREATOR_ROLE); - defaultRealm.addDefaultRole(SaasService.REALM_CREATOR_ROLE); - RealmRepresentation rep = loadJson("META-INF/testrealm.json"); RealmModel realm = manager.createRealm("demo", rep.getRealm()); manager.importRealm(rep, realm); diff --git a/examples/pom.xml b/examples/pom.xml index d491f213787..664977a7a7b 100755 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -35,5 +35,6 @@ as7-eap-demo + as7-eap-dev diff --git a/forms/src/main/java/org/keycloak/forms/RealmBean.java b/forms/src/main/java/org/keycloak/forms/RealmBean.java index c92263819e7..7b5e6b2f7b5 100755 --- a/forms/src/main/java/org/keycloak/forms/RealmBean.java +++ b/forms/src/main/java/org/keycloak/forms/RealmBean.java @@ -21,6 +21,7 @@ */ package org.keycloak.forms; +import org.keycloak.models.Constants; import org.keycloak.models.RealmModel; /** @@ -35,7 +36,7 @@ public class RealmBean { public RealmBean(RealmModel realmModel) { realm = realmModel; - saas = RealmModel.DEFAULT_REALM.equals(realmModel.getName()); + saas = Constants.ADMIN_REALM.equals(realmModel.getId()); } public String getId() { diff --git a/model/api/src/main/java/org/keycloak/models/Constants.java b/model/api/src/main/java/org/keycloak/models/Constants.java new file mode 100755 index 00000000000..ada97fd7deb --- /dev/null +++ b/model/api/src/main/java/org/keycloak/models/Constants.java @@ -0,0 +1,14 @@ +package org.keycloak.models; + +/** + * @author Bill Burke + * @version $Revision: 1 $ + */ +public interface Constants { + String ADMIN_REALM = "Keycloak Adminstration"; + String ADMIN_CONSOLE_APPLICATION = "Admin Console"; + String ADMIN_CONSOLE_ADMIN_ROLE = "admin"; + String APPLICATION_ROLE = "KEYCLOAK_APPLICATION"; + String IDENTITY_REQUESTER_ROLE = "KEYCLOAK_IDENTITY_REQUESTER"; + String WILDCARD_ROLE = "*"; +} diff --git a/model/api/src/main/java/org/keycloak/models/RealmModel.java b/model/api/src/main/java/org/keycloak/models/RealmModel.java index d308660b693..c2300ef05b8 100755 --- a/model/api/src/main/java/org/keycloak/models/RealmModel.java +++ b/model/api/src/main/java/org/keycloak/models/RealmModel.java @@ -11,7 +11,6 @@ import java.util.Set; * @version $Revision: 1 $ */ public interface RealmModel extends RoleContainerModel, RoleMapperModel, ScopeMapperModel { - String DEFAULT_REALM = "default"; String getId(); @@ -97,11 +96,6 @@ public interface RealmModel extends RoleContainerModel, RoleMapperModel, ScopeMa ApplicationModel addApplication(String name); - boolean isRealmAdmin(UserModel agent); - - void addRealmAdmin(UserModel agent); - - List getRequiredApplicationCredentials(); diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/ApplicationAdapter.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/ApplicationAdapter.java index 184feb3a480..8ad09eb50e7 100755 --- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/ApplicationAdapter.java +++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/ApplicationAdapter.java @@ -71,6 +71,7 @@ public class ApplicationAdapter implements ApplicationModel { @Override public void setName(String name) { applicationData.setResourceName(name); + updateApplication(); } @Override @@ -81,6 +82,7 @@ public class ApplicationAdapter implements ApplicationModel { @Override public void setEnabled(boolean enabled) { applicationData.setEnabled(enabled); + updateApplication(); } @Override @@ -91,6 +93,7 @@ public class ApplicationAdapter implements ApplicationModel { @Override public void setSurrogateAuthRequired(boolean surrogateAuthRequired) { applicationData.setSurrogateAuthRequired(surrogateAuthRequired); + updateApplication(); } @Override @@ -101,6 +104,7 @@ public class ApplicationAdapter implements ApplicationModel { @Override public void setManagementUrl(String url) { applicationData.setManagementUrl(url); + updateApplication(); } @Override @@ -111,6 +115,7 @@ public class ApplicationAdapter implements ApplicationModel { @Override public void setBaseUrl(String url) { applicationData.setBaseUrl(url); + updateApplication(); } @Override diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/PicketlinkKeycloakSession.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/PicketlinkKeycloakSession.java index 8e2a75d4609..7d1733986cf 100755 --- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/PicketlinkKeycloakSession.java +++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/PicketlinkKeycloakSession.java @@ -6,6 +6,7 @@ import org.keycloak.models.RealmModel; import org.keycloak.models.UserModel; import org.keycloak.models.picketlink.mappings.RealmData; import org.keycloak.models.picketlink.relationships.RealmAdminRelationship; +import org.keycloak.models.picketlink.relationships.RealmListingRelationship; import org.keycloak.models.utils.KeycloakSessionUtils; import org.picketlink.idm.PartitionManager; import org.picketlink.idm.RelationshipManager; @@ -56,18 +57,24 @@ public class PicketlinkKeycloakSession implements KeycloakSession { newRealm.setId(id); newRealm.setRealmName(name); partitionManager.add(newRealm); + RealmListingRelationship rel = new RealmListingRelationship(); + // picketlink beta 6 uses Realm name for lookup! Don't forget! + rel.setRealm(newRealm.getName()); + partitionManager.createRelationshipManager().add(rel); + RealmAdapter realm = new RealmAdapter(this, newRealm, partitionManager); return realm; } @Override public List getRealms(UserModel admin) { + // todo ability to assign realm management to a specific admin + // currently each admin is allowed to access all realms so just do a big query RelationshipManager relationshipManager = partitionManager.createRelationshipManager(); - RelationshipQuery query = relationshipManager.createRelationshipQuery(RealmAdminRelationship.class); - query.setParameter(RealmAdminRelationship.ADMIN, ((UserAdapter)admin).getUser()); - List results = query.getResultList(); + RelationshipQuery query = relationshipManager.createRelationshipQuery(RealmListingRelationship.class); + List results = query.getResultList(); List realmModels = new ArrayList(); - for (RealmAdminRelationship relationship : results) { + for (RealmListingRelationship relationship : results) { String realmName = relationship.getRealm(); RealmModel model = getRealm(realmName); if (model == null) { @@ -81,6 +88,7 @@ public class PicketlinkKeycloakSession implements KeycloakSession { @Override public RealmAdapter getRealm(String id) { + // picketlink beta 6 uses Realm name for lookup! Don't forget! RealmData existing = partitionManager.getPartition(RealmData.class, id); if (existing == null) { return null; diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java index d5412cee08a..c6959f031c7 100755 --- a/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java +++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/RealmAdapter.java @@ -753,23 +753,6 @@ public class RealmAdapter implements RealmModel { return set; } - @Override - public boolean isRealmAdmin(UserModel agent) { - RelationshipQuery query = getRelationshipManager().createRelationshipQuery(RealmAdminRelationship.class); - query.setParameter(RealmAdminRelationship.REALM, realm.getName()); - query.setParameter(RealmAdminRelationship.ADMIN, ((UserAdapter)agent).getUser()); - List results = query.getResultList(); - return results.size() > 0; - } - - @Override - public void addRealmAdmin(UserModel agent) { - RealmAdminRelationship relationship = new RealmAdminRelationship(); - relationship.setAdmin(((UserAdapter)agent).getUser()); - relationship.setRealm(realm.getName()); - getRelationshipManager().add(relationship); - } - @Override public List getDefaultRoles() { List defaultRoleModels = new ArrayList(); diff --git a/model/picketlink/src/main/java/org/keycloak/models/picketlink/relationships/RealmListingRelationship.java b/model/picketlink/src/main/java/org/keycloak/models/picketlink/relationships/RealmListingRelationship.java new file mode 100755 index 00000000000..26636e6b348 --- /dev/null +++ b/model/picketlink/src/main/java/org/keycloak/models/picketlink/relationships/RealmListingRelationship.java @@ -0,0 +1,28 @@ +package org.keycloak.models.picketlink.relationships; + +import org.picketlink.idm.model.AbstractAttributedType; +import org.picketlink.idm.model.Attribute; +import org.picketlink.idm.model.Relationship; +import org.picketlink.idm.model.sample.User; +import org.picketlink.idm.query.AttributeParameter; +import org.picketlink.idm.query.RelationshipQueryParameter; + +/** + * Picketlink doesn't allow you to query for all partitions, thus this stupid relationship... + * + * @author Bill Burke + * @version $Revision: 1 $ + */ +public class RealmListingRelationship extends AbstractAttributedType implements Relationship { + private static final long serialVersionUID = 1L; + + public static final AttributeParameter REALM = new AttributeParameter("realm"); + + public String getRealm() { + return (String)getAttribute("realm").getValue(); + } + + public void setRealm(String realm) { + setAttribute(new Attribute("realm", realm)); + } +} diff --git a/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java b/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java index 216339b57ba..e6d3cbbf536 100755 --- a/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java +++ b/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java @@ -2,7 +2,6 @@ package org.keycloak.services.managers; import org.keycloak.models.*; import org.keycloak.representations.idm.CredentialRepresentation; -import org.keycloak.services.resources.SaasService; import java.util.UUID; @@ -13,17 +12,14 @@ import java.util.UUID; public class ApplianceBootstrap { - public static final String ADMIN_REALM = "Keycloak Adminstration"; - public static final String ADMIN_CONSOLE = "Admin Console"; - public void initKeycloakAdminRealm(RealmModel realm) { } public void bootstrap(KeycloakSession session) { RealmManager manager = new RealmManager(session); - RealmModel realm = manager.createRealm(ADMIN_REALM, "Keycloak Adminstration"); - realm.setName("Keycloak Adminstration"); + RealmModel realm = manager.createRealm(Constants.ADMIN_REALM, Constants.ADMIN_REALM); + realm.setName(Constants.ADMIN_REALM); realm.setEnabled(true); realm.addRequiredCredential(CredentialRepresentation.PASSWORD); realm.addRequiredOAuthClientCredential(CredentialRepresentation.PASSWORD); @@ -36,16 +32,16 @@ public class ApplianceBootstrap { manager.generateRealmKeys(realm); initKeycloakAdminRealm(realm); - ApplicationModel adminConsole = realm.addApplication(ADMIN_CONSOLE); + ApplicationModel adminConsole = realm.addApplication(Constants.ADMIN_CONSOLE_APPLICATION); adminConsole.setEnabled(true); UserCredentialModel adminConsolePassword = new UserCredentialModel(); adminConsolePassword.setType(UserCredentialModel.PASSWORD); adminConsolePassword.setValue(UUID.randomUUID().toString()); // just a random password as we'll never access it realm.updateCredential(adminConsole.getApplicationUser(), adminConsolePassword); - RoleModel applicationRole = realm.getRole(RealmManager.APPLICATION_ROLE); + RoleModel applicationRole = realm.getRole(Constants.APPLICATION_ROLE); realm.grantRole(adminConsole.getApplicationUser(), applicationRole); - RoleModel adminRole = adminConsole.addRole("admin"); + RoleModel adminRole = adminConsole.addRole(Constants.ADMIN_CONSOLE_ADMIN_ROLE); UserModel adminUser = realm.addUser("admin"); adminUser.setEnabled(true); @@ -53,7 +49,7 @@ public class ApplianceBootstrap { password.setType(UserCredentialModel.PASSWORD); password.setValue("admin"); realm.updateCredential(adminUser, password); - adminUser.addRequiredAction(UserModel.RequiredAction.UPDATE_PASSWORD); + //adminUser.addRequiredAction(UserModel.RequiredAction.UPDATE_PASSWORD); adminConsole.grantRole(adminUser, adminRole); diff --git a/services/src/main/java/org/keycloak/services/managers/ApplicationManager.java b/services/src/main/java/org/keycloak/services/managers/ApplicationManager.java index 46d3b6c1d9e..7156f89bc19 100755 --- a/services/src/main/java/org/keycloak/services/managers/ApplicationManager.java +++ b/services/src/main/java/org/keycloak/services/managers/ApplicationManager.java @@ -70,7 +70,7 @@ public class ApplicationManager { } public ApplicationModel createApplication(RealmModel realm, ApplicationRepresentation resourceRep) { - RoleModel loginRole = realm.getRole(RealmManager.APPLICATION_ROLE); + RoleModel loginRole = realm.getRole(Constants.APPLICATION_ROLE); return createApplication(realm, loginRole, resourceRep); } diff --git a/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java b/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java index 00893f9bec7..b48d710beaa 100755 --- a/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java +++ b/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java @@ -7,6 +7,7 @@ import org.jboss.resteasy.spi.HttpResponse; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.keycloak.RSATokenVerifier; import org.keycloak.VerificationException; +import org.keycloak.models.Constants; import org.keycloak.representations.SkeletonKeyToken; import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.models.RealmModel; @@ -33,18 +34,6 @@ public class AuthenticationManager { public static final String FORM_USERNAME = "username"; public static final String KEYCLOAK_IDENTITY_COOKIE = "KEYCLOAK_IDENTITY"; - /** - * Grabs token from headers, authenticates, authorizes - * - * @param realm - * @param headers - * @return - */ - public boolean isRealmAdmin(RealmModel realm, HttpHeaders headers) { - UserModel user = authenticateBearerToken(realm, headers); - return realm.isRealmAdmin(user); - } - public SkeletonKeyToken createIdentityToken(RealmModel realm, String username) { SkeletonKeyToken token = new SkeletonKeyToken(); token.id(RealmManager.generateId()); @@ -211,9 +200,9 @@ public class AuthenticationManager { Set types = new HashSet(); List requiredCredentials = null; - if (realm.hasRole(user, RealmManager.APPLICATION_ROLE)) { + if (realm.hasRole(user, Constants.APPLICATION_ROLE)) { requiredCredentials = realm.getRequiredApplicationCredentials(); - } else if (realm.hasRole(user, RealmManager.IDENTITY_REQUESTER_ROLE)) { + } else if (realm.hasRole(user, Constants.IDENTITY_REQUESTER_ROLE)) { requiredCredentials = realm.getRequiredOAuthClientCredentials(); } else { requiredCredentials = realm.getRequiredCredentials(); diff --git a/services/src/main/java/org/keycloak/services/managers/OAuthClientManager.java b/services/src/main/java/org/keycloak/services/managers/OAuthClientManager.java index 22ef50e1f1d..0b10d619b79 100755 --- a/services/src/main/java/org/keycloak/services/managers/OAuthClientManager.java +++ b/services/src/main/java/org/keycloak/services/managers/OAuthClientManager.java @@ -1,5 +1,6 @@ package org.keycloak.services.managers; +import org.keycloak.models.Constants; import org.keycloak.models.OAuthClientModel; import org.keycloak.models.RealmModel; import org.keycloak.models.RoleModel; @@ -18,7 +19,7 @@ public class OAuthClientManager { public OAuthClientModel create(String name) { OAuthClientModel model = realm.addOAuthClient(name); - RoleModel role = realm.getRole(RealmManager.IDENTITY_REQUESTER_ROLE); + RoleModel role = realm.getRole(Constants.IDENTITY_REQUESTER_ROLE); realm.grantRole(model.getOAuthAgent(), role); return model; } diff --git a/services/src/main/java/org/keycloak/services/managers/RealmManager.java b/services/src/main/java/org/keycloak/services/managers/RealmManager.java index c683290688d..af6d4db93ae 100755 --- a/services/src/main/java/org/keycloak/services/managers/RealmManager.java +++ b/services/src/main/java/org/keycloak/services/managers/RealmManager.java @@ -20,9 +20,6 @@ import java.util.concurrent.atomic.AtomicLong; public class RealmManager { protected static final Logger logger = Logger.getLogger(RealmManager.class); private static AtomicLong counter = new AtomicLong(1); - public static final String APPLICATION_ROLE = "KEYCLOAK_APPLICATION"; - public static final String IDENTITY_REQUESTER_ROLE = "KEYCLOAK_IDENTITY_REQUESTER"; - public static final String WILDCARD_ROLE = "*"; public static String generateId() { return counter.getAndIncrement() + "-" + System.currentTimeMillis(); @@ -34,8 +31,8 @@ public class RealmManager { this.identitySession = identitySession; } - public RealmModel defaultRealm() { - return getRealm(RealmModel.DEFAULT_REALM); + public RealmModel getKeycloakAdminstrationRealm() { + return getRealm(Constants.ADMIN_REALM); } public RealmModel getRealm(String id) { @@ -49,9 +46,9 @@ public class RealmManager { public RealmModel createRealm(String id, String name) { RealmModel realm = identitySession.createRealm(id, name); realm.setName(name); - realm.addRole(WILDCARD_ROLE); - realm.addRole(APPLICATION_ROLE); - realm.addRole(IDENTITY_REQUESTER_ROLE); + realm.addRole(Constants.WILDCARD_ROLE); + realm.addRole(Constants.APPLICATION_ROLE); + realm.addRole(Constants.IDENTITY_REQUESTER_ROLE); return realm; } @@ -99,7 +96,6 @@ public class RealmManager { //verifyRealmRepresentation(rep); RealmModel realm = createRealm(rep.getRealm()); importRealm(rep, realm); - realm.addRealmAdmin(realmCreator); return realm; } @@ -329,7 +325,7 @@ public class RealmManager { protected void createApplications(RealmRepresentation rep, RealmModel realm) { - RoleModel loginRole = realm.getRole(RealmManager.APPLICATION_ROLE); + RoleModel loginRole = realm.getRole(Constants.APPLICATION_ROLE); ApplicationManager manager = new ApplicationManager(this); for (ApplicationRepresentation resourceRep : rep.getApplications()) { manager.createApplication(realm, loginRole, resourceRep); diff --git a/services/src/main/java/org/keycloak/services/managers/TokenManager.java b/services/src/main/java/org/keycloak/services/managers/TokenManager.java index 19da5e336f4..47ed94d5ae0 100755 --- a/services/src/main/java/org/keycloak/services/managers/TokenManager.java +++ b/services/src/main/java/org/keycloak/services/managers/TokenManager.java @@ -3,12 +3,9 @@ package org.keycloak.services.managers; import org.jboss.resteasy.jose.Base64Url; import org.jboss.resteasy.jose.jws.JWSBuilder; import org.jboss.resteasy.jwt.JsonSerialization; +import org.keycloak.models.*; import org.keycloak.representations.SkeletonKeyScope; import org.keycloak.representations.SkeletonKeyToken; -import org.keycloak.models.ApplicationModel; -import org.keycloak.models.RealmModel; -import org.keycloak.models.RoleModel; -import org.keycloak.models.UserModel; import javax.ws.rs.core.MultivaluedMap; import java.io.IOException; @@ -55,7 +52,7 @@ public class TokenManager { Set scopeRequest = null; if (scopeMap != null) { scopeRequest.addAll(scopeMap.get("realm")); - if (scopeRequest.contains(RealmManager.WILDCARD_ROLE)) scopeRequest = null; + if (scopeRequest.contains(Constants.WILDCARD_ROLE)) scopeRequest = null; } for (String role : realmMapping) { if ( @@ -74,7 +71,7 @@ public class TokenManager { Set scopeRequest = null; if (scopeMap != null) { scopeRequest.addAll(scopeMap.get(resource.getName())); - if (scopeRequest.contains(RealmManager.WILDCARD_ROLE)) scopeRequest = null; + if (scopeRequest.contains(Constants.WILDCARD_ROLE)) scopeRequest = null; } for (String role : mapping) { if ( diff --git a/services/src/main/java/org/keycloak/services/resources/SaasService.java b/services/src/main/java/org/keycloak/services/resources/SaasService.java index 01aef1b97f6..0b2c08d6116 100755 --- a/services/src/main/java/org/keycloak/services/resources/SaasService.java +++ b/services/src/main/java/org/keycloak/services/resources/SaasService.java @@ -6,24 +6,17 @@ import org.jboss.resteasy.spi.HttpRequest; import org.jboss.resteasy.spi.HttpResponse; import org.jboss.resteasy.spi.NotImplementedYetException; import org.keycloak.models.*; -import org.keycloak.representations.idm.CredentialRepresentation; -import org.keycloak.representations.idm.UserRepresentation; import org.keycloak.services.managers.AuthenticationManager; import org.keycloak.services.managers.AuthenticationManager.AuthenticationStatus; import org.keycloak.services.managers.RealmManager; import org.keycloak.services.messages.Messages; import org.keycloak.services.resources.admin.RealmsAdminResource; import org.keycloak.services.resources.flows.Flows; -import org.keycloak.services.validation.Validation; import javax.ws.rs.*; import javax.ws.rs.container.ResourceContext; import javax.ws.rs.core.*; -import java.net.URI; -import java.util.LinkedList; -import java.util.List; - /** * @author Bill Burke * @version $Revision: 1 $ @@ -87,7 +80,7 @@ public class SaasService { public Response keepalive(final @Context HttpHeaders headers) { logger.debug("keepalive"); RealmManager realmManager = new RealmManager(session); - RealmModel realm = realmManager.defaultRealm(); + RealmModel realm = getAdminstrationRealm(realmManager); if (realm == null) throw new NotFoundException(); UserModel user = authManager.authenticateSaasIdentityCookie(realm, uriInfo, headers); @@ -104,14 +97,15 @@ public class SaasService { @NoCache public Response whoAmI(final @Context HttpHeaders headers) { RealmManager realmManager = new RealmManager(session); - RealmModel realm = realmManager.defaultRealm(); + RealmModel realm = getAdminstrationRealm(realmManager); if (realm == null) throw new NotFoundException(); UserModel user = authManager.authenticateSaasIdentityCookie(realm, uriInfo, headers); if (user == null) { return Response.status(401).build(); } - return Response.ok(new WhoAmI(user.getLoginName(), user.getFirstName() + " " + user.getLastName())).build(); + // keycloak is bootstrapped with an admin user with no first/last name, so use login name as display name + return Response.ok(new WhoAmI(user.getLoginName(), user.getLoginName())).build(); } @Path("isLoggedIn.js") @@ -121,7 +115,7 @@ public class SaasService { public String isLoggedIn(final @Context HttpHeaders headers) { logger.debug("WHOAMI Javascript start."); RealmManager realmManager = new RealmManager(session); - RealmModel realm = realmManager.defaultRealm(); + RealmModel realm = getAdminstrationRealm(realmManager); if (realm == null) { return "var keycloakCookieLoggedIn = false;"; @@ -145,16 +139,20 @@ public class SaasService { @Path("admin/realms") public RealmsAdminResource getRealmsAdmin(@Context final HttpHeaders headers) { RealmManager realmManager = new RealmManager(session); - RealmModel saasRealm = realmManager.defaultRealm(); + RealmModel saasRealm = getAdminstrationRealm(realmManager); if (saasRealm == null) throw new NotFoundException(); UserModel admin = authManager.authenticateSaasIdentity(saasRealm, uriInfo, headers); if (admin == null) { throw new NotAuthorizedException("Bearer"); } - RoleModel creatorRole = saasRealm.getRole(SaasService.REALM_CREATOR_ROLE); - if (!saasRealm.hasRole(admin, creatorRole)) { - logger.warn("not a Realm creator"); + ApplicationModel adminConsole = saasRealm.getApplicationNameMap().get(Constants.ADMIN_CONSOLE_APPLICATION); + if (adminConsole == null) { + throw new NotFoundException(); + } + RoleModel adminRole = adminConsole.getRole(Constants.ADMIN_CONSOLE_ADMIN_ROLE); + if (!adminConsole.hasRole(admin, adminRole)) { + logger.warn("not a Realm admin"); throw new NotAuthorizedException("Bearer"); } RealmsAdminResource adminResource = new RealmsAdminResource(admin); @@ -167,29 +165,18 @@ public class SaasService { @NoCache public Response loginPage() { RealmManager realmManager = new RealmManager(session); - RealmModel realm = realmManager.defaultRealm(); + RealmModel realm = getAdminstrationRealm(realmManager); authManager.expireSaasIdentityCookie(uriInfo); return Flows.forms(realm, request, uriInfo).forwardToLogin(); } - @Path("registrations") - @GET - @NoCache - public Response registerPage() { - RealmManager realmManager = new RealmManager(session); - RealmModel realm = realmManager.defaultRealm(); - authManager.expireSaasIdentityCookie(uriInfo); - - return Flows.forms(realm, request, uriInfo).forwardToRegistration(); - } - @Path("logout") @GET @NoCache public Response logout() { RealmManager realmManager = new RealmManager(session); - RealmModel realm = realmManager.defaultRealm(); + RealmModel realm = getAdminstrationRealm(realmManager); authManager.expireSaasIdentityCookie(uriInfo); return Flows.forms(realm, request, uriInfo).forwardToLogin(); @@ -209,7 +196,7 @@ public class SaasService { public Response processLogin(final MultivaluedMap formData) { logger.info("processLogin start"); RealmManager realmManager = new RealmManager(session); - RealmModel realm = realmManager.defaultRealm(); + RealmModel realm = getAdminstrationRealm(realmManager); if (realm == null) throw new NotFoundException(); @@ -236,91 +223,7 @@ public class SaasService { } } - @Path("registrations") - @POST - @Consumes(MediaType.APPLICATION_JSON) - public Response register(final UserRepresentation newUser) { - RealmManager realmManager = new RealmManager(session); - RealmModel defaultRealm = realmManager.defaultRealm(); - UserModel user = registerMe(defaultRealm, newUser); - if (user == null) { - return Response.status(400).type("text/plain").entity("Already exists").build(); - } - URI uri = uriInfo.getBaseUriBuilder().path(RealmsResource.class).path(user.getLoginName()).build(); - return Response.created(uri).build(); + protected RealmModel getAdminstrationRealm(RealmManager realmManager) { + return realmManager.getKeycloakAdminstrationRealm(); } - - @Path("registrations") - @POST - @Consumes(MediaType.APPLICATION_FORM_URLENCODED) - public Response processRegister(final MultivaluedMap formData) { - RealmManager realmManager = new RealmManager(session); - RealmModel defaultRealm = realmManager.defaultRealm(); - - List requiredCredentialTypes = new LinkedList(); - for (RequiredCredentialModel m : defaultRealm.getRequiredCredentials()) { - requiredCredentialTypes.add(m.getType()); - } - - String error = Validation.validateRegistrationForm(formData, requiredCredentialTypes); - if (error != null) { - return Flows.forms(defaultRealm, request, uriInfo).setError(error).setFormData(formData) - .forwardToRegistration(); - } - - UserRepresentation newUser = new UserRepresentation(); - newUser.setUsername(formData.getFirst("username")); - newUser.setEmail(formData.getFirst("email")); - - newUser.setFirstName(formData.getFirst("firstName")); - newUser.setLastName(formData.getFirst("lastName")); - - if (requiredCredentialTypes.contains(CredentialRepresentation.PASSWORD)) { - newUser.credential(CredentialRepresentation.PASSWORD, formData.getFirst("password")); - } - - if (requiredCredentialTypes.contains(CredentialRepresentation.TOTP)) { - newUser.credential(CredentialRepresentation.TOTP, formData.getFirst("password")); - } - - UserModel user = registerMe(defaultRealm, newUser); - if (user == null) { - return Flows.forms(defaultRealm, request, uriInfo).setError(Messages.USERNAME_EXISTS) - .setFormData(formData).forwardToRegistration(); - - } - NewCookie cookie = authManager.createSaasIdentityCookie(defaultRealm, user, uriInfo); - return Response.status(302).location(contextRoot(uriInfo).path(adminPath).build()).cookie(cookie).build(); - } - - protected UserModel registerMe(RealmModel defaultRealm, UserRepresentation newUser) { - if (!defaultRealm.isEnabled()) { - throw new ForbiddenException(); - } - if (!defaultRealm.isRegistrationAllowed()) { - throw new ForbiddenException(); - } - UserModel user = defaultRealm.getUser(newUser.getUsername()); - if (user != null) { - return null; - } - - user = defaultRealm.addUser(newUser.getUsername()); - user.setFirstName(newUser.getFirstName()); - user.setLastName(newUser.getLastName()); - user.setEmail(newUser.getEmail()); - for (CredentialRepresentation cred : newUser.getCredentials()) { - UserCredentialModel credModel = new UserCredentialModel(); - credModel.setType(cred.getType()); - credModel.setValue(cred.getValue()); - defaultRealm.updateCredential(user, credModel); - } - - for (RoleModel role : defaultRealm.getDefaultRoles()) { - defaultRealm.grantRole(user, role); - } - - return user; - } - } diff --git a/services/src/main/java/org/keycloak/services/resources/TokenService.java b/services/src/main/java/org/keycloak/services/resources/TokenService.java index ae4c014bbf8..d3322d4bf92 100755 --- a/services/src/main/java/org/keycloak/services/resources/TokenService.java +++ b/services/src/main/java/org/keycloak/services/resources/TokenService.java @@ -15,7 +15,6 @@ import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.services.managers.AccessCodeEntry; import org.keycloak.services.managers.AuthenticationManager; import org.keycloak.services.managers.AuthenticationManager.AuthenticationStatus; -import org.keycloak.services.managers.RealmManager; import org.keycloak.services.managers.ResourceAdminManager; import org.keycloak.services.managers.TokenManager; import org.keycloak.services.messages.Messages; @@ -176,6 +175,7 @@ public class TokenService { public Response processLogin(@QueryParam("client_id") final String clientId, @QueryParam("scope") final String scopeParam, @QueryParam("state") final String state, @QueryParam("redirect_uri") final String redirect, final MultivaluedMap formData) { + logger.info("TokenService.processLogin"); OAuthFlows oauth = Flows.oauth(realm, request, uriInfo, authManager, tokenManager); if (!realm.isEnabled()) { @@ -451,8 +451,8 @@ public class TokenService { return null; } - RoleModel resourceRole = realm.getRole(RealmManager.APPLICATION_ROLE); - RoleModel identityRequestRole = realm.getRole(RealmManager.IDENTITY_REQUESTER_ROLE); + RoleModel resourceRole = realm.getRole(Constants.APPLICATION_ROLE); + RoleModel identityRequestRole = realm.getRole(Constants.IDENTITY_REQUESTER_ROLE); boolean isResource = realm.hasRole(client, resourceRole); if (!isResource && !realm.hasRole(client, identityRequestRole)) { oauth.forwardToSecurityFailure("Login requester not allowed to request login."); diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java index b64fcfe64de..15089f6663d 100755 --- a/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java +++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java @@ -78,9 +78,6 @@ public class RealmsAdminResource { RealmManager realmManager = new RealmManager(session); RealmModel realm = realmManager.getRealm(id); if (realm == null) throw new NotFoundException(); - if (!realm.isRealmAdmin(admin)) { - throw new ForbiddenException(); - } RealmAdminResource adminResource = new RealmAdminResource(admin, realm); resourceContext.initResource(adminResource); diff --git a/services/src/main/java/org/keycloak/services/resources/flows/OAuthFlows.java b/services/src/main/java/org/keycloak/services/resources/flows/OAuthFlows.java index 5981dcba22e..06c0a06b07b 100755 --- a/services/src/main/java/org/keycloak/services/resources/flows/OAuthFlows.java +++ b/services/src/main/java/org/keycloak/services/resources/flows/OAuthFlows.java @@ -26,9 +26,9 @@ import java.util.Set; import org.jboss.resteasy.logging.Logger; import org.jboss.resteasy.spi.HttpRequest; +import org.keycloak.models.Constants; import org.keycloak.services.managers.AccessCodeEntry; import org.keycloak.services.managers.AuthenticationManager; -import org.keycloak.services.managers.RealmManager; import org.keycloak.services.managers.TokenManager; import org.keycloak.models.RealmModel; import org.keycloak.models.RoleModel; @@ -81,8 +81,8 @@ public class OAuthFlows { } public Response processAccessCode(String scopeParam, String state, String redirect, UserModel client, UserModel user) { - RoleModel resourceRole = realm.getRole(RealmManager.APPLICATION_ROLE); - RoleModel identityRequestRole = realm.getRole(RealmManager.IDENTITY_REQUESTER_ROLE); + RoleModel resourceRole = realm.getRole(Constants.APPLICATION_ROLE); + RoleModel identityRequestRole = realm.getRole(Constants.IDENTITY_REQUESTER_ROLE); boolean isResource = realm.hasRole(client, resourceRole); if (!isResource && !realm.hasRole(client, identityRequestRole)) { return forwardToSecurityFailure("Login requester not allowed to request login."); diff --git a/services/src/test/java/org/keycloak/test/AdapterTest.java b/services/src/test/java/org/keycloak/test/AdapterTest.java index 41aa8e15b28..7342e5e3512 100755 --- a/services/src/test/java/org/keycloak/test/AdapterTest.java +++ b/services/src/test/java/org/keycloak/test/AdapterTest.java @@ -1,17 +1,15 @@ package org.keycloak.test; -import org.junit.After; import org.junit.Assert; -import org.junit.Before; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; import org.keycloak.models.*; import org.keycloak.representations.idm.CredentialRepresentation; +import org.keycloak.services.managers.ApplianceBootstrap; import org.keycloak.services.managers.OAuthClientManager; import org.keycloak.services.managers.RealmManager; import org.keycloak.models.UserModel.RequiredAction; -import org.keycloak.services.resources.KeycloakApplication; import org.keycloak.test.common.AbstractKeycloakTest; import org.keycloak.test.common.SessionFactoryTestContext; @@ -35,7 +33,7 @@ public class AdapterTest extends AbstractKeycloakTest { @Test public void installTest() throws Exception { - new InstallationManager().install(getRealmManager()); + new ApplianceBootstrap().bootstrap(identitySession); } @@ -78,6 +76,48 @@ public class AdapterTest extends AbstractKeycloakTest { Assert.assertEquals("foo", realmModel.getDefaultRoles().get(0).getName()); } + @Test + public void testRealmListing() throws Exception { + realmModel = getRealmManager().createRealm("JUGGLER"); + realmModel.setAccessCodeLifespan(100); + realmModel.setAccessCodeLifespanUserAction(600); + realmModel.setCookieLoginAllowed(true); + realmModel.setEnabled(true); + realmModel.setName("JUGGLER"); + realmModel.setPrivateKeyPem("0234234"); + realmModel.setPublicKeyPem("0234234"); + realmModel.setTokenLifespan(1000); + realmModel.setAutomaticRegistrationAfterSocialLogin(true); + realmModel.addDefaultRole("foo"); + + System.out.println(realmModel.getId()); + realmModel = getRealmManager().getRealm(realmModel.getId()); + Assert.assertNotNull(realmModel); + Assert.assertEquals(realmModel.getAccessCodeLifespan(), 100); + Assert.assertEquals(600, realmModel.getAccessCodeLifespanUserAction()); + Assert.assertEquals(realmModel.getTokenLifespan(), 1000); + Assert.assertEquals(realmModel.isEnabled(), true); + Assert.assertEquals(realmModel.getName(), "JUGGLER"); + Assert.assertEquals(realmModel.getPrivateKeyPem(), "0234234"); + Assert.assertEquals(realmModel.getPublicKeyPem(), "0234234"); + Assert.assertEquals(realmModel.isAutomaticRegistrationAfterSocialLogin(), true); + Assert.assertEquals(1, realmModel.getDefaultRoles().size()); + Assert.assertEquals("foo", realmModel.getDefaultRoles().get(0).getName()); + + String id = realmModel.getId(); + System.out.println("id: " + id); + + identitySession.getTransaction().commit(); + identitySession.close(); + identitySession = factory.createSession(); + identitySession.getTransaction().begin(); + realmManager = new RealmManager(identitySession); + List realms = identitySession.getRealms(null); + System.out.println("num realms: " + realms.size()); + Assert.assertEquals(realms.size(), 1); + } + + @Test public void test2RequiredCredential() throws Exception { test1CreateRealm(); @@ -126,7 +166,7 @@ public class AdapterTest extends AbstractKeycloakTest { oauth.setBaseUrl("/foo/bar"); oauth = realmModel.getOAuthClient("oauth-client"); Assert.assertEquals("/foo/bar", oauth.getBaseUrl()); - Assert.assertTrue(realmModel.hasRole(oauth.getOAuthAgent(), RealmManager.IDENTITY_REQUESTER_ROLE)); + Assert.assertTrue(realmModel.hasRole(oauth.getOAuthAgent(), Constants.IDENTITY_REQUESTER_ROLE)); } diff --git a/services/src/test/java/org/keycloak/test/ImportTest.java b/services/src/test/java/org/keycloak/test/ImportTest.java index 33348ed2524..febdc39f854 100755 --- a/services/src/test/java/org/keycloak/test/ImportTest.java +++ b/services/src/test/java/org/keycloak/test/ImportTest.java @@ -39,26 +39,9 @@ public class ImportTest extends AbstractKeycloakTest { @Test public void install() throws Exception { RealmManager manager = getRealmManager(); - RealmModel defaultRealm = manager.createRealm(RealmModel.DEFAULT_REALM, RealmModel.DEFAULT_REALM); - defaultRealm.setName(RealmModel.DEFAULT_REALM); - defaultRealm.setEnabled(true); - defaultRealm.setTokenLifespan(300); - defaultRealm.setAccessCodeLifespan(60); - defaultRealm.setAccessCodeLifespanUserAction(600); - defaultRealm.setSslNotRequired(false); - defaultRealm.setCookieLoginAllowed(true); - defaultRealm.setRegistrationAllowed(true); - defaultRealm.setAutomaticRegistrationAfterSocialLogin(false); - manager.generateRealmKeys(defaultRealm); - defaultRealm.addRequiredCredential(CredentialRepresentation.PASSWORD); - RoleModel role = defaultRealm.addRole(SaasService.REALM_CREATOR_ROLE); - UserModel admin = defaultRealm.addUser("admin"); - defaultRealm.grantRole(admin, role); - RealmRepresentation rep = AbstractKeycloakServerTest.loadJson("testrealm.json"); RealmModel realm = manager.createRealm("demo", rep.getRealm()); manager.importRealm(rep, realm); - realm.addRealmAdmin(admin); Assert.assertTrue(realm.isVerifyEmail()); @@ -81,8 +64,6 @@ public class ImportTest extends AbstractKeycloakTest { List resources = realm.getApplications(); Assert.assertEquals(2, resources.size()); - List realms = getIdentitySession().getRealms(admin); - Assert.assertEquals(1, realms.size()); // Test scope relationship ApplicationModel application = realm.getApplicationNameMap().get("Application"); @@ -118,26 +99,9 @@ public class ImportTest extends AbstractKeycloakTest { @Test public void install2() throws Exception { RealmManager manager = getRealmManager(); - RealmModel defaultRealm = manager.createRealm(RealmModel.DEFAULT_REALM, RealmModel.DEFAULT_REALM); - defaultRealm.setName(RealmModel.DEFAULT_REALM); - defaultRealm.setEnabled(true); - defaultRealm.setTokenLifespan(300); - defaultRealm.setAccessCodeLifespan(60); - defaultRealm.setAccessCodeLifespanUserAction(600); - defaultRealm.setSslNotRequired(false); - defaultRealm.setCookieLoginAllowed(true); - defaultRealm.setRegistrationAllowed(true); - defaultRealm.setAutomaticRegistrationAfterSocialLogin(false); - manager.generateRealmKeys(defaultRealm); - defaultRealm.addRequiredCredential(CredentialRepresentation.PASSWORD); - RoleModel role = defaultRealm.addRole(SaasService.REALM_CREATOR_ROLE); - UserModel admin = defaultRealm.addUser("admin"); - defaultRealm.grantRole(admin, role); - RealmRepresentation rep = AbstractKeycloakServerTest.loadJson("testrealm-demo.json"); RealmModel realm = manager.createRealm("demo", rep.getRealm()); manager.importRealm(rep, realm); - realm.addRealmAdmin(admin); Assert.assertTrue(realm.isAutomaticRegistrationAfterSocialLogin()); Assert.assertEquals(600, realm.getAccessCodeLifespanUserAction()); diff --git a/services/src/test/java/org/keycloak/test/InstallationManager.java b/services/src/test/java/org/keycloak/test/InstallationManager.java deleted file mode 100755 index 1b1a68601ba..00000000000 --- a/services/src/test/java/org/keycloak/test/InstallationManager.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.keycloak.test; - -import org.keycloak.representations.idm.CredentialRepresentation; -import org.keycloak.services.managers.RealmManager; -import org.keycloak.models.RealmModel; -import org.keycloak.services.resources.SaasService; - -/** - * @author Bill Burke - * @version $Revision: 1 $ - */ -public class InstallationManager { - public void install(RealmManager manager) { - RealmModel defaultRealm = manager.createRealm(RealmModel.DEFAULT_REALM, RealmModel.DEFAULT_REALM); - defaultRealm.setName(RealmModel.DEFAULT_REALM); - defaultRealm.setEnabled(true); - defaultRealm.setTokenLifespan(300); - defaultRealm.setAccessCodeLifespan(60); - defaultRealm.setAccessCodeLifespanUserAction(600); - defaultRealm.setSslNotRequired(false); - defaultRealm.setCookieLoginAllowed(true); - defaultRealm.setRegistrationAllowed(true); - manager.generateRealmKeys(defaultRealm); - defaultRealm.addRequiredCredential(CredentialRepresentation.PASSWORD); - defaultRealm.addRole(SaasService.REALM_CREATOR_ROLE); - defaultRealm.addDefaultRole(SaasService.REALM_CREATOR_ROLE); - } - - public boolean isInstalled(RealmManager manager) { - return manager.defaultRealm() != null; - } -} diff --git a/services/src/test/java/org/keycloak/test/RealmCreationTest.java b/services/src/test/java/org/keycloak/test/RealmCreationTest.java deleted file mode 100755 index a99042f6c56..00000000000 --- a/services/src/test/java/org/keycloak/test/RealmCreationTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.keycloak.test; - -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.keycloak.representations.AccessTokenResponse; -import org.keycloak.representations.idm.CredentialRepresentation; -import org.keycloak.representations.idm.RealmRepresentation; -import org.keycloak.representations.idm.UserRepresentation; -import org.keycloak.services.managers.AuthenticationManager; -import org.keycloak.services.managers.RealmManager; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.RealmModel; - -import javax.ws.rs.NotAuthorizedException; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.core.Form; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.Response; - -import static org.jboss.resteasy.test.TestPortProvider.generateURL; - -/** - * @author Bill Burke - * @version $Revision: 1 $ - */ -public class RealmCreationTest extends AbstractKeycloakServerTest { - - @BeforeClass - public static void before() throws Exception { - KeycloakSession session = application.getFactory().createSession(); - session.getTransaction().begin(); - RealmManager manager = new RealmManager(session); - new InstallationManager().install(manager); - session.getTransaction().commit(); - session.close(); - } - - @Test - public void testRegisterLoginAndCreate() throws Exception { - UserRepresentation user = new UserRepresentation(); - user.setUsername("bburke"); - user.credential(CredentialRepresentation.PASSWORD, "geheim"); - - WebTarget target = client.target(generateURL("/")); - Response response = target.path("saas/registrations").request().post(Entity.json(user)); - Assert.assertEquals(201, response.getStatus()); - response.close(); - - - AccessTokenResponse tokenResponse = null; - try { - Form form = new Form(); - form.param(AuthenticationManager.FORM_USERNAME, "bburke"); - form.param(CredentialRepresentation.PASSWORD, "badpassword"); - tokenResponse = target.path("realms").path(RealmModel.DEFAULT_REALM).path("tokens/grants/identity-token").request().post(Entity.form(form), AccessTokenResponse.class); - Assert.fail(); - } catch (NotAuthorizedException e) { - } - Form form = new Form(); - form.param(AuthenticationManager.FORM_USERNAME, "bburke"); - form.param(CredentialRepresentation.PASSWORD, "geheim"); - tokenResponse = target.path("realms").path(RealmModel.DEFAULT_REALM).path("tokens/grants/identity-token").request().post(Entity.form(form), AccessTokenResponse.class); - Assert.assertNotNull(tokenResponse); - System.out.println(tokenResponse.getToken()); - // - - RealmRepresentation realm = loadJson("testrealm.json"); - response = target.path("saas/admin/realms").request().header(HttpHeaders.AUTHORIZATION, "Bearer " + tokenResponse.getToken()).post(Entity.json(realm)); - Assert.assertEquals(201, response.getStatus()); - response.close(); - } -} diff --git a/services/src/test/java/org/keycloak/test/common/AbstractKeycloakTest.java b/services/src/test/java/org/keycloak/test/common/AbstractKeycloakTest.java old mode 100644 new mode 100755 index baaa9f665d2..0656f981b8d --- a/services/src/test/java/org/keycloak/test/common/AbstractKeycloakTest.java +++ b/services/src/test/java/org/keycloak/test/common/AbstractKeycloakTest.java @@ -24,9 +24,9 @@ public abstract class AbstractKeycloakTest { protected static final SessionFactoryTestContext[] TEST_CONTEXTS; private final SessionFactoryTestContext testContext; - private KeycloakSessionFactory factory; - private KeycloakSession identitySession; - private RealmManager realmManager; + protected KeycloakSessionFactory factory; + protected KeycloakSession identitySession; + protected RealmManager realmManager; // STATIC METHODS diff --git a/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java b/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java old mode 100644 new mode 100755 index 6dd52b7ed89..b7f23186683 --- a/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java +++ b/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java @@ -37,17 +37,12 @@ import org.jboss.resteasy.jwt.JsonSerialization; import org.jboss.resteasy.logging.Logger; import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer; import org.jboss.resteasy.spi.ResteasyDeployment; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.KeycloakSessionFactory; -import org.keycloak.models.RealmModel; -import org.keycloak.models.RoleModel; -import org.keycloak.models.UserModel; -import org.keycloak.representations.idm.CredentialRepresentation; +import org.keycloak.models.*; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.services.filters.KeycloakSessionServletFilter; +import org.keycloak.services.managers.ApplianceBootstrap; import org.keycloak.services.managers.RealmManager; import org.keycloak.services.resources.KeycloakApplication; -import org.keycloak.services.resources.SaasService; /** * @author Stian Thorgersen @@ -211,24 +206,11 @@ public class KeycloakServer { try { RealmManager manager = new RealmManager(session); - if (manager.getRealm(RealmModel.DEFAULT_REALM) != null) { + if (manager.getRealm(Constants.ADMIN_REALM) != null) { return; } - RealmModel defaultRealm = manager.createRealm(RealmModel.DEFAULT_REALM, RealmModel.DEFAULT_REALM); - defaultRealm.setName(RealmModel.DEFAULT_REALM); - defaultRealm.setEnabled(true); - defaultRealm.setTokenLifespan(300); - defaultRealm.setAccessCodeLifespan(60); - defaultRealm.setAccessCodeLifespanUserAction(600); - defaultRealm.setSslNotRequired(true); - defaultRealm.setCookieLoginAllowed(true); - defaultRealm.setRegistrationAllowed(true); - manager.generateRealmKeys(defaultRealm); - defaultRealm.addRequiredCredential(CredentialRepresentation.PASSWORD); - defaultRealm.addRole(SaasService.REALM_CREATOR_ROLE); - defaultRealm.addDefaultRole(SaasService.REALM_CREATOR_ROLE); - + new ApplianceBootstrap().bootstrap(session); session.getTransaction().commit(); } finally { session.close(); diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/KeycloakRule.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/KeycloakRule.java index 7de8741e0ca..010b1cccff2 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/KeycloakRule.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/rule/KeycloakRule.java @@ -32,6 +32,7 @@ import javax.servlet.Servlet; import org.jboss.resteasy.jwt.JsonSerialization; import org.junit.rules.ExternalResource; +import org.keycloak.models.Constants; import org.keycloak.models.KeycloakSession; import org.keycloak.models.RealmModel; import org.keycloak.representations.idm.RealmRepresentation; @@ -104,10 +105,10 @@ public class KeycloakRule extends ExternalResource { try { RealmManager manager = new RealmManager(session); - RealmModel defaultRealm = manager.getRealm(RealmModel.DEFAULT_REALM); + RealmModel adminstrationRealm = manager.getRealm(Constants.ADMIN_REALM); RealmModel appRealm = manager.getRealm("test"); - configurer.config(manager, defaultRealm, appRealm); + configurer.config(manager, null, appRealm); session.getTransaction().commit(); } finally { @@ -117,7 +118,7 @@ public class KeycloakRule extends ExternalResource { public interface KeycloakSetup { - void config(RealmManager manager, RealmModel defaultRealm, RealmModel appRealm); + void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm); }