From 7e6699cb1d606f26cb3f336e05b8dae2acec51eb Mon Sep 17 00:00:00 2001 From: ChowRex Date: Mon, 27 May 2024 09:03:21 +0800 Subject: [PATCH 1/2] Add a new property of `Crowd` class - Fix `lxml` CVE, using `bs4` to replace. - Add a property for Crowd class to retrieves full details of all group memberships. --- atlassian/crowd.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/atlassian/crowd.py b/atlassian/crowd.py index f9548c841..f0ffe17d2 100644 --- a/atlassian/crowd.py +++ b/atlassian/crowd.py @@ -2,6 +2,7 @@ import logging from jmespath import search +from bs4 import BeautifulSoup from .rest_client import AtlassianRestAPI @@ -264,3 +265,21 @@ def update_plugin_license(self, plugin_key, raw_license): url = "/plugins/1.0/{plugin_key}/license".format(plugin_key=plugin_key) data = {"rawLicense": raw_license} return self.put(url, data=data, headers=app_headers) + + @property + def memberships(self): + """ + Retrieves full details of all group memberships, with users and nested groups. + See: https://docs.atlassian.com/atlassian-crowd/5.3.1/REST/#usermanagement/1/group-getAllMemberships + :return: All membership mapping dict + """ + path = self._crowd_api_url("usermanagement", "group/membership") + headers = {'Accept': 'application/xml'} + response = self.get(path, headers=headers) + soup = BeautifulSoup(response, 'xml') + memberships = {} + for membership in soup.find_all('membership'): + group = membership['group'] + users = [user['name'] for user in membership.find_all('user')] + memberships[group] = users + return memberships From 65f655c3a549816272bc94a0d7fcf66da3d7f71f Mon Sep 17 00:00:00 2001 From: ChowRex Date: Mon, 27 May 2024 09:17:14 +0800 Subject: [PATCH 2/2] Fix `black` test Using `double-quotes` to replace `single-quotes`. --- atlassian/crowd.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/atlassian/crowd.py b/atlassian/crowd.py index f0ffe17d2..8ebf2b85c 100644 --- a/atlassian/crowd.py +++ b/atlassian/crowd.py @@ -274,12 +274,12 @@ def memberships(self): :return: All membership mapping dict """ path = self._crowd_api_url("usermanagement", "group/membership") - headers = {'Accept': 'application/xml'} + headers = {"Accept": "application/xml"} response = self.get(path, headers=headers) - soup = BeautifulSoup(response, 'xml') + soup = BeautifulSoup(response, "xml") memberships = {} - for membership in soup.find_all('membership'): - group = membership['group'] - users = [user['name'] for user in membership.find_all('user')] + for membership in soup.find_all("membership"): + group = membership["group"] + users = [user["name"] for user in membership.find_all("user")] memberships[group] = users return memberships