diff --git a/www/conservancy/__init__.py b/www/conservancy/__init__.py index 28f44d49592182aca58ca1bb766d3dad3087a5ea..a80a32eac390c89fda5d5428739282fc6f3602d6 100644 --- a/www/conservancy/__init__.py +++ b/www/conservancy/__init__.py @@ -4,24 +4,45 @@ from django.conf import settings from django.shortcuts import render_to_response from django.template import RequestContext -HASH_ENCODING = 'utf-8' +class ParameterValidator(object): + 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', '') + self.hasher = hashlib.sha256(seed) + if isinstance(self.given_hash, basestring): + 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 + def render_template_with_context(request, template_path, context_dict): return render_to_response(template_path, context_dict, context_instance=RequestContext(request)) - -def param_if_valid(params, param_name, hash_param_name, default=None): - try: - seed = settings.CONSERVANCY_SECRET_KEY - param_value = params[param_name] - param_bytes = param_value.encode(HASH_ENCODING) - given_hash = params[hash_param_name] - except (AttributeError, KeyError, UnicodeEncodeError): - return default - good_hash = hashlib.sha256() - good_hash.update(seed) - good_hash.update(param_bytes) - if given_hash == unicode(good_hash.hexdigest()): - return param_value - else: - return default