diff options
| author | Kit La Touche <kit@transneptune.net> | 2025-07-02 16:34:33 -0400 |
|---|---|---|
| committer | Kit La Touche <kit@transneptune.net> | 2025-07-23 16:38:55 -0400 |
| commit | c21eb26c8d011932293aeec3afe4849740f7fdf8 (patch) | |
| tree | d77c92b31dff49e6151d3b2ade851b12a88ad437 /src/push | |
| parent | aec3eaeebd37bce9ab4dad14e7e86ef0db8f0c2d (diff) | |
Rough in client and server side of web-push
Diffstat (limited to 'src/push')
| -rw-r--r-- | src/push/handlers/mod.rs | 75 | ||||
| -rw-r--r-- | src/push/handlers/vapid.rs | 0 | ||||
| -rw-r--r-- | src/push/mod.rs | 1 | ||||
| -rw-r--r-- | src/push/pilcrow.db | bin | 0 -> 233472 bytes |
4 files changed, 76 insertions, 0 deletions
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<Echo>, +) -> 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 --- /dev/null +++ b/src/push/handlers/vapid.rs 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 Binary files differnew file mode 100644 index 0000000..978a002 --- /dev/null +++ b/src/push/pilcrow.db |
