Skip to content
Snippets Groups Projects
Verified Commit 5ab3d960 authored by Hugo Renard's avatar Hugo Renard
Browse files

tolerate provider failure

parent 6900f4e6
No related branches found
No related tags found
No related merge requests found
...@@ -2,13 +2,14 @@ package sh.libre.scim.core; ...@@ -2,13 +2,14 @@ package sh.libre.scim.core;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.component.ComponentModel;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import sh.libre.scim.storage.ScimStorageProviderFactory; import sh.libre.scim.storage.ScimStorageProviderFactory;
public class ScimDispatcher { public class ScimDispatcher {
public static final String SCOPE_USER = "user"; public static final String SCOPE_USER = "user";
public static final String SCOPE_GROUP = "group"; public static final String SCOPE_GROUP = "group";
final private KeycloakSession session; final private KeycloakSession session;
final private Logger LOGGER = Logger.getLogger(ScimDispatcher.class); final private Logger LOGGER = Logger.getLogger(ScimDispatcher.class);
...@@ -20,16 +21,21 @@ public class ScimDispatcher { ...@@ -20,16 +21,21 @@ public class ScimDispatcher {
public void run(String scope, Consumer<ScimClient> f) { public void run(String scope, Consumer<ScimClient> f) {
session.getContext().getRealm().getComponentsStream() session.getContext().getRealm().getComponentsStream()
.filter((m) -> { .filter((m) -> {
return ScimStorageProviderFactory.ID.equals(m.getProviderId()) && m.get("enabled").equals("true") && m.get("propagation-"+scope).equals("true"); return ScimStorageProviderFactory.ID.equals(m.getProviderId()) && m.get("enabled").equals("true")
&& m.get("propagation-" + scope).equals("true");
}) })
.forEach(m -> { .forEach(m -> runOne(m, f));
LOGGER.infof("%s %s %s %s", m.getId(), m.getName(), m.getProviderId(), m.getProviderType()); }
var client = new ScimClient(m, session);
try { public void runOne(ComponentModel m, Consumer<ScimClient> f) {
f.accept(client); LOGGER.infof("%s %s %s %s", m.getId(), m.getName(), m.getProviderId(), m.getProviderType());
} finally { var client = new ScimClient(m, session);
client.close(); try {
} f.accept(client);
}); } catch (Exception e) {
LOGGER.error(e);
} finally {
client.close();
}
} }
} }
...@@ -12,7 +12,6 @@ import org.keycloak.component.ComponentModel; ...@@ -12,7 +12,6 @@ import org.keycloak.component.ComponentModel;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory; import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.KeycloakSessionTask; import org.keycloak.models.KeycloakSessionTask;
import org.keycloak.models.RealmModel;
import org.keycloak.models.utils.KeycloakModelUtils; import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.provider.ProviderConfigProperty; import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.provider.ProviderConfigurationBuilder; import org.keycloak.provider.ProviderConfigurationBuilder;
...@@ -22,7 +21,7 @@ import org.keycloak.storage.user.ImportSynchronization; ...@@ -22,7 +21,7 @@ import org.keycloak.storage.user.ImportSynchronization;
import org.keycloak.storage.user.SynchronizationResult; import org.keycloak.storage.user.SynchronizationResult;
import sh.libre.scim.core.GroupAdapter; import sh.libre.scim.core.GroupAdapter;
import sh.libre.scim.core.ScimClient; import sh.libre.scim.core.ScimDispatcher;
import sh.libre.scim.core.UserAdapter; import sh.libre.scim.core.UserAdapter;
public class ScimStorageProviderFactory public class ScimStorageProviderFactory
...@@ -125,16 +124,13 @@ public class ScimStorageProviderFactory ...@@ -125,16 +124,13 @@ public class ScimStorageProviderFactory
@Override @Override
public void run(KeycloakSession session) { public void run(KeycloakSession session) {
RealmModel realm = session.realms().getRealm(realmId); var dispatcher = new ScimDispatcher(session);
session.getContext().setRealm(realm);
var client = new ScimClient(model, session);
if (model.get("propagation-user").equals("true")) { if (model.get("propagation-user").equals("true")) {
client.sync(UserAdapter.class, result); dispatcher.runOne(model, (client) -> client.sync(UserAdapter.class, result));
} }
if (model.get("propagation-group").equals("true")) { if (model.get("propagation-group").equals("true")) {
client.sync(GroupAdapter.class, result); dispatcher.runOne(model, (client) -> client.sync(GroupAdapter.class, result));
} }
client.close();
} }
}); });
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment