#include <unistd.h>
#include <errno.h>
#include <alloca.h>
+#include "base64.h"
#include "authobj.h"
#include "authfile.h"
} else {
usub = userid;
}
- return strlen(template) + p?strlen(usub):0 + q?strlen(tokenid):0 + 1;
+ return strlen(template)+(p?strlen(usub):0)+(q?strlen(tokenid):0)+1;
}
static void
FILE *fp = NULL;
char *fn, *nfn;
int fnl;
+ struct stat st = {0};
char *buf = NULL;
struct {
const char *tokenid;
snprintf(nfn, fnl+32, "%s.%d.%ld", fn, (int)getpid(), (long)time(NULL));
fp = fopen(fn, "r");
if (fp) {
- struct stat st;
- int fd = fileno(fp);
-
- if (fstat(fd, &st)) st.st_size = 2047;
+ if (fstat(fileno(fp), &st)) st.st_size = 2047;
if (st.st_size > 2047) st.st_size = 2047;
buf = alloca(st.st_size + 1);
if (!fgets(buf, st.st_size + 1, fp)) {
if (ret.err) return ret;
if (w.hablob) {
- int hlen = strlen(w.hablob);
- if (hlen % 32 != 0) {
- ret.err = "error: auth string has wrong length";
- } else if (hlen !=
- strspn(w.hablob, "0123456789abcdefABCDEF")) {
- ret.err = "error: auth string not hexadecimal";
- } else {
- int i;
-
- blobsize = hlen/2;
- ablob = alloca(blobsize);
- for (i = 0; i < blobsize; i++)
- sscanf(&w.hablob[i*2], "%2hhx", &ablob[i]);
- }
+ blobsize = strlen(w.hablob)*3/4;
+ ablob = alloca(blobsize);
+ if (b64_decode(w.hablob, ablob, &blobsize))
+ ret.err = "error: undecodeable auth string";
}
if (ret.err) return ret;
oldmask = umask(077);
if ((fp = fopen(nfn, "w"))) {
- int i;
+ int bsize = ((ao.datasize-1)/3+1)*4+1;
+ char *b64 = alloca(bsize);
- if (fprintf(fp, "%s:%s:%s:", tokenid?tokenid:w.tokenid,
- userid?userid:w.userid, newnonce) < 0) {
- ret.err = strerror(errno);
- } else for (i = 0; i < ao.datasize; i++)
- if (fprintf(fp, "%02x", ao.data[i]) < 0) {
+ if (b64_encode(ao.data, ao.datasize, b64, &bsize)) {
+ ret.err = "error: could not encode auth string";
+ } else if (fprintf(fp, "%s:%s:%s:%s\n",
+ tokenid?tokenid:w.tokenid,
+ userid?userid:w.userid, newnonce, b64) < 0) {
ret.err = strerror(errno);
}
- fprintf(fp, "\n");
+ if (st.st_uid || st.st_gid) {
+ if (fchown(fileno(fp), st.st_uid, st.st_gid)) /*ign*/;
+ }
if (fclose(fp) < 0) {
ret.err = strerror(errno);
}