Wed Apr 6 11:29:49 2011

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

static void __reg_module (void)
static void __unreg_module (void)
static int auth_exec (struct ast_channel *chan, const char *data)
static int load_module (void)
static int unload_module (void)

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Authentication Application" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static const char app [] = "Authenticate"
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_app_option auth_app_options [128] = { [ 'a' ] = { .flag = OPT_ACCOUNT }, [ 'd' ] = { .flag = OPT_DATABASE }, [ 'm' ] = { .flag = OPT_MULTIPLE }, [ 'r' ] = { .flag = OPT_REMOVE },}


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 41 of file app_authenticate.c.

00041      {
00042    OPT_ACCOUNT = (1 << 0),
00043    OPT_DATABASE = (1 << 1),
00044    OPT_MULTIPLE = (1 << 3),
00045    OPT_REMOVE = (1 << 4),
00046 };


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 260 of file app_authenticate.c.

static void __unreg_module ( void   )  [static]

Definition at line 260 of file app_authenticate.c.

static int auth_exec ( struct ast_channel chan,
const char *  data 
) [static]

Definition at line 108 of file app_authenticate.c.

References ast_channel::_state, ast_answer(), AST_APP_ARG, ast_app_getdata(), ast_app_parse_options(), ast_db_del(), ast_db_get(), AST_DECLARE_APP_ARGS, ast_log(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_strdupa, ast_strlen_zero(), ast_test_flag, auth_app_options, ast_flags::flags, LOG_WARNING, OPT_DATABASE, OPT_REMOVE, and prompt.

Referenced by load_module().

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

static int load_module ( void   )  [static]

Definition at line 253 of file app_authenticate.c.

References AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, ast_register_application_xml, and auth_exec().

00254 {
00255    if (ast_register_application_xml(app, auth_exec))
00256       return AST_MODULE_LOAD_FAILURE;
00257    return AST_MODULE_LOAD_SUCCESS;
00258 }

static int unload_module ( void   )  [static]

Definition at line 248 of file app_authenticate.c.

References ast_unregister_application().

00249 {
00250    return ast_unregister_application(app);
00251 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Authentication Application" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 260 of file app_authenticate.c.

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

Definition at line 56 of file app_authenticate.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 260 of file app_authenticate.c.

struct ast_app_option auth_app_options[128] = { [ 'a' ] = { .flag = OPT_ACCOUNT }, [ 'd' ] = { .flag = OPT_DATABASE }, [ 'm' ] = { .flag = OPT_MULTIPLE }, [ 'r' ] = { .flag = OPT_REMOVE },} [static]

Definition at line 53 of file app_authenticate.c.

Referenced by auth_exec().


Generated on Wed Apr 6 11:29:49 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7