]> Untitled Git - lemmy.git/blob - crates/apub_lib/src/lib.rs
Fix changelog links
[lemmy.git] / crates / apub_lib / src / lib.rs
1 use activitystreams::{
2   base::AnyBase,
3   error::DomainError,
4   primitives::OneOrMany,
5   unparsed::Unparsed,
6 };
7 pub use lemmy_apub_lib_derive::*;
8 use lemmy_utils::LemmyError;
9 use lemmy_websocket::LemmyContext;
10 use url::Url;
11
12 #[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
13 pub enum PublicUrl {
14   #[serde(rename = "https://www.w3.org/ns/activitystreams#Public")]
15   Public,
16 }
17
18 #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
19 #[serde(rename_all = "camelCase")]
20 pub struct ActivityCommonFields {
21   #[serde(rename = "@context")]
22   pub context: OneOrMany<AnyBase>,
23   id: Url,
24   pub actor: Url,
25
26   // unparsed fields
27   #[serde(flatten)]
28   pub unparsed: Unparsed,
29 }
30
31 impl ActivityCommonFields {
32   pub fn id_unchecked(&self) -> &Url {
33     &self.id
34   }
35 }
36
37 #[async_trait::async_trait(?Send)]
38 pub trait ActivityHandler {
39   async fn verify(
40     &self,
41     context: &LemmyContext,
42     request_counter: &mut i32,
43   ) -> Result<(), LemmyError>;
44
45   async fn receive(
46     &self,
47     context: &LemmyContext,
48     request_counter: &mut i32,
49   ) -> Result<(), LemmyError>;
50   fn common(&self) -> &ActivityCommonFields;
51 }
52
53 pub fn verify_domains_match(a: &Url, b: &Url) -> Result<(), LemmyError> {
54   if a.domain() != b.domain() {
55     return Err(DomainError.into());
56   }
57   Ok(())
58 }
59
60 pub fn verify_domains_match_opt(a: &Url, b: Option<&Url>) -> Result<(), LemmyError> {
61   if let Some(b2) = b {
62     return verify_domains_match(a, b2);
63   }
64   Ok(())
65 }
66
67 pub fn verify_urls_match(a: &Url, b: &Url) -> Result<(), LemmyError> {
68   if a != b {
69     return Err(DomainError.into());
70   }
71   Ok(())
72 }