]> www.average.org Git - pam_pcsc_cr.git/blobdiff - authfile.c
html includes svg inside, adjust make rule
[pam_pcsc_cr.git] / authfile.c
index f6a7fea4057d7df1fc90a2f847762d2981c4c7bd..bb2d593deefa60a01c331d2adc1557d5e6820e19 100644 (file)
@@ -1,3 +1,26 @@
+/*
+Copyright (c) 2013 Eugene Crosser
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+    1. The origin of this software must not be misrepresented; you must
+    not claim that you wrote the original software. If you use this
+    software in a product, an acknowledgment in the product documentation
+    would be appreciated but is not required.
+
+    2. Altered source versions must be plainly marked as such, and must
+    not be misrepresented as being the original software.
+
+    3. This notice may not be removed or altered from any source
+    distribution.
+*/
+
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
@@ -11,6 +34,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <alloca.h>
+#include "base64.h"
 #include "authobj.h"
 #include "authfile.h"
 
@@ -51,7 +75,7 @@ static int path_size(const char *tokenid, const char *userid)
        } 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
@@ -113,6 +137,7 @@ struct _auth_obj authfile(const char *tokenid,
        FILE *fp = NULL;
        char *fn, *nfn;
        int fnl;
+       struct stat st = {0};
        char *buf = NULL;
        struct {
                const char *tokenid;
@@ -136,10 +161,7 @@ struct _auth_obj authfile(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)) {
@@ -153,20 +175,10 @@ struct _auth_obj authfile(const char *tokenid,
        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;
 
@@ -192,16 +204,19 @@ struct _auth_obj authfile(const char *tokenid,
 
        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);
                }