{ "info": { "author": "Plone Foundation", "author_email": "plone-developers@lists.sourceforge.net", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Plone", "Framework :: Plone :: 5.2", "Framework :: Zope2", "Framework :: Zope :: 4", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "Introduction\n============\n\nThis package contains utilities that can help protect parts of Plone\nor applications build on top of the Plone framework.\n\n\n1. Restricting to HTTP POST\n===========================\n\na) Using decorator\n------------------\n\nIf you only need to allow HTTP POST requests you can use the *PostOnly*\nchecker::\n\n from plone.protect import PostOnly\n from plone.protect import protect\n\n @protect(PostOnly)\n def manage_doSomething(self, param, REQUEST=None):\n pass\n\nThis checker operates only on HTTP requests; other types of requests\nare not checked.\n\nb) Passing request to a function validator\n------------------------------------------\n\nSimply::\n\n from plone.protect import PostOnly\n\n ...\n PostOnly(self.context.REQUEST)\n ...\n\n2. Form authentication (CSRF)\n=============================\n\nA common problem in web applications is Cross Site Request Forgery or CSRF.\nThis is an attack method in which an attacker tricks a browser to do a HTTP\nform submit to another site. To do this the attacker needs to know the exact\nform parameters. Form authentication is a method to make it impossible for an\nattacker to predict those parameters by adding an extra authenticator which\ncan be verified.\n\nGenerating the token\n--------------------\n\nTo use the form authenticator you first need to insert it into your form.\nThis can be done using a simple TAL statement inside your form::\n\n \n\nthis will produce a HTML input element with the authentication information.\n\nIf you want to create the token value programmatically, use the following::\n\n from plone.protect.authenticator import createToken\n token = createToken()\n\nValidating the token\n--------------------\n\na) Zope Component Architecture way\n**********************************\n\nNext you need to add logic somewhere to verify the authenticator. This\ncan be done using a call to the authenticator view. For example::\n\n authenticator=getMultiAdapter((context, request), name=u\"authenticator\")\n if not authenticator.verify():\n raise Unauthorized\n\nb) Using decorator\n******************\n\nYou can do the same thing more conveniently using the ``protect`` decorator::\n\n from plone.protect import CheckAuthenticator\n from plone.protect import protect\n\n @protect(CheckAuthenticator)\n def manage_doSomething(self, param, REQUEST=None):\n pass\n\nc) Passing request to a function validator\n******************************************\n\nOr just::\n\n from plone.protect import CheckAuthenticator\n\n ...\n CheckAuthenticator(self.context.REQUEST)\n ...\n\nHeaders\n-------\n\nYou can also pass in the token by using the header ``X-CSRF-TOKEN``. This can be\nuseful for AJAX requests.\n\n\nProtect decorator\n=================\n\nThe most common way to use plone.protect is through the ``protect``\ndecorator. This decorator takes a list of *checkers* as parameters: each\nchecker will check a specific security aspect of the request. For example::\n\n from plone.protect import protect\n from plone.protect import PostOnly\n\n @protect(PostOnly)\n def SensitiveMethod(self, REQUEST=None):\n # This is only allowed with HTTP POST requests.\n\nThis **relies** on the protected method having a parameter called **REQUEST (case sensitive)**.\n\nCustomized Form Authentication\n------------------------------\n\nIf you'd like use a different authentication token for different forms,\nyou can provide an extra string to use with the token::\n\n \n \n \n\nTo verify::\n\n authenticator=getMultiAdapter((context, request), name=u\"authenticator\")\n if not authenticator.verify('a-form-related-value'):\n raise Unauthorized\n\nWith the decorator::\n\n from plone.protect import CustomCheckAuthenticator\n from plone.protect import protect\n\n @protect(CustomCheckAuthenticator('a-form-related-value'))\n def manage_doSomething(self, param, REQUEST=None):\n pass\n\n\nAutomatic CSRF Protection\n=========================\n\nSince version 3, plone.protect provides automatic CSRF protection. It does\nthis by automatically including the auth token to all internal forms when\nthe user requesting the page is logged in.\n\nAdditionally, whenever a particular request attempts to write to the ZODB,\nit'll check for the existence of a correct auth token.\n\n\nAllowing write on read programmatically\n---------------------------------------\n\nWhen you need to allow a known write on read, you've got several options.\n\nAdding a CSRF token to your links\n**********************************\n\nIf you've got a GET request that causes a known write on read, your first\noption should be to simply add a CSRF token to the URLs that result in that\nrequest. ``plone.protect`` provides the ``addTokenToUrl`` function for this\npurpose::\n\n from plone.protect.utils import addTokenToUrl\n\n url = addTokenToUrl(url)\n\n\nIf you just want to allow an object to be writable on a request...\n******************************************************************\n\nYou can use the ``safeWrite`` helper function::\n\n from plone.protect.utils import safeWrite\n\n safeWrite(myobj, request)\n\n\nMarking the entire request as safe\n**********************************\n\nJust add the ``IDisableCSRFProtection`` interface to the current request\nobject::\n\n from plone.protect.interfaces import IDisableCSRFProtection\n from zope.interface import alsoProvides\n\n alsoProvides(request, IDisableCSRFProtection)\n\nWarning! When you do this, the current request is susceptible to CSRF\nexploits so do any required CSRF protection manually.\n\n\nClickjacking Protection\n=======================\n\nplone.protect also provides, by default, clickjacking protection since\nversion 3.0.\n\nTo protect against this attack, Plone uses the X-Frame-Options\nheader. plone.protect will set the X-Frame-Options value to ``SAMEORIGIN``.\n\nTo customize this value, you can set it to a custom value for a custom view\n(e.g. ``self.request.response.setHeader('X-Frame-Options', 'ALLOWALL')``),\noverride it at your proxy server, or you can set the environment variable of\n``PLONE_X_FRAME_OPTIONS`` to whatever value you'd like plone.protect to set\nthis to globally.\n\nYou can opt out of this by making the environment variable empty.\n\n\nDisable All Automatic CSRF Protection\n=====================================\n\nTo disable all automatic CSRF protection, set the environment variable\n``PLONE_CSRF_DISABLED`` value to ``true``.\n\n.. Warning::\n\n It is very dangerous to do this. Do not do this unless the ZEO client\n with this setting is not public and you know what you are doing.\n\n.. Note::\n This doesn't disable explicit and manual CSRF protection checks.\n\n\nFixing CSRF Protection failures in tests\n========================================\n\nIf you get ``Unauthorized`` errors in tests due to unprotected form submission\nwhere normally automatic protection would be in place you can use the following\nblueprint to protect your forms::\n\n from plone.protect.authenticator import createToken\n from ..testing import MY_INTEGRATION_TESTING_LAYER\n import unittest\n\n class MyTest(unittest.TestCase):\n\n layer = MY_INTEGRATION_TESTING_LAYER\n\n def setUp(self):\n self.request = self.layer['request']\n # Disable plone.protect for these tests\n self.request.form['_authenticator'] = createToken()\n # Eventuelly you find this also useful\n self.request.environ['REQUEST_METHOD'] = 'POST'\n\n\nNotes\n=====\n\nThis package monkey patches a number of modules in order to better handle CSRF\nprotection::\n\n - Archetypes add forms, add csrf\n - Zope2 object locking support\n - pluggable auth csrf protection\n\nIf you are using a proxy cache in front of your site, be aware that\nyou will need to clear the entry for ``++resource++protect.js`` every\ntime you update this package or you will find issues with modals while\nediting content.\n\n\nCompatibility\n=============\n\n``plone.protect`` version 3 was made for Plone 5. You can use it on\nPlone 4 for better protection, but you will need the\n``plone4.csrffixes`` hotfix package as well to avoid getting\nneedless warnings or errors. See the `hotfix announcement`_ and the\n`hotfix page`_.\n\n.. _`hotfix announcement`: https://plone.org/products/plone/security/advisories/security-vulnerability-20151006-csrf\n.. _`hotfix page`: https://plone.org/products/plone-hotfix/releases/20151006\n\nChangelog\n=========\n\n.. You should *NOT* be adding new change log entries to this file.\n You should create a file in the news directory instead.\n For helpful instructions, please see:\n https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst\n\n.. towncrier release notes start\n\n4.1.3 (2019-08-23)\n------------------\n\nBug fixes:\n\n\n- When marking an OOBTree as safe, also mark its buckets as safe. Fixes issues with objects that have many annotations. (#88)\n\n\n4.1.2 (2019-02-13)\n------------------\n\nBug fixes:\n\n\n- Avoid deprecation warnings. [gforcada] (#87)\n\n\n4.1.1 (2018-12-11)\n------------------\n\nBreaking changes:\n\n- Remove five.globalrequest dependency.\n It has been deprecated upstream (Zope 4).\n [gforcada]\n\n\n4.1.0 (2018-11-02)\n------------------\n\nBreaking changes:\n\n- Adapt to changed visibility of `buildfacade` in\n `AccessControl.requestmethod`. Requires AccessControl >= 4.0b6\n [tschorr]\n\nBug fixes:\n\n- More Python 2 / 3 compatibility\n [pbauer, MatthewWilkes]\n\n- Fix marmoset monkey patching for Python 3\n [jensens]\n\n- Don't patch until zcml loaded\n [davisagli]\n\n- Put the marmoset on a leash (reset csrf-checks after tests)\n [davisagli]\n\n\n4.0.1 (2018-07-16)\n------------------\n\nBug fixes:\n\n- Fix package dependencies;\n ``cssselect`` has been an extra of ``lxml`` since 2014 (closes `#79 `_).\n [hvelarde]\n\n- Fixed tests to work with merged plone.login\n [jensens]\n\n\n4.0.0 (2018-07-16)\n------------------\n\nBreaking changes:\n\n- Version 3.1.3 introduced a Python 3 compatibility fix that broke some Python 2 versions with a ``SyntaxError``.\n Reports are mostly for Python 2.7.8 and lower, but also one for 2.7.14, but only on Travis.\n So this marks a breaking change.\n The incompatibility will be reverted on branch 3.x.\n Version 3.1.4 should be safe to use again.\n See `issue 74 `_.\n and `issue 75 `_.\n [maurits]\n\nBug fixes:\n\n- Avoid CSRF warnings due to generating image scales\n stored in a plone.scale.storage.ScalesDict.\n [davisagli]\n\n\n3.1.3 (2018-04-04)\n------------------\n\nBug fixes:\n\n- More Python 2 / 3 compatibility.\n Warning: this gives a SyntaxError on Python 2.7.8 or lower.\n See `issue 74 `_.\n [pbauer]\n\n\n3.1.2 (2018-02-02)\n------------------\n\nBug fixes:\n\n- Transform does not log a warning for empty responses\n (Fixes https://github.com/plone/plone.protect/issues/15)\n [fRiSi]\n\n- Add Python 2 / 3 compatibility\n [vincero]\n\n\n3.1.1 (2017-08-27)\n------------------\n\nBug fixes:\n\n- README wording tweaks\n [tkimnguyen]\n\n\n3.1 (2017-08-14)\n----------------\n\nNew features:\n\n- Log forbidden URLs.\n Fixes https://github.com/plone/plone.protect/issues/66\n [gforcada]\n\n\n3.0.26 (2017-08-04)\n-------------------\n\nNew features:\n\n- Catch ``AttributeError`` on transform.\n [hvelarde]\n\n\n3.0.25 (2017-07-18)\n-------------------\n\nBug fixes:\n\n- Fix logging to no longer write traceback to stdout, but include it in the\n logging message instead.\n [jone]\n\n\n3.0.24 (2017-07-03)\n-------------------\n\nBug fixes:\n\n- Remove unittest2 dependency\n [kakshay21]\n\n\n3.0.23 (2016-11-26)\n-------------------\n\nBug fixes:\n\n- Allow ``confirm-action`` for all contexts, instead of only Plone Site root.\n This avoids an error when calling it on a subsite.\n Fixes `issue #51 `_.\n [maurits]\n\n- Code Style: utf8-headers, import sorting, new style namespace declaration, autopep8\n [jensens]\n\n- Fix #57: Html must contain \"body\", otherwise plone.protect breaks.\n [jensens]\n\n\n3.0.22 (2016-11-17)\n-------------------\n\nBug fixes:\n\n- avoid zope.globalrequest.getRequest()\n [tschorr]\n\n\n3.0.21 (2016-10-05)\n-------------------\n\nBug fixes:\n\n- Avoid regenerating image scale over and over in Plone 4.\n Avoid (unnoticed) error when refreshing lock in Plone 4,\n plus a few other cases that were handled by plone4.csrffixes.\n Fixes https://github.com/plone/plone.protect/issues/47\n [maurits]\n\n\n3.0.20 (2016-09-08)\n-------------------\n\nBug fixes:\n\n- Only try the confirm view for urls that are in the portal.\n This applies PloneHotfix20160830. [maurits]\n\n- Removed ``RedirectTo`` patch. The patch has been merged to\n ``Products.CMFFormController`` 3.0.7 (Plone 4.3 and 5.0) and 3.1.2\n (Plone 5.1). Note that we are not requiring those versions in our\n ``setup.py``, because the code in this package no longer needs it.\n [maurits]\n\n\n3.0.19 (2016-08-19)\n-------------------\n\nNew:\n\n- Added protect.js from plone4.csrffixes. This adds an ``X-CSRF-TOKEN``\n header to ajax requests.\n Fixes https://github.com/plone/plone.protect/issues/42\n [maurits]\n\nFixes:\n\n- Use zope.interface decorator.\n [gforcada]\n\n\n3.0.18 (2016-02-25)\n-------------------\n\nFixes:\n\n- Fixed AttributeError when calling ``safeWrite`` on a\n ``TestRequest``, because this has no ``environ.``. [maurits]\n\n\n3.0.17 (2015-12-07)\n-------------------\n\nFixes:\n\n- Internationalized button in confirm.pt.\n [vincentfretin]\n\n\n3.0.16 (2015-11-05)\n-------------------\n\nFixes:\n\n- Make sure transforms don't fail on redirects.\n [lgraf]\n\n\n3.0.15 (2015-10-30)\n-------------------\n\n- make sure to always compare content type with a string when checking\n if we should show the confirm-action view.\n [vangheem]\n\n- Internationalized confirm.pt\n [vincentfretin]\n\n- Disable editable border for @@confirm-action view.\n [lgraf]\n\n- Make title and description show up on @@confirm-action view.\n [lgraf]\n\n- Allow views to override 'X-Frame-Options' by setting the response header\n manually.\n [alecm]\n\n- Avoid parsing redirect responses (this avoids a warning on the log files).\n [gforcada]\n\n3.0.14 (2015-10-08)\n-------------------\n\n- Handle TypeError caused by getToolByName on an\n invalid context\n [vangheem]\n\n- You can opt out of clickjacking protection by setting the\n environment variable ``PLONE_X_FRAME_OPTIONS`` to an empty string.\n [maurits]\n\n- Be more flexible in parsing the ``PLONE_CSRF_DISABLED`` environment\n variable. We are no longer case sensitive, and we accept ``true``,\n ``t``, ``yes``, ``y``, ``1`` as true values.\n [maurits]\n\n- Avoid TypeError when checking the content-type header.\n [maurits]\n\n\n3.0.13 (2015-10-07)\n-------------------\n\n- Always force html serializer as the XHTML variant seems\n to cause character encoding issues\n [vangheem]\n\n3.0.12 (2015-10-06)\n-------------------\n\n- Do not check writes to temporary storage like session storage\n [davisagli]\n\n3.0.11 (2015-10-06)\n-------------------\n\n- play nicer with inline JavaScript\n [vangheem]\n\n\n3.0.10 (2015-10-06)\n-------------------\n\n- make imports backward compatible\n [vangheem]\n\n\n3.0.9 (2015-09-27)\n------------------\n\n- patch pluggable auth with marmoset patch because\n the patch would not apply otherwise depending on\n somewhat-random import order\n [vangheem]\n\n- get auto-csrf protection working on the zope root\n [vangheem]\n\n\n3.0.8 (2015-09-20)\n------------------\n\n- conditionally patch Products.PluggableAuthService if needed\n [vangheem]\n\n- Do not raise ComponentLookupError on transform\n [vangheem]\n\n\n3.0.7 (2015-07-24)\n------------------\n\n- Fix pluggable auth CSRF warnings on zope root. Very difficult to reproduce.\n Just let plone.protect do it's job also on zope root.\n [vangheem]\n\n\n3.0.6 (2015-07-20)\n------------------\n\n- Just return if the request object is not valid.\n [vangheem]\n\n\n3.0.5 (2015-07-20)\n------------------\n\n- fix pluggable auth CSRF warnings\n [vangheem]\n\n- fix detecting safe object writes on non-GET requests\n [vangheem]\n\n- instead of using _v_safe_write users should now use the safeWrite function\n in plone.protect.auto\n [vangheem]\n\n\n3.0.4 (2015-05-13)\n------------------\n\n- patch locking functions to use _v_safe_write attribute\n [vangheem]\n\n- Be able to use _v_safe_write attribute to specify objects are safe to write\n [vangheem]\n\n\n3.0.3 (2015-03-30)\n------------------\n\n- handle zope root not having IKeyManager Utility and CRSF protection\n not being supported on zope root requests yet\n [vangheem]\n\n3.0.2 (2015-03-13)\n------------------\n\n- Add ITransform.transformBytes for protect transform to fix compatibility\n with plone.app.blocks' ESI-rendering\n [atsoukka]\n\n\n3.0.1 (2014-11-01)\n------------------\n\n- auto CSRF protection: check for changes on all the storages\n [mamico]\n\n- CSRF test fixed\n [mamico]\n\n\n3.0.0 (2014-04-13)\n------------------\n\n- auto-rotate keyrings\n [vangheem]\n\n- use specific keyring for protected forms\n [vangheem]\n\n- add automatic clickjacking protection(thanks to Manish Bhattacharya)\n [vangheem]\n\n- add automatic CSRF protection\n [vangheem]\n\n\n2.0.2 (2012-12-09)\n------------------\n\n- Use constant time comparison to verify the authenticator. This is part of the\n fix for https://plone.org/products/plone/security/advisories/20121106/23\n [davisagli]\n\n- Add MANIFEST.in.\n [WouterVH]\n\n- Add ability to customize the token created.\n [vangheem]\n\n\n2.0 - 2010-07-18\n----------------\n\n- Update license to BSD following board decision.\n http://lists.plone.org/pipermail/membership/2009-August/001038.html\n [elro]\n\n2.0a1 - 2009-11-14\n------------------\n\n- Removed deprecated AuthenticateForm class and zope.deprecation dependency.\n [hannosch]\n\n- Avoid deprecation warning for the sha module in Python 2.6.\n [hannosch]\n\n- Specify package dependencies\n [hannosch]\n\n1.1 - 2008-06-02\n----------------\n\n- Add an optional GenericSetup profile to make it easier to install\n plone.protect.\n [mj]\n\n1.0 - 2008-04-19\n----------------\n\n- The protect decorator had a serious design flaw which broke it. Added\n proper tests for it and fixed the problems.\n [wichert]\n\n1.0rc1 - 2008-03-28\n-------------------\n\n- Rename plone.app.protect to plone.protect: there is nothing Plone-specific\n about the functionality in this package and it really should be used outside\n of Plone as well.\n [wichert]\n\n- Made utils.protect work with Zope >= 2.11.\n [stefan]\n\n1.0b1 - March 7, 2008\n---------------------\n\n- Refactor the code to offer a generic protect decorator for methods\n which takes a list of checkers as options. Add checkers for both the\n authenticator verification and HTTP POST-only.\n [wichert]\n\n1.0a1 - January 27, 2008\n------------------------\n\n- Initial release\n [wichert]\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://pypi.org/project/plone.protect", "keywords": "zope security CSRF", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "plone.protect", "package_url": "https://pypi.org/project/plone.protect/", "platform": "", "project_url": "https://pypi.org/project/plone.protect/", "project_urls": { "Homepage": "https://pypi.org/project/plone.protect" }, "release_url": "https://pypi.org/project/plone.protect/4.1.3/", "requires_dist": [ "lxml[cssselect]", "setuptools", "plone.keyring (>=3.0dev)", "six", "zope.component", "zope.interface", "Zope2", "plone.transformchain", "repoze.xmliter (>=0.3)", "collective.monkeypatcher", "plone.app.testing ; extra == 'test'", "Products.CMFPlonezope.annotation ; extra == 'test'" ], "requires_python": "", "summary": "Security for browser forms", "version": "4.1.3" }, "last_serial": 5720374, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "0dc9af3540627273e159c6f0254ac159", "sha256": "15962807e9eb2e5376f802a343feb2e0a9301216b4ffc9ea6af65b9f8fd3bbdd" }, "downloads": -1, "filename": "plone.protect-1.0-py2.4.egg", "has_sig": false, "md5_digest": "0dc9af3540627273e159c6f0254ac159", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 18542, "upload_time": "2008-04-19T15:37:39", "url": "https://files.pythonhosted.org/packages/52/bf/39e14603b0df117c27f95b3705ab671499d1c34e535d88b5c7e8d9d1c247/plone.protect-1.0-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "da463201541d6d01ab5ccc30f007516a", "sha256": "71a04881b697af3b8cee678e2de3dff8d27c3e4d44b06dec999fb6052bee4fd8" }, "downloads": -1, "filename": "plone.protect-1.0.tar.gz", "has_sig": false, "md5_digest": "da463201541d6d01ab5ccc30f007516a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11166, "upload_time": "2008-04-19T15:37:38", "url": "https://files.pythonhosted.org/packages/f4/a5/9a2c19b3eb2d5d3041ea73c89ceaad3607bef008e3eba8c94986711fc0d0/plone.protect-1.0.tar.gz" } ], "1.0rc1": [ { "comment_text": "", "digests": { "md5": "2e37c56acee04fe7dfc155a7ffba882a", "sha256": "13e717bfeca10fb29d1bce9cf23021ac97c956d01e94199b856614e82a3e9d89" }, "downloads": -1, "filename": "plone.protect-1.0rc1-py2.4.egg", "has_sig": false, "md5_digest": "2e37c56acee04fe7dfc155a7ffba882a", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 16539, "upload_time": "2008-03-27T23:22:49", "url": "https://files.pythonhosted.org/packages/14/dc/629e5f4e6f2fb98ec006c7e33f5a8579dcd3f72b5f5a434b5e6e3e37941c/plone.protect-1.0rc1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "d4a7b82c4f7d9ac2e085ee03c63970ee", "sha256": "efeb24a00174a81d6fb926361374335498c1fbdad7efbba2787d71ce2db64a76" }, "downloads": -1, "filename": "plone.protect-1.0rc1.tar.gz", "has_sig": false, "md5_digest": "d4a7b82c4f7d9ac2e085ee03c63970ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10976, "upload_time": "2008-03-27T23:22:49", "url": "https://files.pythonhosted.org/packages/76/0c/f3089b32fa3705bc9197cb84e55660ca86a56aa1b8718ffa34fc2872bc13/plone.protect-1.0rc1.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "2d4e24161f72e7a38c376c6faa865d44", "sha256": "df3e46f5e4b3bbc5d20869dfa502b45dad470e47d04dc44dde519761ee532537" }, "downloads": -1, "filename": "plone.protect-1.1-py2.4.egg", "has_sig": false, "md5_digest": "2d4e24161f72e7a38c376c6faa865d44", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 19080, "upload_time": "2008-06-02T21:56:12", "url": "https://files.pythonhosted.org/packages/1b/dc/bd9b2b2437921b42c9bcf99a87c971d0f6eebf77445a2fa4470fc02bfc20/plone.protect-1.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "b801d80abca4decc86cfc0092b86e33b", "sha256": "d139ad414801d89b5d62a57223721f11a921aa0a344a105262e3d77d78822688" }, "downloads": -1, "filename": "plone.protect-1.1.tar.gz", "has_sig": false, "md5_digest": "b801d80abca4decc86cfc0092b86e33b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12933, "upload_time": "2008-06-02T21:56:12", "url": "https://files.pythonhosted.org/packages/ea/6e/8f90bd75f90ef2ee5e58b47a377da93db428f1169f531c76dc092c36c9e1/plone.protect-1.1.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "83c797d36c4bb8cdeefd953da7352ccc", "sha256": "4b2f018a8c0cae82a5d8030fcd81a53a5cc06a4907cc9e36ae1b3f40f0954828" }, "downloads": -1, "filename": "plone.protect-2.0.zip", "has_sig": false, "md5_digest": "83c797d36c4bb8cdeefd953da7352ccc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15960, "upload_time": "2010-07-18T17:04:39", "url": "https://files.pythonhosted.org/packages/7f/83/f7b207929b45678237172e6a9655b14284f03752be171449232e4e9a173a/plone.protect-2.0.zip" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "74925ffb08782e72f9b1e850fa78fffa", "sha256": "c91f7873ca4155a14ee6e7720ede08d09d59c2acc416397ce97928fc41cc24d7" }, "downloads": -1, "filename": "plone.protect-2.0.2.zip", "has_sig": false, "md5_digest": "74925ffb08782e72f9b1e850fa78fffa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18376, "upload_time": "2012-12-10T16:51:44", "url": "https://files.pythonhosted.org/packages/a6/1f/62dba50144b92feb7ea10fcd200a0f370b6bbd6aa09c7d7fd7ee39d4c15a/plone.protect-2.0.2.zip" } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "562557e979de8132fcce588ee35f3d65", "sha256": "44ea12aa6eb3aa94c0f3a75914c83f8f5d031f78fb3fefcda77927fd3ec82158" }, "downloads": -1, "filename": "plone.protect-2.0.3.tar.gz", "has_sig": false, "md5_digest": "562557e979de8132fcce588ee35f3d65", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11558, "upload_time": "2016-02-24T22:23:35", "url": "https://files.pythonhosted.org/packages/1e/5f/c8223a3d1afdf153ef5713dbebc0a3684096e08b42ae0221599ff65ee2cd/plone.protect-2.0.3.tar.gz" } ], "2.0a1": [ { "comment_text": "", "digests": { "md5": "e82bcb39243173e2c9edbb7522490c3d", "sha256": "08cd921da861ffd5db7c180ac9397fbafe03622ec16eee9fd44755bfcc465a5d" }, "downloads": -1, "filename": "plone.protect-2.0a1.zip", "has_sig": false, "md5_digest": "e82bcb39243173e2c9edbb7522490c3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20173, "upload_time": "2009-11-14T19:47:31", "url": "https://files.pythonhosted.org/packages/d7/67/57da44124187d470bebd2d467a8c6575316a44d38867dd884b238a5f5954/plone.protect-2.0a1.zip" } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "d175c98d1a370a118b0dcd8b01d9f09b", "sha256": "18b9b10996f0828ebcb075de08966c2bb2ad971c78e587dc3796bb34314c51d3" }, "downloads": -1, "filename": "plone.protect-3.0.0.zip", "has_sig": false, "md5_digest": "d175c98d1a370a118b0dcd8b01d9f09b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30678, "upload_time": "2014-04-14T01:45:25", "url": "https://files.pythonhosted.org/packages/7b/cd/b38dcca7b0fae29db93b3dbfa3acc14b2d54714f175a5f9c4c42d6456383/plone.protect-3.0.0.zip" } ], "3.0.1": [ { "comment_text": "", "digests": { "md5": "1b0ae900759c6579b3594168988921ad", "sha256": "2b3bde566c58931ec807425f1a476b5efca405bde4a8ac2f6b68b59467bd0398" }, "downloads": -1, "filename": "plone.protect-3.0.1.zip", "has_sig": false, "md5_digest": "1b0ae900759c6579b3594168988921ad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31191, "upload_time": "2014-11-01T10:22:16", "url": "https://files.pythonhosted.org/packages/df/48/0e6843e9129aedae4003ba975e3868a1693eb9b394cbe41424c0ed99d5a0/plone.protect-3.0.1.zip" } ], "3.0.10": [ { "comment_text": "", "digests": { "md5": "ee9d7b3f189d138b665fb8c53bb25455", "sha256": "bdc30dcbf5bed6b8176d0c5db0cdbe85c672acf56fbdca6c696b994482640d69" }, "downloads": -1, "filename": "plone.protect-3.0.10.zip", "has_sig": false, "md5_digest": "ee9d7b3f189d138b665fb8c53bb25455", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35504, "upload_time": "2015-10-06T12:01:11", "url": "https://files.pythonhosted.org/packages/ef/5c/75407e411c76c9879f6c1057098db0245e4b9ee0b81f5286b6fceb597da0/plone.protect-3.0.10.zip" } ], "3.0.10.dev0": [ { "comment_text": "", "digests": { "md5": "9d3a6d61a17f4f00e37b0fd724bff98d", "sha256": "e3580c13bdf34ed787d790cfbae0c112a7ef05e847dcda6d7cb429e216f9f0f0" }, "downloads": -1, "filename": "plone.protect-3.0.10.dev0.tar.gz", "has_sig": false, "md5_digest": "9d3a6d61a17f4f00e37b0fd724bff98d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22748, "upload_time": "2015-10-06T11:59:20", "url": "https://files.pythonhosted.org/packages/2a/1c/e5d0b332ffe5834ae01bb844ac6c4956905d0fe3229def72980067c06227/plone.protect-3.0.10.dev0.tar.gz" } ], "3.0.11": [ { "comment_text": "", "digests": { "md5": "d4228303aecbb497b781573d8fb0db45", "sha256": "87ff30369e6fdb82791211194eebb1899262885f01f875bf5f9d04c9ac81103a" }, "downloads": -1, "filename": "plone.protect-3.0.11.zip", "has_sig": false, "md5_digest": "d4228303aecbb497b781573d8fb0db45", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35825, "upload_time": "2015-10-06T14:38:02", "url": "https://files.pythonhosted.org/packages/d6/59/744d2ac61abfc85780a9c23be48d77db5cd481c5df6d95207d2f2afd527c/plone.protect-3.0.11.zip" } ], "3.0.12": [ { "comment_text": "", "digests": { "md5": "0922e515bee939343351107d115a9ea1", "sha256": "38d563cf3c289cf32e71ec5839515b7e0d7d3cf5bb56f65a54461be2e80e4ac4" }, "downloads": -1, "filename": "plone.protect-3.0.12.zip", "has_sig": false, "md5_digest": "0922e515bee939343351107d115a9ea1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35994, "upload_time": "2015-10-06T18:22:21", "url": "https://files.pythonhosted.org/packages/2b/0c/813a11bc5123f099d74cb1bf8d36b6a16af4c7104358a251d2470af1967a/plone.protect-3.0.12.zip" } ], "3.0.13": [ { "comment_text": "", "digests": { "md5": "1ce743ac61414cfae736c3d54eec1655", "sha256": "775c204b854424caf6a108a72f440e509973dce603781d545d54b2dee97e776b" }, "downloads": -1, "filename": "plone.protect-3.0.13.zip", "has_sig": false, "md5_digest": "1ce743ac61414cfae736c3d54eec1655", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36062, "upload_time": "2015-10-07T16:30:36", "url": "https://files.pythonhosted.org/packages/19/63/0904e58a3944163555fd1a9a8a8c6df6d06e7d1e1ef1dafd6e2f0b712d81/plone.protect-3.0.13.zip" } ], "3.0.14": [ { "comment_text": "", "digests": { "md5": "f733c3bbdc2a4f948d4b290ca788f6a2", "sha256": "a0559ad511fbe514af41f34c2cfa8c6cbf32ab9889a67cca2d66da8e9c62d25d" }, "downloads": -1, "filename": "plone.protect-3.0.14.zip", "has_sig": false, "md5_digest": "f733c3bbdc2a4f948d4b290ca788f6a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36828, "upload_time": "2015-10-08T19:27:08", "url": "https://files.pythonhosted.org/packages/eb/bc/55d80f2c55801a57a972265da3ea175f5c3910c3d9241d9a1661e9eae1b0/plone.protect-3.0.14.zip" } ], "3.0.15": [ { "comment_text": "", "digests": { "md5": "a8ef6a032a744142c4111dcece2aa734", "sha256": "b089e8723882e897ccef01c9462b3bc950f8ad61529920ababf84873a65f6620" }, "downloads": -1, "filename": "plone.protect-3.0.15.zip", "has_sig": false, "md5_digest": "a8ef6a032a744142c4111dcece2aa734", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38293, "upload_time": "2015-10-30T14:55:20", "url": "https://files.pythonhosted.org/packages/bb/16/32f2153a9f901bdde604872512cebba3fc9b123c72e164cb62d82f6227d9/plone.protect-3.0.15.zip" } ], "3.0.16": [ { "comment_text": "", "digests": { "md5": "bbc2f9a4386c0c3772efa151cc88bf50", "sha256": "851dffbd433f66033dcfa98ae7d80f835814fddcd3d5d36ccab56de95bcecad2" }, "downloads": -1, "filename": "plone.protect-3.0.16.tar.gz", "has_sig": false, "md5_digest": "bbc2f9a4386c0c3772efa151cc88bf50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25030, "upload_time": "2015-11-05T12:39:04", "url": "https://files.pythonhosted.org/packages/73/da/a390074eeab0d9f2a5ac9c46d53d719df4cd9006775d4a88dbbe03ecada8/plone.protect-3.0.16.tar.gz" } ], "3.0.17": [ { "comment_text": "", "digests": { "md5": "e50b532e6c08fa230a48b245fc561816", "sha256": "7c0137493e472b0e28a55e0dd0a588fe23d22f3fed8f9b2a1a404371a3ca5112" }, "downloads": -1, "filename": "plone.protect-3.0.17.tar.gz", "has_sig": false, "md5_digest": "e50b532e6c08fa230a48b245fc561816", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25751, "upload_time": "2015-12-07T07:14:31", "url": "https://files.pythonhosted.org/packages/ae/3b/56665f27c85b2893674a31c074c25be323e5e5e7d9ec669144ad6db2f977/plone.protect-3.0.17.tar.gz" } ], "3.0.18": [ { "comment_text": "", "digests": { "md5": "17f4834c8d2f9d420fca84bb79f9173f", "sha256": "44ab707dbb9310b1be4bf97775a4b233de8e89049dc00568b40fa90a76414ec1" }, "downloads": -1, "filename": "plone.protect-3.0.18.tar.gz", "has_sig": false, "md5_digest": "17f4834c8d2f9d420fca84bb79f9173f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26032, "upload_time": "2016-02-25T12:31:54", "url": "https://files.pythonhosted.org/packages/07/11/965cffd1c974c6014999de86ea409c0fca7a1a7bd69ddfa8801453031dcf/plone.protect-3.0.18.tar.gz" } ], "3.0.19": [ { "comment_text": "", "digests": { "md5": "a7d42229a464d41b72f78dd09b3101f3", "sha256": "0ecb482eac79b4bfd70b454f7a9b82c7cfa67b504a14801373e1b2e5acb000c1" }, "downloads": -1, "filename": "plone.protect-3.0.19.tar.gz", "has_sig": false, "md5_digest": "a7d42229a464d41b72f78dd09b3101f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27785, "upload_time": "2016-08-19T18:00:36", "url": "https://files.pythonhosted.org/packages/cf/9d/31be0d5aec6c044cb3f96bf683672073cf7fbeb6a1b91ca9f09aed94bc2b/plone.protect-3.0.19.tar.gz" } ], "3.0.2": [ { "comment_text": "", "digests": { "md5": "30ab9c1c02606508b2285663fe39157e", "sha256": "02b2567cd5ce698f732391a672f1b04c49139192916a9f93f43c229eaec84c39" }, "downloads": -1, "filename": "plone.protect-3.0.2.zip", "has_sig": false, "md5_digest": "30ab9c1c02606508b2285663fe39157e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31210, "upload_time": "2015-03-13T17:26:30", "url": "https://files.pythonhosted.org/packages/04/3f/96e0ce0d0d93f0e035cd5046a2d6c39e03f2ab641f13c6038576a51eec71/plone.protect-3.0.2.zip" } ], "3.0.20": [ { "comment_text": "", "digests": { "md5": "fed37232824abe69292bf2dfab8133fc", "sha256": "529bb71a2404fc45658b50a7aca5c8e143c5021476c42d2d5a648ebaaa7bd8f5" }, "downloads": -1, "filename": "plone.protect-3.0.20.tar.gz", "has_sig": false, "md5_digest": "fed37232824abe69292bf2dfab8133fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28001, "upload_time": "2016-09-07T23:20:32", "url": "https://files.pythonhosted.org/packages/77/19/782f6c7aba252a4b6288c73492e9de210cc1f8fedf8358594c921917c2e3/plone.protect-3.0.20.tar.gz" } ], "3.0.21": [ { "comment_text": "", "digests": { "md5": "5fc5163fcb21f7b6abd2016f0b10ea28", "sha256": "658d7c2525da6ae59977f9bd63d23f15e1708d0d3f35812b3385d3960d9b09da" }, "downloads": -1, "filename": "plone.protect-3.0.21.tar.gz", "has_sig": false, "md5_digest": "5fc5163fcb21f7b6abd2016f0b10ea28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28522, "upload_time": "2016-10-05T09:56:28", "url": "https://files.pythonhosted.org/packages/9d/1a/37ab9d14cfe5f570da052568dfcbbab4945a3b57ca7a0a3dc1068ef38d1c/plone.protect-3.0.21.tar.gz" } ], "3.0.22": [ { "comment_text": "", "digests": { "md5": "ffcf10d08211a293d16426ddf9388936", "sha256": "cfcdbd99e8d9d1e8e227b68d32b558aa243f256931b6d87c00dda5e65252544b" }, "downloads": -1, "filename": "plone.protect-3.0.22.tar.gz", "has_sig": false, "md5_digest": "ffcf10d08211a293d16426ddf9388936", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28603, "upload_time": "2016-11-17T19:08:54", "url": "https://files.pythonhosted.org/packages/3e/f1/1bda8a5c667756b32ccf621aaf4d584b41a71eb7dde8f3a9bd28244e8e94/plone.protect-3.0.22.tar.gz" } ], "3.0.23": [ { "comment_text": "", "digests": { "md5": "49739451be4bd9916dd166eb04c714de", "sha256": "13c79a97b6557637b0e6ef51612cc7a9393491b1a01c6a475afebf70871067b6" }, "downloads": -1, "filename": "plone.protect-3.0.23.tar.gz", "has_sig": false, "md5_digest": "49739451be4bd9916dd166eb04c714de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28921, "upload_time": "2016-11-26T00:36:17", "url": "https://files.pythonhosted.org/packages/b7/2f/cdc62c5fb9739e0c5e91412f7df7678417f45e17ecc6368ccb03005596d0/plone.protect-3.0.23.tar.gz" } ], "3.0.24": [ { "comment_text": "", "digests": { "md5": "df1273df0e7c483ba7aca55b82acbf62", "sha256": "33f87614c14e9ac955f9781dc02a00ab8fffea14607094e0a47908599d7b3913" }, "downloads": -1, "filename": "plone.protect-3.0.24.tar.gz", "has_sig": false, "md5_digest": "df1273df0e7c483ba7aca55b82acbf62", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29898, "upload_time": "2017-07-03T11:25:18", "url": "https://files.pythonhosted.org/packages/af/eb/4d53b188f755c8c3ef83268496a1283490a8ff30a06f082b2d5dd77ae3c3/plone.protect-3.0.24.tar.gz" } ], "3.0.25": [ { "comment_text": "", "digests": { "md5": "1b37fa00f92ac7dbea0095f41ef7884f", "sha256": "1e88a859447ee514170ecb69875046484b64bb94508123a2444e9d63168445ed" }, "downloads": -1, "filename": "plone.protect-3.0.25-py2-none-any.whl", "has_sig": false, "md5_digest": "1b37fa00f92ac7dbea0095f41ef7884f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 36494, "upload_time": "2017-07-18T18:59:56", "url": "https://files.pythonhosted.org/packages/02/be/a752e9f57d6bfaf381700d1031af3e8ac4ddaea57fb61628501203785cc2/plone.protect-3.0.25-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0695694441fe01205b5a9eccc23132b7", "sha256": "28e92948dd7f0a03910d479996758481f4e816fa257b882f7d306d7ff71fec2f" }, "downloads": -1, "filename": "plone.protect-3.0.25.tar.gz", "has_sig": false, "md5_digest": "0695694441fe01205b5a9eccc23132b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29872, "upload_time": "2017-07-18T18:59:58", "url": "https://files.pythonhosted.org/packages/45/ec/8522a31e19041596d0fc4e7a142e8bb75e227545a355a432b724500b775a/plone.protect-3.0.25.tar.gz" } ], "3.0.26": [ { "comment_text": "", "digests": { "md5": "e6ff9a61f82cca4ec428b2995a15c45f", "sha256": "636c1afe8ef9f67741b0735816e0abea536578b7d6aa2ec8c69c09259a5fa728" }, "downloads": -1, "filename": "plone.protect-3.0.26-py2-none-any.whl", "has_sig": false, "md5_digest": "e6ff9a61f82cca4ec428b2995a15c45f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 36584, "upload_time": "2017-08-04T21:10:51", "url": "https://files.pythonhosted.org/packages/0f/42/cebd56b1d3b44b4630c97e61c1b4021a2377d76834a0f946f03f49a13327/plone.protect-3.0.26-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "111641f7b06a78d883662977afc5f22f", "sha256": "aa4b9a0ef811cbcd7225e51fba1a931d89149260713b39f75065487ced24387f" }, "downloads": -1, "filename": "plone.protect-3.0.26.tar.gz", "has_sig": false, "md5_digest": "111641f7b06a78d883662977afc5f22f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25793, "upload_time": "2017-08-04T21:10:53", "url": "https://files.pythonhosted.org/packages/a8/37/3040e881a03db4633be7c3e9a455447edc6ecbff5fb2ccdbc38729bd5ea6/plone.protect-3.0.26.tar.gz" } ], "3.0.27": [ { "comment_text": "", "digests": { "md5": "3067c5d8cc372cb2b71d37a5175a7c73", "sha256": "dbd6d8294286a4207e502308b6610cb5b4c5cbaf786b2dd859fdbbb1b90df0b4" }, "downloads": -1, "filename": "plone.protect-3.0.27-py2-none-any.whl", "has_sig": false, "md5_digest": "3067c5d8cc372cb2b71d37a5175a7c73", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 29859, "upload_time": "2018-07-16T13:48:17", "url": "https://files.pythonhosted.org/packages/79/d6/5f8d833a744b0fbc45d583d311469fe42fe034b8bf4a2b3712eded72b1aa/plone.protect-3.0.27-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6c58a51283afd191b6ca97e772408cfd", "sha256": "7646c4c4dc672015572b3991e89a4cfb0d1e24fdd8a7032e801e1d62c65ce887" }, "downloads": -1, "filename": "plone.protect-3.0.27.tar.gz", "has_sig": false, "md5_digest": "6c58a51283afd191b6ca97e772408cfd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29839, "upload_time": "2018-07-16T13:48:18", "url": "https://files.pythonhosted.org/packages/d4/49/e50f3fc8974e1ac3c62f84a94f8fcd2109062147d26090bf553abc7c4430/plone.protect-3.0.27.tar.gz" } ], "3.0.3": [ { "comment_text": "", "digests": { "md5": "e5073bac5ca94bf35c8d1f9835eb585a", "sha256": "f68f7882d9dd4998dbe523a78231985e3ddf74b7935c45cff1e7c4c31ea1091c" }, "downloads": -1, "filename": "plone.protect-3.0.3.zip", "has_sig": false, "md5_digest": "e5073bac5ca94bf35c8d1f9835eb585a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31776, "upload_time": "2015-03-30T17:42:47", "url": "https://files.pythonhosted.org/packages/7b/a7/cb347510b0d72e485c43a39004adb9d8571675ce3ef38f729d4b0146c026/plone.protect-3.0.3.zip" } ], "3.0.4": [ { "comment_text": "", "digests": { "md5": "5724e39e6ea6fafe2f0264633594ab29", "sha256": "ac9c353cb59d113fb06528ff44116414085b5ddc9a95956ee8e88255d740a354" }, "downloads": -1, "filename": "plone.protect-3.0.4.tar.gz", "has_sig": false, "md5_digest": "5724e39e6ea6fafe2f0264633594ab29", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21027, "upload_time": "2015-05-13T16:50:35", "url": "https://files.pythonhosted.org/packages/1a/b6/9163e4d620a175ca2ed183cf148d726e19bd8c238d8e829c7d9ced397d11/plone.protect-3.0.4.tar.gz" } ], "3.0.5": [ { "comment_text": "", "digests": { "md5": "0ddc288e33bb59b817b8b242747292f5", "sha256": "74cca2b3c64c02252bd21d21f37a5ba3ddf69c50515570b57127c350211fdbe8" }, "downloads": -1, "filename": "plone.protect-3.0.5.tar.gz", "has_sig": false, "md5_digest": "0ddc288e33bb59b817b8b242747292f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21668, "upload_time": "2015-07-20T18:14:37", "url": "https://files.pythonhosted.org/packages/c5/ce/d0fb562d2357444495a5fed7044a1746d63ba84ab7a38b6d50d0761a9525/plone.protect-3.0.5.tar.gz" } ], "3.0.6": [ { "comment_text": "", "digests": { "md5": "51c885028fd807091fe281ac4e583ea8", "sha256": "25e958887ee6d922280e38ea2c8ca936e4ffad54c30d23035d117b6311b2091c" }, "downloads": -1, "filename": "plone.protect-3.0.6.tar.gz", "has_sig": false, "md5_digest": "51c885028fd807091fe281ac4e583ea8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21716, "upload_time": "2015-07-20T19:18:09", "url": "https://files.pythonhosted.org/packages/b0/a2/a88255ce7b038e9cb93ca8563b53c41daed32aa60f3c49c220ba55b00ac5/plone.protect-3.0.6.tar.gz" } ], "3.0.7": [ { "comment_text": "", "digests": { "md5": "4ca232ede6dd492eb4fcf843117dc4eb", "sha256": "ca1fb25c9dd426b7a5419cf192a3f85f2e1e0c7d4caae994c31b919bfd2364d3" }, "downloads": -1, "filename": "plone.protect-3.0.7.tar.gz", "has_sig": false, "md5_digest": "4ca232ede6dd492eb4fcf843117dc4eb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21601, "upload_time": "2015-07-24T06:08:19", "url": "https://files.pythonhosted.org/packages/7f/63/4dcc2ab1d45d7e3559e17b490c287b534eee6616995191323ae6272fac22/plone.protect-3.0.7.tar.gz" } ], "3.0.8": [ { "comment_text": "", "digests": { "md5": "ca9711399ce1c9b1d4ab802fa8342cee", "sha256": "ba3557a482e35fc8be011e975a6a02136c07033d5c26f45fa975e5098a437909" }, "downloads": -1, "filename": "plone.protect-3.0.8.tar.gz", "has_sig": false, "md5_digest": "ca9711399ce1c9b1d4ab802fa8342cee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21812, "upload_time": "2015-09-20T19:29:32", "url": "https://files.pythonhosted.org/packages/ab/31/4c60da27e2c46c490590e081d2bfb72d0dc07003a21960360808716a20de/plone.protect-3.0.8.tar.gz" } ], "3.0.9": [ { "comment_text": "", "digests": { "md5": "f4f923abee954cd916b1c18b96bc85f9", "sha256": "48f236ba6804a7fc0512fd90c696941229f4c8e40e2baa9787f1bb296c0e025c" }, "downloads": -1, "filename": "plone.protect-3.0.9.tar.gz", "has_sig": false, "md5_digest": "f4f923abee954cd916b1c18b96bc85f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22600, "upload_time": "2015-09-27T10:12:13", "url": "https://files.pythonhosted.org/packages/9e/ba/65c3e34b4b25c1dd367fefa4707496eae27ba595dc27eb81d9cf04577c02/plone.protect-3.0.9.tar.gz" } ], "3.1": [ { "comment_text": "", "digests": { "md5": "f588774326c970add0505606b3cd8b23", "sha256": "5ef3165b3b863be153a20c3f10d12607624e6f50d7195295e77b04aa6747fd4b" }, "downloads": -1, "filename": "plone.protect-3.1-py2-none-any.whl", "has_sig": false, "md5_digest": "f588774326c970add0505606b3cd8b23", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 36609, "upload_time": "2017-08-14T10:21:33", "url": "https://files.pythonhosted.org/packages/34/01/1270ec62b812b383508c4c767a4fe53ed029e701d9a77b48a9f34cf03c5a/plone.protect-3.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a42605ad8aa101cfe0a8cca205a4a354", "sha256": "c59adabcca0a8339c2486ba0f5cfaffab07aa7ddabc1be52f43d695a38f352d1" }, "downloads": -1, "filename": "plone.protect-3.1.tar.gz", "has_sig": false, "md5_digest": "a42605ad8aa101cfe0a8cca205a4a354", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30066, "upload_time": "2017-08-14T10:21:35", "url": "https://files.pythonhosted.org/packages/dd/f2/a2b4e826eda638b894d67279da1dad84eed22f121d3560f581b16623be97/plone.protect-3.1.tar.gz" } ], "3.1.1": [ { "comment_text": "", "digests": { "md5": "2d1314e5b9e627f524688ebc4dada89a", "sha256": "ec9b54a9362fdb0a73361b10855e6a31d5559209825755f13f637816185acac0" }, "downloads": -1, "filename": "plone.protect-3.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "2d1314e5b9e627f524688ebc4dada89a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 36712, "upload_time": "2017-08-28T02:00:49", "url": "https://files.pythonhosted.org/packages/f3/48/ed62ef297f07ad6491ea057b6e703ab92349690e4788de56e4b23570a214/plone.protect-3.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bd6bff867504f6eed13cefd1d62c2fe3", "sha256": "af3a1953cd2c1dd7ef5dab8b7dd8c7f17f8366bdac282d3bcc38c8448ae40976" }, "downloads": -1, "filename": "plone.protect-3.1.1.tar.gz", "has_sig": false, "md5_digest": "bd6bff867504f6eed13cefd1d62c2fe3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30154, "upload_time": "2017-08-28T02:00:50", "url": "https://files.pythonhosted.org/packages/c0/3c/796d7624f8d448359264777bfe8e27e5cdb78e5a98b365e9b0bafd34657c/plone.protect-3.1.1.tar.gz" } ], "3.1.2": [ { "comment_text": "", "digests": { "md5": "6b558089f8cb147103635dd74e44afa8", "sha256": "82aa674373f1addec5d9fd42490a8102444134b54c5c0612ec4cd2d5ed295f85" }, "downloads": -1, "filename": "plone.protect-3.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "6b558089f8cb147103635dd74e44afa8", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 37175, "upload_time": "2018-02-02T15:57:51", "url": "https://files.pythonhosted.org/packages/c0/b4/b8a61c9a0ddbdf4ae0e4023aae607ad97dacf62d17796ce2485ae61ffc86/plone.protect-3.1.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0c5ce9ca53ae056d2cade6ea9a880249", "sha256": "5a36bf06c03628ab9ba0c22ba93b7fbdad879ab5d6bebecb450fa530b1c5936e" }, "downloads": -1, "filename": "plone.protect-3.1.2.tar.gz", "has_sig": false, "md5_digest": "0c5ce9ca53ae056d2cade6ea9a880249", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30235, "upload_time": "2018-02-02T15:57:53", "url": "https://files.pythonhosted.org/packages/a1/b3/0b7e8ebb8343ae44c7ffadba3a73ddfd56152831662d85c357d61db51974/plone.protect-3.1.2.tar.gz" } ], "3.1.3": [ { "comment_text": "", "digests": { "md5": "26e8faa49b9d261862f9e871d9974b28", "sha256": "0680c84da7fbab16a2603174b0c447f55906fe01f95bceae605efaf657c2e225" }, "downloads": -1, "filename": "plone.protect-3.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "26e8faa49b9d261862f9e871d9974b28", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 37196, "upload_time": "2018-04-04T20:53:37", "url": "https://files.pythonhosted.org/packages/28/c6/93009da75a87b2dd1ecaf56cd1561503f192b5df9a34270c5614ae058d9c/plone.protect-3.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b446a64fe74dc3c99f58dea61442446c", "sha256": "b05070bfd17e1e5876adeb0fb565d606295c610be436882e533da8783e356ee9" }, "downloads": -1, "filename": "plone.protect-3.1.3.tar.gz", "has_sig": false, "md5_digest": "b446a64fe74dc3c99f58dea61442446c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30264, "upload_time": "2018-04-04T20:53:38", "url": "https://files.pythonhosted.org/packages/fc/4c/90b5b155565e80e90d601828deab53f4ed9c1ddd6005ad039ed1bbd7cc89/plone.protect-3.1.3.tar.gz" } ], "3.1.4": [ { "comment_text": "", "digests": { "md5": "69ca2e01315a1c7c468d1bfbadd0f9c1", "sha256": "ba521ce6f63098248e96a4a8d3f87f2b8a0826cee4b1b2e9940abdbbcbbec1b6" }, "downloads": -1, "filename": "plone.protect-3.1.4-py2-none-any.whl", "has_sig": false, "md5_digest": "69ca2e01315a1c7c468d1bfbadd0f9c1", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 30505, "upload_time": "2018-06-04T14:16:06", "url": "https://files.pythonhosted.org/packages/2b/1f/bdc7d0fb59cce418e804e56a6db6396c298ff424cd220bb75da0acf667c3/plone.protect-3.1.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6e32338a1f783833055b7c95febbb481", "sha256": "b39d473363e8dab864f075e79ed428cbba6e107e93d9e8f62ae161d1a7a7422a" }, "downloads": -1, "filename": "plone.protect-3.1.4.tar.gz", "has_sig": false, "md5_digest": "6e32338a1f783833055b7c95febbb481", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31092, "upload_time": "2018-06-04T14:16:08", "url": "https://files.pythonhosted.org/packages/70/c7/8b3e43566be36a1002adfa91e628db51207afd39dcd6d2dca3ddbdab3c31/plone.protect-3.1.4.tar.gz" } ], "4.0.0": [ { "comment_text": "", "digests": { "md5": "c2723f66872656c4fbdd0a4cbbda3327", "sha256": "c954b4b01ec9ff2cefffbf981672d74c0f26db1d94ea32b573a934ad3dbc03d9" }, "downloads": -1, "filename": "plone.protect-4.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "c2723f66872656c4fbdd0a4cbbda3327", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 30522, "upload_time": "2018-07-16T10:33:32", "url": "https://files.pythonhosted.org/packages/8b/16/577cd39f7cf4f494036a2f1d5e9adda643648fe941141f00e6f5c4cb46d8/plone.protect-4.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "edb41d146142c10642d667d283acbe7a", "sha256": "487081754dc7a1e24b099785dcc86f3f9231af9dbeceb663bce3aada44ab4acc" }, "downloads": -1, "filename": "plone.protect-4.0.0.tar.gz", "has_sig": false, "md5_digest": "edb41d146142c10642d667d283acbe7a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30877, "upload_time": "2018-07-16T10:33:33", "url": "https://files.pythonhosted.org/packages/6e/1a/faae3ccffa278acb5ab7d606677012b2c12ae110d6b5ade3d29883c204b4/plone.protect-4.0.0.tar.gz" } ], "4.0.1": [ { "comment_text": "", "digests": { "md5": "11bbfcc7571003c410f7b56b80894a02", "sha256": "1214a7bfd1ae5e7f0ec5faf6a770837d0fc079e17d55c1185ddd3d5d93753f5a" }, "downloads": -1, "filename": "plone.protect-4.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "11bbfcc7571003c410f7b56b80894a02", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 30617, "upload_time": "2018-07-16T10:38:26", "url": "https://files.pythonhosted.org/packages/7f/f1/012dc92969312ea016882b1873748e606322157457a438b4ca11cf1c774d/plone.protect-4.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aff20c235da7dbbf1c756cd75de8e731", "sha256": "64a298d219434c1f648b6a8896fa5584d16efbd3d91289971a6289e5d54df436" }, "downloads": -1, "filename": "plone.protect-4.0.1.tar.gz", "has_sig": false, "md5_digest": "aff20c235da7dbbf1c756cd75de8e731", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31108, "upload_time": "2018-07-16T10:38:27", "url": "https://files.pythonhosted.org/packages/aa/b7/0a4bfc7541ad62e520c83c8dc3040cdcca22a767f741572a0b5b555ad564/plone.protect-4.0.1.tar.gz" } ], "4.1.0": [ { "comment_text": "", "digests": { "md5": "9f3ca80d17ba1b6e4f6044ceca8aa07e", "sha256": "398b923086a6d5911b754b1144c485df1e6eb87b2c85b5fd7d5ca1f451c8c224" }, "downloads": -1, "filename": "plone.protect-4.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "9f3ca80d17ba1b6e4f6044ceca8aa07e", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 31052, "upload_time": "2018-11-02T06:37:11", "url": "https://files.pythonhosted.org/packages/6f/b8/75e985aaa73f9fcefa19c43c487546ae2ece1918f01c63ba02d8295b9055/plone.protect-4.1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a848fa460f55db0c3e1318e2fdae1e60", "sha256": "53960adbf99683e9e9c4e759fc8b73c7075530af0cd9cfae15ddd6b13c9e2f37" }, "downloads": -1, "filename": "plone.protect-4.1.0.tar.gz", "has_sig": false, "md5_digest": "a848fa460f55db0c3e1318e2fdae1e60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31814, "upload_time": "2018-11-02T06:37:13", "url": "https://files.pythonhosted.org/packages/9c/24/888aaf8e3fcf16b11d0f1a2e1134a18d73426d0fcfc774c252f502a37bbf/plone.protect-4.1.0.tar.gz" } ], "4.1.1": [ { "comment_text": "", "digests": { "md5": "30fa2a9bd74e5fa91a84eb5360902e36", "sha256": "e4f7bdd08fbf203d31fb2f4b1163f20d5c16a008abe8de8a1724a30e2ae5c498" }, "downloads": -1, "filename": "plone.protect-4.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "30fa2a9bd74e5fa91a84eb5360902e36", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31073, "upload_time": "2018-12-11T13:41:50", "url": "https://files.pythonhosted.org/packages/09/21/e718e37861b4337fdd518507a29929fc8c4811fb2eef63c4af02f9c2bd16/plone.protect-4.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4161a66e26e873484e14d446fd543ee", "sha256": "ad2da9e9b98f214811dd1284ca398535563b1fa12cfa9f852482462c4d4cc12a" }, "downloads": -1, "filename": "plone.protect-4.1.1.tar.gz", "has_sig": false, "md5_digest": "a4161a66e26e873484e14d446fd543ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32482, "upload_time": "2018-12-11T13:41:52", "url": "https://files.pythonhosted.org/packages/94/17/e9404cb4e68d12949732b5f1b32b115b1f2fea83233e8a84d83080f2e779/plone.protect-4.1.1.tar.gz" } ], "4.1.2": [ { "comment_text": "", "digests": { "md5": "4e9fd72f895b23107bcf3953563e7508", "sha256": "bdb0fb6d226c2f9c0cc3e4f7d90487a69192a10139848ae8198fce060a23717d" }, "downloads": -1, "filename": "plone.protect-4.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4e9fd72f895b23107bcf3953563e7508", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 31236, "upload_time": "2019-02-12T23:55:31", "url": "https://files.pythonhosted.org/packages/42/66/6da45daa0a8fe20a92820948a1f96846fce8e8c42adfca97c0d4b45e9003/plone.protect-4.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e7444c26662bc54cd59efb0b432b0116", "sha256": "0fff177fe891033787607fa0fb8cb996516f79f60892441b701f82c66ce3605d" }, "downloads": -1, "filename": "plone.protect-4.1.2.tar.gz", "has_sig": false, "md5_digest": "e7444c26662bc54cd59efb0b432b0116", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28529, "upload_time": "2019-02-12T23:55:33", "url": "https://files.pythonhosted.org/packages/f5/a0/f18e5139b54d7e289c052258eedc45b62acb70b0d9cc1f1359d7bd0365be/plone.protect-4.1.2.tar.gz" } ], "4.1.3": [ { "comment_text": "", "digests": { "md5": "eb49a6acd84d11805431a509d6f60eb7", "sha256": "12d3814b11f2baaf66619d6e76c4daf2338f8205f640581bd1905bf8926e8b2c" }, "downloads": -1, "filename": "plone.protect-4.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "eb49a6acd84d11805431a509d6f60eb7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 31698, "upload_time": "2019-08-23T11:52:37", "url": "https://files.pythonhosted.org/packages/e2/2d/8566b2307eb2729849ebfff3700a9ba7c7eeb61fe05a596a6a55a61983d0/plone.protect-4.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e95a3dd3ef4850930923fe21eed0558f", "sha256": "c708838bbca0268f8efa34656f53a0d5cd52ab8e41f8f894586f0635153de567" }, "downloads": -1, "filename": "plone.protect-4.1.3.tar.gz", "has_sig": false, "md5_digest": "e95a3dd3ef4850930923fe21eed0558f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33373, "upload_time": "2019-08-23T11:52:40", "url": "https://files.pythonhosted.org/packages/32/bc/3035c271eeb70d7c14b025c9d113c81a609970c8cc06621bdee236c80014/plone.protect-4.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "eb49a6acd84d11805431a509d6f60eb7", "sha256": "12d3814b11f2baaf66619d6e76c4daf2338f8205f640581bd1905bf8926e8b2c" }, "downloads": -1, "filename": "plone.protect-4.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "eb49a6acd84d11805431a509d6f60eb7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 31698, "upload_time": "2019-08-23T11:52:37", "url": "https://files.pythonhosted.org/packages/e2/2d/8566b2307eb2729849ebfff3700a9ba7c7eeb61fe05a596a6a55a61983d0/plone.protect-4.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e95a3dd3ef4850930923fe21eed0558f", "sha256": "c708838bbca0268f8efa34656f53a0d5cd52ab8e41f8f894586f0635153de567" }, "downloads": -1, "filename": "plone.protect-4.1.3.tar.gz", "has_sig": false, "md5_digest": "e95a3dd3ef4850930923fe21eed0558f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33373, "upload_time": "2019-08-23T11:52:40", "url": "https://files.pythonhosted.org/packages/32/bc/3035c271eeb70d7c14b025c9d113c81a609970c8cc06621bdee236c80014/plone.protect-4.1.3.tar.gz" } ] }