diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-01-12 00:16:07 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-01-12 00:16:07 +0100 |
commit | 6dc133ad99486167343885af1860d4e85a0f946c (patch) | |
tree | 62df9633ef90276bdc78fa964b195a82899feb5c /sys/src/cmd/webfs | |
parent | b6a42aa49c1dcbad21afbbdc3aeb1be6cd032548 (diff) |
webfs: preauth support
Diffstat (limited to 'sys/src/cmd/webfs')
-rw-r--r-- | sys/src/cmd/webfs/fns.h | 1 | ||||
-rw-r--r-- | sys/src/cmd/webfs/fs.c | 26 | ||||
-rw-r--r-- | sys/src/cmd/webfs/http.c | 2 |
3 files changed, 26 insertions, 3 deletions
diff --git a/sys/src/cmd/webfs/fns.h b/sys/src/cmd/webfs/fns.h index 9cd6f2ae2..5646bd36b 100644 --- a/sys/src/cmd/webfs/fns.h +++ b/sys/src/cmd/webfs/fns.h @@ -33,5 +33,6 @@ void bureq(Buq *q, Req *r); void buflushreq(Buq *q, Req *r); /* http */ +int authenticate(Url *u, Url *ru, char *method, char *s); void flushauth(Url *u, char *t); void http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost); diff --git a/sys/src/cmd/webfs/fs.c b/sys/src/cmd/webfs/fs.c index b513ec114..626228c30 100644 --- a/sys/src/cmd/webfs/fs.c +++ b/sys/src/cmd/webfs/fs.c @@ -543,7 +543,7 @@ fsread(Req *r) } static char* -rootctl(char *ctl, char *arg) +rootctl(Srv *fs, char *ctl, char *arg) { Url *u; @@ -578,6 +578,28 @@ rootctl(char *ctl, char *arg) return nil; } + /* ppreemptive authentication only basic + * auth supported, ctl message of the form: + * preauth url realm + */ + if(!strcmp(ctl, "preauth")){ + char *a[3], buf[256]; + int rc; + + if(tokenize(arg, a, nelem(a)) != 2) + return "preauth - bad field count"; + if((u = saneurl(url(a[0], 0))) == nil) + return "preauth - malformed url"; + snprint(buf, sizeof(buf), "BASIC realm=\"%s\"", a[1]); + srvrelease(fs); + rc = authenticate(u, u, "GET", buf); + srvacquire(fs); + freeurl(u); + if(rc == -1) + return "preauth failed"; + return nil; + } + return "bad ctl message"; } @@ -670,7 +692,7 @@ fswrite(Req *r) if(f->level == Qctl) t = clientctl(f->client, s, t); else - t = rootctl(s, t); + t = rootctl(r->srv, s, t); free(s); respond(r, t); return; diff --git a/sys/src/cmd/webfs/http.c b/sys/src/cmd/webfs/http.c index 50f84dd63..f9cb50a21 100644 --- a/sys/src/cmd/webfs/http.c +++ b/sys/src/cmd/webfs/http.c @@ -311,7 +311,7 @@ hline(Hconn *h, char *data, int len, int cont) } } -static int +int authenticate(Url *u, Url *ru, char *method, char *s) { char *user, *pass, *realm, *nonce, *opaque, *x; |