]> git.sommitrealweird.co.uk Git - onak.git/blobdiff - gpgwww.c
0.3.5 release.
[onak.git] / gpgwww.c
index 5f7da460e45626a1fb2106c0084bc875d9aa5837..984aab4cc6d66a2d2c0e630f5ad28077618a593a 100644 (file)
--- a/gpgwww.c
+++ b/gpgwww.c
  * Copyright 2001-2002 Project Purple.
  */
 
-// #include <stdint.h>
 #include <inttypes.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
+#include "armor.h"
+#include "charfuncs.h"
+#include "cleanup.h"
+#include "config.h"
 #include "getcgi.h"
 #include "hash.h"
 #include "keydb.h"
-#include "onak_conf.h"
+#include "log.h"
+#include "mem.h"
+#include "onak-conf.h"
+#include "parsekey.h"
 #include "stats.h"
 
-void dofindpath(uint64_t have, uint64_t want, bool html)
+#define OP_UNKNOWN 0
+#define OP_GET     1
+
+int parsecgistuff(char **cgiparams, uint64_t *from, uint64_t *to)
+{
+       int i = 0;
+       int op = OP_UNKNOWN;
+
+       if (cgiparams != NULL) {
+               i = 0;
+               while (cgiparams[i] != NULL) {
+                       if (!strcmp(cgiparams[i], "to")) {
+                               *to = strtoul(cgiparams[i+1], NULL, 16);
+                       } else if (!strcmp(cgiparams[i], "from")) {
+                               *from = strtoul(cgiparams[i+1], NULL, 16);
+                       } else if (!strcmp(cgiparams[i], "op")) {
+                               if (!strcmp(cgiparams[i+1], "get")) {
+                                       op = OP_GET;
+                               }
+                       }
+                       i += 2;
+               }
+       }
+
+       return op;
+}
+
+int getkeyspath(uint64_t have, uint64_t want, int count)
 {
+       struct openpgp_publickey *publickey = NULL;
+       struct openpgp_packet_list *packets = NULL;
+       struct openpgp_packet_list *list_end = NULL;
        struct stats_key *keyinfoa, *keyinfob, *curkey;
+       uint64_t fullhave, fullwant;
        int rec;
-       char *uid;
+       int pathlen = 0;
+
+       fullhave = config.dbbackend->getfullkeyid(have);
+       fullwant = config.dbbackend->getfullkeyid(want);
 
        /*
         * Make sure the keys we have and want are in the cache.
         */
-       hash_getkeysigs(have);
-       hash_getkeysigs(want);
+       config.dbbackend->cached_getkeysigs(fullhave);
+       config.dbbackend->cached_getkeysigs(fullwant);
 
-       if ((keyinfoa = findinhash(have)) == NULL) {
-               printf("Couldn't find key 0x%llX.\n", have);
-               return;
+       if ((keyinfoa = findinhash(fullhave)) == NULL) {
+               return 1;
        }
-       if ((keyinfob = findinhash(want)) == NULL) {
-               printf("Couldn't find key 0x%llX.\n", want);
-               return;
+       if ((keyinfob = findinhash(fullwant)) == NULL) {
+               return 1;
        }
        
-       /*
-        * Fill the tree info up.
-        */
-       initcolour(true);
-       rec = findpath(keyinfoa, keyinfob);
-       keyinfob->parent = 0;
-
-       printf("%d nodes examined. %ld elements in the hash\n", rec,
-                       hashelements());
-       if (keyinfoa->colour == 0) {
-               printf("Can't find a link from 0x%llX to 0x%llX\n",
-                               have,
-                               want);
-       } else {
-               printf("%d steps from 0x%llX to 0x%llX\n",
-                               keyinfoa->colour, have, want);
-               curkey = keyinfoa;
-               while (curkey != NULL && curkey->keyid != 0) {
-                       uid = keyid2uid(curkey->keyid);
-                       if (html && uid == NULL) {
-                               printf("<a href=\"lookup?op=get&search=%llX\">"
-                                       "0x%llX</a> ([User id not found])%s)%s\n",
-                                       curkey->keyid,
-                                       curkey->keyid,
-                                       (curkey->keyid == want) ? "" :
-                                        " signs");
-                       } else if (html && uid != NULL) {
-                               printf("<a href=\"lookup?op=get&search=%llX\">"
-                                       "0x%llX</a> (<a href=\"lookup?op=vindex"
-                                       "&search=0x%llX\">%s</a>)%s\n",
-                                       curkey->keyid,
-                                       curkey->keyid,
-                                       curkey->keyid,
-                                       txt2html(keyid2uid(curkey->keyid)),
-                                       (curkey->keyid == want) ? "" :
-                                        " signs");
-                       } else {
-                               printf("0x%llX (%s)%s\n",
-                                       curkey->keyid,
-                                       (uid == NULL) ? "[User id not found]" :
-                                               uid,
-                                       (curkey->keyid == want) ? "" :
-                                        " signs");
+       while ((!cleanup()) && (pathlen < count)) {
+               /*
+                * Fill the tree info up.
+                */
+               initcolour(true);
+               rec = findpath(keyinfoa, keyinfob);
+               keyinfob->parent = 0;
+               if (keyinfoa->colour == 0) {
+                       pathlen = count;
+               } else {
+                       /*
+                        * Skip the first key, as the remote user will already
+                        * have it
+                        */
+                       curkey = findinhash(keyinfoa->parent);
+                       while (curkey != NULL && curkey->keyid != 0) {
+                               if (curkey->keyid != fullwant &&
+                                               config.dbbackend->fetch_key(
+                                               curkey->keyid,
+                                               &publickey, false)) {
+                                       flatten_publickey(publickey,
+                                                       &packets,
+                                                       &list_end);
+                                       free_publickey(publickey);
+                                       publickey = NULL;
+                               }
+                               if (curkey != keyinfoa && curkey != keyinfob) {
+                                       curkey->disabled = true;
+                               }
+                               curkey = findinhash(curkey->parent);
                        }
-                       curkey = findinhash(curkey->parent);
                }
+               pathlen++;
        }
-}
 
-void parsecgistuff(char **cgiparams, uint64_t *from, uint64_t *to)
-{
-       int i = 0;
-
-       if (cgiparams != NULL) {
-               i = 0;
-               while (cgiparams[i] != NULL) {
-                       if (!strcmp(cgiparams[i], "to")) {
-                               *to = strtoul(cgiparams[i+1], NULL, 16);
-                       } else if (!strcmp(cgiparams[i], "from")) {
-                               *from = strtoul(cgiparams[i+1], NULL, 16);
-                       }
-                       i += 2;
-               }
+       /*
+        * Add the destination key to the list of returned keys.
+        */
+       if (config.dbbackend->fetch_key(fullwant, &publickey, false)) {
+               flatten_publickey(publickey,
+                               &packets,
+                               &list_end);
+               free_publickey(publickey);
+               publickey = NULL;
        }
 
-       return;
+       armor_openpgp_stream(stdout_putchar, NULL, packets);
+       free_packet_list(packets);
+       packets = list_end = NULL;
+
+       return 0;
 }
 
 int main(int argc, char *argv[])
 {
-       char **cgiparams = NULL;        /* Our CGI parameter block */
-       uint64_t from = 0, to = 0;
+       char     **cgiparams = NULL;    /* Our CGI parameter block */
+       uint64_t   from = 0, to = 0;
+       int        op = OP_UNKNOWN;
 
        cgiparams = getcgivars(argc, argv);
 
-       puts("Content-Type: text/html\n");
-       puts("<HTML>");
-       puts("<HEAD>");
-       puts("<TITLE>Experimental PGP key path finder results</TITLE>");
-       puts("</HEAD>");
-       puts("<BODY>");
-       puts("</BODY>");
 
-       parsecgistuff(cgiparams, &from, &to);
+       op = parsecgistuff(cgiparams, &from, &to);
+       
+       if (op != OP_GET) {
+               start_html("Experimental PGP key path finder results");
+       } else {
+               puts("Content-Type: text/plain\n");
+       }
 
        if (from == 0 || to == 0) {
                printf("Must pass from & to\n");
@@ -129,17 +153,47 @@ int main(int argc, char *argv[])
                exit(1);
        }
 
-       printf("<P>Looking for path from 0x%llX to 0x%llX</P>\n", from, to);
-       puts("<PRE>");
-       initdb();
+       if (op != OP_GET) {
+               printf("<P>Looking for path from 0x%llX to 0x%llX.\n",
+                               from, to);
+               printf("<A HREF=\"gpgwww?from=0x%08llX&to=0x%08llX\">"
+                               "Find reverse path</A>\n",
+                               to,
+                               from);
+               printf("<A HREF=\"gpgwww?from=0x%08llX&to=0x%08llX&op=get\">"
+                               "Get all keys listed</A></P>\n",
+                               from,
+                               to);
+       }
+
+       readconfig(NULL);
+       initlogthing("gpgwww", config.logfile);
+       catchsignals();
+       config.dbbackend->initdb(true);
        inithash();
-       dofindpath(from, to, true);
-       cleanupdb();
-       puts("</PRE>");
+       logthing(LOGTHING_NOTICE, "Looking for path from 0x%llX to 0x%llX.",
+                       from,
+                       to);
+       if (op == OP_GET) {
+               getkeyspath(from, to, 3);
+       } else {
+               dofindpath(from, to, true, 3);
+       }
+       destroyhash();
+       config.dbbackend->cleanupdb();
+       cleanuplogthing();
+       cleanupconfig();
+
+       if (op != OP_GET) {
+               puts("<HR>");
+               puts("Produced by gpgwww " PACKAGE_VERSION ", part of onak. "
+                       "<A HREF=\"mailto:noodles-onak@earth.li\">"
+                       "Jonathan McDowell</A>");
+               end_html();
+       }
 
-       puts("<HR>");
-       puts("Produced by gpgwww " VERSION ", part of onak. <A HREF=\"mailto:noodles-onak@earth.li\">Jonathan McDowell</A>");
-       puts("</HTML>");
+       cleanupcgi(cgiparams);
+       cgiparams = NULL;
 
        return EXIT_SUCCESS;
 }