mirror of
https://github.com/block/buzz.git
synced 2026-11-03 16:01:35 +00:00
fix(admin): derive admin tenant host via shared relay_url_authority
Issue 3 reopen (Max): buzz-admin's resolve_admin_tenant derived its lookup host with Url::host_str(), which drops an explicit non-default port and IPv6 brackets. For the default RELAY_URL ws://localhost:3000 the admin would look up community host `localhost` while startup seeding (and live request resolution) bind `localhost:3000` — so the admin CLI's membership writes would miss, or hit, the wrong deployment community. Lift relay_url_authority into buzz-core::tenant as the single canonical helper so the relay's host-resolution seam (startup seeding, bind_deployment_community) and the buzz-admin CLI derive a byte-identical authority: host plus explicit non-default port, IPv6 brackets preserved, default ports collapsed — exactly as normalize_host shapes an inbound Host header. The relay tenant module now `pub use`-re-exports it (no behavior change at the relay seam); buzz-admin calls it directly. Adds 4 buzz-core unit tests pinning the authority shape: non-default-port retention (localhost:3000, relay.example:8443), default-port collapse (:443/:80), IPv6 brackets ([::1]:3000), and unparseable/empty -> empty (callers fail closed on empty). Co-authored-by: Tyler Longwell <tlongwell@block.xyz> Signed-off-by: Tyler Longwell <tlongwell@block.xyz>
This commit is contained in:
parent
2adae32bc7
commit
ce747ec759
@@ -24,7 +24,7 @@ use std::sync::Arc;
|
||||
|
||||
use anyhow::Result;
|
||||
use buzz_core::kind::KIND_NIP43_MEMBERSHIP_LIST;
|
||||
use buzz_core::tenant::{normalize_host, TenantContext};
|
||||
use buzz_core::tenant::{relay_url_authority, TenantContext};
|
||||
use buzz_db::{Db, DbConfig};
|
||||
use buzz_pubsub::{EventTopic, PubSubManager};
|
||||
use clap::{Parser, Subcommand};
|
||||
@@ -405,15 +405,14 @@ async fn connect_db() -> Result<Db> {
|
||||
async fn resolve_admin_tenant(db: &Db) -> Result<TenantContext> {
|
||||
let relay_url =
|
||||
std::env::var("RELAY_URL").unwrap_or_else(|_| "ws://localhost:3000".to_string());
|
||||
let raw_host = url::Url::parse(
|
||||
&relay_url
|
||||
.replace("ws://", "http://")
|
||||
.replace("wss://", "https://"),
|
||||
)
|
||||
.ok()
|
||||
.and_then(|u| u.host_str().map(|h| h.to_string()))
|
||||
.unwrap_or_default();
|
||||
let host = normalize_host(&raw_host);
|
||||
// Derive the authority the *same* way startup seeding and live request
|
||||
// resolution do (`buzz_core::tenant::relay_url_authority`): host plus an
|
||||
// explicit non-default port, IPv6 brackets preserved. A plain
|
||||
// `Url::host_str()` drops the port/brackets, so for `ws://localhost:3000`
|
||||
// the admin would look up `localhost` while startup seeded `localhost:3000`
|
||||
// — and `wss://relay.example:8443` would resolve `relay.example`. Sharing
|
||||
// the helper keeps buzz-admin byte-identical to the community startup seeds.
|
||||
let host = relay_url_authority(&relay_url);
|
||||
let record = db.lookup_community_by_host(&host).await?.ok_or_else(|| {
|
||||
anyhow::anyhow!(
|
||||
"RELAY_URL host '{host}' is not mapped to a community.\n\
|
||||
|
||||
Reference in New Issue
Block a user