diff options
Diffstat (limited to 'frontends/monkey/401login.c')
-rw-r--r-- | frontends/monkey/401login.c | 183 |
1 files changed, 164 insertions, 19 deletions
diff --git a/frontends/monkey/401login.c b/frontends/monkey/401login.c index 76550d86c..72f663ee4 100644 --- a/frontends/monkey/401login.c +++ b/frontends/monkey/401login.c @@ -16,28 +16,32 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "utils/ring.h" - #include <stdlib.h> #include <stdio.h> +#include <stdint.h> +#include <string.h> + +#include "utils/ring.h" +#include "utils/nsurl.h" #include "monkey/output.h" #include "monkey/401login.h" -typedef struct monkey401 { +struct monkey401 { struct monkey401 *r_next, *r_prev; uint32_t num; - lwc_string *host; /* Ignore */ nserror (*cb)(const char *, const char *, void *); - void *pw; -} monkey401_t; + void *cbpw; + char *username; + char *password; +}; -static monkey401_t *m4_ring = NULL; -static uint32_t m4_ctr = 0; +static struct monkey401 *m401_ring = NULL; +static uint32_t m401_ctr = 0; nserror -gui_401login_open(nsurl *url, +gui_401login_open(struct nsurl *url, const char *realm, const char *username, const char *password, @@ -46,20 +50,161 @@ gui_401login_open(nsurl *url, void *pw), void *cbpw) { - monkey401_t *m4t = calloc(sizeof(*m4t), 1); - if (m4t == NULL) { + struct monkey401 *m401_ctx; + + m401_ctx = calloc(sizeof(*m401_ctx), 1); + if (m401_ctx == NULL) { return NSERROR_NOMEM; } - m4t->cb = cb; - m4t->pw = cbpw; - m4t->num = m4_ctr++; - - RING_INSERT(m4_ring, m4t); - - moutf(MOUT_LOGIN, "OPEN LWIN %u URL %s REALM %s", - m4t->num, nsurl_access(url), realm); + m401_ctx->cb = cb; + m401_ctx->cbpw = cbpw; + m401_ctx->num = m401_ctr++; + + RING_INSERT(m401_ring, m401_ctx); + + if (username == NULL) { + username = ""; + } + + if (password == NULL) { + password = ""; + } + + moutf(MOUT_LOGIN, "OPEN LWIN %u URL %s USER %s PASSWD %s REALM %s", + m401_ctx->num, nsurl_access(url), username, password, realm); return NSERROR_OK; } +static struct monkey401 * +monkey_find_login_by_num(uint32_t login_num) +{ + struct monkey401 *ret = NULL; + + RING_ITERATE_START(struct monkey401, m401_ring, c_ring) { + if (c_ring->num == login_num) { + ret = c_ring; + RING_ITERATE_STOP(m401_ring, c_ring); + } + } RING_ITERATE_END(m401_ring, c_ring); + + return ret; +} +static void free_login_context(struct monkey401 *m401_ctx) { + RING_REMOVE(m401_ring, m401_ctx); + if (m401_ctx->username != NULL) { + free(m401_ctx->username); + } + if (m401_ctx->password != NULL) { + free(m401_ctx->password); + } + free(m401_ctx); +} + +static void +monkey_login_handle_go(int argc, char **argv) +{ + struct monkey401 *m401_ctx; + + if (argc != 3) { + moutf(MOUT_ERROR, "LOGIN GO ARGS BAD"); + return; + } + + m401_ctx = monkey_find_login_by_num(atoi(argv[2])); + if (m401_ctx == NULL) { + moutf(MOUT_ERROR, "LOGIN NUM BAD"); + return; + } + + m401_ctx->cb(m401_ctx->username, m401_ctx->password, m401_ctx->cbpw); + + free_login_context(m401_ctx); +} + +static void +monkey_login_handle_destroy(int argc, char **argv) +{ + struct monkey401 *m401_ctx; + + if (argc != 3) { + moutf(MOUT_ERROR, "LOGIN DESTROY ARGS BAD"); + return; + } + + m401_ctx = monkey_find_login_by_num(atoi(argv[2])); + if (m401_ctx == NULL) { + moutf(MOUT_ERROR, "LOGIN NUM BAD"); + return; + } + + m401_ctx->cb(NULL, NULL, m401_ctx->cbpw); + + free_login_context(m401_ctx); +} + +static void +monkey_login_handle_username(int argc, char **argv) +{ + struct monkey401 *m401_ctx; + + if (argc != 4) { + moutf(MOUT_ERROR, "LOGIN USERNAME ARGS BAD"); + return; + } + + m401_ctx = monkey_find_login_by_num(atoi(argv[2])); + if (m401_ctx == NULL) { + moutf(MOUT_ERROR, "LOGIN NUM BAD"); + return; + } + + if (m401_ctx->username != NULL) { + free(m401_ctx->username); + } + + m401_ctx->username = strdup(argv[3]); +} + +static void +monkey_login_handle_password(int argc, char **argv) +{ + struct monkey401 *m401_ctx; + + if (argc != 4) { + moutf(MOUT_ERROR, "LOGIN PASSWORD ARGS BAD"); + return; + } + + m401_ctx = monkey_find_login_by_num(atoi(argv[2])); + if (m401_ctx == NULL) { + moutf(MOUT_ERROR, "LOGIN NUM BAD"); + return; + } + + if (m401_ctx->password != NULL) { + free(m401_ctx->password); + } + + m401_ctx->password = strdup(argv[3]); +} + +void +monkey_login_handle_command(int argc, char **argv) +{ + if (argc == 1) + return; + + if (strcmp(argv[1], "USERNAME") == 0) { + monkey_login_handle_username(argc, argv); + } else if (strcmp(argv[1], "PASSWORD") == 0) { + monkey_login_handle_password(argc, argv); + } else if (strcmp(argv[1], "DESTROY") == 0) { + monkey_login_handle_destroy(argc, argv); + } else if (strcmp(argv[1], "GO") == 0) { + monkey_login_handle_go(argc, argv); + } else { + moutf(MOUT_ERROR, "LOGIN COMMAND UNKNOWN %s\n", argv[1]); + } +} |