1 extern crate lemmy_server;
4 activity::{kind::CreateType, ActorAndObject},
5 base::{BaseExt, ExtendsExt},
6 object::{Note, ObjectExt},
9 use actix_web::{test::TestRequest, web};
12 r2d2::{ConnectionManager, Pool},
15 use http_signature_normalization_actix::PrepareVerifyError;
22 use lemmy_rate_limit::{rate_limiter::RateLimiter, RateLimit};
25 activity_queue::create_activity_queue,
26 inbox::shared_inbox::{shared_inbox, ValidTypes},
28 websocket::chat_server::ChatServer,
31 use lemmy_utils::{apub::generate_actor_keypair, settings::Settings};
34 use tokio::sync::Mutex;
37 fn create_context() -> LemmyContext {
38 let settings = Settings::get();
39 let db_url = settings.get_database_url();
40 let manager = ConnectionManager::<PgConnection>::new(&db_url);
41 let pool = Pool::builder()
42 .max_size(settings.database.pool_size)
45 let rate_limiter = RateLimit {
46 rate_limiter: Arc::new(Mutex::new(RateLimiter::default())),
48 let activity_queue = create_activity_queue();
49 let chat_server = ChatServer::startup(
53 activity_queue.clone(),
60 create_activity_queue(),
64 fn create_user(conn: &PgConnection) -> User_ {
65 let user_keypair = generate_actor_keypair().unwrap();
66 let new_user = UserForm {
67 name: "integration_user_1".into(),
68 preferred_username: None,
69 password_encrypted: "nope".into(),
78 theme: "darkly".into(),
79 default_sort_type: SortType::Hot as i16,
80 default_listing_type: ListingType::Subscribed as i16,
81 lang: "browser".into(),
83 send_notifications_to_email: false,
84 actor_id: Some("http://localhost:8536/u/integration_user_1".to_string()),
87 private_key: Some(user_keypair.private_key),
88 public_key: Some(user_keypair.public_key),
89 last_refreshed_at: None,
92 User_::create(&conn, &new_user).unwrap()
95 fn create_activity(user_id: String) -> web::Json<ActorAndObject<ValidTypes>> {
97 ActorAndObject::<CreateType>::new(user_id, Note::new().into_any_base().unwrap());
99 .set_id(Url::parse("http://localhost:8536/create/1").unwrap())
100 .set_many_ccs(vec![Url::parse("http://localhost:8536/c/main").unwrap()]);
101 let activity = serde_json::to_value(&activity).unwrap();
102 let activity: ActorAndObject<ValidTypes> = serde_json::from_value(activity).unwrap();
107 async fn test_expired_signature() {
108 let time1 = Utc::now().timestamp();
109 let time2 = Utc::now().timestamp();
110 let signature = format!(
111 r#"keyId="my-key-id",algorithm="hs2019",created="{}",expires="{}",headers="(request-target) (created) (expires) date content-type",signature="blah blah blah""#,
114 let request = TestRequest::post()
115 .uri("http://localhost:8536/inbox")
116 .header("Signature", signature)
118 let context = create_context();
119 let user = create_user(&context.pool().get().unwrap());
120 let activity = create_activity(user.actor_id);
121 let response = shared_inbox(request, activity, web::Data::new(context)).await;
123 format!("{}", response.err().unwrap()),
124 format!("{}", PrepareVerifyError::Expired)