2024-07-22 22:39:15 +02:00
|
|
|
"""Notification apis."""
|
|
|
|
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
|
|
|
|
from cryptography.hazmat.primitives import serialization
|
2024-09-24 15:05:30 +02:00
|
|
|
from fastapi import APIRouter, Request
|
|
|
|
from fastapi.responses import JSONResponse
|
2024-07-22 22:39:15 +02:00
|
|
|
from peewee import DoesNotExist
|
|
|
|
from py_vapid import Vapid01, utils
|
|
|
|
|
2024-09-24 15:05:30 +02:00
|
|
|
from frigate.api.defs.tags import Tags
|
2024-07-22 22:39:15 +02:00
|
|
|
from frigate.const import CONFIG_DIR
|
|
|
|
from frigate.models import User
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2024-09-24 15:05:30 +02:00
|
|
|
router = APIRouter(tags=[Tags.notifications])
|
2024-07-22 22:39:15 +02:00
|
|
|
|
|
|
|
|
2024-09-24 15:05:30 +02:00
|
|
|
@router.get("/notifications/pubkey")
|
|
|
|
def get_vapid_pub_key(request: Request):
|
|
|
|
if not request.app.frigate_config.notifications.enabled:
|
|
|
|
return JSONResponse(
|
|
|
|
content=({"success": False, "message": "Notifications are not enabled."}),
|
|
|
|
status_code=400,
|
2024-07-22 22:39:15 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
key = Vapid01.from_file(os.path.join(CONFIG_DIR, "notifications.pem"))
|
|
|
|
raw_pub = key.public_key.public_bytes(
|
|
|
|
serialization.Encoding.X962, serialization.PublicFormat.UncompressedPoint
|
|
|
|
)
|
2024-09-24 15:05:30 +02:00
|
|
|
return JSONResponse(content=utils.b64urlencode(raw_pub), status_code=200)
|
2024-07-22 22:39:15 +02:00
|
|
|
|
|
|
|
|
2024-09-24 15:05:30 +02:00
|
|
|
@router.post("/notifications/register")
|
|
|
|
def register_notifications(request: Request, body: dict = None):
|
|
|
|
if request.app.frigate_config.auth.enabled:
|
|
|
|
# FIXME: For FastAPI the remote-user is not being populated
|
|
|
|
username = request.headers.get("remote-user") or "admin"
|
2024-07-22 22:39:15 +02:00
|
|
|
else:
|
|
|
|
username = "admin"
|
|
|
|
|
2024-09-24 15:05:30 +02:00
|
|
|
json: dict[str, any] = body or {}
|
2024-07-22 22:39:15 +02:00
|
|
|
sub = json.get("sub")
|
|
|
|
|
|
|
|
if not sub:
|
2024-09-24 15:05:30 +02:00
|
|
|
return JSONResponse(
|
|
|
|
content={"success": False, "message": "Subscription must be provided."},
|
|
|
|
status_code=400,
|
|
|
|
)
|
2024-07-22 22:39:15 +02:00
|
|
|
|
|
|
|
try:
|
|
|
|
User.update(notification_tokens=User.notification_tokens.append(sub)).where(
|
|
|
|
User.username == username
|
|
|
|
).execute()
|
2024-09-24 15:05:30 +02:00
|
|
|
return JSONResponse(
|
|
|
|
content=({"success": True, "message": "Successfully saved token."}),
|
|
|
|
status_code=200,
|
2024-07-22 22:39:15 +02:00
|
|
|
)
|
|
|
|
except DoesNotExist:
|
2024-09-24 15:05:30 +02:00
|
|
|
return JSONResponse(
|
|
|
|
content=({"success": False, "message": "Could not find user."}),
|
|
|
|
status_code=404,
|
2024-07-22 22:39:15 +02:00
|
|
|
)
|