X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/ae384229c538b20b429ea640ec30071ae944c0e7..8b4052ad6015aa9f54c9c824f28655f230d09d8d:/onak.c?ds=inline diff --git a/onak.c b/onak.c index 2da86c9..9af2c43 100644 --- a/onak.c +++ b/onak.c @@ -6,10 +6,9 @@ * Jonathan McDowell * * Copyright 2002 Project Purple - * - * $Id: onak.c,v 1.17 2003/09/30 20:40:11 noodles Exp $ */ +#include #include #include #include @@ -17,6 +16,7 @@ #include "armor.h" #include "charfuncs.h" +#include "cleankey.h" #include "keydb.h" #include "keyid.h" #include "keyindex.h" @@ -26,6 +26,7 @@ #include "merge.h" #include "onak-conf.h" #include "parsekey.h" +#include "photoid.h" void find_keys(char *search, uint64_t keyid, bool ishex, bool fingerprint, bool exact, bool verbose) @@ -56,14 +57,19 @@ void usage(void) { puts("Usage:\n"); puts("\tonak [options] \n"); puts("\tCommands:\n"); - puts("\tadd - read armored OpenPGP keys from stdin and add to the" + puts("\tadd - read armored OpenPGP keys from stdin and add to the" " keyserver"); - puts("\tdelete - delete a given key from the keyserver"); - puts("\tdump - dump all the keys from the keyserver to a file or" - " files\n\t starting keydump*"); - 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"); + 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"); + puts("\tdump - dump all the keys from the keyserver to a file or" + " files\n\t starting keydump*"); + puts("\tget - retrieves the key requested from the keyserver"); + puts("\tgetphoto - retrieves the first photoid on the given key and" + " dumps to\n\t stdout"); + 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[]) @@ -71,6 +77,7 @@ int main(int argc, char *argv[]) struct openpgp_packet_list *packets = NULL; struct openpgp_packet_list *list_end = NULL; struct openpgp_publickey *keys = NULL; + char *configfile = NULL; int rc = EXIT_SUCCESS; int result = 0; char *search = NULL; @@ -83,11 +90,14 @@ int main(int argc, char *argv[]) bool fingerprint = false; int optchar; - while ((optchar = getopt(argc, argv, "bfuv")) != -1 ) { + while ((optchar = getopt(argc, argv, "bc:fuv")) != -1 ) { switch (optchar) { case 'b': binary = true; break; + case 'c': + configfile = strdup(optarg); + break; case 'f': fingerprint = true; break; @@ -101,13 +111,13 @@ int main(int argc, char *argv[]) } } - readconfig(); + readconfig(configfile); initlogthing("onak", config.logfile); if ((argc - optind) < 1) { usage(); } else if (!strcmp("dump", argv[optind])) { - initdb(); + initdb(true); dumpdb("keydump"); cleanupdb(); } else if (!strcmp("add", argv[optind])) { @@ -126,16 +136,26 @@ int main(int argc, char *argv[]) logthing(LOGTHING_INFO, "Finished reading %d keys.", result); - initdb(); + result = cleankeys(keys); + logthing(LOGTHING_INFO, "%d keys cleaned.", + result); + + initdb(false); logthing(LOGTHING_NOTICE, "Got %d new keys.", update_keys(&keys)); if (keys != NULL && update) { flatten_publickey(keys, &packets, &list_end); - armor_openpgp_stream(stdout_putchar, - NULL, - packets); + if (binary) { + write_openpgp_stream(stdout_putchar, + NULL, + packets); + } else { + armor_openpgp_stream(stdout_putchar, + NULL, + packets); + } free_packet_list(packets); packets = NULL; } @@ -152,6 +172,53 @@ int main(int argc, char *argv[]) rc = 1; logthing(LOGTHING_NOTICE, "No changes."); } + } else if (!strcmp("clean", argv[optind])) { + if (binary) { + result = read_openpgp_stream(stdin_getchar, NULL, + &packets, 0); + logthing(LOGTHING_INFO, + "read_openpgp_stream: %d", result); + } else { + dearmor_openpgp_stream(stdin_getchar, NULL, &packets); + } + + if (packets != NULL) { + result = parse_keys(packets, &keys); + free_packet_list(packets); + packets = NULL; + logthing(LOGTHING_INFO, "Finished reading %d keys.", + result); + + if (keys != NULL) { + result = cleankeys(keys); + logthing(LOGTHING_INFO, "%d keys cleaned.", + result); + + flatten_publickey(keys, + &packets, + &list_end); + + if (binary) { + write_openpgp_stream(stdout_putchar, + NULL, + packets); + } else { + armor_openpgp_stream(stdout_putchar, + NULL, + packets); + } + free_packet_list(packets); + packets = NULL; + } + } else { + rc = 1; + logthing(LOGTHING_NOTICE, "No keys read."); + } + + if (keys != NULL) { + free_publickey(keys); + keys = NULL; + } } else if ((argc - optind) == 2) { search = argv[optind+1]; if (search != NULL) { @@ -162,13 +229,32 @@ int main(int argc, char *argv[]) ishex = true; } } - initdb(); + initdb(false); if (!strcmp("index", argv[optind])) { find_keys(search, keyid, ishex, fingerprint, false, false); } else if (!strcmp("vindex", argv[optind])) { find_keys(search, keyid, ishex, fingerprint, 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)) { + unsigned char *photo = NULL; + size_t length = 0; + + if (getphoto(keys, 0, &photo, &length)) { + fwrite(photo, + 1, + length, + stdout); + } + free_publickey(keys); + keys = NULL; + } else { + puts("Key not found"); + } } else if (!strcmp("delete", argv[optind])) { delete_key(getfullkeyid(keyid), false); } else if (!strcmp("get", argv[optind])) {