diff --git a/Cargo.lock b/Cargo.lock index 27d585cf..c5f98478 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1852,8 +1852,10 @@ dependencies = [ name = "lemmy_server" version = "0.0.1" dependencies = [ + "activitystreams", "actix", "actix-files", + "actix-rt", "actix-web", "actix-web-actors", "anyhow", @@ -1877,6 +1879,7 @@ dependencies = [ "reqwest", "rss", "serde 1.0.117", + "serde_json", "sha2", "strum", "tokio 0.3.1", diff --git a/Cargo.toml b/Cargo.toml index 055dac50..99d755cc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,9 @@ tokio = "0.3" sha2 = "0.9" anyhow = "1.0" reqwest = { version = "0.10", features = ["json"] } +activitystreams = "0.7.0-alpha.4" +actix-rt = { version = "1.1", default-features = false } +serde_json = { version = "1.0", features = ["preserve_order"]} [dev-dependencies.cargo-husky] version = "1" diff --git a/lemmy_apub/src/http/mod.rs b/lemmy_apub/src/http/mod.rs index 91af36b2..4f31f6a5 100644 --- a/lemmy_apub/src/http/mod.rs +++ b/lemmy_apub/src/http/mod.rs @@ -54,7 +54,8 @@ pub async fn get_activity( }) .await??; - if !activity.local || activity.sensitive { + let sensitive = activity.sensitive.unwrap_or(true); + if !activity.local || sensitive { Ok(HttpResponse::NotFound().finish()) } else { Ok(create_apub_response(&activity.data)) diff --git a/lemmy_db/src/activity.rs b/lemmy_db/src/activity.rs index b0ec1df6..190dd411 100644 --- a/lemmy_db/src/activity.rs +++ b/lemmy_db/src/activity.rs @@ -12,22 +12,22 @@ use std::{ #[table_name = "activity"] pub struct Activity { pub id: i32, - pub ap_id: String, pub data: Value, pub local: bool, - pub sensitive: bool, pub published: chrono::NaiveDateTime, pub updated: Option, + pub ap_id: Option, + pub sensitive: Option, } #[derive(Insertable, AsChangeset)] #[table_name = "activity"] pub struct ActivityForm { - pub ap_id: String, pub data: Value, pub local: bool, - pub sensitive: bool, pub updated: Option, + pub ap_id: String, + pub sensitive: bool, } impl Crud for Activity { @@ -53,6 +53,10 @@ impl Crud for Activity { .set(new_activity) .get_result::(conn) } + fn delete(conn: &PgConnection, activity_id: i32) -> Result { + use crate::schema::activity::dsl::*; + diesel::delete(activity.find(activity_id)).execute(conn) + } } impl Activity { @@ -115,7 +119,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, @@ -162,11 +166,11 @@ mod tests { let inserted_activity = Activity::create(&conn, &activity_form).unwrap(); let expected_activity = Activity { - ap_id: ap_id.to_string(), + ap_id: Some(ap_id.to_string()), id: inserted_activity.id, data: test_json, local: true, - sensitive: false, + sensitive: Some(false), published: inserted_activity.published, updated: None, }; @@ -174,6 +178,7 @@ mod tests { let read_activity = Activity::read(&conn, inserted_activity.id).unwrap(); let read_activity_by_apub_id = Activity::read_from_apub_id(&conn, ap_id).unwrap(); User_::delete(&conn, inserted_creator.id).unwrap(); + Activity::delete(&conn, inserted_activity.id).unwrap(); assert_eq!(expected_activity, read_activity); assert_eq!(expected_activity, read_activity_by_apub_id); diff --git a/lemmy_db/src/comment.rs b/lemmy_db/src/comment.rs index 02c84187..9b092825 100644 --- a/lemmy_db/src/comment.rs +++ b/lemmy_db/src/comment.rs @@ -280,7 +280,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, diff --git a/lemmy_db/src/comment_view.rs b/lemmy_db/src/comment_view.rs index 568083ce..e1299cb1 100644 --- a/lemmy_db/src/comment_view.rs +++ b/lemmy_db/src/comment_view.rs @@ -519,7 +519,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, diff --git a/lemmy_db/src/community.rs b/lemmy_db/src/community.rs index 4a11557c..3473f25c 100644 --- a/lemmy_db/src/community.rs +++ b/lemmy_db/src/community.rs @@ -275,8 +275,8 @@ pub struct CommunityFollower { pub id: i32, pub community_id: i32, pub user_id: i32, - pub pending: bool, pub published: chrono::NaiveDateTime, + pub pending: Option, } #[derive(Insertable, AsChangeset, Clone)] @@ -341,7 +341,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, @@ -407,6 +407,7 @@ mod tests { let community_follower_form = CommunityFollowerForm { community_id: inserted_community.id, user_id: inserted_user.id, + pending: false, }; let inserted_community_follower = @@ -416,6 +417,7 @@ mod tests { id: inserted_community_follower.id, community_id: inserted_community.id, user_id: inserted_user.id, + pending: Some(false), published: inserted_community_follower.published, }; diff --git a/lemmy_db/src/moderator.rs b/lemmy_db/src/moderator.rs index fb74def0..c0c0ff10 100644 --- a/lemmy_db/src/moderator.rs +++ b/lemmy_db/src/moderator.rs @@ -416,7 +416,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, @@ -445,7 +445,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, diff --git a/lemmy_db/src/password_reset_request.rs b/lemmy_db/src/password_reset_request.rs index 20db73ec..8ae18cbd 100644 --- a/lemmy_db/src/password_reset_request.rs +++ b/lemmy_db/src/password_reset_request.rs @@ -100,7 +100,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, diff --git a/lemmy_db/src/post.rs b/lemmy_db/src/post.rs index 41401431..787d5e6c 100644 --- a/lemmy_db/src/post.rs +++ b/lemmy_db/src/post.rs @@ -349,7 +349,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, diff --git a/lemmy_db/src/post_view.rs b/lemmy_db/src/post_view.rs index 15652477..38d9a021 100644 --- a/lemmy_db/src/post_view.rs +++ b/lemmy_db/src/post_view.rs @@ -416,7 +416,7 @@ mod tests { published: None, updated: None, admin: false, - banned: false, + banned: Some(false), show_nsfw: false, theme: "browser".into(), default_sort_type: SortType::Hot as i16, diff --git a/lemmy_db/src/private_message.rs b/lemmy_db/src/private_message.rs index 4775ceba..503a26ab 100644 --- a/lemmy_db/src/private_message.rs +++ b/lemmy_db/src/private_message.rs @@ -157,7 +157,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, @@ -186,7 +186,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, diff --git a/lemmy_db/src/schema.rs b/lemmy_db/src/schema.rs index 7eeea968..65838b1a 100644 --- a/lemmy_db/src/schema.rs +++ b/lemmy_db/src/schema.rs @@ -1,12 +1,12 @@ table! { activity (id) { id -> Int4, - ap_id -> Text, data -> Jsonb, local -> Bool, - sensitive -> Bool, published -> Timestamp, updated -> Nullable, + ap_id -> Nullable, + sensitive -> Nullable, } } @@ -149,8 +149,8 @@ table! { id -> Int4, community_id -> Int4, user_id -> Int4, - pending -> Bool, published -> Timestamp, + pending -> Nullable, } } diff --git a/lemmy_db/src/user.rs b/lemmy_db/src/user.rs index 8dc613bb..378bbad9 100644 --- a/lemmy_db/src/user.rs +++ b/lemmy_db/src/user.rs @@ -196,7 +196,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, diff --git a/lemmy_db/src/user_mention.rs b/lemmy_db/src/user_mention.rs index 79f93801..68f56633 100644 --- a/lemmy_db/src/user_mention.rs +++ b/lemmy_db/src/user_mention.rs @@ -96,7 +96,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, @@ -125,7 +125,7 @@ mod tests { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), published: None, updated: None, show_nsfw: false, diff --git a/test.sh b/test.sh index beb499bd..02e4faee 100755 --- a/test.sh +++ b/test.sh @@ -2,4 +2,7 @@ export DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy diesel migration run export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy -RUST_TEST_THREADS=1 cargo test --workspace --no-fail-fast +# Integration tests only work on stable due to a bug in config-rs +# https://github.com/mehcode/config-rs/issues/158 +RUST_BACKTRACE=1 RUST_TEST_THREADS=1 \ + cargo +stable test --workspace --no-fail-fast diff --git a/tests/integration_test.rs b/tests/integration_test.rs index f7b32151..2a79dd4b 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -16,6 +16,18 @@ use diesel::{ PgConnection, }; use http_signature_normalization_actix::PrepareVerifyError; +use lemmy_api::match_websocket_operation; +use lemmy_apub::{ + activity_queue::create_activity_queue, + inbox::{ + community_inbox, + community_inbox::community_inbox, + shared_inbox, + shared_inbox::shared_inbox, + user_inbox, + user_inbox::user_inbox, + }, +}; use lemmy_db::{ community::{Community, CommunityForm}, user::{User_, *}, @@ -24,22 +36,8 @@ use lemmy_db::{ SortType, }; use lemmy_rate_limit::{rate_limiter::RateLimiter, RateLimit}; -use lemmy_server::{ - apub::{ - activity_queue::create_activity_queue, - inbox::{ - community_inbox, - community_inbox::community_inbox, - shared_inbox, - shared_inbox::shared_inbox, - user_inbox, - user_inbox::user_inbox, - }, - }, - websocket::chat_server::ChatServer, - LemmyContext, -}; use lemmy_utils::{apub::generate_actor_keypair, settings::Settings}; +use lemmy_websocket::{chat_server::ChatServer, LemmyContext}; use reqwest::Client; use serde::{Deserialize, Serialize}; use std::sync::Arc; @@ -61,11 +59,12 @@ fn create_context() -> LemmyContext { let chat_server = ChatServer::startup( pool.clone(), rate_limiter.clone(), + |c, i, o, d| Box::pin(match_websocket_operation(c, i, o, d)), Client::default(), activity_queue.clone(), ) .start(); - LemmyContext::new( + LemmyContext::create( pool, chat_server, Client::default(), @@ -84,7 +83,7 @@ fn create_user(conn: &PgConnection, name: &str) -> User_ { avatar: None, banner: None, admin: false, - banned: false, + banned: Some(false), updated: None, published: None, show_nsfw: false, @@ -177,7 +176,7 @@ async fn test_user_inbox_expired_signature() { let connection = &context.pool().get().unwrap(); let user = create_user(connection, "user_inbox_cgsax"); let activity = - create_activity::>(user.actor_id); + create_activity::>(user.actor_id); let path = Path:: { 0: "username".to_string(), }; @@ -196,8 +195,9 @@ async fn test_community_inbox_expired_signature() { let user = create_user(connection, "community_inbox_hrxa"); let community = create_community(connection, user.id); let request = create_http_request(); - let activity = - create_activity::>(user.actor_id); + let activity = create_activity::>( + user.actor_id, + ); let path = Path:: { 0: community.name }; let response = community_inbox(request, activity, path, web::Data::new(context)).await; assert_eq!(