Index: res/res_jabber.c =================================================================== --- res/res_jabber.c (revision 337971) +++ res/res_jabber.c (working copy) @@ -1431,8 +1431,10 @@ case IKS_NOMEM: ast_log(LOG_WARNING, "Parsing failure: Out of memory.\n"); break; - case IKS_BADXML: - ast_log(LOG_WARNING, "Parsing failure: Invalid XML.\n"); + case IKS_BADXML: /* Empty element is valid when connecting as component to XMPP, so absorb this*/ + if (!(client->component && client->state == AJI_CONNECTING)) { + ast_log(LOG_WARNING, "Parsing failure: Invalid XML.\n"); + } break; case IKS_HOOK: ast_log(LOG_WARNING, "Parsing failure: Hook returned an error.\n"); @@ -1767,6 +1769,8 @@ case IKS_NODE_START: if (client->state == AJI_DISCONNECTED) { char secret[160], shasum[320], *handshake; + + client->state = AJI_CONNECTING; sprintf(secret, "%s%s", pak->id, client->password); ast_sha1_hash(shasum, secret); @@ -1776,12 +1780,16 @@ ast_free(handshake); handshake = NULL; } - client->state = AJI_CONNECTING; - if (aji_recv(client, 1) == 2) /*XXX proper result for iksemel library on iks_recv of XXX*/ + + /* Upon successful authentication, the server will send empty handshake element, "", + which is proper, but iksemel returns IKS_BADXML; so check for this return code and + indicate we are connected; this probably should be improved upon */ + if (aji_recv(client, 1) == IKS_BADXML) { client->state = AJI_CONNECTED; - else + } else { ast_log(LOG_WARNING, "Jabber didn't seem to handshake, failed to authenticate.\n"); - break; + client->state = AJI_DISCONNECTED; + } } break; @@ -2818,9 +2826,11 @@ } else if (res == IKS_NET_TLSFAIL) { ast_log(LOG_ERROR, "JABBER: Failure in TLS.\n"); } else if (client->timeout == 0 && client->state == AJI_CONNECTED) { + client->state = AJI_CONNECTING; res = client->keepalive ? aji_send_raw(client, " ") : IKS_OK; if (res == IKS_OK) { client->timeout = 50; + client->state = AJI_CONNECTED; } else { ast_log(LOG_WARNING, "JABBER: Network Timeout\n"); }