diff options
author | mogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-12 19:07:18 +0000 |
---|---|---|
committer | mogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-12 19:07:18 +0000 |
commit | 19b72c2cb8738664ee2e8264087808d9d8e5b2c4 (patch) | |
tree | 1c11d974a7e1006254dc6d5ea1558bc836a848dd /channels | |
parent | 237a37dd72c21c5adfef268b35ab5b1b6da21b81 (diff) |
Added option for limiting a user from logging in
as multiple agents at same time. bug 6046 thanks
ppyy
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@8021 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_agent.c | 36 | ||||
-rw-r--r-- | channels/chan_sip.c | 5 |
2 files changed, 37 insertions, 4 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 39fe4546c..8f3f1b9da 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -157,6 +157,7 @@ static ast_group_t group; static int autologoff; static int wrapuptime; static int ackcall; +static int multiplelogin = 1; static int maxlogintries = 3; static char agentgoodbye[AST_MAX_FILENAME_LEN] = "vm-goodbye"; @@ -1044,6 +1045,8 @@ static int read_agent_config(void) /* Read in [general] section for persistance */ if ((general_val = ast_variable_retrieve(cfg, "general", "persistentagents"))) persistent_agents = ast_true(general_val); + if (ast_false(ast_variable_retrieve(cfg, "general", "multiplelogin") ) ) + multiplelogin=0; /* Read in the [agents] section */ v = ast_variable_browse(cfg, "agents"); @@ -1254,6 +1257,29 @@ static int check_beep(struct agent_pvt *newlyavailable, int needlock) return res; } +/* return 1 if multiple login is fine, 0 if it is not and we find a match, -1 if multiplelogin is not allowed and we dont find a match. */ +static int allow_multiple_login(char *chan,char *context) +{ + struct agent_pvt *p; + char loginchan[80]; + if(multiplelogin) + return 1; + if(!chan) + return 0; + if(!context) + context="default"; + + snprintf(loginchan, sizeof(loginchan), "%s@%s", chan, !ast_strlen_zero(context) ? context : "default"); + + p = agents; + while(p) { + if(!strcasecmp(chan, p->loginchan)) + return 0; + p = p->next; + } + return -1; +} + /*--- agent_request: Part of the Asterisk PBX interface ---*/ static struct ast_channel *agent_request(const char *type, int format, void *data, int *cause) { @@ -1822,9 +1848,15 @@ static int __login_exec(struct ast_channel *chan, void *data, int callbackmode) res = 0; } else res = ast_app_getdata(chan, "agent-newlocation", tmpchan+pos, sizeof(tmpchan) - 2, 0); - if (ast_strlen_zero(tmpchan) || ast_exists_extension(chan, !ast_strlen_zero(context) ? context : "default", tmpchan, - 1, NULL)) + if (ast_strlen_zero(tmpchan) ) break; + if(ast_exists_extension(chan, !ast_strlen_zero(context) ? context : "default", tmpchan,1, NULL) ) { + if(!allow_multiple_login(tmpchan,context) ) { + args.extension = NULL; + pos = 0; + } else + break; + } if (args.extension) { ast_log(LOG_WARNING, "Extension '%s' is not valid for automatic login of agent '%s'\n", args.extension, p->agent); args.extension = NULL; diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 95819e5b5..d57c35b8c 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -2680,8 +2680,9 @@ static int sip_indicate(struct ast_channel *ast, int condition) switch(condition) { case AST_CONTROL_RINGING: if (ast->_state == AST_STATE_RING) { - if (!ast_test_flag(p, SIP_PROGRESS_SENT) || - (ast_test_flag(p, SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER)) { + if ((!ast_test_flag(p, SIP_PROGRESS_SENT) || + (ast_test_flag(p, SIP_PROG_INBAND) == SIP_PROG_INBAND_NEVER)) && + ast_test_flag(p, SIP_PROG_INBAND) != SIP_PROG_INBAND_YES) { /* Send 180 ringing if out-of-band seems reasonable */ transmit_response(p, "180 Ringing", &p->initreq); ast_set_flag(p, SIP_RINGING); |