diff --git a/buildbot_transifex/webhook.py b/buildbot_transifex/webhook.py index b383cb1..175a85d 100644 --- a/buildbot_transifex/webhook.py +++ b/buildbot_transifex/webhook.py @@ -1,53 +1,56 @@ """Transifex webhook handler """ -import os import base64 - -import time -import json -import hmac import hashlib +import hmac +import json +import os +import requests +import time + +import logging + from subprocess import call from base64 import b64encode -import requests from buildbot.process.properties import Properties from buildbot.util import bytes2unicode, unicode2bytes from buildbot.www.hooks.base import BaseHookHandler +from dateutil.parser import parse as dateparse + from twisted.internet import defer from twisted.python import log -from dateutil.parser import parse as dateparse _HEADER_USER_AGENT = 'User-Agent' _HEADER_SIGNATURE = 'X-TX-Signature' _HEADER_URL_PATH = 'X-TX-Url' -HTTP_DATE = 'date' +_HTTP_DATE = 'date' _EVENT_KEY = 'event' -transifex_request_data = {} + class TransifexHandler(BaseHookHandler): - def __init__(self, master, secret, options, transifex_dict): + def __init__(self, master, secret, options, transifex_to_github_map): if not options: options = {} self.secret = secret self.master = master self.options = options - self.transifex_dict = transifex_dict + self.transifex_to_github_map = transifex_to_github_map def returnMessage(self, status = False, message = "Unimplemented"): output = json.dumps({"status": "OK" if status else "FAIL", "message": message}) return [output, [('Content-type', 'application/json')]] - def verifyTransifexSignature( + def _verifyTransifexSignature( self, request, content, signature, header_signature ): http_verb = 'POST' http_url_path = request.getHeader(_HEADER_URL_PATH) - http_gmt_date = request.getHeader(HTTP_DATE) + http_gmt_date = request.getHeader(_HTTP_DATE) content_md5 = hashlib.md5(content).hexdigest() msg = b'\n'.join([ http_verb, http_url_path, http_gmt_date, content_md5 @@ -64,35 +67,27 @@ class TransifexHandler(BaseHookHandler): if signature != request.getHeader(_HEADER_SIGNATURE): return False + return True - def process_translation_completed(self, payload, transifex_dict, event_type, codebase): + def process_translation_completed(self, payload, transifex_to_github_map, event_type, codebase): changes = [] - transifex_response = self._transform_variables(payload, transifex_dict) - if 'pybitmessage-test' in transifex_response['project'] and 'messagespot' in transifex_response['resource']: - if 'translation_completed' in transifex_response['event']: - ts = int(time.time()) - lang = transifex_response['language'] - return + transifex_response = self._transform_variables(payload, transifex_to_github_map) + # if 'pybitmessage-test' in transifex_response['project'] and 'messagespot' in transifex_response['resource']: + # if 'translation_completed' in transifex_response['event']: + language = transifex_response.get['language'] - # if isinstance(self.options, dict): - # commits = commits[:1] - - # # for commit in commits: - # # files = [] - # # for kind in ('added', 'modified', 'removed'): - # # files.extend(commit.get(kind, []) or []) change = { - 'author': 'buildbot-transifex, - 'resource': transifex_response['resource'], - 'branch': transifex_dict['branch'], - 'project': transifex_response['project'], + 'author': "buildbot-transifex", + 'resource': transifex_to_github_map["resource"], + 'branch': transifex_to_github_map["branch"], + 'project': transifex_to_github_map["project"], 'event': event_type, + 'revision': revision, 'properties': { - 'branch': branch, - 'revision': revision, - 'language': lang, - 'resource': resource, - 'project': project + "transifex_language": payload.get("language", "None"), + "transifex_event": payload.get("event", "None"), + "transifex_project": payload.get("project", "None"), + "transifex_resource": payload.get("resource", "None") } } if codebase is not None: @@ -100,18 +95,18 @@ class TransifexHandler(BaseHookHandler): changes.insert(0, change) return changes - def _transform_variables(self, payload, transifex_dict): + def _transform_variables(self, payload, transifex_to_github_map): project = payload.get('project', 'None') transform_values = { - project: { - "repository": "https://github.com/Bitmessage/PyBitmessage", - "branch": "v0.6" - } + 'resource': transifex_to_github_map["resource"], + 'branch': transifex_to_github_map["branch"], + 'project': transifex_to_github_map["project"], } return transform_values @defer.inlineCallbacks def getChanges(self, request): + change = {} self.secret = None if isinstance(self.options, dict): self.secret = self.options.get('secret') @@ -133,29 +128,23 @@ class TransifexHandler(BaseHookHandler): digestmod=hashlib.sha256) header_signature = bytes2unicode( request.getHeader(_HEADER_SIGNATURE)) - self.verifyTransifexSignature( - request, content, self.rendered_secret, - signature, header_signature - ) + if not self._verifyTransifexSignature(request, content, self.rendered_secret, signature, header_signature): + logging.warning("Verify Transifex Signature fail.") + else: + logging.warning("Verify Transifex Signature ok") event_type = payload.get("event", "None") - language = payload.get("language", 'None') - project = payload.get("project", 'None') - resource = payload.get("resource", 'None') - transifex_request_data['branch'] = "v0.6" - transifex_request_data['revision'] = "" - transifex_request_data["properties"] = "langugage" - transifex_request_data["properties"] = "resource" - transifex_request_data["properties"] = "project" - - transifex_request_data["properties"] = { - "branch": branch, - "revision": revision + change["properties"] = { + "transifex_language": payload.get("language", "None"), + "transifex_event": payload.get("event", "None"), + "transifex_project": payload.get("project", "None"), + "transifex_resource": payload.get("resource", "None") } - transifex_request_data["changes"] = { + + change["changes"] = { "author": "buildbot-transifex", - "repository": project, + "repository": transifex_to_github_map['repository'], } log.msg("Received event '{}' from transifex".format(event_type)) @@ -172,4 +161,4 @@ class TransifexHandler(BaseHookHandler): return (changes, 'transifex') -transifex = TransifexHandler(transifex_dict) +transifex = TransifexHandler(transifex_to_github_map)