From 1534798322db09b0f676ab5096ba5a3351b57c6c Mon Sep 17 00:00:00 2001 From: Jonathan McDowell Date: Mon, 7 Jun 2004 20:46:47 +0000 Subject: [PATCH] Add option to gpgwww to return all keys listed. This commit adds functionality to gpgwww to return all the key data for the keys listed in the paths. It's largely based on code provided by Ian Haywood . --- gpgwww.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 126 insertions(+), 17 deletions(-) diff --git a/gpgwww.c b/gpgwww.c index 4668239..570f1a8 100644 --- a/gpgwww.c +++ b/gpgwww.c @@ -13,16 +13,24 @@ #include #include +#include "armor.h" +#include "charfuncs.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 parsecgistuff(char **cgiparams, uint64_t *from, uint64_t *to) +#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; @@ -31,24 +39,112 @@ void parsecgistuff(char **cgiparams, uint64_t *from, uint64_t *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; + 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; + int pathlen = 0; + + fullhave = getfullkeyid(have); + fullwant = getfullkeyid(want); + + /* + * Make sure the keys we have and want are in the cache. + */ + cached_getkeysigs(fullhave); + cached_getkeysigs(fullwant); + + if ((keyinfoa = findinhash(fullhave)) == NULL) { + return 1; + } + if ((keyinfob = findinhash(fullwant)) == NULL) { + return 1; + } + + while (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 && fetch_key( + curkey->keyid & 0xFFFFFFFF, + &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); + } + } + pathlen++; + } + + /* + * Add the destination key to the list of returned keys. + */ + if (fetch_key(fullwant & 0xFFFFFFFF, &publickey, false)) { + flatten_publickey(publickey, + &packets, + &list_end); + free_publickey(publickey); + publickey = NULL; + } + + 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); - start_html("Experimental PGP key path finder results"); - 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"); @@ -56,11 +152,18 @@ int main(int argc, char *argv[]) exit(1); } - printf("

Looking for path from 0x%llX to 0x%llX.\n", from, to); - printf("" - "Find reverse path

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

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

\n", + from, + to); + } readconfig(NULL); initlogthing("gpgwww", config.logfile); @@ -69,17 +172,23 @@ int main(int argc, char *argv[]) logthing(LOGTHING_NOTICE, "Looking for path from 0x%llX to 0x%llX.", from, to); - dofindpath(from, to, true, 3); + if (op == OP_GET) { + getkeyspath(from, to, 3); + } else { + dofindpath(from, to, true, 3); + } destroyhash(); cleanupdb(); cleanuplogthing(); cleanupconfig(); - puts("
"); - puts("Produced by gpgwww " VERSION ", part of onak. " - "" - "Jonathan McDowell"); - end_html(); + if (op != OP_GET) { + puts("
"); + puts("Produced by gpgwww " VERSION ", part of onak. " + "" + "Jonathan McDowell"); + end_html(); + } cleanupcgi(cgiparams); cgiparams = NULL; -- 2.39.5