mirror of
https://github.com/microsoft/onefuzz.git
synced 2025-06-09 08:41:34 +00:00
81 lines
2.1 KiB
Python
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")
|