diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c
index 7ed44363..3221fc2c 100644
--- a/src/xmpp/iq.c
+++ b/src/xmpp/iq.c
@@ -302,7 +302,7 @@ iq_send_software_version(const char * const fulljid)
xmpp_stanza_t *iq = stanza_create_software_version_iq(ctx, fulljid);
char *id = xmpp_stanza_get_id(iq);
- xmpp_id_handler_add(conn, _version_result_handler, id, NULL);
+ xmpp_id_handler_add(conn, _version_result_handler, id, strdup(fulljid));
xmpp_send(conn, iq);
xmpp_stanza_release(iq);
@@ -893,13 +893,19 @@ _version_result_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
presence = string_from_resource_presence(occupant->presence);
} else {
PContact contact = roster_get_contact(jidp->barejid);
+ if (!contact) {
+ jid_destroy(jidp);
+ jidp = jid_create((char*)userdata);
+ contact = roster_get_contact(jidp->barejid);
+ }
Resource *resource = p_contact_get_resource(contact, jidp->resourcepart);
presence = string_from_resource_presence(resource->presence);
}
- cons_show_software_version(jid, presence, name_str, version_str, os_str);
+ cons_show_software_version(jidp->fulljid, presence, name_str, version_str, os_str);
jid_destroy(jidp);
+ free(userdata);
return 0;
}
diff --git a/tests/functionaltests/functionaltests.c b/tests/functionaltests/functionaltests.c
index cbedf401..a9dfea68 100644
--- a/tests/functionaltests/functionaltests.c
+++ b/tests/functionaltests/functionaltests.c
@@ -80,6 +80,7 @@ int main(int argc, char* argv[]) {
PROF_FUNC_TEST(send_software_version_request),
PROF_FUNC_TEST(display_software_version_result),
PROF_FUNC_TEST(shows_message_when_software_version_error),
+ PROF_FUNC_TEST(display_software_version_result_when_from_domainpart),
};
return run_tests(all_tests);
diff --git a/tests/functionaltests/test_presence.c b/tests/functionaltests/test_presence.c
index 936d9405..7f37f2fd 100644
--- a/tests/functionaltests/test_presence.c
+++ b/tests/functionaltests/test_presence.c
@@ -242,6 +242,7 @@ presence_received(void **state)
assert_true(prof_output_exact("Buddy1 (mobile) is online, \"I'm here\""));
}
+// Typical use case for gateways that don't support resources
void
presence_missing_resource_defaults(void **state)
{
diff --git a/tests/functionaltests/test_software.c b/tests/functionaltests/test_software.c
index 9b063c20..08c3edff 100644
--- a/tests/functionaltests/test_software.c
+++ b/tests/functionaltests/test_software.c
@@ -82,3 +82,31 @@ shows_message_when_software_version_error(void **state)
prof_output_exact("Could not get software version: service-unavailable");
}
+
+// Typical use case for gateways that don't support resources
+void
+display_software_version_result_when_from_domainpart(void **state)
+{
+ prof_connect();
+ stbbr_send(
+ ""
+ "10"
+ "I'm here"
+ ""
+ );
+ prof_output_exact("Buddy1 is online, \"I'm here\"");
+
+ stbbr_for_query("jabber:iq:version",
+ ""
+ ""
+ "Some Gateway"
+ "1.0"
+ ""
+ ""
+ );
+ prof_input("/software buddy1@localhost/__prof_default");
+
+ prof_output_exact("buddy1@localhost/__prof_default:");
+ prof_output_exact("Name : Some Gateway");
+ prof_output_exact("Version : 1.0");
+}
diff --git a/tests/functionaltests/test_software.h b/tests/functionaltests/test_software.h
index 985d7002..6d75f049 100644
--- a/tests/functionaltests/test_software.h
+++ b/tests/functionaltests/test_software.h
@@ -1,4 +1,5 @@
void send_software_version_request(void **state);
void display_software_version_result(void **state);
void shows_message_when_software_version_error(void **state);
+void display_software_version_result_when_from_domainpart(void **state);