diff options
Diffstat (limited to 'xmpp-vala/src')
| -rw-r--r-- | xmpp-vala/src/module/xep/0045_muc/module.vala | 62 | ||||
| -rw-r--r-- | xmpp-vala/src/module/xep/0272_muji.vala | 2 | ||||
| -rw-r--r-- | xmpp-vala/src/module/xep/0463_muc_affiliations_versioning.vala | 24 |
3 files changed, 70 insertions, 18 deletions
diff --git a/xmpp-vala/src/module/xep/0045_muc/module.vala b/xmpp-vala/src/module/xep/0045_muc/module.vala index 88ff819f..bdaabb3e 100644 --- a/xmpp-vala/src/module/xep/0045_muc/module.vala +++ b/xmpp-vala/src/module/xep/0045_muc/module.vala @@ -2,10 +2,10 @@ using Gee; namespace Xmpp.Xep.Muc { -private const string NS_URI = "http://jabber.org/protocol/muc"; +public const string NS_URI = "http://jabber.org/protocol/muc"; private const string NS_URI_ADMIN = NS_URI + "#admin"; private const string NS_URI_OWNER = NS_URI + "#owner"; -private const string NS_URI_USER = NS_URI + "#user"; +public const string NS_URI_USER = NS_URI + "#user"; private const string NS_URI_REQUEST = NS_URI + "#request"; public enum MucEnterError { @@ -69,8 +69,7 @@ public class JoinResult { public class Module : XmppStreamModule { public static ModuleIdentity<Module> IDENTITY = new ModuleIdentity<Module>(NS_URI, "0045_muc_module"); - public signal void received_occupant_affiliation(XmppStream stream, Jid jid, Affiliation? affiliation); - public signal void received_occupant_jid(XmppStream stream, Jid jid, Jid? real_jid); + public signal void received_affiliations(XmppStream stream, Jid muc_jid, HashMap<Jid, Affiliation> affiliations, string? mav_since, string? mav_until); public signal void received_occupant_role(XmppStream stream, Jid jid, Role? role); public signal void subject_set(XmppStream stream, string? subject, Jid jid); public signal void invite_received(XmppStream stream, Jid room_jid, Jid from_jid, string? password, string? reason); @@ -86,7 +85,7 @@ public class Module : XmppStreamModule { received_pipeline_listener = new ReceivedPipelineListener(this); } - public async JoinResult? enter(XmppStream stream, Jid bare_jid, string nick, string? password, DateTime? history_since, bool receive_history, StanzaNode? additional_node) { + public async JoinResult? enter(XmppStream stream, Jid bare_jid, string nick, string? password, DateTime? history_since, bool receive_history, StanzaNode? additional_node, string? mav_since) { try { Presence.Stanza presence = new Presence.Stanza(); presence.to = bare_jid.with_resource(nick); @@ -105,6 +104,8 @@ public class Module : XmppStreamModule { history_node.set_attribute("maxchars", "0"); } } + x_node.put_node(Xep.MucAffiliationsVersioning.get_join_presence_node(mav_since)); + presence.stanza.put_node(x_node); if (additional_node != null) { @@ -360,11 +361,6 @@ public class Module : XmppStreamModule { query_room_info.begin(stream, bare_jid); - // TODO only query that if we actually have the rights to - query_affiliation.begin(stream, bare_jid, "member"); - query_affiliation.begin(stream, bare_jid, "admin"); - query_affiliation.begin(stream, bare_jid, "owner"); - flag.finish_muc_enter(bare_jid); var join_result = new JoinResult() { nick=presence.from.resourcepart, newly_created=status_codes.contains(StatusCode.NEW_ROOM_CREATED) }; flag.enter_futures[bare_jid].set_value(join_result); @@ -377,17 +373,22 @@ public class Module : XmppStreamModule { if (affiliation_str != null) { affiliation = parse_affiliation(affiliation_str); flag.set_affiliation(presence.from.bare_jid, presence.from, affiliation); - received_occupant_affiliation(stream, presence.from, affiliation); } string? jid_ = x_node.get_deep_attribute("item", "jid"); if (jid_ != null) { try { - Jid jid = new Jid(jid_); - flag.set_real_jid(presence.from, jid); + Jid real_jid = new Jid(jid_); + flag.set_real_jid(presence.from, real_jid); if (affiliation != null) { - stream.get_flag(Flag.IDENTITY).set_offline_member(presence.from, jid, affiliation); + stream.get_flag(Flag.IDENTITY).set_offline_member(presence.from, real_jid, affiliation); + var affiliations = new HashMap<Jid, Affiliation>(); + affiliations[real_jid.bare_jid] = affiliation; + + string? mav_since = MucAffiliationsVersioning.get_mav_since(x_node); + string? mav_until = MucAffiliationsVersioning.get_mav_until(x_node); + + received_affiliations(stream, presence.from.bare_jid, affiliations, mav_since, mav_until); } - received_occupant_jid(stream, presence.from, jid); } catch (InvalidJidError e) { warning("Received invalid occupant jid: %s", e.message); } @@ -468,6 +469,12 @@ public class Module : XmppStreamModule { room_info_updated(stream, jid); } + public async void fetch_affiliations(XmppStream stream, Jid muc_jid) { + query_affiliation.begin(stream, muc_jid, "member"); + query_affiliation.begin(stream, muc_jid, "admin"); + yield query_affiliation(stream, muc_jid, "owner"); + } + private async Gee.List<Jid>? query_affiliation(XmppStream stream, Jid jid, string affiliation) { Iq.Stanza iq = new Iq.Stanza.get( new StanzaNode.build("query", NS_URI_ADMIN) @@ -492,7 +499,6 @@ public class Module : XmppStreamModule { Jid jid_ = new Jid(jid__); stream.get_flag(Flag.IDENTITY).set_offline_member(iq_result.from, jid_, parse_affiliation(affiliation_)); ret_jids.add(jid_); - received_occupant_jid(stream, iq_result.from, jid_); } catch (InvalidJidError e) { warning("Received invalid occupant jid: %s", e.message); } @@ -509,7 +515,7 @@ public class Module : XmppStreamModule { return ret; } - private static Affiliation parse_affiliation(string affiliation_str) { + public static Affiliation parse_affiliation(string affiliation_str) { Affiliation affiliation; switch (affiliation_str) { case "admin": @@ -559,6 +565,7 @@ public class ReceivedPipelineListener : StanzaListener<MessageStanza> { if (message.type_ == MessageStanza.TYPE_NORMAL) { StanzaNode? x_node = message.stanza.get_subnode("x", NS_URI_USER); if (x_node != null) { + // Parse Invite StanzaNode? invite_node = x_node.get_subnode("invite", NS_URI_USER); string? password = null; StanzaNode? password_node = x_node.get_subnode("password", NS_URI_USER); @@ -580,6 +587,27 @@ public class ReceivedPipelineListener : StanzaListener<MessageStanza> { return true; } } + + // Parse affiliation update + Gee.List<StanzaNode> item_nodes = x_node.get_subnodes("item", Muc.NS_URI_USER); + if (item_nodes.size > 0) { + var affiliations = new HashMap<Jid, Affiliation>(); + foreach (StanzaNode item_node in item_nodes) { + string jid_str = item_node.get_attribute("jid", Muc.NS_URI_USER); + Jid real_jid = new Jid(jid_str); + string affiliation_str = item_node.get_attribute("affiliation", Muc.NS_URI_USER); + Muc.Affiliation affiliation = Muc.Module.parse_affiliation(affiliation_str); + + affiliations[real_jid] = affiliation; + + stream.get_flag(Flag.IDENTITY).set_offline_member(message.from, real_jid, affiliation); + } + + string? mav_since = MucAffiliationsVersioning.get_mav_since(x_node); + string? mav_until = MucAffiliationsVersioning.get_mav_until(x_node); + + outer.received_affiliations(stream, message.from, affiliations, mav_since, mav_until); + } } StanzaNode? x_field_node = message.stanza.get_subnode("x", DataForms.NS_URI); diff --git a/xmpp-vala/src/module/xep/0272_muji.vala b/xmpp-vala/src/module/xep/0272_muji.vala index 243ed93e..8226da10 100644 --- a/xmpp-vala/src/module/xep/0272_muji.vala +++ b/xmpp-vala/src/module/xep/0272_muji.vala @@ -15,7 +15,7 @@ namespace Xmpp.Xep.Muji { group_call.our_nick = "%08x".printf(Random.next_int()); debug(@"[%s] MUJI joining as %s", stream.get_flag(Bind.Flag.IDENTITY).my_jid.to_string(), group_call.our_nick); - Xep.Muc.JoinResult? result = yield stream.get_module(Muc.Module.IDENTITY).enter(stream, muc_jid, group_call.our_nick, null, null, false, initial_muji_node); + Xep.Muc.JoinResult? result = yield stream.get_module(Muc.Module.IDENTITY).enter(stream, muc_jid, group_call.our_nick, null, null, false, initial_muji_node, null); if (result == null || result.nick == null) return null; debug(@"[%s] MUJI joining as %s done", stream.get_flag(Bind.Flag.IDENTITY).my_jid.to_string(), group_call.our_nick); diff --git a/xmpp-vala/src/module/xep/0463_muc_affiliations_versioning.vala b/xmpp-vala/src/module/xep/0463_muc_affiliations_versioning.vala new file mode 100644 index 00000000..ba7edcb9 --- /dev/null +++ b/xmpp-vala/src/module/xep/0463_muc_affiliations_versioning.vala @@ -0,0 +1,24 @@ +using Gee; + +namespace Xmpp.Xep.MucAffiliationsVersioning { + + public const string NS_URI = "urn:xmpp:muc:affiliations:1"; + + public static StanzaNode get_join_presence_node(string? since) { + var stanza_node = new StanzaNode.build("mav", NS_URI).add_self_xmlns(); + if (since != null) { + stanza_node.put_attribute("since", since); + } + return stanza_node; + } + + public static string? get_mav_since(StanzaNode outer_node) { + StanzaNode? mav_node = outer_node.get_subnode("mav", MucAffiliationsVersioning.NS_URI); + return mav_node != null ? mav_node.get_attribute("since", MucAffiliationsVersioning.NS_URI) : null; + } + + public static string? get_mav_until(StanzaNode outer_node) { + StanzaNode? mav_node = outer_node.get_subnode("mav", MucAffiliationsVersioning.NS_URI); + return mav_node != null ? mav_node.get_attribute("until", MucAffiliationsVersioning.NS_URI) : null; + } +}
\ No newline at end of file |
