--- main/manager.c 2012-12-06 18:11:21.000000000 +0400 +++ main/manager.c 2013-03-27 16:32:38.482980355 +0400 @@ -1173,6 +1173,7 @@ int writeperm; /*!< Authorization for writing */ int writetimeout; /*!< Per user Timeout for ast_carefulwrite() */ int displayconnects; /*!< XXX unused */ + int allowmultiplelogin; /*!< Per user option*/ int keep; /*!< mark entries created on a reload */ struct ao2_container *whitefilters; /*!< Manager event filters - white list */ struct ao2_container *blackfilters; /*!< Manager event filters - black list */ @@ -1728,19 +1729,21 @@ ast_cli(a->fd, "\n"); ast_cli(a->fd, - " username: %s\n" - " secret: %s\n" - " ACL: %s\n" - " read perm: %s\n" - " write perm: %s\n" - "displayconnects: %s\n", + " username: %s\n" + " secret: %s\n" + " ACL: %s\n" + " read perm: %s\n" + " write perm: %s\n" + " displayconnects: %s\n" + "allowmultiplelogin: %s\n", (user->username ? user->username : "(N/A)"), (user->secret ? "" : "(N/A)"), ((user->acl && !ast_acl_list_is_empty(user->acl)) ? "yes" : "no"), authority_to_str(user->readperm, &rauthority), authority_to_str(user->writeperm, &wauthority), - (user->displayconnects ? "yes" : "no")); - ast_cli(a->fd, " Variables: \n"); + (user->displayconnects ? "yes" : "no"), + (user->allowmultiplelogin ? "yes" : "no")); + ast_cli(a->fd, " Variables: \n"); for (v = user->chanvars ; v ; v = v->next) { ast_cli(a->fd, " %s = %s\n", v->name, v->value); } @@ -5064,7 +5067,8 @@ { int ret = 0; struct manager_action *act_found; - const char *user; + struct ast_manager_user *user = NULL; + const char *username; const char *action; action = __astman_get_header(m, "Action", GET_HEADER_SKIP_EMPTY); @@ -5089,19 +5093,23 @@ return 0; } - if (!allowmultiplelogin - && !s->session->authenticated + if (!s->session->authenticated && (!strcasecmp(action, "Login") || !strcasecmp(action, "Challenge"))) { - user = astman_get_header(m, "Username"); + username = astman_get_header(m, "Username"); - if (!ast_strlen_zero(user) && check_manager_session_inuse(user)) { - report_session_limit(s); - sleep(1); - mansession_lock(s); - astman_send_error(s, m, "Login Already In Use"); - mansession_unlock(s); - return -1; + if (!ast_strlen_zero(username) && check_manager_session_inuse(username)) { + AST_RWLIST_WRLOCK(&users); + user = get_manager_by_name_locked(username); + if(user && !user->allowmultiplelogin) { + AST_RWLIST_UNLOCK(&users); + report_session_limit(s); + sleep(1); + mansession_lock(s); + astman_send_error(s, m, "Login Already In Use"); + mansession_unlock(s); + return -1; + } } } @@ -7584,6 +7592,7 @@ const char *user_read = ast_variable_retrieve(ucfg, cat, "read"); const char *user_write = ast_variable_retrieve(ucfg, cat, "write"); const char *user_displayconnects = ast_variable_retrieve(ucfg, cat, "displayconnects"); + const char *user_allowmultiplelogin = ast_variable_retrieve(ucfg, cat, "allowmultiplelogin"); const char *user_writetimeout = ast_variable_retrieve(ucfg, cat, "writetimeout"); /* Look for an existing entry, @@ -7604,6 +7613,8 @@ user->writeperm = -1; /* Default displayconnect from [general] */ user->displayconnects = displayconnects; + /* Default allowmultiplelogin from [general] */ + user->allowmultiplelogin = allowmultiplelogin; user->writetimeout = 100; } @@ -7619,6 +7630,9 @@ if (!user_displayconnects) { user_displayconnects = ast_variable_retrieve(ucfg, "general", "displayconnects"); } + if (!user_allowmultiplelogin) { + user_allowmultiplelogin = ast_variable_retrieve(ucfg, "general", "allowmultiplelogin"); + } if (!user_writetimeout) { user_writetimeout = ast_variable_retrieve(ucfg, "general", "writetimeout"); } @@ -7639,6 +7653,9 @@ if (user_displayconnects) { user->displayconnects = ast_true(user_displayconnects); } + if (user_allowmultiplelogin) { + user->allowmultiplelogin = ast_true(user_allowmultiplelogin); + } if (user_writetimeout) { int value = atoi(user_writetimeout); if (value < 100) { @@ -7674,6 +7691,8 @@ user->writeperm = 0; /* Default displayconnect from [general] */ user->displayconnects = displayconnects; + /* Default allowmultiplelogin from [general] */ + user->allowmultiplelogin = allowmultiplelogin; user->writetimeout = 100; user->whitefilters = ao2_container_alloc(1, NULL, NULL); user->blackfilters = ao2_container_alloc(1, NULL, NULL); @@ -7708,6 +7727,8 @@ user->writeperm = get_perm(var->value); } else if (!strcasecmp(var->name, "displayconnects") ) { user->displayconnects = ast_true(var->value); + } else if (!strcasecmp(var->name, "allowmultiplelogin") ) { + user->allowmultiplelogin = ast_true(var->value); } else if (!strcasecmp(var->name, "writetimeout")) { int value = atoi(var->value); if (value < 100) {