Esempio n. 1
0
static void
_handle_caps(const char *const jid, XMPPCaps *caps)
{
    // hash supported, xep-0115, cache against ver
    if (g_strcmp0(caps->hash, "sha-1") == 0) {
        log_info("Hash %s supported", caps->hash);
        if (caps->ver) {
            if (caps_cache_contains(caps->ver)) {
                log_info("Capabilities cache hit: %s, for %s.", caps->ver, jid);
                caps_map_jid_to_ver(jid, caps->ver);
            } else {
                log_info("Capabilities cache miss: %s, for %s, sending service discovery request", caps->ver, jid);
                char *id = create_unique_id("caps");
                iq_send_caps_request(jid, id, caps->node, caps->ver);
                free(id);
            }
        }

    // unsupported hash, xep-0115, associate with JID, no cache
    } else if (caps->hash) {
        log_info("Hash %s not supported: %s, sending service discovery request", caps->hash, jid);
        char *id = create_unique_id("caps");
        iq_send_caps_request_for_jid(jid, id, caps->node, caps->ver);
        free(id);

   // no hash, legacy caps, cache against node#ver
   } else if (caps->node && caps->ver) {
        log_info("No hash specified: %s, legacy request made for %s#%s", jid, caps->node, caps->ver);
        char *id = create_unique_id("caps");
        iq_send_caps_request_legacy(jid, id, caps->node, caps->ver);
        free(id);
    } else {
        log_info("No hash specified: %s, could not create ver string, not sending service discovery request.", jid);
    }
}
Esempio n. 2
0
static void
_handle_caps(xmpp_stanza_t *const stanza)
{
    char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);

    if (from) {
        char *hash = stanza_caps_get_hash(stanza);

        // hash supported xep-0115
        if (g_strcmp0(hash, "sha-1") == 0) {
            log_info("Hash %s supported");

            char *ver = stanza_get_caps_ver(stanza);
            if (ver) {
                if (caps_contains(ver)) {
                    log_info("Capabilities cached: %s", ver);
                    caps_map(from, ver);
                } else {
                    log_info("Capabilities not cached: %s, sending service discovery request", ver);
                    char *node = stanza_caps_get_node(stanza);
                    char *id = create_unique_id("caps");

                    iq_send_caps_request(from, id, node, ver);

                    free(id);
                }
            }

        // no hash, or not supported
        } else {
            if (hash) {
                log_info("Hash %s not supported, not sending service discovery request");
                // send service discovery request, cache against from full jid
            } else {
                log_info("No hash specified, not sending service discovery request");
                // do legacy
            }
        }
    }
}