From da99042e82bad4eece41921bfba30e2ac25b7428 Mon Sep 17 00:00:00 2001 From: Marcos Pereira Jr Date: Tue, 13 Feb 2024 16:00:31 -0300 Subject: [PATCH 1/3] fix: deprecate entitlement --- src/keycloak/keycloak_openid.py | 2 +- tests/test_keycloak_admin.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/keycloak/keycloak_openid.py b/src/keycloak/keycloak_openid.py index 7884699..bb52ea2 100644 --- a/src/keycloak/keycloak_openid.py +++ b/src/keycloak/keycloak_openid.py @@ -477,7 +477,7 @@ class KeycloakOpenID: params_path = {"realm-name": self.realm_name, "resource-server-id": resource_server_id} data_raw = self.connection.raw_get(URL_ENTITLEMENT.format(**params_path)) - if data_raw.status_code == 404: + if data_raw.status_code == 404 or data_raw.status_code == 405: return raise_error_from_response(data_raw, KeycloakDeprecationError) return raise_error_from_response(data_raw, KeycloakGetError) # pragma: no cover diff --git a/tests/test_keycloak_admin.py b/tests/test_keycloak_admin.py index c5aa6ff..0c6c65a 100644 --- a/tests/test_keycloak_admin.py +++ b/tests/test_keycloak_admin.py @@ -660,14 +660,14 @@ def test_groups(admin: KeycloakAdmin, user: str): # Test get groups again groups = admin.get_groups() assert len(groups) == 1, groups - assert len(groups[0]["subGroups"]) == 2, groups["subGroups"] + assert len(groups[0]["subGroups"]) == 2, groups[0]["subGroups"] assert groups[0]["id"] == group_id assert {x["id"] for x in groups[0]["subGroups"]} == {subgroup_id_1, subgroup_id_2} # Test get groups query groups = admin.get_groups(query={"max": 10}) assert len(groups) == 1, groups - assert len(groups[0]["subGroups"]) == 2, groups["subGroups"] + assert len(groups[0]["subGroups"]) == 2, groups[0]["subGroups"] assert groups[0]["id"] == group_id assert {x["id"] for x in groups[0]["subGroups"]} == {subgroup_id_1, subgroup_id_2} From 039cd75c2a791bc865c3bd32717c94e8e47f779b Mon Sep 17 00:00:00 2001 From: Marcos Pereira Jr Date: Tue, 13 Feb 2024 17:01:39 -0300 Subject: [PATCH 2/3] fix: depracated endpoint and fix groups services. --- src/keycloak/keycloak_admin.py | 40 ++++++++++++++++++++++++++++++---- tests/test_keycloak_admin.py | 3 ++- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/keycloak/keycloak_admin.py b/src/keycloak/keycloak_admin.py index 87ad78f..e5db618 100644 --- a/src/keycloak/keycloak_admin.py +++ b/src/keycloak/keycloak_admin.py @@ -1286,9 +1286,15 @@ class KeycloakAdmin: url = urls_patterns.URL_ADMIN_GROUPS.format(**params_path) if "first" in query or "max" in query: - return self.__fetch_paginated(url, query) + groups = self.__fetch_paginated(url, query) + groups = self.__fetch_all(url, query) - return self.__fetch_all(url, query) + # For version +23.0.0 + for group in groups: + if group.get("subGroupCount"): + group["subGroups"] = self.get_group_children(group.get('id')) + + return groups def get_group(self, group_id): """Get group by id. @@ -1304,8 +1310,17 @@ class KeycloakAdmin: :rtype: dict """ params_path = {"realm-name": self.connection.realm_name, "id": group_id} - data_raw = self.connection.raw_get(urls_patterns.URL_ADMIN_GROUP.format(**params_path)) - return raise_error_from_response(data_raw, KeycloakGetError) + response = self.connection.raw_get(urls_patterns.URL_ADMIN_GROUP.format(**params_path)) + + if response.status_code >= 400: + return raise_error_from_response(response, KeycloakGetError) + + # For version +23.0.0 + group = response.json() + if group.get("subGroupCount"): + group["subGroups"] = self.get_group_children(group.get('id')) + + return group def get_subgroups(self, group, path): """Get subgroups. @@ -1333,6 +1348,23 @@ class KeycloakAdmin: # went through the tree without hits return None + def get_group_children(self, group_id): + """Get group children by id. + + Returns full group details + + GroupRepresentation + https://www.keycloak.org/docs-api/18.0/rest-api/#_grouprepresentation + + :param group_id: The group id + :type group_id: str + :return: Keycloak server response (GroupRepresentation) + :rtype: dict + """ + params_path = {"realm-name": self.connection.realm_name, "id": group_id} + data_raw = self.connection.raw_get(urls_patterns.URL_ADMIN_GROUP_CHILD.format(**params_path)) + return raise_error_from_response(data_raw, KeycloakGetError) + def get_group_members(self, group_id, query=None): """Get members by group id. diff --git a/tests/test_keycloak_admin.py b/tests/test_keycloak_admin.py index 0c6c65a..7e6aa6a 100644 --- a/tests/test_keycloak_admin.py +++ b/tests/test_keycloak_admin.py @@ -687,7 +687,8 @@ def test_groups(admin: KeycloakAdmin, user: str): main_group = admin.get_group(group_id=group_id) # Test nested searches - res = admin.get_subgroups(group=main_group, path="/main-group/subgroup-2/subsubgroup-1") + subgroup_2 = admin.get_group(group_id=subgroup_id_2) + res = admin.get_subgroups(group=subgroup_2, path="/main-group/subgroup-2/subsubgroup-1") assert res is not None, res assert res["id"] == subsubgroup_id_1 From 16eec6131e88b62f6dbe120788f65f564b553862 Mon Sep 17 00:00:00 2001 From: Marcos Pereira Jr Date: Tue, 13 Feb 2024 17:08:53 -0300 Subject: [PATCH 3/3] fix: linter check. --- src/keycloak/keycloak_admin.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/keycloak/keycloak_admin.py b/src/keycloak/keycloak_admin.py index e5db618..86649fc 100644 --- a/src/keycloak/keycloak_admin.py +++ b/src/keycloak/keycloak_admin.py @@ -1292,7 +1292,7 @@ class KeycloakAdmin: # For version +23.0.0 for group in groups: if group.get("subGroupCount"): - group["subGroups"] = self.get_group_children(group.get('id')) + group["subGroups"] = self.get_group_children(group.get("id")) return groups @@ -1318,7 +1318,7 @@ class KeycloakAdmin: # For version +23.0.0 group = response.json() if group.get("subGroupCount"): - group["subGroups"] = self.get_group_children(group.get('id')) + group["subGroups"] = self.get_group_children(group.get("id")) return group @@ -1351,10 +1351,7 @@ class KeycloakAdmin: def get_group_children(self, group_id): """Get group children by id. - Returns full group details - - GroupRepresentation - https://www.keycloak.org/docs-api/18.0/rest-api/#_grouprepresentation + Returns full group children details :param group_id: The group id :type group_id: str @@ -1362,7 +1359,9 @@ class KeycloakAdmin: :rtype: dict """ params_path = {"realm-name": self.connection.realm_name, "id": group_id} - data_raw = self.connection.raw_get(urls_patterns.URL_ADMIN_GROUP_CHILD.format(**params_path)) + data_raw = self.connection.raw_get( + urls_patterns.URL_ADMIN_GROUP_CHILD.format(**params_path) + ) return raise_error_from_response(data_raw, KeycloakGetError) def get_group_members(self, group_id, query=None):