pas.plugins.oidc 2.0.0b2__tar.gz → 2.0.0b4__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.
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/CHANGES.md +21 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/Makefile +1 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/PKG-INFO +51 -3
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/README.md +13 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/pyproject.toml +1 -1
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/requirements.txt +1 -1
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/setup.py +3 -2
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/configure.zcml +8 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/view.py +32 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/classic.py +8 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/interfaces.py +7 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/plugins.py +43 -1
- pas_plugins_oidc-2.0.0b4/src/pas/plugins/oidc/services/login/configure.zcml +11 -0
- pas_plugins_oidc-2.0.0b4/src/pas/plugins/oidc/services/login/get.py +29 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/utils.py +2 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/PKG-INFO +51 -3
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/SOURCES.txt +0 -3
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/requires.txt +2 -1
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/services/conftest.py +1 -0
- pas.plugins.oidc-2.0.0b2/src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
- pas.plugins.oidc-2.0.0b2/src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
- pas.plugins.oidc-2.0.0b2/src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.mo +0 -0
- pas.plugins.oidc-2.0.0b2/src/pas/plugins/oidc/services/login/configure.zcml +0 -15
- pas.plugins.oidc-2.0.0b2/src/pas/plugins/oidc/services/login/get.py +0 -42
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/.coveragerc +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/.pre-commit-config.yaml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/CONTRIBUTORS.md +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/LICENSE.GPL +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/LICENSE.md +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/MANIFEST.in +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/constraints.txt +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/docs/icon.png +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/docs/screenshot-settings.png +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/instance.yaml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/requirements-docs.txt +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/setup.cfg +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/deserializer.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/oidc.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/serializer.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.po +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.po +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.po +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/pas.plugins.oidc.pot +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/update.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/browserlayer.xml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/controlpanel.xml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/default/metadata.xml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/profiles/uninstall/browserlayer.xml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/login/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/oidc.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/session.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/setuphandlers.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/testing.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/__init__.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/configure.zcml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/www/oidcPluginForm.zpt +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/dependency_links.txt +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/entry_points.txt +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/namespace_packages.txt +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/not-zip-safe +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/top_level.txt +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/conftest.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/controlpanel/conftest.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/controlpanel/test_controlpanel_api.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/docker-compose.yml +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/functional/conftest.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/functional/test_controlpanel_classic.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/functional/test_functional.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/Dockerfile +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/.gitkeep +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-realm.json +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-test-realm.json +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/plugin/test_plugin.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_login_get.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_get.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_post.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/services/test_servides_login_get_multiple_plugins.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/setup/test_setup_install.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/setup/test_setup_uninstall.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/utils/test_utils_flow.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/utils/test_utils_str.py +0 -0
- {pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/utils/test_utils_url.py +0 -0
|
@@ -9,6 +9,27 @@
|
|
|
9
9
|
|
|
10
10
|
<!-- towncrier release notes start -->
|
|
11
11
|
|
|
12
|
+
## 2.0.0b4 (2025-02-28)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### New features:
|
|
16
|
+
|
|
17
|
+
- Add backchannel logout implementation for classic ui session @mamico [#67](https://github.com/collective/pas.plugins.oidc/issues/67)
|
|
18
|
+
|
|
19
|
+
## 2.0.0b3 (2025-02-03)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### New features:
|
|
23
|
+
|
|
24
|
+
- Register the adapter as needed by the @login endpoint present in plone.restapi @erral [#47](https://github.com/collective/pas.plugins.oidc/issues/47)
|
|
25
|
+
- Changes to make compatible with OAM (Oracle Access Manager) @djay [#65](https://github.com/collective/pas.plugins.oidc/pull/64)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Internal:
|
|
29
|
+
|
|
30
|
+
- Bump plone.restapi to 9.10.0 [@ericof]
|
|
31
|
+
|
|
32
|
+
|
|
12
33
|
## 2.0.0b2 (2024-12-09)
|
|
13
34
|
|
|
14
35
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: pas.plugins.oidc
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b4
|
|
4
4
|
Summary: OIDC support for Plone sites
|
|
5
5
|
Home-page: https://github.com/collective/pas.plugins.oidc
|
|
6
6
|
Author: mamico
|
|
@@ -34,8 +34,9 @@ Requires-Dist: plone.api
|
|
|
34
34
|
Requires-Dist: plone.app.registry
|
|
35
35
|
Requires-Dist: plone.base
|
|
36
36
|
Requires-Dist: plone.protect
|
|
37
|
-
Requires-Dist: plone.restapi>=
|
|
37
|
+
Requires-Dist: plone.restapi>=9.10.0
|
|
38
38
|
Requires-Dist: oic
|
|
39
|
+
Requires-Dist: requests
|
|
39
40
|
Requires-Dist: z3c.form
|
|
40
41
|
Provides-Extra: test
|
|
41
42
|
Requires-Dist: zope.pytestlayer; extra == "test"
|
|
@@ -52,6 +53,19 @@ Requires-Dist: zest.releaser[recommended]; extra == "test"
|
|
|
52
53
|
Requires-Dist: zestreleaser.towncrier; extra == "test"
|
|
53
54
|
Requires-Dist: pytest-mock; extra == "test"
|
|
54
55
|
Requires-Dist: requests-mock; extra == "test"
|
|
56
|
+
Dynamic: author
|
|
57
|
+
Dynamic: author-email
|
|
58
|
+
Dynamic: classifier
|
|
59
|
+
Dynamic: description
|
|
60
|
+
Dynamic: description-content-type
|
|
61
|
+
Dynamic: home-page
|
|
62
|
+
Dynamic: keywords
|
|
63
|
+
Dynamic: license
|
|
64
|
+
Dynamic: project-url
|
|
65
|
+
Dynamic: provides-extra
|
|
66
|
+
Dynamic: requires-dist
|
|
67
|
+
Dynamic: requires-python
|
|
68
|
+
Dynamic: summary
|
|
55
69
|
|
|
56
70
|
|
|
57
71
|
<div align="center"><img alt="pas.plugins.oidc logo" src="https://raw.githubusercontent.com/collective/pas.plugins.oidc/main/docs/icon.png" width="70" /></div>
|
|
@@ -269,6 +283,19 @@ Currently, the Plone logout form is unchanged.
|
|
|
269
283
|
Instead, for testing go to the logout page of the plugin: http://localhost:8080/Plone/acl_users/oidc/logout,
|
|
270
284
|
this will take you to Keycloak to logout, and then return to the post-logout redirect URL.
|
|
271
285
|
|
|
286
|
+
#### Backchannel SLO (experimental)
|
|
287
|
+
|
|
288
|
+
OIDC Backchannel Logout is a server-to-server mechanism where the IdP notifies RPs via an HTTP POST request to terminate user sessions upon logout, ensuring secure and seamless Single Logout (SLO) without relying on the user's browser.
|
|
289
|
+
See the specification [OpenID Connect Back-Channel Logout 1.0](https://openid.net/specs/openid-connect-backchannel-1_0.html).
|
|
290
|
+
|
|
291
|
+
Current backchannel logout implementation, in this product, utilizes functionality introduced in plone.session >= 4.0.0 (Plone 6 and later) for server-side session invalidation (see plone.session PR [plone.session#26](https://github.com/plone/plone.session/pull/26)), and, at the moment, applies only to Plone Classic UI.
|
|
292
|
+
|
|
293
|
+
To enable this functionality:
|
|
294
|
+
|
|
295
|
+
1. Navigate to `.../acl_users/session/manage_secret` and enable the `Enable per-user keyring` option.
|
|
296
|
+
|
|
297
|
+
2. Configure the OpenID Provider (e.g., Keycloak) to use the backchannel logout endpoint with the url: `.../acl_users/oidc/backchannel-logout`
|
|
298
|
+
|
|
272
299
|
## Technical Decisions
|
|
273
300
|
|
|
274
301
|
### Usage of sessions in the login process
|
|
@@ -410,6 +437,27 @@ The project is licensed under the GPLv2.
|
|
|
410
437
|
|
|
411
438
|
<!-- towncrier release notes start -->
|
|
412
439
|
|
|
440
|
+
## 2.0.0b4 (2025-02-28)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
### New features:
|
|
444
|
+
|
|
445
|
+
- Add backchannel logout implementation for classic ui session @mamico [#67](https://github.com/collective/pas.plugins.oidc/issues/67)
|
|
446
|
+
|
|
447
|
+
## 2.0.0b3 (2025-02-03)
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
### New features:
|
|
451
|
+
|
|
452
|
+
- Register the adapter as needed by the @login endpoint present in plone.restapi @erral [#47](https://github.com/collective/pas.plugins.oidc/issues/47)
|
|
453
|
+
- Changes to make compatible with OAM (Oracle Access Manager) @djay [#65](https://github.com/collective/pas.plugins.oidc/pull/64)
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
### Internal:
|
|
457
|
+
|
|
458
|
+
- Bump plone.restapi to 9.10.0 [@ericof]
|
|
459
|
+
|
|
460
|
+
|
|
413
461
|
## 2.0.0b2 (2024-12-09)
|
|
414
462
|
|
|
415
463
|
|
|
@@ -213,6 +213,19 @@ Currently, the Plone logout form is unchanged.
|
|
|
213
213
|
Instead, for testing go to the logout page of the plugin: http://localhost:8080/Plone/acl_users/oidc/logout,
|
|
214
214
|
this will take you to Keycloak to logout, and then return to the post-logout redirect URL.
|
|
215
215
|
|
|
216
|
+
#### Backchannel SLO (experimental)
|
|
217
|
+
|
|
218
|
+
OIDC Backchannel Logout is a server-to-server mechanism where the IdP notifies RPs via an HTTP POST request to terminate user sessions upon logout, ensuring secure and seamless Single Logout (SLO) without relying on the user's browser.
|
|
219
|
+
See the specification [OpenID Connect Back-Channel Logout 1.0](https://openid.net/specs/openid-connect-backchannel-1_0.html).
|
|
220
|
+
|
|
221
|
+
Current backchannel logout implementation, in this product, utilizes functionality introduced in plone.session >= 4.0.0 (Plone 6 and later) for server-side session invalidation (see plone.session PR [plone.session#26](https://github.com/plone/plone.session/pull/26)), and, at the moment, applies only to Plone Classic UI.
|
|
222
|
+
|
|
223
|
+
To enable this functionality:
|
|
224
|
+
|
|
225
|
+
1. Navigate to `.../acl_users/session/manage_secret` and enable the `Enable per-user keyring` option.
|
|
226
|
+
|
|
227
|
+
2. Configure the OpenID Provider (e.g., Keycloak) to use the backchannel logout endpoint with the url: `.../acl_users/oidc/backchannel-logout`
|
|
228
|
+
|
|
216
229
|
## Technical Decisions
|
|
217
230
|
|
|
218
231
|
### Usage of sessions in the login process
|
|
@@ -123,7 +123,7 @@ Zope = [
|
|
|
123
123
|
]
|
|
124
124
|
python-dateutil = ['dateutil']
|
|
125
125
|
ignore-packages = ['plone.restapi', 'plone.volto', 'zestreleaser.towncrier', 'zest.releaser', 'pytest', 'pytest-cov', 'pytest-plone', 'pytest-docker', 'pytest-vcr', 'pytest-mock', 'zope.pytestlayer', 'requests-mock', 'vcrpy']
|
|
126
|
-
Plone = ['Products.CMFPlone', 'Products.CMFCore', 'Products.GenericSetup', 'Products.PluggableAuthService', 'Products.PlonePAS']
|
|
126
|
+
Plone = ['Products.CMFPlone', 'Products.CMFCore', 'Products.GenericSetup', 'Products.PluggableAuthService', 'Products.PlonePAS', 'plone.keyring']
|
|
127
127
|
|
|
128
128
|
##
|
|
129
129
|
# Add extra configuration options in .meta.toml:
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
-c constraints.txt
|
|
2
|
-
-e
|
|
2
|
+
-e .[test]
|
|
@@ -14,7 +14,7 @@ long_description = f"""
|
|
|
14
14
|
|
|
15
15
|
setup(
|
|
16
16
|
name="pas.plugins.oidc",
|
|
17
|
-
version="2.0.
|
|
17
|
+
version="2.0.0b4",
|
|
18
18
|
description="OIDC support for Plone sites",
|
|
19
19
|
long_description=long_description,
|
|
20
20
|
long_description_content_type="text/markdown",
|
|
@@ -59,8 +59,9 @@ setup(
|
|
|
59
59
|
"plone.app.registry",
|
|
60
60
|
"plone.base",
|
|
61
61
|
"plone.protect",
|
|
62
|
-
"plone.restapi>=
|
|
62
|
+
"plone.restapi>=9.10.0",
|
|
63
63
|
"oic",
|
|
64
|
+
"requests",
|
|
64
65
|
"z3c.form",
|
|
65
66
|
],
|
|
66
67
|
extras_require={
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/configure.zcml
RENAMED
|
@@ -37,4 +37,12 @@
|
|
|
37
37
|
layer="pas.plugins.oidc.interfaces.IPasPluginsOidcLayer"
|
|
38
38
|
/>
|
|
39
39
|
|
|
40
|
+
<browser:page
|
|
41
|
+
name="backchannel-logout"
|
|
42
|
+
for="pas.plugins.oidc.plugins.IOIDCPlugin"
|
|
43
|
+
class=".view.BackChannelLogoutView"
|
|
44
|
+
permission="zope2.View"
|
|
45
|
+
layer="pas.plugins.oidc.interfaces.IPasPluginsOidcLayer"
|
|
46
|
+
/>
|
|
47
|
+
|
|
40
48
|
</configure>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from oic.oic.message import BackChannelLogoutRequest
|
|
1
2
|
from oic.oic.message import EndSessionRequest
|
|
2
3
|
from oic.oic.message import IdToken
|
|
3
4
|
from pas.plugins.oidc import _
|
|
@@ -6,9 +7,11 @@ from pas.plugins.oidc import utils
|
|
|
6
7
|
from pas.plugins.oidc.plugins import OAuth2ConnectionException
|
|
7
8
|
from pas.plugins.oidc.session import Session
|
|
8
9
|
from plone import api
|
|
10
|
+
from plone.keyring.interfaces import IKeyManager
|
|
9
11
|
from Products.Five.browser import BrowserView
|
|
10
12
|
from urllib.parse import quote
|
|
11
13
|
from zExceptions import Unauthorized
|
|
14
|
+
from zope.component import getUtility
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
class RequireLoginView(BrowserView):
|
|
@@ -143,3 +146,32 @@ class CallbackView(BrowserView):
|
|
|
143
146
|
self.request.response.redirect(return_url)
|
|
144
147
|
else:
|
|
145
148
|
raise Unauthorized()
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class BackChannelLogoutView(BrowserView):
|
|
152
|
+
def __call__(self):
|
|
153
|
+
if not self.request.method == "POST" or not self.request.get("logout_token"):
|
|
154
|
+
raise Unauthorized()
|
|
155
|
+
logout_request = BackChannelLogoutRequest(
|
|
156
|
+
logout_token=self.request.get("logout_token")
|
|
157
|
+
)
|
|
158
|
+
client = self.context.get_oauth2_client()
|
|
159
|
+
if logout_request.verify(
|
|
160
|
+
aud=client.client_id, iss=client.issuer, keyjar=client.keyjar
|
|
161
|
+
):
|
|
162
|
+
userid = logout_request.to_dict()["logout_token"]["sub"]
|
|
163
|
+
session = api.portal.get_tool("acl_users").session
|
|
164
|
+
if session.per_user_keyring:
|
|
165
|
+
secret_key = session._getSecretKey(userid)
|
|
166
|
+
manager = getUtility(IKeyManager)
|
|
167
|
+
if manager[secret_key]:
|
|
168
|
+
manager.clear(ring=secret_key)
|
|
169
|
+
manager.rotate(ring=secret_key)
|
|
170
|
+
else:
|
|
171
|
+
logger.error(
|
|
172
|
+
"For the backchannel logout, the session PAS needs to be configured with 'per user keyring'."
|
|
173
|
+
)
|
|
174
|
+
return ""
|
|
175
|
+
else:
|
|
176
|
+
logger.error("invalid backchannel logout request")
|
|
177
|
+
raise Unauthorized()
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/classic.py
RENAMED
|
@@ -138,6 +138,14 @@ class OIDCControlPanelAdapter:
|
|
|
138
138
|
def user_property_as_userid(self, value):
|
|
139
139
|
self.settings.user_property_as_userid = value
|
|
140
140
|
|
|
141
|
+
@property
|
|
142
|
+
def identity_domain_name(self):
|
|
143
|
+
return self.settings.identity_domain_name
|
|
144
|
+
|
|
145
|
+
@identity_domain_name.setter
|
|
146
|
+
def identity_domain_name(self, value):
|
|
147
|
+
self.settings.identity_domain_name = value
|
|
148
|
+
|
|
141
149
|
|
|
142
150
|
class OIDCSettingsForm(controlpanel.RegistryEditForm):
|
|
143
151
|
schema = IOIDCSettings
|
|
@@ -119,6 +119,13 @@ class IOIDCSettings(Interface):
|
|
|
119
119
|
default="sub",
|
|
120
120
|
)
|
|
121
121
|
|
|
122
|
+
identity_domain_name = schema.TextLine(
|
|
123
|
+
title=_("Identity Domain Name"),
|
|
124
|
+
description=_("Required for Oracle Authentication Manager only"),
|
|
125
|
+
required=False,
|
|
126
|
+
default="",
|
|
127
|
+
)
|
|
128
|
+
|
|
122
129
|
|
|
123
130
|
class IOIDCControlpanel(IControlpanel):
|
|
124
131
|
"""OIDC Control panel"""
|
|
@@ -27,6 +27,7 @@ from zope.interface import Interface
|
|
|
27
27
|
|
|
28
28
|
import itertools
|
|
29
29
|
import plone.api as api
|
|
30
|
+
import requests
|
|
30
31
|
import string
|
|
31
32
|
|
|
32
33
|
|
|
@@ -69,6 +70,29 @@ class IOIDCPlugin(Interface):
|
|
|
69
70
|
""" """
|
|
70
71
|
|
|
71
72
|
|
|
73
|
+
class OAMClient(Client):
|
|
74
|
+
"""Override so we can adjust the jwks_uri to add domain needed for OAM"""
|
|
75
|
+
|
|
76
|
+
def __init__(self, *args, domain=None, **xargs):
|
|
77
|
+
super().__init__(self, *args, **xargs)
|
|
78
|
+
self.domain = domain
|
|
79
|
+
if domain:
|
|
80
|
+
session = requests.Session()
|
|
81
|
+
session.headers.update({"x-oauth-identity-domain-name": domain})
|
|
82
|
+
self.settings.requests_session = session
|
|
83
|
+
|
|
84
|
+
def handle_provider_config(self, pcr, issuer, keys=True, endpoints=True):
|
|
85
|
+
domain = self.domain
|
|
86
|
+
if domain:
|
|
87
|
+
# we need to modify jwks_uri in the provider_info to add the identityDomain for OAM
|
|
88
|
+
# gets used in https://github.com/CZ-NIC/pyoidc/blob/0bd1eadcefc5ccb7ef6c69d9b631537a7d3cfe30/src/oic/oauth2/__init__.py#L1132
|
|
89
|
+
url = pcr["jwks_uri"]
|
|
90
|
+
req = requests.PreparedRequest()
|
|
91
|
+
req.prepare_url(url, dict(identityDomainName=domain))
|
|
92
|
+
pcr["jwks_uri"] = req.url
|
|
93
|
+
return super().handle_provider_config(pcr, issuer, keys, endpoints)
|
|
94
|
+
|
|
95
|
+
|
|
72
96
|
@implementer(IOIDCPlugin)
|
|
73
97
|
class OIDCPlugin(BasePlugin):
|
|
74
98
|
"""PAS Plugin OpenID Connect."""
|
|
@@ -92,6 +116,7 @@ class OIDCPlugin(BasePlugin):
|
|
|
92
116
|
use_deprecated_redirect_uri_for_logout = False
|
|
93
117
|
use_modified_openid_schema = False
|
|
94
118
|
user_property_as_userid = "sub"
|
|
119
|
+
identity_domain_name = ""
|
|
95
120
|
|
|
96
121
|
_properties = (
|
|
97
122
|
dict(id="title", type="string", mode="w", label="Title"),
|
|
@@ -160,6 +185,12 @@ class OIDCPlugin(BasePlugin):
|
|
|
160
185
|
mode="w",
|
|
161
186
|
label="User info property used as userid, default 'sub'",
|
|
162
187
|
),
|
|
188
|
+
dict(
|
|
189
|
+
id="identity_domain_name",
|
|
190
|
+
type="string",
|
|
191
|
+
mode="w",
|
|
192
|
+
label="Identity Domain Name (required for Oracle Authentication Manager only)",
|
|
193
|
+
),
|
|
163
194
|
)
|
|
164
195
|
|
|
165
196
|
def __init__(self, id, title=None):
|
|
@@ -331,8 +362,19 @@ class OIDCPlugin(BasePlugin):
|
|
|
331
362
|
|
|
332
363
|
# TODO: memoize (?)
|
|
333
364
|
def get_oauth2_client(self):
|
|
365
|
+
domain = self.getProperty("identity_domain_name")
|
|
334
366
|
try:
|
|
335
|
-
|
|
367
|
+
if domain:
|
|
368
|
+
client = OAMClient(
|
|
369
|
+
client_authn_method=CLIENT_AUTHN_METHOD,
|
|
370
|
+
domain=domain,
|
|
371
|
+
)
|
|
372
|
+
else:
|
|
373
|
+
client = Client(client_authn_method=CLIENT_AUTHN_METHOD)
|
|
374
|
+
client.allow["issuer_mismatch"] = (
|
|
375
|
+
True # Some providers aren't configured with configured and issuer urls the same even though they should.
|
|
376
|
+
)
|
|
377
|
+
|
|
336
378
|
# registration_response = client.register(provider_info["registration_endpoint"], redirect_uris=...)
|
|
337
379
|
# ... oic.exception.RegistrationError: {'error': 'insufficient_scope',
|
|
338
380
|
# 'error_description': "Policy 'Trusted Hosts' rejected request to client-registration service. Details: Host not trusted."}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
from pas.plugins.oidc.plugins import OIDCPlugin
|
|
2
|
+
from plone import api
|
|
3
|
+
from plone.base.interfaces import IPloneSiteRoot
|
|
4
|
+
from plone.restapi.interfaces import ILoginProviders
|
|
5
|
+
from zope.component import adapter
|
|
6
|
+
from zope.interface import implementer
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@adapter(IPloneSiteRoot)
|
|
10
|
+
@implementer(ILoginProviders)
|
|
11
|
+
class OIDCLoginProviders:
|
|
12
|
+
def __init__(self, context):
|
|
13
|
+
self.context = context
|
|
14
|
+
|
|
15
|
+
def get_providers(self):
|
|
16
|
+
options = []
|
|
17
|
+
acl_users = api.portal.get_tool("acl_users")
|
|
18
|
+
for plugin in acl_users.objectValues():
|
|
19
|
+
if isinstance(plugin, OIDCPlugin):
|
|
20
|
+
options.append(
|
|
21
|
+
{
|
|
22
|
+
"id": plugin.getId(),
|
|
23
|
+
"plugin": "oidc",
|
|
24
|
+
"title": plugin.title,
|
|
25
|
+
"url": f"{self.context.absolute_url()}/@login-oidc/{plugin.getId()}",
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
return options
|
|
@@ -127,6 +127,8 @@ def authorization_flow_args(plugin: plugins.OIDCPlugin, session: Session) -> dic
|
|
|
127
127
|
"nonce": session.get("nonce"),
|
|
128
128
|
"redirect_uri": plugin.get_redirect_uris(),
|
|
129
129
|
}
|
|
130
|
+
if plugin.getProperty("identity_domain_name"):
|
|
131
|
+
args["domain"] = plugin.getProperty("identity_domain_name", "")
|
|
130
132
|
if plugin.getProperty("use_pkce"):
|
|
131
133
|
# Build a random string of 43 to 128 characters
|
|
132
134
|
# and send it in the request as a base64-encoded urlsafe string of the sha256 hash of that string
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: pas.plugins.oidc
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b4
|
|
4
4
|
Summary: OIDC support for Plone sites
|
|
5
5
|
Home-page: https://github.com/collective/pas.plugins.oidc
|
|
6
6
|
Author: mamico
|
|
@@ -34,8 +34,9 @@ Requires-Dist: plone.api
|
|
|
34
34
|
Requires-Dist: plone.app.registry
|
|
35
35
|
Requires-Dist: plone.base
|
|
36
36
|
Requires-Dist: plone.protect
|
|
37
|
-
Requires-Dist: plone.restapi>=
|
|
37
|
+
Requires-Dist: plone.restapi>=9.10.0
|
|
38
38
|
Requires-Dist: oic
|
|
39
|
+
Requires-Dist: requests
|
|
39
40
|
Requires-Dist: z3c.form
|
|
40
41
|
Provides-Extra: test
|
|
41
42
|
Requires-Dist: zope.pytestlayer; extra == "test"
|
|
@@ -52,6 +53,19 @@ Requires-Dist: zest.releaser[recommended]; extra == "test"
|
|
|
52
53
|
Requires-Dist: zestreleaser.towncrier; extra == "test"
|
|
53
54
|
Requires-Dist: pytest-mock; extra == "test"
|
|
54
55
|
Requires-Dist: requests-mock; extra == "test"
|
|
56
|
+
Dynamic: author
|
|
57
|
+
Dynamic: author-email
|
|
58
|
+
Dynamic: classifier
|
|
59
|
+
Dynamic: description
|
|
60
|
+
Dynamic: description-content-type
|
|
61
|
+
Dynamic: home-page
|
|
62
|
+
Dynamic: keywords
|
|
63
|
+
Dynamic: license
|
|
64
|
+
Dynamic: project-url
|
|
65
|
+
Dynamic: provides-extra
|
|
66
|
+
Dynamic: requires-dist
|
|
67
|
+
Dynamic: requires-python
|
|
68
|
+
Dynamic: summary
|
|
55
69
|
|
|
56
70
|
|
|
57
71
|
<div align="center"><img alt="pas.plugins.oidc logo" src="https://raw.githubusercontent.com/collective/pas.plugins.oidc/main/docs/icon.png" width="70" /></div>
|
|
@@ -269,6 +283,19 @@ Currently, the Plone logout form is unchanged.
|
|
|
269
283
|
Instead, for testing go to the logout page of the plugin: http://localhost:8080/Plone/acl_users/oidc/logout,
|
|
270
284
|
this will take you to Keycloak to logout, and then return to the post-logout redirect URL.
|
|
271
285
|
|
|
286
|
+
#### Backchannel SLO (experimental)
|
|
287
|
+
|
|
288
|
+
OIDC Backchannel Logout is a server-to-server mechanism where the IdP notifies RPs via an HTTP POST request to terminate user sessions upon logout, ensuring secure and seamless Single Logout (SLO) without relying on the user's browser.
|
|
289
|
+
See the specification [OpenID Connect Back-Channel Logout 1.0](https://openid.net/specs/openid-connect-backchannel-1_0.html).
|
|
290
|
+
|
|
291
|
+
Current backchannel logout implementation, in this product, utilizes functionality introduced in plone.session >= 4.0.0 (Plone 6 and later) for server-side session invalidation (see plone.session PR [plone.session#26](https://github.com/plone/plone.session/pull/26)), and, at the moment, applies only to Plone Classic UI.
|
|
292
|
+
|
|
293
|
+
To enable this functionality:
|
|
294
|
+
|
|
295
|
+
1. Navigate to `.../acl_users/session/manage_secret` and enable the `Enable per-user keyring` option.
|
|
296
|
+
|
|
297
|
+
2. Configure the OpenID Provider (e.g., Keycloak) to use the backchannel logout endpoint with the url: `.../acl_users/oidc/backchannel-logout`
|
|
298
|
+
|
|
272
299
|
## Technical Decisions
|
|
273
300
|
|
|
274
301
|
### Usage of sessions in the login process
|
|
@@ -410,6 +437,27 @@ The project is licensed under the GPLv2.
|
|
|
410
437
|
|
|
411
438
|
<!-- towncrier release notes start -->
|
|
412
439
|
|
|
440
|
+
## 2.0.0b4 (2025-02-28)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
### New features:
|
|
444
|
+
|
|
445
|
+
- Add backchannel logout implementation for classic ui session @mamico [#67](https://github.com/collective/pas.plugins.oidc/issues/67)
|
|
446
|
+
|
|
447
|
+
## 2.0.0b3 (2025-02-03)
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
### New features:
|
|
451
|
+
|
|
452
|
+
- Register the adapter as needed by the @login endpoint present in plone.restapi @erral [#47](https://github.com/collective/pas.plugins.oidc/issues/47)
|
|
453
|
+
- Changes to make compatible with OAM (Oracle Access Manager) @djay [#65](https://github.com/collective/pas.plugins.oidc/pull/64)
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
### Internal:
|
|
457
|
+
|
|
458
|
+
- Bump plone.restapi to 9.10.0 [@ericof]
|
|
459
|
+
|
|
460
|
+
|
|
413
461
|
## 2.0.0b2 (2024-12-09)
|
|
414
462
|
|
|
415
463
|
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/SOURCES.txt
RENAMED
|
@@ -45,11 +45,8 @@ src/pas/plugins/oidc/controlpanel/serializer.py
|
|
|
45
45
|
src/pas/plugins/oidc/locales/__init__.py
|
|
46
46
|
src/pas/plugins/oidc/locales/pas.plugins.oidc.pot
|
|
47
47
|
src/pas/plugins/oidc/locales/update.py
|
|
48
|
-
src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.mo
|
|
49
48
|
src/pas/plugins/oidc/locales/de/LC_MESSAGES/pas.plugins.oidc.po
|
|
50
|
-
src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.mo
|
|
51
49
|
src/pas/plugins/oidc/locales/en/LC_MESSAGES/pas.plugins.oidc.po
|
|
52
|
-
src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.mo
|
|
53
50
|
src/pas/plugins/oidc/locales/es/LC_MESSAGES/pas.plugins.oidc.po
|
|
54
51
|
src/pas/plugins/oidc/profiles/default/browserlayer.xml
|
|
55
52
|
src/pas/plugins/oidc/profiles/default/controlpanel.xml
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<configure
|
|
2
|
-
xmlns="http://namespaces.zope.org/zope"
|
|
3
|
-
xmlns:plone="http://namespaces.plone.org/plone"
|
|
4
|
-
>
|
|
5
|
-
|
|
6
|
-
<!-- Login options -->
|
|
7
|
-
<plone:service
|
|
8
|
-
method="GET"
|
|
9
|
-
factory=".get.Get"
|
|
10
|
-
for="Products.CMFPlone.interfaces.IPloneSiteRoot"
|
|
11
|
-
permission="zope.Public"
|
|
12
|
-
name="@login"
|
|
13
|
-
/>
|
|
14
|
-
|
|
15
|
-
</configure>
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
from pas.plugins.oidc import utils
|
|
2
|
-
from pas.plugins.oidc.plugins import OIDCPlugin
|
|
3
|
-
from plone import api
|
|
4
|
-
from plone.restapi.services import Service
|
|
5
|
-
from typing import Dict
|
|
6
|
-
from typing import List
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class Get(Service):
|
|
10
|
-
"""List available login options for the site."""
|
|
11
|
-
|
|
12
|
-
def check_permission(self):
|
|
13
|
-
return True
|
|
14
|
-
|
|
15
|
-
@staticmethod
|
|
16
|
-
def list_login_providers() -> List[Dict]:
|
|
17
|
-
"""List all configured login providers.
|
|
18
|
-
|
|
19
|
-
This should be moved to plone.restapi and be extendable.
|
|
20
|
-
:returns: List of login options.
|
|
21
|
-
"""
|
|
22
|
-
portal_url = api.portal.get().absolute_url()
|
|
23
|
-
plugins = []
|
|
24
|
-
for plugin in utils.get_plugins():
|
|
25
|
-
if isinstance(plugin, OIDCPlugin):
|
|
26
|
-
plugins.append(
|
|
27
|
-
{
|
|
28
|
-
"id": plugin.getId(),
|
|
29
|
-
"plugin": "oidc",
|
|
30
|
-
"url": f"{portal_url}/@login-oidc/{plugin.getId()}",
|
|
31
|
-
"title": plugin.title,
|
|
32
|
-
}
|
|
33
|
-
)
|
|
34
|
-
return plugins
|
|
35
|
-
|
|
36
|
-
def reply(self) -> Dict[str, List[Dict]]:
|
|
37
|
-
"""List login options available for the site.
|
|
38
|
-
|
|
39
|
-
:returns: Login options information.
|
|
40
|
-
"""
|
|
41
|
-
providers = self.list_login_providers()
|
|
42
|
-
return {"options": providers}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/browser/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/controlpanel/oidc.py
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/locales/update.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/__init__.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/configure.zcml
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/services/oidc/oidc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/__init__.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/upgrades/configure.zcml
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas/plugins/oidc/www/oidcPluginForm.zpt
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/src/pas.plugins.oidc.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/controlpanel/test_controlpanel_api.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/functional/test_controlpanel_classic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-realm.json
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/keycloak/import/plone-test-realm.json
RENAMED
|
File without changes
|
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_login_get.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_get.py
RENAMED
|
File without changes
|
{pas.plugins.oidc-2.0.0b2 → pas_plugins_oidc-2.0.0b4}/tests/services/test_services_oidc_post.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|