From c21eb26c8d011932293aeec3afe4849740f7fdf8 Mon Sep 17 00:00:00 2001 From: Kit La Touche Date: Wed, 2 Jul 2025 16:34:33 -0400 Subject: Rough in client and server side of web-push --- src/push/handlers/mod.rs | 75 +++++++++++++++++++++++++++++++++++++++++++++ src/push/handlers/vapid.rs | 0 src/push/mod.rs | 1 + src/push/pilcrow.db | Bin 0 -> 233472 bytes 4 files changed, 76 insertions(+) create mode 100644 src/push/handlers/mod.rs create mode 100644 src/push/handlers/vapid.rs create mode 100644 src/push/mod.rs create mode 100644 src/push/pilcrow.db (limited to 'src/push') diff --git a/src/push/handlers/mod.rs b/src/push/handlers/mod.rs new file mode 100644 index 0000000..f9ba612 --- /dev/null +++ b/src/push/handlers/mod.rs @@ -0,0 +1,75 @@ +use std::env; + +use axum::{ + extract::{Json}, +}; + +use web_push::{ + SubscriptionInfo, + VapidSignatureBuilder, + WebPushMessageBuilder, + ContentEncoding, + IsahcWebPushClient, +}; + +#[derive(Debug, thiserror::Error)] +pub enum Error { + #[error(transparent)] + Database(#[from] sqlx::Error), +} + + + +pub async fn vapid() -> String { + let vapid_public_key = env::var("VAPID_PUBLIC_KEY").is_ok(); + String::from(vapid_public_key) +} + + +pub async fn register() -> String { + String::from("OK") +} + + +pub async fn unregister() -> String { + String::from("OK") +} + + +#[axum::debug_handler] +pub async fn echo( + Json(echo): Json, +) -> Result<(), Error> { + // Look this up from a subscription record? Or get it from the client and trust? + let endpoint = "https://updates.push.services.mozilla.com/wpush/v1/..."; + // Get these from client: + let p256dh = "key_from_browser_as_base64"; + let auth = "auth_from_browser_as_base64"; + + // You would likely get this by deserializing a browser `pushSubscription` object. + let subscription_info = SubscriptionInfo::new(endpoint, p256dh, auth); + + // This will need to come from the DB eventually. + let private_key = String::from(env::var("VAPID_PRIVATE_KEY").is_ok()); + let mut sig_builder = VapidSignatureBuilder::from_pem(private_key, &subscription_info)?.build()?; + + // Now add payload and encrypt. + let mut builder = WebPushMessageBuilder::new(&subscription_info); + // Eventually, this message will be something other than an echo: + let content = echo.msg.as_bytes(); + builder.set_payload(ContentEncoding::Aes128Gcm, content); + builder.set_vapid_signature(sig_builder); + + let client = IsahcWebPushClient::new()?; + + // Finally, send the notification! + client.send(builder.build()?).await?; + // Fix up return type? + Ok(()) +} + + +#[derive(serde::Deserialize)] +pub struct Echo { + pub msg: String, +} diff --git a/src/push/handlers/vapid.rs b/src/push/handlers/vapid.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/push/mod.rs b/src/push/mod.rs new file mode 100644 index 0000000..c3d4495 --- /dev/null +++ b/src/push/mod.rs @@ -0,0 +1 @@ +pub mod handlers; diff --git a/src/push/pilcrow.db b/src/push/pilcrow.db new file mode 100644 index 0000000..978a002 Binary files /dev/null and b/src/push/pilcrow.db differ -- cgit v1.2.3