X-Git-Url: https://the.earth.li/gitweb/?p=onak.git;a=blobdiff_plain;f=gpgwww.c;h=ae634e9c0f7f8ca6dfd0e202e8e7fe161152de39;hp=4668239bb3334347cbcf7be8c933a1e662a6346a;hb=adc800dbc424a1e246dd4a82a0c2e88eeda25531;hpb=2f81a42ec6952ef08a1a440d6044c75882158da0 diff --git a/gpgwww.c b/gpgwww.c index 4668239..ae634e9 100644 --- a/gpgwww.c +++ b/gpgwww.c @@ -1,11 +1,19 @@ /* * gpgwww.c - www interface to path finder. - * - * Jonathan McDowell * - * Copyright 2001-2002 Project Purple. + * Copyright 2001-2004 Jonathan McDowell * - * $Id: gpgwww.c,v 1.14 2004/05/26 18:53:14 noodles Exp $ + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . */ #include @@ -13,16 +21,26 @@ #include #include +#include "armor.h" +#include "charfuncs.h" +#include "cleanup.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" +#include "version.h" + +#define OP_UNKNOWN 0 +#define OP_GET 1 -void parsecgistuff(char **cgiparams, uint64_t *from, uint64_t *to) +int parsecgistuff(char **cgiparams, uint64_t *from, uint64_t *to) { int i = 0; + int op = OP_UNKNOWN; if (cgiparams != NULL) { i = 0; @@ -31,24 +49,114 @@ 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(struct onak_dbctx *dbctx, + 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 pathlen = 0; + + fullhave = dbctx->getfullkeyid(dbctx, have); + fullwant = dbctx->getfullkeyid(dbctx, want); + + /* + * Make sure the keys we have and want are in the cache. + */ + dbctx->cached_getkeysigs(dbctx, fullhave); + dbctx->cached_getkeysigs(dbctx, fullwant); + + if ((keyinfoa = findinhash(fullhave)) == NULL) { + return 1; + } + if ((keyinfob = findinhash(fullwant)) == NULL) { + return 1; + } + + while ((!cleanup()) && (pathlen < count)) { + /* + * Fill the tree info up. + */ + initcolour(true); + findpath(dbctx, 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 && + dbctx->fetch_key_id(dbctx, + 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); + } + } + pathlen++; + } + + /* + * Add the destination key to the list of returned keys. + */ + if (dbctx->fetch_key_id(dbctx, fullwant, &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; + struct onak_dbctx *dbctx; 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,30 +164,46 @@ 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%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); - initdb(true); + catchsignals(); + dbctx = config.dbinit(config.backend, true); inithash(); - logthing(LOGTHING_NOTICE, "Looking for path from 0x%llX to 0x%llX.", + logthing(LOGTHING_NOTICE, "Looking for path from 0x%016" PRIX64 + " to 0x%016" + PRIX64, from, to); - dofindpath(from, to, true, 3); + if (op == OP_GET) { + getkeyspath(dbctx, from, to, 3); + } else { + dofindpath(dbctx, from, to, true, 3); + } destroyhash(); - cleanupdb(); + dbctx->cleanupdb(dbctx); cleanuplogthing(); cleanupconfig(); - puts("
"); - puts("Produced by gpgwww " VERSION ", part of onak. " - "" - "Jonathan McDowell"); - end_html(); + if (op != OP_GET) { + puts("
"); + puts("Produced by gpgwww " ONAK_VERSION ", part of onak. "); + end_html(); + } cleanupcgi(cgiparams); cgiparams = NULL;