Added option for limiting a user from logging in
authorMatt O'Gorman <mogorman@digium.com>
Thu, 12 Jan 2006 19:07:18 +0000 (19:07 +0000)
committerMatt O'Gorman <mogorman@digium.com>
Thu, 12 Jan 2006 19:07:18 +0000 (19:07 +0000)
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
channels/chan_sip.c
configs/agents.conf.sample

index 39fe454..8f3f1b9 100644 (file)
@@ -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;
index 95819e5..d57c35b 100644 (file)
@@ -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);
index ac14e6d..a9c4edf 100644 (file)
 ;
 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