pydplus 1.0.0.dev0__tar.gz → 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/PKG-INFO +48 -45
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/README.md +39 -32
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/pyproject.toml +33 -18
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/api.py +13 -13
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/auth.py +57 -60
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/core.py +72 -76
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/credentials.py +30 -37
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/decorators.py +3 -3
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/errors/handlers.py +3 -3
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/users.py +7 -7
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/utils/core_utils.py +18 -18
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/utils/helper.py +5 -5
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/utils/log_utils.py +52 -3
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/utils/version.py +3 -7
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/LICENSE +0 -0
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/__init__.py +0 -0
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/constants.py +0 -0
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/errors/__init__.py +0 -0
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/errors/exceptions.py +0 -0
- {pydplus-1.0.0.dev0 → pydplus-2.0.0}/src/pydplus/utils/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pydplus
|
|
3
|
-
Version:
|
|
3
|
+
Version: 2.0.0
|
|
4
4
|
Summary: A Python toolset for the RSA ID Plus cloud authentication platform
|
|
5
5
|
License: MIT License
|
|
6
6
|
|
|
@@ -23,13 +23,13 @@ License: MIT License
|
|
|
23
23
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
24
24
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
25
25
|
SOFTWARE.
|
|
26
|
-
Keywords: rsa-security,id-plus,securid,authentication-manager,sso,mfa,iam,identity,authentication
|
|
26
|
+
Keywords: rsa-security,id-plus,rsa-id-plus,securid,rsa-securid,authentication-manager,rsa-authentication-manager,cloud-access-service,single-sign-on,sso,mfa,iam,identity,authentication,multifactor-authentication,fido
|
|
27
27
|
Author: Jeff Shurtliff
|
|
28
28
|
Author-email: jeffshurtliff@gmail.com
|
|
29
29
|
Maintainer: Jeff Shurtliff
|
|
30
30
|
Maintainer-email: jeffshurtliff@gmail.com
|
|
31
|
-
Requires-Python: >=3.
|
|
32
|
-
Classifier: Development Status ::
|
|
31
|
+
Requires-Python: >=3.12,<3.14.0
|
|
32
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
33
33
|
Classifier: License :: OSI Approved :: MIT License
|
|
34
34
|
Classifier: License :: Freely Distributable
|
|
35
35
|
Classifier: Intended Audience :: Information Technology
|
|
@@ -47,33 +47,29 @@ Classifier: Topic :: System :: Systems Administration
|
|
|
47
47
|
Classifier: Topic :: System :: Systems Administration :: Authentication/Directory
|
|
48
48
|
Classifier: Programming Language :: Python :: 3
|
|
49
49
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
50
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
51
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
52
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
53
50
|
Classifier: Programming Language :: Python :: 3.12
|
|
54
51
|
Classifier: Programming Language :: Python :: 3.13
|
|
55
52
|
Requires-Dist: PyYAML (>=6.0.3,<7)
|
|
56
53
|
Requires-Dist: certifi (>=2024.7.4)
|
|
57
|
-
Requires-Dist: cryptography (>=
|
|
58
|
-
Requires-Dist: idna (>=3.
|
|
59
|
-
Requires-Dist: pyjwt (>=2.
|
|
54
|
+
Requires-Dist: cryptography (>=48.0.1)
|
|
55
|
+
Requires-Dist: idna (>=3.15,<4)
|
|
56
|
+
Requires-Dist: pyjwt (>=2.13.0)
|
|
60
57
|
Requires-Dist: requests (>=2.32.5)
|
|
61
|
-
Requires-Dist:
|
|
62
|
-
Requires-Dist: urllib3 (>=2.6.3,<3)
|
|
58
|
+
Requires-Dist: urllib3 (>=2.7.0,<3)
|
|
63
59
|
Project-URL: Changelog, https://pydplus.readthedocs.io/en/latest/CHANGELOG.html
|
|
64
|
-
Project-URL: Documentation, https://pydplus.readthedocs.io/en/
|
|
60
|
+
Project-URL: Documentation, https://pydplus.readthedocs.io/en/stable/
|
|
65
61
|
Project-URL: Homepage, https://github.com/jeffshurtliff/pydplus
|
|
66
62
|
Project-URL: Issue Tracker, https://github.com/jeffshurtliff/pydplus/issues
|
|
67
63
|
Project-URL: Repository, https://github.com/jeffshurtliff/pydplus
|
|
68
64
|
Description-Content-Type: text/markdown
|
|
69
65
|
|
|
70
|
-
<img src="docs/_static/pydplus-icon-cropped.png"
|
|
66
|
+
<img src="https://raw.githubusercontent.com/jeffshurtliff/pydplus/main/docs/_static/pydplus-icon-cropped.png"
|
|
71
67
|
class="pydplus-c-landing-page-logo"
|
|
72
68
|
style="background-color: transparent; max-height: 320px;"
|
|
73
|
-
alt="PyDPlus Logo"
|
|
69
|
+
alt="PyDPlus Logo">
|
|
74
70
|
|
|
75
71
|
# PyDPlus
|
|
76
|
-
A Python toolset for the RSA ID Plus cloud authentication platform.
|
|
72
|
+
A Python toolset for the RSA<sup>®</sup> ID Plus cloud authentication platform.
|
|
77
73
|
|
|
78
74
|
<table>
|
|
79
75
|
<tr>
|
|
@@ -85,27 +81,35 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
|
|
|
85
81
|
</td>
|
|
86
82
|
</tr>
|
|
87
83
|
<tr>
|
|
88
|
-
<td>Latest
|
|
84
|
+
<td>Latest Pre-release</td>
|
|
89
85
|
<td>
|
|
90
86
|
<a href="https://pypi.org/project/pydplus/#history">
|
|
91
|
-
<img alt="PyPI" src="https://img.shields.io/badge/pypi-
|
|
87
|
+
<img alt="PyPI" src="https://img.shields.io/badge/pypi-none-blue">
|
|
92
88
|
</a>
|
|
93
89
|
</td>
|
|
94
90
|
</tr>
|
|
95
91
|
<tr>
|
|
96
|
-
<td>
|
|
92
|
+
<td>Supported Versions (Stable Release)</td>
|
|
97
93
|
<td>
|
|
98
|
-
<a href="https://
|
|
99
|
-
<img alt="
|
|
100
|
-
src="https://img.shields.io/github/actions/workflow/status/jeffshurtliff/pydplus/ci.yml?branch=main">
|
|
94
|
+
<a href="https://pypi.org/project/pydplus/">
|
|
95
|
+
<img alt="PyPI - Python Versions Supported (Stable Release)" src="https://img.shields.io/pypi/pyversions/pydplus">
|
|
101
96
|
</a>
|
|
102
97
|
</td>
|
|
103
98
|
</tr>
|
|
104
99
|
<tr>
|
|
105
|
-
|
|
100
|
+
<td>Commits Since Latest Release</td>
|
|
101
|
+
<td>
|
|
102
|
+
<a href="https://github.com/jeffshurtliff/pydplus/compare/2.0.0...HEAD">
|
|
103
|
+
<img alt="GitHub commits since latest release" src="https://img.shields.io/github/commits-since/jeffshurtliff/pydplus/latest">
|
|
104
|
+
</a>
|
|
105
|
+
</td>
|
|
106
|
+
</tr>
|
|
107
|
+
<tr>
|
|
108
|
+
<td>Build Status</td>
|
|
106
109
|
<td>
|
|
107
|
-
<a href="https://
|
|
108
|
-
<img alt="
|
|
110
|
+
<a href="https://github.com/jeffshurtliff/pydplus/blob/main/.github/workflows/ci.yml">
|
|
111
|
+
<img alt="GitHub Workflow Status"
|
|
112
|
+
src="https://img.shields.io/github/actions/workflow/status/jeffshurtliff/pydplus/ci.yml?branch=main">
|
|
109
113
|
</a>
|
|
110
114
|
</td>
|
|
111
115
|
</tr>
|
|
@@ -113,15 +117,15 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
|
|
|
113
117
|
<td>Code Coverage</td>
|
|
114
118
|
<td>
|
|
115
119
|
<a href="https://codecov.io/gh/jeffshurtliff/pydplus">
|
|
116
|
-
<img alt="Codecov - Code Coverage" src="https://codecov.io/gh/jeffshurtliff/pydplus/branch/main/graph/badge.svg?token=QBynJO48jN"
|
|
120
|
+
<img alt="Codecov - Code Coverage" src="https://codecov.io/gh/jeffshurtliff/pydplus/branch/main/graph/badge.svg?token=QBynJO48jN">
|
|
117
121
|
</a>
|
|
118
122
|
</td>
|
|
119
123
|
</tr>
|
|
120
124
|
<tr>
|
|
121
125
|
<td>Documentation</td>
|
|
122
126
|
<td>
|
|
123
|
-
<a href="https://pydplus.readthedocs.io/en/
|
|
124
|
-
<img alt="Documentation Status" src="https://readthedocs.org/projects/pydplus/badge/?version=
|
|
127
|
+
<a href="https://pydplus.readthedocs.io/en/stable/?badge=stable">
|
|
128
|
+
<img alt="Documentation Status" src="https://readthedocs.org/projects/pydplus/badge/?version=stable">
|
|
125
129
|
</a>
|
|
126
130
|
</td>
|
|
127
131
|
</tr>
|
|
@@ -142,30 +146,29 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
|
|
|
142
146
|
</td>
|
|
143
147
|
</tr>
|
|
144
148
|
<tr>
|
|
145
|
-
<td
|
|
149
|
+
<td>Issues</td>
|
|
146
150
|
<td>
|
|
147
151
|
<a href="https://github.com/jeffshurtliff/pydplus/issues">
|
|
148
|
-
<img
|
|
149
|
-
</a>
|
|
150
|
-
<a href="https://github.com/jeffshurtliff/pydplus/issues">
|
|
151
|
-
<img alt="GitHub Closed Issues" src="https://img.shields.io/github/issues-closed-raw/jeffshurtliff/pydplus">
|
|
152
|
+
<img alt="Issues (GitHub)" src="https://img.shields.io/github/issues/jeffshurtliff/pydplus">
|
|
152
153
|
</a>
|
|
153
154
|
</td>
|
|
154
155
|
</tr>
|
|
155
156
|
<tr>
|
|
156
|
-
<td
|
|
157
|
+
<td>Pull Requests</td>
|
|
157
158
|
<td>
|
|
158
159
|
<a href="https://github.com/jeffshurtliff/pydplus/pulls">
|
|
159
|
-
<img
|
|
160
|
-
</a>
|
|
161
|
-
<a href="https://github.com/jeffshurtliff/pydplus/pulls">
|
|
162
|
-
<img alt="GitHub Closed Pull Requests" src="https://img.shields.io/github/issues-pr-closed-raw/jeffshurtliff/pydplus">
|
|
160
|
+
<img alt="Pull Requests (GitHub)" src="https://img.shields.io/github/issues-pr/jeffshurtliff/pydplus">
|
|
163
161
|
</a>
|
|
164
162
|
</td>
|
|
165
163
|
</tr>
|
|
166
164
|
</table>
|
|
167
165
|
|
|
168
166
|
## Installation
|
|
167
|
+
|
|
168
|
+
> [!IMPORTANT]
|
|
169
|
+
> PyDPlus `2.0.0` and newer require Python `3.12+`.<br>
|
|
170
|
+
> PyDPlus `1.0.1` is the final release line that supports Python `3.9`.
|
|
171
|
+
|
|
169
172
|
Install from PyPI:
|
|
170
173
|
|
|
171
174
|
```sh
|
|
@@ -180,8 +183,8 @@ cd pydplus
|
|
|
180
183
|
poetry install
|
|
181
184
|
```
|
|
182
185
|
|
|
183
|
-
##
|
|
184
|
-
The
|
|
186
|
+
## Changelog
|
|
187
|
+
The changelog can be found in the [documentation](https://pydplus.readthedocs.io/en/latest/CHANGELOG.html).
|
|
185
188
|
|
|
186
189
|
## Usage
|
|
187
190
|
PyDPlus is designed for Python-based administration workflows in RSA ID Plus tenants, including:
|
|
@@ -218,7 +221,7 @@ pydp = PyDPlus(
|
|
|
218
221
|
```
|
|
219
222
|
|
|
220
223
|
Legacy API authentication is also supported. See the
|
|
221
|
-
[Authentication](https://pydplus.readthedocs.io/en/
|
|
224
|
+
[Authentication](https://pydplus.readthedocs.io/en/stable/guides/authentication.html) guide for both patterns.
|
|
222
225
|
|
|
223
226
|
### 3) Define OAuth scopes (three practical options)
|
|
224
227
|
|
|
@@ -254,12 +257,12 @@ response = pydp.users.disable_user(user_id=user_id)
|
|
|
254
257
|
|
|
255
258
|
For deeper coverage, see:
|
|
256
259
|
|
|
257
|
-
- Quickstart: <https://pydplus.readthedocs.io/en/
|
|
258
|
-
- Authentication guide: <https://pydplus.readthedocs.io/en/
|
|
259
|
-
- Client reference: <https://pydplus.readthedocs.io/en/
|
|
260
|
+
- Quickstart: <https://pydplus.readthedocs.io/en/stable/getting-started/quickstart.html>
|
|
261
|
+
- Authentication guide: <https://pydplus.readthedocs.io/en/stable/guides/authentication.html>
|
|
262
|
+
- Client reference: <https://pydplus.readthedocs.io/en/stable/reference/client.html>
|
|
260
263
|
|
|
261
264
|
## Documentation
|
|
262
|
-
The documentation is located here: [https://pydplus.readthedocs.io/en/
|
|
265
|
+
The documentation is located here: [https://pydplus.readthedocs.io/en/stable/](https://pydplus.readthedocs.io/en/stable/)
|
|
263
266
|
|
|
264
267
|
## License
|
|
265
268
|
[MIT License](https://github.com/jeffshurtliff/pydplus/blob/main/LICENSE)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
<img src="docs/_static/pydplus-icon-cropped.png"
|
|
1
|
+
<img src="https://raw.githubusercontent.com/jeffshurtliff/pydplus/main/docs/_static/pydplus-icon-cropped.png"
|
|
2
2
|
class="pydplus-c-landing-page-logo"
|
|
3
3
|
style="background-color: transparent; max-height: 320px;"
|
|
4
|
-
alt="PyDPlus Logo"
|
|
4
|
+
alt="PyDPlus Logo">
|
|
5
5
|
|
|
6
6
|
# PyDPlus
|
|
7
|
-
A Python toolset for the RSA ID Plus cloud authentication platform.
|
|
7
|
+
A Python toolset for the RSA<sup>®</sup> ID Plus cloud authentication platform.
|
|
8
8
|
|
|
9
9
|
<table>
|
|
10
10
|
<tr>
|
|
@@ -16,27 +16,35 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
|
|
|
16
16
|
</td>
|
|
17
17
|
</tr>
|
|
18
18
|
<tr>
|
|
19
|
-
<td>Latest
|
|
19
|
+
<td>Latest Pre-release</td>
|
|
20
20
|
<td>
|
|
21
21
|
<a href="https://pypi.org/project/pydplus/#history">
|
|
22
|
-
<img alt="PyPI" src="https://img.shields.io/badge/pypi-
|
|
22
|
+
<img alt="PyPI" src="https://img.shields.io/badge/pypi-none-blue">
|
|
23
23
|
</a>
|
|
24
24
|
</td>
|
|
25
25
|
</tr>
|
|
26
26
|
<tr>
|
|
27
|
-
<td>
|
|
27
|
+
<td>Supported Versions (Stable Release)</td>
|
|
28
28
|
<td>
|
|
29
|
-
<a href="https://
|
|
30
|
-
<img alt="
|
|
31
|
-
src="https://img.shields.io/github/actions/workflow/status/jeffshurtliff/pydplus/ci.yml?branch=main">
|
|
29
|
+
<a href="https://pypi.org/project/pydplus/">
|
|
30
|
+
<img alt="PyPI - Python Versions Supported (Stable Release)" src="https://img.shields.io/pypi/pyversions/pydplus">
|
|
32
31
|
</a>
|
|
33
32
|
</td>
|
|
34
33
|
</tr>
|
|
35
34
|
<tr>
|
|
36
|
-
|
|
35
|
+
<td>Commits Since Latest Release</td>
|
|
36
|
+
<td>
|
|
37
|
+
<a href="https://github.com/jeffshurtliff/pydplus/compare/2.0.0...HEAD">
|
|
38
|
+
<img alt="GitHub commits since latest release" src="https://img.shields.io/github/commits-since/jeffshurtliff/pydplus/latest">
|
|
39
|
+
</a>
|
|
40
|
+
</td>
|
|
41
|
+
</tr>
|
|
42
|
+
<tr>
|
|
43
|
+
<td>Build Status</td>
|
|
37
44
|
<td>
|
|
38
|
-
<a href="https://
|
|
39
|
-
<img alt="
|
|
45
|
+
<a href="https://github.com/jeffshurtliff/pydplus/blob/main/.github/workflows/ci.yml">
|
|
46
|
+
<img alt="GitHub Workflow Status"
|
|
47
|
+
src="https://img.shields.io/github/actions/workflow/status/jeffshurtliff/pydplus/ci.yml?branch=main">
|
|
40
48
|
</a>
|
|
41
49
|
</td>
|
|
42
50
|
</tr>
|
|
@@ -44,15 +52,15 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
|
|
|
44
52
|
<td>Code Coverage</td>
|
|
45
53
|
<td>
|
|
46
54
|
<a href="https://codecov.io/gh/jeffshurtliff/pydplus">
|
|
47
|
-
<img alt="Codecov - Code Coverage" src="https://codecov.io/gh/jeffshurtliff/pydplus/branch/main/graph/badge.svg?token=QBynJO48jN"
|
|
55
|
+
<img alt="Codecov - Code Coverage" src="https://codecov.io/gh/jeffshurtliff/pydplus/branch/main/graph/badge.svg?token=QBynJO48jN">
|
|
48
56
|
</a>
|
|
49
57
|
</td>
|
|
50
58
|
</tr>
|
|
51
59
|
<tr>
|
|
52
60
|
<td>Documentation</td>
|
|
53
61
|
<td>
|
|
54
|
-
<a href="https://pydplus.readthedocs.io/en/
|
|
55
|
-
<img alt="Documentation Status" src="https://readthedocs.org/projects/pydplus/badge/?version=
|
|
62
|
+
<a href="https://pydplus.readthedocs.io/en/stable/?badge=stable">
|
|
63
|
+
<img alt="Documentation Status" src="https://readthedocs.org/projects/pydplus/badge/?version=stable">
|
|
56
64
|
</a>
|
|
57
65
|
</td>
|
|
58
66
|
</tr>
|
|
@@ -73,30 +81,29 @@ A Python toolset for the RSA ID Plus cloud authentication platform.
|
|
|
73
81
|
</td>
|
|
74
82
|
</tr>
|
|
75
83
|
<tr>
|
|
76
|
-
<td
|
|
84
|
+
<td>Issues</td>
|
|
77
85
|
<td>
|
|
78
86
|
<a href="https://github.com/jeffshurtliff/pydplus/issues">
|
|
79
|
-
<img
|
|
80
|
-
</a>
|
|
81
|
-
<a href="https://github.com/jeffshurtliff/pydplus/issues">
|
|
82
|
-
<img alt="GitHub Closed Issues" src="https://img.shields.io/github/issues-closed-raw/jeffshurtliff/pydplus">
|
|
87
|
+
<img alt="Issues (GitHub)" src="https://img.shields.io/github/issues/jeffshurtliff/pydplus">
|
|
83
88
|
</a>
|
|
84
89
|
</td>
|
|
85
90
|
</tr>
|
|
86
91
|
<tr>
|
|
87
|
-
<td
|
|
92
|
+
<td>Pull Requests</td>
|
|
88
93
|
<td>
|
|
89
94
|
<a href="https://github.com/jeffshurtliff/pydplus/pulls">
|
|
90
|
-
<img
|
|
91
|
-
</a>
|
|
92
|
-
<a href="https://github.com/jeffshurtliff/pydplus/pulls">
|
|
93
|
-
<img alt="GitHub Closed Pull Requests" src="https://img.shields.io/github/issues-pr-closed-raw/jeffshurtliff/pydplus">
|
|
95
|
+
<img alt="Pull Requests (GitHub)" src="https://img.shields.io/github/issues-pr/jeffshurtliff/pydplus">
|
|
94
96
|
</a>
|
|
95
97
|
</td>
|
|
96
98
|
</tr>
|
|
97
99
|
</table>
|
|
98
100
|
|
|
99
101
|
## Installation
|
|
102
|
+
|
|
103
|
+
> [!IMPORTANT]
|
|
104
|
+
> PyDPlus `2.0.0` and newer require Python `3.12+`.<br>
|
|
105
|
+
> PyDPlus `1.0.1` is the final release line that supports Python `3.9`.
|
|
106
|
+
|
|
100
107
|
Install from PyPI:
|
|
101
108
|
|
|
102
109
|
```sh
|
|
@@ -111,8 +118,8 @@ cd pydplus
|
|
|
111
118
|
poetry install
|
|
112
119
|
```
|
|
113
120
|
|
|
114
|
-
##
|
|
115
|
-
The
|
|
121
|
+
## Changelog
|
|
122
|
+
The changelog can be found in the [documentation](https://pydplus.readthedocs.io/en/latest/CHANGELOG.html).
|
|
116
123
|
|
|
117
124
|
## Usage
|
|
118
125
|
PyDPlus is designed for Python-based administration workflows in RSA ID Plus tenants, including:
|
|
@@ -149,7 +156,7 @@ pydp = PyDPlus(
|
|
|
149
156
|
```
|
|
150
157
|
|
|
151
158
|
Legacy API authentication is also supported. See the
|
|
152
|
-
[Authentication](https://pydplus.readthedocs.io/en/
|
|
159
|
+
[Authentication](https://pydplus.readthedocs.io/en/stable/guides/authentication.html) guide for both patterns.
|
|
153
160
|
|
|
154
161
|
### 3) Define OAuth scopes (three practical options)
|
|
155
162
|
|
|
@@ -185,12 +192,12 @@ response = pydp.users.disable_user(user_id=user_id)
|
|
|
185
192
|
|
|
186
193
|
For deeper coverage, see:
|
|
187
194
|
|
|
188
|
-
- Quickstart: <https://pydplus.readthedocs.io/en/
|
|
189
|
-
- Authentication guide: <https://pydplus.readthedocs.io/en/
|
|
190
|
-
- Client reference: <https://pydplus.readthedocs.io/en/
|
|
195
|
+
- Quickstart: <https://pydplus.readthedocs.io/en/stable/getting-started/quickstart.html>
|
|
196
|
+
- Authentication guide: <https://pydplus.readthedocs.io/en/stable/guides/authentication.html>
|
|
197
|
+
- Client reference: <https://pydplus.readthedocs.io/en/stable/reference/client.html>
|
|
191
198
|
|
|
192
199
|
## Documentation
|
|
193
|
-
The documentation is located here: [https://pydplus.readthedocs.io/en/
|
|
200
|
+
The documentation is located here: [https://pydplus.readthedocs.io/en/stable/](https://pydplus.readthedocs.io/en/stable/)
|
|
194
201
|
|
|
195
202
|
## License
|
|
196
203
|
[MIT License](https://github.com/jeffshurtliff/pydplus/blob/main/LICENSE)
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
# --------------------------------------------------------------------
|
|
4
4
|
[project]
|
|
5
5
|
name = "pydplus"
|
|
6
|
-
version = "
|
|
6
|
+
version = "2.0.0"
|
|
7
7
|
description = "A Python toolset for the RSA ID Plus cloud authentication platform"
|
|
8
8
|
readme = "README.md"
|
|
9
|
-
requires-python = ">=3.
|
|
9
|
+
requires-python = ">=3.12,<3.14.0"
|
|
10
10
|
license = { file = "LICENSE" }
|
|
11
11
|
authors = [
|
|
12
12
|
{ name = "Jeff Shurtliff", email = "jeffshurtliff@gmail.com" }
|
|
@@ -14,11 +14,28 @@ authors = [
|
|
|
14
14
|
maintainers = [
|
|
15
15
|
{ name = "Jeff Shurtliff", email = "jeffshurtliff@gmail.com" }
|
|
16
16
|
]
|
|
17
|
-
keywords = [
|
|
17
|
+
keywords = [
|
|
18
|
+
"rsa-security",
|
|
19
|
+
"id-plus",
|
|
20
|
+
"rsa-id-plus",
|
|
21
|
+
"securid",
|
|
22
|
+
"rsa-securid",
|
|
23
|
+
"authentication-manager",
|
|
24
|
+
"rsa-authentication-manager",
|
|
25
|
+
"cloud-access-service",
|
|
26
|
+
"single-sign-on",
|
|
27
|
+
"sso",
|
|
28
|
+
"mfa",
|
|
29
|
+
"iam",
|
|
30
|
+
"identity",
|
|
31
|
+
"authentication",
|
|
32
|
+
"multifactor-authentication",
|
|
33
|
+
"fido",
|
|
34
|
+
]
|
|
18
35
|
|
|
19
36
|
classifiers = [
|
|
20
37
|
# Project maturity
|
|
21
|
-
"Development Status ::
|
|
38
|
+
"Development Status :: 5 - Production/Stable",
|
|
22
39
|
|
|
23
40
|
# License
|
|
24
41
|
"License :: OSI Approved :: MIT License",
|
|
@@ -42,9 +59,6 @@ classifiers = [
|
|
|
42
59
|
# Supported Python versions
|
|
43
60
|
"Programming Language :: Python :: 3",
|
|
44
61
|
"Programming Language :: Python :: 3 :: Only",
|
|
45
|
-
"Programming Language :: Python :: 3.9",
|
|
46
|
-
"Programming Language :: Python :: 3.10",
|
|
47
|
-
"Programming Language :: Python :: 3.11",
|
|
48
62
|
"Programming Language :: Python :: 3.12",
|
|
49
63
|
"Programming Language :: Python :: 3.13",
|
|
50
64
|
]
|
|
@@ -52,21 +66,20 @@ classifiers = [
|
|
|
52
66
|
dependencies = [
|
|
53
67
|
"PyYAML>=6.0.3,<7",
|
|
54
68
|
"requests>=2.32.5",
|
|
55
|
-
"pyjwt>=2.
|
|
56
|
-
"cryptography>=
|
|
57
|
-
"urllib3>=2.6.3,<3", # Explicit pin to avoid CVE-2024-37891
|
|
58
|
-
"idna>=3.7,<4", # Explicit pin to avoid CVE-2024-3651
|
|
59
|
-
"certifi>=2024.7.4", # Explicit pin to mitigate CA removals (e-Tugra, GLOBALTRUST)
|
|
69
|
+
"pyjwt>=2.13.0", # Explicit pin to address known PyJWT security advisories
|
|
70
|
+
"cryptography>=48.0.1", # Explicit pin to address known cryptography security advisories
|
|
60
71
|
|
|
61
|
-
#
|
|
62
|
-
"
|
|
72
|
+
# Explicit pin to address known urllib3 security advisories
|
|
73
|
+
"urllib3>=2.7.0,<3",
|
|
74
|
+
"idna>=3.15,<4", # Explicit pin to address known IDNA security advisories
|
|
75
|
+
"certifi>=2024.7.4", # Explicit pin to mitigate CA removals (e-Tugra, GLOBALTRUST)
|
|
63
76
|
]
|
|
64
77
|
|
|
65
78
|
[project.urls]
|
|
66
79
|
Homepage = "https://github.com/jeffshurtliff/pydplus"
|
|
67
80
|
Repository = "https://github.com/jeffshurtliff/pydplus"
|
|
68
|
-
Documentation = "https://pydplus.readthedocs.io/en/
|
|
69
|
-
Changelog = "https://pydplus.readthedocs.io/en/latest/CHANGELOG.html"
|
|
81
|
+
Documentation = "https://pydplus.readthedocs.io/en/stable/"
|
|
82
|
+
Changelog = "https://pydplus.readthedocs.io/en/latest/CHANGELOG.html"
|
|
70
83
|
"Issue Tracker" = "https://github.com/jeffshurtliff/pydplus/issues"
|
|
71
84
|
|
|
72
85
|
# --------------------------------------------------------------------
|
|
@@ -80,7 +93,7 @@ packages = [
|
|
|
80
93
|
include = ["LICENSE", "README.md"]
|
|
81
94
|
|
|
82
95
|
[tool.poetry.group.dev.dependencies]
|
|
83
|
-
pytest = "
|
|
96
|
+
pytest = ">=9.0.3"
|
|
84
97
|
pytest-cov = "^7.0.0"
|
|
85
98
|
bandit = { version = "^1.7.8", extras = ["sarif"] }
|
|
86
99
|
Sphinx = "^7.4.7"
|
|
@@ -88,9 +101,11 @@ pydata-sphinx-theme = "^0.15.4"
|
|
|
88
101
|
myst-parser = "^3.0.1"
|
|
89
102
|
sphinx-favicon = "^1.0.1"
|
|
90
103
|
ruff = "^0.15.8"
|
|
104
|
+
twine = "^6.1.0"
|
|
105
|
+
pygments = ">=2.20.0" # Explicit pin to avoid CVE-2026-4539
|
|
91
106
|
|
|
92
107
|
[tool.ruff]
|
|
93
|
-
target-version = "
|
|
108
|
+
target-version = "py312"
|
|
94
109
|
line-length = 130
|
|
95
110
|
src = ["src", "tests"]
|
|
96
111
|
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
:Module: pydplus.api
|
|
4
4
|
:Synopsis: Defines the basic functions associated with the RSA ID Plus API
|
|
5
5
|
:Created By: Jeff Shurtliff
|
|
6
|
-
:Last Modified: Jeff Shurtliff
|
|
7
|
-
:Modified Date: 30
|
|
6
|
+
:Last Modified: Jeff Shurtliff (via GPT-5.5-codex)
|
|
7
|
+
:Modified Date: 30 Jun 2026
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
from __future__ import annotations
|
|
@@ -143,7 +143,7 @@ def api_call_with_payload(
|
|
|
143
143
|
def _raise_exception_for_payload():
|
|
144
144
|
"""Raise a :py:exc:`TypeError` exception when the payload is an invalid data type."""
|
|
145
145
|
_error_msg = f'The API payload must be a dictionary or string (provided: {type(payload)})'
|
|
146
|
-
logger.error(
|
|
146
|
+
logger.error('The API payload must be a dictionary or string')
|
|
147
147
|
raise TypeError(_error_msg)
|
|
148
148
|
|
|
149
149
|
# Define the parameters as an empty dictionary if none are provided
|
|
@@ -377,8 +377,8 @@ def _should_allow_failed_responses(_pydp_object, _allow_failed_response: Optiona
|
|
|
377
377
|
# Use the default strict mode value to define the value if an exception is raised
|
|
378
378
|
_allow_failed_response = False if const.DEFAULT_STRICT_MODE is True else True
|
|
379
379
|
_exc_type = errors.handlers.get_exception_type(_exc)
|
|
380
|
-
_error_msg = f'Using default strict mode due to the following {_exc_type} exception
|
|
381
|
-
logger.error(
|
|
380
|
+
_error_msg = f'Using default strict mode due to the following {_exc_type} exception'
|
|
381
|
+
logger.error('Using default strict mode due to an exception')
|
|
382
382
|
return _allow_failed_response
|
|
383
383
|
|
|
384
384
|
|
|
@@ -436,7 +436,7 @@ def _perform_api_call_with_payload(
|
|
|
436
436
|
"""Perform API requests that include payload data and return the response object."""
|
|
437
437
|
if not full_api_url:
|
|
438
438
|
error_msg = 'A full API URL must be defined before calling _perform_api_call_with_payload()'
|
|
439
|
-
logger.error(
|
|
439
|
+
logger.error('A full API URL must be defined before calling _perform_api_call_with_payload()')
|
|
440
440
|
raise errors.exceptions.APIMethodError(error_msg)
|
|
441
441
|
|
|
442
442
|
if isinstance(method, str) and method.upper() == const.API_REQUEST_TYPES.POST:
|
|
@@ -474,11 +474,11 @@ def _perform_api_call_with_payload(
|
|
|
474
474
|
raise_payload_exception()
|
|
475
475
|
elif isinstance(method, str) and method.upper() == const.API_REQUEST_TYPES.GET:
|
|
476
476
|
error_msg = 'The GET API call method is not valid when a payload has been provided.'
|
|
477
|
-
logger.error(
|
|
477
|
+
logger.error('The GET API call method is not valid when a payload has been provided')
|
|
478
478
|
raise errors.exceptions.APIMethodError(error_msg)
|
|
479
479
|
else:
|
|
480
480
|
error_msg = 'A valid API call method (POST or PATCH or PUT) must be defined.'
|
|
481
|
-
logger.error(
|
|
481
|
+
logger.error('A valid API call method must be defined')
|
|
482
482
|
raise errors.exceptions.APIMethodError(error_msg)
|
|
483
483
|
return None
|
|
484
484
|
|
|
@@ -504,9 +504,9 @@ def _get_full_api_url(_pydp_object, _endpoint: str, _api_type: str = const.DEFAU
|
|
|
504
504
|
if not isinstance(_api_type, str):
|
|
505
505
|
_error_msg = f'The API Type value must be a string. (provided: {type(_api_type)})'
|
|
506
506
|
else:
|
|
507
|
-
_error_msg =
|
|
507
|
+
_error_msg = 'The configured API type is not valid. '
|
|
508
508
|
_error_msg += f"(expected: '{const.ADMIN_API_TYPE}' or '{const.AUTH_API_TYPE}')"
|
|
509
|
-
logger.error(
|
|
509
|
+
logger.error('The configured API type is not valid')
|
|
510
510
|
raise errors.exceptions.InvalidFieldError(_error_msg)
|
|
511
511
|
|
|
512
512
|
# Make sure the endpoint begins with a slash
|
|
@@ -530,7 +530,7 @@ def _raise_status_code_exception(_response, _method: str, _show_full_error: bool
|
|
|
530
530
|
_exc_msg = f'The {_method.upper()} request failed with a {_response.status_code} status code.'
|
|
531
531
|
if _show_full_error:
|
|
532
532
|
_exc_msg += f'\n{_response.text}'
|
|
533
|
-
logger.error(
|
|
533
|
+
logger.error('The API request failed with a non-success status code')
|
|
534
534
|
raise errors.exceptions.APIRequestError(_exc_msg)
|
|
535
535
|
|
|
536
536
|
|
|
@@ -549,8 +549,8 @@ def _convert_response_to_json(_response, _allow_failed_response: bool = False):
|
|
|
549
549
|
_response = _response.json()
|
|
550
550
|
except Exception as _exc:
|
|
551
551
|
_exc_type = errors.handlers.get_exception_type(_exc)
|
|
552
|
-
_error_msg = f'Failed to convert the API response to JSON format due to the following {_exc_type} exception
|
|
553
|
-
logger.error(
|
|
552
|
+
_error_msg = f'Failed to convert the API response to JSON format due to the following {_exc_type} exception'
|
|
553
|
+
logger.error('Failed to convert the API response to JSON format')
|
|
554
554
|
if not _allow_failed_response:
|
|
555
555
|
raise errors.exceptions.APIResponseConversionError(_error_msg)
|
|
556
556
|
return _response
|