diff --git a/crates/ptth_relay/src/config.rs b/crates/ptth_relay/src/config.rs index 4f639cc..7e833a8 100644 --- a/crates/ptth_relay/src/config.rs +++ b/crates/ptth_relay/src/config.rs @@ -52,10 +52,10 @@ pub mod file { pub iso: Isomorphic, pub port: Option , - pub servers: Vec , + pub servers: Option >, // Adding a DB will take a while, so I'm moving these out of dev mode. - pub scraper_keys: Vec >, + pub scraper_keys: Option >>, } } @@ -73,13 +73,14 @@ impl TryFrom for Config { type Error = ConfigError; fn try_from (f: file::Config) -> Result { - let servers = f.servers.into_iter () - .map (|server| Ok::<_, ConfigError> ((server.name.clone (), server))); + let servers = f.servers.unwrap_or_else (|| vec! []); + let servers = servers.into_iter ().map (|server| Ok::<_, ConfigError> ((server.name.clone (), server))); let servers = itertools::process_results (servers, |i| HashMap::from_iter (i))?; + let scraper_keys = f.scraper_keys.unwrap_or_else (|| vec! []); let scraper_keys = if f.iso.enable_scraper_api { - HashMap::from_iter (f.scraper_keys.into_iter ().map (|key| (key.hash.encode_base64 (), key))) + HashMap::from_iter (scraper_keys.into_iter ().map (|key| (key.hash.encode_base64 (), key))) } else { Default::default () diff --git a/crates/ptth_relay/src/lib.rs b/crates/ptth_relay/src/lib.rs index 69c4e2c..e0cf7dc 100644 --- a/crates/ptth_relay/src/lib.rs +++ b/crates/ptth_relay/src/lib.rs @@ -253,6 +253,18 @@ struct ServerListPage <'a> { servers: Vec >, } +#[derive (Serialize)] +struct UnregisteredServer { + name: String, + tripcode: String, + last_seen: String, +} + +#[derive (Serialize)] +struct UnregisteredServerListPage { + unregistered_servers: Vec , +} + async fn handle_server_list_internal (state: &Arc ) -> ServerListPage <'static> { @@ -294,6 +306,14 @@ async fn handle_server_list_internal (state: &Arc ) } } +async fn handle_unregistered_servers_internal (state: &Arc ) +-> UnregisteredServerListPage +{ + UnregisteredServerListPage { + unregistered_servers: vec! [], + } +} + async fn handle_server_list ( state: Arc , handlebars: Arc > @@ -305,6 +325,17 @@ async fn handle_server_list ( Ok (ok_reply (s)?) } +async fn handle_unregistered_servers ( + state: Arc , + handlebars: Arc > +) -> Result , RequestError> +{ + let page = handle_unregistered_servers_internal (&state).await; + + let s = handlebars.render ("unregistered_servers", &page)?; + Ok (ok_reply (s)?) +} + async fn handle_endless_sink (req: Request ) -> Result , http::Error> { let (_parts, mut body) = req.into_parts (); @@ -431,6 +462,9 @@ async fn handle_all ( Ok (error_reply (StatusCode::BAD_REQUEST, "Bad URI format")?) } } + else if path == "/frontend/unregistered_servers" { + Ok (handle_unregistered_servers (state, handlebars).await?) + } else if let Some (rest) = prefix_match ("/frontend/debug/", &path) { if rest == "" { let s = handlebars.render ("debug", &())?; @@ -479,6 +513,7 @@ pub fn load_templates (asset_root: &Path) ("debug", "debug.hbs"), ("root", "root.hbs"), ("server_list", "server_list.hbs"), + ("unregistered_servers", "unregistered_servers.hbs"), ] { handlebars.register_template_file (k, &asset_root.join (v))?; } diff --git a/crates/ptth_relay/src/relay_state.rs b/crates/ptth_relay/src/relay_state.rs index d7afcbf..1a27dca 100644 --- a/crates/ptth_relay/src/relay_state.rs +++ b/crates/ptth_relay/src/relay_state.rs @@ -70,6 +70,12 @@ impl Default for ServerStatus { } } +pub struct RejectedServer { + pub name: String, + pub tripcode: blake3::Hash, + pub seen: DateTime , +} + pub struct RelayState { pub config: RwLock , @@ -82,6 +88,9 @@ pub struct RelayState { pub shutdown_watch_tx: watch::Sender , pub shutdown_watch_rx: watch::Receiver , + + // List of recently rejected server names (Used to approve servers) + pub unregistered_servers: RwLock >, } impl TryFrom for RelayState { @@ -97,6 +106,7 @@ impl TryFrom for RelayState { response_rendezvous: Default::default (), shutdown_watch_tx, shutdown_watch_rx, + unregistered_servers: Default::default (), }) } } diff --git a/crates/ptth_relay/src/server_endpoint.rs b/crates/ptth_relay/src/server_endpoint.rs index d89f3a4..0901590 100644 --- a/crates/ptth_relay/src/server_endpoint.rs +++ b/crates/ptth_relay/src/server_endpoint.rs @@ -54,18 +54,31 @@ pub async fn handle_listen ( let trip_error = || Ok (error_reply (StatusCode::UNAUTHORIZED, "Bad X-ApiKey")?); + let now = Utc::now (); + let actual_tripcode = blake3::hash (api_key); + let expected_tripcode = { let config = state.config.read ().await; match config.servers.get (&watcher_code) { None => { error! ("Denied http_listen for non-existent server name {}", watcher_code); + let mut guard = state.unregistered_servers.write ().await; + guard.push (crate::RejectedServer { + name: watcher_code, + tripcode: actual_tripcode, + seen: now, + }); + + while guard.len () > 20 { + guard.remove (0); + } + return trip_error (); }, Some (x) => *(*x).tripcode, } }; - let actual_tripcode = blake3::hash (api_key); if expected_tripcode != actual_tripcode { error! ("Denied http_listen for bad tripcode {}", base64::encode (actual_tripcode.as_bytes ())); @@ -81,7 +94,7 @@ pub async fn handle_listen ( let mut status = server_status.entry (watcher_code.clone ()).or_insert_with (Default::default); - status.last_seen = Utc::now (); + status.last_seen = now; } let (tx, rx) = oneshot::channel (); diff --git a/handlebars/relay/server_list.hbs b/handlebars/relay/server_list.hbs index b004457..75914c3 100644 --- a/handlebars/relay/server_list.hbs +++ b/handlebars/relay/server_list.hbs @@ -44,6 +44,8 @@ AIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAA" rel="icon" type="image/x-icon" />
Relay is in dev mode. This should never be seen in production!
{{/if}} +Unregistered servers +
{{#if servers}} diff --git a/handlebars/relay/unregistered_servers.hbs b/handlebars/relay/unregistered_servers.hbs new file mode 100644 index 0000000..b683c60 --- /dev/null +++ b/handlebars/relay/unregistered_servers.hbs @@ -0,0 +1,71 @@ + + + + + + +Unregistered servers + + + +

Unregistered servers

+ +
+{{#if unregistered_servers}} +
+ + + + + + + + + + {{#each unregistered_servers}} + + + + + + {{/each}} + + +
NameTripcodeTime seen
{{this.name}}{{this.tripcode}}{{this.last_seen}}
+{{else}} + (No unregistered servers have reported yet) +{{/if}} +
+ + +