Skip to content

Commit 0b3e471

Browse files
authored
fix: require pylon webhook secret validation (#22)
1 parent 93dc050 commit 0b3e471

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed

BotConfig_tmpl.toml

+2
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,5 @@ api_key = "{{.STRIPE_API_KEY}}"
8181

8282
[pylon]
8383
bearer_token = "{{.PYLON_BEARER_TOKEN}}"
84+
webhook_secret = "{{.PYLON_WEBHOOK_SECRET}}"
85+

glu/__main__.py

+18-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
from cachetools import LRUCache
77
from gidgethub import aiohttp as gh_aiohttp, routing, sansio
88
from gidgethub.apps import get_installation_access_token, get_jwt
9-
from glu import pylon, zendesk
9+
from glu import pylon
10+
11+
# from glu import zendesk
1012
import glu.events as event
1113
from glu.config_loader import config
1214
from glu import runtime_constants
@@ -65,7 +67,7 @@ async def main():
6567
# await zendesk.init()
6668
app = web.Application()
6769
app.router.add_post("/", github_payloads)
68-
app.router.add_post("/zendesk", zendesk.webhook_handler)
70+
# app.router.add_post("/zendesk", zendesk.webhook_handler)
6971
app.router.add_post("/pylon", pylon.webhook)
7072
app.router.add_get("/pylon/sidebar", pylon.sidebar)
7173
port = int(config["server"].get("port", 8000))
@@ -75,10 +77,20 @@ async def main():
7577
await runner.setup()
7678
site = web.TCPSite(runner, host, port)
7779

78-
await asyncio.gather(
79-
twitter_run(),
80-
site.start(),
81-
)
80+
await site.start()
81+
82+
try:
83+
print(f"Server started at http://{host}:{port}")
84+
await asyncio.Event().wait() # Keep the server running indefinitely
85+
except KeyboardInterrupt:
86+
print("Shutting down the server...")
87+
finally:
88+
await runner.cleanup()
89+
90+
# await asyncio.gather(
91+
# twitter_run(),
92+
# site.start(),
93+
# )
8294

8395

8496
if __name__ == "__main__":

glu/pylon.py

+11
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,16 @@ async def fetch_data_from_mysql(requester_email: str):
115115
return rows
116116

117117

118+
async def verify_secret(request: web.Request) -> bool:
119+
secret_header = request.headers.get("secret", "")
120+
return config["pylon"]["webhook_secret"] == secret_header
121+
122+
118123
async def sidebar(request: web.Request):
119124
try:
125+
if not await verify_secret(request):
126+
return web.json_response(status=400)
127+
120128
if request.query.get("request_type") == "verify":
121129
print(f"Verification request received: {request.query['code']}")
122130
return web.json_response({"code": request.query["code"]}, status=200)
@@ -350,6 +358,9 @@ def update_ticket(
350358

351359
async def webhook(request: web.Request):
352360
try:
361+
if not await verify_secret(request):
362+
return web.json_response(status=400)
363+
353364
data = await request.json()
354365
issue_id = data["issue_id"]
355366
requester_email = data["requester_email"]

0 commit comments

Comments
 (0)