From 68bcc26ff611cf716e75aacd9427a73fd39a2fcc Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Tue, 16 Jun 2020 13:35:26 +0200 Subject: [PATCH] Fix community description federation (ref #647) Also disable the actor refetch interval in debug builds. --- docker/federation/Dockerfile | 2 +- server/src/apub/community.rs | 2 +- server/src/apub/fetcher.rs | 33 +++++++++++++++++++-------------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/docker/federation/Dockerfile b/docker/federation/Dockerfile index d8302ea7a..ec7bf2d22 100644 --- a/docker/federation/Dockerfile +++ b/docker/federation/Dockerfile @@ -1,4 +1,4 @@ -FROM ekidd/rust-musl-builder:1.38.0-openssl11 +FROM ekidd/rust-musl-builder:1.42.0-openssl11 USER root RUN mkdir /app/dist/documentation/ -p \ diff --git a/server/src/apub/community.rs b/server/src/apub/community.rs index 3752798f2..8c8c3b280 100644 --- a/server/src/apub/community.rs +++ b/server/src/apub/community.rs @@ -76,7 +76,7 @@ impl ToApub for Community { if let Some(d) = self.description.to_owned() { // TODO: this should be html, also add source field with raw markdown // -> same for post.content and others - oprops.set_summary_xsd_string(d)?; + oprops.set_content_xsd_string(d)?; } let mut endpoint_props = EndpointProperties::default(); diff --git a/server/src/apub/fetcher.rs b/server/src/apub/fetcher.rs index 05b7492ee..7f7a3f971 100644 --- a/server/src/apub/fetcher.rs +++ b/server/src/apub/fetcher.rs @@ -38,6 +38,9 @@ use crate::{ }, db::user_view::UserView, }; +use chrono::NaiveDateTime; + +static ACTOR_REFETCH_INTERVAL_SECONDS: i64 = 24 * 60 * 60; // Fetch nodeinfo metadata from a remote instance. fn _fetch_node_info(domain: &str) -> Result { @@ -166,14 +169,7 @@ pub fn get_or_fetch_and_upsert_remote_user( match User_::read_from_actor_id(&conn, &apub_id) { Ok(u) => { // If its older than a day, re-fetch it - if !u.local - && u - .last_refreshed_at - // TODO it won't pick up new avatars, summaries etc until a day after. - // Both user and community need an "update" action pushed to other servers - // to fix this - .lt(&(naive_now() - chrono::Duration::days(1))) - { + if !u.local && should_refetch_actor(u.last_refreshed_at) { debug!("Fetching and updating from remote user: {}", apub_id); let person = fetch_remote_object::(&Url::parse(apub_id)?)?; let mut uf = UserForm::from_apub(&person, &conn)?; @@ -193,6 +189,20 @@ pub fn get_or_fetch_and_upsert_remote_user( } } +/// Determines when a remote actor should be refetched from its instance. In release builds, this is +/// ACTOR_REFETCH_INTERVAL_SECONDS after the last refetch, in debug builds always. +/// +/// TODO it won't pick up new avatars, summaries etc until a day after. +/// Actors need an "update" activity pushed to other servers to fix this. +fn should_refetch_actor(last_refreshed: NaiveDateTime) -> bool { + if cfg!(debug_assertions) { + true + } else { + let update_interval = chrono::Duration::seconds(ACTOR_REFETCH_INTERVAL_SECONDS); + last_refreshed.lt(&(naive_now() - update_interval)) + } +} + /// Check if a remote community exists, create if not found, if its too old update it.Fetch a community, insert/update it in the database and return the community. pub fn get_or_fetch_and_upsert_remote_community( apub_id: &str, @@ -200,12 +210,7 @@ pub fn get_or_fetch_and_upsert_remote_community( ) -> Result { match Community::read_from_actor_id(&conn, &apub_id) { Ok(c) => { - // If its older than a day, re-fetch it - if !c.local - && c - .last_refreshed_at - .lt(&(naive_now() - chrono::Duration::days(1))) - { + if !c.local && should_refetch_actor(c.last_refreshed_at) { debug!("Fetching and updating from remote community: {}", apub_id); let group = fetch_remote_object::(&Url::parse(apub_id)?)?; let mut cf = CommunityForm::from_apub(&group, conn)?;