diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-01-02 14:47:12 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-01-02 14:47:12 +0100 |
commit | 76f5d84671a258274b0b647d234431ad70b4553e (patch) | |
tree | 353f16cc576f23bd559a2390dd505eb0b4eba6a5 /auth.c | |
parent | d0aab7b1fc7c94c3d6d41990e7615be85b58e640 (diff) |
add auth support
Diffstat (limited to 'auth.c')
-rw-r--r-- | auth.c | 59 |
1 files changed, 59 insertions, 0 deletions
@@ -66,3 +66,62 @@ void uh_auth_add(const char *path, const char *user, const char *pass) new->pass = strcpy(dest_pass, new_pass); list_add(&new->list, &auth_realms); } + +bool uh_auth_check(struct client *cl, struct path_info *pi) +{ + struct http_request *req = &cl->request; + struct auth_realm *realm; + bool user_match = false; + char *user = NULL; + char *pass = NULL; + int plen; + + if (pi->auth && !strncasecmp(pi->auth, "Basic ", 6)) { + const char *auth = pi->auth + 6; + + uh_b64decode(uh_buf, sizeof(uh_buf), auth, strlen(auth)); + pass = strchr(uh_buf, ':'); + if (pass) { + user = uh_buf; + *pass++ = 0; + } + } + + req->realm = NULL; + plen = strlen(pi->name); + list_for_each_entry(realm, &auth_realms, list) { + int rlen = strlen(realm->path); + + if (plen < rlen) + continue; + + if (strncasecmp(pi->name, realm->path, rlen) != 0) + continue; + + req->realm = realm; + if (!user) + break; + + if (strcmp(user, realm->user) != 0) + continue; + + user_match = true; + break; + } + + if (!req->realm) + return true; + + if (user_match && !strcmp(crypt(pass, realm->pass), realm->pass)) + return true; + + uh_http_header(cl, 401, "Authorization Required"); + ustream_printf(cl->us, + "WWW-Authenticate: Basic realm=\"%s\"\r\n" + "Content-Type: text/plain\r\n\r\n", + conf.realm); + uh_chunk_printf(cl, "Authorization Required\n"); + uh_request_done(cl); + + return false; +} |