Update webhook and setup #1

Open
shekhar-cis wants to merge 5 commits from shekhar-cis/buildbot-transifex:transifex-webhook into master
Showing only changes of commit ab6d1083ec - Show all commits

View File

@ -1,14 +1,12 @@
"""Transifex webhook handler """ """Transifex webhook handler """
import os
import base64 import base64
import time
import json
import hmac
import hashlib import hashlib
from subprocess import call import hmac
from base64 import b64encode import json
import os
import requests import requests
import re
import time
from buildbot.process.properties import Properties from buildbot.process.properties import Properties
from buildbot.util import bytes2unicode, unicode2bytes from buildbot.util import bytes2unicode, unicode2bytes
@ -17,37 +15,36 @@ from buildbot.www.hooks.base import BaseHookHandler
from twisted.internet import defer from twisted.internet import defer
from twisted.python import log from twisted.python import log
from dateutil.parser import parse as dateparse
_HEADER_USER_AGENT = 'User-Agent' _HEADER_USER_AGENT = 'User-Agent'
_HEADER_SIGNATURE = 'X-TX-Signature' _HEADER_SIGNATURE = 'X-TX-Signature'
_HEADER_URL_PATH = 'X-TX-Url' _HEADER_URL_PATH = 'X-TX-Url'
HTTP_DATE = 'date' _HTTP_DATE = 'date'
_EVENT_KEY = 'event' _EVENT_KEY = 'event'
transifex_request_data = {} author = 'buildbot-transifex'
class TransifexHandler(BaseHookHandler): class TransifexHandler(BaseHookHandler):
def __init__(self, master, secret, options, transifex_dict): def __init__(self, master, secret, transifex_to_github_map, options=None):
if not options: if not options:
options = {} options = {}
self.secret = secret self.secret = secret
self.master = master self.master = master
self.options = options self.options = options
self.transifex_dict = transifex_dict self.transifex_to_github_map = transifex_to_github_map
def returnMessage(self, status = False, message = "Unimplemented"): def returnMessage(self, status = False, message = "Unimplemented"):
output = json.dumps({"status": "OK" if status else "FAIL", "message": message}) output = json.dumps({"status": "OK" if status else "FAIL", "message": message})
return [output, [('Content-type', 'application/json')]] return [output, [('Content-type', 'application/json')]]
def verifyTransifexSignature( def _verifyTransifexSignature(
self, request, content, signature, header_signature self, request, content, signature, header_signature
): ):
http_verb = 'POST' http_verb = 'POST'
http_url_path = request.getHeader(_HEADER_URL_PATH) 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() content_md5 = hashlib.md5(content).hexdigest()
msg = b'\n'.join([ msg = b'\n'.join([
http_verb, http_url_path, http_gmt_date, content_md5 http_verb, http_url_path, http_gmt_date, content_md5
@ -60,39 +57,25 @@ class TransifexHandler(BaseHookHandler):
).digest() ).digest()
) )
if tx_signature != header_signature: if tx_signature != header_signature:
return False raise ValueError("Tx Signature mismatch")
if signature != request.getHeader(_HEADER_SIGNATURE): if signature != request.getHeader(_HEADER_SIGNATURE):
return False raise ValueError("Signature mismatch")
return True
def process_translation_completed(self, payload, transifex_dict, event_type, codebase): def process_translation_completed(self, payload, codebase):
changes = [] changes = []
transifex_response = self._transform_variables(payload, transifex_dict) translated_request = self._transform_variables(payload['project'], payload['resource'])
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
# 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 = { change = {
'author': 'buildbot-transifex, 'author': "buildbot-transifex",
'resource': transifex_response['resource'], 'branch': translated_request["branch"],
'branch': transifex_dict['branch'], 'project': translated_request["project"],
'project': transifex_response['project'],
'event': event_type,
'properties': { 'properties': {
'branch': branch, "transifex_language": payload.get("language", "None"),
'revision': revision, "transifex_event": payload.get("event", "None"),
'language': lang, "transifex_project": payload.get("project", "None"),
'resource': resource, "transifex_resource": payload.get("resource", "None"),
'project': project "transifex_branch": "v0.6"
Review

this should be the randomly generated one, the branch of the PR

this should be the randomly generated one, the branch of the PR
} }
} }
if codebase is not None: if codebase is not None:
@ -100,18 +83,22 @@ class TransifexHandler(BaseHookHandler):
changes.insert(0, change) changes.insert(0, change)
return changes return changes
def _transform_variables(self, payload, transifex_dict): def _transform_variables(self, transifex_project, transifex_resource):
project = payload.get('project', 'None') if transifex_project is None:
transform_values = { raise ValueError("Unknown project %s from transifex".format(transifex_project))
project: { key = "{}/{}".format(transifex_project, transifex_resource)
"repository": "https://github.com/Bitmessage/PyBitmessage", _map = self.map[key]
"branch": "v0.6" repository = _map["repository"]
} project = re.sub(r'^.*/(.*?)(\.git)?$', r'\1', repository)
return{
'project': project,
'repository': repository,
'branch': _map["branch"],
} }
return transform_values
@defer.inlineCallbacks @defer.inlineCallbacks
def getChanges(self, request): def getChanges(self, request):
change = {}
self.secret = None self.secret = None
if isinstance(self.options, dict): if isinstance(self.options, dict):
self.secret = self.options.get('secret') self.secret = self.options.get('secret')
@ -126,36 +113,23 @@ class TransifexHandler(BaseHookHandler):
p = Properties() p = Properties()
p.master = self.master p.master = self.master
option = self.options option = self.options
self.rendered_secret = yield p.render(self.secret) rendered_secret = yield p.render(self.secret)
signature = hmac.new( signature = hmac.new(
unicode2bytes(self.rendered_secret), unicode2bytes(rendered_secret),
unicode2bytes(content_text.strip()), unicode2bytes(content_text.strip()),
digestmod=hashlib.sha256) digestmod=hashlib.sha256)
header_signature = bytes2unicode( header_signature = bytes2unicode(
request.getHeader(_HEADER_SIGNATURE)) request.getHeader(_HEADER_SIGNATURE))
self.verifyTransifexSignature( self._verifyTransifexSignature(request, content, rendered_secret, signature, header_signature)
request, content, self.rendered_secret,
signature, header_signature
)
event_type = payload.get("event", "None") 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" mapped_request = self._transform_variables(payload['project'], payload['resource'])
transifex_request_data['revision'] = ""
transifex_request_data["properties"] = "langugage"
transifex_request_data["properties"] = "resource"
transifex_request_data["properties"] = "project"
transifex_request_data["properties"] = { change["changes"] = {
"branch": branch, "author": author,
"revision": revision "repository": mapped_request["repository"],
} "project": mapped_request["project"],
transifex_request_data["changes"] = { "branch": mapped_request["branch"]
"author": "buildbot-transifex",
"repository": project,
} }
log.msg("Received event '{}' from transifex".format(event_type)) log.msg("Received event '{}' from transifex".format(event_type))
@ -171,5 +145,4 @@ class TransifexHandler(BaseHookHandler):
return (changes, 'transifex') return (changes, 'transifex')
transifex = TransifexHandler
transifex = TransifexHandler(transifex_dict)