keycloak-uncached
Merge pull request #3383 from ssilvert/duplicate-fed-provider KEYCLOAK-2892: …
10/19/2016 6:40:58 PM
Changes
Details
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationProviderResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationProviderResource.java
index f8cb9e1..54ab772 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationProviderResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationProviderResource.java
@@ -26,6 +26,8 @@ import org.keycloak.mappers.UserFederationMapper;
import org.keycloak.mappers.UserFederationMapperFactory;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
+import org.keycloak.models.ModelDuplicateException;
+import org.keycloak.models.ModelException;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserFederationMapperModel;
import org.keycloak.models.UserFederationProvider;
@@ -41,6 +43,7 @@ import org.keycloak.representations.idm.ConfigPropertyRepresentation;
import org.keycloak.representations.idm.UserFederationMapperRepresentation;
import org.keycloak.representations.idm.UserFederationMapperTypeRepresentation;
import org.keycloak.representations.idm.UserFederationProviderRepresentation;
+import org.keycloak.services.ErrorResponse;
import org.keycloak.services.ErrorResponseException;
import org.keycloak.services.ServicesLogger;
import org.keycloak.services.managers.UsersSyncManager;
@@ -99,31 +102,43 @@ public class UserFederationProviderResource {
@PUT
@NoCache
@Consumes(MediaType.APPLICATION_JSON)
- public void updateProviderInstance(UserFederationProviderRepresentation rep) {
+ public Response updateProviderInstance(UserFederationProviderRepresentation rep) {
auth.requireManage();
if (federationProviderModel == null) {
throw new NotFoundException("Could not find federation provider");
}
- String displayName = rep.getDisplayName();
- if (displayName != null && displayName.trim().equals("")) {
- displayName = null;
- }
- UserFederationProviderModel model = new UserFederationProviderModel(rep.getId(), rep.getProviderName(), rep.getConfig(), rep.getPriority(), displayName,
- rep.getFullSyncPeriod(), rep.getChangedSyncPeriod(), rep.getLastSync());
-
- UserFederationProvidersResource.validateFederationProviderConfig(session, auth, realm, model);
+ try {
+ String displayName = rep.getDisplayName();
+ if (displayName != null && displayName.trim().equals("")) {
+ displayName = null;
+ }
+ UserFederationProviderModel model = new UserFederationProviderModel(rep.getId(), rep.getProviderName(), rep.getConfig(), rep.getPriority(), displayName,
+ rep.getFullSyncPeriod(), rep.getChangedSyncPeriod(), rep.getLastSync());
- realm.updateUserFederationProvider(model);
- new UsersSyncManager().notifyToRefreshPeriodicSync(session, realm, model, false);
- boolean kerberosCredsAdded = UserFederationProvidersResource.checkKerberosCredential(session, realm, model);
- if (kerberosCredsAdded) {
- ServicesLogger.LOGGER.addedKerberosToRealmCredentials();
- }
+ UserFederationProvidersResource.validateFederationProviderConfig(session, auth, realm, model);
- adminEvent.operation(OperationType.UPDATE).resourcePath(uriInfo).representation(rep).success();
+ realm.updateUserFederationProvider(model);
+ new UsersSyncManager().notifyToRefreshPeriodicSync(session, realm, model, false);
+ boolean kerberosCredsAdded = UserFederationProvidersResource.checkKerberosCredential(session, realm, model);
+ if (kerberosCredsAdded) {
+ ServicesLogger.LOGGER.addedKerberosToRealmCredentials();
+ }
+ adminEvent.operation(OperationType.UPDATE).resourcePath(uriInfo).representation(rep).success();
+ return Response.noContent().build();
+ } catch (ModelDuplicateException e) {
+ if (session.getTransactionManager().isActive()) {
+ session.getTransactionManager().setRollbackOnly();
+ }
+ return ErrorResponse.exists("Federation provider exists with same name.");
+ } catch (ModelException me) {
+ if (session.getTransactionManager().isActive()) {
+ session.getTransactionManager().setRollbackOnly();
+ }
+ return ErrorResponse.error("Unable to update federation provider.", Response.Status.INTERNAL_SERVER_ERROR);
+ }
}
/**
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationProvidersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationProvidersResource.java
index 4333c93..8a70463 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationProvidersResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationProvidersResource.java
@@ -26,6 +26,8 @@ import org.keycloak.events.admin.ResourceType;
import org.keycloak.mappers.FederationConfigValidationException;
import org.keycloak.models.AuthenticationExecutionModel;
import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.ModelDuplicateException;
+import org.keycloak.models.ModelException;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserFederationProvider;
import org.keycloak.models.UserFederationProviderFactory;
@@ -40,6 +42,7 @@ import org.keycloak.representations.idm.ConfigPropertyRepresentation;
import org.keycloak.representations.idm.CredentialRepresentation;
import org.keycloak.representations.idm.UserFederationProviderFactoryRepresentation;
import org.keycloak.representations.idm.UserFederationProviderRepresentation;
+import org.keycloak.services.ErrorResponse;
import org.keycloak.services.ErrorResponseException;
import org.keycloak.services.ServicesLogger;
import org.keycloak.services.managers.UsersSyncManager;
@@ -196,26 +199,38 @@ public class UserFederationProvidersResource {
public Response createProviderInstance(UserFederationProviderRepresentation rep) {
auth.requireManage();
- String displayName = rep.getDisplayName();
- if (displayName != null && displayName.trim().equals("")) {
- displayName = null;
- }
+ try {
+ String displayName = rep.getDisplayName();
+ if (displayName != null && displayName.trim().equals("")) {
+ displayName = null;
+ }
- UserFederationProviderModel tempModel = new UserFederationProviderModel(null, rep.getProviderName(), rep.getConfig(), rep.getPriority(), displayName, rep.getFullSyncPeriod(), rep.getChangedSyncPeriod(), rep.getLastSync());
- validateFederationProviderConfig(session, auth, realm, tempModel);
+ UserFederationProviderModel tempModel = new UserFederationProviderModel(null, rep.getProviderName(), rep.getConfig(), rep.getPriority(), displayName, rep.getFullSyncPeriod(), rep.getChangedSyncPeriod(), rep.getLastSync());
+ validateFederationProviderConfig(session, auth, realm, tempModel);
- UserFederationProviderModel model = realm.addUserFederationProvider(rep.getProviderName(), rep.getConfig(), rep.getPriority(), displayName,
- rep.getFullSyncPeriod(), rep.getChangedSyncPeriod(), rep.getLastSync());
- new UsersSyncManager().notifyToRefreshPeriodicSync(session, realm, model, false);
- boolean kerberosCredsAdded = checkKerberosCredential(session, realm, model);
- if (kerberosCredsAdded) {
- ServicesLogger.LOGGER.addedKerberosToRealmCredentials();
- }
+ UserFederationProviderModel model = realm.addUserFederationProvider(rep.getProviderName(), rep.getConfig(), rep.getPriority(), displayName,
+ rep.getFullSyncPeriod(), rep.getChangedSyncPeriod(), rep.getLastSync());
+ new UsersSyncManager().notifyToRefreshPeriodicSync(session, realm, model, false);
+ boolean kerberosCredsAdded = checkKerberosCredential(session, realm, model);
+ if (kerberosCredsAdded) {
+ ServicesLogger.LOGGER.addedKerberosToRealmCredentials();
+ }
- rep.setId(model.getId());
- adminEvent.operation(OperationType.CREATE).resourcePath(uriInfo, model.getId()).representation(rep).success();
+ rep.setId(model.getId());
+ adminEvent.operation(OperationType.CREATE).resourcePath(uriInfo, model.getId()).representation(rep).success();
- return Response.created(uriInfo.getAbsolutePathBuilder().path(model.getId()).build()).build();
+ return Response.created(uriInfo.getAbsolutePathBuilder().path(model.getId()).build()).build();
+ } catch (ModelDuplicateException e) {
+ if (session.getTransactionManager().isActive()) {
+ session.getTransactionManager().setRollbackOnly();
+ }
+ return ErrorResponse.exists("Federation provider exists with same name.");
+ } catch (ModelException me){
+ if (session.getTransactionManager().isActive()) {
+ session.getTransactionManager().setRollbackOnly();
+ }
+ return ErrorResponse.error("Could not create federation provider.", Response.Status.INTERNAL_SERVER_ERROR);
+ }
}
/**