diff options
author | James Booth <boothj5@gmail.com> | 2013-01-20 17:16:45 +0000 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2013-01-20 17:16:45 +0000 |
commit | 64d81c7c4c07f527e76a64477a5b21a1385dbfef (patch) | |
tree | a200c3a4868fcdb46245d39dd055f56e0f2ca16d /src/jabber.c | |
parent | 4ecb69bfab47b5c08f8b5fca97008fe10abc96ba (diff) | |
download | profani-tty-64d81c7c4c07f527e76a64477a5b21a1385dbfef.tar.gz |
Started work on creating sha-1 caps hash
Diffstat (limited to 'src/jabber.c')
-rw-r--r-- | src/jabber.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/src/jabber.c b/src/jabber.c index f6f104b8..353247f4 100644 --- a/src/jabber.c +++ b/src/jabber.c @@ -181,7 +181,7 @@ jabber_disconnect(void) } char * -jabber_get_sha1_caps_str(void) +jabber_get_local_sha1_caps_str(void) { GString *str = g_string_new(""); unsigned char hash[SHA_DIGEST_LENGTH]; @@ -202,6 +202,74 @@ jabber_get_sha1_caps_str(void) return result; } + +char * +sha1_caps_str(xmpp_stanza_t *query) +{ + GSList *identities = NULL; + GSList *features = NULL; + + GString *s = g_string_new(""); + unsigned char hash[SHA_DIGEST_LENGTH]; + + xmpp_stanza_t *child = xmpp_stanza_get_children(query); + while (child != NULL) { + if (strcmp(xmpp_stanza_get_name(child), STANZA_NAME_IDENTITY) == 0) { + char *category = xmpp_stanza_get_attribute(child, "category"); + char *type = xmpp_stanza_get_attribute(child, "type"); + char *lang = xmpp_stanza_get_attribute(child, "xml:lang"); + char *name = xmpp_stanza_get_attribute(child, "name"); + + GString *identity_str = g_string_new(category); + g_string_append(identity_str, "/"); + if (type != NULL) { + g_string_append(identity_str, type); + } + g_string_append(identity_str, "/"); + if (lang != NULL) { + g_string_append(identity_str, lang); + } + g_string_append(identity_str, "/"); + if (name != NULL) { + g_string_append(identity_str, name); + } + g_string_append(identity_str, "<"); + identities = g_slist_insert_sorted(identities, identity_str, (GCompareFunc)octet_compare); + g_string_free(identity_str, TRUE); + } else if (strcmp(xmpp_stanza_get_name(child), STANZA_NAME_FEATURE) == 0) { + char *feature_str = xmpp_stanza_get_attribute(child, "var"); + features = g_slist_insert_sorted(features, feature_str, (GCompareFunc)octet_compare); + } else if (strcmp(xmpp_stanza_get_name(child), STANZA_NAME_X) == 0) { + // check for and add form to string + } + child = xmpp_stanza_get_next(child); + } + + GSList *curr = identities; + while (curr != NULL) { + g_string_append(s, curr->data); + g_string_append(s, "<"); + curr = g_slist_next(curr); + } + + curr = features; + while (curr != NULL) { + g_string_append(s, curr->data); + g_string_append(s, "<"); + curr = g_slist_next(curr); + } + + SHA1((unsigned char *)s->str, strlen(s->str), hash); + + char *result = g_base64_encode(hash, strlen((char *)hash)); + + g_string_free(s, TRUE); + g_slist_free_full(identities, free); + g_slist_free_full(features, free); + + return result; +} + void jabber_process_events(void) { |