georgemarshall / django-cryptography

Easily encrypt data in Django
https://django-cryptography.readthedocs.io/
BSD 3-Clause "New" or "Revised" License
371 stars 70 forks source link

Problem encrypting an IntegerField when using PostresSQL #16

Open thismatters opened 5 years ago

thismatters commented 5 years ago

Python 3.6.6 Django 2.0.6 django-cryptography 0.3

I can create encrypted IntegerFields just fine when using sqlite as my db backend, but when I switch to using PSQL I get the following when I runserver:

Performing system checks...

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7fae83dcabf8>
Traceback (most recent call last):
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/utils/autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 120, in inner_run
    self.check(display_num_errors=True)
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/core/management/base.py", line 364, in check
    include_deployment_checks=include_deployment_checks,
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/core/management/base.py", line 351, in _run_checks
    return checks.run_checks(**kwargs)
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/core/checks/registry.py", line 73, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/core/checks/model_checks.py", line 27, in check_all_models
    errors.extend(model.check(**kwargs))
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/db/models/base.py", line 1200, in check
    errors.extend(cls._check_fields(**kwargs))
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/db/models/base.py", line 1272, in _check_fields
    errors.extend(field.check(**kwargs))
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django_cryptography/fields.py", line 126, in check
    errors = super(EncryptedMixin, self).check(**kwargs)
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1785, in check
    errors = super().check(**kwargs)
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 207, in check
    errors.extend(self._check_validators())
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 308, in _check_validators
    for i, validator in enumerate(self.validators):
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/utils/functional.py", line 36, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1807, in validators
    min_value, max_value = connection.ops.integer_field_range(internal_type)
  File "/home/pstiverson/.virtualenvs/Money-Positive/lib/python3.6/site-packages/django/db/backends/base/operations.py", line 600, in integer_field_range
    return self.integer_field_ranges[internal_type]
KeyError: 'BinaryField'

I get a similar error when I try database migrations:

Traceback (most recent call last):
  File "./manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 332, in execute
    self.check()
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 364, in check
    include_deployment_checks=include_deployment_checks,
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 58, in _run_checks
    issues.extend(super()._run_checks(**kwargs))
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/base.py", line 351, in _run_checks
    return checks.run_checks(**kwargs)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/checks/registry.py", line 73, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/checks/model_checks.py", line 27, in check_all_models
    errors.extend(model.check(**kwargs))
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py", line 1200, in check
    errors.extend(cls._check_fields(**kwargs))
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py", line 1272, in _check_fields
    errors.extend(field.check(**kwargs))
  File "/app/.heroku/python/lib/python3.6/site-packages/django_cryptography/fields.py", line 126, in check
    errors = super(EncryptedMixin, self).check(**kwargs)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1785, in check
    errors = super().check(**kwargs)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 207, in check
    errors.extend(self._check_validators())
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 308, in _check_validators
    for i, validator in enumerate(self.validators):
  File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/functional.py", line 36, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 1807, in validators
    min_value, max_value = connection.ops.integer_field_range(internal_type)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/operations.py", line 600, in integer_field_range
    return self.integer_field_ranges[internal_type]
KeyError: 'BinaryField'

This seems like a shortcoming of the postgres db backend, but I thought I would report it here in case there is anything that can be done about it.

Edit: using a DecimalField with decimal_place=0 is a pretty suitable workaround.

thismatters commented 4 years ago

I'll be damned if it didn't get me again! Found my own question!

JDavid17 commented 4 years ago

@thismatters found some solution to this?

thismatters commented 4 years ago

The solution I found was to not use the IntegerField, I used the DecimalField instead and set decimal_place=0 to make it behave like an integer.