From 7cf612f9f8437fd95f107553f83a04fb4004584d Mon Sep 17 00:00:00 2001 From: Eana Hufwe Date: Wed, 5 Jun 2024 20:30:41 +0000 Subject: [PATCH] fix(backend-rs): update padding logic to accomodate non-ASCII payload --- packages/backend-rs/src/service/push_notification.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/backend-rs/src/service/push_notification.rs b/packages/backend-rs/src/service/push_notification.rs index 1335c11d48..7361096d82 100644 --- a/packages/backend-rs/src/service/push_notification.rs +++ b/packages/backend-rs/src/service/push_notification.rs @@ -136,8 +136,9 @@ async fn encode_mastodon_payload( serde_json::to_value(token.token)?, ); - // Some apps expect notification_id to be an integer, but never use it. - if ["IceCubesApp", "Mammoth", "feather", "MaserApp"].contains(&client.name.as_str()) { + // Some apps expect notification_id to be an integer, + // but doesn’t break when the ID doesn’t match the rest of API. + if ["IceCubesApp", "Mammoth", "feather", "MaserApp", "Metatext", "Feditext"].contains(&client.name.as_str()) { let timestamp = object .get("notification_id") .and_then(|id| id.as_str()) @@ -153,9 +154,11 @@ async fn encode_mastodon_payload( // Adding space paddings to the end of JSON payload to prevent // `esm` from adding null bytes payload which many Mastodon clients don’t support. // https://firefish.dev/firefish/firefish/-/merge_requests/10905#note_6733 - let padded_length = 126 + (res.len() + 1) / 128 * 128; + // not using {:padding_length$} directly on `res`` because we want the padding to be + // calculated based on the UTF-8 byte size of `res` instead of number of characters. + let padded_length = 126 + (res.len() + 1) / 128 * 128 - res.len(); - Ok(format!("{:padded_length$}", res)) + Ok(format!("{}{:padded_length$}", res, "")) } async fn handle_web_push_failure(