diff --git a/upub/cli/src/cloak.rs b/upub/cli/src/cloak.rs index 4a4f60b..3eebcc5 100644 --- a/upub/cli/src/cloak.rs +++ b/upub/cli/src/cloak.rs @@ -2,7 +2,7 @@ use futures::TryStreamExt; use sea_orm::{ActiveModelTrait, ActiveValue::{NotSet, Set, Unchanged}, ColumnTrait, Condition, EntityTrait, IntoActiveModel, QueryFilter, QuerySelect, SelectColumns}; use upub::traits::{fetch::RequestError, Cloaker}; -pub async fn cloak(ctx: upub::Context, post_contents: bool, actors: bool) -> Result<(), RequestError> { +pub async fn cloak(ctx: upub::Context, post_contents: bool, objects: bool, actors: bool) -> Result<(), RequestError> { let local_base = format!("{}%", ctx.base()); { let mut stream = upub::model::attachment::Entity::find() @@ -21,25 +21,23 @@ pub async fn cloak(ctx: upub::Context, post_contents: bool, actors: bool) -> Res if post_contents { let mut stream = upub::model::object::Entity::find() - .filter(upub::model::object::Column::Content.like("%() .stream(ctx.db()) .await?; - while let Some((internal, content)) = stream.try_next().await? { - let sanitized = ctx.sanitize(&content); - if sanitized != content { - tracing::info!("sanitizing object #{internal}"); - let model = upub::model::object::ActiveModel { - internal: Unchanged(internal), - content: Set(Some(sanitized)), - ..Default::default() - }; - model.update(ctx.db()).await?; - } + while let Some((internal, image)) = stream.try_next().await? { + tracing::info!("cloaking object image {image}"); + let model = upub::model::object::ActiveModel { + internal: Unchanged(internal), + image: Set(Some(ctx.cloaked(&image))), + ..Default::default() + }; + model.update(ctx.db()).await?; } } @@ -59,6 +57,7 @@ pub async fn cloak(ctx: upub::Context, post_contents: bool, actors: bool) -> Res .await?; while let Some((internal, image, icon)) = stream.try_next().await? { + tracing::info!("cloaking user #{internal}"); if image.is_none() && icon.is_none() { continue } // TODO can this if/else/else be made nicer?? let image = if let Some(img) = image { @@ -88,5 +87,29 @@ pub async fn cloak(ctx: upub::Context, post_contents: bool, actors: bool) -> Res } } + if post_contents { + let mut stream = upub::model::object::Entity::find() + .filter(upub::model::object::Column::Content.like("%() + .stream(ctx.db()) + .await?; + + while let Some((internal, content)) = stream.try_next().await? { + let sanitized = ctx.sanitize(&content); + if sanitized != content { + tracing::info!("sanitizing object #{internal}"); + let model = upub::model::object::ActiveModel { + internal: Unchanged(internal), + content: Set(Some(sanitized)), + ..Default::default() + }; + model.update(ctx.db()).await?; + } + } + } + Ok(()) } diff --git a/upub/cli/src/lib.rs b/upub/cli/src/lib.rs index 84f3ed4..d96c29a 100644 --- a/upub/cli/src/lib.rs +++ b/upub/cli/src/lib.rs @@ -116,13 +116,17 @@ pub enum CliCommand { /// replaces all attachment urls with proxied local versions (only useful for old instances) Cloak { - /// also replace urls inside post contents + /// also cloak objects image urls #[arg(long, default_value_t = false)] - post_contents: bool, + objects: bool, /// also cloak actor images #[arg(long, default_value_t = false)] actors: bool, + + /// also replace urls inside post contents + #[arg(long, default_value_t = false)] + contents: bool, }, } @@ -145,7 +149,7 @@ pub async fn run(ctx: upub::Context, command: CliCommand) -> Result<(), Box Ok(thread(ctx).await?), - CliCommand::Cloak { post_contents, actors } => - Ok(cloak(ctx, post_contents, actors).await?), + CliCommand::Cloak { objects, actors, contents } => + Ok(cloak(ctx, contents, objects, actors).await?), } } diff --git a/upub/core/src/traits/normalize.rs b/upub/core/src/traits/normalize.rs index 07278e8..e214230 100644 --- a/upub/core/src/traits/normalize.rs +++ b/upub/core/src/traits/normalize.rs @@ -31,6 +31,10 @@ impl Normalizer for crate::Context { object_model.content = Some(self.sanitize(&content)); } + if let Some(image) = object_model.image { + object_model.image = Some(self.cloaked(&image)); + } + // fix context for remote posts // > if any link is broken or we get rate limited, the whole insertion fails which is // > kind of dumb. there should be a job system so this can be done in waves. or maybe there's