diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-01-29 20:54:37 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-01-29 20:54:37 +0000 |
commit | 6e383ebc0b3acf0efeb99639b6a5bad7974bd4d2 (patch) | |
tree | 540413e051d2f6830527a28f464b877f7380f4d9 | |
parent | 1040c3df97950d6a8ae73f25f27b9d34b53e069d (diff) |
Add support for authenticating against astdb and one time authentication
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2092 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | apps/app_authenticate.c | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/apps/app_authenticate.c b/apps/app_authenticate.c index 589ef06ba..2077d3734 100755 --- a/apps/app_authenticate.c +++ b/apps/app_authenticate.c @@ -18,6 +18,7 @@ #include <asterisk/pbx.h> #include <asterisk/module.h> #include <asterisk/app.h> +#include <asterisk/astdb.h> #include <stdlib.h> #include <unistd.h> #include <string.h> @@ -41,7 +42,11 @@ static char *descrip = "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" +" d - Interpret path as database key, not literal file\n" +" r - Remove database key upon successful entry (valid with 'd' only)\n" "\n" +"When using a database key, the value associated with the key can be\n" +"anything.\n" "Returns 0 if the user enters a valid password within three\n" "tries, or -1 otherwise (or on hangup).\n"; @@ -85,24 +90,36 @@ static int auth_exec(struct ast_channel *chan, void *data) break; res = 0; if (password[0] == '/') { - /* Compare against a file */ - 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; + if (strchr(opts, 'd')) { + char tmp[256]; + /* Compare against a database key */ + if (!ast_db_get(password + 1, passwd, tmp, sizeof(tmp))) { + /* It's a good password */ + if (strchr(opts, 'r')) { + ast_db_del(password + 1, passwd); } - } - 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 file */ + 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)) |