]> the.earth.li Git - onak.git/blobdiff - wotsap.c
Bump debhelper compat level to 13
[onak.git] / wotsap.c
index 339b949b798ddbdea60639f598613512ac982ced..8996c9b2d11549ba8e9f7ff93177b8776db4e5e4 100644 (file)
--- a/wotsap.c
+++ b/wotsap.c
@@ -19,8 +19,7 @@
  * more details.
  *
  * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <getopt.h>
 #include <string.h>
 #include <arpa/inet.h>
 
+#include "build-config.h"
+
 #include "hash.h"
 #include "log.h"
 #include "onak-conf.h"
 #include "stats.h"
-#include "version.h"
 
 static struct ll *sortkeyll(struct ll *keys)
 {
@@ -62,16 +62,17 @@ static struct ll *sortkeyll(struct ll *keys)
        return newll;
 }
 
-static void output_key(FILE *names, FILE *keys, uint64_t keyid)
+static void output_key(struct onak_dbctx *dbctx,
+               FILE *names, FILE *keys, uint64_t keyid)
 {
-       fprintf(names, "%s\n", config.dbbackend->keyid2uid(keyid));
+       fprintf(names, "%s\n", dbctx->keyid2uid(dbctx, keyid));
        fprintf(keys, "%c%c%c%c", (int) (keyid >> 24) & 0xFF,
                        (int) (keyid >> 16) & 0xFF,
                        (int) (keyid >>  8) & 0xFF,
                        (int) (keyid      ) & 0xFF);
 }
 
-static void wotsap(uint64_t keyid, char *dir)
+static void wotsap(struct onak_dbctx *dbctx, uint64_t keyid, char *dir)
 {
        struct ll *pending, *sigll, *sigsave;
        uint32_t curidx = 0;
@@ -83,12 +84,16 @@ static void wotsap(uint64_t keyid, char *dir)
 
        /* Length of dir + "/" + "signatures" + NUL */
        tmppath = malloc(strlen(dir) + 12);
+       if (tmppath == NULL) {
+               fprintf(stderr, "Couldn't allocate memory for directory\n");
+               goto err;
+       }
 
        sprintf(tmppath, "%s/WOTVERSION", dir);
        file = fopen(tmppath, "w");
        if (file == NULL) {
                fprintf(stderr, "Couldn't open %s\n", tmppath);
-               return;
+               goto err;
        }
        fprintf(file, "0.2\n");
        fclose(file);
@@ -97,7 +102,7 @@ static void wotsap(uint64_t keyid, char *dir)
        file = fopen(tmppath, "w");
        if (file == NULL) {
                fprintf(stderr, "Couldn't open %s\n", tmppath);
-               return;
+               goto err;
        }
        fprintf(file, "This is a Web of Trust archive.\n");
        fprintf(file, "The file format is documented at:\n");
@@ -109,42 +114,47 @@ static void wotsap(uint64_t keyid, char *dir)
        names = fopen(tmppath, "w");
        if (names == NULL) {
                fprintf(stderr, "Couldn't open %s\n", tmppath);
-               return;
+               goto err;
        }
        sprintf(tmppath, "%s/keys", dir);
        keys = fopen(tmppath, "wb");
        if (keys == NULL) {
                fprintf(stderr, "Couldn't open %s\n", tmppath);
-               return;
+               goto err;
        }
        sprintf(tmppath, "%s/signatures", dir);
        sigs = fopen(tmppath, "wb");
        if (sigs == NULL) {
                fprintf(stderr, "Couldn't open %s\n", tmppath);
-               return;
+               goto err;
        }
-       free(tmppath);
 
-       config.dbbackend->cached_getkeysigs(keyid);
+       dbctx->cached_getkeysigs(dbctx, keyid);
        curkey = findinhash(keyid);
        curkey->colour = ++curidx;
        pending = lladd(NULL, curkey);
 
-       output_key(names, keys, curkey->keyid);
+       output_key(dbctx, names, keys, curkey->keyid);
 
        while (pending != NULL) {
                curkey = (struct stats_key *) pending->object;
-               sigll = config.dbbackend->cached_getkeysigs(curkey->keyid);
+               sigll = dbctx->cached_getkeysigs(dbctx, curkey->keyid);
                sigsave = sigll = sortkeyll(sigll);
                sigcount = 0;
                while (sigll != NULL) {
                        addkey = (struct stats_key *) sigll->object;
-                       if (addkey->colour == 0) {
-                               uid = config.dbbackend->keyid2uid(addkey->keyid);
+                       if (addkey->colour == 0 && !addkey->revoked) {
+                               uid = dbctx->keyid2uid(dbctx, addkey->keyid);
                                if (uid != NULL) {
-                                       addkey->colour = ++curidx;
-                                       pending = lladdend(pending, addkey);
-                                       output_key(names, keys, addkey->keyid);
+                                       /* Force it to be loaded so we know if it's revoked */
+                                       dbctx->cached_getkeysigs(dbctx,
+                                                       addkey->keyid);
+                                       if (!addkey->revoked) {
+                                               addkey->colour = ++curidx;
+                                               pending = lladdend(pending, addkey);
+                                               output_key(dbctx, names, keys,
+                                                       addkey->keyid);
+                                       }
                                }
                        }
                        if (addkey->colour != 0) {
@@ -173,13 +183,16 @@ static void wotsap(uint64_t keyid, char *dir)
        fclose(sigs);
        fclose(keys);
        fclose(names);
+err:
+       free(tmppath);
 }
 
 int main(int argc, char *argv[])
 {
        int optchar;
        char *configfile = NULL, *dir = NULL;
-       uint64_t keyid = 0x2DA8B985;
+       uint64_t keyid = 0x94FA372B2DA8B985;
+       struct onak_dbctx *dbctx;
 
        while ((optchar = getopt(argc, argv, "c:")) != -1 ) {
                switch (optchar) {
@@ -195,11 +208,16 @@ int main(int argc, char *argv[])
 
        readconfig(configfile);
        initlogthing("wotsap", config.logfile);
-       config.dbbackend->initdb(true);
-       inithash();
-       wotsap(config.dbbackend->getfullkeyid(keyid), dir ? dir : ".");
-       destroyhash();
-       config.dbbackend->cleanupdb();
+       dbctx = config.dbinit(config.backend, true);
+       if (dbctx != NULL) {
+               inithash();
+               wotsap(dbctx, keyid, dir ? dir : ".");
+               destroyhash();
+               dbctx->cleanupdb(dbctx);
+       } else {
+               fprintf(stderr, "Couldn't initialize key database.\n");
+       }
        cleanuplogthing();
        cleanupconfig();
+       free(configfile);
 }