serializer.py 885 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import base64
  2. from hashlib import sha256
  3. from django.conf import settings
  4. try:
  5. import cPickle as pickle
  6. except ImportError:
  7. import pickle
  8. def _checksum(base):
  9. return sha256(('%s+%s' % (settings.SECRET_KEY, base)).encode()).hexdigest()[:14]
  10. def loads(dry):
  11. checksum = dry[:14]
  12. base = dry[14:]
  13. if _checksum(base) == checksum:
  14. return pickle.loads(base64.decodestring(base.encode()))
  15. else:
  16. raise ValueError("pickle checksum is invalid")
  17. def dumps(wet):
  18. from misago.core.deprecations import warn
  19. warn('misago.core.serializer is being replaced with json')
  20. base = base64.encodestring(pickle.dumps(wet, pickle.HIGHEST_PROTOCOL)).decode()
  21. checksum = _checksum(base)
  22. return '%s%s' % (checksum, base)
  23. def regenerate_checksum(dry):
  24. base = dry[14:]
  25. checksum = _checksum(base)
  26. return '%s%s' % (checksum, base)