From 1dc0312d01e08bd9703a7b1667d80f2d5a5fba65 Mon Sep 17 00:00:00 2001 From: Matt O'Gorman Date: Thu, 12 Jan 2006 19:07:18 +0000 Subject: [PATCH] Added option for limiting a user from logging in as multiple agents at same time. bug 6046 thanks ppyy git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@8021 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_agent.c | 36 ++++++++++++++++++++++++++++++++++-- channels/chan_sip.c | 5 +++-- configs/agents.conf.sample | 4 ++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 39fe4546c8..8f3f1b9da8 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 95819e5b56..d57c35b8c9 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); diff --git a/configs/agents.conf.sample b/configs/agents.conf.sample index ac14e6dee8..a9c4edfea6 100644 --- a/configs/agents.conf.sample +++ b/configs/agents.conf.sample @@ -10,6 +10,10 @@ ; persistentagents=yes +;enable or disable a single extension from longing in as multiple +;agents, defaults to enabled +;multiplelogin=yes + [agents] ; ; Define autologoff times if appropriate. This is how long