]> Untitled Git - lemmy.git/blob - crates/apub/src/objects/mod.rs
Rate limit websocket joins. (#2165)
[lemmy.git] / crates / apub / src / objects / mod.rs
1 use crate::protocol::{ImageObject, SourceCompat};
2 use html2md::parse_html;
3 use lemmy_apub_lib::verify::verify_domains_match;
4 use lemmy_utils::LemmyError;
5 use url::Url;
6
7 pub mod comment;
8 pub mod community;
9 pub mod instance;
10 pub mod person;
11 pub mod post;
12 pub mod private_message;
13
14 pub(crate) fn read_from_string_or_source(raw: &str, source: &Option<SourceCompat>) -> String {
15   if let Some(SourceCompat::Lemmy(s)) = source {
16     s.content.clone()
17   } else {
18     parse_html(raw)
19   }
20 }
21
22 pub(crate) fn read_from_string_or_source_opt(
23   raw: &Option<String>,
24   source: &Option<SourceCompat>,
25 ) -> Option<String> {
26   if let Some(SourceCompat::Lemmy(s2)) = source {
27     Some(s2.content.clone())
28   } else {
29     raw.as_ref().map(|s| parse_html(s))
30   }
31 }
32
33 pub fn verify_image_domain_matches(a: &Url, b: &Option<ImageObject>) -> Result<(), LemmyError> {
34   if let Some(b) = b {
35     verify_domains_match(a, &b.url)
36   } else {
37     Ok(())
38   }
39 }
40
41 #[cfg(test)]
42 pub(crate) mod tests {
43   use actix::Actor;
44   use diesel::{
45     r2d2::{ConnectionManager, Pool},
46     PgConnection,
47   };
48   use lemmy_apub_lib::activity_queue::create_activity_queue;
49   use lemmy_db_schema::{
50     establish_unpooled_connection,
51     get_database_url_from_env,
52     source::secret::Secret,
53   };
54   use lemmy_utils::{
55     rate_limit::{rate_limiter::RateLimiter, RateLimit},
56     request::build_user_agent,
57     settings::structs::Settings,
58     LemmyError,
59   };
60   use lemmy_websocket::{chat_server::ChatServer, LemmyContext};
61   use parking_lot::Mutex;
62   use reqwest::Client;
63   use reqwest_middleware::ClientBuilder;
64   use std::sync::Arc;
65
66   // TODO: would be nice if we didnt have to use a full context for tests.
67   //       or at least write a helper function so this code is shared with main.rs
68   pub(crate) fn init_context() -> LemmyContext {
69     let client = reqwest::Client::new().into();
70     // activity queue isnt used in tests, so worker count makes no difference
71     let queue_manager = create_activity_queue(client, 4);
72     let activity_queue = queue_manager.queue_handle().clone();
73     // call this to run migrations
74     establish_unpooled_connection();
75     let settings = Settings::init().unwrap();
76     let rate_limiter = RateLimit {
77       rate_limiter: Arc::new(Mutex::new(RateLimiter::default())),
78       rate_limit_config: settings.rate_limit.to_owned().unwrap_or_default(),
79     };
80     let client = Client::builder()
81       .user_agent(build_user_agent(&settings))
82       .build()
83       .unwrap();
84
85     let client = ClientBuilder::new(client).build();
86     let secret = Secret {
87       id: 0,
88       jwt_secret: "".to_string(),
89     };
90     let db_url = match get_database_url_from_env() {
91       Ok(url) => url,
92       Err(_) => settings.get_database_url(),
93     };
94     let manager = ConnectionManager::<PgConnection>::new(&db_url);
95     let pool = Pool::builder()
96       .max_size(settings.database.pool_size)
97       .build(manager)
98       .unwrap_or_else(|_| panic!("Error connecting to {}", db_url));
99     async fn x() -> Result<String, LemmyError> {
100       Ok("".to_string())
101     }
102     let chat_server = ChatServer::startup(
103       pool.clone(),
104       rate_limiter,
105       |_, _, _, _| Box::pin(x()),
106       |_, _, _, _| Box::pin(x()),
107       client.clone(),
108       activity_queue.clone(),
109       settings.clone(),
110       secret.clone(),
111     )
112     .start();
113     LemmyContext::create(pool, chat_server, client, activity_queue, settings, secret)
114   }
115 }