{ "info": { "author": "Dieter Maurer", "author_email": "dieter@handshake.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Zope", "Framework :: Zope :: 4", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Topic :: Utilities" ], "description": "This package supports SAML2 based SSO (Single Sign-On) for Zope2/Plone\ninstallations.\n\nWhile it currently supports only a small subset of the\nSAML2 standard (simple identity provider, simple service provider\nintegration and attribute support),\nits current functionality is comparable to Plone's OpenId support.\n\n\n\n============\nArchitecture\n============\n\n\nIn the SAML2 architecture, a set of distributed authorities (aka entities)\ncooperate to provide an overall service. Each authority can take over\none or more roles. Roles are for example \"identity provider\" (can\nidentify users), \"service provider\" (provides some service) and\n\"attribute provider\" (can provide information about users).\nAuthorities and their roles are described by metadata. The metadata\nis exchanged between authorities to allow them to cooperate. SAML2\nmessages are exchanged to implement the SSO (and other) functionality.\n\nThe package currently provides an SAML2 authority,\na simple identity provider, a simple\nservice provider integration and a simple attribute provider.\nAll functions are implemented via objects created via the Zope management\ninterface (ZMI).\n\n\nAuthority\n=========\n\nThe SAML authority object represents the local SAML authority and\nmanages the metadata about the foreign authorities cooperating with it.\nIts ``metadata`` method (callable via url) returns the metadata\ndescribing the local authority. Foreign authorities are\nmanaged as so called `Entity` objects; their metadata are automatically\nupdated (based on validity attributes in the metadata), manual update\nis supported for special cases.\n\nThe objects implementing SAML2 roles\naccess \"their\" authority as a (Zope toolkit)\n\"utility\". To make this possible, an SAML authority can only be\ncreated below a (Zope toolkit) site (see the package\n``five.localsitemanager`` to learn about sites and how to create one).\n(CMF or Plone) portals are sites (in this sense) automatically.\nThus, in a simple setup, you can create an authority object in\na portal (without special actions concerning sites).\n\nThere can be at most one SAML authority in a given site.\nNested sites, however, may have their own authority or use that\nof a parent site.\n\n\nIdentity Provider\n=================\n\nIn general, an identity provider has the task to identify users and\nto provide assertions about user identities to service providers.\n\nThe provided simple identity provider delegates\nthe first task (identifying users) to a host CMF or Plone portal.\nThereby, it uses the standard portal functionality for login and\nauthentication; it does not make any assumption about the way\nthe portal manages its users (and their attributes) and the\ndetails of the authentication process.\nThus, almost any portal can be made into an SAML2 identity provider\nby just creating an \"Saml simple identity provider\" in the portal.\n\nOn creation, the identity provider\nregisters automatically as \"identity provider\" role\nwith an SAML authority utility. Creation fails, if this utility either\ncannot be located or already knows about an identity provider.\n\nThere is a variant identity provider which integrates elemantary\nattribute provider functionality (see section \"Attribute Support\").\n\n\nService Provider\n================\n\nIn general, an SAML2 service provider\nprovides some kind of (web) service to users and uses SAML2 to get information\nabout the identities, attributes or access rights for some of its users.\nThe service provided itself has nothing to do with SAML2; it can be\nalmost anything (using web technologies).\nOnly a small part has to do with SAML2: getting information about\nusers identified and managed externally by other SAML2 authorities.\n\nThe simple service provider functionality in this\npackage allows either a single portal\nor a family of portals sharing a common service provider description\nto get authentication information from\nan SAML2 identity provider.\nIt interfaces with the portal[s] via the miniframework \n\"pluggable authentication service\", used by (e.g.) Plone portals.\n\nIn the simple case, the (real) service is implemented by a single portal which\nshould get authentication information from one or more SAML2\nidentity providers. This use case is\nsupported by the creation of an \"Saml integrated simple spsso plugin\"\nin the portal's ``acl_users`` and the activation of its interfaces.\n\nIf the SAML2 based authentication replaces the local one, plugins\nresponsible for local authentication may need to be removed or their\ninterfaces deactivated. Some integration work is necessary, when local\nauthentication should coexist with SAML2 based authentication (essentially,\nthe login form (for local authentication) must be combined with the\nidentity provider selection (for external authentication)).\n\nIn the more complex case, the (real) service is not provided by a single\nportal but by a whole family of portals (usually providing the same service\nor slightly customized variants of the same service to different user groups)\nsharing a common service description with respect to SAML2.\nIn this case, there is a shared Saml service provider\nand each portal has an ``Saml simple spsso plugin (external spsso)``\nwhich work with the shared service provider. In this case, service provider\nand plugin communicate via cookies. Therefore, they must get the same cookies.\n\nIn fact, the simple case is a variant of the complex one where\nservice provider and plugin are implemented by the same object.\n\nWhen a service provider object is created (either standalone or\nintegrated with the plugin), it registers as \"service provider\" role\nwith an SAML authority utility. Creation fails, if this utility\neither cannot be located or already knows about a service provider.\n\nThe servide provider integration can exhibit user attributes from the\nSAML2 assertions as user properties in the portal (user properties\nare a standard feature of Plone portals -- to provide addtional\ninformation such as name, email address, ... for a user).\n\n\nAttribute Support\n=================\n\nGeneral SAML2 Attribute Support\n-------------------------------\n\nThis section sketches the general principles of SAML2 attribute\nsupport. The next section outlines the support provided by this\npackage.\n\nThe SAML2 assertions about a user can include almost arbitrary attributes\nto provide additional information (beyond the identity).\nAttributes can for example be used to inform a cooperating\nSAML authority about the name, the email address, group\nmembership or special priviledges of a user.\n\nSAML2 attributes are identified by a name format and a (formal, often\nunwieldy) name. Optionally, they can have a so called \"FriendlyName\"\nwhich should be human readable.\n\nSAML2 allows a service provider to define zero or\nmore \"AttributeConsumingService\"s. Each \"AttributeConsumingService\"\nis identified by an index (an integer) and contains a sequence\nof descriptions for \"RequestedAttribute\"s.\nWhen the service provider requests authentication for a user, it\ncan specify for which of its \"AttributeConsumingService\"s it wants\nattribute information.\n\nAn SAML2 attribute provider is able to provide attributes for users.\nMetadata tells which attributes can be provided.\n\n\nAttribute Support in this Package\n---------------------------------\n\nThis package describes attributes by objects, managed in\n\"Folder\"s and identified by (locally unique)\nids. The ids are used as \"FriendlyName\" in the\nSAML metadata and as user property name.\nThe attribute's SAML2 name format and (formal) name are specified by\nattributes of the attribute (describing) object.\n\nAttribute values can be instances of an XML-Schema elementary type\nor lists/sequences\nthereof (however, Plone may not understand some of those types).\n\nThe service provider object is implemented as a \"Folder\" of\n\"AttributeConsumingService\"s, each \"AttributConsumingService\"\nas a \"Folder\" of \"RequestedAttribute\"s. Thus, a service provider\ncan define various sets of interesting attributes. However, the\nstandard authentication request requests only the default set.\nWhile there is an authentication method which supports the\nspecification of the wanted \"AttributeConsumingService\", it is\nlikely that this in not yet handled correctly in this version.\n\nThe service provider plugin exposes the SAML2 attributes for\na user as standard (for Plone) user properties; the id of\nthe attribute description is used as user property name.\n\nThe current package version\ndoes not have a standalone attribute provider. However, there is\nan identity provider variant which has some integrated attribute provider\nfunctionality. It provides attribute information only as part\nof authentication requests.\nIt is implemented as a \"Folder\" of \"Attribute\"s which describe\nthe supported attributes and how their value can be computed.\nBy default, the id of the attribute description is interpreted\nas user property name and its value (for the current user)\nused as value for the attribute. Alternatively, the attribute definition\ncan specify an \"Evaluator\" -- the name of a method or view called\nwith parameters *member*, *attr* and *eid* to determine the attribute\nvalue. *member* is the current portal member, *attr* the attribute description\nand *eid* the entity identifier who should get the information.\n\n\n============\nDependencies\n============\n\nThe package depends on ``Zope2``. It was tested\nboth with Zope 2.10 and Zope 2.13 (therefore, it is expected to\nwork with the intermediate versions as well). For Zope versions from\n2.12 onward, you must ensure that ``five.formlib`` is installed (as\nZope 2.12 dropped ``zope.formlib`` support from the core; it was\nmoved into a the separate package ``five.formlib``).\n\nNote that one of the dependencies (``pyxb`` in version 1.1.4) has \nproblems to get installed via package managers with Python versions before\n2.6. This makes some problems with Zope 2.10 and 2.11. Consult\nthe dependecies section of ``dm.saml2`` to learn how you can work\naround this problem.\n\n\n============\nInstallation\n============\n\nYou must install the code for the package and\nensure that the package's ZCML definitions are interpreted on\nZope startup. In addition, you must ensure that on Zope startup,\nthe ``xmlsec`` library is initialized\n(by calling ``dm.xmlsec.binding.initialize()``).\n\nIn order to learn details about ``xmlsec`` signing/verification\nfailures, you might want to use ``dm.xmlsec.binding.set_error_callback``\nto let those details be logged (for details, consult\nthe ``dm.xmlsec.binding`` documentation).\n\nIn the case that you are using ``zc.buildout`` for your Zope2 installation,\nthen the installation steps can be summarized as follows:\n\n * extend the ``eggs`` definition in your ``buildout.cfg``\n by ``dm.zope.saml2`` and (in case you are using Zope2 >= 2.12)\n by ``five.formlib``.\n\n * extend the ``zcml`` definition in your ``buildout.cfg``\n by ``dm.zope.saml2``.\n\n * ensure ``dm.xmlsec.binding.initialize()`` gets called\n on Zope startup.\n\nThe default ``zope.formlib`` support for ``Password`` fields\nis very bad (it carefully hides the password on edits\nbut displays it in clear text on views; it forces\nyou to reenter the password anew whenever you save the form).\nTo get decent handling of ``Password`` fields, you may\nwant to activate the ZCML overrides of package ``dm.zope.schema``.\nIf you are using ``zc.buildout``. you can achieve this\nby extending the ``zcml`` definition in your ``buildout.cfg``\nby ``dm.zope.schema-overrides``.\n\nSAML2 stives hard for security. Therefore, it is virtually\nimpossible to use SAML2 in an identify provider\nwithout digital signatures. The\ndigital signatures are used to prevent tempering with SAML2 messages\nand to authenticate the cooperationg SAML2 authorities.\nTo effectively use SAML2 for an identity provider, you will need a certificate\nand an associated private key such that the authentication assertions\ncan be properly signed. A certificate can be obtained from a\nstandard CA (certificate authority); certificates used for HTTPS servers\nare usable. Alternatively, it may be possible (this depends\non the SAML2 partners, you want to cooperate with) to generate\nyour own certificate. \"http://www.imacat.idv.tw/tech/sslcerts.html\"\ndescribes how you can do this on a Unix-like platform.\nPrivate key and certificate are specified when you create an\nSAML authority. For service providers (in contrast to identity providers)\na certificate may not be necessary (this depends on the identity providers\nyou want to cooperate with; if they (all) accept unsigned authentication\nrequests, a private key/certificate pair is not necessary).\n\nIn case, the interaction between SAML entities poses problems,\nthe logging facility of ``dm.zope.saml2`` can be helpful.\nLogging is enabled by setting the envvar ``SAML2_ENABLE_LOGGING``\nto a non empty value. It causes all incoming and outgoing SAML\nmessages to be logged on level ``INFO``.\n\n\n=============\nCustomization\n=============\n\nThe package supports several levels of customizations:\nbasic customizations via the ZMI through configuration menues,\ncustomization by registration of adapters\nand integrating your own class implementations, possibly derived\nfrom base classes defined in this package.\n\nWhen you create objects described in the architecture section,\nyou are sent to a configuration menue to enter the\nrelevant configuration parameters. Those menues should be self\nexplanatory.\n\nVia the registration of appropriate adapters, you can\ncurrently control the supported nameid formats,\nthe storage used by the ``RelayStateManager``\nand the generation of urls for role objects.\nThe relevant adapter interfaces are defined in\n``dm.zope.saml2.interfaces``.\n\nThe built in nameid format support supports only the ``unspecified``\nformat. Via the registration of an ``INameidFormatSupport`` role\nadapter, you can control which nameid formats the adapted role\nshould support.\n\nBy default, the ``RelayManagerState`` (used to remember state\nduring the login process) is stored inside the ZODB in\na role attribute. By defining an ``IRelayStateStore``\nrole adapter you can provide a different store. Note that\nthis adaptation takes effect only during the creation of the role.\nShould you plan to switch storage at a later time, you must\ncall ``Sso.__init__`` on the role again.\nNote that aborted login processes leave state records behind.\nTo get rid of them, consider to call the role's ``clear`` method\nfrom time to time (maybe once in a month).\n\nThe generation of the role urls used in the metadata is a bit\ncomplex. The first reason is of a technical nature: the generation\nmay be activated in a context where the request object cannot be\naccessed in the normal Zope way (i.e. via acquisition);\ntherefore, the normal methods to determine an url do not work\n(reliably). The second reason comes from the fact that a Zope\ninstallation can often be accessed via different urls (e.g.\nan internal one and one via a virtual host and that the metadata is\ncached; the cached urls in the metadata must ensure they are valid\nfor all cases and therefore must not depend on the specific request\nurl that accidentally lead to their creation. To work around\nthis complexity, the default behavior is to generate the role\nurls from a base url (specified as authority configuration attribute)\nand the path to the respective role. This usually generates\nvalid urls but they are often longer than necessary and may reveal details\nof the internal structure of your Zope installation (the full path\nto the role objects) which you might want to hide.\nFor those cases, you can register an authority ``IUrlCustomizer`` adapter\nand there determine the role urls you would like.\n\nFor all cases for which the provided customization possibilities\nare not sufficient, you can define your own classes and\ninstantiate them in place of the standard ones.\n\n\n================\nInteroperability\n================\n\nI have developed this package as part of a (paid) project -\nby factoring out into this open source package\nthe parts which might be useful to others. However, I did\nnot invest much effort towards things not relevant to my project.\nEspecially, I have not performed extensive interoperability tests.\n\nThe package works for my project and it should work with\n``SimpleSAMLphp`` (http://simplesamlphp.org/) which I used\nas functional blueprint. Should I detect interoperability problems\nin future projects of mine, I will investigate and fix them.\n\nWhen you use this package in your own projects, you might\nhit interoperability problems. In those cases, you will need\nto investigate (and potentially fix them) or use another\nSAML integration. You may send me your fixes and I will consider\nwhether to incorporate them in future versions.\n\n\n\n==============\nKnown Problems\n==============\n\n\nExport/Import Problems\n======================\n\nThe package uses several Zope objects for its configuration.\nThose are not standalone but have quite a complex relationship\namong them. For example,\nidentity provider objects and service provider objects depend on\nan authority (accessed as a (local) utility) and register with it.\nThe authority must generate metadata for its roles (e.g. identity\nprovider and/or service provider) and therefore requires references\nto the corresponding configuration objects.\n\nZope's standard (ZODB based) export/import functionality operates on\na single object base. It has problems to handle object sets with\ninterdependencies (such as the SAML configuration object set).\n\nIt is known that SAML authority objects raise an exception when\nyou try to import them. There are hints that imported identity and\nservice provider objects fail to properly register themselves with\nthe autority.\n\nI do not know whether you can correctly import the whole\nconfiguration structure as part of a common container object.\nThere are hints that you must at least include in the import\nthe local component registry where the SAML authority has registered with.\n\n\nCopying/Renaming/Deleting\n=========================\n\nThe current version does not support copying and renaming of SAML\nconfiguration objects.\n\nFor a deletion, you must (usually) first delete the role objects associated\nwith an authority object before you can delete the authority object.\nGlobal deletions (which delete roles and authority together)\nmay or may not succeed dependent on the order in which the individual\nobjects are deleted internally.\n\n\nText handling\n=============\n\nA modern system should represent text internally as unicode\nand convert from/to encoded strings only at system boundaries.\nFor historical (and likely backward compatibility) reasons, Plone\ndoes not (yet) work this way: typically, while it stores unicode it\nconverts to/from encoded strings at the storage boundary; most parts\nof Plone, and especially member properties, handle encoded strings, not\nunicode. SAML2, in contrast, is a unicode based technology. This,\nunfortunately, requires a bridge between the SAML2 and the Plone world.\nTo implement the bridge, knowledge is required about the charset used by\nPlone to convert between Unicode and encoded bytes.\n\nPlone before version 5 used to make this charset configurable via a\nproperty; `Products.PlonePAS.utils` defined a function `getCharset` to\nreturn this configuration option and `dm.zope.saml2` before\nversion 4 used it to implement the bridge mentioned above.\nPlone 5, at least the dexterity part, has fixed the charset to \"utf-8\",\nthe `getCharset` function is gone.\n\nTo obtain a `dm.zope.saml2` version capable to work both with Plone 5 and\nformer Plone versions, it implements (from version 4 on)\nits own `getCharset` function\n(in its `util` module). By default, it returns \"utf-8\" as charset --\na value appropriate for most Plone setups and especially\nlikely all modern Plone setups. Should your setup use a different charset,\nyour must register a `dm.zope.saml2.util.ICharset` adapter for the\nportal root returning the charset used for the portal.\n\n\n\n\n=======\nHistory\n=======\n\n5.0\n\n Python 3/Zope 4/Plone 5.2 compatibility\n\n Improved integration with ``plone.protect``'s CSRF protection.\n **ATT** This version uses new CSRF aware data structures for\n entity and relay state management. If you upgrade from an\n earlier version, you may need to rebuild your SAML2 related\n configuration objects to profit from this better integration.\n\n Note: at the time of this release,\n \"https://github.com/plone/Products.CMFPlone/issues/2771\"\n still prevented correct use in Plone 5.2.\n\n No longer tested against Zope 2 (only Zope 4).\n Neverthelss, it might work with Zope 2.\n\n\n4.0\n\n Plone 5 compatibility. ATT: may introduce a backward incompatibility\n in the case that your portal does not use \"utf-8\" as charset.\n See the section \"Text handling\" above.\n\n The explicit login request now allows a \"caller\" to determine\n where to redirect to after a successful login by defining\n the request variable `came_from`.\n\n3.1b1\n\n Allow to specify a type for a requested attribute. This can be\n necessary as some identity providers (e.g. some from Microsoft)\n do not provide type information in ``AttributeValue`` elements\n (but rely on type information exchange in a different way).\n\n3.0b1\n\n Switch to non-naive ``datetime`` values in the UTC time zone\n (rather than naive UTC ``datetime`` values) - in the hope\n that this improves interoperability.\n \n As a consequence, generated SAML time values use a ``Z`` suffix,\n which appears to contradict section 1.3.3 of the SAML2 specification\n but which is compatible with many SAML2 implementations (e.g. Amazon AWS).\n Apparently, ``ADFS`` insists on this format.\n\n2.0b3 - 2.0b8\n\n Various fixes and improvements based on experience\n by Dylan Jay\n\n2.0b2\n\n Improves control over name identifier formats\n and the creation of name identifiers.\n\n Adds titles to entities in order to provide a more friendly\n identity provider list.\n\n Ignores signatures in metadata to avoid a chicken-and-egg problem\n (but this, of course, reduces security).\n\n Supports authentication request signing (if the identity provider\n requires this).\n\n2.0\n\n Version 2.0 uses ``dm.xmlsec.binding`` as Python binding to the XML\n security library, rather then the no longer maintained ``pyxmlsec``.\n This drastically facilitates installation.\n\n1.0\n\n Initial release based on ``pyxmlsec``.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/dm.zope.saml2", "keywords": "application development zope saml2 sso plone", "license": "ZPL", "maintainer": "", "maintainer_email": "", "name": "dm.zope.saml2", "package_url": "https://pypi.org/project/dm.zope.saml2/", "platform": "", "project_url": "https://pypi.org/project/dm.zope.saml2/", "project_urls": { "Homepage": "http://pypi.python.org/pypi/dm.zope.saml2" }, "release_url": "https://pypi.org/project/dm.zope.saml2/5.0/", "requires_dist": null, "requires_python": "", "summary": "Zope 2/Plone extension for SAML2 based Single Sign On: identity, attribute and service providers", "version": "5.0" }, "last_serial": 4860447, "releases": { "1.0b1": [ { "comment_text": "", "digests": { "md5": "6968eec23c40b320c7eb2d21b06e4a6c", "sha256": "e202cb871366eadd1b0cb0ba90ce26d9813e5a956eb7867c21efb7a37716aee7" }, "downloads": -1, "filename": "dm.zope.saml2-1.0b1.tar.gz", "has_sig": false, "md5_digest": "6968eec23c40b320c7eb2d21b06e4a6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44793, "upload_time": "2012-03-24T10:32:09", "url": "https://files.pythonhosted.org/packages/ea/8f/9ef6fe18ff45abb46f6e4ebda06bdc7d917e4a92733880d880d5682f12c2/dm.zope.saml2-1.0b1.tar.gz" } ], "1.0b2": [ { "comment_text": "", "digests": { "md5": "487350a6ca934d013b22eb916dd458cd", "sha256": "819b9b7db7c075c2f381e58cb88175aae47edac7fbb6c6eb286185108090726d" }, "downloads": -1, "filename": "dm.zope.saml2-1.0b2.tar.gz", "has_sig": false, "md5_digest": "487350a6ca934d013b22eb916dd458cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44893, "upload_time": "2012-05-31T09:51:41", "url": "https://files.pythonhosted.org/packages/1a/f6/9735f7afffb84f2ef6497d0a12d23fbdc9d5d59ff94fc608878c38be1d22/dm.zope.saml2-1.0b2.tar.gz" } ], "2.0b1": [ { "comment_text": "", "digests": { "md5": "71f8d24fe28335b9c78c1b55b0eea842", "sha256": "778e8a06f34719a523cb1991dcebb9082844d4c6da35df98e16438c363444b91" }, "downloads": -1, "filename": "dm.zope.saml2-2.0b1.tar.gz", "has_sig": false, "md5_digest": "71f8d24fe28335b9c78c1b55b0eea842", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44711, "upload_time": "2012-07-02T10:49:23", "url": "https://files.pythonhosted.org/packages/d3/d8/11540a166c409118c853dad79b112b9036bb69a9197c2ca0d5dd7b89dd62/dm.zope.saml2-2.0b1.tar.gz" } ], "2.0b2": [ { "comment_text": "", "digests": { "md5": "b50f750a6aad8165a2b1180721906e65", "sha256": "c328d7972aa4adf4445f8e001dd6fe22c7d7e08164645c9f90fab58efefca9b1" }, "downloads": -1, "filename": "dm.zope.saml2-2.0b2.tar.gz", "has_sig": false, "md5_digest": "b50f750a6aad8165a2b1180721906e65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46926, "upload_time": "2012-08-06T20:41:09", "url": "https://files.pythonhosted.org/packages/d9/27/59a402326804f569642705d4fd5bdae2ab878a54ab5ebca4ce7f3555f011/dm.zope.saml2-2.0b2.tar.gz" } ], "2.0b3": [ { "comment_text": "", "digests": { "md5": "5c936bac2b39264f3a7cd61cd33aecdc", "sha256": "55d47ea2a9a6049e3b24ad4fea5c1e24a7598507d97fa780e55b2f3e14f040c3" }, "downloads": -1, "filename": "dm.zope.saml2-2.0b3.tar.gz", "has_sig": false, "md5_digest": "5c936bac2b39264f3a7cd61cd33aecdc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46951, "upload_time": "2013-01-09T10:05:10", "url": "https://files.pythonhosted.org/packages/59/cf/cfd8902f461be141b6927653d6d96314dd7a32db4ef4afc16677ebc53edc/dm.zope.saml2-2.0b3.tar.gz" } ], "2.0b4": [ { "comment_text": "", "digests": { "md5": "c5677d6c3bc61fa4bdd73ece6c8c4aaa", "sha256": "729c130e64c208dd4ea5b0b7bfcc64f14d2a202f8216e2d3e8ac020e571adda6" }, "downloads": -1, "filename": "dm.zope.saml2-2.0b4.tar.gz", "has_sig": false, "md5_digest": "c5677d6c3bc61fa4bdd73ece6c8c4aaa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47054, "upload_time": "2013-05-19T06:28:07", "url": "https://files.pythonhosted.org/packages/bb/b7/49e8918cfd97b918daef4c034a081aa9ceee97683fa265d847f918a640df/dm.zope.saml2-2.0b4.tar.gz" } ], "2.0b5": [ { "comment_text": "", "digests": { "md5": "7033a8cacff0359900be7172f13dd0c7", "sha256": "64d8bddd1f0637c16db8a958eb2abfc966716076606c03f4934052c8795e3da6" }, "downloads": -1, "filename": "dm.zope.saml2-2.0b5.tar.gz", "has_sig": false, "md5_digest": "7033a8cacff0359900be7172f13dd0c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52225, "upload_time": "2013-06-09T13:46:46", "url": "https://files.pythonhosted.org/packages/40/61/4da9d1cc4f553cbe966fdcd78247e5215891821a1cc314a8e799307a2e4b/dm.zope.saml2-2.0b5.tar.gz" } ], "2.0b6": [ { "comment_text": "", "digests": { "md5": "1b7c02e7097dc59d81a475e28448605b", "sha256": "5c067b3667440fe70260b8a7a460aeddee2ea8808a95ba4ff69f9d4e798e755f" }, "downloads": -1, "filename": "dm.zope.saml2-2.0b6.tar.gz", "has_sig": false, "md5_digest": "1b7c02e7097dc59d81a475e28448605b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52250, "upload_time": "2014-01-10T08:48:47", "url": "https://files.pythonhosted.org/packages/fc/32/830eb768a6f34264ee4ea043d7cea5fe6a7ba4a7464bb9d4af8e8a4183bd/dm.zope.saml2-2.0b6.tar.gz" } ], "2.0b7": [ { "comment_text": "", "digests": { "md5": "b3241289023f870908d1c36a72058888", "sha256": "0190f4dcc9499af28378f31a9891c5bc2af34c8d72c205f3fbe41db681ca8a51" }, "downloads": -1, "filename": "dm.zope.saml2-2.0b7.tar.gz", "has_sig": false, "md5_digest": "b3241289023f870908d1c36a72058888", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52232, "upload_time": "2014-01-10T13:37:34", "url": "https://files.pythonhosted.org/packages/b4/8d/5377782e85101a99ab228c618204f0bf0efd1a189aae342ae2775dbb216d/dm.zope.saml2-2.0b7.tar.gz" } ], "2.0b8": [ { "comment_text": "", "digests": { "md5": "19b1a6d7d2e7d46fc24f4e8e24ae93aa", "sha256": "cd861f67628214e59c8b9088b4157a2d9018ca866bea278f838712b75f9b1990" }, "downloads": -1, "filename": "dm.zope.saml2-2.0b8.tar.gz", "has_sig": false, "md5_digest": "19b1a6d7d2e7d46fc24f4e8e24ae93aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52228, "upload_time": "2014-01-13T07:03:47", "url": "https://files.pythonhosted.org/packages/49/1e/1585bfcd42212a0beabea824609b89c87ea8891fd26a2f9410478262b0a8/dm.zope.saml2-2.0b8.tar.gz" } ], "3.0b1": [ { "comment_text": "", "digests": { "md5": "2cfb08742fe8d3d302db00a09c0c34a8", "sha256": "595192bd455c62290b398c283cc4c55d905eabaad5bc38d43b77751bc0ee4d5f" }, "downloads": -1, "filename": "dm.zope.saml2-3.0b1.tar.gz", "has_sig": false, "md5_digest": "2cfb08742fe8d3d302db00a09c0c34a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53914, "upload_time": "2014-09-24T08:54:44", "url": "https://files.pythonhosted.org/packages/50/67/855e4a12d406752c9796c0151ef2972cb32c3255d005f2aa219e7e3599a3/dm.zope.saml2-3.0b1.tar.gz" } ], "3.1b1": [ { "comment_text": "", "digests": { "md5": "ee8d6c80b03a82fdf8b13f1be442e1c6", "sha256": "cb55042aa5c87ca418d9f9e1662a4d39669ea3ebf501cd8accb36a4d97506d49" }, "downloads": -1, "filename": "dm.zope.saml2-3.1b1.tar.gz", "has_sig": false, "md5_digest": "ee8d6c80b03a82fdf8b13f1be442e1c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54333, "upload_time": "2014-12-05T11:21:14", "url": "https://files.pythonhosted.org/packages/b5/b1/cd0e056f5cac8b09c6d040cb4094153dd184dab572aa1216101736d3f1d1/dm.zope.saml2-3.1b1.tar.gz" } ], "3.1b2": [ { "comment_text": "", "digests": { "md5": "37ea6425711825061276a2700e3a1e30", "sha256": "c7b7f4444a9175ce7e4062831a32eaba4fad4a85e5769963440f491dbf968bc5" }, "downloads": -1, "filename": "dm.zope.saml2-3.1b2.tar.gz", "has_sig": false, "md5_digest": "37ea6425711825061276a2700e3a1e30", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54333, "upload_time": "2014-12-05T18:02:40", "url": "https://files.pythonhosted.org/packages/ec/a3/7c985b9560633605a08e6c51f9922cfe1ca555ce08b93cbd8a449280e31c/dm.zope.saml2-3.1b2.tar.gz" } ], "4.0": [ { "comment_text": "", "digests": { "md5": "3abb4cad1c589740949b6d4b5c35dbc8", "sha256": "fddd94e6130978eeed13e7b23df5ece5a259dbfb7ff4350fad7208e1bdb0c007" }, "downloads": -1, "filename": "dm.zope.saml2-4.0.tar.gz", "has_sig": false, "md5_digest": "3abb4cad1c589740949b6d4b5c35dbc8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56783, "upload_time": "2018-04-01T14:14:34", "url": "https://files.pythonhosted.org/packages/05/ab/c9344db5ea23bcb93a394ce33a72d4b8b315d14e37b2859ee290116bf5dd/dm.zope.saml2-4.0.tar.gz" } ], "4.0.1": [ { "comment_text": "", "digests": { "md5": "70fb7c5465136d11088ef78a8ac7a6d1", "sha256": "3727f6d6819e9b2b08d3f1c7c0a5fd2028b9593f6a3e391a1804dbcd93c03b38" }, "downloads": -1, "filename": "dm.zope.saml2-4.0.1.tar.gz", "has_sig": false, "md5_digest": "70fb7c5465136d11088ef78a8ac7a6d1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56794, "upload_time": "2018-04-02T20:50:58", "url": "https://files.pythonhosted.org/packages/57/b8/1e60c80a6ca4857eaeec5fbbc33d2cf9e7dfdbca745b86bc2ff82eab51e1/dm.zope.saml2-4.0.1.tar.gz" } ], "4.0.2": [ { "comment_text": "", "digests": { "md5": "999f41b74222d9832d2ee72f7188ce98", "sha256": "b0ff78af7ad138e6d5218f6105ec64447d0df6497f74974f64faaf3038d8a774" }, "downloads": -1, "filename": "dm.zope.saml2-4.0.2.tar.gz", "has_sig": false, "md5_digest": "999f41b74222d9832d2ee72f7188ce98", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56826, "upload_time": "2018-05-09T06:48:06", "url": "https://files.pythonhosted.org/packages/f6/45/30749c2d552d7c8128bf43dae92f395cf313e9d7f345eb932f8cab2a8df7/dm.zope.saml2-4.0.2.tar.gz" } ], "4.0.3": [ { "comment_text": "", "digests": { "md5": "1e6ccc3cd78cddf69b62af6559f96a88", "sha256": "afd4ec3d6fa1283829fd128bc0a16dd321cbde9ec050ec21f5ed5a0cf33deae8" }, "downloads": -1, "filename": "dm.zope.saml2-4.0.3.tar.gz", "has_sig": false, "md5_digest": "1e6ccc3cd78cddf69b62af6559f96a88", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56859, "upload_time": "2018-06-22T05:14:07", "url": "https://files.pythonhosted.org/packages/91/cc/9cdde0109446628104677fa4cf1df2a5d18dce46937c3b8ca479b3e45b7b/dm.zope.saml2-4.0.3.tar.gz" } ], "5.0": [ { "comment_text": "", "digests": { "md5": "c8ea6ab0cf1d40b83386d2005e9c9689", "sha256": "df63ebe22a1322b918f6522dd3f67b637924acace26b586392c8f84908f8fae8" }, "downloads": -1, "filename": "dm.zope.saml2-5.0.tar.gz", "has_sig": false, "md5_digest": "c8ea6ab0cf1d40b83386d2005e9c9689", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59530, "upload_time": "2019-02-24T09:16:45", "url": "https://files.pythonhosted.org/packages/00/4e/977dd4d3e7685a47002b07efbb32e71c1a91edcd157b540acf55513a1d79/dm.zope.saml2-5.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c8ea6ab0cf1d40b83386d2005e9c9689", "sha256": "df63ebe22a1322b918f6522dd3f67b637924acace26b586392c8f84908f8fae8" }, "downloads": -1, "filename": "dm.zope.saml2-5.0.tar.gz", "has_sig": false, "md5_digest": "c8ea6ab0cf1d40b83386d2005e9c9689", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 59530, "upload_time": "2019-02-24T09:16:45", "url": "https://files.pythonhosted.org/packages/00/4e/977dd4d3e7685a47002b07efbb32e71c1a91edcd157b540acf55513a1d79/dm.zope.saml2-5.0.tar.gz" } ] }