about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/xmpp/capabilities.c16
-rw-r--r--src/xmpp/capabilities.h1
-rw-r--r--src/xmpp/stanza.c3
3 files changed, 18 insertions, 2 deletions
diff --git a/src/xmpp/capabilities.c b/src/xmpp/capabilities.c
index 99e8d56c..645eed68 100644
--- a/src/xmpp/capabilities.c
+++ b/src/xmpp/capabilities.c
@@ -49,12 +49,15 @@
 #include "xmpp/xmpp.h"
 #include "xmpp/stanza.h"
 #include "xmpp/form.h"
+#include "xmpp/capabilities.h"
 
 static gchar *cache_loc;
 static GKeyFile *cache;
 
 static GHashTable *jid_lookup;
 
+static char *my_sha1;
+
 static void _caps_destroy(Capabilities *caps);
 static gchar* _get_cache_file(void);
 static void _save_cache(void);
@@ -71,6 +74,8 @@ caps_init(void)
         NULL);
 
     jid_lookup = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+
+    my_sha1 = NULL;
 }
 
 void
@@ -425,6 +430,17 @@ caps_create(xmpp_stanza_t *query)
     return new_caps;
 }
 
+char*
+caps_get_my_sha1(xmpp_ctx_t * const ctx)
+{
+    if (my_sha1 == NULL) {
+        xmpp_stanza_t *query = caps_create_query_response_stanza(ctx);
+        my_sha1 = caps_create_sha1_str(query);
+        xmpp_stanza_release(query);
+    }
+
+    return my_sha1;
+}
 
 xmpp_stanza_t *
 caps_create_query_response_stanza(xmpp_ctx_t * const ctx)
diff --git a/src/xmpp/capabilities.h b/src/xmpp/capabilities.h
index bb8b92af..a43b301d 100644
--- a/src/xmpp/capabilities.h
+++ b/src/xmpp/capabilities.h
@@ -46,5 +46,6 @@ gboolean caps_contains(const char * const caps_ver);
 char* caps_create_sha1_str(xmpp_stanza_t * const query);
 xmpp_stanza_t* caps_create_query_response_stanza(xmpp_ctx_t * const ctx);
 Capabilities* caps_create(xmpp_stanza_t *query);
+char* caps_get_my_sha1(xmpp_ctx_t * const ctx);
 
 #endif
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index 1a962c53..2d99c0f0 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -1198,14 +1198,13 @@ stanza_attach_caps(xmpp_ctx_t * const ctx, xmpp_stanza_t * const presence)
     xmpp_stanza_set_ns(caps, STANZA_NS_CAPS);
     xmpp_stanza_t *query = caps_create_query_response_stanza(ctx);
 
-    char *sha1 = caps_create_sha1_str(query);
+    char *sha1 = caps_get_my_sha1(ctx);
     xmpp_stanza_set_attribute(caps, STANZA_ATTR_HASH, "sha-1");
     xmpp_stanza_set_attribute(caps, STANZA_ATTR_NODE, "http://www.profanity.im");
     xmpp_stanza_set_attribute(caps, STANZA_ATTR_VER, sha1);
     xmpp_stanza_add_child(presence, caps);
     xmpp_stanza_release(caps);
     xmpp_stanza_release(query);
-    g_free(sha1);
 }
 
 const char *