diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-04-21 00:33:09 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-04-21 00:33:09 +0000 |
commit | c51b06eb8872fe94d8fb91c4aa67d35aca481986 (patch) | |
tree | 8b3af180fb470e2ed4707c83c15a60ee9ccf20bf /channels/chan_iax2.c | |
parent | fcbdd9d347a7b1a18e51ea0957aa3fa628598715 (diff) |
Select user by more logical grounds when no user is specified (bug #1458, sorta)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2723 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax2.c')
-rwxr-xr-x | channels/chan_iax2.c | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 7627ade2f..42f0efcda 100755 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -3191,7 +3191,8 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies /* 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 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies && 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); |