{ "info": { "author": "Daniel Blackburn, Stephan Richter, Randy Crafton", "author_email": "zope-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Zope3", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP" ], "description": ".. contents::\n\n================\nz3c.securitytool\n================\n\nz3c.securitytool is a Zope3 package aimed at providing component level\nsecurity information to assist in analyzing security problems and to\npotentially expose weaknesses. The goal of the security tool is to\nprovide a matrix of users and their effective permissions for all available\nviews for any given component and context. We also provide two further\nlevels of detail. You can view the details of how a user came to have\nthe permission on a given view, by clicking on the permission in the matrix.\n\n.. image::\n http://farm3.static.flickr.com/2318/2521732872_81a709e3db_m.jpg\n :height: 200\n :width: 400\n :target: http://flickr.com/photos/blackburnd/\n\n=================\nDemo Instructions\n=================\n\nYou can run the demo by downloading just the securitytool package\n\n- ``# svn co svn://svn.zope.org/repos/main/z3c.securitytool/trunk securitytool``\n- ``# cd securitytool``\n- ``# python bootstrap.py``\n- ``# ./bin/buildout``\n- ``# ./bin/demo fg``\n\nThen access the demo site using:\n\n- http://localhost:8080/++skin++SecurityTool/securityMatrix.html\n- user: admin\n- password: admin\n\nThere are some folders added with permissions and roles applied to show\nthe settings in the demo. \n\n- http://localhost:8080/++skin++SecurityTool/Folder1/securityMatrix.html\n- http://localhost:8080/++skin++SecurityTool/Folder1/Folder2/securityMatrix.html\n\nThese permissions should mirror what you see in the @@grant.html views\n\n- http://localhost:8080/Folder1/Folder2/@@grant.html\n- http://localhost:8080/Folder1/@@grant.html\n\n``(These settings are added when the database is first opened``\n ``You can find these settings in demoSetup.py)``\n\n\n==============================================\nHow to use the securityTool with your project:\n==============================================\nRemember this is a work in progress.\n\n1. Add the z3c.securitytool to your install_requires in your\n setup.py. \n2. Add the to your site.zcml\n3. Use the skin `++skin++SecurityTool` to access securityTool pages\n4. Append @@securityMatrix.html view to any context to view the permission\n matrix for that context using the security tool skin.\n\n For example:\n http://localhost:8080/++skin++SecurityTool/Folder1/@@securityMatrix.html\n\n\n\n\n======================\nDetailed Documentation\n======================\n\nOn the main page of the securityTool you will be able to select\nthe desired skin from all the available skins on the system.\nOn initial load of the securitytool you will only see permissions\nfor IBrowserRequest and your current context. The interesting\ninformation is when you select the skins. A future release of\nthis tool will offer a selection to view all information for all\nskins as well as each skin individually. You can also truncate the\nresults by selecting the permission from the filter select box.\nWhen you click on the \"Allow\" or \"Deny\" security tool will explain\nwhere these permissions were specified whether by role, group, or\nin local context.\n\nWhen you click on a user-name all the permissions inherited from\nroles, groups or specifically assigned permissions will be displayed.\n\n >>> import zope\n >>> from zope.app import zapi\n >>> from pprint import pprint\n >>> from zope.interface import providedBy\n >>> from z3c.securitytool.securitytool import *\n >>> from z3c.securitytool.interfaces import ISecurityChecker\n >>> from z3c.securitytool.interfaces import IPrincipalDetails\n >>> from z3c.securitytool.interfaces import IPermissionDetails\n >>> from z3c.securitytool.browser import ISecurityToolSkin\n >>> root = getRootFolder()\n\n Several things are added to the database on the IDatabaseOpenedEvent when\n starting the demo or running the tests. These settings are used to test\n the functionality in the tests as well as populate a matrix for the demo.\n Lets make sure the items were added with demoSetup.py, We will assume\n that if Folder1 exists in the root folder then demoSetup.py was executed.\n\n >>> sorted(root.keys())\n [u'Folder1']\n\n To retrieve the permission settings for the folder we must first adapt the\n context to a SecurityChecker Object.\n\n >>> folder1 = ISecurityChecker(root['Folder1'])\n\n >>> print folder1.__class__.__name__\n SecurityChecker\n\n Lets introspect the object.\n\n >>> pprint(dir(folder1))\n ['__class__',\n '__component_adapts__',\n ...\n 'aggregateMatrices',\n 'context',\n 'getPermissionSettingsForAllViews',\n 'getReadPerm',\n 'populateMatrix',\n 'populatePermissionMatrix',\n 'populateViewRoleMatrix']\n\n\n To get all the security settings for particular context level the\n getPermissionSettingsForAllViews is called with a tuple of interfaces.\n All the views registered for the interfaces passed will be inspected.\n\n Since nothing should be registered for only zope.interface.Interface we\n should receive an empty set, of permissions, roles and groups.\n\n >>> folder1.getPermissionSettingsForAllViews(zope.interface.Interface)\n [{}, {}, set([])]\n\n A realistic test would be to get all the interfaces provided by a specific\n context level like `Folder1`. Being a folder these are the interfaces as you\n might expect.\n\n >>> ifaces = tuple(providedBy(root['Folder1']))\n >>> pprint(ifaces)\n (,\n ,\n ,\n ,\n )\n\n The next step to determine security levels is the getViews function.\n `getViews` gets all the registered views for this interface. This\n is refined later to the views that are only accessible in this context.\n\n >>> pprint(sorted([x for x in getViews(ifaces[0])]))\n [AdapterRegistration... ITraversable, u'acquire', ...\n AdapterRegistration... ITraversable, u'adapter', ...\n AdapterRegistration... ITraversable, u'attribute', ...\n AdapterRegistration... ITraversable, u'etc', ...\n AdapterRegistration... ITraversable, u'item', ...\n AdapterRegistration... ITraversable, u'lang', ...\n AdapterRegistration... ITraversable, u'resource', ...\n AdapterRegistration... ITraversable, u'skin', ...\n AdapterRegistration... ITraversable, u'vh', ...\n AdapterRegistration... ITraversable, u'view', ...\n\n\n Since this is a large result set returned we will only test enough\n pieces of the results to inform of the desired behavior and to make sure\n the results are sane.\n\n >>> permDetails = folder1.getPermissionSettingsForAllViews(ifaces,\n ... ISecurityToolSkin)\n\n By using the ISecurityToolSkin we can see the actual securityTool\n views. The securityTool views are only registered for the\n ISecurityToolSkin layer.\n\n >>> pprint(permDetails)\n [...\n 'zope.globalmgr': {u'no name': 'Allow',\n u'DELETE': 'Allow',\n u'OPTIONS': 'Allow',\n u'PUT': 'Allow',\n u'absolute_url': 'Allow',\n u'permissionDetails.html': 'Allow',\n u'principalDetails.html': 'Allow',\n u'securityMatrix.html': 'Allow'},\n ...]\n\n As you can see below the `zope.anybody` has the 'Allow' permission\n for the four views listed below. The securitytool views are not listed\n here because they are neither specifically denied or allowed for\n this principal.\n\n >>> pprint(permDetails)\n ...\n [{'zope.anybody': {u'no name': 'Allow',\n u'DELETE': 'Allow',\n u'OPTIONS': 'Allow',\n u'PUT': 'Allow',\n u'absolute_url': 'Allow'},\n ...\n\n Another section of the result set shows all valid views for this\n context and skin, along with the permission required for access to\n the view.\n\n >>> pprint(permDetails)\n [...\n {u'no name': 'zope.Public',\n u'DELETE': 'zope.Public',\n u'OPTIONS': 'zope.Public',\n u'PUT': 'zope.Public',\n u'absolute_url': 'zope.Public',\n u'permissionDetails.html': 'zope.ManageContent',\n u'principalDetails.html': 'zope.ManageContent',\n u'securityMatrix.html': 'zope.ManageContent'},\n ...]\n\n All the principals in the system are in this data structure.\n Here we just print a subset of the structure, to make sure the\n data is sane.\n\n >>> pprint(sorted(permDetails[0].keys()))\n ['zope.anybody',\n 'zope.daniel',\n 'zope.globalmgr',\n 'zope.group1',\n 'zope.markus',\n 'zope.martin',\n 'zope.mgr',\n 'zope.randy',\n 'zope.sample_manager',\n 'zope.stephan']\n\n This of course should be identical to the users on the system from\n zapi.getPrincipals() without (zope.anybody)\n\n >>> from zope.app import zapi\n >>> sysPrincipals = zapi.principals()\n >>> principals = [x.id for x in sysPrincipals.getPrincipals('')]\n >>> pprint(sorted(principals))\n ['zope.daniel',\n 'zope.globalmgr',\n 'zope.group1',\n 'zope.group2',\n 'zope.markus',\n 'zope.martin',\n 'zope.mgr',\n 'zope.randy',\n 'zope.sample_manager',\n 'zope.stephan']\n\n========================================\nUsing securitytool to inspect principals\n========================================\n\nLets see what the principalDetails look like for the principal Daniel\nand the context of 'Folder1'.\n\n First we retrieve the principalDetails for Folder1:\n\n >>> prinDetails = PrincipalDetails(root[u'Folder1'])\n\n Then we filter out the uninteresting information for the user\n being inspected.\n\n >>> matrix = prinDetails('zope.daniel')\n\n The principal details structure contains five interesting pieces of data.\n\n >>> pprint(sorted(matrix.keys()))\n ['groups', 'permissionTree', 'permissions', 'roleTree', 'roles']\n\n Below we check to make sure the groups data structure from the user daniel\n is returned as expected. This is the data used to populate the groups\n section on the User Details page.\n\n >>> pprint(matrix['groups'].keys())\n ['zope.randy']\n\n The permission tree is used to display the levels of inheritance that were\n traversed to attain the permission displayed. The permission is\n stored as a list so the order is maintained. (yes I know there are\n better ways to accomplish this)\n\n >>> pprint(matrix['permissionTree'][0])\n {u'Folder1_2': {'name': None,\n 'parentList': [u'Folder1', 'Root Folder'],\n 'permissions': [{'permission': 'concord.CreateArticle',\n 'principal': 'zope.daniel',\n 'setting': PermissionSetting: Allow},\n {'permission': 'concord.ReadIssue',\n 'principal': 'zope.daniel',\n 'setting': PermissionSetting: Deny},\n {'permission': 'concord.DeleteIssue',\n 'principal': 'zope.daniel',\n 'setting': PermissionSetting: Allow}]}}\n\n\n >>> pprint(matrix['permissionTree'][1])\n {'Root Folder': {'name': 'Root Folder',\n 'parentList': ['Root Folder'],\n 'permissions': [{'permission': 'concord.DeleteArticle',\n 'principal': 'zope.daniel',\n 'setting': PermissionSetting: Deny},\n {'permission': 'concord.CreateArticle',\n 'principal': 'zope.daniel',\n 'setting': PermissionSetting: Deny},\n {'permission': 'concord.ReadIssue',\n 'principal': 'zope.daniel',\n 'setting': PermissionSetting: Allow}]}}\n\n\n The permissions section of the matrix displays the final say on\n whether or not the user has permissions at this context level.\n\n >>> pprint(matrix['permissions'], width=1)\n [{'permission': 'concord.CreateArticle',\n 'setting': PermissionSetting: Allow},\n {'permission': 'concord.ReadIssue',\n 'setting': PermissionSetting: Deny},\n {'permission': 'concord.DeleteIssue',\n 'setting': PermissionSetting: Allow},\n {'permission': 'concord.DeleteArticle',\n 'setting': PermissionSetting: Deny},\n {'permission': 'concord.CreateIssue',\n 'setting': PermissionSetting: Allow},\n {'permission': 'concord.PublishIssue',\n 'setting': PermissionSetting: Allow}]\n\n The roleTree structure is used to display the roles attained at\n each level of traversal. The roleTree is stored as a list so to\n consistently test the data properly we will create a dictionary\n out of it and is similar in function to the permissionTree.\n\n >>> tmpDict = {}\n >>> keys = matrix['roleTree']\n >>> for item in matrix['roleTree']:\n ... tmpDict.update(item)\n\n >>> pprint(tmpDict['Root Folder'])\n {'name': 'Root Folder',\n 'parentList': ['Root Folder'],\n 'roles': [{'principal': 'zope.daniel',\n 'role': 'zope.Writer',\n 'setting': PermissionSetting: Allow}]}\n\n >>> pprint(tmpDict['Folder1_2'])\n {'name': None,\n 'parentList': [u'Folder1', 'Root Folder'],\n 'roles': [{'principal': 'zope.daniel',\n 'role': 'zope.Writer',\n 'setting': PermissionSetting: Allow}]}\n\n >>> pprint(tmpDict['global settings'])\n {'name': None,\n 'parentList': ['global settings'],\n 'roles': [{'principal': 'zope.daniel',\n 'role': 'zope.Janitor',\n 'setting': PermissionSetting: Allow}]}\n\n The roles section of the matrix displays the final say on whether or\n not the user has the role assigned at this context level.\n\n >>> pprint(matrix['roles'], width=1)\n {'zope.Janitor': [{'permission': 'concord.ReadIssue',\n 'setting': 'Allow'}],\n 'zope.Writer': [{'permission': 'concord.DeleteArticle',\n 'setting': 'Allow'},\n {'permission': 'concord.CreateArticle',\n 'setting': 'Allow'},\n {'permission': 'concord.ReadIssue',\n 'setting': 'Allow'}]}\n\n\nNow lets see what the permission details returns\n\n >>> from zope.publisher.interfaces.browser import IBrowserRequest\n >>> from z3c.securitytool.interfaces import IPermissionDetails\n >>> permAdapter = zapi.getMultiAdapter((root[u'Folder1'],\n ... ),IPermissionDetails)\n >>> prinPerms = permAdapter('zope.daniel',\n ... 'ReadIssue.html',\n ... )\n\n >>> print permAdapter.skin\n \n\n >>> print permAdapter.read_perm\n zope.Public\n\n >>> print permAdapter.view_name\n ReadIssue.html\n\n >>> pprint(prinPerms)\n {'groups': {'zope.randy': {'groups': {'zope.group1': {'groups': {},\n 'permissionTree': [],\n 'permissions': [],\n 'roleTree': [],\n 'roles': {}},\n 'zope.group2': {'groups': {},\n 'permissionTree': [],\n 'permissions': [],\n 'roleTree': [],\n 'roles': {}}},\n 'permissionTree': [],\n 'permissions': [],\n 'roleTree': [],\n 'roles': {}}},\n 'permissionTree': [],\n 'permissions': [],\n 'roleTree': [],\n 'roles': {}}\n\nFollowing are the helper functions used within the securitytool, These\ncontain a set of common functionality that is used in many places.\nLets see if the 'hasPermissionSetting' method returns True if there is\na permission or role and False if there is not.\n\n >>> hasPermissionSetting({'permissions':'Allow'})\n True\n\n We need to make some dummy objects to test the 'hasPermissionSetting' method\n\n >>> emptySettings = {'permissions': [],\n ... 'roles': {},\n ... 'groups': {}}\n\n >>> fullSettings = {'permissions': 'Allow',\n ... 'roles': {},\n ... 'groups': {}}\n\n We also need to make sure the recursive functionality works for this method\n\n >>> hasPermissionSetting({'permissions':{},'roles':{},\n ... 'groups':{'group1':emptySettings,\n ... 'group2':fullSettings}})\n True\n\n >>> from zope.securitypolicy.interfaces import Allow, Unset, Deny\n >>> prinPermMap = ({'principal':'daniel',\n ... 'permission':'takeOverTheWORLD',\n ... 'setting': Allow})\n\n >>> rolePermMap = ({'role':'Janitor',\n ... 'permission':'takeOverTheWORLD',\n ... 'setting': Allow})\n\n >>> prinRoleMap = ({'principal':'daniel',\n ... 'role':'Janitor',\n ... 'setting': Allow})\n\n\n Lets test the method with our new dummy data\n >>> principalDirectlyProvidesPermission([prinPermMap],'daniel',\n ... 'takeOverTheWORLD')\n 'Allow'\n\n And we also need to test the roleProvidesPermission\n >>> roleProvidesPermission([rolePermMap], 'Janitor', 'takeOverTheWORLD')\n 'Allow'\n\n And we also need to test the roleProvidesPermission\n >>> principalRoleProvidesPermission([prinRoleMap],\n ... [rolePermMap],\n ... 'daniel',\n ... 'takeOverTheWORLD')\n ('Janitor', 'Allow')\n\n See janitors CAN take over the world!!!!!\n\n And of course the rendered name to display on the page template\n If we do not receive a name that means we are on the root level.\n\n >>> renderedName(None)\n u'Root Folder'\n\n >>> renderedName('Daniel')\n 'Daniel'\n\n >>> folder1.populatePermissionMatrix('takeOverTheWORLD',[prinPermMap])\n\n\nTestBrowser Smoke Tests\n-----------------------\n\n Lets make sure all the views work properly. Just a simple smoke test\n\n >>> from zope.testbrowser.testing import Browser\n >>> manager = Browser()\n >>> authHeader = 'Basic mgr:mgrpw'\n >>> manager.addHeader('Authorization', authHeader)\n >>> manager.handleErrors = False\n\n >>> server = 'http://localhost:8080/++skin++SecurityTool'\n\n >>> manager.open(server + '/@@securityMatrix.html')\n\n First we will check if the main page is available\n\n >>> manager.open(server + '/@@securityMatrix.html')\n\n >>> manager.open(server + '/Folder1/@@securityMatrix.html')\n\n >>> manager.open(server + '/Folder1/Folder2/Folder3/@@securityMatrix.html')\n\n Now lets send the filter variable so our test is complete\n\n >>> manager.open(server + '/@@securityMatrix.html?'\n ... 'FILTER=None&selectedSkin=ConcordTimes')\n\n\n And with the selected permission\n\n >>> manager.open(server + '/@@securityMatrix.html?'\n ... 'FILTER=None&selectedSkin=ConcordTimes&'\n ... 'selectedPermission=zope.Public')\n\n\n Here we send an invalid selectedPermisson ( just for coverage ) ;)\n\n >>> manager.open(server + '/@@securityMatrix.html?'\n ... 'FILTER=None&selectedSkin=ConcordTimes&'\n ... 'selectedPermission=zope.dummy')\n\n And with the None permission\n\n >>> manager.open(server + '/@@securityMatrix.html?'\n ... 'FILTER=None&selectedSkin=ConcordTimes&'\n ... 'selectedPermission=None')\n\n This is the principal detail page, you can get to by clicking on the\n principals name at the top of the form\n\n >>> manager.open(server +\n ... '/@@principalDetails.html?principal=zope.daniel')\n\n >>> manager.open(server +\n ... '/Folder1/Folder2/Folder3/'\n ... '@@principalDetails.html?principal=zope.daniel')\n\n\n >>> 'Permission settings' in manager.contents\n True\n\n\n And lets call the view without a principal\n\n >>> manager.open(server + '/@@principalDetails.html')\n Traceback (most recent call last):\n ...\n PrincipalLookupError: no principal specified\n\n Here is the view you will see if you click on the actual permission\n value in the matrix intersecting the view to the user on a public view.\n\n >>> manager.open(server + '/@@permissionDetails.html?'\n ... 'principal=zope.daniel&view=PUT')\n\n Ok lets send the command without the principal\n\n >>> manager.open(server + '/@@permissionDetails.html?view=PUT')\n Traceback (most recent call last):\n ...\n PrincipalLookupError: no user specified\n\n\n And now we will test it without the view name\n\n >>> manager.open(server + '/@@permissionDetails.html?'\n ... 'principal=zope.daniel')\n\n And now with a view name that does not exist\n\n >>> manager.open(server + '/@@permissionDetails.html?'\n ... 'principal=zope.daniel&view=garbage')\n\n Lets also test with a different context level\n\n >>> manager.open(server +\n ... '/Folder1/Folder2/Folder3/'\n ... '@@permissionDetails.html'\n ... '?principal=zope.daniel&view=ReadIssue.html')\n\n\n=======\nCHANGES\n=======\n\n0.5.1 (2010-10-23)\n------------------\n\n- Removed duplicate url entry in `setup.py` fixing brown bag release.\n\n\n0.5.0 (2010-10-21)\n------------------\n\n- Updated tests, test setup and demo app to run with ZTK 1.0 on Python 2.4\n and Python 2.6.\n\n- Updated to `z3c.layer.minimal` instead of deprecated `z3c.layer`.\n\n\n0.4.2 (2008-07-22)\n------------------\n- Fixed issue with inheritance display on the permissionDetails page\n- Cleaned up some of the page template files.\n- Added description to the group inheritance display on the principal\n details page.\n\n0.4.1 (2008-06-12)\n------------------\n- Fixed issue with inheritance display on the securityMatrix.html page\n- Added links to the views listed on the securityMatrix.html page\n- Refactored out the PrincipalDetails and the PermissionDetails to\n their own files\n- Added the ZPL text to the tops of all the py files\n- Refactored out the shared global functions to globalFunctions.py\n- Refactored out the MatrixDetails superclass to its own file.\n\npant, pant, pant\n\n0.4.0b (2008-06-09)\n-------------------\n- Updated page template for principal details\n- Sorting issue fixed on viewMatrix page\n\n0.4.0 (2008-06-09)\n------------------\n- Updated page template for principal details\n- Releasing as Beta\n\n0.3.6b (2008-06-02)\n-------------------\n- Misc fixes to group permission inheritance.\n- Misc verbiage and layout updates to page templates.\n\n0.3.6 (2008-05-25)\n------------------\n- Security tool now inherits properly from groups.\n\n0.3.5c (2008-05-24)\n-------------------\n- Mainly fixed documentation and DocTests\n\n0.3.5b (2008-03-03)\n-------------------\n- Fixed issue where stylesheets would not display in skin\n- Added z3c.macro namespace to configure.zcml\n\n0.3.5 (2008-03-02)\n------------------\n- Fixed issue where SecurityTool skin was only declared for the demo,\n skin is now declared in the configure.zcml.\n\n0.3.4 (2008-02-26)\n------------------\n- Fixed issue with groups on permDetails and principalDetails pages\n- Fixed issue where securitytool views were declared as zope.Public\n- Added SecurityTool skin to register securitytool views against\n\n0.3.3 (2008-02-21)\n------------------\n- Updated css and styles\n- Cleanup of page templates\n- Fixed permission details page\n\n0.3.2 (2008-02-18)\n------------------\n- Updated css and styles\n- Cleanup of page templates\n- Updtated principalDetails with sorting\n- Fixed bug where some permissions were not being removed appropriately\n\n0.3.1 (2008-02-07)\n------------------\n- Updated interfaces and views\n- Updated css and styles\n- Cleanup of page templates\n- Updtated principalDetails to show all data\n- Various bug fixes\n- Added some more roles and permissions for the demo.\n\n0.3.0 (2008-02-07)\n------------------\n- Updated interfaces and views\n- Cleanup of page templates\n- Storing selected skin in session\n- Various bug fixes\n- Better project description\n\n0.2.4 (2008-02-06)\n------------------\n- Fixed bug in permDetails\n- Updated interface and views\n- Added some more content to the demo\n\n\n0.2.3 (2008-01-29)\n------------------\n- Fixed issue where all the permissions associated with a principal\n were not populating properly\n\n0.2.2 (2008-01-28)\n------------------\n- Some enhancements on the page templates and css classes\n- Better test coverage and \"Smoke\" tests for all the available views\n\n0.2.1 (2008-01-27)\n------------------\n- Fixed bug with Permission Details\n\n0.2.0 (2008-01-26)\n------------------\n- Initial release of fully functional z3c.securitytool\n\n0.2.1 (2008-01-26)\n------------------\n- Fixed bug with Principal Details page", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/z3c.securitytool", "keywords": "zope3 securitytool security", "license": "ZPL 2.1", "maintainer": null, "maintainer_email": null, "name": "z3c.securitytool", "package_url": "https://pypi.org/project/z3c.securitytool/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/z3c.securitytool/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/z3c.securitytool" }, "release_url": "https://pypi.org/project/z3c.securitytool/0.5.1/", "requires_dist": null, "requires_python": null, "summary": "A security audit tool and demo for Zope3 views", "version": "0.5.1" }, "last_serial": 802108, "releases": { "0.4.1": [ { "comment_text": "", "digests": { "md5": "d2125309da851febb4ffa0c7cab23367", "sha256": "6531a6f08984e2b3994392c4bccecbb9f3c5bd185d48f9efc0455e2306617cbb" }, "downloads": -1, "filename": "z3c.securitytool-0.4.1-py2.4.egg", "has_sig": true, "md5_digest": "d2125309da851febb4ffa0c7cab23367", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 68046, "upload_time": "2008-06-13T01:44:29", "url": "https://files.pythonhosted.org/packages/87/5d/a94ec44fb8d79eb51dfc4e6d9f20cd4faa47407842fe8593fe877253290f/z3c.securitytool-0.4.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "de845ba346808f68c00b0e220f25ff1c", "sha256": "4cdfda8970beace367d3d28c04276b2a5cfa0af1d1d84499368b3e28411406e1" }, "downloads": -1, "filename": "z3c.securitytool-0.4.1.tar.gz", "has_sig": true, "md5_digest": "de845ba346808f68c00b0e220f25ff1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40112, "upload_time": "2008-06-13T01:44:25", "url": "https://files.pythonhosted.org/packages/1a/c0/0f6e475cf42d9ddabb17c183129c9de45b26bc4105a0b1418406e64cc1ca/z3c.securitytool-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "137b8899a0a95853848974c1233ec652", "sha256": "6d566f3fa4a784823b588ed88f5b90d17f790b4e035ef0a357f3187d051f9770" }, "downloads": -1, "filename": "z3c.securitytool-0.4.2-py2.4.egg", "has_sig": true, "md5_digest": "137b8899a0a95853848974c1233ec652", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 64797, "upload_time": "2008-07-22T12:11:16", "url": "https://files.pythonhosted.org/packages/09/9b/a70f5f87c08b3e8aa5a329b4b1a1dc92b1c7adbffce1f6940172d67eb5ab/z3c.securitytool-0.4.2-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "e528ffff6f45ce30c81ca34dbbcb4d5b", "sha256": "1660828c37093cfb250b2adb813ed1a5d0226209e2298ba0d3117db9fc8e1fc1" }, "downloads": -1, "filename": "z3c.securitytool-0.4.2.tar.gz", "has_sig": true, "md5_digest": "e528ffff6f45ce30c81ca34dbbcb4d5b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40369, "upload_time": "2008-07-22T12:11:13", "url": "https://files.pythonhosted.org/packages/b7/6c/4cc6206e5e69ea85560dbc43b36e763d7c808ac9aff9ecc3ca65ca78c043/z3c.securitytool-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "8cec24bb401cd13c31f43c5680f0594a", "sha256": "34f9e49071a132d4ef87034cd106fe9c63f0faf930b5cffeff68f9f79949b684" }, "downloads": -1, "filename": "z3c.securitytool-0.5.0.tar.gz", "has_sig": false, "md5_digest": "8cec24bb401cd13c31f43c5680f0594a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39191, "upload_time": "2010-10-21T08:25:28", "url": "https://files.pythonhosted.org/packages/01/d3/6d4fa3eb6eb0472d29c243a2e28cb34c3a69a8df12db3f5fba38895f3e6b/z3c.securitytool-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "4a1ab805ab15eb668ef30007a6223d74", "sha256": "0d250ccb3448b7d9115041fb69e166781961ac1a37ee7e6d731d1f5d3cc05317" }, "downloads": -1, "filename": "z3c.securitytool-0.5.1-py2.4.egg", "has_sig": true, "md5_digest": "4a1ab805ab15eb668ef30007a6223d74", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 64407, "upload_time": "2010-10-23T02:32:47", "url": "https://files.pythonhosted.org/packages/39/55/dbca8808c3e9fdd07b9f8343a4583db2b9b11dd620531db31a8a62f9130c/z3c.securitytool-0.5.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "161fdc41c8e208fc27b38618772a7a26", "sha256": "23d51f828c1d6cde6c6b23596fc67ab1796d6d4254946cba7625fabfa53eef9f" }, "downloads": -1, "filename": "z3c.securitytool-0.5.1.tar.gz", "has_sig": true, "md5_digest": "161fdc41c8e208fc27b38618772a7a26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39800, "upload_time": "2010-10-23T02:32:44", "url": "https://files.pythonhosted.org/packages/5e/fc/72625b46ef99d1afc81b682415512c97ece860b757bc7469c4288dfd3bca/z3c.securitytool-0.5.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4a1ab805ab15eb668ef30007a6223d74", "sha256": "0d250ccb3448b7d9115041fb69e166781961ac1a37ee7e6d731d1f5d3cc05317" }, "downloads": -1, "filename": "z3c.securitytool-0.5.1-py2.4.egg", "has_sig": true, "md5_digest": "4a1ab805ab15eb668ef30007a6223d74", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 64407, "upload_time": "2010-10-23T02:32:47", "url": "https://files.pythonhosted.org/packages/39/55/dbca8808c3e9fdd07b9f8343a4583db2b9b11dd620531db31a8a62f9130c/z3c.securitytool-0.5.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "161fdc41c8e208fc27b38618772a7a26", "sha256": "23d51f828c1d6cde6c6b23596fc67ab1796d6d4254946cba7625fabfa53eef9f" }, "downloads": -1, "filename": "z3c.securitytool-0.5.1.tar.gz", "has_sig": true, "md5_digest": "161fdc41c8e208fc27b38618772a7a26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39800, "upload_time": "2010-10-23T02:32:44", "url": "https://files.pythonhosted.org/packages/5e/fc/72625b46ef99d1afc81b682415512c97ece860b757bc7469c4288dfd3bca/z3c.securitytool-0.5.1.tar.gz" } ] }