aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-04-21 00:33:09 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-04-21 00:33:09 +0000
commitc51b06eb8872fe94d8fb91c4aa67d35aca481986 (patch)
tree8b3af180fb470e2ed4707c83c15a60ee9ccf20bf /channels/chan_iax2.c
parentfcbdd9d347a7b1a18e51ea0957aa3fa628598715 (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-xchannels/chan_iax2.c39
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);