aboutsummaryrefslogtreecommitdiff
path: root/www/publicfile/files/publicfile-0.52_basicauth.patch.in
diff options
context:
space:
mode:
Diffstat (limited to 'www/publicfile/files/publicfile-0.52_basicauth.patch.in')
-rw-r--r--www/publicfile/files/publicfile-0.52_basicauth.patch.in638
1 files changed, 638 insertions, 0 deletions
diff --git a/www/publicfile/files/publicfile-0.52_basicauth.patch.in b/www/publicfile/files/publicfile-0.52_basicauth.patch.in
new file mode 100644
index 000000000000..170e658d848e
--- /dev/null
+++ b/www/publicfile/files/publicfile-0.52_basicauth.patch.in
@@ -0,0 +1,638 @@
+diff -N -u -r publicfile-0.52.orig/Makefile publicfile-0.52/Makefile
+--- publicfile-0.52.orig/Makefile Mon Nov 8 23:23:46 1999
++++ publicfile-0.52/Makefile Wed Aug 29 20:27:09 2001
+@@ -234,21 +234,43 @@
+ compile hier.c auto_home.h
+ ./compile hier.c
+
++htrules: \
++load htrules.o base64.o
++ ./load htrules cdb.a base64.o byte.a getln.a stralloc.a alloc.a \
++ substdio.a str.a buffer.a unix.a
++
++htrules.o: \
++compile htrules.c strerr.h stralloc.h gen_alloc.h getln.h buffer.h \
++stralloc.h buffer.h exit.h fmt.h byte.h cdb_make.h buffer.h uint32.h \
++base64.h
++ ./compile htrules.c
++
++base64.o: \
++compile base64.c base64.h
++ ./compile base64.c
++
+ httpd: \
+ load httpd.o main.o pathdecode.o file.o filetype.o httpdate.o \
+ percent.o prot.o timeoutread.o timeoutwrite.o libtai.a case.a getln.a \
+ stralloc.a alloc.a substdio.a error.a open.a sig.a env.a str.a fs.a \
+-socket.lib
++socket.lib readclose.o openreadclose.o
+ ./load httpd main.o pathdecode.o file.o filetype.o \
+ httpdate.o percent.o prot.o timeoutread.o timeoutwrite.o \
+ libtai.a case.a getln.a stralloc.a alloc.a substdio.a \
+- error.a open.a sig.a env.a str.a fs.a `cat socket.lib`
++ error.a open.a sig.a env.a str.a fs.a cdb.a byte.a seek_set.o \
++ readclose.o openreadclose.o `cat socket.lib`
++
++cdb:
++ (cd __PORTSDIR__/databases/cdb/work/cdb-0.75 && \
++ make && \
++ cp -p cdb_make.h buffer.h cdb.h uint32.h cdb.a byte.a seek_set.o \
++ cdb_make.o error.c buffer.a unix.a __WRKSRC__/)
+
+ httpd.o: \
+ compile httpd.c pathdecode.h stralloc.h gen_alloc.h file.h tai.h \
+ uint64.h filetype.h stralloc.h percent.h stralloc.h stralloc.h sig.h \
+ exit.h fmt.h case.h str.h tai.h httpdate.h stralloc.h tai.h \
+-timeoutread.h timeoutwrite.h substdio.h error.h getln.h
++timeoutread.h timeoutwrite.h substdio.h error.h getln.h byte.h
+ ./compile httpd.c
+
+ httpdate.o: \
+@@ -358,6 +380,11 @@
+ compile open_trunc.c open.h
+ ./compile open_trunc.c
+
++openreadclose.o: \
++compile openreadclose.c error.h open.h readclose.h stralloc.h \
++gen_alloc.h openreadclose.h stralloc.h
++ ./compile openreadclose.c
++
+ pathdecode.o: \
+ compile pathdecode.c pathdecode.h stralloc.h gen_alloc.h
+ ./compile pathdecode.c
+@@ -367,7 +394,7 @@
+ ./compile percent.c
+
+ prog: \
+-configure httpd ftpd rts utime
++cdb configure httpd ftpd rts utime htrules
+
+ prot.o: \
+ compile prot.c hasshsgr.h prot.h
+diff -N -u -r publicfile-0.52.orig/README.basicauth publicfile-0.52/README.basicauth
+--- publicfile-0.52.orig/README.basicauth Wed Dec 31 16:00:00 1969
++++ publicfile-0.52/README.basicauth Wed Aug 29 22:16:02 2001
+@@ -0,0 +1,100 @@
++Here is a patch for publicfile to allow for Basic Auth.
++
++Building Instructions:
++
++Save this patch as publicfile-0.52.basicauth.patch
++Download publicfile-0.52
++Download cdb-0.75
++
++gunzip publicfile-0.52.tar
++gunzip cdb-0.75.tar
++tar -xf publicfile-0.52.tar
++cd publicfile-0.52
++tar -xf ../cdb-0.75.tar
++patch -p1 < publicfile-0.52.basicauth.patch
++
++Follow normal installation instructions for publicfile beginning with
++'make setup check'
++
++Usage Instructions:
++
++Once this patch has been applied, httpd will check for a file
++called '.access' in the current directory of any requested
++file. e.g, if /public/file/0/path/to/file.html is requested, httpd
++will first check for /public/file/0/path/to/.access.
++
++.access should have the format:
++ realm_id:realm_txt
++
++realm_id is used as documented below. realm_txt is typically
++presented by the user's browser. .access must be readable by httpd
++and only protects a specific directory. Sub-directories are not
++protected unless they also contain a .access file.
++
++An additional program will be installed in /usr/local/publicfile (or
++whatever conf-home is) called htrules. Use this like tcprules:
++
++cd /public/file
++htrules access.cdb access.tmp < access
++
++This may safely be run at any time.
++
++access should have the format:
++
++ # this is a comment. blank lines are allowed too.
++ # the next line authorizes a user to a specific realm_id
++ realm_id:username:password
++ # the next line authorizes host class.
++ realm_id:LOCALHOST
++
++access.cdb must be readable by httpd.
++
++realm_id corresponds to the realm_id in the .access file(s).
++
++Each realm_id line specifies either a username:password combination
++or a host class. Note that the same username may have different
++passwords in different realm_id's.
++
++A host is mapped into a host class via the environment
++variable HTTPCLIENT. This environment variable should be
++set in tcpserver's rules.cdb.
++
++Here is an example:
++
++ === /public/file/0/private1/.access ===
++ realm1:Dr. Suess
++
++ === /public/file/0/private2/.access ===
++ realm2:Sesame Street
++
++ === /public/file/access ===
++ # realm1 are Dr Suess users/clients
++ realm1:john:catinthehat
++ realm1:mary:greeneggswithham
++ realm1:LOCALHOST
++ realm1:DR SUESS
++ # realm1 are Sesame Street users/clients
++ realm2:tom:bigbird
++ realm2:abi:cookiemonster
++ realm2:mary:earnie
++ realm2:LOCALHOST
++ realm2:SESAME STREET
++
++ === /etc/rules ===
++ 127.0.0.1:allow,HTTPCLIENT="LOCALHOST"
++ 10.0.0.:allow,HTTPCLIENT="DR SUESS"
++ 10.1.0.:allow,HTTPCLIENT="SESAME STREET"
++ :allow
++
++The changes to the Makefile aren't very clean, but everything compiles
++correctly.
++
++Thanks to Eric M. Johnston's for base64.{c,h} from YAQSAP
++(Yet Another qmail SMTP AUTH Patch) -
++http://qmail.goof.com/qmail-auth-20010105.tar.gz
++
++This patch available at
++http://www.soffian.org/downloads/publicfile-0.52_basicauth.patch
++
++Jay Soffian <jay@soffian.org> 29 Aug 2001
++
+diff -N -u -r publicfile-0.52.orig/base64.c publicfile-0.52/base64.c
+--- publicfile-0.52.orig/base64.c Wed Dec 31 16:00:00 1969
++++ publicfile-0.52/base64.c Wed Aug 22 22:17:39 2001
+@@ -0,0 +1,90 @@
++#include "base64.h"
++#include "stralloc.h"
++#include "substdio.h"
++#include "str.h"
++
++static char *b64alpha =
++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
++#define B64PAD '='
++
++/* returns 0 ok, 1 illegal, -1 problem */
++
++int b64decode(in,l,out)
++const unsigned char *in;
++int l;
++stralloc *out; /* not null terminated */
++{
++ int i, j;
++ unsigned char a[4];
++ unsigned char b[3];
++ char *s;
++
++ if (l == 0)
++ {
++ if (!stralloc_copys(out,"")) return -1;
++ return 0;
++ }
++
++ if (!stralloc_ready(out,l + 2)) return -1; /* XXX generous */
++ s = out->s;
++
++ for (i = 0;i < l;i += 4) {
++ for (j = 0;j < 4;j++)
++ if ((i + j) < l && in[i + j] != B64PAD)
++ {
++ a[j] = str_chr(b64alpha,in[i + j]);
++ if (a[j] > 63) return 1;
++ }
++ else a[j] = 0;
++
++ b[0] = (a[0] << 2) | (a[1] >> 4);
++ b[1] = (a[1] << 4) | (a[2] >> 2);
++ b[2] = (a[2] << 6) | (a[3]);
++
++ *s++ = b[0];
++
++ if (in[i + 1] == B64PAD) break;
++ *s++ = b[1];
++
++ if (in[i + 2] == B64PAD) break;
++ *s++ = b[2];
++ }
++ out->len = s - out->s;
++ while (out->len && !out->s[out->len - 1]) --out->len; /* XXX avoid? */
++ return 0;
++}
++
++int b64encode(in,out)
++stralloc *in;
++stralloc *out; /* not null terminated */
++{
++ unsigned char a, b, c;
++ int i;
++ char *s;
++
++ if (in->len == 0)
++ {
++ if (!stralloc_copys(out,"")) return -1;
++ return 0;
++ }
++
++ if (!stralloc_ready(out,in->len / 3 * 4 + 4)) return -1;
++ s = out->s;
++
++ for (i = 0;i < in->len;i += 3) {
++ a = in->s[i];
++ b = i + 1 < in->len ? in->s[i + 1] : 0;
++ c = i + 2 < in->len ? in->s[i + 2] : 0;
++
++ *s++ = b64alpha[a >> 2];
++ *s++ = b64alpha[((a & 3 ) << 4) | (b >> 4)];
++
++ if (i + 1 >= in->len) *s++ = B64PAD;
++ else *s++ = b64alpha[((b & 15) << 2) | (c >> 6)];
++
++ if (i + 2 >= in->len) *s++ = B64PAD;
++ else *s++ = b64alpha[c & 63];
++ }
++ out->len = s - out->s;
++ return 0;
++}
+diff -N -u -r publicfile-0.52.orig/base64.h publicfile-0.52/base64.h
+--- publicfile-0.52.orig/base64.h Wed Dec 31 16:00:00 1969
++++ publicfile-0.52/base64.h Wed Aug 22 22:17:39 2001
+@@ -0,0 +1,7 @@
++#ifndef BASE64_H
++#define BASE64_H
++
++extern int b64decode();
++extern int b64encode();
++
++#endif
+diff -N -u -r publicfile-0.52.orig/hier.c publicfile-0.52/hier.c
+--- publicfile-0.52.orig/hier.c Mon Nov 8 23:23:46 1999
++++ publicfile-0.52/hier.c Wed Aug 22 22:17:39 2001
+@@ -7,6 +7,7 @@
+ d(auto_home,"bin",-1,-1,02755);
+
+ c(auto_home,"bin","configure",-1,-1,0755);
++ c(auto_home,"bin","htrules",-1,-1,0755);
+ c(auto_home,"bin","httpd",-1,-1,0755);
+ c(auto_home,"bin","ftpd",-1,-1,0755);
+ }
+diff -N -u -r publicfile-0.52.orig/htrules.c publicfile-0.52/htrules.c
+--- publicfile-0.52.orig/htrules.c Wed Dec 31 16:00:00 1969
++++ publicfile-0.52/htrules.c Wed Aug 29 21:27:42 2001
+@@ -0,0 +1,117 @@
++#include "strerr.h"
++#include "stralloc.h"
++#include "getln.h"
++#include "buffer.h"
++#include "exit.h"
++#include "fmt.h"
++#include "byte.h"
++#include "base64.h"
++#include "cdb_make.h"
++
++#define FATAL "htrules: fatal: "
++
++unsigned long linenum = 0;
++char *fntemp;
++char *fn;
++
++stralloc line = {0};
++int match = 1;
++
++stralloc base64 = {0};
++stralloc key = {0};
++stralloc realm = {0};
++stralloc userpass = {0};
++
++struct cdb_make c;
++
++void nomem(void)
++{
++ strerr_die2x(111,FATAL,"out of memory");
++}
++void usage(void)
++{
++ strerr_die1x(100,"htrules: usage: htrules access.cdb access.tmp");
++}
++void die_bad(void)
++{
++ if (!stralloc_0(&line)) nomem();
++ strerr_die3x(100,FATAL,"unable to parse this line: ",line.s);
++}
++void die_write(void)
++{
++ strerr_die4sys(111,FATAL,"unable to write to ",fntemp,": ");
++}
++
++main(int argc,char **argv)
++{
++ int colon;
++ char *x;
++ int len;
++ int fd;
++ int i;
++ char ch;
++
++ fn = argv[1];
++ if (!fn) usage();
++ fntemp = argv[2];
++ if (!fntemp) usage();
++
++ fd = open_trunc(fntemp);
++ if (fd == -1)
++ strerr_die4sys(111,FATAL,"unable to create ",fntemp,": ");
++ if (cdb_make_start(&c,fd) == -1) die_write();
++
++ while (match) {
++ if (getln(buffer_0,&line,&match,'\n') == -1)
++ strerr_die2sys(111,FATAL,"unable to read input: ");
++
++ x = line.s; len = line.len;
++
++ if (!len) break;
++ if (x[0] == '#') continue;
++ if (x[0] == '\n') continue;
++
++ while (len) {
++ ch = x[len - 1];
++ if (ch != '\n') if (ch != ' ') if (ch != '\t') break;
++ --len;
++ }
++ line.len = len; /* for die_bad() */
++ if (!len) continue;
++
++ colon = byte_chr(x,len,':');
++ if (!colon || colon == len) die_bad();
++ if (!stralloc_copyb(&realm,x,colon)) nomem();
++ x += colon + 1; len -= colon + 1;
++
++ colon = byte_chr(x,len,':');
++ if (colon == len) {
++ if (!stralloc_copyb(&key,"C",1)) nomem();
++ if (!stralloc_cat(&key,&realm)) nomem();
++ if (!stralloc_catb(&key,":",1)) nomem();
++ if (!stralloc_catb(&key,x,len)) nomem();
++ if (cdb_make_add(&c,key.s,key.len,"",0) == -1) die_write();
++ } else {
++ if (!stralloc_copyb(&userpass,x,len)) nomem();
++ if (b64encode(&userpass,&base64) == -1) nomem();
++
++ if (!stralloc_copyb(&key,"U",1)) nomem();
++ if (!stralloc_cat(&key,&base64)) nomem();
++ if (cdb_make_add(&c,key.s,key.len,"",0) == -1) die_write();
++
++ if (!stralloc_copyb(&key,"R",1)) nomem();
++ if (!stralloc_cat(&key,&realm)) nomem();
++ if (!stralloc_catb(&key,":",1)) nomem();
++ if (!stralloc_cat(&key,&base64)) nomem();
++ if (cdb_make_add(&c,key.s,key.len,"",0) == -1) die_write();
++ }
++ }
++
++ if (cdb_make_finish(&c) == -1) die_write();
++ if (fsync(fd) == -1) die_write();
++ if (close(fd) == -1) die_write(); /* NFS stupidity */
++ if (rename(fntemp,fn))
++ strerr_die6sys(111,FATAL,"unable to move ",fntemp," to ",fn,": ");
++
++ _exit(0);
++}
+diff -N -u -r publicfile-0.52.orig/httpd.c publicfile-0.52/httpd.c
+--- publicfile-0.52.orig/httpd.c Mon Nov 8 23:23:46 1999
++++ publicfile-0.52/httpd.c Wed Aug 29 21:30:34 2001
+@@ -15,6 +15,10 @@
+ #include "substdio.h"
+ #include "error.h"
+ #include "getln.h"
++#include "byte.h"
++#include "cdb.h"
++#include "openreadclose.h"
++#include "env.h"
+
+ int safewrite(int fd,char *buf,int len)
+ {
+@@ -51,6 +55,7 @@
+ stralloc host = {0};
+ stralloc path = {0};
+ stralloc ims = {0};
++stralloc basic_auth = {0};
+ int flagbody = 1;
+
+ char filebuf[1024];
+@@ -75,11 +80,16 @@
+ out_puts("\r\n");
+ }
+
+-void barf(char *code,char *message)
++void barf2(char *code,char *message,char *realm)
+ {
+ if (protocolnum > 0) {
+ tai_now(&now);
+ header(code,message);
++ if(realm) {
++ out_puts("WWW-Authenticate: Basic realm=\"");
++ out_puts(realm);
++ out_puts("\"\r\n");
++ }
+ out_puts("Content-Length: ");
+ out_put(strnum,fmt_ulong(strnum,str_len(message) + 28));
+ out_puts("\r\n");
+@@ -100,8 +110,81 @@
+ _exit(0);
+ }
+
++void barf(char *code,char *message)
++{
++ barf2(code,message,(char *)0);
++}
++
+ stralloc fn = {0};
++stralloc accessfn = {0};
+ stralloc contenttype = {0};
++stralloc realm = {0};
++stralloc realmtxt = {0};
++stralloc key = {0};
++
++void checkauth(void)
++{
++ int len;
++ int fd;
++ int colon;
++ static struct cdb c;
++ char *x;
++
++ len = byte_rchr(fn.s,fn.len,'/');
++ if (!stralloc_copyb(&accessfn,fn.s,len)) _exit(21);
++ if (!stralloc_cats(&accessfn,"/.access")) _exit(21);
++ if (!stralloc_0(&accessfn)) _exit(21);
++
++ if (openreadclose(accessfn.s,&realm,256) == 0) return;
++ if (!realm.len) _exit(23); /* no realm */
++ realm.len = byte_chr(realm.s,realm.len,'\n');
++ while (realm.len) {
++ if (realm.s[realm.len - 1] != ' ')
++ if (realm.s[realm.len - 1] != '\t')
++ break;
++ --realm.len;
++ }
++ colon = byte_chr(realm.s,realm.len,':');
++ if (!colon) _exit(23); /* no realm */
++ if (colon == realm.len) {
++ if (!stralloc_copys(&realmtxt,"restricted access")) _exit(21);
++ } else {
++ if (!stralloc_copyb(&realmtxt,realm.s+colon+1,realm.len-(colon+1))) _exit(21);
++ realm.len = colon;
++ }
++ if (!stralloc_0(&realmtxt)) _exit(21);
++
++ fd = open_read("/access.cdb");
++ if (fd == -1) _exit(23);
++ cdb_init(&c,fd);
++
++ x = env_get("HTTPCLIENT");
++ if (x) {
++ if (!stralloc_copyb(&key,"C",1)) _exit(21);
++ if (!stralloc_cat(&key,&realm)) _exit(21);
++ if (!stralloc_catb(&key,":",1)) _exit(21);
++ if (!stralloc_cats(&key,x)) _exit(21);
++ if (cdb_find(&c,key.s,key.len) == 1) goto AUTH_OK;
++ }
++
++ if (!basic_auth.len) barf2("401 ","Authorization Required", realmtxt.s);
++
++ if (!stralloc_copyb(&key,"U",1)) _exit(21);
++ if (!stralloc_cat(&key,&basic_auth)) _exit(21);
++ if (cdb_find(&c,key.s,key.len) != 1)
++ barf2("401 ","Authorization Required",realmtxt.s);
++
++ if (!stralloc_copyb(&key,"R",1)) _exit(21);
++ if (!stralloc_cat(&key,&realm)) _exit(21);
++ if (!stralloc_catb(&key,":",1)) _exit(21);
++ if (!stralloc_cat(&key,&basic_auth)) _exit(21);
++ if (cdb_find(&c,key.s,key.len) != 1) barf("403 ","Forbidden");
++
++ AUTH_OK:
++ alloc_free(key);
++ cdb_free(&c);
++ close(fd);
++}
+
+ void get(void)
+ {
+@@ -124,6 +207,8 @@
+ if (!stralloc_cat(&fn,&path)) _exit(21);
+ pathdecode(&fn);
+ if (!stralloc_0(&fn)) _exit(21);
++
++ checkauth();
+
+ fd = file_open(fn.s,&mtime,&length,1);
+ if (fd == -1)
+@@ -227,6 +312,7 @@
+ if (!stralloc_copys(&path,"")) _exit(21);
+ if (!stralloc_copys(&protocol,"")) _exit(21);
+ if (!stralloc_copys(&ims,"")) _exit(21);
++ if (!stralloc_copys(&basic_auth,"")) _exit(21);
+ protocolnum = 2;
+
+ spaces = 0;
+@@ -302,6 +388,8 @@
+ if (!stralloc_append(&host,&field.s[i])) _exit(21);
+ if (case_startb(field.s,field.len,"if-modified-since:"))
+ if (!stralloc_copyb(&ims,field.s + 18,field.len - 18)) _exit(21);
++ if (case_startb(field.s,field.len,"authorization: basic "))
++ if (!stralloc_copyb(&basic_auth,field.s + 21,field.len - 21)) _exit(21);
+ field.len = 0;
+ }
+ if (!line.len) break;
+diff -N -u -r publicfile-0.52.orig/openreadclose.c publicfile-0.52/openreadclose.c
+--- publicfile-0.52.orig/openreadclose.c Wed Dec 31 16:00:00 1969
++++ publicfile-0.52/openreadclose.c Wed Aug 29 14:24:21 2001
+@@ -0,0 +1,18 @@
++/* Public domain. */
++
++#include "error.h"
++#include "open.h"
++#include "readclose.h"
++#include "openreadclose.h"
++
++int openreadclose(const char *fn,stralloc *sa,unsigned int bufsize)
++{
++ int fd;
++ fd = open_read(fn);
++ if (fd == -1) {
++ if (errno == error_noent) return 0;
++ return -1;
++ }
++ if (readclose(fd,sa,bufsize) == -1) return -1;
++ return 1;
++}
+diff -N -u -r publicfile-0.52.orig/openreadclose.h publicfile-0.52/openreadclose.h
+--- publicfile-0.52.orig/openreadclose.h Wed Dec 31 16:00:00 1969
++++ publicfile-0.52/openreadclose.h Wed Aug 29 14:24:21 2001
+@@ -0,0 +1,10 @@
++/* Public domain. */
++
++#ifndef OPENREADCLOSE_H
++#define OPENREADCLOSE_H
++
++#include "stralloc.h"
++
++extern int openreadclose(const char *,stralloc *,unsigned int);
++
++#endif
+diff -N -u -r publicfile-0.52.orig/readclose.c publicfile-0.52/readclose.c
+--- publicfile-0.52.orig/readclose.c Wed Dec 31 16:00:00 1969
++++ publicfile-0.52/readclose.c Wed Aug 29 14:30:52 2001
+@@ -0,0 +1,23 @@
++/* Public domain. */
++
++#include <unistd.h>
++#include "error.h"
++#include "readclose.h"
++
++int readclose_append(int fd,stralloc *sa,unsigned int bufsize)
++{
++ int r;
++ for (;;) {
++ if (!stralloc_readyplus(sa,bufsize)) { close(fd); return -1; }
++ r = read(fd,sa->s + sa->len,bufsize);
++ if (r == -1) if (errno == error_intr) continue;
++ if (r <= 0) { close(fd); return r; }
++ sa->len += r;
++ }
++}
++
++int readclose(int fd,stralloc *sa,unsigned int bufsize)
++{
++ if (!stralloc_copys(sa,"")) { close(fd); return -1; }
++ return readclose_append(fd,sa,bufsize);
++}
+diff -N -u -r publicfile-0.52.orig/readclose.h publicfile-0.52/readclose.h
+--- publicfile-0.52.orig/readclose.h Wed Dec 31 16:00:00 1969
++++ publicfile-0.52/readclose.h Wed Aug 29 14:30:52 2001
+@@ -0,0 +1,11 @@
++/* Public domain. */
++
++#ifndef READCLOSE_H
++#define READCLOSE_H
++
++#include "stralloc.h"
++
++extern int readclose_append(int,stralloc *,unsigned int);
++extern int readclose(int,stralloc *,unsigned int);
++
++#endif