summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2021-09-23 15:54:26 +0300
committerdefanor <defanor@uberspace.net>2021-09-23 15:54:26 +0300
commit6fce0156861461cf35222b048e422db61898bb80 (patch)
treee2198d39d462bfcd16da4a50001ab9046395d52c
parentb5dd7de9b2a82018e53e512da19dad319edd0afa (diff)
Handle XEP-0092: Software Version
-rw-r--r--README1
-rw-r--r--src/rexmpp.c17
-rw-r--r--src/rexmpp.h8
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;