X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/8e58a1769ce5e492dd68904dfc81b6e077fc2a3a..488ebf5104018eb86e4e33ab3178421f8df3afb8:/onak.c?ds=inline diff --git a/onak.c b/onak.c index 7b0f2f3..5c07a5b 100644 --- a/onak.c +++ b/onak.c @@ -10,13 +10,17 @@ #include #include +#include +#include #include "armor.h" #include "keydb.h" #include "keyid.h" +#include "keyindex.h" #include "keystructs.h" #include "mem.h" #include "merge.h" +#include "onak-conf.h" #include "parsekey.h" int stdin_getchar(void *ctx, size_t count, unsigned char *c) @@ -31,11 +35,51 @@ int stdin_getchar(void *ctx, size_t count, unsigned char *c) return (ic == EOF); } -int stdout_putchar(void *ctx, unsigned char c) +int stdout_putchar(void *ctx, size_t count, unsigned char *c) { - return (putchar(c)); + int i; + + for (i = 0; i < count; i++) { + putchar(c[i]); + } + return 0; } +void find_keys(char *search, uint64_t keyid, bool ishex, + bool fingerprint, bool exact, bool verbose) +{ + struct openpgp_publickey *publickey = NULL; + int count = 0; + + if (ishex) { + count = fetch_key(keyid, &publickey, false); + } else { + count = fetch_key_text(search, &publickey); + } + if (publickey != NULL) { + key_index(publickey, verbose, fingerprint, false); + free_publickey(publickey); + } else if (count == 0) { + puts("Key not found."); + } else { + printf("Found %d keys, but maximum number to return is %d.\n", + count, + config.maxkeys); + puts("Try again with a more specific search."); + } +} + +void usage(void) { + puts("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("\tdelete - delete a given key from the keyserver"); + puts("\tget - retrieves the key requested from the keyserver"); + puts("\tindex - search for a key and list it"); + puts("\tvindex - search for a key and list it and its signatures"); +} int main(int argc, char *argv[]) { @@ -43,29 +87,114 @@ int main(int argc, char *argv[]) struct openpgp_packet_list *list_end = NULL; struct openpgp_publickey *keys = NULL; int rc = EXIT_SUCCESS; + char *search = NULL; + char *end = NULL; + uint64_t keyid = 0; + bool ishex = false; + bool verbose = false; + bool update = false; + bool binary = false; + int optchar; + + + while ((optchar = getopt(argc, argv, "buv")) != -1 ) { + switch (optchar) { + case 'b': + binary = true; + break; + case 'u': + update = true; + break; + case 'v': + verbose = true; + break; + } + } + + readconfig(); - read_openpgp_stream(stdin_getchar, NULL, &packets); - if (packets != NULL) { - parse_keys(packets, &keys); - free_packet_list(packets); - packets = NULL; + if ((argc - optind) < 1) { + usage(); + } else if (!strcmp("add", argv[optind])) { + if (binary) { + read_openpgp_stream(stdin_getchar, NULL, &packets); + } else { + dearmor_openpgp_stream(stdin_getchar, NULL, &packets); + } + if (packets != NULL) { + parse_keys(packets, &keys); + free_packet_list(packets); + packets = NULL; + if (verbose) { + fprintf(stderr, "Finished reading keys.\n"); + } + + initdb(); + fprintf(stderr, "Got %d new keys.\n", + update_keys(&keys, verbose)); + if (keys != NULL && update) { + flatten_publickey(keys, + &packets, + &list_end); + armor_openpgp_stream(stdout_putchar, + NULL, + packets); + free_packet_list(packets); + packets = NULL; + } + cleanupdb(); + } else { + rc = 1; + fprintf(stderr, "No keys read.\n"); + } + if (keys != NULL) { + free_publickey(keys); + keys = NULL; + } else { + rc = 1; + fprintf(stderr, "No changes.\n"); + } + } else if ((argc - optind) == 2) { + search = argv[optind+1]; + if (search != NULL) { + keyid = strtoul(search, &end, 16); + if (*search != 0 && + end != NULL && + *end == 0) { + ishex = true; + } + } initdb(); - fprintf(stderr, "Got %d new keys.\n", - update_keys(&keys)); + if (!strcmp("index", argv[optind])) { + find_keys(search, keyid, ishex, false, false, false); + } else if (!strcmp("vindex", argv[optind])) { + find_keys(search, keyid, ishex, false, false, true); + } else if (!strcmp("delete", argv[optind])) { + delete_key(getfullkeyid(keyid), false); + } else if (!strcmp("get", argv[optind])) { + if (fetch_key(keyid, &keys, false)) { + if (verbose) { + fprintf(stderr, "Got key.\n"); + } + flatten_publickey(keys, + &packets, + &list_end); + armor_openpgp_stream(stdout_putchar, + NULL, + packets); + free_packet_list(packets); + packets = NULL; + } else { + puts("Key not found"); + } + } cleanupdb(); } else { - rc = 1; - fprintf(stderr, "No keys read.\n"); + usage(); } - if (keys != NULL) { - free_publickey(keys); - keys = NULL; - } else { - rc = 1; - fprintf(stderr, "No changes.\n"); - } + cleanupconfig(); return rc; }