summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2020-11-29 20:18:46 +0300
committerdefanor <defanor@uberspace.net>2020-11-29 20:18:46 +0300
commit3bcb471cf3fbe628e33ca4c2ab1419f8790499bb (patch)
tree8c149371e4097f4c4d90e3338012c8d2e92dcec9
parentff1dad7ec8717a3cf4a798daff9f025964c660f5 (diff)
Assign random instead of sequential stanza IDs
-rw-r--r--src/rexmpp.c22
-rw-r--r--src/rexmpp.h1
2 files changed, 17 insertions, 6 deletions
diff --git a/src/rexmpp.c b/src/rexmpp.c
index 13b8c00..2594089 100644
--- a/src/rexmpp.c
+++ b/src/rexmpp.c
@@ -413,7 +413,6 @@ rexmpp_err_t rexmpp_init (rexmpp_t *s, const char *jid)
s->active_iq = NULL;
s->tls_session_data = NULL;
s->tls_session_data_size = 0;
- s->id_counter = 0;
s->reconnect_number = 0;
s->next_reconnect_time.tv_sec = 0;
s->next_reconnect_time.tv_usec = 0;
@@ -659,10 +658,23 @@ const char *jid_bare_to_host (const char *jid_bare) {
}
xmlNodePtr rexmpp_xml_add_id (rexmpp_t *s, xmlNodePtr node) {
- char buf[11];
- snprintf(buf, 11, "%u", s->id_counter);
- s->id_counter++;
- xmlNewProp(node, "id", buf);
+ int sasl_err;
+ char buf_raw[18], *buf_base64 = NULL;
+ size_t buf_base64_len = 0;
+ sasl_err = gsasl_nonce(buf_raw, 18);
+ if (sasl_err != GSASL_OK) {
+ rexmpp_log(s, LOG_ERR, "Random generation failure: %s",
+ gsasl_strerror(sasl_err));
+ return NULL;
+ }
+ sasl_err = gsasl_base64_to(buf_raw, 18, &buf_base64, &buf_base64_len);
+ if (sasl_err != GSASL_OK) {
+ rexmpp_log(s, LOG_ERR, "Base-64 encoding failure: %s",
+ gsasl_strerror(sasl_err));
+ return NULL;
+ }
+ xmlNewProp(node, "id", buf_base64);
+ free(buf_base64);
return node;
}
diff --git a/src/rexmpp.h b/src/rexmpp.h
index 570cab1..bd6f8cb 100644
--- a/src/rexmpp.h
+++ b/src/rexmpp.h
@@ -280,7 +280,6 @@ struct rexmpp
rexmpp_iq_t *active_iq;
/* Connection and stream management. */
- unsigned int id_counter;
unsigned int reconnect_number;
time_t reconnect_seconds;
struct timeval next_reconnect_time;