2 * gpgwww.c - www interface to path finder.
4 * Copyright 2001-2004 Jonathan McDowell <noodles@earth.li>
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 #include "charfuncs.h"
33 #include "onak-conf.h"
41 int parsecgistuff(char **cgiparams, uint64_t *from, uint64_t *to)
46 if (cgiparams != NULL) {
48 while (cgiparams[i] != NULL) {
49 if (!strcmp(cgiparams[i], "to")) {
50 *to = strtoul(cgiparams[i+1], NULL, 16);
51 } else if (!strcmp(cgiparams[i], "from")) {
52 *from = strtoul(cgiparams[i+1], NULL, 16);
53 } else if (!strcmp(cgiparams[i], "op")) {
54 if (!strcmp(cgiparams[i+1], "get")) {
65 int getkeyspath(uint64_t have, uint64_t want, int count)
67 struct openpgp_publickey *publickey = NULL;
68 struct openpgp_packet_list *packets = NULL;
69 struct openpgp_packet_list *list_end = NULL;
70 struct stats_key *keyinfoa, *keyinfob, *curkey;
71 uint64_t fullhave, fullwant;
75 fullhave = config.dbbackend->getfullkeyid(have);
76 fullwant = config.dbbackend->getfullkeyid(want);
79 * Make sure the keys we have and want are in the cache.
81 config.dbbackend->cached_getkeysigs(fullhave);
82 config.dbbackend->cached_getkeysigs(fullwant);
84 if ((keyinfoa = findinhash(fullhave)) == NULL) {
87 if ((keyinfob = findinhash(fullwant)) == NULL) {
91 while ((!cleanup()) && (pathlen < count)) {
93 * Fill the tree info up.
96 rec = findpath(keyinfoa, keyinfob);
98 if (keyinfoa->colour == 0) {
102 * Skip the first key, as the remote user will already
105 curkey = findinhash(keyinfoa->parent);
106 while (curkey != NULL && curkey->keyid != 0) {
107 if (curkey->keyid != fullwant &&
108 config.dbbackend->fetch_key(
110 &publickey, false)) {
111 flatten_publickey(publickey,
114 free_publickey(publickey);
117 if (curkey != keyinfoa && curkey != keyinfob) {
118 curkey->disabled = true;
120 curkey = findinhash(curkey->parent);
127 * Add the destination key to the list of returned keys.
129 if (config.dbbackend->fetch_key(fullwant, &publickey, false)) {
130 flatten_publickey(publickey,
133 free_publickey(publickey);
137 armor_openpgp_stream(stdout_putchar, NULL, packets);
138 free_packet_list(packets);
139 packets = list_end = NULL;
144 int main(int argc, char *argv[])
146 char **cgiparams = NULL; /* Our CGI parameter block */
147 uint64_t from = 0, to = 0;
150 cgiparams = getcgivars(argc, argv);
153 op = parsecgistuff(cgiparams, &from, &to);
156 start_html("Experimental PGP key path finder results");
158 puts("Content-Type: text/plain\n");
161 if (from == 0 || to == 0) {
162 printf("Must pass from & to\n");
168 printf("<P>Looking for path from 0x%016" PRIX64" to 0x%016"
171 printf("<A HREF=\"gpgwww?from=0x%016" PRIX64 "&to=0x%016" PRIX64
172 "\">Find reverse path</A>\n",
175 printf("<A HREF=\"gpgwww?from=0x%08" PRIX64 "&to=0x%08" PRIX64
177 "Get all keys listed</A></P>\n",
183 initlogthing("gpgwww", config.logfile);
185 config.dbbackend->initdb(true);
187 logthing(LOGTHING_NOTICE, "Looking for path from 0x%016" PRIX64
193 getkeyspath(from, to, 3);
195 dofindpath(from, to, true, 3);
198 config.dbbackend->cleanupdb();
204 puts("Produced by gpgwww " ONAK_VERSION ", part of onak. ");
208 cleanupcgi(cgiparams);