X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/4b8483ae278577a3adc8d84da81d77019704466f..8d14d66b84cc370cefe54b33de1b95bb49c90bf6:/gpgwww.c diff --git a/gpgwww.c b/gpgwww.c index 265422f..7d90a00 100644 --- a/gpgwww.c +++ b/gpgwww.c @@ -6,121 +6,146 @@ * Copyright 2001-2002 Project Purple. */ -// #include #include #include #include +#include +#include "armor.h" +#include "charfuncs.h" +#include "cleanup.h" +#include "config.h" #include "getcgi.h" #include "hash.h" #include "keydb.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("" - "0x%llX ([User id not found])%s)%s\n", - curkey->keyid, - curkey->keyid, - (curkey->keyid == want) ? "" : - " signs"); - } else if (html && uid != NULL) { - printf("" - "0x%llX (%s)%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(""); - puts(""); - puts("Experimental PGP key path finder results"); - puts(""); - puts(""); - puts(""); - 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"); @@ -128,17 +153,51 @@ int main(int argc, char *argv[]) exit(1); } - printf("

Looking for path from 0x%llX to 0x%llX

\n", from, to); - puts("
");
-	initdb();
+	if (op != OP_GET) {
+		printf("

Looking for path from 0x%016" PRIX64" to 0x%016" + PRIX64 ".\n", + from, to); + printf("Find reverse path\n", + to, + from); + printf("" + "Get all keys listed

\n", + from, + to); + } + + readconfig(NULL); + initlogthing("gpgwww", config.logfile); + catchsignals(); + config.dbbackend->initdb(true); inithash(); - dofindpath(from, to, true); - cleanupdb(); - puts("
"); + logthing(LOGTHING_NOTICE, "Looking for path from 0x%016" PRIX64 + " to 0x%016" + PRIX64, + 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("
"); + puts("Produced by gpgwww " PACKAGE_VERSION ", part of onak. " + "" + "Jonathan McDowell"); + end_html(); + } - puts("
"); - puts("Produced by gpgwww 0.0.1, part of onak. Jonathan McDowell"); - puts(""); + cleanupcgi(cgiparams); + cgiparams = NULL; return EXIT_SUCCESS; }