Skip to content

Commit 95bf912

Browse files
vramikhmlnarik
authored andcommitted
KEYCLOAK-18035 Fix update client with default default scope assigned as optional
1 parent b071be7 commit 95bf912

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

model/jpa/src/main/java/org/keycloak/models/jpa/JpaRealmProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,8 @@ public void addClientScopes(RealmModel realm, ClientModel client, Set<ClientScop
868868
// Defaults to openid-connect
869869
String clientProtocol = client.getProtocol() == null ? OIDCLoginProtocol.LOGIN_PROTOCOL : client.getProtocol();
870870

871-
Map<String, ClientScopeModel> existingClientScopes = getClientScopes(realm, client, defaultScope);
871+
Map<String, ClientScopeModel> existingClientScopes = getClientScopes(realm, client, true);
872+
existingClientScopes.putAll(getClientScopes(realm, client, false));
872873

873874
clientScopes.stream()
874875
.filter(clientScope -> ! existingClientScopes.containsKey(clientScope.getName()))

model/map/src/main/java/org/keycloak/models/map/client/MapClientProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,8 @@ public void addClientScopes(RealmModel realm, ClientModel client, Set<ClientScop
298298

299299
LOG.tracef("addClientScopes(%s, %s, %s, %b)%s", realm, client, clientScopes, defaultScope, getShortStackTrace());
300300

301-
Map<String, ClientScopeModel> existingClientScopes = getClientScopes(realm, client, defaultScope);
301+
Map<String, ClientScopeModel> existingClientScopes = getClientScopes(realm, client, true);
302+
existingClientScopes.putAll(getClientScopes(realm, client, false));
302303

303304
clientScopes.stream()
304305
.filter(clientScope -> ! existingClientScopes.containsKey(clientScope.getName()))

testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/admin/client/ClientScopeTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,42 @@ public void testUpdateProtocolMappers() {
506506
clientScopes().get(scopeId).remove();
507507
}
508508

509+
@Test
510+
public void updateClientWithDefaultScopeAssignedAsOptionalAndOpposite() {
511+
// create client
512+
ClientRepresentation clientRep = new ClientRepresentation();
513+
clientRep.setClientId("bar-client");
514+
clientRep.setProtocol("openid-connect");
515+
String clientUuid = createClient(clientRep);
516+
getCleanup().addClientUuid(clientUuid);
517+
518+
// Create 2 client scopes
519+
ClientScopeRepresentation scopeRep = new ClientScopeRepresentation();
520+
scopeRep.setName("scope-def");
521+
scopeRep.setProtocol("openid-connect");
522+
String scopeDefId = createClientScope(scopeRep);
523+
getCleanup().addClientScopeId(scopeDefId);
524+
525+
scopeRep = new ClientScopeRepresentation();
526+
scopeRep.setName("scope-opt");
527+
scopeRep.setProtocol("openid-connect");
528+
String scopeOptId = createClientScope(scopeRep);
529+
getCleanup().addClientScopeId(scopeOptId);
530+
531+
// assign "scope-def" as optional client scope to client
532+
testRealmResource().clients().get(clientUuid).addOptionalClientScope(scopeDefId);
533+
534+
// assign "scope-opt" as default client scope to client
535+
testRealmResource().clients().get(clientUuid).addDefaultClientScope(scopeOptId);
536+
537+
// Add scope-def as default and scope-opt as optional client scope within the realm
538+
testRealmResource().addDefaultDefaultClientScope(scopeDefId);
539+
testRealmResource().addDefaultOptionalClientScope(scopeOptId);
540+
541+
//update client - check it passes (it used to throw ModelDuplicateException before)
542+
clientRep.setDescription("new_description");
543+
testRealmResource().clients().get(clientUuid).update(clientRep);
544+
}
509545

510546
private ClientScopesResource clientScopes() {
511547
return testRealmResource().clientScopes();

0 commit comments

Comments
 (0)