]> git.sommitrealweird.co.uk Git - onak.git/blobdiff - lookup.c
Add /pks/hashquery
[onak.git] / lookup.c
index e670d498f0a38189d9fb347254f3a6d1f5fa5023..cc7953e56720aecb6256e47465922f8a1690878d 100644 (file)
--- a/lookup.c
+++ b/lookup.c
 #include "charfuncs.h"
 #include "cleankey.h"
 #include "cleanup.h"
-#include "config.h"
 #include "getcgi.h"
 #include "keydb.h"
+#include "keyid.h"
 #include "keyindex.h"
 #include "log.h"
 #include "mem.h"
 #include "onak-conf.h"
 #include "parsekey.h"
 #include "photoid.h"
+#include "version.h"
 
 #define OP_UNKNOWN 0
 #define OP_GET     1
 #define OP_INDEX   2
 #define OP_VINDEX  3
 #define OP_PHOTO   4
+#define OP_HGET    5
 
 void find_keys(char *search, uint64_t keyid, bool ishex,
-               bool fingerprint, bool exact, bool verbose, bool mrhkp)
+               bool fingerprint, bool skshash, bool exact, bool verbose,
+               bool mrhkp)
 {
        struct openpgp_publickey *publickey = NULL;
        int count = 0;
@@ -49,7 +52,8 @@ void find_keys(char *search, uint64_t keyid, bool ishex,
                        printf("info:1:%d\n", count);
                        mrkey_index(publickey);
                } else {
-                       key_index(publickey, verbose, fingerprint, true);
+                       key_index(publickey, verbose, fingerprint, skshash,
+                               true);
                }
                free_publickey(publickey);
        } else if (count == 0) {
@@ -78,6 +82,7 @@ int main(int argc, char *argv[])
        int i;
        int indx = 0;
        bool fingerprint = false;
+       bool skshash = false;
        bool exact = false;
        bool ishex = false;
        bool mrhkp = false;
@@ -88,12 +93,15 @@ int main(int argc, char *argv[])
        struct openpgp_packet_list *packets = NULL;
        struct openpgp_packet_list *list_end = NULL;
        int result;
+       struct skshash hash;
 
        params = getcgivars(argc, argv);
        for (i = 0; params != NULL && params[i] != NULL; i += 2) {
                if (!strcmp(params[i], "op")) {
                        if (!strcmp(params[i+1], "get")) {
                                op = OP_GET;
+                       } else if (!strcmp(params[i+1], "hget")) {
+                               op = OP_HGET;
                        } else if (!strcmp(params[i+1], "index")) {
                                op = OP_INDEX;
                        } else if (!strcmp(params[i+1], "vindex")) {
@@ -118,6 +126,10 @@ int main(int argc, char *argv[])
                        if (!strcmp(params[i+1], "on")) {
                                fingerprint = true;
                        }
+               } else if (!strcmp(params[i], "hash")) {
+                       if (!strcmp(params[i+1], "on")) {
+                               skshash = true;
+                       }
                } else if (!strcmp(params[i], "exact")) {
                        if (!strcmp(params[i+1], "on")) {
                                exact = true;
@@ -163,21 +175,24 @@ int main(int argc, char *argv[])
                config.dbbackend->initdb(false);
                switch (op) {
                case OP_GET:
-                       if (ishex) {
-                               logthing(LOGTHING_NOTICE, 
-                                       "Getting keyid 0x%llX",
-                                       keyid);
+               case OP_HGET:
+                       if (op == OP_HGET) {
+                               parse_skshash(search, &hash);
+                               result = config.dbbackend->fetch_key_skshash(
+                                       &hash, &publickey);
+                       } else if (ishex) {
                                result = config.dbbackend->fetch_key(keyid,
                                        &publickey, false);
                        } else {
-                               logthing(LOGTHING_NOTICE, 
-                                       "Getting key(s) for search text %s",
-                                       search);
                                result = config.dbbackend->fetch_key_text(
                                        search,
                                        &publickey);
                        }
                        if (result) {
+                               logthing(LOGTHING_NOTICE, 
+                                       "Found %d key(s) for search %s",
+                                       result,
+                                       search);
                                puts("<pre>");
                                cleankeys(publickey);
                                flatten_publickey(publickey,
@@ -189,17 +204,18 @@ int main(int argc, char *argv[])
                                puts("</pre>");
                        } else {
                                logthing(LOGTHING_NOTICE,
-                                       "Failed to fetch key.");
+                                       "Failed to find key for search %s",
+                                       search);
                                puts("Key not found");
                        }
                        break;
                case OP_INDEX:
-                       find_keys(search, keyid, ishex, fingerprint, exact,
-                                       false, mrhkp);
+                       find_keys(search, keyid, ishex, fingerprint, skshash,
+                                       exact, false, mrhkp);
                        break;
                case OP_VINDEX:
-                       find_keys(search, keyid, ishex, fingerprint, exact,
-                                       true, mrhkp);
+                       find_keys(search, keyid, ishex, fingerprint, skshash,
+                                       exact, true, mrhkp);
                        break;
                case OP_PHOTO:
                        if (config.dbbackend->fetch_key(keyid, &publickey,
@@ -227,7 +243,7 @@ int main(int argc, char *argv[])
        }
        if (!mrhkp) {
                puts("<hr>");
-               puts("Produced by onak " PACKAGE_VERSION 
+               puts("Produced by onak " ONAK_VERSION 
                                " by Jonathan McDowell");
                end_html();
        }