Skip to content

Commit 0f4c895

Browse files
authored
Merge pull request #10 from suhay/8-github-injection
Separating auth so we can call it using sandwich shop
2 parents ca39d9e + 66d55d0 commit 0f4c895

File tree

5 files changed

+92
-84
lines changed

5 files changed

+92
-84
lines changed

src/app.py

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,34 @@
1+
from auth import auth
2+
from parse import parse
13
from quart import Quart, request
24

3-
from dotenv import load_dotenv
4-
load_dotenv()
5-
6-
from release import processRelease
7-
from multiprocessing import Process
8-
9-
import os
10-
import hashlib
11-
import hmac
12-
13-
14-
token = os.environ.get("API_TOKEN")
15-
tokenb = bytes(token, 'utf-8')
165

176
app = Quart(__name__)
187

19-
@app.route('/webhooks/<repo>', methods=['GET','POST'])
8+
9+
@app.route('/webhooks/<repo>', methods=['GET', 'POST'])
2010
async def webhooks(repo):
2111
if request.is_json:
22-
data = await request.data
23-
signature = hmac.new(tokenb, data, hashlib.sha1).hexdigest()
24-
25-
if 'X-Hub-Signature' in request.headers.keys() and hmac.compare_digest(signature, request.headers['X-Hub-Signature'].split('=')[1]):
26-
payload = await request.get_json()
27-
28-
if payload['repository']['name'] == repo and 'action' in payload.keys():
29-
if payload['action'] == 'released' and 'release' in payload.keys():
30-
p = Process(target=processRelease, args=(repo,payload))
31-
print(p.pid)
32-
p.start()
33-
34-
return 'Thanks!', 202
35-
36-
else:
37-
return 'Signature is wrong...', 401
12+
if 'X-Hub-Signature-256' in request.headers.keys():
13+
data = await request.data
14+
header = request.headers['X-Hub-Signature-256'].split('=')[1]
15+
if auth(header, data):
16+
payload = await request.get_json()
17+
parse(repo, payload)
18+
return 'Thanks!', 202
19+
else:
20+
return 'Signature is wrong...', 401
21+
else:
22+
return 'Signature is wrong...', 401
3823

3924
else:
40-
return 'Not sure what this is...', 418
25+
return 'Not sure what this is...', 418
26+
4127

4228
@app.errorhandler(404)
4329
def page_not_found(e):
4430
return "?", 404
4531

32+
4633
if __name__ == "__main__":
47-
app.run()
34+
app.run()

src/auth.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import hmac
2+
import hashlib
3+
import os
4+
from dotenv import load_dotenv
5+
load_dotenv()
6+
7+
token = os.environ.get("API_TOKEN")
8+
tokenb = bytes(token, 'utf-8')
9+
10+
11+
async def auth(header, data):
12+
signature = 'sha256=' + hmac.new(tokenb, data, hashlib.sha256).hexdigest()
13+
if hmac.compare_digest(signature, header):
14+
return True
15+
return False

src/parse.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from multiprocessing import Process
2+
from release import processRelease
3+
4+
5+
async def parse(repo, payload):
6+
if payload['repository']['name'] == repo and 'action' in payload.keys():
7+
if payload['action'] == 'released' and 'release' in payload.keys():
8+
p = Process(target=processRelease,
9+
args=(repo, payload))
10+
print(p.pid)
11+
p.start()

src/release.py

Lines changed: 44 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,63 @@
11
import json
22
import subprocess
3-
import os.path
43

54
from os import path
65
from pathlib import Path
76
from pybars import Compiler
87

98
compiler = Compiler()
109

10+
1111
def processRelease(repo, payload):
1212
base_path = Path(__file__).parent
1313
file_name = repo + '.json'
1414
file_path = (base_path / '..' / 'sites' / file_name).resolve()
1515

1616
with open(file_path) as f:
17-
data = json.load(f)
17+
data = json.load(f)
1818

1919
if 'release' in data.keys() and 'path' in data.keys():
20-
commands = []
21-
22-
cwd = data['cwd']
23-
24-
if path.exists(base_path / '..' / '.nvmrc'):
25-
commands.append('. ' + cwd + '/.nvm/nvm.sh')
26-
commands.append('nvm use')
27-
elif 'node' in data.keys():
28-
commands.append('. ' + cwd + '/.nvm/nvm.sh')
29-
commands.append('nvm use ' + data['node'])
30-
31-
if 'build' in data['release'].keys():
32-
source = data['release']['build']
33-
template = compiler.compile(source)
34-
commands.append(template(payload))
35-
36-
if 'deploy' in data['release'].keys():
37-
source = data['release']['deploy']
38-
template = compiler.compile(source)
39-
commands.append(template(payload))
40-
41-
if 'cleanup' in data['release'].keys():
42-
source = data['release']['cleanup']
43-
template = compiler.compile(source)
44-
commands.append(template(payload))
45-
46-
subprocess.check_call(['git', 'fetch', '--all', '--tags'], cwd=data['path'])
47-
subprocess.check_call(['git', 'checkout', 'tags/' + payload['release']['tag_name']], cwd=data['path'])
48-
49-
with subprocess.Popen(' && '.join(commands), cwd=data['path'], executable='/bin/bash', shell=True, stdout=subprocess.PIPE) as process:
50-
try:
51-
process.communicate(timeout=300)
52-
while True:
53-
line = process.stdout.readline()
54-
if line == '' and process.poll() is not None:
55-
break
56-
if line:
57-
print(line.rstrip())
58-
except subprocess.TimeoutExpired:
59-
print('Process was killed by timeout: 300 seconds')
60-
raise
61-
finally:
62-
print('Process complete')
63-
process.kill()
64-
process.communicate()
65-
print('Release complete!')
20+
commands = []
21+
22+
cwd = data['cwd']
23+
24+
if path.exists(base_path / '..' / '.nvmrc'):
25+
commands.append('. ' + cwd + '/.nvm/nvm.sh')
26+
commands.append('nvm use')
27+
elif 'node' in data.keys():
28+
commands.append('. ' + cwd + '/.nvm/nvm.sh')
29+
commands.append('nvm use ' + data['node'])
30+
31+
if 'build' in data['release'].keys():
32+
source = data['release']['build']
33+
template = compiler.compile(source)
34+
commands.append(template(payload))
35+
36+
if 'deploy' in data['release'].keys():
37+
source = data['release']['deploy']
38+
template = compiler.compile(source)
39+
commands.append(template(payload))
40+
41+
if 'cleanup' in data['release'].keys():
42+
source = data['release']['cleanup']
43+
template = compiler.compile(source)
44+
commands.append(template(payload))
45+
46+
subprocess.check_call(
47+
['git', 'fetch', '--all', '--tags'], cwd=data['path'])
48+
subprocess.check_call(
49+
['git', 'checkout', 'tags/' + payload['release']['tag_name']], cwd=data['path'])
50+
51+
with subprocess.Popen(' && '.join(commands), cwd=data['path'], executable='/bin/bash', shell=True) as process:
52+
try:
53+
process.communicate(timeout=300)
54+
except subprocess.TimeoutExpired:
55+
print('Process was killed by timeout: 300 seconds')
56+
raise
57+
finally:
58+
print('Process complete')
59+
process.kill()
60+
process.communicate()
61+
print('Release complete!')
6662

6763
return

src/test.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
compiler = Compiler()
44

5-
65
source = r'tar xzf /project/repo/{{release.sha}}.tar.gz'
76
template = compiler.compile(source)
87
print(template({
9-
'release': {
10-
'sha': '302f2b072d46b2f48706eb156f162d901be2c088'
11-
}
8+
'release': {
9+
'sha': '302f2b072d46b2f48706eb156f162d901be2c088'
10+
}
1211
}))

0 commit comments

Comments
 (0)