From 915b18789f002fa8f4c50fe1e626d34cc47c5c9b Mon Sep 17 00:00:00 2001 From: fiaxh Date: Fri, 13 Jun 2025 19:38:49 +0200 Subject: Disregard SFS fallback messages even without source attachment given a full-body fallback indication --- libdino/src/entity/message.vala | 2 +- libdino/src/service/stateless_file_sharing.vala | 6 ++++++ libdino/src/util/send_message.vala | 5 +++-- xmpp-vala/src/module/xep/0428_fallback_indication.vala | 7 +++---- xmpp-vala/src/module/xep/0447_stateless_file_sharing.vala | 10 ++++++++++ 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/libdino/src/entity/message.vala b/libdino/src/entity/message.vala index 7e15cfe4..4de17125 100644 --- a/libdino/src/entity/message.vala +++ b/libdino/src/entity/message.vala @@ -212,7 +212,7 @@ public class Message : Object { var fallbacks = new ArrayList(); foreach (string ns_uri in fallbacks_by_ns.keys) { - fallbacks.add(new Xep.FallbackIndication.Fallback(ns_uri, fallbacks_by_ns[ns_uri].to_array())); + fallbacks.add(new Xep.FallbackIndication.Fallback(ns_uri, fallbacks_by_ns[ns_uri])); } this.fallbacks = fallbacks; this.markups = markups; diff --git a/libdino/src/service/stateless_file_sharing.vala b/libdino/src/service/stateless_file_sharing.vala index 9d3c53ab..15e1ddfe 100644 --- a/libdino/src/service/stateless_file_sharing.vala +++ b/libdino/src/service/stateless_file_sharing.vala @@ -156,6 +156,12 @@ public class Dino.StatelessFileSharing : StreamInteractionModule, Object { return true; } } + + // Don't process messages that are fallback for legacy clients + if (Xep.StatelessFileSharing.is_sfs_fallback_message(stanza)) { + return true; + } + return false; } } diff --git a/libdino/src/util/send_message.vala b/libdino/src/util/send_message.vala index 8312cf17..c320bf7b 100644 --- a/libdino/src/util/send_message.vala +++ b/libdino/src/util/send_message.vala @@ -26,9 +26,10 @@ namespace Dino { out_message.body = fallback + out_message.body; // Store fallback location - var fallback_location = new Xep.FallbackIndication.FallbackLocation.partial_body(0, (int)fallback.char_count()); + var fallback_locations = new ArrayList(); + fallback_locations.add(new Xep.FallbackIndication.FallbackLocation.partial_body(0, (int)fallback.char_count())); var fallback_list = new ArrayList(); - fallback_list.add(new Xep.FallbackIndication.Fallback(Xep.Replies.NS_URI, new Xep.FallbackIndication.FallbackLocation[] { fallback_location })); + fallback_list.add(new Xep.FallbackIndication.Fallback(Xep.Replies.NS_URI, fallback_locations)); out_message.set_fallbacks(fallback_list); // Adjust markups to new prefix diff --git a/xmpp-vala/src/module/xep/0428_fallback_indication.vala b/xmpp-vala/src/module/xep/0428_fallback_indication.vala index 3cad689b..d07ec9be 100644 --- a/xmpp-vala/src/module/xep/0428_fallback_indication.vala +++ b/xmpp-vala/src/module/xep/0428_fallback_indication.vala @@ -6,10 +6,9 @@ namespace Xmpp.Xep.FallbackIndication { public class Fallback { public string ns_uri { get; set; } - public FallbackLocation[] locations; + public Gee.List locations; - - public Fallback(string ns_uri, FallbackLocation[] locations) { + public Fallback(string ns_uri, Gee.List locations) { this.ns_uri = ns_uri; this.locations = locations; } @@ -73,7 +72,7 @@ namespace Xmpp.Xep.FallbackIndication { } } if (locations.is_empty) continue; - ret.add(new Fallback(ns_uri, locations.to_array())); + ret.add(new Fallback(ns_uri, locations)); } return ret; diff --git a/xmpp-vala/src/module/xep/0447_stateless_file_sharing.vala b/xmpp-vala/src/module/xep/0447_stateless_file_sharing.vala index 63cab59f..86da6a3a 100644 --- a/xmpp-vala/src/module/xep/0447_stateless_file_sharing.vala +++ b/xmpp-vala/src/module/xep/0447_stateless_file_sharing.vala @@ -44,6 +44,16 @@ namespace Xmpp.Xep.StatelessFileSharing { return ret; } + public static bool is_sfs_fallback_message(MessageStanza message) { + Gee.List fallbacks = Xep.FallbackIndication.get_fallbacks(message); + foreach (var fallback in fallbacks) { + if (fallback.ns_uri == StatelessFileSharing.NS_URI && fallback.locations.any_match((it) => it.is_whole)) { + return true; + } + } + return false; + } + // Currently only returns a single http source private static Gee.List? get_sources(StanzaNode sources_node) { string? url = HttpSchemeForUrlData.get_url(sources_node); -- cgit v1.3