aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdino/src/entity/message.vala2
-rw-r--r--libdino/src/service/stateless_file_sharing.vala6
-rw-r--r--libdino/src/util/send_message.vala5
-rw-r--r--xmpp-vala/src/module/xep/0428_fallback_indication.vala7
-rw-r--r--xmpp-vala/src/module/xep/0447_stateless_file_sharing.vala10
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<Xep.FallbackIndication.Fallback>();
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<Xep.FallbackIndication.FallbackLocation>();
+ fallback_locations.add(new Xep.FallbackIndication.FallbackLocation.partial_body(0, (int)fallback.char_count()));
var fallback_list = new ArrayList<Xep.FallbackIndication.Fallback>();
- 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<FallbackLocation> locations;
-
- public Fallback(string ns_uri, FallbackLocation[] locations) {
+ public Fallback(string ns_uri, Gee.List<FallbackLocation> 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<FallbackIndication.Fallback> 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<Source>? get_sources(StanzaNode sources_node) {
string? url = HttpSchemeForUrlData.get_url(sources_node);