From 3b717cfc887a07cda7eff20e543df653d1e2862d Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 10 Jan 2024 04:44:27 -0500 Subject: [PATCH 01/12] Removing serde_skip from newest_comment_time. Fixes #4351 (#4360) --- crates/db_schema/src/aggregates/structs.rs | 1 - docker/docker-compose.yml | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/db_schema/src/aggregates/structs.rs b/crates/db_schema/src/aggregates/structs.rs index 4dd57724c..0020ecab0 100644 --- a/crates/db_schema/src/aggregates/structs.rs +++ b/crates/db_schema/src/aggregates/structs.rs @@ -111,7 +111,6 @@ pub struct PostAggregates { /// A newest comment time, limited to 2 days, to prevent necrobumping pub newest_comment_time_necro: DateTime, /// The time of the newest comment in the post. - #[serde(skip)] pub newest_comment_time: DateTime, /// If the post is featured on the community. #[serde(skip)] diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 36b5e5500..00cb48a93 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -17,7 +17,7 @@ services: - "8536:8536" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro,Z - restart: always + restart: unless-stopped depends_on: - pictrs - lemmy-ui @@ -38,7 +38,7 @@ services: # CARGO_BUILD_FEATURES: default # this hostname is used in nginx reverse proxy and also for lemmy ui to connect to the backend, do not change hostname: lemmy - restart: always + restart: unless-stopped environment: - RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug" - RUST_BACKTRACE=full @@ -72,7 +72,7 @@ services: - LEMMY_UI_DEBUG=true depends_on: - lemmy - restart: always + restart: unless-stopped logging: *default-logging init: true @@ -95,7 +95,7 @@ services: user: 991:991 volumes: - ./volumes/pictrs:/mnt:Z - restart: always + restart: unless-stopped logging: *default-logging postgres: @@ -127,5 +127,5 @@ services: - POSTGRES_DB=lemmy volumes: - ./volumes/postgres:/var/lib/postgresql/data:Z - restart: always + restart: unless-stopped logging: *default-logging From 2d16d12cb7a7178dd3a747f907b492739251ecd8 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Wed, 10 Jan 2024 15:07:09 +0100 Subject: [PATCH 02/12] Move `publish = false` to correct place in lemmy_server (fixes #4359) (#4361) --- Cargo.toml | 2 +- crates/utils/translations | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index def862d8c..cd2a06c9d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,5 @@ [workspace.package] version = "0.19.2-rc.5" -publish = false edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -17,6 +16,7 @@ license.workspace = true homepage.workspace = true documentation.workspace = true repository.workspace = true +publish = false [lib] doctest = false diff --git a/crates/utils/translations b/crates/utils/translations index 2139975ef..06a610696 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit 2139975ef383077e4709a4f2cae42922fd63b860 +Subproject commit 06a610696af829248954e411ebe2cf3906092244 From 143fdb62b1422ab1706d7f7d9e99e91cfd9ef176 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 10 Jan 2024 10:16:36 -0500 Subject: [PATCH 03/12] Updating translations. --- crates/utils/translations | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/utils/translations b/crates/utils/translations index 06a610696..e2cc2912d 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit 06a610696af829248954e411ebe2cf3906092244 +Subproject commit e2cc2912dac3f74959a934ad66ec833a04e847ae From 0d35c247f9a5f1d866c0d0ae72f873bf13fc5006 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Wed, 10 Jan 2024 10:18:09 -0500 Subject: [PATCH 04/12] Version 0.19.2 --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 24 ++++++++++++------------ docker/docker-compose.yml | 4 ++-- docker/federation/docker-compose.yml | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6774ed3af..b20f49201 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2529,7 +2529,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_api" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "activitypub_federation", "actix-web", @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "lemmy_api_common" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "activitypub_federation", "actix-web", @@ -2593,7 +2593,7 @@ dependencies = [ [[package]] name = "lemmy_api_crud" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "activitypub_federation", "actix-web", @@ -2615,7 +2615,7 @@ dependencies = [ [[package]] name = "lemmy_apub" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "activitypub_federation", "actix-web", @@ -2655,7 +2655,7 @@ dependencies = [ [[package]] name = "lemmy_db_schema" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "activitypub_federation", "async-trait", @@ -2692,7 +2692,7 @@ dependencies = [ [[package]] name = "lemmy_db_views" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "actix-web", "chrono", @@ -2712,7 +2712,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_actor" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "chrono", "diesel", @@ -2730,7 +2730,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_moderator" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "diesel", "diesel-async", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "lemmy_federate" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "activitypub_federation", "anyhow", @@ -2765,7 +2765,7 @@ dependencies = [ [[package]] name = "lemmy_routes" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "activitypub_federation", "actix-web", @@ -2789,7 +2789,7 @@ dependencies = [ [[package]] name = "lemmy_server" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "activitypub_federation", "actix-cors", @@ -2832,7 +2832,7 @@ dependencies = [ [[package]] name = "lemmy_utils" -version = "0.19.2-rc.5" +version = "0.19.2" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index cd2a06c9d..5395416a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.19.2-rc.5" +version = "0.19.2" edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -85,16 +85,16 @@ unused_self = "deny" unwrap_used = "deny" [workspace.dependencies] -lemmy_api = { version = "=0.19.2-rc.5", path = "./crates/api" } -lemmy_api_crud = { version = "=0.19.2-rc.5", path = "./crates/api_crud" } -lemmy_apub = { version = "=0.19.2-rc.5", path = "./crates/apub" } -lemmy_utils = { version = "=0.19.2-rc.5", path = "./crates/utils" } -lemmy_db_schema = { version = "=0.19.2-rc.5", path = "./crates/db_schema" } -lemmy_api_common = { version = "=0.19.2-rc.5", path = "./crates/api_common" } -lemmy_routes = { version = "=0.19.2-rc.5", path = "./crates/routes" } -lemmy_db_views = { version = "=0.19.2-rc.5", path = "./crates/db_views" } -lemmy_db_views_actor = { version = "=0.19.2-rc.5", path = "./crates/db_views_actor" } -lemmy_db_views_moderator = { version = "=0.19.2-rc.5", path = "./crates/db_views_moderator" } +lemmy_api = { version = "=0.19.2", path = "./crates/api" } +lemmy_api_crud = { version = "=0.19.2", path = "./crates/api_crud" } +lemmy_apub = { version = "=0.19.2", path = "./crates/apub" } +lemmy_utils = { version = "=0.19.2", path = "./crates/utils" } +lemmy_db_schema = { version = "=0.19.2", path = "./crates/db_schema" } +lemmy_api_common = { version = "=0.19.2", path = "./crates/api_common" } +lemmy_routes = { version = "=0.19.2", path = "./crates/routes" } +lemmy_db_views = { version = "=0.19.2", path = "./crates/db_views" } +lemmy_db_views_actor = { version = "=0.19.2", path = "./crates/db_views_actor" } +lemmy_db_views_moderator = { version = "=0.19.2", path = "./crates/db_views_moderator" } activitypub_federation = { version = "0.5.1-beta.1", default-features = false, features = [ "actix-web", ] } @@ -166,7 +166,7 @@ lemmy_utils = { workspace = true } lemmy_db_schema = { workspace = true } lemmy_api_common = { workspace = true } lemmy_routes = { workspace = true } -lemmy_federate = { version = "0.19.2-rc.5", path = "crates/federate" } +lemmy_federate = { version = "0.19.2", path = "crates/federate" } activitypub_federation = { workspace = true } diesel = { workspace = true } diesel-async = { workspace = true } diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 00cb48a93..db0c9f41e 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -25,7 +25,7 @@ services: lemmy: # use "image" to pull down an already compiled lemmy. make sure to comment out "build". - # image: dessalines/lemmy:0.19.1 + # image: dessalines/lemmy:0.19.2 # platform: linux/x86_64 # no arm64 support. uncomment platform if using m1. # use "build" to build your local lemmy server image for development. make sure to comment out "image". # run: docker compose up --build @@ -55,7 +55,7 @@ services: lemmy-ui: # use "image" to pull down an already compiled lemmy-ui. make sure to comment out "build". - image: dessalines/lemmy-ui:0.19.1 + image: dessalines/lemmy-ui:0.19.2 # platform: linux/x86_64 # no arm64 support. uncomment platform if using m1. # use "build" to build your local lemmy ui image for development. make sure to comment out "image". # run: docker compose up --build diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml index faef2675f..1f38e2b5f 100644 --- a/docker/federation/docker-compose.yml +++ b/docker/federation/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.7" x-ui-default: &ui-default init: true - image: dessalines/lemmy-ui:0.19.1 + image: dessalines/lemmy-ui:0.19.2 # assuming lemmy-ui is cloned besides lemmy directory # build: # context: ../../../lemmy-ui From 9240a653c088884798c1a9b63b7c9cf5ca0e5392 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 12 Jan 2024 00:56:19 +0100 Subject: [PATCH 05/12] Fix bug with Mastodon undo follow activities (#4364) --- crates/apub/src/activities/block/block_user.rs | 2 +- crates/apub/src/activities/block/undo_block_user.rs | 2 +- crates/apub/src/activities/community/announce.rs | 4 ++-- crates/apub/src/activities/community/collection_add.rs | 2 +- crates/apub/src/activities/community/collection_remove.rs | 2 +- crates/apub/src/activities/community/lock_page.rs | 2 +- crates/apub/src/activities/community/report.rs | 2 +- crates/apub/src/activities/community/update.rs | 2 +- crates/apub/src/activities/create_or_update/comment.rs | 2 +- crates/apub/src/activities/create_or_update/post.rs | 2 +- .../apub/src/activities/create_or_update/private_message.rs | 2 +- crates/apub/src/activities/deletion/delete.rs | 2 +- crates/apub/src/activities/deletion/undo_delete.rs | 2 +- crates/apub/src/activities/following/accept.rs | 2 +- crates/apub/src/activities/following/follow.rs | 2 +- crates/apub/src/activities/following/undo_follow.rs | 2 +- crates/apub/src/activities/voting/undo_vote.rs | 2 +- crates/apub/src/activities/voting/vote.rs | 2 +- crates/utils/translations | 2 +- 19 files changed, 20 insertions(+), 20 deletions(-) diff --git a/crates/apub/src/activities/block/block_user.rs b/crates/apub/src/activities/block/block_user.rs index 4469be53e..177df2ca5 100644 --- a/crates/apub/src/activities/block/block_user.rs +++ b/crates/apub/src/activities/block/block_user.rs @@ -125,7 +125,6 @@ impl ActivityHandler for BlockUser { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &self.cc)?; match self.target.dereference(context).await? { SiteOrCommunity::Site(site) => { @@ -149,6 +148,7 @@ impl ActivityHandler for BlockUser { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let expires = self.expires.map(Into::into); let mod_person = self.actor.dereference(context).await?; let blocked_person = self.object.dereference(context).await?; diff --git a/crates/apub/src/activities/block/undo_block_user.rs b/crates/apub/src/activities/block/undo_block_user.rs index 97e2bc336..da25a4af0 100644 --- a/crates/apub/src/activities/block/undo_block_user.rs +++ b/crates/apub/src/activities/block/undo_block_user.rs @@ -89,7 +89,6 @@ impl ActivityHandler for UndoBlockUser { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &self.cc)?; verify_domains_match(self.actor.inner(), self.object.actor.inner())?; self.object.verify(context).await?; @@ -98,6 +97,7 @@ impl ActivityHandler for UndoBlockUser { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let expires = self.object.expires.map(Into::into); let mod_person = self.actor.dereference(context).await?; let blocked_person = self.object.object.dereference(context).await?; diff --git a/crates/apub/src/activities/community/announce.rs b/crates/apub/src/activities/community/announce.rs index c704ad012..c0d5e0e3d 100644 --- a/crates/apub/src/activities/community/announce.rs +++ b/crates/apub/src/activities/community/announce.rs @@ -145,14 +145,14 @@ impl ActivityHandler for AnnounceActivity { } #[tracing::instrument(skip_all)] - async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; + async fn verify(&self, _context: &Data) -> Result<(), LemmyError> { verify_is_public(&self.to, &self.cc)?; Ok(()) } #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let object: AnnouncableActivities = self.object.object(context).await?.try_into()?; // This is only for sending, not receiving so we reject it. diff --git a/crates/apub/src/activities/community/collection_add.rs b/crates/apub/src/activities/community/collection_add.rs index ba962359e..fdd62bdb1 100644 --- a/crates/apub/src/activities/community/collection_add.rs +++ b/crates/apub/src/activities/community/collection_add.rs @@ -115,7 +115,6 @@ impl ActivityHandler for CollectionAdd { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &self.cc)?; let community = self.community(context).await?; verify_person_in_community(&self.actor, &community, context).await?; @@ -125,6 +124,7 @@ impl ActivityHandler for CollectionAdd { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let (community, collection_type) = Community::get_by_collection_url(&mut context.pool(), &self.target.into()).await?; match collection_type { diff --git a/crates/apub/src/activities/community/collection_remove.rs b/crates/apub/src/activities/community/collection_remove.rs index c71e282bc..06238a890 100644 --- a/crates/apub/src/activities/community/collection_remove.rs +++ b/crates/apub/src/activities/community/collection_remove.rs @@ -110,7 +110,6 @@ impl ActivityHandler for CollectionRemove { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &self.cc)?; let community = self.community(context).await?; verify_person_in_community(&self.actor, &community, context).await?; @@ -120,6 +119,7 @@ impl ActivityHandler for CollectionRemove { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let (community, collection_type) = Community::get_by_collection_url(&mut context.pool(), &self.target.into()).await?; match collection_type { diff --git a/crates/apub/src/activities/community/lock_page.rs b/crates/apub/src/activities/community/lock_page.rs index 634e5ab2f..db9dfa36c 100644 --- a/crates/apub/src/activities/community/lock_page.rs +++ b/crates/apub/src/activities/community/lock_page.rs @@ -81,7 +81,6 @@ impl ActivityHandler for UndoLockPage { } async fn verify(&self, context: &Data) -> Result<(), Self::Error> { - insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &self.cc)?; let community = self.community(context).await?; verify_person_in_community(&self.actor, &community, context).await?; @@ -91,6 +90,7 @@ impl ActivityHandler for UndoLockPage { } async fn receive(self, context: &Data) -> Result<(), Self::Error> { + insert_received_activity(&self.id, context).await?; let form = PostUpdateForm { locked: Some(false), ..Default::default() diff --git a/crates/apub/src/activities/community/report.rs b/crates/apub/src/activities/community/report.rs index 70278075c..11941675a 100644 --- a/crates/apub/src/activities/community/report.rs +++ b/crates/apub/src/activities/community/report.rs @@ -92,7 +92,6 @@ impl ActivityHandler for Report { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; let community = self.community(context).await?; verify_person_in_community(&self.actor, &community, context).await?; Ok(()) @@ -100,6 +99,7 @@ impl ActivityHandler for Report { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let actor = self.actor.dereference(context).await?; let reason = self.reason()?; match self.object.dereference(context).await? { diff --git a/crates/apub/src/activities/community/update.rs b/crates/apub/src/activities/community/update.rs index 11040f6b9..8733b8ad1 100644 --- a/crates/apub/src/activities/community/update.rs +++ b/crates/apub/src/activities/community/update.rs @@ -72,7 +72,6 @@ impl ActivityHandler for UpdateCommunity { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &self.cc)?; let community = self.community(context).await?; verify_person_in_community(&self.actor, &community, context).await?; @@ -83,6 +82,7 @@ impl ActivityHandler for UpdateCommunity { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let community = self.community(context).await?; let community_update_form = self.object.into_update_form(); diff --git a/crates/apub/src/activities/create_or_update/comment.rs b/crates/apub/src/activities/create_or_update/comment.rs index e162709ba..c8d9a017e 100644 --- a/crates/apub/src/activities/create_or_update/comment.rs +++ b/crates/apub/src/activities/create_or_update/comment.rs @@ -115,7 +115,6 @@ impl ActivityHandler for CreateOrUpdateNote { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &self.cc)?; let post = self.object.get_parents(context).await?.0; let community = self.community(context).await?; @@ -131,6 +130,7 @@ impl ActivityHandler for CreateOrUpdateNote { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; // Need to do this check here instead of Note::from_json because we need the person who // send the activity, not the comment author. let existing_comment = self.object.id.dereference_local(context).await.ok(); diff --git a/crates/apub/src/activities/create_or_update/post.rs b/crates/apub/src/activities/create_or_update/post.rs index 5d58834e6..8b2fdbdb4 100644 --- a/crates/apub/src/activities/create_or_update/post.rs +++ b/crates/apub/src/activities/create_or_update/post.rs @@ -105,7 +105,6 @@ impl ActivityHandler for CreateOrUpdatePage { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_is_public(&self.to, &self.cc)?; let community = self.community(context).await?; verify_person_in_community(&self.actor, &community, context).await?; @@ -140,6 +139,7 @@ impl ActivityHandler for CreateOrUpdatePage { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let post = ApubPost::from_json(self.object, context).await?; // author likes their own post by default diff --git a/crates/apub/src/activities/create_or_update/private_message.rs b/crates/apub/src/activities/create_or_update/private_message.rs index 74f833051..f3ea3ca26 100644 --- a/crates/apub/src/activities/create_or_update/private_message.rs +++ b/crates/apub/src/activities/create_or_update/private_message.rs @@ -58,7 +58,6 @@ impl ActivityHandler for CreateOrUpdateChatMessage { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_person(&self.actor, context).await?; verify_domains_match(self.actor.inner(), self.object.id.inner())?; verify_domains_match(self.to[0].inner(), self.object.to[0].inner())?; @@ -68,6 +67,7 @@ impl ActivityHandler for CreateOrUpdateChatMessage { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; ApubPrivateMessage::from_json(self.object, context).await?; Ok(()) } diff --git a/crates/apub/src/activities/deletion/delete.rs b/crates/apub/src/activities/deletion/delete.rs index fa28f3721..875dc9e89 100644 --- a/crates/apub/src/activities/deletion/delete.rs +++ b/crates/apub/src/activities/deletion/delete.rs @@ -43,13 +43,13 @@ impl ActivityHandler for Delete { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_delete_activity(self, self.summary.is_some(), context).await?; Ok(()) } #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; if let Some(reason) = self.summary { // We set reason to empty string if it doesn't exist, to distinguish between delete and // remove. Here we change it back to option, so we don't write it to db. diff --git a/crates/apub/src/activities/deletion/undo_delete.rs b/crates/apub/src/activities/deletion/undo_delete.rs index 0eec3748c..558d72b57 100644 --- a/crates/apub/src/activities/deletion/undo_delete.rs +++ b/crates/apub/src/activities/deletion/undo_delete.rs @@ -42,7 +42,6 @@ impl ActivityHandler for UndoDelete { } async fn verify(&self, data: &Data) -> Result<(), Self::Error> { - insert_received_activity(&self.id, data).await?; self.object.verify(data).await?; verify_delete_activity(&self.object, self.object.summary.is_some(), data).await?; Ok(()) @@ -50,6 +49,7 @@ impl ActivityHandler for UndoDelete { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; if self.object.summary.is_some() { UndoDelete::receive_undo_remove_action( &self.actor.dereference(context).await?, diff --git a/crates/apub/src/activities/following/accept.rs b/crates/apub/src/activities/following/accept.rs index 381b05930..efecef7f1 100644 --- a/crates/apub/src/activities/following/accept.rs +++ b/crates/apub/src/activities/following/accept.rs @@ -53,7 +53,6 @@ impl ActivityHandler for AcceptFollow { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_urls_match(self.actor.inner(), self.object.object.inner())?; self.object.verify(context).await?; if let Some(to) = &self.to { @@ -64,6 +63,7 @@ impl ActivityHandler for AcceptFollow { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let community = self.actor.dereference(context).await?; let person = self.object.actor.dereference(context).await?; // This will throw an error if no follow was requested diff --git a/crates/apub/src/activities/following/follow.rs b/crates/apub/src/activities/following/follow.rs index 2b439f1f5..78c2b9ed3 100644 --- a/crates/apub/src/activities/following/follow.rs +++ b/crates/apub/src/activities/following/follow.rs @@ -77,7 +77,6 @@ impl ActivityHandler for Follow { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_person(&self.actor, context).await?; let object = self.object.dereference(context).await?; if let UserOrCommunity::Community(c) = object { @@ -91,6 +90,7 @@ impl ActivityHandler for Follow { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let actor = self.actor.dereference(context).await?; let object = self.object.dereference(context).await?; match object { diff --git a/crates/apub/src/activities/following/undo_follow.rs b/crates/apub/src/activities/following/undo_follow.rs index 2f1c5a76b..90dd452f2 100644 --- a/crates/apub/src/activities/following/undo_follow.rs +++ b/crates/apub/src/activities/following/undo_follow.rs @@ -65,7 +65,6 @@ impl ActivityHandler for UndoFollow { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; verify_urls_match(self.actor.inner(), self.object.actor.inner())?; verify_person(&self.actor, context).await?; self.object.verify(context).await?; @@ -77,6 +76,7 @@ impl ActivityHandler for UndoFollow { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let person = self.actor.dereference(context).await?; let object = self.object.object.dereference(context).await?; diff --git a/crates/apub/src/activities/voting/undo_vote.rs b/crates/apub/src/activities/voting/undo_vote.rs index 9616c651f..f83055620 100644 --- a/crates/apub/src/activities/voting/undo_vote.rs +++ b/crates/apub/src/activities/voting/undo_vote.rs @@ -57,7 +57,6 @@ impl ActivityHandler for UndoVote { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; let community = self.community(context).await?; verify_person_in_community(&self.actor, &community, context).await?; verify_urls_match(self.actor.inner(), self.object.actor.inner())?; @@ -67,6 +66,7 @@ impl ActivityHandler for UndoVote { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let actor = self.actor.dereference(context).await?; let object = self.object.object.dereference(context).await?; match object { diff --git a/crates/apub/src/activities/voting/vote.rs b/crates/apub/src/activities/voting/vote.rs index 3dfd46fbf..e15c3882b 100644 --- a/crates/apub/src/activities/voting/vote.rs +++ b/crates/apub/src/activities/voting/vote.rs @@ -56,7 +56,6 @@ impl ActivityHandler for Vote { #[tracing::instrument(skip_all)] async fn verify(&self, context: &Data) -> Result<(), LemmyError> { - insert_received_activity(&self.id, context).await?; let community = self.community(context).await?; verify_person_in_community(&self.actor, &community, context).await?; let enable_downvotes = LocalSite::read(&mut context.pool()) @@ -72,6 +71,7 @@ impl ActivityHandler for Vote { #[tracing::instrument(skip_all)] async fn receive(self, context: &Data) -> Result<(), LemmyError> { + insert_received_activity(&self.id, context).await?; let actor = self.actor.dereference(context).await?; let object = self.object.dereference(context).await?; diff --git a/crates/utils/translations b/crates/utils/translations index e2cc2912d..2139975ef 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit e2cc2912dac3f74959a934ad66ec833a04e847ae +Subproject commit 2139975ef383077e4709a4f2cae42922fd63b860 From 1be7dbde3379ea9ac4da49c6cc287f563ce08572 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Mon, 15 Jan 2024 15:33:39 +0100 Subject: [PATCH 06/12] Count chars, not bytes for max title length (fixes #4366) (#4367) * Count chars, not bytes for max title length (fixes #4366) * fix api test --- api_tests/src/post.spec.ts | 7 ++++++- api_tests/src/shared.ts | 4 ++-- crates/utils/src/utils/validation.rs | 6 +++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/api_tests/src/post.spec.ts b/api_tests/src/post.spec.ts index 72029157d..780160c39 100644 --- a/api_tests/src/post.spec.ts +++ b/api_tests/src/post.spec.ts @@ -76,7 +76,12 @@ test("Create a post", async () => { throw "Missing beta community"; } - let postRes = await createPost(alpha, betaCommunity.community.id); + let postRes = await createPost( + alpha, + betaCommunity.community.id, + "https://example.com/", + "აშშ ითხოვს ირანს დაუყოვნებლივ გაანთავისუფლოს დაკავებული ნავთობის ტანკერი", + ); expect(postRes.post_view.post).toBeDefined(); expect(postRes.post_view.community.local).toBe(false); expect(postRes.post_view.creator.local).toBe(true); diff --git a/api_tests/src/shared.ts b/api_tests/src/shared.ts index 9a2d45075..13b07c9b7 100644 --- a/api_tests/src/shared.ts +++ b/api_tests/src/shared.ts @@ -202,10 +202,10 @@ export async function setupLogins() { export async function createPost( api: LemmyHttp, community_id: number, - // use example.com for consistent title and embed description url: string = "https://example.com/", + // use example.com for consistent title and embed description + name: string = randomString(5), ): Promise { - let name = randomString(5); let body = randomString(10); let form: CreatePost = { name, diff --git a/crates/utils/src/utils/validation.rs b/crates/utils/src/utils/validation.rs index bb4592fc5..0777ac6f8 100644 --- a/crates/utils/src/utils/validation.rs +++ b/crates/utils/src/utils/validation.rs @@ -147,7 +147,7 @@ pub fn is_valid_matrix_id(matrix_id: &str) -> LemmyResult<()> { } pub fn is_valid_post_title(title: &str) -> LemmyResult<()> { - let length = title.trim().len(); + let length = title.trim().chars().count(); let check = (3..=200).contains(&length) && !has_newline(title); if !check { Err(LemmyErrorType::InvalidPostTitle.into()) @@ -380,6 +380,10 @@ mod tests { #[test] fn test_valid_post_title() { assert!(is_valid_post_title("Post Title").is_ok()); + assert!(is_valid_post_title( + "აშშ ითხოვს ირანს დაუყოვნებლივ გაანთავისუფლოს დაკავებული ნავთობის ტანკერი" + ) + .is_ok()); assert!(is_valid_post_title(" POST TITLE 😃😃😃😃😃").is_ok()); assert!(is_valid_post_title("\n \n \n \n ").is_err()); // tabs/spaces/newlines } From b58da11fb7daaf986223509f81f6586d81f6da75 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 19 Jan 2024 15:40:12 +0100 Subject: [PATCH 07/12] Mark instance as alive after successful activity send (fixes #4039) (#4377) * Mark instance as alive after successful activity send (fixes #4039) * clippy * Instance::update * domain --------- Co-authored-by: Dessalines --- crates/db_schema/src/impls/instance.rs | 12 ++++++++++++ crates/federate/src/worker.rs | 20 ++++++++++++++++---- src/scheduled_tasks.rs | 5 +---- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/crates/db_schema/src/impls/instance.rs b/crates/db_schema/src/impls/instance.rs index 7d63c9ffa..c329d8cc0 100644 --- a/crates/db_schema/src/impls/instance.rs +++ b/crates/db_schema/src/impls/instance.rs @@ -64,6 +64,18 @@ impl Instance { e => e, } } + pub async fn update( + pool: &mut DbPool<'_>, + instance_id: InstanceId, + form: InstanceForm, + ) -> Result { + let mut conn = get_conn(pool).await?; + diesel::update(instance::table.find(instance_id)) + .set(form) + .execute(&mut conn) + .await + } + pub async fn delete(pool: &mut DbPool<'_>, instance_id: InstanceId) -> Result { let conn = &mut get_conn(pool).await?; diesel::delete(instance::table.find(instance_id)) diff --git a/crates/federate/src/worker.rs b/crates/federate/src/worker.rs index e53a42bc3..b57c5e8ae 100644 --- a/crates/federate/src/worker.rs +++ b/crates/federate/src/worker.rs @@ -11,7 +11,7 @@ use activitypub_federation::{ protocol::context::WithContext, }; use anyhow::{Context, Result}; -use chrono::{DateTime, TimeZone, Utc}; +use chrono::{DateTime, Days, TimeZone, Utc}; use lemmy_api_common::{context::LemmyContext, federate_retry_sleep_duration}; use lemmy_apub::{activity_lists::SharedInboxActivities, FEDERATION_CONTEXT}; use lemmy_db_schema::{ @@ -19,17 +19,17 @@ use lemmy_db_schema::{ source::{ activity::SentActivity, federation_queue_state::FederationQueueState, - instance::Instance, + instance::{Instance, InstanceForm}, site::Site, }, - utils::DbPool, + utils::{naive_now, DbPool}, }; use lemmy_db_views_actor::structs::CommunityFollowerView; use once_cell::sync::Lazy; use reqwest::Url; use std::{ collections::{HashMap, HashSet}, - ops::Deref, + ops::{Add, Deref}, time::Duration, }; use tokio::{sync::mpsc::UnboundedSender, time::sleep}; @@ -257,6 +257,18 @@ impl InstanceWorker { } } } + + // Activity send successful, mark instance as alive if it hasn't been updated in a while. + let updated = self.instance.updated.unwrap_or(self.instance.published); + if updated.add(Days::new(1)) < Utc::now() { + self.instance.updated = Some(Utc::now()); + + let form = InstanceForm::builder() + .domain(self.instance.domain.clone()) + .updated(Some(naive_now())) + .build(); + Instance::update(pool, self.instance.id, form).await?; + } } Ok(()) } diff --git a/src/scheduled_tasks.rs b/src/scheduled_tasks.rs index 05ff4b9e2..7433c9638 100644 --- a/src/scheduled_tasks.rs +++ b/src/scheduled_tasks.rs @@ -495,10 +495,7 @@ async fn update_instance_software( } }; if let Some(form) = form { - diesel::update(instance::table.find(instance.id)) - .set(form) - .execute(&mut conn) - .await?; + Instance::update(pool, instance.id, form).await?; } } info!("Finished updating instances software and versions..."); From 516db012bf2466c1f3e7b907decaec1eec22cb65 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 19 Jan 2024 16:41:05 +0100 Subject: [PATCH 08/12] Dont allow caching captcha response (#4381) Co-authored-by: Dessalines --- crates/api/src/local_user/get_captcha.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/crates/api/src/local_user/get_captcha.rs b/crates/api/src/local_user/get_captcha.rs index 5d692aa0c..3d93a793c 100644 --- a/crates/api/src/local_user/get_captcha.rs +++ b/crates/api/src/local_user/get_captcha.rs @@ -1,5 +1,13 @@ use crate::captcha_as_wav_base64; -use actix_web::web::{Data, Json}; +use actix_web::{ + http::{ + header::{CacheControl, CacheDirective}, + StatusCode, + }, + web::{Data, Json}, + HttpResponse, + HttpResponseBuilder, +}; use captcha::{gen, Difficulty}; use lemmy_api_common::{ context::LemmyContext, @@ -12,13 +20,13 @@ use lemmy_db_schema::source::{ use lemmy_utils::error::LemmyError; #[tracing::instrument(skip(context))] -pub async fn get_captcha( - context: Data, -) -> Result, LemmyError> { +pub async fn get_captcha(context: Data) -> Result { let local_site = LocalSite::read(&mut context.pool()).await?; + let mut res = HttpResponseBuilder::new(StatusCode::OK); + res.insert_header(CacheControl(vec![CacheDirective::NoStore])); if !local_site.captcha_enabled { - return Ok(Json(GetCaptchaResponse { ok: None })); + return Ok(res.json(Json(GetCaptchaResponse { ok: None }))); } let captcha = gen(match local_site.captcha_difficulty.as_str() { @@ -37,11 +45,12 @@ pub async fn get_captcha( // Stores the captcha item in the db let captcha = CaptchaAnswer::insert(&mut context.pool(), &captcha_form).await?; - Ok(Json(GetCaptchaResponse { + let json = Json(GetCaptchaResponse { ok: Some(CaptchaResponse { png, wav, uuid: captcha.uuid.to_string(), }), - })) + }); + Ok(res.json(json)) } From 3d6f7ff911f287e49407391460dfd459b2d9e912 Mon Sep 17 00:00:00 2001 From: Nutomic Date: Fri, 19 Jan 2024 17:21:43 +0100 Subject: [PATCH 09/12] Revert "Dont ignore errors during login (fixes #4319) (#4321)" (#4380) This reverts commit 4163e0465e11ae78c0c0d9931205179605637590. Co-authored-by: Dessalines --- api_tests/src/user.spec.ts | 13 +++++------ crates/api/src/lib.rs | 22 ++++++++++++++++-- crates/api/src/local_user/validate_auth.rs | 10 ++++----- crates/api_common/src/claims.rs | 5 +++-- crates/routes/src/lib.rs | 6 ++--- src/session_middleware.rs | 26 +++++++++------------- 6 files changed, 45 insertions(+), 37 deletions(-) diff --git a/api_tests/src/user.spec.ts b/api_tests/src/user.spec.ts index 527ab74d4..ccfc5e1fe 100644 --- a/api_tests/src/user.spec.ts +++ b/api_tests/src/user.spec.ts @@ -112,19 +112,18 @@ test("Delete user", async () => { ).toBe(true); }); -test("Requests with invalid auth should throw error", async () => { +test("Requests with invalid auth should be treated as unauthenticated", async () => { let invalid_auth = new LemmyHttp(alphaUrl, { headers: { Authorization: "Bearer foobar" }, fetchFunction, }); - await expect(getSite(invalid_auth)).rejects.toStrictEqual( - Error("incorrect_login"), - ); + let site = await getSite(invalid_auth); + expect(site.my_user).toBeUndefined(); + expect(site.site_view).toBeDefined(); let form: GetPosts = {}; - await expect(invalid_auth.getPosts(form)).rejects.toStrictEqual( - Error("incorrect_login"), - ); + let posts = invalid_auth.getPosts(form); + expect((await posts).posts).toBeDefined(); }); test("Create user with Arabic name", async () => { diff --git a/crates/api/src/lib.rs b/crates/api/src/lib.rs index 7d85cc78f..faa74824e 100644 --- a/crates/api/src/lib.rs +++ b/crates/api/src/lib.rs @@ -2,11 +2,15 @@ use actix_web::{http::header::Header, HttpRequest}; use actix_web_httpauth::headers::authorization::{Authorization, Bearer}; use base64::{engine::general_purpose::STANDARD_NO_PAD as base64, Engine}; use captcha::Captcha; -use lemmy_api_common::utils::{local_site_to_slur_regex, AUTH_COOKIE_NAME}; +use lemmy_api_common::{ + claims::Claims, + context::LemmyContext, + utils::{check_user_valid, local_site_to_slur_regex, AUTH_COOKIE_NAME}, +}; use lemmy_db_schema::source::local_site::LocalSite; use lemmy_db_views::structs::LocalUserView; use lemmy_utils::{ - error::{LemmyError, LemmyErrorExt, LemmyErrorType, LemmyResult}, + error::{LemmyError, LemmyErrorExt, LemmyErrorExt2, LemmyErrorType, LemmyResult}, utils::slurs::check_slurs, }; use std::io::Cursor; @@ -137,6 +141,20 @@ pub(crate) fn build_totp_2fa( .with_lemmy_type(LemmyErrorType::CouldntGenerateTotp) } +#[tracing::instrument(skip_all)] +pub async fn local_user_view_from_jwt( + jwt: &str, + context: &LemmyContext, +) -> Result { + let local_user_id = Claims::validate(jwt, context) + .await + .with_lemmy_type(LemmyErrorType::NotLoggedIn)?; + let local_user_view = LocalUserView::read(&mut context.pool(), local_user_id).await?; + check_user_valid(&local_user_view.person)?; + + Ok(local_user_view) +} + #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] diff --git a/crates/api/src/local_user/validate_auth.rs b/crates/api/src/local_user/validate_auth.rs index 65c63e585..d95195dc9 100644 --- a/crates/api/src/local_user/validate_auth.rs +++ b/crates/api/src/local_user/validate_auth.rs @@ -1,10 +1,10 @@ -use crate::read_auth_token; +use crate::{local_user_view_from_jwt, read_auth_token}; use actix_web::{ web::{Data, Json}, HttpRequest, }; -use lemmy_api_common::{claims::Claims, context::LemmyContext, SuccessResponse}; -use lemmy_utils::error::{LemmyError, LemmyErrorExt2, LemmyErrorType}; +use lemmy_api_common::{context::LemmyContext, SuccessResponse}; +use lemmy_utils::error::{LemmyError, LemmyErrorType}; /// Returns an error message if the auth token is invalid for any reason. Necessary because other /// endpoints silently treat any call with invalid auth as unauthenticated. @@ -15,9 +15,7 @@ pub async fn validate_auth( ) -> Result, LemmyError> { let jwt = read_auth_token(&req)?; if let Some(jwt) = jwt { - Claims::validate(&jwt, &context) - .await - .with_lemmy_type(LemmyErrorType::NotLoggedIn)?; + local_user_view_from_jwt(&jwt, &context).await?; } else { Err(LemmyErrorType::NotLoggedIn)?; } diff --git a/crates/api_common/src/claims.rs b/crates/api_common/src/claims.rs index 58541af43..981b7fe14 100644 --- a/crates/api_common/src/claims.rs +++ b/crates/api_common/src/claims.rs @@ -6,7 +6,7 @@ use lemmy_db_schema::{ newtypes::LocalUserId, source::login_token::{LoginToken, LoginTokenCreateForm}, }; -use lemmy_utils::error::{LemmyErrorType, LemmyResult}; +use lemmy_utils::error::{LemmyErrorExt, LemmyErrorType, LemmyResult}; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] @@ -25,7 +25,8 @@ impl Claims { validation.required_spec_claims.remove("exp"); let jwt_secret = &context.secret().jwt_secret; let key = DecodingKey::from_secret(jwt_secret.as_ref()); - let claims = decode::(jwt, &key, &validation)?; + let claims = + decode::(jwt, &key, &validation).with_lemmy_type(LemmyErrorType::NotLoggedIn)?; let user_id = LocalUserId(claims.claims.sub.parse()?); let is_valid = LoginToken::validate(&mut context.pool(), user_id, jwt).await?; if !is_valid { diff --git a/crates/routes/src/lib.rs b/crates/routes/src/lib.rs index b1e97cd3c..ec28fda45 100644 --- a/crates/routes/src/lib.rs +++ b/crates/routes/src/lib.rs @@ -1,6 +1,6 @@ use lemmy_api_common::{claims::Claims, context::LemmyContext, utils::check_user_valid}; use lemmy_db_views::structs::LocalUserView; -use lemmy_utils::error::{LemmyError, LemmyErrorExt2, LemmyErrorType}; +use lemmy_utils::error::LemmyError; pub mod feeds; pub mod images; @@ -12,9 +12,7 @@ async fn local_user_view_from_jwt( jwt: &str, context: &LemmyContext, ) -> Result { - let local_user_id = Claims::validate(jwt, context) - .await - .with_lemmy_type(LemmyErrorType::NotLoggedIn)?; + let local_user_id = Claims::validate(jwt, context).await?; let local_user_view = LocalUserView::read(&mut context.pool(), local_user_id).await?; check_user_valid(&local_user_view.person)?; diff --git a/src/session_middleware.rs b/src/session_middleware.rs index ab7eb3d62..2c4e36913 100644 --- a/src/session_middleware.rs +++ b/src/session_middleware.rs @@ -7,14 +7,8 @@ use actix_web::{ }; use core::future::Ready; use futures_util::future::LocalBoxFuture; -use lemmy_api::read_auth_token; -use lemmy_api_common::{ - claims::Claims, - context::LemmyContext, - lemmy_db_views::structs::LocalUserView, - utils::check_user_valid, -}; -use lemmy_utils::error::{LemmyError, LemmyErrorExt2, LemmyErrorType}; +use lemmy_api::{local_user_view_from_jwt, read_auth_token}; +use lemmy_api_common::context::LemmyContext; use reqwest::header::HeaderValue; use std::{future::ready, rc::Rc}; @@ -73,14 +67,14 @@ where let jwt = read_auth_token(req.request())?; if let Some(jwt) = &jwt { - let local_user_id = Claims::validate(jwt, &context) - .await - .with_lemmy_type(LemmyErrorType::IncorrectLogin)?; - let local_user_view = LocalUserView::read(&mut context.pool(), local_user_id) - .await - .map_err(LemmyError::from)?; - check_user_valid(&local_user_view.person)?; - req.extensions_mut().insert(local_user_view); + // Ignore any invalid auth so the site can still be used + // TODO: this means it will be impossible to get any error message for invalid jwt. Need + // to add a separate endpoint for that. + // https://github.com/LemmyNet/lemmy/issues/3702 + let local_user_view = local_user_view_from_jwt(jwt, &context).await.ok(); + if let Some(local_user_view) = local_user_view { + req.extensions_mut().insert(local_user_view); + } } let mut res = svc.call(req).await?; From df11d77a0d0adcd596b4dc2a4ab80e7b1eea3ef1 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 19 Jan 2024 11:23:47 -0500 Subject: [PATCH 10/12] Updating translations. --- crates/utils/translations | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/utils/translations b/crates/utils/translations index 2139975ef..3c217c609 160000 --- a/crates/utils/translations +++ b/crates/utils/translations @@ -1 +1 @@ -Subproject commit 2139975ef383077e4709a4f2cae42922fd63b860 +Subproject commit 3c217c609aa8826fc725f708221c8b3eb825f41a From f652513030a6662aa08b7969faea321cc5a57976 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 19 Jan 2024 11:25:45 -0500 Subject: [PATCH 11/12] Version 0.19.3-rc.1 --- Cargo.lock | 24 ++++++++++++------------ Cargo.toml | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b20f49201..476c1c10a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2529,7 +2529,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lemmy_api" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "activitypub_federation", "actix-web", @@ -2558,7 +2558,7 @@ dependencies = [ [[package]] name = "lemmy_api_common" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "activitypub_federation", "actix-web", @@ -2593,7 +2593,7 @@ dependencies = [ [[package]] name = "lemmy_api_crud" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "activitypub_federation", "actix-web", @@ -2615,7 +2615,7 @@ dependencies = [ [[package]] name = "lemmy_apub" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "activitypub_federation", "actix-web", @@ -2655,7 +2655,7 @@ dependencies = [ [[package]] name = "lemmy_db_schema" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "activitypub_federation", "async-trait", @@ -2692,7 +2692,7 @@ dependencies = [ [[package]] name = "lemmy_db_views" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "actix-web", "chrono", @@ -2712,7 +2712,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_actor" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "chrono", "diesel", @@ -2730,7 +2730,7 @@ dependencies = [ [[package]] name = "lemmy_db_views_moderator" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "diesel", "diesel-async", @@ -2742,7 +2742,7 @@ dependencies = [ [[package]] name = "lemmy_federate" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "activitypub_federation", "anyhow", @@ -2765,7 +2765,7 @@ dependencies = [ [[package]] name = "lemmy_routes" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "activitypub_federation", "actix-web", @@ -2789,7 +2789,7 @@ dependencies = [ [[package]] name = "lemmy_server" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "activitypub_federation", "actix-cors", @@ -2832,7 +2832,7 @@ dependencies = [ [[package]] name = "lemmy_utils" -version = "0.19.2" +version = "0.19.3-rc.1" dependencies = [ "actix-web", "anyhow", diff --git a/Cargo.toml b/Cargo.toml index 5395416a9..ca5813335 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "0.19.2" +version = "0.19.3-rc.1" edition = "2021" description = "A link aggregator for the fediverse" license = "AGPL-3.0" @@ -85,16 +85,16 @@ unused_self = "deny" unwrap_used = "deny" [workspace.dependencies] -lemmy_api = { version = "=0.19.2", path = "./crates/api" } -lemmy_api_crud = { version = "=0.19.2", path = "./crates/api_crud" } -lemmy_apub = { version = "=0.19.2", path = "./crates/apub" } -lemmy_utils = { version = "=0.19.2", path = "./crates/utils" } -lemmy_db_schema = { version = "=0.19.2", path = "./crates/db_schema" } -lemmy_api_common = { version = "=0.19.2", path = "./crates/api_common" } -lemmy_routes = { version = "=0.19.2", path = "./crates/routes" } -lemmy_db_views = { version = "=0.19.2", path = "./crates/db_views" } -lemmy_db_views_actor = { version = "=0.19.2", path = "./crates/db_views_actor" } -lemmy_db_views_moderator = { version = "=0.19.2", path = "./crates/db_views_moderator" } +lemmy_api = { version = "=0.19.3-rc.1", path = "./crates/api" } +lemmy_api_crud = { version = "=0.19.3-rc.1", path = "./crates/api_crud" } +lemmy_apub = { version = "=0.19.3-rc.1", path = "./crates/apub" } +lemmy_utils = { version = "=0.19.3-rc.1", path = "./crates/utils" } +lemmy_db_schema = { version = "=0.19.3-rc.1", path = "./crates/db_schema" } +lemmy_api_common = { version = "=0.19.3-rc.1", path = "./crates/api_common" } +lemmy_routes = { version = "=0.19.3-rc.1", path = "./crates/routes" } +lemmy_db_views = { version = "=0.19.3-rc.1", path = "./crates/db_views" } +lemmy_db_views_actor = { version = "=0.19.3-rc.1", path = "./crates/db_views_actor" } +lemmy_db_views_moderator = { version = "=0.19.3-rc.1", path = "./crates/db_views_moderator" } activitypub_federation = { version = "0.5.1-beta.1", default-features = false, features = [ "actix-web", ] } @@ -166,7 +166,7 @@ lemmy_utils = { workspace = true } lemmy_db_schema = { workspace = true } lemmy_api_common = { workspace = true } lemmy_routes = { workspace = true } -lemmy_federate = { version = "0.19.2", path = "crates/federate" } +lemmy_federate = { version = "0.19.3-rc.1", path = "crates/federate" } activitypub_federation = { workspace = true } diesel = { workspace = true } diesel-async = { workspace = true } From e78fe5a34c836c1637d9cef802ec6f1f818f3b16 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 22 Jan 2024 04:57:07 -0500 Subject: [PATCH 12/12] Removing group from woodpecker, as its deprecated. (#4387) * Removing group from woodpecker, as its deprecated. * Removing meltwater drone cache. --- .woodpecker.yml | 64 ------------------------------------------------- 1 file changed, 64 deletions(-) diff --git a/.woodpecker.yml b/.woodpecker.yml index 762fb0c7f..fc0ff08c9 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -39,25 +39,21 @@ steps: - git submodule update prettier_check: - group: format image: tmknom/prettier:3.0.0 commands: - prettier -c . '!**/volumes' '!**/dist' '!target' '!**/translations' toml_fmt: - group: format image: tamasfe/taplo:0.8.1 commands: - taplo format --check sql_fmt: - group: format image: backplane/pgformatter:latest commands: - ./scripts/sql_format_check.sh cargo_fmt: - group: format image: rustlang/rust:nightly environment: # store cargo data in repo folder so that it gets cached between steps @@ -67,7 +63,6 @@ steps: - cargo +nightly fmt -- --check cargo_machete: - group: format image: rustlang/rust:nightly commands: - wget https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz @@ -77,40 +72,12 @@ steps: - cargo machete ignored_files: - group: format image: alpine:3 commands: - apk add git - IGNORED=$(git ls-files --cached -i --exclude-standard) - if [[ "$IGNORED" ]]; then echo "Ignored files present:\n$IGNORED\n"; exit 1; fi - restore-cache: - image: meltwater/drone-cache:v1 - pull: true - settings: - restore: true - endpoint: - from_secret: MINIO_ENDPOINT - access-key: - from_secret: MINIO_WRITE_USER - secret-key: - from_secret: MINIO_WRITE_PASSWORD - bucket: - from_secret: MINIO_BUCKET - region: us-east-1 - cache_key: "rust-cache" - path-style: true - backend_operation_timeout: 30m - compression_level: 0 - exit_code: true - mount: - - ".cargo_home" - - "target" - - "api_tests/node_modules" - secrets: - [MINIO_ENDPOINT, MINIO_WRITE_USER, MINIO_WRITE_PASSWORD, MINIO_BUCKET] - when: *slow_check_paths - # make sure api builds with default features (used by other crates relying on lemmy api) check_api_common_default_features: image: *rust_image @@ -188,7 +155,6 @@ steps: when: *slow_check_paths cargo_test: - group: tests image: *rust_image environment: LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy @@ -200,7 +166,6 @@ steps: when: *slow_check_paths run_federation_tests: - group: tests image: node:20-bookworm-slim environment: LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432 @@ -213,35 +178,6 @@ steps: - yarn api-test when: *slow_check_paths - rebuild-cache: - image: meltwater/drone-cache:v1 - pull: true - settings: - rebuild: true - endpoint: - from_secret: MINIO_ENDPOINT - access-key: - from_secret: MINIO_WRITE_USER - secret-key: - from_secret: MINIO_WRITE_PASSWORD - bucket: - from_secret: MINIO_BUCKET - cache_key: "rust-cache" - region: us-east-1 - path-style: true - backend_operation_timeout: 60m - compression_level: 0 - exit_code: true - mount: - - ".cargo_home" - - "target" - - "api_tests/node_modules" - secrets: - [MINIO_ENDPOINT, MINIO_WRITE_USER, MINIO_WRITE_PASSWORD, MINIO_BUCKET] - when: - - event: push - branch: main - publish_release_docker: image: woodpeckerci/plugin-docker-buildx secrets: [docker_username, docker_password]