{ "info": { "author": "Daniel Quinn", "author_email": "code@danielquinn.org", "bugtrack_url": null, "classifiers": [ "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP" ], "description": "django-encrypted-filefield\n==========================\n\nEncrypt uploaded files, store them wherever you like and stream them back\nunencrypted.\n\n\nWhy This Exists\n---------------\n\nIt's increasingly common to use products like S3 to host static files, but\nsometimes those static files aren't exactly meant for public eyes. You might\npush some bit of personal information into S3 and then anyone with the URL will\nbe able to see it.\n\nSure, the URL may be really hard to guess, but I'm not a fan of \"security\nthrough obscurity\" so I wrote this to encrypt stuff I push to S3. Now, only\nencrypted blobs are available publicly, but internally, behind a\n``MyPermissionRequiredMixin``, the images and documents are loaded magically\nand transparently.\n\n\nHow's It Work?\n--------------\n\n``EncryptedFileField`` is a thin wrapper around Django's native ``FileField``\nthat transparently encrypts whatever the user has uploaded and passes off the\nnow encrypted data to whatever storage engine you've specified. It also\noverrides the ``.url`` value to return a reference to your own view, which does\nthe decryption for you on the way back to the user.\n\nSo where you may have once had this:\n\n.. code:: python\n\n # my_app/models.py\n\n class MyModel(models.Model):\n\n name = models.CharField(max_length=128)\n attachment = models.FileField(upload_to=\"attachments\")\n image = models.ImageField(\n upload_to=\"images\",\n width_field=\"image_width\",\n height_field=\"image_height\"\n )\n image_width = models.PositiveIntegerField()\n image_height = models.PositiveIntegerField()\n\nAll you have to do is change the file fields and you've got encrypted files\n\n.. code:: python\n\n # my_app/models.py\n\n from django_encrypted_filefield.fields import (\n EncryptedFileField,\n EncryptedImageField\n )\n\n class MyModel(models.Model):\n\n name = models.CharField(max_length=128)\n attachment = EncryptedFileField(upload_to=\"attachments\")\n image = EncryptedImageField(\n upload_to=\"images\",\n width_field=\"image_width\",\n height_field=\"image_height\"\n )\n image_width = models.PositiveIntegerField()\n image_height = models.PositiveIntegerField()\n\n\n # my_app/views.py\n\n from django.contrib.auth.mixins import AuthMixin\n from django_encrypted_filefield.views import FetchView\n\n\n class MyPermissionRequiredMixin(AuthMixin)\n \"\"\"\n Your own rules live here\n \"\"\"\n pass\n\n\n class MyFetchView(MyPermissionRequiredMixin, FetchView):\n pass\n\n\n.. code:: python\n\n # my_app/urls.py\n\n from django_encrypted_filefield.constants import FETCH_URL_NAME\n from myapp.views import MyFetchView\n\n urlpatterns = [\n # ...\n url(\n r\"^my-fetch-url/(?P.+)\", # up to you, but path is required\n MyFetchView.as_view(), # your view, your permissions\n name=FETCH_URL_NAME\n ),\n # ...\n ]\n\n\nHow Do I Configure It?\n----------------------\n\nConfiguration of the package requires setting three values in either the\nenvironment (recommended) or in your ``settings.py``. These values are:\n\n* ``DEFF_SALT``: The salt value use for generating the synchronous encryption\n* ``DEFF_PASSWORD``: The password value for the same thing\n* ``DEFF_FETCH_URL_NAME``: The named URL you intend to use to download the\n files as they're decrypted on-the-fly.\n\nOutside of that, follow the above and you should be good to go.\n\n\nHow Do I Run the Tests?\n-----------------------\n\nAs this project depends on the setting of three environment variables, you have\nto set these for the tests. Also, the tests are expecting these values, so\ndon't change them:\n\n.. code:: bash\n\n $ DEFF_SALT=\"salt\" DEFF_PASSWORD=\"password\" DEFF_FETCH_URL_NAME=\"fetch\" ./manage.py test\n\n\nIs There a Demo?\n----------------\n\nThere is! Just check out the code and run the mini django app in the ``demo``\ndirectory:\n\n.. code:: bash\n\n $ git clone git@github.com:danielquinn/django-encrypted-filefield.git\n $ cd django-encrypted-filefield/demo\n $ export DEFF_SALT=\"salt\"\n $ export DEFF_PASSWORD=\"password\"\n $ export DEFF_FETCH_URL_NAME=\"fetch\"\n $ ./manage migrate\n $ ./manage.py runserver\n\n...then open http://localhost:8000 and submit two files via the form. In this\ncase we're using Django's default_storage, but the same logic should apply to\nall storage engines.\n\n\nStuff That Doesn't Work\n-----------------------\n\nSince the file changes just before it's saved, you can't apply a validator\nthat acts on the contents of the file. For example, if you've got a validator\nthat uses mime-magic to determine the file type, it will always return\n``text/plain`` which, unless that's what you're checking for, will break your\nvalidation. To make things more interesting, Django appears to apply\nvalidation on field values *on every save*, not just when the field has\nchanged, so even if the validator were to work on the first run, whenever you\nwould update the object in the admin, your validator will barf in this case.\n\n\nWhat's the Status of the Project?\n---------------------------------\n\nStable. I'm actively using it in a production environment now and have been\nfor some time without issue. This isn't a guarantee that it'll work for\neveryone in every case of course, but it's enough for me to use that word :-)\n\nNote however that currently, this module hasn't been adapted to work in Django\n2.0+, so if you're using that, feel free to issue a pull-request that allows it\nto work in both 1.11 and 2.0+ :-)\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/danielquinn/django-encrypted-filefield", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/danielquinn/django-encrypted-filefield", "keywords": "", "license": "GPLv3", "maintainer": "Daniel Quinn", "maintainer_email": "code@danielquinn.org", "name": "django-encrypted-filefield", "package_url": "https://pypi.org/project/django-encrypted-filefield/", "platform": "", "project_url": "https://pypi.org/project/django-encrypted-filefield/", "project_urls": { "Download": "https://github.com/danielquinn/django-encrypted-filefield", "Homepage": "https://github.com/danielquinn/django-encrypted-filefield" }, "release_url": "https://pypi.org/project/django-encrypted-filefield/0.2.1/", "requires_dist": [ "Django (>=1.11)", "cryptography (>=1.7.1)", "requests (>=2.12.4)", "python-magic (<0.5.0,>=0.4.12)" ], "requires_python": "", "summary": "Encrypt uploaded files, store them wherever you like and stream them back unencrypted", "version": "0.2.1" }, "last_serial": 4226695, "releases": { "0.0.4": [ { "comment_text": "", "digests": { "md5": "5f572a48956d1dd1bcc45d759f3cd480", "sha256": "5f938d985c6e925a4809935fee6095007b44b04cad8193fc75aabe169e172977" }, "downloads": -1, "filename": "django-encrypted-filefield-0.0.4.tar.gz", "has_sig": false, "md5_digest": "5f572a48956d1dd1bcc45d759f3cd480", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17656, "upload_time": "2017-01-13T17:28:56", "url": "https://files.pythonhosted.org/packages/60/65/27ade623981e9c354cc8e688b442da581539e05a5fa167f4fe48f33958b0/django-encrypted-filefield-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "a45a8747e5f3276e8a5dd307a13e8b95", "sha256": "c428b5b92625a57eaba6e4d47ba4476aaaf7a2c586aaebab11f856ae52d7ab92" }, "downloads": -1, "filename": "django-encrypted-filefield-0.0.5.tar.gz", "has_sig": false, "md5_digest": "a45a8747e5f3276e8a5dd307a13e8b95", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18201, "upload_time": "2017-01-17T12:41:51", "url": "https://files.pythonhosted.org/packages/33/69/8536b7bd72da677b40b69305c92416bf6ac2a7b5bbbb0337504167515a96/django-encrypted-filefield-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "1d0c04019a7603f0acb50e2c8f0509e6", "sha256": "b7f49e1f756dfbae66b9d05721790b853cb83b3466d1905cdf03eb43af1bb91b" }, "downloads": -1, "filename": "django-encrypted-filefield-0.0.6.tar.gz", "has_sig": false, "md5_digest": "1d0c04019a7603f0acb50e2c8f0509e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18200, "upload_time": "2017-01-27T16:56:49", "url": "https://files.pythonhosted.org/packages/ac/8b/2972fe843ad1b6f5bc7757e5334e52fda577137636ece5539d4be5fc4dce/django-encrypted-filefield-0.0.6.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "d0789c9639ecbeba6470854fb85d28e7", "sha256": "68de4a3fa1b0319a3e45381fcaec4b7b138de5579657b3289f3ca484d19d9d93" }, "downloads": -1, "filename": "django_encrypted_filefield-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d0789c9639ecbeba6470854fb85d28e7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11567, "upload_time": "2017-04-08T19:03:55", "url": "https://files.pythonhosted.org/packages/b5/f3/52b8b27d5f9ed4bcf8914f14f0c32e907c9c796342300684a581ce12aacb/django_encrypted_filefield-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "72e568370195c3d6cc9b7c8983f2d717", "sha256": "721703bbcbeb8033e4cff745d2729d50e43a0d77be78c2c0dee701f1d102880e" }, "downloads": -1, "filename": "django-encrypted-filefield-0.1.0.tar.gz", "has_sig": false, "md5_digest": "72e568370195c3d6cc9b7c8983f2d717", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18902, "upload_time": "2017-04-08T19:03:56", "url": "https://files.pythonhosted.org/packages/c1/e9/6e98d9225e2cce478b5e434f43c691cb465d535ce885e10ea246b5f23495/django-encrypted-filefield-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "f72102104e2a9712040f43fd01b9d121", "sha256": "ccd18ae683c2c245ba537939910bd1293ef696b03c06b49815002c9f30513dc7" }, "downloads": -1, "filename": "django-encrypted-filefield-0.1.1.tar.gz", "has_sig": false, "md5_digest": "f72102104e2a9712040f43fd01b9d121", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18895, "upload_time": "2017-04-12T15:23:36", "url": "https://files.pythonhosted.org/packages/71/d3/878a230a9e14a1c55be5f488937f9d03691ba1d856046c4629ab92254e29/django-encrypted-filefield-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "595835b3e2abf906ba524876056e74ec", "sha256": "3cd5e0aae52d9c000bf8e4e9cf39b04c9dd3c077ef52135c5a0ae69e077fea7c" }, "downloads": -1, "filename": "django_encrypted_filefield-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "595835b3e2abf906ba524876056e74ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11600, "upload_time": "2018-01-05T12:55:24", "url": "https://files.pythonhosted.org/packages/84/5e/dbd43592976d1774c1ed37194334be19bfa2f46e67a112c90189b956984b/django_encrypted_filefield-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "129829834d62df9e5e406b694ba5b9db", "sha256": "cd4ae71780c200515e64152bc720bd89d0ba1327a7cf5bed2f9db1d18cfce042" }, "downloads": -1, "filename": "django-encrypted-filefield-0.1.2.tar.gz", "has_sig": false, "md5_digest": "129829834d62df9e5e406b694ba5b9db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21097, "upload_time": "2018-01-05T12:55:25", "url": "https://files.pythonhosted.org/packages/b2/a6/df93a3f16a4932881d82a498af0ff5e640b1e22d2c2a61c00af774d224a6/django-encrypted-filefield-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "3ca9e29145f42443a549a1cb26fa24e8", "sha256": "4aa1e80befab4e41e46f1a19993d635e3e9e25c519901a908151c621ee43ab4a" }, "downloads": -1, "filename": "django_encrypted_filefield-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "3ca9e29145f42443a549a1cb26fa24e8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11593, "upload_time": "2018-01-12T12:49:52", "url": "https://files.pythonhosted.org/packages/5e/e7/0077eaba2bcdfa5cc57e60c9f11405bedbbc55f92d9f19bcc33fc98ed66a/django_encrypted_filefield-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "21f69e1b50a3562cf147510496557d20", "sha256": "cdd8451ae674fc825b77e228db5e9f4704cc83297d3d72bda4eb52cf8ce06258" }, "downloads": -1, "filename": "django-encrypted-filefield-0.1.3.tar.gz", "has_sig": false, "md5_digest": "21f69e1b50a3562cf147510496557d20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18927, "upload_time": "2018-01-12T12:49:54", "url": "https://files.pythonhosted.org/packages/81/09/b8e07e8485a4becdf2f2f3362ac8d8a5232d0b555001e1215b2b1e151a11/django-encrypted-filefield-0.1.3.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b1471e97f33a3e2b1e456d5c4fc2afd1", "sha256": "7a20c8d9f948e608337567ceae167f28085e1a21d2a54a1cafff570c07d9455d" }, "downloads": -1, "filename": "django_encrypted_filefield-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b1471e97f33a3e2b1e456d5c4fc2afd1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11837, "upload_time": "2018-02-20T10:59:06", "url": "https://files.pythonhosted.org/packages/ee/cc/b084c9b7e221ee579428904412780234c915039c51ffcd400c5276296f73/django_encrypted_filefield-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7abb1850c0ef2ae71160acf78317ecba", "sha256": "a975ba8651d293884f1cf19590ad18c73d925ee63fb8a097f0a013589d4464e9" }, "downloads": -1, "filename": "django-encrypted-filefield-0.2.0.tar.gz", "has_sig": false, "md5_digest": "7abb1850c0ef2ae71160acf78317ecba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19074, "upload_time": "2018-02-20T10:59:07", "url": "https://files.pythonhosted.org/packages/c1/a2/45a9d872f58bf0b636529195c23d5425218841ad532657f61ee043623330/django-encrypted-filefield-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "02fbd8aa0b1ad6de7db9bf9c31ff91b8", "sha256": "05a88139266cc0e851c74f543e45bfcc0c7c592de82bb8b0aaad7984b9f25ce7" }, "downloads": -1, "filename": "django_encrypted_filefield-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "02fbd8aa0b1ad6de7db9bf9c31ff91b8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8560, "upload_time": "2018-08-31T15:13:35", "url": "https://files.pythonhosted.org/packages/25/ff/9ab3c3dec82ae189d3bf8845ff85f64d7cf57a6e8d2714ed4275350e80ef/django_encrypted_filefield-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9cc251a62e43faa964b0b03bad2e8f23", "sha256": "948c4bd12befcdb26a72bc14881631b5291ca6401f09edff5707a930c7bef7c6" }, "downloads": -1, "filename": "django-encrypted-filefield-0.2.1.tar.gz", "has_sig": false, "md5_digest": "9cc251a62e43faa964b0b03bad2e8f23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18966, "upload_time": "2018-08-31T15:13:36", "url": "https://files.pythonhosted.org/packages/de/24/13e2e1d11c9e0d6b161be6d67da535dd313b951082645421125b6effb16d/django-encrypted-filefield-0.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "02fbd8aa0b1ad6de7db9bf9c31ff91b8", "sha256": "05a88139266cc0e851c74f543e45bfcc0c7c592de82bb8b0aaad7984b9f25ce7" }, "downloads": -1, "filename": "django_encrypted_filefield-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "02fbd8aa0b1ad6de7db9bf9c31ff91b8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8560, "upload_time": "2018-08-31T15:13:35", "url": "https://files.pythonhosted.org/packages/25/ff/9ab3c3dec82ae189d3bf8845ff85f64d7cf57a6e8d2714ed4275350e80ef/django_encrypted_filefield-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9cc251a62e43faa964b0b03bad2e8f23", "sha256": "948c4bd12befcdb26a72bc14881631b5291ca6401f09edff5707a930c7bef7c6" }, "downloads": -1, "filename": "django-encrypted-filefield-0.2.1.tar.gz", "has_sig": false, "md5_digest": "9cc251a62e43faa964b0b03bad2e8f23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18966, "upload_time": "2018-08-31T15:13:36", "url": "https://files.pythonhosted.org/packages/de/24/13e2e1d11c9e0d6b161be6d67da535dd313b951082645421125b6effb16d/django-encrypted-filefield-0.2.1.tar.gz" } ] }