[Asterisk-cvs] asterisk/channels chan_iax2.c,1.123,1.124

markster at lists.digium.com markster at lists.digium.com
Tue Apr 20 20:28:45 CDT 2004


Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv13725/channels

Modified Files:
	chan_iax2.c 
Log Message:
Select user by more logical grounds when no user is specified (bug #1458, sorta)


Index: chan_iax2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -d -r1.123 -r1.124
--- chan_iax2.c	20 Apr 2004 15:14:06 -0000	1.123
+++ chan_iax2.c	21 Apr 2004 00:33:09 -0000	1.124
@@ -3191,7 +3191,8 @@
 	/* Start pessimistic */
 	int res = -1;
 	int version = 2;
-	struct iax2_user *user;
+	struct iax2_user *user, *best = NULL;
+	int bestscore = 0;
 	int gotcapability=0;
 	if (!iaxs[callno])
 		return res;
@@ -3240,11 +3241,45 @@
 			&& ast_apply_ha(user->ha, sin) 	/* Access is permitted from this IP */
 			&& (!strlen(iaxs[callno]->context) ||			/* No context specified */
 			     apply_context(user->contexts, iaxs[callno]->context))) {			/* Context is permitted */
-			break;
+			if (strlen(iaxs[callno]->username)) {
+				/* Exact match, stop right now. */
+				best = user;
+				break;
+			} else if (!strlen(user->secret)) {
+				/* No required authentication */
+				if (user->ha) {
+					/* There was host authentication and we passed, bonus! */
+					if (bestscore < 4) {
+						bestscore = 4;
+						best = user;
+					}
+				} else {
+					/* No host access, but no secret, either, not bad */
+					if (bestscore < 3) {
+						bestscore = 3;
+						best = user;
+					}
+				}
+			} else {
+				if (user->ha) {
+					/* Authentication, but host access too, eh, it's something.. */
+					if (bestscore < 2) {
+						bestscore = 2;
+						best = user;
+					}
+				} else {
+					/* Authentication and no host access...  This is our baseline */
+					if (bestscore < 1) {
+						bestscore = 1;
+						best = user;
+					}
+				}
+			}
 		}
 		user = user->next;	
 	}
 	ast_mutex_unlock(&userl.lock);
+	user = best;
 #ifdef MYSQL_FRIENDS
 	if (!user && mysql && strlen(iaxs[callno]->username) && (strlen(iaxs[callno]->username) < 128)) {
 		user = mysql_user(iaxs[callno]->username);




More information about the svn-commits mailing list