mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-09-30 19:21:33 +02:00
#1108 — Long-lived camera-stream tokens for HA / Frigate / kiosks. Camera-only V1, hard 365-day cap (no infinite tokens), pbkdf2 hashed at rest, plaintext shown to user exactly once on creation. New "Camera API Tokens" panel under Settings → API Keys with self-service create/revoke, styled confirm modal, admin "All users" view for leak triage. Auth path: /camera/stream tries the existing 60-min ephemeral table first, falls through to the long-lived path. Indexed lookup_prefix keeps verify O(1) per token. Permission audit: gated the existing API-keys-CRUD + Webhook docs + API Browser content behind api_keys:read so non-admins with camera:view land on the API Keys tab and see only the Camera Tokens panel they actually have permission to use. Grid layout collapses to single column for non-admins. Tests: 29 new backend (15 service + 14 integration covering create/list/ revoke ownership rules, the auth fall-through, scope enforcement, prefix collisions) + 6 new frontend tests for the section UI including the new modal flow. All 77 backend tests + 21 frontend camera tests pass. Ruff clean (lint + format). Docs: README updated with fan-out + long-lived-token bullets. Wiki gets a new "Long-Lived Camera Tokens" section under features/camera.md (HA YAML example, security model, permission requirements, revoke flow). Website features.html gets the bullet under Camera Streaming. Also includes #1089 follow-up tweaks already merged in this branch: _stream_start_times.setdefault for accurate stream_uptime, subscribe() RuntimeError retry to close the grace-vs-subscribe race, atomic unsubscribe count via the iter_subscriber on_unsubscribe callback.
81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
from backend.app.models.ams_history import AMSSensorHistory
|
|
from backend.app.models.ams_label import AmsLabel
|
|
from backend.app.models.api_key import APIKey
|
|
from backend.app.models.archive import PrintArchive
|
|
from backend.app.models.auth_ephemeral import AuthEphemeralToken, AuthRateLimitEvent
|
|
from backend.app.models.color_catalog import ColorCatalogEntry
|
|
from backend.app.models.filament import Filament
|
|
from backend.app.models.github_backup import GitHubBackupConfig, GitHubBackupLog
|
|
from backend.app.models.group import Group, user_groups
|
|
from backend.app.models.kprofile_note import KProfileNote
|
|
from backend.app.models.library import LibraryFile, LibraryFolder
|
|
from backend.app.models.local_preset import LocalPreset
|
|
from backend.app.models.long_lived_token import LongLivedToken
|
|
from backend.app.models.maintenance import MaintenanceHistory, MaintenanceType, PrinterMaintenance
|
|
from backend.app.models.notification import NotificationLog
|
|
from backend.app.models.notification_template import NotificationTemplate
|
|
from backend.app.models.oidc_provider import OIDCProvider, UserOIDCLink
|
|
from backend.app.models.orca_base_cache import OrcaBaseProfile
|
|
from backend.app.models.pending_upload import PendingUpload
|
|
from backend.app.models.print_batch import PrintBatch
|
|
from backend.app.models.printer import Printer
|
|
from backend.app.models.project import Project
|
|
from backend.app.models.settings import Settings
|
|
from backend.app.models.smart_plug import SmartPlug
|
|
from backend.app.models.smart_plug_energy_snapshot import SmartPlugEnergySnapshot
|
|
from backend.app.models.spool import Spool
|
|
from backend.app.models.spool_assignment import SpoolAssignment
|
|
from backend.app.models.spool_catalog import SpoolCatalogEntry
|
|
from backend.app.models.spool_k_profile import SpoolKProfile
|
|
from backend.app.models.spool_usage_history import SpoolUsageHistory
|
|
from backend.app.models.spoolbuddy_device import SpoolBuddyDevice
|
|
from backend.app.models.user import User
|
|
from backend.app.models.user_email_pref import UserEmailPreference
|
|
from backend.app.models.user_otp_code import UserOTPCode
|
|
from backend.app.models.user_totp import UserTOTP
|
|
|
|
__all__ = [
|
|
"Printer",
|
|
"PrintArchive",
|
|
"Filament",
|
|
"Settings",
|
|
"SmartPlug",
|
|
"SmartPlugEnergySnapshot",
|
|
"MaintenanceType",
|
|
"PrinterMaintenance",
|
|
"MaintenanceHistory",
|
|
"KProfileNote",
|
|
"NotificationTemplate",
|
|
"NotificationLog",
|
|
"Project",
|
|
"APIKey",
|
|
"AMSSensorHistory",
|
|
"AmsLabel",
|
|
"PendingUpload",
|
|
"PrintBatch",
|
|
"LibraryFolder",
|
|
"LibraryFile",
|
|
"User",
|
|
"Group",
|
|
"user_groups",
|
|
"GitHubBackupConfig",
|
|
"GitHubBackupLog",
|
|
"LocalPreset",
|
|
"OIDCProvider",
|
|
"UserOIDCLink",
|
|
"OrcaBaseProfile",
|
|
"Spool",
|
|
"SpoolKProfile",
|
|
"SpoolAssignment",
|
|
"SpoolCatalogEntry",
|
|
"SpoolUsageHistory",
|
|
"ColorCatalogEntry",
|
|
"SpoolBuddyDevice",
|
|
"UserEmailPreference",
|
|
"UserOTPCode",
|
|
"UserTOTP",
|
|
"AuthEphemeralToken",
|
|
"AuthRateLimitEvent",
|
|
"LongLivedToken",
|
|
]
|