summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2022-11-09 18:46:10 +0100
committerTimo Kösters <timo@koesters.xyz>2022-11-09 18:46:10 +0100
commit75402273882d4641771d5edde7ed8b498eafcb07 (patch)
tree29a4c3ab586d4d3486573784c13af01b42541255 /src
parentccdaaceb3311a0972c3c23a11c4a81fa7329518a (diff)
downloadconduit-75402273882d4641771d5edde7ed8b498eafcb07.zip
chore: bump dependencies
Diffstat (limited to 'src')
-rw-r--r--src/api/client_server/push.rs5
-rw-r--r--src/api/server_server.rs1
-rw-r--r--src/database/key_value/pusher.rs51
-rw-r--r--src/main.rs2
-rw-r--r--src/service/pusher/data.rs9
-rw-r--r--src/service/pusher/mod.rs166
6 files changed, 113 insertions, 121 deletions
diff --git a/src/api/client_server/push.rs b/src/api/client_server/push.rs
index 2301ddc..dc936a6 100644
--- a/src/api/client_server/push.rs
+++ b/src/api/client_server/push.rs
@@ -575,9 +575,10 @@ pub async fn set_pushers_route(
body: Ruma<set_pusher::v3::Request>,
) -> Result<set_pusher::v3::Response> {
let sender_user = body.sender_user.as_ref().expect("user is authenticated");
- let pusher = body.pusher.clone();
- services().pusher.set_pusher(sender_user, pusher)?;
+ services()
+ .pusher
+ .set_pusher(sender_user, body.action.clone())?;
Ok(set_pusher::v3::Response::default())
}
diff --git a/src/api/server_server.rs b/src/api/server_server.rs
index 320e396..f66e96c 100644
--- a/src/api/server_server.rs
+++ b/src/api/server_server.rs
@@ -1478,6 +1478,7 @@ async fn create_join_event(
.filter_map(|(_, id)| services().rooms.timeline.get_pdu_json(id).ok().flatten())
.map(PduEvent::convert_to_outgoing_federation_event)
.collect(),
+ event: None, // TODO: handle restricted joins
})
}
diff --git a/src/database/key_value/pusher.rs b/src/database/key_value/pusher.rs
index 3dfceb6..b203107 100644
--- a/src/database/key_value/pusher.rs
+++ b/src/database/key_value/pusher.rs
@@ -1,38 +1,37 @@
use ruma::{
- api::client::push::{get_pushers, set_pusher},
+ api::client::push::{set_pusher, Pusher},
UserId,
};
use crate::{database::KeyValueDatabase, service, utils, Error, Result};
impl service::pusher::Data for KeyValueDatabase {
- fn set_pusher(&self, sender: &UserId, pusher: set_pusher::v3::Pusher) -> Result<()> {
- let mut key = sender.as_bytes().to_vec();
- key.push(0xff);
- key.extend_from_slice(pusher.pushkey.as_bytes());
-
- // There are 2 kinds of pushers but the spec says: null deletes the pusher.
- if pusher.kind.is_none() {
- return self
- .senderkey_pusher
- .remove(&key)
- .map(|_| ())
- .map_err(Into::into);
+ fn set_pusher(&self, sender: &UserId, pusher: set_pusher::v3::PusherAction) -> Result<()> {
+ match &pusher {
+ set_pusher::v3::PusherAction::Post(data) => {
+ let mut key = sender.as_bytes().to_vec();
+ key.push(0xff);
+ key.extend_from_slice(data.pusher.ids.pushkey.as_bytes());
+ self.senderkey_pusher.insert(
+ &key,
+ &serde_json::to_vec(&pusher).expect("Pusher is valid JSON value"),
+ )?;
+ Ok(())
+ }
+ set_pusher::v3::PusherAction::Delete(ids) => {
+ let mut key = sender.as_bytes().to_vec();
+ key.push(0xff);
+ key.extend_from_slice(ids.pushkey.as_bytes());
+ return self
+ .senderkey_pusher
+ .remove(&key)
+ .map(|_| ())
+ .map_err(Into::into);
+ }
}
-
- self.senderkey_pusher.insert(
- &key,
- &serde_json::to_vec(&pusher).expect("Pusher is valid JSON value"),
- )?;
-
- Ok(())
}
- fn get_pusher(
- &self,
- sender: &UserId,
- pushkey: &str,
- ) -> Result<Option<get_pushers::v3::Pusher>> {
+ fn get_pusher(&self, sender: &UserId, pushkey: &str) -> Result<Option<Pusher>> {
let mut senderkey = sender.as_bytes().to_vec();
senderkey.push(0xff);
senderkey.extend_from_slice(pushkey.as_bytes());
@@ -46,7 +45,7 @@ impl service::pusher::Data for KeyValueDatabase {
.transpose()
}
- fn get_pushers(&self, sender: &UserId) -> Result<Vec<get_pushers::v3::Pusher>> {
+ fn get_pushers(&self, sender: &UserId) -> Result<Vec<Pusher>> {
let mut prefix = sender.as_bytes().to_vec();
prefix.push(0xff);
diff --git a/src/main.rs b/src/main.rs
index 72c6d51..d2183a3 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -473,7 +473,7 @@ macro_rules! impl_ruma_handler {
let meta = Req::METADATA;
let method_filter = method_to_filter(meta.method);
- for path in IntoIterator::into_iter([meta.unstable_path, meta.r0_path, meta.stable_path]).flatten() {
+ for path in meta.history.all_paths() {
let handler = self.clone();
router = router.route(path, on(method_filter, |$( $ty: $ty, )* req| async move {
diff --git a/src/service/pusher/data.rs b/src/service/pusher/data.rs
index e317121..2062f56 100644
--- a/src/service/pusher/data.rs
+++ b/src/service/pusher/data.rs
@@ -1,16 +1,15 @@
use crate::Result;
use ruma::{
- api::client::push::{get_pushers, set_pusher},
+ api::client::push::{set_pusher, Pusher},
UserId,
};
pub trait Data: Send + Sync {
- fn set_pusher(&self, sender: &UserId, pusher: set_pusher::v3::Pusher) -> Result<()>;
+ fn set_pusher(&self, sender: &UserId, pusher: set_pusher::v3::PusherAction) -> Result<()>;
- fn get_pusher(&self, sender: &UserId, pushkey: &str)
- -> Result<Option<get_pushers::v3::Pusher>>;
+ fn get_pusher(&self, sender: &UserId, pushkey: &str) -> Result<Option<Pusher>>;
- fn get_pushers(&self, sender: &UserId) -> Result<Vec<get_pushers::v3::Pusher>>;
+ fn get_pushers(&self, sender: &UserId) -> Result<Vec<Pusher>>;
fn get_pushkeys<'a>(&'a self, sender: &UserId)
-> Box<dyn Iterator<Item = Result<String>> + 'a>;
diff --git a/src/service/pusher/mod.rs b/src/service/pusher/mod.rs
index 7fee276..cd11d71 100644
--- a/src/service/pusher/mod.rs
+++ b/src/service/pusher/mod.rs
@@ -6,7 +6,7 @@ use crate::{services, Error, PduEvent, Result};
use bytes::BytesMut;
use ruma::{
api::{
- client::push::{get_pushers, set_pusher, PusherKind},
+ client::push::{set_pusher, Pusher, PusherKind},
push_gateway::send_event_notification::{
self,
v1::{Device, Notification, NotificationCounts, NotificationPriority},
@@ -23,26 +23,22 @@ use ruma::{
};
use std::{fmt::Debug, mem};
-use tracing::{error, info, warn};
+use tracing::{info, warn};
pub struct Service {
pub db: &'static dyn Data,
}
impl Service {
- pub fn set_pusher(&self, sender: &UserId, pusher: set_pusher::v3::Pusher) -> Result<()> {
+ pub fn set_pusher(&self, sender: &UserId, pusher: set_pusher::v3::PusherAction) -> Result<()> {
self.db.set_pusher(sender, pusher)
}
- pub fn get_pusher(
- &self,
- sender: &UserId,
- pushkey: &str,
- ) -> Result<Option<get_pushers::v3::Pusher>> {
+ pub fn get_pusher(&self, sender: &UserId, pushkey: &str) -> Result<Option<Pusher>> {
self.db.get_pusher(sender, pushkey)
}
- pub fn get_pushers(&self, sender: &UserId) -> Result<Vec<get_pushers::v3::Pusher>> {
+ pub fn get_pushers(&self, sender: &UserId) -> Result<Vec<Pusher>> {
self.db.get_pushers(sender)
}
@@ -140,7 +136,7 @@ impl Service {
&self,
user: &UserId,
unread: UInt,
- pusher: &get_pushers::v3::Pusher,
+ pusher: &Pusher,
ruleset: Ruleset,
pdu: &PduEvent,
) -> Result<()> {
@@ -221,91 +217,87 @@ impl Service {
async fn send_notice(
&self,
unread: UInt,
- pusher: &get_pushers::v3::Pusher,
+ pusher: &Pusher,
tweaks: Vec<Tweak>,
event: &PduEvent,
) -> Result<()> {
// TODO: email
- if pusher.kind == PusherKind::Email {
- return Ok(());
- }
-
- // TODO:
- // Two problems with this
- // 1. if "event_id_only" is the only format kind it seems we should never add more info
- // 2. can pusher/devices have conflicting formats
- let event_id_only = pusher.data.format == Some(PushFormat::EventIdOnly);
- let url = if let Some(url) = &pusher.data.url {
- url
- } else {
- error!("Http Pusher must have URL specified.");
- return Ok(());
- };
-
- let mut device = Device::new(pusher.app_id.clone(), pusher.pushkey.clone());
- let mut data_minus_url = pusher.data.clone();
- // The url must be stripped off according to spec
- data_minus_url.url = None;
- device.data = data_minus_url.into();
+ match &pusher.kind {
+ PusherKind::Http(http) => {
+ // TODO:
+ // Two problems with this
+ // 1. if "event_id_only" is the only format kind it seems we should never add more info
+ // 2. can pusher/devices have conflicting formats
+ let event_id_only = http.format == Some(PushFormat::EventIdOnly);
+
+ let mut device = Device::new(pusher.ids.app_id.clone(), pusher.ids.pushkey.clone());
+ device.data.default_payload = http.default_payload.clone();
+ device.data.format = http.format.clone();
+
+ // Tweaks are only added if the format is NOT event_id_only
+ if !event_id_only {
+ device.tweaks = tweaks.clone();
+ }
- // Tweaks are only added if the format is NOT event_id_only
- if !event_id_only {
- device.tweaks = tweaks.clone();
- }
+ let d = &[device];
+ let mut notifi = Notification::new(d);
+
+ notifi.prio = NotificationPriority::Low;
+ notifi.event_id = Some(&event.event_id);
+ notifi.room_id = Some(&event.room_id);
+ // TODO: missed calls
+ notifi.counts = NotificationCounts::new(unread, uint!(0));
+
+ if event.kind == RoomEventType::RoomEncrypted
+ || tweaks
+ .iter()
+ .any(|t| matches!(t, Tweak::Highlight(true) | Tweak::Sound(_)))
+ {
+ notifi.prio = NotificationPriority::High
+ }
- let d = &[device];
- let mut notifi = Notification::new(d);
-
- notifi.prio = NotificationPriority::Low;
- notifi.event_id = Some(&event.event_id);
- notifi.room_id = Some(&event.room_id);
- // TODO: missed calls
- notifi.counts = NotificationCounts::new(unread, uint!(0));
-
- if event.kind == RoomEventType::RoomEncrypted
- || tweaks
- .iter()
- .any(|t| matches!(t, Tweak::Highlight(true) | Tweak::Sound(_)))
- {
- notifi.prio = NotificationPriority::High
- }
+ if event_id_only {
+ self.send_request(&http.url, send_event_notification::v1::Request::new(notifi))
+ .await?;
+ } else {
+ notifi.sender = Some(&event.sender);
+ notifi.event_type = Some(&event.kind);
+ let content = serde_json::value::to_raw_value(&event.content).ok();
+ notifi.content = content.as_deref();
+
+ if event.kind == RoomEventType::RoomMember {
+ notifi.user_is_target =
+ event.state_key.as_deref() == Some(event.sender.as_str());
+ }
+
+ let user_name = services().users.displayname(&event.sender)?;
+ notifi.sender_display_name = user_name.as_deref();
+
+ let room_name = if let Some(room_name_pdu) = services()
+ .rooms
+ .state_accessor
+ .room_state_get(&event.room_id, &StateEventType::RoomName, "")?
+ {
+ serde_json::from_str::<RoomNameEventContent>(room_name_pdu.content.get())
+ .map_err(|_| {
+ Error::bad_database("Invalid room name event in database.")
+ })?
+ .name
+ } else {
+ None
+ };
+
+ notifi.room_name = room_name.as_deref();
+
+ self.send_request(&http.url, send_event_notification::v1::Request::new(notifi))
+ .await?;
+ }
- if event_id_only {
- self.send_request(url, send_event_notification::v1::Request::new(notifi))
- .await?;
- } else {
- notifi.sender = Some(&event.sender);
- notifi.event_type = Some(&event.kind);
- let content = serde_json::value::to_raw_value(&event.content).ok();
- notifi.content = content.as_deref();
-
- if event.kind == RoomEventType::RoomMember {
- notifi.user_is_target = event.state_key.as_deref() == Some(event.sender.as_str());
+ Ok(())
}
-
- let user_name = services().users.displayname(&event.sender)?;
- notifi.sender_display_name = user_name.as_deref();
-
- let room_name = if let Some(room_name_pdu) = services()
- .rooms
- .state_accessor
- .room_state_get(&event.room_id, &StateEventType::RoomName, "")?
- {
- serde_json::from_str::<RoomNameEventContent>(room_name_pdu.content.get())
- .map_err(|_| Error::bad_database("Invalid room name event in database."))?
- .name
- } else {
- None
- };
-
- notifi.room_name = room_name.as_deref();
-
- self.send_request(url, send_event_notification::v1::Request::new(notifi))
- .await?;
+ // TODO: Handle email
+ PusherKind::Email(_) => return Ok(()),
+ _ => return Ok(()),
}
-
- // TODO: email
-
- Ok(())
}
}