Ben Sturmfels
b7e2ce2a4d
The relative imports make it clearer what code is within the project and where it's coming from.
42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
import hashlib
|
|
|
|
from django.conf import settings
|
|
|
|
|
|
class ParameterValidator:
|
|
def __init__(self, given_hash_or_params, params_hash_key=None):
|
|
if params_hash_key is None:
|
|
self.given_hash = given_hash_or_params
|
|
else:
|
|
self.given_hash = given_hash_or_params.get(params_hash_key)
|
|
seed = getattr(settings, 'CONSERVANCY_SECRET_KEY', '').encode('utf-8')
|
|
self.hasher = hashlib.sha256(seed)
|
|
if isinstance(self.given_hash, str):
|
|
self.hash_type = type(self.given_hash)
|
|
else:
|
|
self.hash_type = type(self.hasher.hexdigest())
|
|
self.valid = None
|
|
if not (self.given_hash and seed):
|
|
self.fail()
|
|
|
|
def __enter__(self):
|
|
self.valid = self.valid and None
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc_value, exc_tb):
|
|
if exc_type is None:
|
|
self.check()
|
|
else:
|
|
self.fail()
|
|
|
|
def validate(self, data):
|
|
self.valid = self.valid and None
|
|
self.hasher.update(data)
|
|
|
|
def check(self):
|
|
if self.valid or (self.valid is None):
|
|
self.valid = self.hash_type(self.hasher.hexdigest()) == self.given_hash
|
|
return self.valid
|
|
|
|
def fail(self):
|
|
self.valid = False
|