[svn-commits] russell: trunk r64786 - in /trunk:
configs/manager.conf.sample main/manager.c
svn-commits at lists.digium.com
svn-commits at lists.digium.com
Thu May 17 10:12:23 MST 2007
Author: russell
Date: Thu May 17 12:12:23 2007
New Revision: 64786
URL: http://svn.digium.com/view/asterisk?view=rev&rev=64786
Log:
Add an option that lets you only allow one connection at a time for each
manager user. (issue #8664, reported and original patch by ssokol, patch
updated by bkruse, and further updated by me)
Modified:
trunk/configs/manager.conf.sample
trunk/main/manager.c
Modified: trunk/configs/manager.conf.sample
URL: http://svn.digium.com/view/asterisk/trunk/configs/manager.conf.sample?view=diff&rev=64786&r1=64785&r2=64786
==============================================================================
--- trunk/configs/manager.conf.sample (original)
+++ trunk/configs/manager.conf.sample Thu May 17 12:12:23 2007
@@ -45,6 +45,10 @@
; sslcert=/tmp/asterisk.pem ; path to the certificate.
+;
+;allowmultiplelogin = yes ; IF set to no, rejects manager logins that are already in use.
+; ; The default is yes.
+;
;displayconnects = yes
;
; Add a Unix epoch timestamp to events (not action responses)
Modified: trunk/main/manager.c
URL: http://svn.digium.com/view/asterisk/trunk/main/manager.c?view=diff&rev=64786&r1=64785&r2=64786
==============================================================================
--- trunk/main/manager.c (original)
+++ trunk/main/manager.c Thu May 17 12:12:23 2007
@@ -111,6 +111,7 @@
static AST_LIST_HEAD_STATIC(all_events, eventqent);
static int displayconnects = 1;
+static int allowmultiplelogin;
static int timestampevents;
static int httptimeout = 60;
static int manager_enabled = 0;
@@ -416,6 +417,21 @@
return ret;
}
+
+static int check_manager_session_inuse(const char *name)
+{
+ struct mansession *session = NULL;
+
+ AST_LIST_LOCK(&sessions);
+ AST_LIST_TRAVERSE(&sessions, session, list) {
+ if (!strcasecmp(session->username, name))
+ break;
+ }
+ AST_LIST_UNLOCK(&sessions);
+
+ return session ? 1 : 0;
+}
+
/*!
* lookup an entry in the list of registered users.
@@ -2266,6 +2282,7 @@
char action[80] = "";
int ret = 0;
struct manager_action *tmp;
+ const char *user = astman_get_header(m, "Username");
ast_copy_string(action, astman_get_header(m, "Action"), sizeof(action));
if (option_debug)
@@ -2282,6 +2299,16 @@
ast_mutex_unlock(&s->__lock);
return 0;
}
+
+ if (!allowmultiplelogin && !s->authenticated && user &&
+ (!strcasecmp(action, "Login") || !strcasecmp(action, "Challenge"))) {
+ if (check_manager_session_inuse(user)) {
+ sleep(1);
+ astman_send_error(s, m, "Login Already In Use");
+ return -1;
+ }
+ }
+
ast_rwlock_rdlock(&actionlock);
for (tmp = first_action ; tmp; tmp = tmp->next) {
if (strcasecmp(action, tmp->action))
@@ -3276,6 +3303,8 @@
ast_log(LOG_WARNING, "Invalid address '%s' specified, using 0.0.0.0\n", val);
memset(&ami_desc.sin.sin_addr, 0, sizeof(ami_desc.sin.sin_addr));
}
+ } else if (!strcasecmp(var->name, "allowmultiplelogin")) {
+ allowmultiplelogin = ast_true(val);
} else if (!strcasecmp(var->name, "displayconnects")) {
displayconnects = ast_true(val);
} else if (!strcasecmp(var->name, "timestampevents")) {
More information about the svn-commits
mailing list