Files
frigate/frigate/api/notification.py
T

87 lines
2.8 KiB
Python
Raw Normal View History

"""Notification apis."""
import logging
import os
2025-05-13 16:27:20 +02:00
from typing import Any
from cryptography.hazmat.primitives import serialization
from fastapi import APIRouter, Depends, Request
2024-09-24 14:05:30 +01:00
from fastapi.responses import JSONResponse
from peewee import DoesNotExist
from py_vapid import Vapid01, utils
from frigate.api.auth import allow_any_authenticated
2024-09-24 14:05:30 +01:00
from frigate.api.defs.tags import Tags
from frigate.const import CONFIG_DIR
from frigate.models import User
logger = logging.getLogger(__name__)
2024-09-24 14:05:30 +01:00
router = APIRouter(tags=[Tags.notifications])
2025-10-08 13:55:38 -06:00
@router.get(
"/notifications/pubkey",
dependencies=[Depends(allow_any_authenticated())],
2025-10-08 13:55:38 -06:00
summary="Get VAPID public key",
description="""Gets the VAPID public key for the notifications.
Returns the public key or an error if notifications are not enabled.
""",
)
2024-09-24 14:05:30 +01:00
def get_vapid_pub_key(request: Request):
2025-08-07 15:34:25 -06:00
config = request.app.frigate_config
notifications_enabled = config.notifications.enabled
camera_notifications_enabled = [
c for c in config.cameras.values() if c.enabled and c.notifications.enabled
]
if not (notifications_enabled or camera_notifications_enabled):
2024-09-24 14:05:30 +01:00
return JSONResponse(
content=({"success": False, "message": "Notifications are not enabled."}),
status_code=400,
)
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 14:05:30 +01:00
return JSONResponse(content=utils.b64urlencode(raw_pub), status_code=200)
2025-10-08 13:55:38 -06:00
@router.post(
"/notifications/register",
dependencies=[Depends(allow_any_authenticated())],
2025-10-08 13:55:38 -06:00
summary="Register notifications",
description="""Registers a notifications subscription.
Returns a success message or an error if the subscription is not provided.
""",
)
2024-09-24 14:05:30 +01:00
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"
else:
username = "admin"
2025-05-13 16:27:20 +02:00
json: dict[str, Any] = body or {}
sub = json.get("sub")
if not sub:
2024-09-24 14:05:30 +01:00
return JSONResponse(
content={"success": False, "message": "Subscription must be provided."},
status_code=400,
)
try:
User.update(notification_tokens=User.notification_tokens.append(sub)).where(
User.username == username
).execute()
2024-09-24 14:05:30 +01:00
return JSONResponse(
content=({"success": True, "message": "Successfully saved token."}),
status_code=200,
)
except DoesNotExist:
2024-09-24 14:05:30 +01:00
return JSONResponse(
content=({"success": False, "message": "Could not find user."}),
status_code=404,
)