@@ -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)
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()
def validate(self, data):
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