diff options
author | matteo <matteo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-02-16 06:00:12 +0000 |
---|---|---|
committer | matteo <matteo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-02-16 06:00:12 +0000 |
commit | 175c755fefa75d02deeff70541cd7821ce670678 (patch) | |
tree | 09bad30a14c0eef808c9d0d2720e797ff76c44f4 /apps/app_authenticate.c | |
parent | dae2009f9537257ba729035caa92eb3661c93aa1 (diff) |
Sun Feb 16 07:00:01 CET 2003
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@616 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_authenticate.c')
-rwxr-xr-x | apps/app_authenticate.c | 154 |
1 files changed, 154 insertions, 0 deletions
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 <markster@linux-support.net> + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include <asterisk/lock.h> +#include <asterisk/file.h> +#include <asterisk/logger.h> +#include <asterisk/channel.h> +#include <asterisk/pbx.h> +#include <asterisk/module.h> +#include <asterisk/app.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> + +#include <pthread.h> + + +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; +} |