mirror of
https://github.com/ansible/awx.git
synced 2026-05-22 16:27:42 -02:30
Get the webhook receiver views to work at least minimally
This commit is contained in:
@@ -1,11 +1,13 @@
|
|||||||
from hashlib import sha1
|
from hashlib import sha1
|
||||||
import hmac
|
import hmac
|
||||||
|
import logging
|
||||||
|
|
||||||
from django.utils.encoding import force_bytes
|
from django.utils.encoding import force_bytes
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.exceptions import PermissionDenied
|
from rest_framework.exceptions import PermissionDenied
|
||||||
|
from rest_framework.permissions import AllowAny
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
from awx.api import serializers
|
from awx.api import serializers
|
||||||
@@ -14,6 +16,9 @@ from awx.api.permissions import WebhookKeyPermission
|
|||||||
from awx.main.models import JobTemplate, WorkflowJobTemplate
|
from awx.main.models import JobTemplate, WorkflowJobTemplate
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger('awx.api.views.webhooks')
|
||||||
|
|
||||||
|
|
||||||
class WebhookKeyView(GenericAPIView):
|
class WebhookKeyView(GenericAPIView):
|
||||||
serializer_class = serializers.EmptySerializer
|
serializer_class = serializers.EmptySerializer
|
||||||
permission_classes = (WebhookKeyPermission,)
|
permission_classes = (WebhookKeyPermission,)
|
||||||
@@ -44,9 +49,7 @@ class WebhookReceiverBase(APIView):
|
|||||||
lookup_url_kwarg = None
|
lookup_url_kwarg = None
|
||||||
lookup_field = 'pk'
|
lookup_field = 'pk'
|
||||||
|
|
||||||
@csrf_exempt
|
permission_classes = (AllowAny,)
|
||||||
def dispatch(self, *args, **kwargs):
|
|
||||||
return super().dispatch(*args, **kwargs)
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs_models = {
|
qs_models = {
|
||||||
@@ -83,14 +86,22 @@ class WebhookReceiverBase(APIView):
|
|||||||
if not obj.webhook_key:
|
if not obj.webhook_key:
|
||||||
raise PermissionDenied
|
raise PermissionDenied
|
||||||
|
|
||||||
mac = hmac.new(force_bytes(obj.webhook_key), msg=force_bytes(self.request.body), digestmod=sha1)
|
mac = hmac.new(force_bytes(obj.webhook_key), msg=force_bytes(self.request.read()), digestmod=sha1)
|
||||||
if not hmac.compare_digest(force_bytes(mac.hexdigest()), self.get_signature()):
|
if not hmac.compare_digest(force_bytes(mac.hexdigest()), self.get_signature()):
|
||||||
raise PermissionDenied
|
raise PermissionDenied
|
||||||
|
|
||||||
|
@csrf_exempt
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
|
logger.error(
|
||||||
|
"**************************************\n"
|
||||||
|
"{}\n"
|
||||||
|
"{}\n".format(request.headers, request.data)
|
||||||
|
)
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
self.check_signature(obj)
|
self.check_signature(obj)
|
||||||
|
|
||||||
|
return Response(status=status.HTTP_202_ACCEPTED)
|
||||||
|
|
||||||
|
|
||||||
class GithubWebhookReceiver(WebhookReceiverBase):
|
class GithubWebhookReceiver(WebhookReceiverBase):
|
||||||
service = 'github'
|
service = 'github'
|
||||||
|
|||||||
Reference in New Issue
Block a user