X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/394938c479925750ffe56c28d281945ba4003a14..33cfd5887ea8d05241b5b4749abbf7fdfadb51fe:/onak.c?ds=inline diff --git a/onak.c b/onak.c index 9af2c43..b295fea 100644 --- a/onak.c +++ b/onak.c @@ -3,20 +3,35 @@ * * 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 #include #include #include #include +#include +#include #include #include "armor.h" #include "charfuncs.h" #include "cleankey.h" +#include "cleanup.h" #include "keydb.h" #include "keyid.h" #include "keyindex.h" @@ -27,20 +42,21 @@ #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; if (ishex) { - count = fetch_key(keyid, &publickey, false); + count = config.dbbackend->fetch_key(keyid, &publickey, false); } else { - count = fetch_key_text(search, &publickey); + 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."); @@ -52,14 +68,49 @@ void find_keys(char *search, uint64_t keyid, bool ishex, } } +struct dump_ctx { + int count; + int maxcount; + int fd; + int filenum; + char *filebase; +}; + +void dump_func(void *ctx, struct openpgp_publickey *key) +{ + struct openpgp_packet_list *packets = NULL; + struct openpgp_packet_list *list_end = NULL; + struct dump_ctx *state; + char filename[1024]; + + state = (struct dump_ctx *) ctx; + + if (state->fd == -1 || state->count++ > state->maxcount) { + if (state->fd != -1) { + close(state->fd); + state->fd = -1; + } + snprintf(filename, 1023, state->filebase, state->filenum); + state->fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0640); + state->filenum++; + state->count = 0; + } + flatten_publickey(key, &packets, &list_end); + write_openpgp_stream(file_putchar, &state->fd, packets); + free_packet_list(packets); + packets = list_end = NULL; + + return; +} + void usage(void) { - puts("onak " VERSION " - an OpenPGP keyserver.\n"); + puts("onak " ONAK_VERSION " - an OpenPGP keyserver.\n"); puts("Usage:\n"); puts("\tonak [options] \n"); puts("\tCommands:\n"); puts("\tadd - read armored OpenPGP keys from stdin and add to the" " keyserver"); - puts("\tclean - read armored OpenPGP keys from stdin, run the " + puts("\tclean - read armored OpenPGP keys from stdin, run the" " cleaning\n\t routines against them and dump to" " stdout"); puts("\tdelete - delete a given key from the keyserver"); @@ -88,9 +139,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; @@ -101,6 +155,9 @@ int main(int argc, char *argv[]) case 'f': fingerprint = true; break; + case 's': + skshash = true; + break; case 'u': update = true; break; @@ -113,13 +170,22 @@ int main(int argc, char *argv[]) readconfig(configfile); initlogthing("onak", config.logfile); + catchsignals(); if ((argc - optind) < 1) { usage(); } else if (!strcmp("dump", argv[optind])) { - initdb(true); - dumpdb("keydump"); - cleanupdb(); + config.dbbackend->initdb(true); + dumpstate.count = dumpstate.filenum = 0; + dumpstate.maxcount = 100000; + dumpstate.fd = -1; + dumpstate.filebase = "keydump.%d.pgp"; + config.dbbackend->iterate_keys(dump_func, &dumpstate); + if (dumpstate.fd != -1) { + close(dumpstate.fd); + dumpstate.fd = -1; + } + config.dbbackend->cleanupdb(); } else if (!strcmp("add", argv[optind])) { if (binary) { result = read_openpgp_stream(stdin_getchar, NULL, @@ -140,9 +206,10 @@ int main(int argc, char *argv[]) logthing(LOGTHING_INFO, "%d keys cleaned.", result); - initdb(false); + config.dbbackend->initdb(false); logthing(LOGTHING_NOTICE, "Got %d new keys.", - update_keys(&keys)); + config.dbbackend->update_keys(&keys, + false)); if (keys != NULL && update) { flatten_publickey(keys, &packets, @@ -159,7 +226,7 @@ int main(int argc, char *argv[]) free_packet_list(packets); packets = NULL; } - cleanupdb(); + config.dbbackend->cleanupdb(); } else { rc = 1; logthing(LOGTHING_NOTICE, "No keys read."); @@ -229,18 +296,19 @@ int main(int argc, char *argv[]) ishex = true; } } - initdb(false); + 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) { puts("Can't get a key on uid text." " You must supply a keyid."); - } else if (fetch_key(keyid, &keys, false)) { + } else if (config.dbbackend->fetch_key(keyid, &keys, + false)) { unsigned char *photo = NULL; size_t length = 0; @@ -256,27 +324,60 @@ int main(int argc, char *argv[]) puts("Key not found"); } } else if (!strcmp("delete", argv[optind])) { - delete_key(getfullkeyid(keyid), false); + config.dbbackend->delete_key( + config.dbbackend->getfullkeyid(keyid), + false); } else if (!strcmp("get", argv[optind])) { if (!ishex) { puts("Can't get a key on uid text." " You must supply a keyid."); - } else if (fetch_key(keyid, &keys, false)) { + } else if (config.dbbackend->fetch_key(keyid, &keys, + false)) { + 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"); + } + } 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); - armor_openpgp_stream(stdout_putchar, + 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"); } } - cleanupdb(); + config.dbbackend->cleanupdb(); } else { usage(); }