def test_encryption(self): """ Test the encryption. """ original = self.juice obfuscated = encrypt(original, settings.UNFRIENDLY_SECRET, settings.UNFRIENDLY_IV) self.assertNotEqual(original, obfuscated) deobfuscated = decrypt(obfuscated, settings.UNFRIENDLY_SECRET, settings.UNFRIENDLY_IV) self.assertEqual(original, deobfuscated)
def test_encryption_oddkey(self): """ Test the encryption with an odd length secret key. """ original = self.juice obfuscated = encrypt(original, settings.UNFRIENDLY_SECRET[0:11], settings.UNFRIENDLY_IV) self.assertNotEqual(original, obfuscated) deobfuscated = decrypt(obfuscated, settings.UNFRIENDLY_SECRET[0:11], settings.UNFRIENDLY_IV) self.assertEqual(original, deobfuscated)
def test_encryption(self): """ Test the encryption. """ original = self.juice obfuscated = encrypt(original, settings.UNFRIENDLY_SECRET) self.assertNotEqual(original, obfuscated) deobfuscated = decrypt(obfuscated, settings.UNFRIENDLY_SECRET) self.assertEqual(original, deobfuscated)
def deobfuscate(request, key, juice=None): """ Deobfuscates the URL and returns HttpResponse from source view. SEO juice is mostly ignored as it is intended for display purposes only. """ try: url = decrypt(str(key), settings.UNFRIENDLY_SECRET, settings.UNFRIENDLY_IV, checksum=settings.UNFRIENDLY_ENFORCE_CHECKSUM) except (CheckSumError, InvalidKeyError): return HttpResponseNotFound() try: url = url.decode('utf-8') except UnicodeDecodeError: return HttpResponseNotFound() url_parts = urlparse(unquote(url)) path = url_parts.path query = url_parts.query try: view, args, kwargs = resolve(path) except Resolver404: return HttpResponseNotFound() # fix-up the environ object environ = request.environ.copy() environ['PATH_INFO'] = path[len(environ['SCRIPT_NAME']):] environ['QUERY_STRING'] = query # init a new request patched_request = request.__class__(environ) # copy over any missing request attributes - this feels hackish missing_items = set(dir(request)) - set(dir(patched_request)) while missing_items: missing_item = missing_items.pop() patched_request.__setattr__(missing_item, request.__getattribute__(missing_item)) # mark this request as obfuscated patched_request.META['obfuscated'] = True response = view(patched_request, *args, **kwargs) # offer up a friendlier juice-powered filename if downloaded if juice and not response.has_header('Content-Disposition'): response['Content-Disposition'] = 'inline; filename=%s' % juice return response
def deobfuscate(request, key, juice=None): """ Deobfuscates the URL and returns HttpResponse from source view. SEO juice is mostly ignored as it is intended for display purposes only. """ try: url = decrypt(str(key), settings.UNFRIENDLY_SECRET, checksum=settings.UNFRIENDLY_ENFORCE_CHECKSUM) except CheckSumError: return HttpResponseNotFound() url_parts = urlparse(unquote(url)) path = url_parts.path query = url_parts.query try: view, args, kwargs = resolve(path) except Resolver404: return HttpResponseNotFound() # fix-up the environ object environ = request.environ.copy() environ['PATH_INFO'] = path[len(environ['SCRIPT_NAME']):] environ['QUERY_STRING'] = query # init a new request session = request.session patched_request = request.__class__(environ) patched_request.session = session # mark this request as obfuscated patched_request.META['obfuscated'] = True response = view(patched_request, *args, **kwargs) # offer up a friendlier juice-powered filename if downloaded if juice and not response.has_header('Content-Disposition'): response['Content-Disposition'] = 'inline; filename=%s' % juice return response