Skip to content

Commit d5e4f84

Browse files
committed
Discord security
1 parent 011fcfc commit d5e4f84

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
lines changed

.github/workflows/build_and_publish.yml

+3-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ jobs:
5656
runs-on: [self-hosted, Linux]
5757
environment:
5858
name: Testing
59-
url: https://api.test.profcomff.com/social
59+
url: https://api.test.profcomff.com/?urls.primaryName=social
6060
env:
6161
CONTAINER_NAME: com_profcomff_api_social_test
6262
permissions:
@@ -98,7 +98,7 @@ jobs:
9898
runs-on: [self-hosted, Linux]
9999
environment:
100100
name: Production
101-
url: https://api.profcomff.com/social
101+
url: https://api.profcomff.com/?urls.primaryName=social
102102
env:
103103
CONTAINER_NAME: com_profcomff_api_social
104104
permissions:
@@ -131,6 +131,7 @@ jobs:
131131
--env TELEGRAM_BOT_TOKEN='${{ secrets.TELEGRAM_BOT_TOKEN }}' \
132132
--env GITHUB_APP_ID='${{ secrets.GH_APP_ID }}' \
133133
--env GITHUB_PRIVATE_KEY='${{ secrets.GH_PRIVATE_KEY }}' \
134+
--env DISCORD_PUBLIC_KEY='${{ secrets.DISCORD_PUBLIC_KEY }}' \
134135
--env GUNICORN_CMD_ARGS='--log-config logging_prod.conf' \
135136
--name ${{ env.CONTAINER_NAME }} \
136137
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ auth-lib-profcomff[fastapi]
1212
python-telegram-bot
1313
jwt
1414
gql[requests]
15+
pynacl

social/routes/discord.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import logging
22

3-
from fastapi import APIRouter, BackgroundTasks, Request
3+
from fastapi import APIRouter, BackgroundTasks, Request, HTTPException
44
from fastapi.responses import JSONResponse
55
from fastapi_sqlalchemy import db
6+
from nacl.signing import VerifyKey
7+
from nacl.exceptions import BadSignatureError
68

79
from social.handlers_discord.base import process_event
810
from social.models.webhook_storage import WebhookStorage, WebhookSystems
@@ -12,14 +14,24 @@
1214
router = APIRouter(prefix="/discord", tags=["webhooks"])
1315
settings = get_settings()
1416
logger = logging.getLogger(__name__)
17+
verify_key = VerifyKey(bytes.fromhex(settings.DISCORD_PUBLIC_KEY))
1518

1619

1720
@router.post('')
1821
async def discord_webhook(request: Request, background_tasks: BackgroundTasks):
1922
"""Принимает любой POST запрос от discord"""
20-
request_data = await request.json()
23+
request_data: dict[str] = await request.json()
2124
logger.debug(request_data)
2225

26+
signature = request.headers.get("X-Signature-Ed25519", "")
27+
timestamp = request.headers.get("X-Signature-Timestamp", "")
28+
body = (await request.body()).decode("utf-8")
29+
30+
try:
31+
verify_key.verify(f'{timestamp}{body}'.encode(), bytes.fromhex(signature))
32+
except BadSignatureError:
33+
raise HTTPException(401, 'invalid request signature')
34+
2335
db.session.add(
2436
WebhookStorage(
2537
system=WebhookSystems.DISCORD,

social/settings.py

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class Settings(BaseSettings):
2424
GITHUB_WEBHOOK_SECRET: str | None = None
2525
GITHUB_PRIVATE_KEY: str | None = None
2626

27+
DISCORD_PUBLIC_KEY: str | None = None
28+
2729

2830
@lru_cache
2931
def get_settings() -> Settings:

0 commit comments

Comments
 (0)