[asterisk-commits] phsultan: branch 1.4 r119740 - in /branches/1.4: channels/ res/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Jun 2 09:32:54 CDT 2008
Author: phsultan
Date: Mon Jun 2 09:32:53 2008
New Revision: 119740
URL: http://svn.digium.com/view/asterisk?view=rev&rev=119740
Log:
Do not link the guest account with any configured XMPP client (in
jabber.conf). The actual connection is made when a call comes in
Asterisk.
Fix the ast_aji_get_client function that was not able to retrieve an
XMPP client from its JID.
(closes issue #12085)
Reported by: junky
Tested by: phsultan
Modified:
branches/1.4/channels/chan_gtalk.c
branches/1.4/res/res_jabber.c
Modified: branches/1.4/channels/chan_gtalk.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/channels/chan_gtalk.c?view=diff&rev=119740&r1=119739&r2=119740
==============================================================================
--- branches/1.4/channels/chan_gtalk.c (original)
+++ branches/1.4/channels/chan_gtalk.c Mon Jun 2 09:32:53 2008
@@ -276,17 +276,12 @@
if (!gtalk && strchr(name, '@'))
gtalk = ASTOBJ_CONTAINER_FIND_FULL(>alk_list, name, user,,, strcasecmp);
- if (!gtalk) { /* guest call */
+ if (!gtalk) {
+ /* guest call */
ASTOBJ_CONTAINER_TRAVERSE(>alk_list, 1, {
ASTOBJ_RDLOCK(iterator);
if (!strcasecmp(iterator->name, "guest")) {
- if (!strcasecmp(iterator->connection->jid->partial, connection)) {
- gtalk = iterator;
- } else if (!strcasecmp(iterator->connection->name, connection)) {
- gtalk = iterator;
- } else if (iterator->connection->component && !strcasecmp(iterator->connection->user,domain)) {
- gtalk = iterator;
- }
+ gtalk = iterator;
}
ASTOBJ_UNLOCK(iterator);
@@ -1165,6 +1160,16 @@
tmp = tmp->next;
}
+ if (!strcasecmp(client->name, "guest")){
+ /* the guest account is not tied to any configured XMPP client,
+ let's set it now */
+ client->connection = ast_aji_get_client(from);
+ if (!client->connection) {
+ ast_log(LOG_ERROR, "No XMPP client to talk to, us (partial JID) : %s\n", from);
+ return -1;
+ }
+ }
+
p = gtalk_alloc(client, from, pak->from->full, iks_find_attrib(pak->query, "id"));
if (!p) {
ast_log(LOG_WARNING, "Unable to allocate gtalk structure!\n");
@@ -1627,11 +1632,22 @@
}
}
}
+
client = find_gtalk(to, sender);
if (!client) {
ast_log(LOG_WARNING, "Could not find recipient.\n");
return NULL;
}
+ if (!strcasecmp(client->name, "guest")){
+ /* the guest account is not tied to any configured XMPP client,
+ let's set it now */
+ client->connection = ast_aji_get_client(sender);
+ if (!client->connection) {
+ ast_log(LOG_ERROR, "No XMPP client to talk to, us (partial JID) : %s\n", sender);
+ return NULL;
+ }
+ }
+
ASTOBJ_WRLOCK(client);
p = gtalk_alloc(client, strchr(sender, '@') ? sender : client->connection->jid->full, strchr(to, '@') ? to : client->user, NULL);
if (p)
@@ -1931,13 +1947,13 @@
ASTOBJ_CONTAINER_TRAVERSE(clients, 1, {
ASTOBJ_WRLOCK(iterator);
ASTOBJ_WRLOCK(member);
- member->connection = iterator;
+ member->connection = NULL;
iks_filter_add_rule(iterator->f, gtalk_parser, member, IKS_RULE_TYPE, IKS_PAK_IQ, IKS_RULE_NS, "http://www.google.com/session", IKS_RULE_DONE);
iks_filter_add_rule(iterator->f, gtalk_parser, member, IKS_RULE_TYPE, IKS_PAK_IQ, IKS_RULE_NS, "http://jabber.org/protocol/gtalk", IKS_RULE_DONE);
ASTOBJ_UNLOCK(member);
- ASTOBJ_CONTAINER_LINK(>alk_list, member);
ASTOBJ_UNLOCK(iterator);
});
+ ASTOBJ_CONTAINER_LINK(>alk_list, member);
} else {
ASTOBJ_UNLOCK(member);
ASTOBJ_UNREF(member, gtalk_member_destroy);
Modified: branches/1.4/res/res_jabber.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/res/res_jabber.c?view=diff&rev=119740&r1=119739&r2=119740
==============================================================================
--- branches/1.4/res/res_jabber.c (original)
+++ branches/1.4/res/res_jabber.c Mon Jun 2 09:32:53 2008
@@ -2359,17 +2359,30 @@
}
/*!
- * \brief grab a aji_client structure by label name.
- * \param void.
- * \return 1.
+ * \brief grab a aji_client structure by label name or JID
+ * (without the resource string)
+ * \param name label or JID
+ * \return aji_client.
*/
struct aji_client *ast_aji_get_client(const char *name)
{
struct aji_client *client = NULL;
+ char *aux = NULL;
client = ASTOBJ_CONTAINER_FIND(&clients, name);
- if (!client && !strchr(name, '@'))
- client = ASTOBJ_CONTAINER_FIND_FULL(&clients, name, user,,, strcasecmp);
+ if (!client && strchr(name, '@')) {
+ ASTOBJ_CONTAINER_TRAVERSE(&clients, 1, {
+ aux = ast_strdupa(iterator->user);
+ if (strchr(aux, '/')) {
+ /* strip resource for comparison */
+ aux = strsep(&aux, "/");
+ }
+ if (!strcasecmp(aux, name)) {
+ client = iterator;
+ }
+ });
+ }
+
return client;
}
More information about the asterisk-commits
mailing list