From 1ed63e99d9264dfae7e84167d8b56cf07b4643a4 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Tue, 28 Jul 2020 11:42:40 -0400 Subject: [PATCH] Fix post thumbnail_url to use full urls. Fixes #632 --- server/lemmy_db/src/community.rs | 5 +--- server/src/apub/post.rs | 11 ++------ server/src/code_migrations.rs | 43 ++++++++++++++++++++++++++++++-- server/src/lib.rs | 15 ++++++++++- 4 files changed, 58 insertions(+), 16 deletions(-) diff --git a/server/lemmy_db/src/community.rs b/server/lemmy_db/src/community.rs index 3a78d769d..c4930d793 100644 --- a/server/lemmy_db/src/community.rs +++ b/server/lemmy_db/src/community.rs @@ -133,10 +133,7 @@ impl Community { .get_result::(conn) } - fn community_mods_and_admins( - conn: &PgConnection, - community_id: i32, - ) -> Result, Error> { + fn community_mods_and_admins(conn: &PgConnection, community_id: i32) -> Result, Error> { use crate::{community_view::CommunityModeratorView, user_view::UserView}; let mut mods_and_admins: Vec = Vec::new(); mods_and_admins.append( diff --git a/server/src/apub/post.rs b/server/src/apub/post.rs index 9575a6c7c..85b472935 100644 --- a/server/src/apub/post.rs +++ b/server/src/apub/post.rs @@ -33,7 +33,7 @@ use lemmy_db::{ user::User_, Crud, }; -use lemmy_utils::{convert_datetime, get_apub_protocol_string, settings::Settings}; +use lemmy_utils::convert_datetime; use serde::Deserialize; use url::Url; @@ -114,15 +114,8 @@ impl ToApub for Post { } if let Some(thumbnail_url) = &self.thumbnail_url { - let full_url = format!( - "{}://{}/pictshare/{}", - get_apub_protocol_string(), - Settings::get().hostname, - thumbnail_url - ); - let mut image = Image::new(); - image.set_url(full_url); + image.set_url(thumbnail_url.to_string()); page.set_image(image.into_any_base()?); } diff --git a/server/src/code_migrations.rs b/server/src/code_migrations.rs index 7c85fefcb..a102faf07 100644 --- a/server/src/code_migrations.rs +++ b/server/src/code_migrations.rs @@ -1,6 +1,9 @@ // This is for db migrations that require code use crate::LemmyError; -use diesel::*; +use diesel::{ + sql_types::{Nullable, Text}, + *, +}; use lemmy_db::{ comment::Comment, community::{Community, CommunityForm}, @@ -10,7 +13,13 @@ use lemmy_db::{ user::{UserForm, User_}, Crud, }; -use lemmy_utils::{generate_actor_keypair, make_apub_endpoint, EndpointType}; +use lemmy_utils::{ + generate_actor_keypair, + get_apub_protocol_string, + make_apub_endpoint, + settings::Settings, + EndpointType, +}; use log::info; pub fn run_advanced_migrations(conn: &PgConnection) -> Result<(), LemmyError> { @@ -19,6 +28,7 @@ pub fn run_advanced_migrations(conn: &PgConnection) -> Result<(), LemmyError> { post_updates_2020_04_03(&conn)?; comment_updates_2020_04_03(&conn)?; private_message_updates_2020_05_05(&conn)?; + post_thumbnail_url_updates_2020_07_27(&conn)?; Ok(()) } @@ -188,3 +198,32 @@ fn private_message_updates_2020_05_05(conn: &PgConnection) -> Result<(), LemmyEr Ok(()) } + +fn post_thumbnail_url_updates_2020_07_27(conn: &PgConnection) -> Result<(), LemmyError> { + use lemmy_db::schema::post::dsl::*; + + info!("Running post_thumbnail_url_updates_2020_07_27"); + + let domain_prefix = format!( + "{}://{}/pictrs/image/", + get_apub_protocol_string(), + Settings::get().hostname + ); + + let incorrect_thumbnails = post.filter(thumbnail_url.not_like("http%")); + + // Prepend the rows with the update + let res = diesel::update(incorrect_thumbnails) + .set( + thumbnail_url.eq( + domain_prefix + .into_sql::>() + .concat(thumbnail_url), + ), + ) + .get_results::(conn)?; + + info!("{} Post thumbnail_url rows updated.", res.len()); + + Ok(()) +} diff --git a/server/src/lib.rs b/server/src/lib.rs index 4795cf01e..5dff2ccbd 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -31,6 +31,7 @@ pub mod websocket; use crate::request::{retry, RecvError}; use actix_web::{client::Client, dev::ConnectionInfo}; +use lemmy_utils::{get_apub_protocol_string, settings::Settings}; use log::error; use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; use serde::Deserialize; @@ -140,7 +141,7 @@ async fn fetch_iframely_and_pictrs_data( }; // Fetch pictrs thumbnail - let pictrs_thumbnail = match iframely_thumbnail_url { + let pictrs_hash = match iframely_thumbnail_url { Some(iframely_thumbnail_url) => match fetch_pictrs(client, &iframely_thumbnail_url).await { Ok(res) => Some(res.files[0].file.to_owned()), Err(e) => { @@ -158,6 +159,18 @@ async fn fetch_iframely_and_pictrs_data( }, }; + // The full urls are necessary for federation + let pictrs_thumbnail = if let Some(pictrs_hash) = pictrs_hash { + Some(format!( + "{}://{}/pictrs/image/{}", + get_apub_protocol_string(), + Settings::get().hostname, + pictrs_hash + )) + } else { + None + }; + ( iframely_title, iframely_description,