From 0684c159c489a798412a6faf019e3511775617bb Mon Sep 17 00:00:00 2001 From: Alexander Else Date: Mon, 14 Jan 2019 10:30:07 +1100 Subject: [PATCH 1/9] Bump major version due to incompatibility with python 3.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 05feccd..e9c8f71 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ name='Crowd', license='BSD', py_modules=['crowd'], - version='1.1.1', + version='2.0.0', install_requires=['requests', 'lxml'], description='A python client to the Atlassian Crowd REST API', From 8606ac1f5a73b072e68c827860f649c978631ed7 Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Fri, 31 May 2019 11:19:46 +0200 Subject: [PATCH 2/9] Fix an error when appending the validationFactors "X-Forwarded-For" --- crowd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 crowd.py diff --git a/crowd.py b/crowd.py old mode 100644 new mode 100755 index ecd3fd9..14c114d --- a/crowd.py +++ b/crowd.py @@ -281,7 +281,7 @@ def validate_session(self, token, remote="127.0.0.1", proxy=None): } if proxy: - params["validation-factors"]["validationFactors"].append({"name": "X-Forwarded-For", "value": proxy, }) + params["validationFactors"].append({"name": "X-Forwarded-For", "value": proxy, }) url = self.rest_url + "/session/%s" % token response = self._post(url, data=json.dumps(params), params={"expand": "user"}) From 70b0492481f38179c0801a4c416fadc748ae580f Mon Sep 17 00:00:00 2001 From: Maiko Bossuyt Date: Fri, 31 May 2019 11:21:07 +0200 Subject: [PATCH 3/9] Bump version and change to contributors list --- README.rst | 1 + setup.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 README.rst mode change 100644 => 100755 setup.py diff --git a/README.rst b/README.rst old mode 100644 new mode 100755 index 474b86a..701d530 --- a/README.rst +++ b/README.rst @@ -96,3 +96,4 @@ to the end of this list and include the change in your pull request. * Attila Bogár (@attilabogar) * Jascha Geerds (@jgeerds) * John Christian (@potus98) +* Maiko Bossuyt (@maiko) diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index 575d219..348fe9c --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ name='Crowd', license='BSD', py_modules=['crowd'], - version='2.0.0', + version='2.0.1', install_requires=['requests', 'lxml'], description='A python client to the Atlassian Crowd REST API', From 4ee219b9fd795f919f6aeb33de7a36f84ca96680 Mon Sep 17 00:00:00 2001 From: Alexander Else Date: Sat, 12 Oct 2019 11:53:27 +1100 Subject: [PATCH 4/9] Minimum python3 requirement is 3.5 --- .travis.yml | 3 ++- setup.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3eb9be2..2b4c9c3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: python python: - - "3.4" + - "3.7" + - "3.5" - "2.7" install: - pip install . diff --git a/setup.py b/setup.py index 348fe9c..7dca2d7 100755 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 2.7", - "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Systems Administration :: Authentication/Directory", ] From a72992088053d573dfc5c5becf6cc99ddc35e0a1 Mon Sep 17 00:00:00 2001 From: Alexander Else Date: Sat, 12 Oct 2019 12:01:53 +1100 Subject: [PATCH 5/9] Bump version 3.0.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 7dca2d7..e2f90b8 100755 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ name='Crowd', license='BSD', py_modules=['crowd'], - version='2.0.1', + version='3.0.0', install_requires=['requests', 'lxml'], description='A python client to the Atlassian Crowd REST API', From bed7462304e56809ee590fe5fecb45ca4500230a Mon Sep 17 00:00:00 2001 From: Alexander Else Date: Sat, 12 Oct 2019 12:04:43 +1100 Subject: [PATCH 6/9] Build for python 3.6 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 2b4c9c3..6fce01b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,7 @@ language: python python: - "3.7" + - "3.6" - "3.5" - "2.7" install: From f3cb7c82bdc4c90bfecd36150dad1a70f800396d Mon Sep 17 00:00:00 2001 From: Alexander Else Date: Thu, 17 Oct 2019 10:59:20 +1100 Subject: [PATCH 7/9] Build for python 3.8 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6fce01b..64e95dd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: python python: + - "3.8" - "3.7" - "3.6" - "3.5" From 333d24d6c044d1d7cb0a1cc77e46a2e2bb84d767 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 29 Apr 2021 19:08:22 +0000 Subject: [PATCH 8/9] Upgrade to GitHub-native Dependabot --- .github/dependabot.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..14bd311 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: +- package-ecosystem: pip + directory: "/" + schedule: + interval: daily + time: "11:00" + open-pull-requests-limit: 1 From d31079259755d7f38d8d2b7a7193e3427736b1d4 Mon Sep 17 00:00:00 2001 From: Oleg Sinilo Date: Tue, 30 Nov 2021 17:08:18 +0300 Subject: [PATCH 9/9] feature: add get_cookie_conf, group methods / refactoring --- .gitignore | 1 + README.rst | 1 + crowd.py | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++-- setup.py | 2 +- 4 files changed, 168 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 0d20b64..a17907e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.pyc +dist/ \ No newline at end of file diff --git a/README.rst b/README.rst index 701d530..c3b4fb5 100755 --- a/README.rst +++ b/README.rst @@ -97,3 +97,4 @@ to the end of this list and include the change in your pull request. * Jascha Geerds (@jgeerds) * John Christian (@potus98) * Maiko Bossuyt (@maiko) +* Oleg Sinilo (@GoRoSfan) diff --git a/crowd.py b/crowd.py index 14c114d..fa05387 100755 --- a/crowd.py +++ b/crowd.py @@ -318,6 +318,21 @@ def terminate_session(self, token): # Otherwise return True return True + def get_cookie_conf(self): + """Retrieve cookie configuration + + Returns: + dict: conf information + None: if failure occurred + + """ + response = self._get(self.rest_url + "/config/cookie") + + if not response.ok: + return None + + return response.json() + def add_user(self, username, raise_on_error=False, **kwargs): """Add a user to the directory @@ -459,6 +474,143 @@ def set_user_attribute(self, username, attribute, value, raise_on_error=False): return False + def create_group(self, name, description='', raise_on_error=False): + """Create a new group with the . + + Args: + name (str): the group name of a new group + + Returns: + None: if succeeded + error msg (str): If unsuccessful + + """ + data = { + "name": name, + "description": description, + "type": "GROUP", + "active": True + } + response = self._post(self.rest_url + "/group", data=json.dumps(data)) + if response.status_code == 201: + return + + if raise_on_error: + raise RuntimeError(response.json()['message']) + + return response.json()['message'] + + def remove_group(self, name, raise_on_error=False): + """Remove a group with the . + + Args: + name (str): the group name of a removed group + + Returns: + None: If succeeded + error msg (str): If unsuccessful + + """ + data = { + "groupname": name + } + response = self._delete(self.rest_url + "/group", params=data) + if response.status_code == 204: + return + + if raise_on_error: + raise RuntimeError(response.json()['message']) + + return response.json()['message'] + + def update_group(self, name, data, raise_on_error=False): + """Update a group with the . + + Args: + name (str): the group name of a removed group + data (dict): new group attrs + + Returns: + None: if succeeded + error msg (str): If unsuccessful + + """ + params = { + 'groupname': name + } + data["name"] = name + data["type"] = "GROUP" + + response = self._put( + self.rest_url + "/group", params=params, data=json.dumps(data) + ) + if response.status_code == 200: + return + + if raise_on_error: + raise RuntimeError(response.json()['message']) + + return response.json()['message'] + + def add_child_group(self, name, parent, raise_on_error=False): + """Add a child group with the to group. + + Args: + name (str): the name of a child group + parent (str): the name of a parent group + + Returns: + None: if succeeded + error msg (str): If unsuccessful + + """ + params = { + 'groupname': parent + } + data = { + "name": name + } + response = self._post( + self.rest_url + "/group/child-group/direct", + data=json.dumps(data), + params=params + ) + if response.status_code == 201: + return + + if raise_on_error: + raise RuntimeError(response.json()['message']) + + return response.json()['message'] + + def remove_child_group(self, name, parent, raise_on_error=False): + """Add a child group with the to group. + + Args: + name (str): the name of a child group + parent (str): the name of a parent group + + Returns: + None: if succeeded + error msg (str): If unsuccessful + + """ + params = { + 'groupname': parent, + 'child-groupname': name + } + response = self._delete( + self.rest_url + "/group/child-group/direct", + params=params + ) + if response.status_code == 204: + return + + if raise_on_error: + raise RuntimeError(response.json()['message']) + + return response.json()['message'] + def add_user_to_group(self, username, groupname, raise_on_error=False): """Add a user to a group :param username: The username to assign to the group @@ -483,9 +635,9 @@ def add_user_to_group(self, username, groupname, raise_on_error=False): def remove_user_from_group(self, username, groupname, raise_on_error=False): """Remove a user from a group - Attempts to remove a user from a group + Attempts to remove a user from a group - Args + Args: username: The username to remove from the group. groupname: The group name to be removed from the user. @@ -494,7 +646,13 @@ def remove_user_from_group(self, username, groupname, raise_on_error=False): False: If unsuccessful """ - response = self._delete(self.rest_url + "/group/user/direct",params={"username": username, "groupname": groupname}) + response = self._delete( + self.rest_url + "/group/user/direct", + params={ + "username": username, + "groupname": groupname + } + ) if response.status_code == 204: return True @@ -567,7 +725,8 @@ def get_groups(self, username): return [g['name'] for g in response.json()['groups']] def get_nested_groups(self, username): - """Retrieve a list of all group names that have as a direct or indirect member. + """Retrieve a list of all group names that have as a direct + or indirect member. Args: username: The account username. @@ -587,7 +746,8 @@ def get_nested_groups(self, username): return [g['name'] for g in response.json()['groups']] def get_nested_group_users(self, groupname): - """Retrieves a list of all users that directly or indirectly belong to the given groupname. + """Retrieves a list of all users that directly or indirectly belong to + the given groupname. Args: groupname: The group name. diff --git a/setup.py b/setup.py index e2f90b8..5e311e0 100755 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ name='Crowd', license='BSD', py_modules=['crowd'], - version='3.0.0', + version='3.1.0', install_requires=['requests', 'lxml'], description='A python client to the Atlassian Crowd REST API',