diff options
author | Matt O'Gorman <mogorman@digium.com> | 2006-01-12 19:07:18 +0000 |
---|---|---|
committer | Matt O'Gorman <mogorman@digium.com> | 2006-01-12 19:07:18 +0000 |
commit | 1dc0312d01e08bd9703a7b1667d80f2d5a5fba65 (patch) | |
tree | 1c11d974a7e1006254dc6d5ea1558bc836a848dd /channels/chan_agent.c | |
parent | a44bc3a0d70c21d25e0397ae01f7327e81477f78 (diff) |
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
Diffstat (limited to 'channels/chan_agent.c')
-rw-r--r-- | channels/chan_agent.c | 36 |
1 files changed, 34 insertions, 2 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; |