{ "info": { "author": "Valentin Samir", "author_email": "valentin.samir@crans.org", "bugtrack_url": null, "classifiers": [ "Environment :: No Input/Output (Daemon)", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: POSIX", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Communications :: Email :: Filters", "Topic :: Communications :: Email :: Mail Transport Agents" ], "description": "Policyd rate limit\n==================\n\n|travis| |coverage| |github_version| |pypi_version| |license|\n\nPostfix policyd server allowing to limit the number of mails accepted by\npostfix over several time periods, by sasl usernames and/or ip addresses.\n\n\nInstallation\n------------\n\nFirst, create the user that will run the daemon::\n\n adduser --system --group --home /run/policyd-rate-limit --no-create-home policyd-rate-limit\n\nSince version 0.6.0, the configuration file is written using the yaml, so you need the following\npackage:\n\n* `pyyaml `_\n (``sudo apt-get install python3-yaml`` on debian like systems)\n\nDepending of the backend storage you planning to use, you may need to install additional packages.\n(The default settings use the sqlite3 bakends and do not need extra packages).\n\n* `mysqldb `_\n (``sudo apt-get install python3-mysqldb`` on debian like systems) for the mysql backend.\n* `psycopg2 `_\n (``sudo apt-get install python3-psycopg2`` on debian like systems) fot the postgresql backend\n\nInstall with pip::\n\n sudo pip3 install policyd-rate-limit\n\nor from source code::\n\n sudo make install\n\nThis will install the ``policyd_rate_limit`` module, the ``policyd-rate-limit`` binary,\ncopy the default config to ``/etc/policyd-rate-limit.conf`` if the file do not exists,\ncopy an init script to ``/etc/init.d/policyd-rate-limit`` and an unit file to\n``/etc/systemd/system/policyd-rate-limit.service``.\n\nAfter the installation, you may need to run ``sudo systemctl daemon-reload`` for make the unit\nfile visible by systemd.\n\nYou should run ``policyd-rate-limit --clean`` on a regular basis to delete old records from the\ndatabase. It could be wise to put it in a daily cron, for example::\n\n 0 0 * * * policyd-rate-limit /usr/local/bin/policyd-rate-limit --clean >/dev/null\n\n\nOptions of the ``policyd-rate-limit`` binary\n--------------------------------------------\n\n* ``-h``, ``--help``: show the help message and exit\n* ``--clean``: clean old records from the database\n* ``--get-config PARAMETER_NAME`` return the value of a config parameter\n* ``--file CONFIG_PATH``, ``-f CONFIG_PATH``: path to a config file\n\nSettings\n--------\n\nIf the option ``--file`` is not specified, ``policyd-rate-limit`` try to read its configuration from\nthe following path and choose the first existing file:\n\n* ~/.config/policyd-rate-limit.conf\n* ~/.config/policyd-rate-limit.yaml\n* /etc/policyd-rate-limit.conf\n* /etc/policyd-rate-limit.yaml\n\nThe ``.conf`` are the old configuration format. It was a python module and should not be used.\nThe ``.yaml`` are the new configuration format using the YAML syntax.\n\n\n* ``debug``: make ``policyd-rate-limit`` output logs to stderr.\n The default is ``True``.\n* ``user``: The user ``policyd-rate-limit`` will use to drop privileges.\n The default is ``\"policyd-rate-limit\"``.\n* ``group``: The group ``policyd-rate-limit`` will use to drop privileges.\n The defaut is ``\"policyd-rate-limit\"``.\n* ``pidfile``: path where the program will try to write its pid to.\n The default is ``\"/var/run/policyd-rate-limit/policyd-rate-limit.pid\"``.\n ``policyd-rate-limit`` will try to create the parent directory and chown it if it do not exists.\n* ``mysql_config``: The config to connect to a mysql server\n* ``pgsql_config``: The config to connect to a postgresql server\n* ``sqlite_config``: The config to connect to a sqlite3 database.\n* ``backend``: Which data backend to use. Possible values are ``0`` for sqlite3, ``1`` for mysql\n and ``2`` for postgresql. The default is ``0``, use the sqlite3 backend.\n* ``SOCKET``: The socket to bind to. Can be a path to an unix socket or a couple [ip, port].\n The default is ``\"/var/spool/postfix/ratelimit/policy\"``.\n ``policyd-rate-limit`` will try to create the parent directory and chown it if it do not exists.\n* ``socket_permission``: Permissions on the unix socket (if unix socket used).\n The default is ``0o666``.\n* ``limits``: A list of couple [number of emails, number of seconds]. If one of the element of the\n list is exeeded (more than 'number of emails' on 'number of seconds' for an ip address or an sasl\n username), postfix will return a temporary failure.\n* ``limits_by_id``: A dictionary of id -> limit list (see limits). Used to override limits and use\n custom limits for a particular id. Use an empty list for no limits for a particular id.\n Ids are sasl usernames or ip addresses. The default is ``{}``.\n* ``limit_by_sasl``: Apply limits by sasl usernames. The default is ``True``.\n* ``limit_by_sender``: Apply limits by sender addresses if sasl username is not found.\n The defaut is ``False``.\n* ``limit_by_ip``: Apply limits by ip addresses if sasl username and sender address are not found.\n The default is ``False``.\n* ``limited_networks``: A list of ip networks in cidr notation on which limits are applied. An empty\n list is equal to ``limit_by_ip = False``, put ``\"0.0.0.0/0\"`` and ``::/0`` for every ip addresses.\n* ``success_action``: If not limits are reach, which action postfix should do. The default is\n ``\"dunno\"``. See http://www.postfix.org/access.5.html for possible actions.\n* ``fail_action``: If a limit is reach, which action postfix should do. The default is\n ``\"defer_if_permit Rate limit reach, retry later\"``.\n* ``db_error_action`` : If we are unable to to contect the database backend, which action postfix\n should do. The default is ``\"dunno\"``. See http://www.postfix.org/access.5.html for possible\n actions.\n See http://www.postfix.org/access.5.html for possible actions.\n* ``config_file``: This parameter is automatically set to the path of the configuration file\n currently in use. You can call it conjunction with **--get-config** to known which configuration\n file is used.\n\n\n* ``report``: if ``True``, send a report to ``report_to`` about users reaching limits each time\n --clean is called. The default is ``False``.\n* ``report_from``: From who to send emails reports. It must be defined when ``report`` is ``True``.\n* ``report_to``: Address to send emails reports to. It must be defined when ``report`` is ``True``.\n It can be a single email address or a list of email adresses.\n* ``report_subject``: Subject of the report email. The default is ``\"policyd-rate-limit report\"``.\n* ``report_limits``: List of number of seconds from the limits list for which you want to be reported.\n The default is ``[86400]``.\n* ``report_only_if_needed``: Only send a report if some users have reach a reported limit.\n The default is ``True``.\n\n\n* ``smtp_server``: The smtp server to use to send emails ``[\"host\", port]``.\n The default is ``[\"localhost\", 25]``.\n* ``smtp_starttls``: Should we use starttls to send mails ? (you should set this to ``True`` if\n you use ``smtp_credentials``). The default is ``False``.\n* ``smtp_credentials``: Should we use credentials to connect to smtp_server ?\n if yes set ``[\"user\", \"password\"]``, else ``null``. The default is ``null``.\n\n\nPostfix settings\n----------------\n\nFor postfix 3.0 and later I recommend using the example below. It ensure that if policyd-rate-limit\nbecome unavailable for any reason, postfix will ignore it and keep accepting mail as if the rule\nwas not here. I find it nice has in my opinion, policyd-rate-limit is a \"non-critical\" policy\nservice.\n\n /etc/postfix/main.cf::\n\n smtpd_recipient_restrictions =\n ...,\n check_policy_service { unix:ratelimit/policy, default_action=DUNNO },\n ...\n\n\nOn previous postfix versions, you must use:\n\n /etc/postfix/main.cf::\n\n smtpd_recipient_restrictions =\n ...,\n check_policy_service unix:ratelimit/policy,\n ...\n\n\n.. |travis| image:: https://badges.genua.fr/travis/nitmir/policyd-rate-limit/master.svg\n :target: https://travis-ci.org/nitmir/policyd-rate-limit\n\n.. |coverage| image:: https://badges.genua.fr/coverage/badge/policyd-rate-limit/master.svg\n :target: https://badges.genua.fr/coverage/policyd-rate-limit/\n\n.. |pypi_version| image:: https://badges.genua.fr/pypi/v/policyd-rate-limit.svg\n :target: https://pypi.python.org/pypi/policyd-rate-limit\n\n.. |github_version| image:: https://badges.genua.fr/github/tag/nitmir/policyd-rate-limit.svg?label=github\n :target: https://github.com/nitmir/policyd-rate-limit/releases/latest\n\n.. |license| image:: https://badges.genua.fr/pypi/l/policyd-rate-limit.svg\n :target: https://www.gnu.org/licenses/gpl-3.0.html\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/nitmir/policyd-rate-limit/releases/latest", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nitmir/policyd-rate-limit", "keywords": "Postfix", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "policyd-rate-limit", "package_url": "https://pypi.org/project/policyd-rate-limit/", "platform": "", "project_url": "https://pypi.org/project/policyd-rate-limit/", "project_urls": { "Download": "https://github.com/nitmir/policyd-rate-limit/releases/latest", "Homepage": "https://github.com/nitmir/policyd-rate-limit" }, "release_url": "https://pypi.org/project/policyd-rate-limit/1.0.0/", "requires_dist": null, "requires_python": "", "summary": "Postfix rate limit policy server implemented in Python3.", "version": "1.0.0" }, "last_serial": 4496802, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "6c86b2a99c0ba4035b763506dbde3600", "sha256": "02637b6bf52cfc167a5a16bdd931e6aa017015c75b324eb3bc4753be5eedea4d" }, "downloads": -1, "filename": "policyd-rate-limit-0.1.tar.gz", "has_sig": false, "md5_digest": "6c86b2a99c0ba4035b763506dbde3600", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7424, "upload_time": "2015-12-20T17:44:01", "url": "https://files.pythonhosted.org/packages/21/72/2e5cc7e07a2c8a32fa1322bfacdcacc5550a01de953aa681fe121320ef96/policyd-rate-limit-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "5890572be2d9d4741e16e98853d26897", "sha256": "3d830b381cf815ab1bae2a95a0b8f7886e6a797d77a2d29e1c049f786c9af0ad" }, "downloads": -1, "filename": "policyd-rate-limit-0.2.tar.gz", "has_sig": false, "md5_digest": "5890572be2d9d4741e16e98853d26897", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8513, "upload_time": "2015-12-20T18:13:37", "url": "https://files.pythonhosted.org/packages/4e/df/eec8471fb6a26dfffb6d772072d65628d36cd5d130e2ebeebf9afa1393a6/policyd-rate-limit-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "bfd8ea3feb64b2305d7c28182740f5cd", "sha256": "ecf25e5b19f7bfa8e81866e167e2fbb2c5222bff82d8244db0fe8b758bce9df3" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.tar.gz", "has_sig": false, "md5_digest": "bfd8ea3feb64b2305d7c28182740f5cd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9590, "upload_time": "2015-12-21T12:24:24", "url": "https://files.pythonhosted.org/packages/9e/15/9d2eae2a29aca24d77ea6fbb9ab334e0200f8dc61c4bf077b31b14ea3330/policyd-rate-limit-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "15f2b122a03a415179b8a0fb3fe72e1a", "sha256": "2ced7a7a3d11cb76ba5bbb4f3d45a80bc388656d77e87e507fd643d7359e6dce" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.1.tar.gz", "has_sig": false, "md5_digest": "15f2b122a03a415179b8a0fb3fe72e1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9599, "upload_time": "2015-12-21T15:08:55", "url": "https://files.pythonhosted.org/packages/13/da/fa396daca570e47e4336567043e2ee3b2a726c7d7630a34974bebf958470/policyd-rate-limit-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "ad922fad9f69c49c23c8824abfec8119", "sha256": "1b60c19cd3292fa4ace4298acac48f08887011d72e3302e085f848f057558231" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.2.tar.gz", "has_sig": false, "md5_digest": "ad922fad9f69c49c23c8824abfec8119", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8092, "upload_time": "2015-12-21T15:48:03", "url": "https://files.pythonhosted.org/packages/15/dc/7e4975ae5f2c2a1c8b5ed26166a289da6a59166572ff1b4a2d00182bcb3e/policyd-rate-limit-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "421b599aa219a34944c8417ca0ea0da1", "sha256": "4ea8d8dee1a286ce5af73f3b39d824460415fc150a03dbe5865383311bf006d8" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.3.tar.gz", "has_sig": false, "md5_digest": "421b599aa219a34944c8417ca0ea0da1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23762, "upload_time": "2015-12-22T13:44:20", "url": "https://files.pythonhosted.org/packages/9a/2f/4159492ba4d9749199a3705fdddb3965361a325937fda2289e7bc542c488/policyd-rate-limit-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "89d930b8fae00e27ea9cc04d3c237362", "sha256": "6aadaf9483f84a312752908b31a5653bc6f8db2f5858599cc44bb03ee226ce1b" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.4.tar.gz", "has_sig": false, "md5_digest": "89d930b8fae00e27ea9cc04d3c237362", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24116, "upload_time": "2015-12-23T15:06:24", "url": "https://files.pythonhosted.org/packages/77/ec/be808962efecbffc394e622558b956e3252f6ed6f0a1de6d351d832c761e/policyd-rate-limit-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "72b44456cb19384ec53ba77e6d11c024", "sha256": "a22d8b72be05af0a6bfab409f6c02f30cba7b9180221d0680bfb160ccc83e293" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.5.tar.gz", "has_sig": false, "md5_digest": "72b44456cb19384ec53ba77e6d11c024", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25224, "upload_time": "2015-12-23T15:47:41", "url": "https://files.pythonhosted.org/packages/b3/06/ff4720a0366790dc8190fd8500e631cdfd9bbe31b04a0828539f2901ddc0/policyd-rate-limit-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "a743466374f4dc57fdc7713a87623204", "sha256": "73c1ef28368d40accf31f704d09df57811d420dca563dd651e05005d579e4178" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.6.tar.gz", "has_sig": false, "md5_digest": "a743466374f4dc57fdc7713a87623204", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22411, "upload_time": "2016-07-07T07:41:02", "url": "https://files.pythonhosted.org/packages/ed/7e/0084999beb14d8b07b61c5ba9b5358c42ced864216cacdc4cb8b7b1f9869/policyd-rate-limit-0.3.6.tar.gz" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "c1d88af692a46b94fb19e0d070489a5d", "sha256": "5ee5b3f37538e9a3d49bebdd1d376868d81a1d1575f72029a423f958cae02f6a" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.7.tar.gz", "has_sig": false, "md5_digest": "c1d88af692a46b94fb19e0d070489a5d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25352, "upload_time": "2016-07-07T10:43:37", "url": "https://files.pythonhosted.org/packages/1f/74/7cd2054588b38873ca72c8f5232d3beb307d3d340f9c6d4c3ae7a029adce/policyd-rate-limit-0.3.7.tar.gz" } ], "0.3.8": [ { "comment_text": "", "digests": { "md5": "4a38cf7fab9bc858c037baca67601375", "sha256": "ee576bb9a8d0013fa5758284606e39079565524fa9a9d724144424ddcf8c9499" }, "downloads": -1, "filename": "policyd-rate-limit-0.3.8.tar.gz", "has_sig": false, "md5_digest": "4a38cf7fab9bc858c037baca67601375", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25778, "upload_time": "2016-07-07T16:02:59", "url": "https://files.pythonhosted.org/packages/af/18/a5d26fe988c68a92541e1d1d46a104bab5a5a3e260c5a09df7a954afaa19/policyd-rate-limit-0.3.8.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "3e76370a63f0f75a7201e853b0f1936b", "sha256": "a2563879ca4324646cf28fc4dff0cf3e6deff6691e06e6309932c5eea3027166" }, "downloads": -1, "filename": "policyd-rate-limit-0.4.0.tar.gz", "has_sig": false, "md5_digest": "3e76370a63f0f75a7201e853b0f1936b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26784, "upload_time": "2016-07-09T15:15:46", "url": "https://files.pythonhosted.org/packages/bf/46/04a9c3195c2fd6b554dedb8d0aa69568238dadf56e1d8587cb599f78cceb/policyd-rate-limit-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "fda80629938b018f95b62cb13c6dd647", "sha256": "fb1c7692f0dfe4e51f6b5a58e15ee2fed120190842076644a8edcf342c3cc353" }, "downloads": -1, "filename": "policyd-rate-limit-0.4.1.tar.gz", "has_sig": false, "md5_digest": "fda80629938b018f95b62cb13c6dd647", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28282, "upload_time": "2016-07-09T15:21:17", "url": "https://files.pythonhosted.org/packages/f6/df/c793a89ea91a5c03dfb025cd1a285cb8cde47ba283063983fd86f3d0521c/policyd-rate-limit-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "9612a155a772180f5db78a9bd15ec988", "sha256": "3de788d02dbe4046cabaa13ac53db85ae0caf67b2bb0fc68401c4f9ab1d97081" }, "downloads": -1, "filename": "policyd-rate-limit-0.4.2.tar.gz", "has_sig": false, "md5_digest": "9612a155a772180f5db78a9bd15ec988", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28532, "upload_time": "2016-07-14T10:58:55", "url": "https://files.pythonhosted.org/packages/ed/e3/88a07ac9359a439479fbca08d2c7467cccf796a7d01bff003e523171f44f/policyd-rate-limit-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "9e87309e1655e100efe4cb1dff50a3f5", "sha256": "272346fdee415bda10d700dfbdab5e2b658f832a7affcdbfde7ad5f51a7307cf" }, "downloads": -1, "filename": "policyd-rate-limit-0.5.0.tar.gz", "has_sig": false, "md5_digest": "9e87309e1655e100efe4cb1dff50a3f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31949, "upload_time": "2016-07-16T10:27:24", "url": "https://files.pythonhosted.org/packages/c8/8b/811befdafec11361dd8ca3f3d347a788a46e71face9001521428f2b30a80/policyd-rate-limit-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "9252e489d2006bd4f0d4d15f2e229788", "sha256": "f3e14f6562d83133fda68009af9f3a4530c07f00a0ad137a6b3e101f410a9507" }, "downloads": -1, "filename": "policyd-rate-limit-0.5.1.tar.gz", "has_sig": false, "md5_digest": "9252e489d2006bd4f0d4d15f2e229788", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31945, "upload_time": "2016-07-18T18:09:45", "url": "https://files.pythonhosted.org/packages/7b/e6/35dc517bbbd5184a93a3374175a8c29bc861ff481ac6dc3d6e1a531051df/policyd-rate-limit-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "9db9234a53ea01a78149a8e2da39632e", "sha256": "3435580e5d731af064144a7eecf8be864e08592706cf1daa5e62cef13e16d0fe" }, "downloads": -1, "filename": "policyd-rate-limit-0.5.2.tar.gz", "has_sig": true, "md5_digest": "9db9234a53ea01a78149a8e2da39632e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32091, "upload_time": "2016-08-03T14:44:00", "url": "https://files.pythonhosted.org/packages/8c/a2/43bb72eecd71dea69b260df4dbcdd0b208e460cf2d12fbb65731811bd4c9/policyd-rate-limit-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "086220b418166c8bd299a6ca0bcc81cb", "sha256": "4c6211027a1ac00049d9db9fbad0584a43c91fe6a91d1e4d99d9390a4a783605" }, "downloads": -1, "filename": "policyd-rate-limit-0.5.3.tar.gz", "has_sig": true, "md5_digest": "086220b418166c8bd299a6ca0bcc81cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32091, "upload_time": "2016-08-03T15:24:30", "url": "https://files.pythonhosted.org/packages/f6/de/6e94c061f64b503241991362fd238e15125acb6d502d4d0eba39db06dc09/policyd-rate-limit-0.5.3.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "1ad048654183b0e75dcf23d3d596cc73", "sha256": "b4d63c5142764da1749935ddb1200fa24fa013d7bd2ec956c6dcd4708d322f2e" }, "downloads": -1, "filename": "policyd-rate-limit-0.6.0.tar.gz", "has_sig": true, "md5_digest": "1ad048654183b0e75dcf23d3d596cc73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32014, "upload_time": "2016-08-04T10:17:21", "url": "https://files.pythonhosted.org/packages/5c/93/805b68c72836c389fc8e2fd1e3ce859421c663e7be434d27e2fbb738e739/policyd-rate-limit-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "b2ded00612ecb51d1320ad576b7241e4", "sha256": "8f59eb4b38d33145f5fef226f85c3bf12609ff99546fc30ed555b04ce851df89" }, "downloads": -1, "filename": "policyd-rate-limit-0.6.1.tar.gz", "has_sig": true, "md5_digest": "b2ded00612ecb51d1320ad576b7241e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33289, "upload_time": "2016-08-04T10:28:39", "url": "https://files.pythonhosted.org/packages/c6/13/5c18e70545f45d1ef92bca70e397c3fe8925ad387d112cad5b4718b75851/policyd-rate-limit-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "69c6f08ae0bae4009a62323e2edf53e0", "sha256": "830134736a6ff910684aeace76a483fe17b0b10557f7c39b3f13a8b4dfb6f628" }, "downloads": -1, "filename": "policyd-rate-limit-0.6.2.tar.gz", "has_sig": true, "md5_digest": "69c6f08ae0bae4009a62323e2edf53e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33758, "upload_time": "2016-08-16T17:12:37", "url": "https://files.pythonhosted.org/packages/6e/82/994be133ba6fb5796be99ace0a29246cd56e110061ef2af0478781be9500/policyd-rate-limit-0.6.2.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "a7cf67bce45901a9a3b9d8124cdc65ae", "sha256": "575065078f1702cdbd85d431c557566e93c715a7a2681a748a913137999d98a4" }, "downloads": -1, "filename": "policyd-rate-limit-0.7.0.tar.gz", "has_sig": true, "md5_digest": "a7cf67bce45901a9a3b9d8124cdc65ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38540, "upload_time": "2016-09-08T16:44:43", "url": "https://files.pythonhosted.org/packages/bc/d7/7908193e93a3337a1f6ddbca1e82f0068bb5dd90b06fc6f5c350fa37737d/policyd-rate-limit-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "0487a7c41fb1e300b5007577c4e29083", "sha256": "262f21a5a110b39382fd4831b56c5b43cb1a829238dda4086be39bbe4f5b374a" }, "downloads": -1, "filename": "policyd-rate-limit-0.7.1.tar.gz", "has_sig": true, "md5_digest": "0487a7c41fb1e300b5007577c4e29083", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38624, "upload_time": "2016-09-09T10:09:09", "url": "https://files.pythonhosted.org/packages/0d/92/4e83d4d0aa3d41f194b7f18da1f3e3699d66535540ba718f28827ca90e82/policyd-rate-limit-0.7.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "17af707f1ee7199cf0b2f9d8b378934d", "sha256": "cc88ceebdaa2b688d836102af142574e0f11e189aadfbac601dfe711863a5c84" }, "downloads": -1, "filename": "policyd-rate-limit-1.0.0.tar.gz", "has_sig": true, "md5_digest": "17af707f1ee7199cf0b2f9d8b378934d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39711, "upload_time": "2018-11-17T10:49:24", "url": "https://files.pythonhosted.org/packages/5d/87/607f09a27dbae9afec964848fabb7d4d1a19da4e7895475ddfba0ed47ed7/policyd-rate-limit-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "17af707f1ee7199cf0b2f9d8b378934d", "sha256": "cc88ceebdaa2b688d836102af142574e0f11e189aadfbac601dfe711863a5c84" }, "downloads": -1, "filename": "policyd-rate-limit-1.0.0.tar.gz", "has_sig": true, "md5_digest": "17af707f1ee7199cf0b2f9d8b378934d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39711, "upload_time": "2018-11-17T10:49:24", "url": "https://files.pythonhosted.org/packages/5d/87/607f09a27dbae9afec964848fabb7d4d1a19da4e7895475ddfba0ed47ed7/policyd-rate-limit-1.0.0.tar.gz" } ] }