Adding access_key support for request authentication.
2 files changed, 15 insertions(+), 2 deletions(-)

M trello_broker/models.py
M trello_broker/views.py
M trello_broker/models.py +10 -0
@@ 145,6 145,15 @@ class BitBucketRepo(BaseModel):
         max_length=100,
         help_text=_('Slug ID given by BitBucket for this repository.'),
     )
+    access_key = models.CharField(
+        max_length=100,
+        blank=True,
+        help_text=_(
+            'Secret key used to "authenticate" the request. If saved '
+            'here the key must be appended to the BitBucket hook URL like '
+            'so: http://yourserver.com/broker/?access_key=<value stored here>'
+        ),
+    )
     trello_board = models.ForeignKey(
         'trello_broker.TrelloBoard',
         limit_choices_to={'status': STATUS_ACTIVE},

          
@@ 154,6 163,7 @@ class BitBucketRepo(BaseModel):
     class Meta:
         verbose_name = 'BitBucket Repository'
         verbose_name_plural = 'BitBucket Repositories'
+        unique_together = ('slug', 'access_key')
 
     @property
     def fix_rule(self):

          
M trello_broker/views.py +5 -2
@@ 4,7 4,7 @@ from django.shortcuts import get_object_
 from django.views.decorators.csrf import csrf_exempt
 from django.utils.decorators import method_decorator
 from django.http import HttpResponse, HttpResponseBadRequest, Http404
-from .models import BitBucketRepo
+from .models import Q, BitBucketRepo
 from .utils import process_commits
 from . import settings
 

          
@@ 35,7 35,10 @@ class BitBucketPostView(View):
         except (ValueError, KeyError):
             return HttpResponseBadRequest()
 
-        repo = get_object_or_404(BitBucketRepo, slug=repo_slug)
+        query = Q(slug=repo_slug)
+        if 'access_key' in request.REQUEST:
+            query += Q(access_key=request.REQUEST['access_key'])
+        repo = get_object_or_404(BitBucketRepo, query)
         trello_distribute(repo, json_data)
         return HttpResponse('OK')