From 4e81e5d5e83141ca386a27b20d2e61297a098cd2 Mon Sep 17 00:00:00 2001 From: Jens Alm Date: Thu, 30 May 2013 11:21:05 +0200 Subject: [PATCH] Added byte/str compatibility for python 3 --- djrill/compat.py | 10 ++++++++++ djrill/tests/test_mandrill_webhook.py | 3 ++- djrill/views.py | 6 ++---- 3 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 djrill/compat.py diff --git a/djrill/compat.py b/djrill/compat.py new file mode 100644 index 0000000..e389065 --- /dev/null +++ b/djrill/compat.py @@ -0,0 +1,10 @@ +# For python 3 compatibility, see http://python3porting.com/problems.html#nicer-solutions +import sys + +if sys.version < '3': + def b(x): + return x +else: + import codecs + def b(x): + return codecs.latin_1_encode(x)[0] \ No newline at end of file diff --git a/djrill/tests/test_mandrill_webhook.py b/djrill/tests/test_mandrill_webhook.py index 39fafee..1b3943c 100644 --- a/djrill/tests/test_mandrill_webhook.py +++ b/djrill/tests/test_mandrill_webhook.py @@ -7,6 +7,7 @@ from django.test import TestCase from django.core.exceptions import ImproperlyConfigured from django.conf import settings +from ..compat import b from ..signals import webhook_event @@ -64,7 +65,7 @@ class DjrillWebhookSignatureMixinTests(TestCase): self.assertEqual(response.status_code, 403) def test_signature(self): - signature = hmac.new(key=settings.DJRILL_WEBHOOK_SIGNATURE_KEY, msg = settings.DJRILL_WEBHOOK_URL+"mandrill_events[]", digestmod=hashlib.sha1) + signature = hmac.new(key=b(settings.DJRILL_WEBHOOK_SIGNATURE_KEY), msg = b(settings.DJRILL_WEBHOOK_URL+"mandrill_events[]"), digestmod=hashlib.sha1) hash_string = b64encode(signature.digest()) response = self.client.post('/webhook/?secret=abc123', data={"mandrill_events":"[]"}, **{"X-Mandrill-Signature" : hash_string}) self.assertEqual(response.status_code, 200) diff --git a/djrill/views.py b/djrill/views.py index 63cf390..04f132d 100644 --- a/djrill/views.py +++ b/djrill/views.py @@ -2,12 +2,10 @@ from base64 import b64encode import hashlib import hmac import json - from django import forms from django.conf import settings from django.contrib import messages from django.core.exceptions import ImproperlyConfigured -from django.core.urlresolvers import reverse from django.views.generic import TemplateView, View from django.http import HttpResponse from django.utils.decorators import method_decorator @@ -16,7 +14,7 @@ from django.views.decorators.csrf import csrf_exempt import requests from djrill import MANDRILL_API_URL, signals - +from .compat import b class DjrillAdminMedia(object): def _media(self): @@ -131,7 +129,7 @@ class DjrillWebhookSignatureMixin(object): for item in value_list[1]: post_string += "%s%s" % (value_list[0],item) - hash_string = b64encode(hmac.new(key=signature_key, msg=post_string, digestmod=hashlib.sha1).digest()) + hash_string = b64encode(hmac.new(key=b(signature_key), msg=b(post_string), digestmod=hashlib.sha1).digest()) if signature != hash_string: return HttpResponse(status=403, content="Signature doesn't match")