Skip to content

Commit

Permalink
fixes #102 where an already deleted realm causes the organization rem…
Browse files Browse the repository at this point in the history
…oved handler to fail (#103)
  • Loading branch information
xgp committed Jun 26, 2023
1 parent 6790b20 commit 6bd4e2c
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 27 deletions.
15 changes: 5 additions & 10 deletions src/main/java/io/phasetwo/service/model/OrganizationProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ Stream<OrganizationModel> searchForOrganizationStream(
// deprecated methods

/**
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method
* instead
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method instead
*/
@Deprecated(forRemoval = true)
default Stream<OrganizationModel> searchForOrganizationByNameStream(
Expand All @@ -54,8 +53,7 @@ default Stream<OrganizationModel> searchForOrganizationByNameStream(
}

/**
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method
* instead
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method instead
*/
@Deprecated(forRemoval = true)
default Stream<OrganizationModel> searchForOrganizationByAttributesStream(
Expand All @@ -65,8 +63,7 @@ default Stream<OrganizationModel> searchForOrganizationByAttributesStream(
}

/**
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method
* instead
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method instead
*/
@Deprecated(forRemoval = true)
default Stream<OrganizationModel> getOrganizationsStream(
Expand All @@ -75,8 +72,7 @@ default Stream<OrganizationModel> getOrganizationsStream(
}

/**
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method
* instead
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method instead
*/
@Deprecated(forRemoval = true)
default Stream<OrganizationModel> getOrganizationsStream(
Expand All @@ -86,8 +82,7 @@ default Stream<OrganizationModel> getOrganizationsStream(
}

/**
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method
* instead
* @deprecated use {@link #searchForOrganizationStream searchForOrganizationStream} method instead
*/
@Deprecated(forRemoval = true)
default Stream<OrganizationModel> getOrganizationsStream(RealmModel realm) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,26 +204,39 @@ private void organizationRemoved(OrganizationModel.OrganizationRemovedEvent even

// remove the idp associations for this org
OrganizationModel org = event.getOrganization();
org.getIdentityProvidersStream()
.forEach(
idp -> {
idp.getConfig().remove(Orgs.ORG_OWNER_CONFIG_KEY);
});
try {
org.getIdentityProvidersStream()
.forEach(
idp -> {
idp.getConfig().remove(Orgs.ORG_OWNER_CONFIG_KEY);
});
} catch (Exception e) {
log.warnf(
"Couldn't remove identity providers on organizationRemoved. Likely because this follows a realmRemoved event. %s",
e.getMessage());
}

// delete default admin user
UserModel user =
event
.getKeycloakSession()
.users()
.getUserByUsername(event.getRealm(), getDefaultAdminUsername(event.getOrganization()));
if (user != null) {
boolean removed = event.getKeycloakSession().users().removeUser(event.getRealm(), user);
log.debugf(
"User removed on deletion of org %s? %b", event.getOrganization().getId(), removed);
} else {
try {
UserModel user =
event
.getKeycloakSession()
.users()
.getUserByUsername(
event.getRealm(), getDefaultAdminUsername(event.getOrganization()));
if (user != null) {
boolean removed = event.getKeycloakSession().users().removeUser(event.getRealm(), user);
log.debugf(
"User removed on deletion of org %s? %b", event.getOrganization().getId(), removed);
} else {
log.warnf(
"Default org admin %s for org %s doesn't exist. Skipping deletion on org removal.",
getDefaultAdminUsername(event.getOrganization()), event.getOrganization().getId());
}
} catch (Exception e) {
log.warnf(
"Default org admin %s for org %s doesn't exist. Skipping deletion on org removal.",
getDefaultAdminUsername(event.getOrganization()), event.getOrganization().getId());
"Couldn't remove default org admin user on organizationRemoved. Likely because this follows a realmRemoved event. %s",
e.getMessage());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,22 @@
@JBossLog
public class OrganizationResourceTest extends AbstractResourceTest {


@Test
public void testRealmRemove() {
try (Keycloak keycloak = server.client()) {
String realm = "foo";
RealmRepresentation r = new RealmRepresentation();
r.setEnabled(true);
r.setRealm(realm);
keycloak.realms().create(r);
PhaseTwo client = phaseTwo();
OrganizationsResource orgsResource = client.organizations(realm);
String id = createDefaultOrg(orgsResource);
keycloak.realms().realm(realm).remove();
}
}

@Test
public void testRealmId() {
try(Keycloak keycloak = server.client()) {
Expand Down

0 comments on commit 6bd4e2c

Please sign in to comment.