]> the.earth.li Git - onak.git/blobdiff - onak.c
0.6.3 release
[onak.git] / onak.c
diff --git a/onak.c b/onak.c
index 4c319cd194c68ed6137f3f6715485347a642f25f..a588b51d2fc667c668b4aa3106dabc9a2d7794be 100644 (file)
--- a/onak.c
+++ b/onak.c
@@ -56,7 +56,10 @@ void find_keys(struct onak_dbctx *dbctx,
        if (ishex) {
                count = dbctx->fetch_key_id(dbctx, keyid, &publickey,
                                false);
-       } else if (isfp) {
+       } else if (isfp && exact) {
+               count = dbctx->fetch_key(dbctx, fingerprint,
+                               &publickey, false);
+       } else if (isfp && !exact) {
                count = dbctx->fetch_key_fp(dbctx, fingerprint,
                                &publickey, false);
        } else {
@@ -165,6 +168,7 @@ int main(int argc, char *argv[])
        char                            *end = NULL;
        uint64_t                         keyid = 0;
        int                              i;
+       bool                             exact = false;
        bool                             ishex = false;
        bool                             isfp = false;
        bool                             update = false;
@@ -177,14 +181,20 @@ int main(int argc, char *argv[])
        struct onak_dbctx               *dbctx;
        struct openpgp_fingerprint       fingerprint;
 
-       while ((optchar = getopt(argc, argv, "bc:fsuv")) != -1 ) {
+       while ((optchar = getopt(argc, argv, "bc:efsuv")) != -1 ) {
                switch (optchar) {
                case 'b': 
                        binary = true;
                        break;
                case 'c':
+                       if (configfile != NULL) {
+                               free(configfile);
+                       }
                        configfile = strdup(optarg);
                        break;
+               case 'e':
+                       exact = true;
+                       break;
                case 'f': 
                        dispfp = true;
                        break;
@@ -208,6 +218,12 @@ int main(int argc, char *argv[])
                usage();
        } else if (!strcmp("dump", argv[optind])) {
                dbctx = config.dbinit(config.backend, true);
+               if (dbctx == NULL) {
+                       logthing(LOGTHING_ERROR,
+                               "Failed to open key database.");
+                       rc = EXIT_FAILURE;
+                       goto err;
+               }
                dumpstate.count = dumpstate.filenum = 0;
                dumpstate.maxcount = 100000;
                dumpstate.fd = -1;
@@ -234,14 +250,24 @@ int main(int argc, char *argv[])
                        logthing(LOGTHING_INFO, "Finished reading %d keys.",
                                        result);
 
-                       result = cleankeys(&keys, config.clean_policies);
+                       dbctx = config.dbinit(config.backend, false);
+                       if (dbctx == NULL) {
+                               logthing(LOGTHING_ERROR,
+                                       "Failed to open key database.");
+                               rc = EXIT_FAILURE;
+                               goto err;
+                       }
+                       result = cleankeys(dbctx, &keys,
+                                       config.clean_policies);
                        logthing(LOGTHING_INFO, "%d keys cleaned.",
                                        result);
 
-                       dbctx = config.dbinit(config.backend, false);
                        logthing(LOGTHING_NOTICE, "Got %d new keys.",
                                        dbctx->update_keys(dbctx, &keys,
-                                       false));
+                                               &config.blacklist,
+                                               (config.clean_policies &
+                                                ONAK_CLEAN_UPDATE_ONLY),
+                                               false));
                        if (keys != NULL && update) {
                                flatten_publickey(keys,
                                        &packets,
@@ -272,6 +298,13 @@ int main(int argc, char *argv[])
                        logthing(LOGTHING_NOTICE, "No changes.");
                }
        } else if (!strcmp("clean", argv[optind])) {
+               dbctx = config.dbinit(config.backend, true);
+               if (dbctx == NULL) {
+                       logthing(LOGTHING_ERROR,
+                               "Failed to open key database.");
+                       rc = EXIT_FAILURE;
+                       goto err;
+               }
                if (binary) {
                        result = read_openpgp_stream(stdin_getchar, NULL,
                                 &packets, 0);
@@ -289,7 +322,7 @@ int main(int argc, char *argv[])
                                        result);
 
                        if (keys != NULL) {
-                               result = cleankeys(&keys,
+                               result = cleankeys(dbctx, &keys,
                                                config.clean_policies);
                                logthing(LOGTHING_INFO, "%d keys cleaned.",
                                                result);
@@ -319,6 +352,7 @@ int main(int argc, char *argv[])
                        free_publickey(keys);
                        keys = NULL;
                }
+               dbctx->cleanupdb(dbctx);
        } else if (!strcmp("dumpconfig", argv[optind])) {
                if ((argc - optind) == 2) {
                        writeconfig(argv[optind + 1]);
@@ -357,14 +391,20 @@ int main(int argc, char *argv[])
                        }
                }
                dbctx = config.dbinit(config.backend, false);
+               if (dbctx == NULL) {
+                       logthing(LOGTHING_ERROR,
+                               "Failed to open key database.");
+                       rc = EXIT_FAILURE;
+                       goto err;
+               }
                if (!strcmp("index", argv[optind])) {
                        find_keys(dbctx, search, keyid, &fingerprint, ishex,
                                        isfp, dispfp, skshash,
-                                       false, false);
+                                       exact, false);
                } else if (!strcmp("vindex", argv[optind])) {
                        find_keys(dbctx, search, keyid, &fingerprint, ishex,
                                        isfp, dispfp, skshash,
-                                       false, true);
+                                       exact, true);
                } else if (!strcmp("getphoto", argv[optind])) {
                        if (!ishex) {
                                puts("Can't get a key on uid text."
@@ -459,7 +499,7 @@ int main(int argc, char *argv[])
                        if (dbctx->fetch_key_id(dbctx, keyid, &keys, true)) {
                                get_fingerprint(keys->publickey, &fingerprint);
                                dbctx->delete_key(dbctx, &fingerprint, true);
-                               cleankeys(&keys, config.clean_policies);
+                               cleankeys(dbctx, &keys, config.clean_policies);
                                dbctx->store_key(dbctx, keys, true, false);
                        } else {
                                puts("Key not found");
@@ -471,6 +511,7 @@ int main(int argc, char *argv[])
                usage();
        }
 
+err:
        cleanuplogthing();
        cleanupconfig();
        free(configfile);