X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/f0feb22e80bfe438c16d212a7cc8be6d2282b6ac..3036551977f003d9ef3bc15e682201272f400840:/lib/cookies.c diff --git a/lib/cookies.c b/lib/cookies.c index 666c6ce..bc8e9b0 100644 --- a/lib/cookies.c +++ b/lib/cookies.c @@ -32,14 +32,16 @@ #include #include +#include "rights.h" #include "cookies.h" #include "hash.h" #include "mem.h" #include "log.h" #include "printf.h" -#include "mime.h" +#include "base64.h" #include "configuration.h" #include "kvp.h" +#include "rights.h" #include "trackdb.h" /** @brief Hash function used in signing HMAC */ @@ -147,14 +149,16 @@ char *make_cookie(const char *user) { /** @brief Verify a cookie * @param cookie Cookie to verify + * @param rights Where to store rights value * @return Verified user or NULL */ -char *verify_cookie(const char *cookie) { +char *verify_cookie(const char *cookie, rights_type *rights) { char *c1, *c2; intmax_t t; time_t now; char *user, *bp, *sig; const char *password; + struct kvp *k; /* check the revocation list */ if(revoked && hash_find(revoked, cookie)) { @@ -187,11 +191,15 @@ char *verify_cookie(const char *cookie) { return 0; } /* look up the password */ - password = trackdb_get_password(user); - if(!password) { + k = trackdb_getuserinfo(user); + if(!k) { error(0, "verify_cookie for nonexistent user"); return 0; } + password = kvp_get(k, "password"); + if(!password) password = ""; + if(parse_rights(kvp_get(k, "rights"), rights, 1)) + return 0; /* construct the expected subject. We re-encode the timestamp and the * password. */ byte_xasprintf(&bp, "%jx;%s;%s", t, urlencodestring(user), password);