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