From 9ecd07ca904e833ed2096bd444bceb35723690e4 Mon Sep 17 00:00:00 2001 From: Silvio Tomatis Date: Mon, 22 Nov 2021 17:03:23 +0100 Subject: [PATCH 1/2] Python 3 compatibility --- dm/zope/saml2/__init__.py | 10 +++++----- dm/zope/saml2/attribute.py | 23 +++++++++++++---------- dm/zope/saml2/authority.py | 18 +++++++----------- dm/zope/saml2/entity.py | 11 +++++++---- dm/zope/saml2/events.py | 4 ++-- dm/zope/saml2/idpsso/idpsso.py | 4 ++-- dm/zope/saml2/interfaces.py | 2 +- dm/zope/saml2/role.py | 8 ++++---- dm/zope/saml2/spsso/__init__.py | 4 ++-- dm/zope/saml2/spsso/browser/idp.py | 4 ---- dm/zope/saml2/spsso/plugin.py | 6 +++--- dm/zope/saml2/spsso/spsso.py | 11 +++++++---- dm/zope/saml2/sso.py | 2 +- 13 files changed, 54 insertions(+), 53 deletions(-) diff --git a/dm/zope/saml2/__init__.py b/dm/zope/saml2/__init__.py index 725f61c..0356e2f 100644 --- a/dm/zope/saml2/__init__.py +++ b/dm/zope/saml2/__init__.py @@ -2,8 +2,8 @@ """SAML2 support.""" def initialize(context): - from authority import SamlAuthority - from permission import manage_saml + from dm.zope.saml2.authority import SamlAuthority + from dm.zope.saml2.permission import manage_saml from dm.zope.schema.z2.constructor import add_form_factory, SchemaConfiguredZmiAddForm context.registerClass( @@ -12,6 +12,6 @@ def initialize(context): permission=manage_saml, ) - from idpsso.idpsso import initialize; initialize(context) - from spsso import initialize; initialize(context) - from entity import initialize; initialize(context) + from dm.zope.saml2.idpsso.idpsso import initialize; initialize(context) + from dm.zope.saml2.spsso import initialize; initialize(context) + from dm.zope.saml2.entity import initialize; initialize(context) diff --git a/dm/zope/saml2/attribute.py b/dm/zope/saml2/attribute.py index b1e67ae..4f9d6a4 100644 --- a/dm/zope/saml2/attribute.py +++ b/dm/zope/saml2/attribute.py @@ -11,7 +11,7 @@ provider class.""" from logging import getLogger -from zope.interface import implements +from zope.interface import implementer from AccessControl import ClassSecurityInfo from OFS.SimpleItem import SimpleItem @@ -24,11 +24,11 @@ from dm.zope.saml2.util import getCharset from dm.saml2.util import xs_convert_to_xml -from interfaces import IProvidedAttributeSchema, IRequestedAttributeSchema, \ +from dm.zope.saml2.interfaces import IProvidedAttributeSchema, IRequestedAttributeSchema, \ IItemSchema, IAttributeConsumingServiceSchema, \ ISimpleAttributeProvider -from permission import manage_saml -from role import Role +from dm.zope.saml2.permission import manage_saml +from dm.zope.saml2.role import Role logger = getLogger(__name__) @@ -43,10 +43,10 @@ class BaseAttribute(SchemaConfigured, SimpleItem): ) +@implementer(IRequestedAttributeSchema) class RequestedAttribute(BaseAttribute): meta_type = "Saml requested attribute" - implements(IRequestedAttributeSchema) SC_SCHEMAS = (IRequestedAttributeSchema,) @@ -54,14 +54,15 @@ class RequestedAttribute(BaseAttribute): type = None +@implementer(IProvidedAttributeSchema) class ProvidedAttribute(BaseAttribute): meta_type = "Saml provided attribute" - implements(IProvidedAttributeSchema) SC_SCHEMAS = (IProvidedAttributeSchema,) +@implementer(IItemSchema) class HomogenousContainer(SchemaConfigured, Folder): """Abstract base class for the implementation of homogenous containers. @@ -71,7 +72,6 @@ class HomogenousContainer(SchemaConfigured, Folder): does not use cooperative super calling. """ - implements(IItemSchema) SC_SCHEMAS = (IItemSchema,) # to be overridden by derived classes @@ -114,7 +114,10 @@ def __class_init__(cls): # cannot use the name "HomogenourContainer" here as it is not yet bound scls = super(cls, cls) else: raise SystemError("class %s has not set `CONTENT_TYPE`" % str(cls)) - scls.__class_init__.im_func(cls) + try: + scls.__class_init__.im_func(cls) + except AttributeError: + scls.__class_init__(cls) class AttributeContainer(HomogenousContainer): @@ -124,15 +127,16 @@ class AttributeContainer(HomogenousContainer): CONTENT_TYPE = ProvidedAttribute +@implementer(IAttributeConsumingServiceSchema) class AttributeConsumingService(HomogenousContainer): meta_type = "Saml attribute consuming service" - implements(IAttributeConsumingServiceSchema) SC_SCHEMAS = (IAttributeConsumingServiceSchema,) CONTENT_TYPE = RequestedAttribute +@implementer(ISimpleAttributeProvider) class SimpleAttributeProvider(AttributeContainer, Role): """Attribute provider. @@ -141,7 +145,6 @@ class SimpleAttributeProvider(AttributeContainer, Role): """ meta_type = "Saml attribute provider" - implements(ISimpleAttributeProvider) SC_SCHEMAS = ISimpleAttributeProvider, def _make_attribute_statement(self, target, req, subject, member, index): diff --git a/dm/zope/saml2/authority.py b/dm/zope/saml2/authority.py index a515552..cdf994c 100644 --- a/dm/zope/saml2/authority.py +++ b/dm/zope/saml2/authority.py @@ -1,14 +1,10 @@ # Copyright (C) 2011-2012 by Dr. Dieter Maurer """Authority and metadata.""" -from tempfile import NamedTemporaryFile - -from persistent import Persistent -from persistent.list import PersistentList from persistent.mapping import PersistentMapping from AccessControl import ClassSecurityInfo #from Globals import InitializeClass -from zope.interface import Interface, implements +from zope.interface import Interface, implementer from zope.component import getUtility from zope.event import notify from zope.lifecycleevent import ObjectModifiedEvent @@ -27,14 +23,14 @@ from dm.saml2 import signature from dm.saml2.util import utcnow -from interfaces import ISamlAuthority, \ +from dm.zope.saml2.interfaces import ISamlAuthority, \ IIdpssoRole, ISpssoRole, IApRole, IAuthnRole, IPdpRole, \ INameidFormatSupport, \ IUrlCustomizer -from permission import manage_saml -from util import ZodbSynchronized -from entity import ManageableEntityMixin, EntityManagerMixin +from dm.zope.saml2.permission import manage_saml +from dm.zope.saml2.util import ZodbSynchronized +from dm.zope.saml2.entity import ManageableEntityMixin, EntityManagerMixin # Note: `EntityByUrl` lacks a way to access the context for signature @@ -55,9 +51,9 @@ class IEntityMetadata(Interface): # a persistent list for internal purposes. # This is okay as long as we use a persistent storage (as we do). # Not using persistent classes here leads to less ZODB loads. +@implementer(IEntityMetadata) class EntityMetadata(EntityMetadata): """extend basic `EntityMetadata` by `ObjectModified` events.""" - implements(IEntityMetadata) def default_validity(self): return getUtility(ISamlAuthority).default_validity @@ -99,6 +95,7 @@ def _get_authority(self): return getUtility(ISamlAuthority) +@implementer(ISamlAuthority) class SamlAuthority(SchemaConfiguredEvolution, EntityManagerMixin, SimpleItem, SchemaConfigured, MetadataRepository ): @@ -113,7 +110,6 @@ class SamlAuthority(SchemaConfiguredEvolution, EntityManagerMixin, """ meta_type = "Saml authority" - implements(ISamlAuthority) INTERNAL_STORAGE_CLASS = PersistentMapping METADATA_STORAGE_CLASS = PersistentMapping diff --git a/dm/zope/saml2/entity.py b/dm/zope/saml2/entity.py index 3a6dfb7..9affa87 100644 --- a/dm/zope/saml2/entity.py +++ b/dm/zope/saml2/entity.py @@ -2,9 +2,12 @@ We assume that our entities are schema configured and implement `IEntity`. """ -from urllib import quote, unquote +try: + from urllib import quote, unquote +except ImportError: + from urllib.parse import quote, unquote -from zope.interface import Interface, implements +from zope.interface import implementer from zope.schema import URI, TextLine from OFS.SimpleItem import SimpleItem @@ -29,6 +32,7 @@ class IManageableEntity(IEntity): +@implementer(IManageableEntity) class ManageableEntityMixin(SchemaConfigured, SimpleItem): """Mixin class to provide `SchemaConfigured` based manageability. @@ -37,7 +41,6 @@ class ManageableEntityMixin(SchemaConfigured, SimpleItem): The instances expect to be managed inside a `MetadataRepository`. """ - implements(IManageableEntity) manage_options = ( {"label" : "Edit", "action" : "@@edit"}, @@ -88,8 +91,8 @@ class IEntityByUrl(IManageableEntity): +@implementer(IEntityByUrl) class EntityByUrl(ManageableEntityMixin, EntityByUrl): - implements(IEntityByUrl) meta_type = "Saml2 entity defined by metadata providing url" diff --git a/dm/zope/saml2/events.py b/dm/zope/saml2/events.py index 68c8689..18e29ba 100644 --- a/dm/zope/saml2/events.py +++ b/dm/zope/saml2/events.py @@ -1,11 +1,11 @@ from dm.zope.saml2.interfaces import ISamlUserAuthenticated -from zope.interface import implements +from zope.interface import implementer from zope.component.interfaces import ObjectEvent +@implementer(ISamlUserAuthenticated) class SamlUserAuthenticated(ObjectEvent): """ SAML user got authenticated :param user_id: id of authenticated user """ - implements(ISamlUserAuthenticated) diff --git a/dm/zope/saml2/idpsso/idpsso.py b/dm/zope/saml2/idpsso/idpsso.py index edf3618..9c7f4cb 100644 --- a/dm/zope/saml2/idpsso/idpsso.py +++ b/dm/zope/saml2/idpsso/idpsso.py @@ -2,7 +2,7 @@ """The Idpsso implementation.""" from datetime import timedelta -from zope.interface import implements +from zope.interface import implementer from AccessControl import ClassSecurityInfo from OFS.SimpleItem import SimpleItem @@ -25,6 +25,7 @@ # might want to implement as a tool +@implementer(ISimpleIdpsso) class SimpleIdpsso(SimpleItem, SchemaConfigured, Sso): """Zope2 implementation for a simple SAML Idpsso. @@ -36,7 +37,6 @@ class SimpleIdpsso(SimpleItem, SchemaConfigured, Sso): # how long should authentication responses be valid BROWSER_SSO_VALIDITY = timedelta(minutes=5) - implements(ISimpleIdpsso) SC_SCHEMAS = (ISimpleIdpsso,) diff --git a/dm/zope/saml2/interfaces.py b/dm/zope/saml2/interfaces.py index 8b0b34b..ac5fdda 100644 --- a/dm/zope/saml2/interfaces.py +++ b/dm/zope/saml2/interfaces.py @@ -12,7 +12,7 @@ XSCHEMA_BASE_TYPES, \ NAMEID_FORMATS -from util import vocab_from_urns +from dm.zope.saml2.util import vocab_from_urns from zope.component.interfaces import IObjectEvent _ = MessageFactory('dm_zope_saml2') diff --git a/dm/zope/saml2/role.py b/dm/zope/saml2/role.py index 7eca6b7..89bbc61 100644 --- a/dm/zope/saml2/role.py +++ b/dm/zope/saml2/role.py @@ -3,7 +3,7 @@ from logging import getLogger from os import environ -from zope.interface import implements +from zope.interface import implementer from zope.component import getUtility from BTrees.OOBTree import OOBTree from ExtensionClass import Base @@ -19,9 +19,9 @@ from dm.saml2.util import normalize_nameid_format, utcnow, as_utc from dm.saml2.binding.util import Store, UnmanagedError, RelayStateManager -from interfaces import ISamlAuthority, IHttpTransport, INameidFormatSupport, \ +from dm.zope.saml2.interfaces import ISamlAuthority, IHttpTransport, INameidFormatSupport, \ IRelayStateStore -from exception import SamlError +from dm.zope.saml2.exception import SamlError logger = getLogger(__name__) @@ -387,9 +387,9 @@ def move_handler(o, e): ###### NameID format support +@implementer(INameidFormatSupport) class NameidFormatSupport(object): """Default name id format support.""" - implements(INameidFormatSupport) def __init__(self, context): self.context = context diff --git a/dm/zope/saml2/spsso/__init__.py b/dm/zope/saml2/spsso/__init__.py index 33b36bf..69956e2 100644 --- a/dm/zope/saml2/spsso/__init__.py +++ b/dm/zope/saml2/spsso/__init__.py @@ -47,5 +47,5 @@ """ def initialize(context): - from spsso import initialize; initialize(context) - from plugin import initialize; initialize(context) + from dm.zope.saml2.spsso.spsso import initialize; initialize(context) + from dm.zope.saml2.spsso.plugin import initialize; initialize(context) diff --git a/dm/zope/saml2/spsso/browser/idp.py b/dm/zope/saml2/spsso/browser/idp.py index 4542eaf..0e2f1b9 100644 --- a/dm/zope/saml2/spsso/browser/idp.py +++ b/dm/zope/saml2/spsso/browser/idp.py @@ -1,13 +1,9 @@ # Copyright (C) 2011-2012 by Dr. Dieter Maurer """Idp related views.""" -from urllib import quote, unquote - from zope.schema import Choice, ASCIILine from zope.formlib.form import Fields, action from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm -from Products.CMFCore.utils import getToolByName - from dm.zope.schema.z2.form import PageForm from dm.zope.schema.widget import GenericTextWidget, make_hidden diff --git a/dm/zope/saml2/spsso/plugin.py b/dm/zope/saml2/spsso/plugin.py index 9a21797..bc95719 100644 --- a/dm/zope/saml2/spsso/plugin.py +++ b/dm/zope/saml2/spsso/plugin.py @@ -2,7 +2,7 @@ """PAS plugins for SAML2 based authentication (Spsso).""" from datetime import datetime -from zope.interface import implements +from zope.interface import implementer from AccessControl import ClassSecurityInfo from ZTUtils import make_query @@ -28,9 +28,10 @@ from dm.zope.saml2.interfaces import ISimpleSpssoPluginSchema, \ ISimpleSpsso -from spsso import SimpleSpsso +from dm.zope.saml2.spsso.spsso import SimpleSpsso +@implementer(ISimpleSpssoPluginSchema) class DetachedSimpleSpssoPlugin(BasePlugin, SchemaConfigured): """Spsso plugin working with a separate `Spsso`.""" @@ -40,7 +41,6 @@ class DetachedSimpleSpssoPlugin(BasePlugin, SchemaConfigured): security.declareObjectProtected(manage_saml) security.declarePublic("login") - implements(ISimpleSpssoPluginSchema) manage_options = ( {"label" : "View", "action" : "@@view"}, diff --git a/dm/zope/saml2/spsso/spsso.py b/dm/zope/saml2/spsso/spsso.py index 5f44d7c..70f6236 100644 --- a/dm/zope/saml2/spsso/spsso.py +++ b/dm/zope/saml2/spsso/spsso.py @@ -3,10 +3,13 @@ try: from hashlib import sha256 as digest_module except ImportError: import md5 as digest_module import hmac -from cPickle import loads, dumps +try: + from cPickle import loads, dumps +except ImportError: + from pickle import loads, dumps from zlib import compress, decompress -from zope.interface import implements +from zope.interface import implementer from zope.component import getUtility from AccessControl import ClassSecurityInfo @@ -30,10 +33,10 @@ from dm.zope.saml2.events import SamlUserAuthenticated +@implementer(ISimpleSpsso) class SimpleSpsso(HomogenousContainer, Sso): """Zope 2 implementation of a simple SAML2 Spsso.""" - implements(ISimpleSpsso) SC_SCHEMAS = (ISimpleSpsso,) CONTENT_TYPE = AttributeConsumingService @@ -329,9 +332,9 @@ def move_handler(o, e): sm.registerUtility(o, provided=ISimpleSpsso) +@implementer(INameidFormatSupport) class NameidFormatSupport(object): """SPSSO name id format support.""" - implements(INameidFormatSupport) def __init__(self, context): self.context = context diff --git a/dm/zope/saml2/sso.py b/dm/zope/saml2/sso.py index c0e6702..1ef886e 100644 --- a/dm/zope/saml2/sso.py +++ b/dm/zope/saml2/sso.py @@ -1,7 +1,7 @@ # Copyright (C) 2011-2012 by Dr. Dieter Maurer """Common base implementation for SSO support.""" -from role import Role +from dm.zope.saml2.role import Role class Sso(Role): """mixin class to provide common SSO services. From f09cd7d1a01d9b8a2f79ffc406dd422b4ee92462 Mon Sep 17 00:00:00 2001 From: Alec Mitchell Date: Wed, 9 Feb 2022 23:03:28 -0800 Subject: [PATCH 2/2] Python 3 and Plone 5.2 fixes. --- dm/zope/saml2/configure.zcml | 2 ++ dm/zope/saml2/spsso/spsso.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dm/zope/saml2/configure.zcml b/dm/zope/saml2/configure.zcml index e7932c3..f7d9f63 100644 --- a/dm/zope/saml2/configure.zcml +++ b/dm/zope/saml2/configure.zcml @@ -65,6 +65,8 @@ /> + +