From 1c156b82d16bf1fa2013cafe900f3081415aab9a Mon Sep 17 00:00:00 2001 From: Matteo Brancaleoni Date: Sun, 16 Feb 2003 06:00:12 +0000 Subject: Sun Feb 16 07:00:01 CET 2003 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@616 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/Makefile | 3 +- apps/app_authenticate.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+), 1 deletion(-) create mode 100755 apps/app_authenticate.c (limited to 'apps') diff --git a/apps/Makefile b/apps/Makefile index 95f727531..1d3ad29ad 100755 --- a/apps/Makefile +++ b/apps/Makefile @@ -17,7 +17,8 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom. app_agi.so app_qcall.so app_adsiprog.so app_getcpeid.so app_milliwatt.so \ app_zapateller.so app_datetime.so app_setcallerid.so app_festival.so \ app_queue.so app_senddtmf.so app_parkandannounce.so app_striplsd.so \ - app_setcidname.so app_lookupcidname.so app_substring.so app_macro.so + app_setcidname.so app_lookupcidname.so app_substring.so app_macro.so \ + app_authenticate.so #APPS+=app_sql_postgres.so #APPS+=app_sql_odbc.so diff --git a/apps/app_authenticate.c b/apps/app_authenticate.c new file mode 100755 index 000000000..69d244351 --- /dev/null +++ b/apps/app_authenticate.c @@ -0,0 +1,154 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * Execute arbitrary authenticate commands + * + * Copyright (C) 1999, Mark Spencer + * + * Mark Spencer + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +static char *tdesc = "Authentication Application"; + +static char *app = "Authenticate"; + +static char *synopsis = "Authenticate a user"; + +static char *descrip = +" Authenticate(password[|options]): Requires a user to enter a" +"given password in order to continue execution. If the\n" +"password begins with the '/' character, it is interpreted as\n" +"a file which contains a list of valid passwords (1 per line).\n" +"an optional set of opions may be provided by concatenating any\n" +"of the following letters:\n" +" a - Set account code to the password that is entered\n" +"\n" +"Returns 0 if the user enters a valid password within three\n" +"tries, or -1 otherwise (or on hangup).\n"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + +static int auth_exec(struct ast_channel *chan, void *data) +{ + int res=0; + int retries; + struct localuser *u; + char password[256]=""; + char passwd[256]; + char *opts; + char *prompt; + if (!data || !strlen(data)) { + ast_log(LOG_WARNING, "Authenticate requires an argument(password)\n"); + return -1; + } + LOCAL_USER_ADD(u); + if (chan->_state != AST_STATE_UP) { + res = ast_answer(chan); + if (res) { + LOCAL_USER_REMOVE(u); + return -1; + } + } + strncpy(password, data, sizeof(password) - 1); + opts=strchr(password, '|'); + if (opts) { + *opts = 0; + opts++; + } else + opts = ""; + /* Start asking for password */ + prompt = "agent-pass"; + for (retries = 0; retries < 3; retries++) { + res = ast_app_getdata(chan, prompt, passwd, sizeof(passwd) - 2, 0); + if (res < 0) + break; + res = 0; + if (password[0] == '/') { + /* Compare against a file */ + char tmp[80]; + FILE *f; + f = fopen(password, "r"); + if (f) { + char buf[256] = ""; + while(!feof(f)) { + fgets(buf, sizeof(buf), f); + if (!feof(f) && strlen(buf)) { + buf[strlen(buf) - 1] = '\0'; + if (strlen(buf) && !strcmp(passwd, buf)) + break; + } + } + fclose(f); + if (strlen(buf) && !strcmp(passwd, buf)) + break; + } else + ast_log(LOG_WARNING, "Unable to open file '%s' for authentication: %s\n", password, strerror(errno)); + } else { + /* Compare against a fixed password */ + if (!strcmp(passwd, password)) + break; + } + prompt="auth-incorrect"; + } + if ((retries < 3) && !res) { + if (strchr(opts, 'a')) + ast_cdr_setaccount(chan, passwd); + } else { + if (!res) + res = ast_streamfile(chan, "vm-goodbye", chan->language); + if (!res) + res = ast_waitstream(chan, ""); + res = -1; + } + LOCAL_USER_REMOVE(u); + return res; +} + +int unload_module(void) +{ + STANDARD_HANGUP_LOCALUSERS; + return ast_unregister_application(app); +} + +int load_module(void) +{ + return ast_register_application(app, auth_exec, synopsis, descrip); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} + +char *key() +{ + return ASTERISK_GPL_KEY; +} -- cgit v1.2.3