diff options
author | phsultan <phsultan@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-02-12 10:16:21 +0000 |
---|---|---|
committer | phsultan <phsultan@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-02-12 10:16:21 +0000 |
commit | 3dac9575b009ab5f5ac301acc733f60908ae5c2f (patch) | |
tree | 91da966255d5c18b6e52ad5c0e6bb1d7863fdced /channels/chan_gtalk.c | |
parent | a4fb4a209ff9c0909c0a180a19d85b6c49c42058 (diff) |
Set the initiator attribute to lowercase in our replies when receiving calls.
This attribute contains a JID that identifies the initiator of the GoogleTalk
voice session. The GoogleTalk client discards Asterisk's replies if the
initiator attribute contains uppercase characters.
(closes issue #13984)
Reported by: jcovert
Patches:
chan_gtalk.2.patch uploaded by jcovert (license 551)
Tested by: jcovert
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@175029 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_gtalk.c')
-rw-r--r-- | channels/chan_gtalk.c | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c index abe0d63b6..ef5e7acab 100644 --- a/channels/chan_gtalk.c +++ b/channels/chan_gtalk.c @@ -49,6 +49,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include <sys/signal.h> #include <iksemel.h> #include <pthread.h> +#include <ctype.h> #ifdef HAVE_GNUTLS #include <gcrypt.h> @@ -411,6 +412,7 @@ static int gtalk_invite(struct gtalk_pvt *p, char *to, char *from, char *sid, in int pref_codec = 0; int alreadysent = 0; int codecs_num = 0; + char *lowerto = NULL; iq = iks_new("iq"); gtalk = iks_new("session"); @@ -462,7 +464,14 @@ static int gtalk_invite(struct gtalk_pvt *p, char *to, char *from, char *sid, in iks_insert_attrib(gtalk, "xmlns", "http://www.google.com/session"); iks_insert_attrib(gtalk, "type",initiator ? "initiate": "accept"); - iks_insert_attrib(gtalk, "initiator", initiator ? from : to); + /* put the initiator attribute to lower case if we receive the call + * otherwise GoogleTalk won't establish the session */ + if (!initiator) { + char c; + char *t = lowerto = ast_strdupa(to); + while (((c = *t) != '/') && (*t++ = tolower(c))); + } + iks_insert_attrib(gtalk, "initiator", initiator ? from : lowerto); iks_insert_attrib(gtalk, "id", sid); iks_insert_node(iq, gtalk); iks_insert_node(gtalk, dcodecs); @@ -481,6 +490,8 @@ static int gtalk_invite(struct gtalk_pvt *p, char *to, char *from, char *sid, in static int gtalk_invite_response(struct gtalk_pvt *p, char *to , char *from, char *sid, int initiator) { iks *iq, *session, *transport; + char *lowerto = NULL; + iq = iks_new("iq"); session = iks_new("session"); transport = iks_new("transport"); @@ -501,7 +512,14 @@ static int gtalk_invite_response(struct gtalk_pvt *p, char *to , char *from, cha ast_aji_increment_mid(p->parent->connection->mid); iks_insert_attrib(session, "type", "transport-accept"); iks_insert_attrib(session, "id", sid); - iks_insert_attrib(session, "initiator", initiator ? from : to); + /* put the initiator attribute to lower case if we receive the call + * otherwise GoogleTalk won't establish the session */ + if (!initiator) { + char c; + char *t = lowerto = ast_strdupa(to); + while (((c = *t) != '/') && (*t++ = tolower(c))); + } + iks_insert_attrib(session, "initiator", initiator ? from : lowerto); iks_insert_attrib(session, "xmlns", "http://www.google.com/session"); iks_insert_attrib(transport, "xmlns", "http://www.google.com/transport/p2p"); iks_insert_node(iq,session); @@ -795,6 +813,7 @@ static int gtalk_create_candidates(struct gtalk *client, struct gtalk_pvt *p, ch struct in_addr us; iks *iq, *gtalk, *candidate, *transport; char user[17], pass[17], preference[5], port[7]; + char *lowerfrom = NULL; iq = iks_new("iq"); @@ -873,7 +892,14 @@ static int gtalk_create_candidates(struct gtalk *client, struct gtalk_pvt *p, ch ast_aji_increment_mid(c->mid); iks_insert_attrib(gtalk, "type", "transport-info"); iks_insert_attrib(gtalk, "id", sid); - iks_insert_attrib(gtalk, "initiator", (p->initiator) ? to : from); + /* put the initiator attribute to lower case if we receive the call + * otherwise GoogleTalk won't establish the session */ + if (!p->initiator) { + char c; + char *t = lowerfrom = ast_strdupa(from); + while (((c = *t) != '/') && (*t++ = tolower(c))); + } + iks_insert_attrib(gtalk, "initiator", (p->initiator) ? to : lowerfrom); iks_insert_attrib(gtalk, "xmlns", GOOGLE_NS); iks_insert_attrib(candidate, "name", tmp->name); iks_insert_attrib(candidate, "address", tmp->ip); @@ -1074,6 +1100,7 @@ static int gtalk_action(struct gtalk *client, struct gtalk_pvt *p, const char *a { iks *request, *session = NULL; int res = -1; + char *lowerthem = NULL; request = iks_new("iq"); if (request) { @@ -1086,7 +1113,14 @@ static int gtalk_action(struct gtalk *client, struct gtalk_pvt *p, const char *a if (session) { iks_insert_attrib(session, "type", action); iks_insert_attrib(session, "id", p->sid); - iks_insert_attrib(session, "initiator", p->initiator ? p->us : p->them); + /* put the initiator attribute to lower case if we receive the call + * otherwise GoogleTalk won't establish the session */ + if (!p->initiator) { + char c; + char *t = lowerthem = ast_strdupa(p->them); + while (((c = *t) != '/') && (*t++ = tolower(c))); + } + iks_insert_attrib(session, "initiator", p->initiator ? p->us : lowerthem); iks_insert_attrib(session, "xmlns", "http://www.google.com/session"); iks_insert_node(request, session); iks_send(client->connection->p, request); @@ -1500,6 +1534,7 @@ static int gtalk_digit(struct ast_channel *ast, char digit, unsigned int duratio struct gtalk *client = p->parent; iks *iq, *gtalk, *dtmf; char buffer[2] = {digit, '\0'}; + char *lowerthem = NULL; iq = iks_new("iq"); gtalk = iks_new("gtalk"); dtmf = iks_new("dtmf"); @@ -1521,7 +1556,14 @@ static int gtalk_digit(struct ast_channel *ast, char digit, unsigned int duratio ast_aji_increment_mid(client->connection->mid); iks_insert_attrib(gtalk, "xmlns", "http://jabber.org/protocol/gtalk"); iks_insert_attrib(gtalk, "action", "session-info"); - iks_insert_attrib(gtalk, "initiator", p->initiator ? p->us: p->them); + /* put the initiator attribute to lower case if we receive the call + * otherwise GoogleTalk won't establish the session */ + if (!p->initiator) { + char c; + char *t = lowerthem = ast_strdupa(p->them); + while (((c = *t) != '/') && (*t++ = tolower(c))); + } + iks_insert_attrib(gtalk, "initiator", p->initiator ? p->us: lowerthem); iks_insert_attrib(gtalk, "sid", p->sid); iks_insert_attrib(dtmf, "xmlns", "http://jabber.org/protocol/gtalk/info/dtmf"); iks_insert_attrib(dtmf, "code", buffer); |