Mon Aug 31 12:30:14 2015

Asterisk developer's documentation


app_authenticate.c File Reference

Execute arbitrary authenticate commands. More...

#include "asterisk.h"
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/app.h"
#include "asterisk/astdb.h"
#include "asterisk/utils.h"

Go to the source code of this file.

Enumerations

enum  { OPT_ACCOUNT = (1 << 0), OPT_DATABASE = (1 << 1), OPT_MULTIPLE = (1 << 3), OPT_REMOVE = (1 << 4) }

Functions

 AST_APP_OPTIONS (auth_app_options,{AST_APP_OPTION('a', OPT_ACCOUNT), AST_APP_OPTION('d', OPT_DATABASE), AST_APP_OPTION('m', OPT_MULTIPLE), AST_APP_OPTION('r', OPT_REMOVE),})
 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Authentication Application")
static int auth_exec (struct ast_channel *chan, const char *data)
static int load_module (void)
static int unload_module (void)

Variables

static const char app [] = "Authenticate"

Detailed Description

Execute arbitrary authenticate commands.

Author:
Mark Spencer <markster@digium.com>

Definition in file app_authenticate.c.


Enumeration Type Documentation

anonymous enum
Enumerator:
OPT_ACCOUNT 
OPT_DATABASE 
OPT_MULTIPLE 
OPT_REMOVE 

Definition at line 45 of file app_authenticate.c.

00045      {
00046    OPT_ACCOUNT = (1 << 0),
00047    OPT_DATABASE = (1 << 1),
00048    OPT_MULTIPLE = (1 << 3),
00049    OPT_REMOVE = (1 << 4),
00050 };


Function Documentation

AST_APP_OPTIONS ( auth_app_options   ) 
AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Authentication Application"   
)
static int auth_exec ( struct ast_channel chan,
const char *  data 
) [static]

Definition at line 118 of file app_authenticate.c.

References ast_channel::_state, ast_answer(), AST_APP_ARG, ast_app_getdata(), ast_app_parse_options(), ast_cdr_setaccount(), ast_channel_lock, ast_channel_unlock, ast_db_del(), ast_db_get(), AST_DECLARE_APP_ARGS, ast_log(), ast_md5_hash(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_test_flag, ast_waitstream(), errno, f, len(), LOG_WARNING, OPT_ACCOUNT, OPT_DATABASE, OPT_MULTIPLE, OPT_REMOVE, and prompt.

Referenced by load_module().

00119 {
00120    int res = 0, retries, maxdigits;
00121    char passwd[256], *prompt = "agent-pass", *argcopy = NULL;
00122    struct ast_flags flags = {0};
00123 
00124    AST_DECLARE_APP_ARGS(arglist,
00125       AST_APP_ARG(password);
00126       AST_APP_ARG(options);
00127       AST_APP_ARG(maxdigits);
00128       AST_APP_ARG(prompt);
00129    );
00130 
00131    if (ast_strlen_zero(data)) {
00132       ast_log(LOG_WARNING, "Authenticate requires an argument(password)\n");
00133       return -1;
00134    }
00135 
00136    if (chan->_state != AST_STATE_UP) {
00137       if ((res = ast_answer(chan)))
00138          return -1;
00139    }
00140 
00141    argcopy = ast_strdupa(data);
00142 
00143    AST_STANDARD_APP_ARGS(arglist, argcopy);
00144 
00145    if (!ast_strlen_zero(arglist.options))
00146       ast_app_parse_options(auth_app_options, &flags, NULL, arglist.options);
00147 
00148    if (!ast_strlen_zero(arglist.maxdigits)) {
00149       maxdigits = atoi(arglist.maxdigits);
00150       if ((maxdigits<1) || (maxdigits>sizeof(passwd)-2))
00151          maxdigits = sizeof(passwd) - 2;
00152    } else {
00153       maxdigits = sizeof(passwd) - 2;
00154    }
00155 
00156    if (!ast_strlen_zero(arglist.prompt)) {
00157       prompt = arglist.prompt;
00158    } else {
00159       prompt = "agent-pass";
00160    }
00161    
00162    /* Start asking for password */
00163    for (retries = 0; retries < 3; retries++) {
00164       if ((res = ast_app_getdata(chan, prompt, passwd, maxdigits, 0)) < 0)
00165          break;
00166 
00167       res = 0;
00168 
00169       if (arglist.password[0] != '/') {
00170          /* Compare against a fixed password */
00171          if (!strcmp(passwd, arglist.password))
00172             break;
00173       } else if (ast_test_flag(&flags,OPT_DATABASE)) {
00174          char tmp[256];
00175          /* Compare against a database key */
00176          if (!ast_db_get(arglist.password + 1, passwd, tmp, sizeof(tmp))) {
00177             /* It's a good password */
00178             if (ast_test_flag(&flags,OPT_REMOVE))
00179                ast_db_del(arglist.password + 1, passwd);
00180             break;
00181          }
00182       } else {
00183          /* Compare against a file */
00184          FILE *f;
00185          char buf[256] = "", md5passwd[33] = "", *md5secret = NULL;
00186 
00187          if (!(f = fopen(arglist.password, "r"))) {
00188             ast_log(LOG_WARNING, "Unable to open file '%s' for authentication: %s\n", arglist.password, strerror(errno));
00189             continue;
00190          }
00191 
00192          for (;;) {
00193             size_t len;
00194 
00195             if (feof(f))
00196                break;
00197 
00198             if (!fgets(buf, sizeof(buf), f)) {
00199                continue;
00200             }
00201 
00202             if (ast_strlen_zero(buf))
00203                continue;
00204 
00205             len = strlen(buf) - 1;
00206             if (buf[len] == '\n')
00207                buf[len] = '\0';
00208 
00209             if (ast_test_flag(&flags, OPT_MULTIPLE)) {
00210                md5secret = buf;
00211                strsep(&md5secret, ":");
00212                if (!md5secret)
00213                   continue;
00214                ast_md5_hash(md5passwd, passwd);
00215                if (!strcmp(md5passwd, md5secret)) {
00216                   if (ast_test_flag(&flags,OPT_ACCOUNT)) {
00217                      ast_channel_lock(chan);
00218                      ast_cdr_setaccount(chan, buf);
00219                      ast_channel_unlock(chan);
00220                   }
00221                   break;
00222                }
00223             } else {
00224                if (!strcmp(passwd, buf)) {
00225                   if (ast_test_flag(&flags, OPT_ACCOUNT)) {
00226                      ast_channel_lock(chan);
00227                      ast_cdr_setaccount(chan, buf);
00228                      ast_channel_unlock(chan);
00229                   }
00230                   break;
00231                }
00232             }
00233          }
00234 
00235          fclose(f);
00236 
00237          if (!ast_strlen_zero(buf)) {
00238             if (ast_test_flag(&flags, OPT_MULTIPLE)) {
00239                if (md5secret && !strcmp(md5passwd, md5secret))
00240                   break;
00241             } else {
00242                if (!strcmp(passwd, buf))
00243                   break;
00244             }
00245          }
00246       }
00247       prompt = "auth-incorrect";
00248    }
00249 
00250    if ((retries < 3) && !res) {
00251       if (ast_test_flag(&flags,OPT_ACCOUNT) && !ast_test_flag(&flags,OPT_MULTIPLE)) {
00252          ast_channel_lock(chan);
00253          ast_cdr_setaccount(chan, passwd);
00254          ast_channel_unlock(chan);
00255       }
00256       if (!(res = ast_streamfile(chan, "auth-thankyou", chan->language)))
00257          res = ast_waitstream(chan, "");
00258    } else {
00259       if (!ast_streamfile(chan, "vm-goodbye", chan->language))
00260          res = ast_waitstream(chan, "");
00261       res = -1;
00262    }
00263 
00264    return res;
00265 }

static int load_module ( void   )  [static]
static int unload_module ( void   )  [static]

Definition at line 267 of file app_authenticate.c.

References ast_unregister_application().

00268 {
00269    return ast_unregister_application(app);
00270 }


Variable Documentation

const char app[] = "Authenticate" [static]

Definition at line 60 of file app_authenticate.c.


Generated on 31 Aug 2015 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1