import hashlib class ParameterValidator: def __init__(self, given_hash_or_params, params_hash_key=None): from django.conf import settings 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 = settings.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