From 6fce0156861461cf35222b048e422db61898bb80 Mon Sep 17 00:00:00 2001 From: defanor Date: Thu, 23 Sep 2021 15:54:26 +0300 Subject: Handle XEP-0092: Software Version --- README | 1 + src/rexmpp.c | 17 +++++++++++++++-- src/rexmpp.h | 8 +++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/README b/README index 28ee230..fe4a62f 100644 --- a/README +++ b/README @@ -64,6 +64,7 @@ A rough roadmap: versioning and caching) [+] XEP-0030 v2.5: Service Discovery (replying to queries) [+] XEP-0115 v1.5: Entity Capabilities (including into initial presence) +[+] XEP-0092 v1.1: Software Version [+] XEP-0172 v1.1: User Nickname [+] XEP-0373 v0.6: OpenPGP for XMPP [+] XEP-0402 v1.1: PEP Native Bookmarks (autojoin conferences) diff --git a/src/rexmpp.c b/src/rexmpp.c index 85f971a..f2c0f9b 100644 --- a/src/rexmpp.c +++ b/src/rexmpp.c @@ -323,8 +323,8 @@ xmlNodePtr rexmpp_disco_info (rexmpp_t *s) { advanced one would adjust and/or extend them. */ s->disco_info = xmlNewNode(NULL, "identity"); xmlNewProp(s->disco_info, "category", "client"); - xmlNewProp(s->disco_info, "type", "console"); - xmlNewProp(s->disco_info, "name", "rexmpp"); + xmlNewProp(s->disco_info, "type", s->client_type); + xmlNewProp(s->disco_info, "name", s->client_name); prev = s->disco_info; cur = rexmpp_xml_feature("http://jabber.org/protocol/disco#info"); prev->next = cur; @@ -398,6 +398,9 @@ rexmpp_err_t rexmpp_init (rexmpp_t *s, #endif s->autojoin_bookmarked_mucs = 1; s->tls_policy = REXMPP_TLS_REQUIRE; + s->client_name = PACKAGE_NAME; + s->client_type = "console"; + s->client_version = PACKAGE_VERSION; s->send_buffer = NULL; s->send_queue = NULL; s->server_srv = NULL; @@ -1761,6 +1764,16 @@ rexmpp_err_t rexmpp_process_element (rexmpp_t *s, xmlNodePtr elem) { } } else if (rexmpp_xml_match(query, "urn:xmpp:ping", "ping")) { rexmpp_iq_reply(s, elem, "result", NULL); + } else if (rexmpp_xml_match(query, "jabber:iq:version", "query")) { + xmlNodePtr reply = xmlNewNode(NULL, "query"); + xmlNewNs(reply, "jabber:iq:version", NULL); + xmlNodePtr name = xmlNewNode(NULL, "name"); + xmlNodeAddContent(name, s->client_name); + xmlAddChild(reply, name); + xmlNodePtr version = xmlNewNode(NULL, "version"); + xmlNodeAddContent(version, s->client_version); + xmlAddChild(reply, version); + rexmpp_iq_reply(s, elem, "result", reply); } else { /* An unknown request. */ rexmpp_iq_reply(s, elem, "error", diff --git a/src/rexmpp.h b/src/rexmpp.h index 1fdfc28..dd9d22b 100644 --- a/src/rexmpp.h +++ b/src/rexmpp.h @@ -266,6 +266,9 @@ struct rexmpp int retrieve_openpgp_keys; /* XEP-0373 */ int autojoin_bookmarked_mucs; /* XEP-0402 */ enum tls_pol tls_policy; + const char *client_name; /* XEP-0030, XEP-0092 */ + const char *client_type; /* XEP-0030 */ + const char *client_version; /* XEP-0092 */ /* Resource limits. */ uint32_t stanza_queue_size; @@ -310,11 +313,6 @@ struct rexmpp time_t last_network_activity; /* DNS-related structures. */ - /* struct ub_ctx *resolver_ctx; */ - /* struct ub_result *server_srv; */ - /* int server_srv_cur; */ - /* struct ub_result *server_srv_tls; */ - /* int server_srv_tls_cur; */ rexmpp_dns_ctx_t resolver; rexmpp_dns_result_t *server_srv; int server_srv_cur; -- cgit v1.2.3