From c3acb4f4d0c531afa0f9b678efa9a4a5063b3844 Mon Sep 17 00:00:00 2001 From: Mauro Amico Date: Tue, 1 Apr 2025 00:21:47 +0200 Subject: [PATCH 1/4] make controlpanel coompatible with collective.regenv --- src/pas/plugins/oidc/controlpanel/classic.py | 43 ++++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/pas/plugins/oidc/controlpanel/classic.py b/src/pas/plugins/oidc/controlpanel/classic.py index 4580388..8cf2aa8 100644 --- a/src/pas/plugins/oidc/controlpanel/classic.py +++ b/src/pas/plugins/oidc/controlpanel/classic.py @@ -6,11 +6,13 @@ from plone.base.interfaces import IPloneSiteRoot from zope.component import adapter from zope.interface import implementer +from z3c.form.interfaces import DISPLAY_MODE @adapter(IPloneSiteRoot) @implementer(IOIDCSettings) class OIDCControlPanelAdapter: + def __init__(self, context): self.context = context self.portal = api.portal.get() @@ -19,7 +21,7 @@ def __init__(self, context): @property def issuer(self): - return self.settings.issuer + return self.settings.getProperty("issuer") @issuer.setter def issuer(self, value): @@ -27,7 +29,7 @@ def issuer(self, value): @property def client_id(self): - return self.settings.client_id + return self.settings.getProperty("client_id") @client_id.setter def client_id(self, value): @@ -35,7 +37,7 @@ def client_id(self, value): @property def client_secret(self): - return self.settings.client_secret + return self.settings.getProperty("client_secret") @client_secret.setter def client_secret(self, value): @@ -43,7 +45,7 @@ def client_secret(self, value): @property def redirect_uris(self): - return self.settings.redirect_uris + return self.settings.getProperty("redirect_uris") @redirect_uris.setter def redirect_uris(self, value): @@ -51,7 +53,7 @@ def redirect_uris(self, value): @property def use_session_data_manager(self): - return self.settings.use_session_data_manager + return self.settings.getProperty("use_session_data_manager") @use_session_data_manager.setter def use_session_data_manager(self, value): @@ -59,7 +61,7 @@ def use_session_data_manager(self, value): @property def create_user(self): - return self.settings.create_user + return self.settings.getProperty("create_user") @create_user.setter def create_user(self, value): @@ -67,7 +69,7 @@ def create_user(self, value): @property def create_groups(self): - return self.settings.create_groups + return self.settings.getProperty("create_groups") @create_groups.setter def create_groups(self, value): @@ -75,7 +77,7 @@ def create_groups(self, value): @property def user_property_as_groupid(self): - return self.settings.user_property_as_groupid + return self.settings.getProperty("user_property_as_groupid") @user_property_as_groupid.setter def user_property_as_groupid(self, value): @@ -83,7 +85,7 @@ def user_property_as_groupid(self, value): @property def allowed_groups(self): - return self.settings.allowed_groups + return self.settings.getPropertty("allowed_groups") @allowed_groups.setter def allowed_groups(self, value): @@ -91,7 +93,7 @@ def allowed_groups(self, value): @property def create_ticket(self): - return self.settings.create_ticket + return self.settings.getProperty("create_ticket") @create_ticket.setter def create_ticket(self, value): @@ -99,7 +101,7 @@ def create_ticket(self, value): @property def create_restapi_ticket(self): - return self.settings.create_restapi_ticket + return self.settings.getProperty("create_restapi_ticket") @create_restapi_ticket.setter def create_restapi_ticket(self, value): @@ -107,7 +109,7 @@ def create_restapi_ticket(self, value): @property def scope(self): - return self.settings.scope + return self.settings.getProperty("scope") @scope.setter def scope(self, value): @@ -115,7 +117,7 @@ def scope(self, value): @property def use_pkce(self): - return self.settings.use_pkce + return self.settings.getProperty("use_pkce") @use_pkce.setter def use_pkce(self, value): @@ -123,7 +125,7 @@ def use_pkce(self, value): @property def use_deprecated_redirect_uri_for_logout(self): - return self.settings.use_deprecated_redirect_uri_for_logout + return self.settings.getProperty("use_deprecated_redirect_uri_for_logout") @use_deprecated_redirect_uri_for_logout.setter def use_deprecated_redirect_uri_for_logout(self, value): @@ -131,7 +133,7 @@ def use_deprecated_redirect_uri_for_logout(self, value): @property def use_modified_openid_schema(self): - return self.settings.use_modified_openid_schema + return self.settings.getProperty("use_modified_openid_schema") @use_modified_openid_schema.setter def use_modified_openid_schema(self, value): @@ -139,7 +141,7 @@ def use_modified_openid_schema(self, value): @property def user_property_as_userid(self): - return self.settings.user_property_as_userid + return self.settings.getProperty("user_property_as_userid") @user_property_as_userid.setter def user_property_as_userid(self, value): @@ -147,7 +149,7 @@ def user_property_as_userid(self, value): @property def identity_domain_name(self): - return self.settings.identity_domain_name + return self.settings.getProperty("identity_domain_name") @identity_domain_name.setter def identity_domain_name(self, value): @@ -164,6 +166,13 @@ def getContent(self): portal = api.portal.get() return OIDCControlPanelAdapter(portal) + def updateWidgets(self): + super().updateWidgets() + modes = {p["id"]: p["mode"] for p in self.getContent().settings.propertyMap()} + for id, widget in self.widgets.items(): + if id in modes and "w" not in modes.get(id): + widget.mode = DISPLAY_MODE + def applyChanges(self, data): """See interfaces.IEditForm""" content = self.getContent() From d2a988043017710bd11684ee5f78fe81f755167b Mon Sep 17 00:00:00 2001 From: Mauro Amico Date: Tue, 1 Apr 2025 00:26:29 +0200 Subject: [PATCH 2/4] black --- src/pas/plugins/oidc/controlpanel/classic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pas/plugins/oidc/controlpanel/classic.py b/src/pas/plugins/oidc/controlpanel/classic.py index 8cf2aa8..9a05c4d 100644 --- a/src/pas/plugins/oidc/controlpanel/classic.py +++ b/src/pas/plugins/oidc/controlpanel/classic.py @@ -12,7 +12,6 @@ @adapter(IPloneSiteRoot) @implementer(IOIDCSettings) class OIDCControlPanelAdapter: - def __init__(self, context): self.context = context self.portal = api.portal.get() From 75334d44af125fb307c129f541170225303bf525 Mon Sep 17 00:00:00 2001 From: Mauro Amico Date: Thu, 12 Jun 2025 17:24:55 +0200 Subject: [PATCH 3/4] cleanup classicui controlpanel --- news/73.feature | 1 + src/pas/plugins/oidc/controlpanel/classic.py | 156 +++---------------- 2 files changed, 20 insertions(+), 137 deletions(-) create mode 100644 news/73.feature diff --git a/news/73.feature b/news/73.feature new file mode 100644 index 0000000..e2dbb4f --- /dev/null +++ b/news/73.feature @@ -0,0 +1 @@ +Make controlpanel compatible with collective.regenv. @mamico diff --git a/src/pas/plugins/oidc/controlpanel/classic.py b/src/pas/plugins/oidc/controlpanel/classic.py index 9a05c4d..43a75bb 100644 --- a/src/pas/plugins/oidc/controlpanel/classic.py +++ b/src/pas/plugins/oidc/controlpanel/classic.py @@ -12,147 +12,29 @@ @adapter(IPloneSiteRoot) @implementer(IOIDCSettings) class OIDCControlPanelAdapter: + propertymap = None + def __init__(self, context): self.context = context self.portal = api.portal.get() self.encoding = "utf-8" self.settings = self.portal.acl_users[PLUGIN_ID] + self.propertymap = {prop["id"]: prop for prop in self.settings.propertyMap()} - @property - def issuer(self): - return self.settings.getProperty("issuer") - - @issuer.setter - def issuer(self, value): - self.settings.issuer = value - - @property - def client_id(self): - return self.settings.getProperty("client_id") - - @client_id.setter - def client_id(self, value): - self.settings.client_id = value - - @property - def client_secret(self): - return self.settings.getProperty("client_secret") - - @client_secret.setter - def client_secret(self, value): - self.settings.client_secret = value - - @property - def redirect_uris(self): - return self.settings.getProperty("redirect_uris") - - @redirect_uris.setter - def redirect_uris(self, value): - self.settings.redirect_uris = value - - @property - def use_session_data_manager(self): - return self.settings.getProperty("use_session_data_manager") - - @use_session_data_manager.setter - def use_session_data_manager(self, value): - self.settings.use_session_data_manager = value - - @property - def create_user(self): - return self.settings.getProperty("create_user") - - @create_user.setter - def create_user(self, value): - self.settings.create_user = value - - @property - def create_groups(self): - return self.settings.getProperty("create_groups") - - @create_groups.setter - def create_groups(self, value): - self.settings.create_groups = value - - @property - def user_property_as_groupid(self): - return self.settings.getProperty("user_property_as_groupid") - - @user_property_as_groupid.setter - def user_property_as_groupid(self, value): - self.settings.user_property_as_groupid = value - - @property - def allowed_groups(self): - return self.settings.getPropertty("allowed_groups") - - @allowed_groups.setter - def allowed_groups(self, value): - self.settings.allowed_groups = value - - @property - def create_ticket(self): - return self.settings.getProperty("create_ticket") - - @create_ticket.setter - def create_ticket(self, value): - self.settings.create_ticket = value - - @property - def create_restapi_ticket(self): - return self.settings.getProperty("create_restapi_ticket") - - @create_restapi_ticket.setter - def create_restapi_ticket(self, value): - self.settings.create_restapi_ticket = value - - @property - def scope(self): - return self.settings.getProperty("scope") - - @scope.setter - def scope(self, value): - self.settings.scope = value - - @property - def use_pkce(self): - return self.settings.getProperty("use_pkce") - - @use_pkce.setter - def use_pkce(self, value): - self.settings.use_pkce = value - - @property - def use_deprecated_redirect_uri_for_logout(self): - return self.settings.getProperty("use_deprecated_redirect_uri_for_logout") - - @use_deprecated_redirect_uri_for_logout.setter - def use_deprecated_redirect_uri_for_logout(self, value): - self.settings.use_deprecated_redirect_uri_for_logout = value - - @property - def use_modified_openid_schema(self): - return self.settings.getProperty("use_modified_openid_schema") - - @use_modified_openid_schema.setter - def use_modified_openid_schema(self, value): - self.settings.use_modified_openid_schema = value - - @property - def user_property_as_userid(self): - return self.settings.getProperty("user_property_as_userid") - - @user_property_as_userid.setter - def user_property_as_userid(self, value): - self.settings.user_property_as_userid = value - - @property - def identity_domain_name(self): - return self.settings.getProperty("identity_domain_name") + def __getattr__(self, name): + if self.propertymap and name in self.propertymap: + return self.settings.getProperty(name) + else: + raise AttributeError(f"{name} not in oidcsettings") - @identity_domain_name.setter - def identity_domain_name(self, value): - self.settings.identity_domain_name = value + def __setattr__(self, name, value): + if self.propertymap and name in self.propertymap: + if "w" in self.propertymap[name].get("mode", ""): + return setattr(self.settings, name, value) + else: + raise TypeError(f"{name} readonly in oidcsettings") + else: + super().__setattr__(name, value) class OIDCSettingsForm(controlpanel.RegistryEditForm): @@ -167,9 +49,9 @@ def getContent(self): def updateWidgets(self): super().updateWidgets() - modes = {p["id"]: p["mode"] for p in self.getContent().settings.propertyMap()} - for id, widget in self.widgets.items(): - if id in modes and "w" not in modes.get(id): + pmap = self.getContent().settings.propertymap + for name, widget in self.widgets.items(): + if name in pmap and "w" not in pmap[id].get("mode", ""): widget.mode = DISPLAY_MODE def applyChanges(self, data): From 4e7461c98d4e32eefbcdcc8ccede7ce2fad592ca Mon Sep 17 00:00:00 2001 From: Mauro Amico Date: Thu, 12 Jun 2025 17:40:44 +0200 Subject: [PATCH 4/4] fix test --- src/pas/plugins/oidc/controlpanel/classic.py | 4 ++-- tests/functional/test_controlpanel_classic.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pas/plugins/oidc/controlpanel/classic.py b/src/pas/plugins/oidc/controlpanel/classic.py index 43a75bb..582b677 100644 --- a/src/pas/plugins/oidc/controlpanel/classic.py +++ b/src/pas/plugins/oidc/controlpanel/classic.py @@ -49,9 +49,9 @@ def getContent(self): def updateWidgets(self): super().updateWidgets() - pmap = self.getContent().settings.propertymap + pmap = self.getContent().propertymap for name, widget in self.widgets.items(): - if name in pmap and "w" not in pmap[id].get("mode", ""): + if name in pmap and "w" not in pmap[name].get("mode", ""): widget.mode = DISPLAY_MODE def applyChanges(self, data): diff --git a/tests/functional/test_controlpanel_classic.py b/tests/functional/test_controlpanel_classic.py index 917a1d8..13c7b97 100644 --- a/tests/functional/test_controlpanel_classic.py +++ b/tests/functional/test_controlpanel_classic.py @@ -14,6 +14,6 @@ def _initialize(self, browser_manager): def test_exists(self): browser = self.browser - self.browser.open(self.url) + browser.open(self.url) assert browser.url == self.url assert browser.headers["status"] == "200 OK"