Move picker router/client additions off PR #218's lines (no merge conflict)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
a2c840f186
commit
2457d2d734
@@ -20,9 +20,9 @@ from app.internal.auth import (
|
|||||||
from app.routers import nodes, systems, calls, upload, tokens, incidents, alerts, admin, trips, places, links, users
|
from app.routers import nodes, systems, calls, upload, tokens, incidents, alerts, admin, trips, places, links, users
|
||||||
from app.routers import enrollment, media, org, waitlist, telemetry, replay, traffic, cameras
|
from app.routers import enrollment, media, org, waitlist, telemetry, replay, traffic, cameras
|
||||||
from app.routers import discord as discord_router
|
from app.routers import discord as discord_router
|
||||||
from app.routers import discord_web
|
|
||||||
from app.internal import dynsec
|
from app.internal import dynsec
|
||||||
from app.internal import firestore as fstore
|
from app.internal import firestore as fstore
|
||||||
|
from app.routers import discord_web
|
||||||
|
|
||||||
|
|
||||||
async def _clear_legacy_token_flags():
|
async def _clear_legacy_token_flags():
|
||||||
@@ -156,12 +156,12 @@ app.include_router(waitlist.router) # public — no auth, source-IP rate limi
|
|||||||
# public by necessity — an <audio src> can't send a bearer token, so the
|
# public by necessity — an <audio src> can't send a bearer token, so the
|
||||||
# short-lived HMAC in the URL is the credential. Checked inline in media.py.
|
# short-lived HMAC in the URL is the credential. Checked inline in media.py.
|
||||||
app.include_router(media.router)
|
app.include_router(media.router)
|
||||||
# auth is per-endpoint: bot routes take the service key (or a platform admin);
|
|
||||||
# the token-fetch route takes the calling node's own API key.
|
|
||||||
app.include_router(discord_router.router)
|
|
||||||
# auth is per-endpoint: directory push takes the service key; the node-page
|
# auth is per-endpoint: directory push takes the service key; the node-page
|
||||||
# picker takes a Firebase token scoped to the node's org (server-26#213).
|
# picker takes a Firebase token scoped to the node's org (server-26#213).
|
||||||
app.include_router(discord_web.router)
|
app.include_router(discord_web.router)
|
||||||
|
# auth is per-endpoint: bot routes take the service key (or a platform admin);
|
||||||
|
# the token-fetch route takes the calling node's own API key.
|
||||||
|
app.include_router(discord_router.router)
|
||||||
# NOTE: there used to be an app.routers.mqtt_auth router here (an HTTP
|
# NOTE: there used to be an app.routers.mqtt_auth router here (an HTTP
|
||||||
# backend for the mosquitto-go-auth plugin). That plugin's upstream project
|
# backend for the mosquitto-go-auth plugin). That plugin's upstream project
|
||||||
# is archived (no CVE patches) and was rejected for an internet-facing
|
# is archived (no CVE patches) and was rejected for an internet-facing
|
||||||
|
|||||||
@@ -30,6 +30,19 @@ class C2Client:
|
|||||||
return {"guild_id": str(guild_id), "org_id": None, "systems": [], "nodes": [],
|
return {"guild_id": str(guild_id), "org_id": None, "systems": [], "nodes": [],
|
||||||
"streams": [], "bots": [], "error": True}
|
"streams": [], "bots": [], "error": True}
|
||||||
|
|
||||||
|
async def put_guild_directory(self, guild_id: int | str, payload: dict) -> bool:
|
||||||
|
"""This server's name + voice channels, for the web node-page picker
|
||||||
|
(server-26#213). Names only — no members, no messages, no tokens."""
|
||||||
|
try:
|
||||||
|
async with httpx.AsyncClient(timeout=10) as client:
|
||||||
|
r = await client.put(f"{self.base}/discord/guilds/{guild_id}/directory",
|
||||||
|
json=payload, headers=self._headers())
|
||||||
|
r.raise_for_status()
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"C2 put_guild_directory({guild_id}) failed: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
async def start_stream(self, payload: dict) -> tuple[bool, dict]:
|
async def start_stream(self, payload: dict) -> tuple[bool, dict]:
|
||||||
"""Returns (ok, body). On a refusal body carries detail/code/invite."""
|
"""Returns (ok, body). On a refusal body carries detail/code/invite."""
|
||||||
try:
|
try:
|
||||||
@@ -68,19 +81,6 @@ class C2Client:
|
|||||||
logger.error(f"C2 stop_guild failed: {e}")
|
logger.error(f"C2 stop_guild failed: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def put_guild_directory(self, guild_id: int | str, payload: dict) -> bool:
|
|
||||||
"""This server's name + voice channels, for the web node-page picker
|
|
||||||
(server-26#213). Names only — no members, no messages, no tokens."""
|
|
||||||
try:
|
|
||||||
async with httpx.AsyncClient(timeout=10) as client:
|
|
||||||
r = await client.put(f"{self.base}/discord/guilds/{guild_id}/directory",
|
|
||||||
json=payload, headers=self._headers())
|
|
||||||
r.raise_for_status()
|
|
||||||
return True
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"C2 put_guild_directory({guild_id}) failed: {e}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# Trips
|
# Trips
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user