{ "info": { "author": "Behavox", "author_email": "devops@behavox.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: Apache Software License", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Topic :: Security :: Cryptography" ], "description": "Harpo\n=====\n\nDescription\n-----------\n\n> Harpocrates (Ancient Greek: \u1f09\u03c1\u03c0\u03bf\u03ba\u03c1\u03ac\u03c4\u03b7\u03c2) was the god of silence, secrets and confidentiality.\n\n**Harpo** is GPG-based secret storage/sharing library.\n\nIt is aims to be a convenient wrapper around GPG and tries to solve following problems:\n\n* Store secrets in a repository (currently only git is supported) in a secure manner\n* Provide role-based access to the stored secrets\n* Provide an easy way to reencrypt secrets\n\nIt was inspired by [blackbox](https://github.com/StackExchange/blackbox) by StackExchange.\n\nInstallation\n------------\n\n**Harpo** is available at pypi.org and can be installed with pip:\n\n```bash\npip install harpo\n```\n\nQuick start\n-----------\n\n### Initialization\n\nSuppose we have some git repository:\n\n```bash\n$ git rev-parse --is-inside-work-tree\ntrue\n```\n\nThen we can initialize harpo right away with:\n\n```bash\nharpo initialize\n```\nThis command will create necessary directory structure and bootstrap it with some default groups and domains:\n\n```bash\n[INFO] Initializing at /home/user/my_repo/.harpo\n[INFO] Add domain: all\n[INFO] Create group: all\n[INFO] Create group: adm\n[INFO] OK\n```\n\n### Add users\n\nNow it's time to add the first users. Harpo will look into your GPG public keyring and will try importing\npublic keys from there.\n```bash\nharpo add user -g adm\n```\n\nKey ID can be any string, that identifies your key: email, surname, id, etc.\n\nLet's say you have a key with email `mr.robot@example.com`:\n\n```bash\nharpo add user mr.robot -g adm\n```\n\n```bash\n[INFO] Importing key A8.....0 - Mister Robot \n[INFO] Add user 'Mister Robot ' to group 'adm'\n[INFO] Add user 'Mister Robot ' to group 'all'\n[INFO] Reencrypting everything!\n```\n\nNote, that we also indicated, that we want this user to be added to the `adm` group.\nAlso every user belongs to group `all`\n\n\n### Encrypt some stuff\n\n```bash\nharpo encrypt all/my_password hunter2\n```\n\nThis will create a new GPG encrypted file at `.harpo/domains/all/my_password`.\n\n**Note:**\n\nYou can also encrypt entire files with `encrypt-file`:\n\n```bash\nharpo encrypt-file all/bobs_password /home/alice/Downloads/bobs_password\n```\n\n\n### Decryption\n\n```bash\nharpo decrypt all/my_password\n```\n\nIt will print the secret's contents to the STDOUT:\n```bash\n$ harpo decrypt all/my_password\nhunter2\n```\n\n\n### Add domains\n\nLet's create another domain for our development-related secrets and another for production.\n\n```bash\nharpo add domain dev\n```\n\n```bash\nharpo add domain prod\n```\n\nThis will create `.harpo/domains/dev` and `.harpo/domains/prod`.\n\n### Add groups\n\n```bash\nharpo add group developers\n```\n\n### Granting access\n\nCurrently only group `adm` has access to both `dev` and `prod` domains.\nLets change this by allowing group `developers` to read secrets in domain `dev`:\n\n```bash\nharpo allow -g developers dev\n```\n\nNow if you add users to `developers` group, they all will be able\nto decrypt secrets in `dev` domain:\n\n```bash\nharpo add user mr.developer -g developers\n```\n\n### Reencrypting\n\n**Harpo** automatically reencrypts secrets when it's appropriate.\nIf you want to trigger reencryption manually, run:\n\n```bash\nharpo reencrypt\n```\n\nTerminology\n-----------\n\n### Secret\n\n**Secret** \u2014 is a GPG encrypted file, stored inside a domain.\n\nIts recipients list always contains users from group `adm` and other recipients that are allowed to read secrets in its domain.\n\n\n### Domain\n\n**Domains** provide a way to group secrets: all secrets inside a given domain have the same list of recipients. User can specify which groups/users can read secrets in a given domain.\n\nThere is one system domain created by default: `all`.\nIts purpose is to store secrets, that can be decrypted by any existing user.\n\nGroup `adm` can decrypt any secrets in any domain.\n\n\n### User\n\nBasically it's just a GPG recipient. Harpo identifies users by looking into its GPG public keyring located at `.harpo/keychain/pubkeyring.gpg`\n\n\n### Group\n\n**Group** \u2014 is a list of users. There are two special system groups: `all` and `adm`. They have following properties:\n\n* Every user belongs to `all`, hence can decrypt any secret in `all` special domain,\n* And `adm` can decrypt any secret in any domain\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://behavox.com/", "keywords": "", "license": "Apache-2", "maintainer": "", "maintainer_email": "", "name": "harpo", "package_url": "https://pypi.org/project/harpo/", "platform": "", "project_url": "https://pypi.org/project/harpo/", "project_urls": { "Homepage": "https://behavox.com/" }, "release_url": "https://pypi.org/project/harpo/0.5.12/", "requires_dist": [ "pbr", "PyYAML", "python-gnupg" ], "requires_python": ">=2.7", "summary": "A GPG-based secret storing/sharing library", "version": "0.5.12" }, "last_serial": 5427450, "releases": { "0.5.1": [ { "comment_text": "", "digests": { "md5": "28d55672dd96e8e265a2f4ce16547faf", "sha256": "a069af5a51e740b7ca16929b57b78c48c4de8bb7b3b3ffe0fb532e8f621ffd15" }, "downloads": -1, "filename": "harpo-0.5.1-py2-none-any.whl", "has_sig": false, "md5_digest": "28d55672dd96e8e265a2f4ce16547faf", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 12758, "upload_time": "2018-09-14T17:20:43", "url": "https://files.pythonhosted.org/packages/d8/b8/811d06bcc7c9e411a644da20dc4ee2edac6b65b1576014b89f2c480d5192/harpo-0.5.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "694493cd526969f7bfd004f4eac1f3aa", "sha256": "86be1a0e0733af901ea6c9e707e4fb1e41c4cbc1a3cc4131b121a3baea18f71b" }, "downloads": -1, "filename": "harpo-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "694493cd526969f7bfd004f4eac1f3aa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 12759, "upload_time": "2018-09-14T17:20:44", "url": "https://files.pythonhosted.org/packages/8d/5f/91a6c153aaa013c4200c44db978f6c619bf26a1e1d4ead2603da423bc180/harpo-0.5.1-py3-none-any.whl" } ], "0.5.10": [ { "comment_text": "", "digests": { "md5": "96b57b4cf12f2908bf2fcb3e513d4092", "sha256": "fca4828ee96002ca5ddc5f8e2e534cc4c6b72d669220d678569a1384074418ab" }, "downloads": -1, "filename": "harpo-0.5.10-py2-none-any.whl", "has_sig": false, "md5_digest": "96b57b4cf12f2908bf2fcb3e513d4092", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 16710, "upload_time": "2019-02-15T14:18:57", "url": "https://files.pythonhosted.org/packages/74/bc/324999b2aefd99754615c35c7f2a159677244041f908b856945639ac3010/harpo-0.5.10-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff63ef1dfde97e3d524aa65f11326fe2", "sha256": "a0bc6005f731ad60d4bd12b3b83aa40223cb0a62b21fcf116f617ea8634f5ea0" }, "downloads": -1, "filename": "harpo-0.5.10-py3-none-any.whl", "has_sig": false, "md5_digest": "ff63ef1dfde97e3d524aa65f11326fe2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20450, "upload_time": "2019-02-15T14:18:59", "url": "https://files.pythonhosted.org/packages/1b/cd/e84a3db8e29ed9adf7c682c26596e69a979dec736b78c9efd428c9e0fbf9/harpo-0.5.10-py3-none-any.whl" } ], "0.5.11": [ { "comment_text": "", "digests": { "md5": "8c300a1c927aa2eec0a30577b2deefa4", "sha256": "c792d223a992d52fc4a8a92a9dc6258356d31fee4dc8924bb5d575b73bafcfbd" }, "downloads": -1, "filename": "harpo-0.5.11-py2-none-any.whl", "has_sig": false, "md5_digest": "8c300a1c927aa2eec0a30577b2deefa4", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 16787, "upload_time": "2019-03-20T15:38:09", "url": "https://files.pythonhosted.org/packages/4b/25/0aabad3c6b6425fb8c2fb7b6987f60d2703df44bf54ea0c4e7671ef236e9/harpo-0.5.11-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce022bed9943421f7111e02552eb3bd7", "sha256": "e8024a2c1722261e52fb0e1568bf62ee74aca368f27b2c94f8d421e1aafdc3f3" }, "downloads": -1, "filename": "harpo-0.5.11-py3-none-any.whl", "has_sig": false, "md5_digest": "ce022bed9943421f7111e02552eb3bd7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20528, "upload_time": "2019-03-20T15:38:10", "url": "https://files.pythonhosted.org/packages/68/a4/f92938bda38a3ef77590e8492b5f1cbddd1807fae22c559b8b0a8f765968/harpo-0.5.11-py3-none-any.whl" } ], "0.5.12": [ { "comment_text": "", "digests": { "md5": "140c300050f813dc7d6c898a872a6ed2", "sha256": "e557bb1798d932e9a1c2b2a99bf4b087d51735d4b1143b25b3485bf0c7959580" }, "downloads": -1, "filename": "harpo-0.5.12-py2-none-any.whl", "has_sig": false, "md5_digest": "140c300050f813dc7d6c898a872a6ed2", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 16799, "upload_time": "2019-06-20T20:06:37", "url": "https://files.pythonhosted.org/packages/16/27/75e8c005529b05a19c3042942d23e679aa912abfaeca1575575c94398926/harpo-0.5.12-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a34ebea8bb01430b963dc6707ebbcd91", "sha256": "a69b0e7c5586ff96c5b4191151db44ff3474773f36ead2740afe21f42d5ab19a" }, "downloads": -1, "filename": "harpo-0.5.12-py3-none-any.whl", "has_sig": false, "md5_digest": "a34ebea8bb01430b963dc6707ebbcd91", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20537, "upload_time": "2019-06-20T20:06:38", "url": "https://files.pythonhosted.org/packages/20/3c/7f44e215d1631fda164e447e8e5c5b6009591a92685b176240d257e51672/harpo-0.5.12-py3-none-any.whl" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "dca8a5a5eab4b744de1535f0b7743007", "sha256": "6c3b4fa49d59d209dbce49f8a3eccd509bc49b0367006f5a08493e869b1b491f" }, "downloads": -1, "filename": "harpo-0.5.2-py2-none-any.whl", "has_sig": false, "md5_digest": "dca8a5a5eab4b744de1535f0b7743007", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 13586, "upload_time": "2018-09-24T16:45:20", "url": "https://files.pythonhosted.org/packages/0a/37/ba4ab674e5b7a26e2ddde6feff51906d6d9b7daadd8c0e34aa8cb7534708/harpo-0.5.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ef066550d2655a183050bf2d8cb2de7f", "sha256": "2bff9c0f5b822ebb8985b8d9aed80484d9bee08f15b8840b492841407ffda777" }, "downloads": -1, "filename": "harpo-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ef066550d2655a183050bf2d8cb2de7f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 13585, "upload_time": "2018-09-24T16:45:22", "url": "https://files.pythonhosted.org/packages/68/94/c268dab943a3cedf534f0fb523e3ad8b12065c2d5c44e47577c424e69fd2/harpo-0.5.2-py3-none-any.whl" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "fda84c963b94f6897d67ec244a946581", "sha256": "c8bd904a68975d2b54c8314f7bb283882ad5803f3f1a0d1398bca41f8a965b2a" }, "downloads": -1, "filename": "harpo-0.5.5-py2-none-any.whl", "has_sig": false, "md5_digest": "fda84c963b94f6897d67ec244a946581", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 15699, "upload_time": "2018-09-26T15:46:24", "url": "https://files.pythonhosted.org/packages/15/61/94c6c2af3b21ae48641146fdb618ce7d0857c557fd8692aee53a11c3d348/harpo-0.5.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "92331c6ff3a39d76bed73066b3dd34eb", "sha256": "feb3d936be371fc5a8ebcda97ab5f2c4e7099965e80edea082d3f4e0663e5ebb" }, "downloads": -1, "filename": "harpo-0.5.5-py3-none-any.whl", "has_sig": false, "md5_digest": "92331c6ff3a39d76bed73066b3dd34eb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 15699, "upload_time": "2018-09-26T15:46:25", "url": "https://files.pythonhosted.org/packages/90/96/c638a381192d77b214bbfe8801b88969306bc867f5d7764cf44c839b9ec2/harpo-0.5.5-py3-none-any.whl" } ], "0.5.6": [ { "comment_text": "", "digests": { "md5": "50df45619058fa88860eadd4b6925e29", "sha256": "4eb569f946a57a72f7739f8f5572845ebb0371a6274ffbd3d142d9eda629beb1" }, "downloads": -1, "filename": "harpo-0.5.6-py2-none-any.whl", "has_sig": false, "md5_digest": "50df45619058fa88860eadd4b6925e29", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 15697, "upload_time": "2018-09-26T15:50:17", "url": "https://files.pythonhosted.org/packages/2b/86/1eb4e83b42fc4d5773fc402828e6573dfbfbf8d3b2cbd5d76ec1afb9d49d/harpo-0.5.6-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "780a6304c6725a06b43f252290f429e2", "sha256": "f2f24090a5491c1a3dee3e7f65a25a05723cc97eaf24320b1cec0205b6eea0b5" }, "downloads": -1, "filename": "harpo-0.5.6-py3-none-any.whl", "has_sig": false, "md5_digest": "780a6304c6725a06b43f252290f429e2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 15695, "upload_time": "2018-09-26T15:50:18", "url": "https://files.pythonhosted.org/packages/d4/c7/f9446c93d814dc0724aa9124c751a92c1b9300a3293035e5c78b6e1f913f/harpo-0.5.6-py3-none-any.whl" } ], "0.5.7": [ { "comment_text": "", "digests": { "md5": "8953c0944c877ebf88622a153e0b9967", "sha256": "35db9d2e6bf1bee140b07067020552701c248f5694e8294f3ae845d56c6bb473" }, "downloads": -1, "filename": "harpo-0.5.7-py2-none-any.whl", "has_sig": false, "md5_digest": "8953c0944c877ebf88622a153e0b9967", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 16179, "upload_time": "2018-10-03T16:11:16", "url": "https://files.pythonhosted.org/packages/04/bc/0b3e55de4a9aa828a65c185a9510037b9e63aae034cf462a093d460c4459/harpo-0.5.7-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "06acea430d118c144d5673d33454c175", "sha256": "e111b193ad054a6189c8ebd2f2e7f9c8388827f0390bac8d163946427db7a4ef" }, "downloads": -1, "filename": "harpo-0.5.7-py3-none-any.whl", "has_sig": false, "md5_digest": "06acea430d118c144d5673d33454c175", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 16177, "upload_time": "2018-10-03T16:11:17", "url": "https://files.pythonhosted.org/packages/9e/fe/0e29610ff6b4240b12d352bac943af0d2982976ccb87d30d7083e471a40a/harpo-0.5.7-py3-none-any.whl" } ], "0.5.8": [ { "comment_text": "", "digests": { "md5": "c6d4cd1e1d5c44ee870c6a866dc6fb81", "sha256": "e309383b1f9cfe21511182864f17a31cac8ba8caed0b75d6d45acb0c11e04fc6" }, "downloads": -1, "filename": "harpo-0.5.8-py2-none-any.whl", "has_sig": false, "md5_digest": "c6d4cd1e1d5c44ee870c6a866dc6fb81", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 16588, "upload_time": "2018-10-09T15:03:16", "url": "https://files.pythonhosted.org/packages/e9/c2/8fa30c615a3c9941cdd1e4fe18605b4d565f1e5fd289fc3f5ae68591d145/harpo-0.5.8-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7866a94c59ceeb46d638a1de4c12869a", "sha256": "4d7ed9f919fbaf6d302d3f8cd0f052340a010e0cb39cb00f79c77f91766c1296" }, "downloads": -1, "filename": "harpo-0.5.8-py3-none-any.whl", "has_sig": false, "md5_digest": "7866a94c59ceeb46d638a1de4c12869a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20325, "upload_time": "2018-10-09T15:03:19", "url": "https://files.pythonhosted.org/packages/d5/b5/90f2e1a9dfbe02091e0f70d6c5ef184a2c253f5792e1b6e07195cb4d6da9/harpo-0.5.8-py3-none-any.whl" } ], "0.5.9": [ { "comment_text": "", "digests": { "md5": "a9dbed4df08721946c0eb64fcf31bfef", "sha256": "2aad699f46d5d813a5552b84bccd658e6bc804a937c23cf0389b9e212849d030" }, "downloads": -1, "filename": "harpo-0.5.9-py2-none-any.whl", "has_sig": false, "md5_digest": "a9dbed4df08721946c0eb64fcf31bfef", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 16684, "upload_time": "2018-10-09T15:20:53", "url": "https://files.pythonhosted.org/packages/ce/c2/4fdf807773c897f06dc9e02dde28b118b725215b1cabe6ebe9cd4de9b961/harpo-0.5.9-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3feedcc846f4402191f7193866700691", "sha256": "db090627c372ff1781106a866e82c465a9645e3f3cf2b84c54ba5090df75cb5b" }, "downloads": -1, "filename": "harpo-0.5.9-py3-none-any.whl", "has_sig": false, "md5_digest": "3feedcc846f4402191f7193866700691", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20422, "upload_time": "2018-10-09T15:20:55", "url": "https://files.pythonhosted.org/packages/c0/45/cd839f69d40d3befa6198065899faa7b27e99b767cbc23d49f155cfe2500/harpo-0.5.9-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "140c300050f813dc7d6c898a872a6ed2", "sha256": "e557bb1798d932e9a1c2b2a99bf4b087d51735d4b1143b25b3485bf0c7959580" }, "downloads": -1, "filename": "harpo-0.5.12-py2-none-any.whl", "has_sig": false, "md5_digest": "140c300050f813dc7d6c898a872a6ed2", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.7", "size": 16799, "upload_time": "2019-06-20T20:06:37", "url": "https://files.pythonhosted.org/packages/16/27/75e8c005529b05a19c3042942d23e679aa912abfaeca1575575c94398926/harpo-0.5.12-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a34ebea8bb01430b963dc6707ebbcd91", "sha256": "a69b0e7c5586ff96c5b4191151db44ff3474773f36ead2740afe21f42d5ab19a" }, "downloads": -1, "filename": "harpo-0.5.12-py3-none-any.whl", "has_sig": false, "md5_digest": "a34ebea8bb01430b963dc6707ebbcd91", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 20537, "upload_time": "2019-06-20T20:06:38", "url": "https://files.pythonhosted.org/packages/20/3c/7f44e215d1631fda164e447e8e5c5b6009591a92685b176240d257e51672/harpo-0.5.12-py3-none-any.whl" } ] }