X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/01108b24506dbe2083a23b61baa0bba9451f5ee0..HEAD:/onak.c diff --git a/onak.c b/onak.c index e6b9287..6baea3d 100644 --- a/onak.c +++ b/onak.c @@ -3,9 +3,20 @@ * * This is the main swiss army knife binary. * - * Jonathan McDowell - * - * Copyright 2002 Project Purple + * Copyright 2002 Jonathan McDowell + * + * 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, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -21,7 +32,6 @@ #include "charfuncs.h" #include "cleankey.h" #include "cleanup.h" -#include "config.h" #include "keydb.h" #include "keyid.h" #include "keyindex.h" @@ -32,9 +42,10 @@ #include "onak-conf.h" #include "parsekey.h" #include "photoid.h" +#include "version.h" void find_keys(char *search, uint64_t keyid, bool ishex, - bool fingerprint, bool exact, bool verbose) + bool fingerprint, bool skshash, bool exact, bool verbose) { struct openpgp_publickey *publickey = NULL; int count = 0; @@ -45,7 +56,7 @@ void find_keys(char *search, uint64_t keyid, bool ishex, count = config.dbbackend->fetch_key_text(search, &publickey); } if (publickey != NULL) { - key_index(publickey, verbose, fingerprint, false); + key_index(publickey, verbose, fingerprint, skshash, false); free_publickey(publickey); } else if (count == 0) { puts("Key not found."); @@ -57,11 +68,19 @@ void find_keys(char *search, uint64_t keyid, bool ishex, } } +/** + * @brief Context for the keyserver dumping function + */ struct dump_ctx { + /** Keys we've dumped so far to this file */ int count; + /** Maximum keys to dump per file */ int maxcount; + /** File descriptor for the current dump file */ int fd; + /** Number of the current dump file */ int filenum; + /** Base filename to use for dump files */ char *filebase; }; @@ -93,7 +112,7 @@ void dump_func(void *ctx, struct openpgp_publickey *key) } void usage(void) { - puts("onak " PACKAGE_VERSION " - an OpenPGP keyserver.\n"); + puts("onak " ONAK_VERSION " - an OpenPGP keyserver.\n"); puts("Usage:\n"); puts("\tonak [options] \n"); puts("\tCommands:\n"); @@ -128,10 +147,12 @@ int main(int argc, char *argv[]) bool update = false; bool binary = false; bool fingerprint = false; + bool skshash = false; int optchar; struct dump_ctx dumpstate; + struct skshash hash; - while ((optchar = getopt(argc, argv, "bc:fuv")) != -1 ) { + while ((optchar = getopt(argc, argv, "bc:fsuv")) != -1 ) { switch (optchar) { case 'b': binary = true; @@ -142,6 +163,9 @@ int main(int argc, char *argv[]) case 'f': fingerprint = true; break; + case 's': + skshash = true; + break; case 'u': update = true; break; @@ -272,7 +296,17 @@ int main(int argc, char *argv[]) } } else if ((argc - optind) == 2) { search = argv[optind+1]; - if (search != NULL) { + if (search != NULL && strlen(search) == 42 && + search[0] == '0' && search[1] == 'x') { + /* + * Fingerprint. Truncate to last 64 bits for + * now. + */ + keyid = strtoull(&search[26], &end, 16); + if (end != NULL && *end == 0) { + ishex = true; + } + } else if (search != NULL) { keyid = strtoul(search, &end, 16); if (*search != 0 && end != NULL && @@ -282,10 +316,10 @@ int main(int argc, char *argv[]) } config.dbbackend->initdb(false); if (!strcmp("index", argv[optind])) { - find_keys(search, keyid, ishex, fingerprint, + find_keys(search, keyid, ishex, fingerprint, skshash, false, false); } else if (!strcmp("vindex", argv[optind])) { - find_keys(search, keyid, ishex, fingerprint, + find_keys(search, keyid, ishex, fingerprint, skshash, false, true); } else if (!strcmp("getphoto", argv[optind])) { if (!ishex) { @@ -296,7 +330,8 @@ int main(int argc, char *argv[]) unsigned char *photo = NULL; size_t length = 0; - if (getphoto(keys, 0, &photo, &length)) { + if (getphoto(keys, 0, &photo, + &length) == ONAK_E_OK) { fwrite(photo, 1, length, @@ -336,6 +371,30 @@ int main(int argc, char *argv[]) } else { puts("Key not found"); } + } else if (!strcmp("hget", argv[optind])) { + if (!parse_skshash(search, &hash)) { + puts("Couldn't parse sks hash."); + } else if (config.dbbackend->fetch_key_skshash(&hash, + &keys)) { + logthing(LOGTHING_INFO, "Got key."); + flatten_publickey(keys, + &packets, + &list_end); + free_publickey(keys); + if (binary) { + write_openpgp_stream(stdout_putchar, + NULL, + packets); + } else { + armor_openpgp_stream(stdout_putchar, + NULL, + packets); + } + free_packet_list(packets); + packets = NULL; + } else { + puts("Key not found"); + } } config.dbbackend->cleanupdb(); } else {