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, see <https://www.gnu.org/licenses/>.
24 #include "build-config.h"
27 #include "charfuncs.h"
34 #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(struct onak_dbctx *dbctx,
66 uint64_t have, uint64_t want, int count)
68 struct openpgp_publickey *publickey = NULL;
69 struct openpgp_packet_list *packets = NULL;
70 struct openpgp_packet_list *list_end = NULL;
71 struct stats_key *keyinfoa, *keyinfob, *curkey;
75 * Make sure the keys we have and want are in the cache.
77 dbctx->cached_getkeysigs(dbctx, have);
78 dbctx->cached_getkeysigs(dbctx, want);
80 if ((keyinfoa = findinhash(have)) == NULL) {
83 if ((keyinfob = findinhash(want)) == NULL) {
87 while ((!cleanup()) && (pathlen < count)) {
89 * Fill the tree info up.
92 findpath(dbctx, keyinfoa, keyinfob);
94 if (keyinfoa->colour == 0) {
98 * Skip the first key, as the remote user will already
101 curkey = findinhash(keyinfoa->parent);
102 while (curkey != NULL && curkey->keyid != 0) {
103 if (curkey->keyid != want &&
104 dbctx->fetch_key_id(dbctx,
106 &publickey, false)) {
107 flatten_publickey(publickey,
110 free_publickey(publickey);
113 if (curkey != keyinfoa && curkey != keyinfob) {
114 curkey->disabled = true;
116 curkey = findinhash(curkey->parent);
123 * Add the destination key to the list of returned keys.
125 if (dbctx->fetch_key_id(dbctx, want, &publickey, false)) {
126 flatten_publickey(publickey,
129 free_publickey(publickey);
133 armor_openpgp_stream(stdout_putchar, NULL, packets);
134 free_packet_list(packets);
135 packets = list_end = NULL;
140 int main(int argc, char *argv[])
142 char **cgiparams = NULL; /* Our CGI parameter block */
143 uint64_t from = 0, to = 0;
145 struct onak_dbctx *dbctx;
147 cgiparams = getcgivars(argc, argv);
150 op = parsecgistuff(cgiparams, &from, &to);
153 start_html("Experimental PGP key path finder results");
155 puts("Content-Type: text/plain\n");
158 if (from == 0 || to == 0) {
159 printf("Must pass from & to\n");
165 printf("<P>Looking for path from 0x%016" PRIX64" to 0x%016"
168 printf("<A HREF=\"gpgwww?from=0x%016" PRIX64 "&to=0x%016" PRIX64
169 "\">Find reverse path</A>\n",
172 printf("<A HREF=\"gpgwww?from=0x%016" PRIX64 "&to=0x%016" PRIX64
174 "Get all keys listed</A></P>\n",
180 initlogthing("gpgwww", config.logfile);
182 dbctx = config.dbinit(config.backend, true);
184 logthing(LOGTHING_NOTICE, "Looking for path from 0x%016" PRIX64
190 getkeyspath(dbctx, from, to, 3);
192 dofindpath(dbctx, from, to, true, 3);
195 dbctx->cleanupdb(dbctx);
201 puts("Produced by gpgwww " ONAK_VERSION ", part of onak. ");
205 cleanupcgi(cgiparams);