[asterisk-commits] phsultan: branch 1.6.0 r119743 - in /branches/1.6.0: ./ channels/ res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Jun 2 09:40:43 CDT 2008


Author: phsultan
Date: Mon Jun  2 09:40:42 2008
New Revision: 119743

URL: http://svn.digium.com/view/asterisk?view=rev&rev=119743
Log:
Merged revisions 119741 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

........
r119741 | phsultan | 2008-06-02 16:35:24 +0200 (Mon, 02 Jun 2008) | 13 lines

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.

Apply this fix to Jingle too.

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.6.0/   (props changed)
    branches/1.6.0/channels/chan_gtalk.c
    branches/1.6.0/channels/chan_jingle.c
    branches/1.6.0/res/res_jabber.c

Propchange: branches/1.6.0/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.0/channels/chan_gtalk.c
URL: http://svn.digium.com/view/asterisk/branches/1.6.0/channels/chan_gtalk.c?view=diff&rev=119743&r1=119742&r2=119743
==============================================================================
--- branches/1.6.0/channels/chan_gtalk.c (original)
+++ branches/1.6.0/channels/chan_gtalk.c Mon Jun  2 09:40:42 2008
@@ -250,17 +250,12 @@
 	if (!gtalk && strchr(name, '@'))
 		gtalk = ASTOBJ_CONTAINER_FIND_FULL(&gtalk_list, name, user,,, strcasecmp);
 
-	if (!gtalk) {				/* guest call */
+	if (!gtalk) {				
+		/* guest call */
 		ASTOBJ_CONTAINER_TRAVERSE(&gtalk_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);
 
@@ -1139,6 +1134,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");
@@ -1599,11 +1604,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)
@@ -1925,13 +1941,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(&gtalk_list, member);
 						ASTOBJ_UNLOCK(iterator);
 					});
+					ASTOBJ_CONTAINER_LINK(&gtalk_list, member);
 				} else {
 					ASTOBJ_UNLOCK(member);
 					ASTOBJ_UNREF(member, gtalk_member_destroy);

Modified: branches/1.6.0/channels/chan_jingle.c
URL: http://svn.digium.com/view/asterisk/branches/1.6.0/channels/chan_jingle.c?view=diff&rev=119743&r1=119742&r2=119743
==============================================================================
--- branches/1.6.0/channels/chan_jingle.c (original)
+++ branches/1.6.0/channels/chan_jingle.c Mon Jun  2 09:40:42 2008
@@ -247,15 +247,12 @@
 	if (!jingle && strchr(name, '@'))
 		jingle = ASTOBJ_CONTAINER_FIND_FULL(&jingle_list, name, user,,, strcasecmp);
 
-	if (!jingle) {				/* guest call */
+	if (!jingle) {				
+		/* guest call */
 		ASTOBJ_CONTAINER_TRAVERSE(&jingle_list, 1, {
 			ASTOBJ_RDLOCK(iterator);
 			if (!strcasecmp(iterator->name, "guest")) {
-				if (!strcasecmp(iterator->connection->jid->partial, connection)) {
-					jingle = iterator;
-				} else if (!strcasecmp(iterator->connection->name, connection)) {
-					jingle = iterator;
-				}
+				jingle = iterator;
 			}
 			ASTOBJ_UNLOCK(iterator);
 
@@ -958,8 +955,13 @@
 	struct ast_channel *chan;
 	int res;
 	iks *codec, *content, *description;
+	char *from = NULL;
 
 	/* Make sure our new call doesn't exist yet */
+	from = iks_find_attrib(pak->x,"to");
+	if(!from)
+		from = client->connection->jid->full;
+
 	while (tmp) {
 		if (iks_find_with_attrib(pak->x, JINGLE_NODE, JINGLE_SID, tmp->sid)) {
 			ast_log(LOG_NOTICE, "Ignoring duplicate call setup on SID %s\n", tmp->sid);
@@ -968,6 +970,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 = jingle_alloc(client, pak->from->partial, iks_find_attrib(pak->query, JINGLE_SID));
 	if (!p) {
@@ -1470,11 +1482,22 @@
 			}
 		}
 	}
+
 	client = find_jingle(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 = jingle_alloc(client, to, NULL);
 	if (p)
@@ -1793,13 +1816,13 @@
 					ASTOBJ_CONTAINER_TRAVERSE(clients, 1, {
 						ASTOBJ_WRLOCK(iterator);
 						ASTOBJ_WRLOCK(member);
-						member->connection = iterator;
+						member->connection = NULL;
 						iks_filter_add_rule(iterator->f, jingle_parser, member, IKS_RULE_TYPE, IKS_PAK_IQ, IKS_RULE_NS,	JINGLE_NS, IKS_RULE_DONE);
 						iks_filter_add_rule(iterator->f, jingle_parser, member, IKS_RULE_TYPE, IKS_PAK_IQ, IKS_RULE_NS,	JINGLE_DTMF_NS, IKS_RULE_DONE);
 						ASTOBJ_UNLOCK(member);
-						ASTOBJ_CONTAINER_LINK(&jingle_list, member);
 						ASTOBJ_UNLOCK(iterator);
 					});
+					ASTOBJ_CONTAINER_LINK(&jingle_list, member);
 				} else {
 					ASTOBJ_UNLOCK(member);
 					ASTOBJ_UNREF(member, jingle_member_destroy);

Modified: branches/1.6.0/res/res_jabber.c
URL: http://svn.digium.com/view/asterisk/branches/1.6.0/res/res_jabber.c?view=diff&rev=119743&r1=119742&r2=119743
==============================================================================
--- branches/1.6.0/res/res_jabber.c (original)
+++ branches/1.6.0/res/res_jabber.c Mon Jun  2 09:40:42 2008
@@ -2884,17 +2884,30 @@
 }
 
 /*!
- * \brief grab a aji_client structure by label name.
- * \param name label name 
+ * \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