From 0e8bd82efe3fb80bdac44443d0a9422d2fc8e9c2 Mon Sep 17 00:00:00 2001
From: Russell Bryant <russell@russellbryant.com>
Date: Thu, 18 Jan 2007 18:54:51 +0000
Subject: [PATCH] Fix trunk version of manager support for users.conf.  Now it
 actually pays attention to the "hasmanager" option.

(Thanks to Anthony L. for pointing out that this was broken!)


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@51247 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/manager.c | 119 ++++++++++++++++++++++++++-----------------------
 1 file changed, 62 insertions(+), 57 deletions(-)

diff --git a/main/manager.c b/main/manager.c
index a8f356bba6..593fc736cb 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -887,70 +887,75 @@ static int authenticate(struct mansession *s, const struct message *m)
 		return -1;
 	while ( (cat = ast_category_browse(cfg, cat)) ) {
 		/* "general" is not a valid user */
-		if (!strcasecmp(cat, user) && strcasecmp(cat, "general"))
-			break;
-	}
-	if (!cat) {
-		ast_log(LOG_NOTICE, "%s tried to authenticate with nonexistent user '%s'\n", ast_inet_ntoa(s->sin.sin_addr), user);
-		ast_config_destroy(cfg);
-		return -1;
-	}
-
-	/* collect parameters for the user's entry */
-	for (v = ast_variable_browse(cfg, cat); v; v = v->next) {
-		if (!strcasecmp(v->name, "secret"))
-			password = ast_strdupa(v->value);
-		else if (!strcasecmp(v->name, "read"))
-			readperm = get_perm(v->value);
-		else if (!strcasecmp(v->name, "write"))
-			writeperm = get_perm(v->value);
-		else if (!strcasecmp(v->name, "permit") ||
-			   !strcasecmp(v->name, "deny")) {
-			ha = ast_append_ha(v->name, v->value, ha, NULL);
-		} else if (!strcasecmp(v->name, "writetimeout")) {
-			int val = atoi(v->value);
-
-			if (val < 100)
-				ast_log(LOG_WARNING, "Invalid writetimeout value '%s' at line %d\n", v->value, v->lineno);
-			else
-				s->writetimeout = val;
+		if (strcasecmp(cat, user) || !strcasecmp(cat, "general"))
+			continue;
+		/* collect parameters for the user's entry */
+		for (v = ast_variable_browse(cfg, cat); v; v = v->next) {
+			if (!strcasecmp(v->name, "secret"))
+				password = ast_strdupa(v->value);
+			else if (!strcasecmp(v->name, "read"))
+				readperm = get_perm(v->value);
+			else if (!strcasecmp(v->name, "write"))
+				writeperm = get_perm(v->value);
+			else if (!strcasecmp(v->name, "permit") ||
+				   !strcasecmp(v->name, "deny")) {
+				ha = ast_append_ha(v->name, v->value, ha, NULL);
+			} else if (!strcasecmp(v->name, "writetimeout")) {
+				int val = atoi(v->value);
+	
+				if (val < 100)
+					ast_log(LOG_WARNING, "Invalid writetimeout value '%s' at line %d\n", v->value, v->lineno);
+				else
+					s->writetimeout = val;
+			}
 		}
 	}
+
 	ast_config_destroy(cfg);
-	cfg = ast_config_load("users.conf");
-	if (!cfg)
-		return -1;
-	cat = NULL;
-	while ( (cat = ast_category_browse(cfg, cat)) ) {
-		if (!strcasecmp(cat, user) && strcasecmp(cat, "general"))
-			break;
-	}
 	if (!cat) {
-		ast_log(LOG_NOTICE, "%s tried to authenticate with nonexistent user '%s'\n", ast_inet_ntoa(s->sin.sin_addr), user);
+		/* Didn't find the user in manager.conf, check users.conf */
+		int hasmanager = 0;
+		cfg = ast_config_load("users.conf");
+		if (!cfg)
+			return -1;
+		while ( (cat = ast_category_browse(cfg, cat)) ) {
+			if (!strcasecmp(cat, user) && strcasecmp(cat, "general"))
+				break;
+		}
+		if (!cat) {
+			ast_log(LOG_NOTICE, "%s tried to authenticate with nonexistent user '%s'\n", ast_inet_ntoa(s->sin.sin_addr), user);
+			ast_config_destroy(cfg);
+			return -1;
+		}
+		/* collect parameters for the user's entry from users.conf */
+		for (v = ast_variable_browse(cfg, cat); v; v = v->next) {
+			if (!strcasecmp(v->name, "secret"))
+				password = ast_strdupa(v->value);
+			else if (!strcasecmp(v->name, "read"))
+				readperm = get_perm(v->value);
+			else if (!strcasecmp(v->name, "write"))
+				writeperm = get_perm(v->value);
+			else if (!strcasecmp(v->name, "permit") ||
+				   !strcasecmp(v->name, "deny")) {
+				ha = ast_append_ha(v->name, v->value, ha, NULL);
+			} else if (!strcasecmp(v->name, "writetimeout")) {
+				int val = atoi(v->value);
+	
+				if (val < 100)
+					ast_log(LOG_WARNING, "Invalid writetimeout value '%s' at line %d\n", v->value, v->lineno);
+				else
+					s->writetimeout = val;
+			} else if (!strcasecmp(v->name, "hasmanager")) {
+				hasmanager = ast_true(v->value);
+			}
+		}
 		ast_config_destroy(cfg);
-		return -1;
-	}
-	/* collect parameters for the user's entry from users.conf */
-	for (v = ast_variable_browse(cfg, cat); v; v = v->next) {
-		if (!strcasecmp(v->name, "secret"))
-			password = ast_strdupa(v->value);
-		else if (!strcasecmp(v->name, "read"))
-			readperm = get_perm(v->value);
-		else if (!strcasecmp(v->name, "write"))
-			writeperm = get_perm(v->value);
-		else if (!strcasecmp(v->name, "permit") ||
-			   !strcasecmp(v->name, "deny")) {
-			ha = ast_append_ha(v->name, v->value, ha, NULL);
-		} else if (!strcasecmp(v->name, "writetimeout")) {
-			int val = atoi(v->value);
-
-			if (val < 100)
-				ast_log(LOG_WARNING, "Invalid writetimeout value '%s' at line %d\n", v->value, v->lineno);
-			else
-				s->writetimeout = val;
+		if (!hasmanager) {
+			ast_log(LOG_NOTICE, "%s tried to authenticate with nonexistent user '%s'\n", ast_inet_ntoa(s->sin.sin_addr), user);
+			return -1;
 		}
 	}
-	ast_config_destroy(cfg);
+
 	}
 
 	if (ha) {
-- 
GitLab