Justin Moore 2a3f1e7241
Fix a logic bug in the notification hook (#2627)
* Fix a logic bug in the notification hook

* Format
2022-11-15 08:41:52 -08:00

81 lines
2.1 KiB
Python

#!/usr/bin/env python
#
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
#
import hmac
import json
import logging
import os
from hashlib import sha512
from typing import Any, Dict
import aiohttp
import azure.functions as func
def code_block(data: str) -> str:
data = data.replace("`", "``")
return "\n```\n%s\n```\n" % data
async def send_message(req: func.HttpRequest) -> None:
data = req.get_json()
teams_url = os.environ.get("TEAMS_URL")
if teams_url is None:
raise Exception("missing TEAMS_URL")
message: Dict[str, Any] = {
"@type": "MessageCard",
"@context": "https://schema.org/extensions",
"summary": data["instance_name"],
"sections": [
{
"facts": [
{"name": "instance", "value": data["instance_name"]},
{"name": "event type", "value": data["event_type"]},
]
},
{"text": code_block(json.dumps(data["event"], sort_keys=True))},
],
}
async with aiohttp.ClientSession() as client:
async with client.post(teams_url, json=message) as response:
if not response.ok:
raise RuntimeError(
f"Teams endpoint failed to consume message: {response}"
)
def verify(req: func.HttpRequest) -> bool:
request_hmac = req.headers.get("X-Onefuzz-Digest")
if request_hmac is None:
raise Exception("missing X-Onefuzz-Digest")
hmac_token = os.environ.get("HMAC_TOKEN")
if hmac_token is None:
raise Exception("missing HMAC_TOKEN")
digest = hmac.new(
hmac_token.encode(), msg=req.get_body(), digestmod=sha512
).hexdigest()
if digest != request_hmac:
logging.error("invalid hmac")
return False
return True
async def main(req: func.HttpRequest) -> func.HttpResponse:
if not verify(req):
return func.HttpResponse("no thanks", status_code=400)
try:
await send_message(req)
except Exception:
return func.HttpResponse("unable to send message", status_code=500)
return func.HttpResponse("thanks")