X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=onak.c;h=085a876c54c9dac6ceb1d4f22bbb8ec2fcff8f91;hb=adc800dbc424a1e246dd4a82a0c2e88eeda25531;hp=e4f3105ec9f4fd5e45b740b40f7d20e0e8f9af94;hpb=9bcf53c1662548d457920cd415a2c7266c1128e2;p=onak.git diff --git a/onak.c b/onak.c index e4f3105..085a876 100644 --- a/onak.c +++ b/onak.c @@ -15,8 +15,7 @@ * 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. + * this program. If not, see . */ #include @@ -44,19 +43,27 @@ #include "photoid.h" #include "version.h" -void find_keys(char *search, uint64_t keyid, bool ishex, - bool fingerprint, bool skshash, bool exact, bool verbose) +void find_keys(struct onak_dbctx *dbctx, + char *search, uint64_t keyid, + struct openpgp_fingerprint *fingerprint, + bool ishex, bool isfp, bool dispfp, bool skshash, + bool exact, bool verbose) { struct openpgp_publickey *publickey = NULL; int count = 0; if (ishex) { - count = config.dbbackend->fetch_key(keyid, &publickey, false); + count = dbctx->fetch_key_id(dbctx, keyid, &publickey, + false); + } else if (isfp) { + count = dbctx->fetch_key_fp(dbctx, fingerprint, + &publickey, false); } else { - count = config.dbbackend->fetch_key_text(search, &publickey); + count = dbctx->fetch_key_text(dbctx, search, &publickey); } if (publickey != NULL) { - key_index(publickey, verbose, fingerprint, skshash, false); + key_index(dbctx, publickey, verbose, dispfp, skshash, + false); free_publickey(publickey); } else if (count == 0) { puts("Key not found."); @@ -68,11 +75,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; }; @@ -103,6 +118,19 @@ void dump_func(void *ctx, struct openpgp_publickey *key) return; } +static uint8_t hex2bin(char c) +{ + if (c >= '0' && c <= '9') { + return (c - '0'); + } else if (c >= 'a' && c <= 'f') { + return (c - 'a' + 10); + } else if (c >= 'A' && c <= 'F') { + return (c - 'A' + 10); + } + + return 255; +} + void usage(void) { puts("onak " ONAK_VERSION " - an OpenPGP keyserver.\n"); puts("Usage:\n"); @@ -120,6 +148,7 @@ void usage(void) { 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("\treindex - retrieve and re-store a key in the backend db"); puts("\tvindex - search for a key and list it and its signatures"); } @@ -134,15 +163,18 @@ int main(int argc, char *argv[]) char *search = NULL; char *end = NULL; uint64_t keyid = 0; + int i; bool ishex = false; - bool verbose = false; + bool isfp = false; bool update = false; bool binary = false; - bool fingerprint = false; + bool dispfp = false; bool skshash = false; int optchar; struct dump_ctx dumpstate; struct skshash hash; + struct onak_dbctx *dbctx; + struct openpgp_fingerprint fingerprint; while ((optchar = getopt(argc, argv, "bc:fsuv")) != -1 ) { switch (optchar) { @@ -153,7 +185,7 @@ int main(int argc, char *argv[]) configfile = strdup(optarg); break; case 'f': - fingerprint = true; + dispfp = true; break; case 's': skshash = true; @@ -162,7 +194,6 @@ int main(int argc, char *argv[]) update = true; break; case 'v': - verbose = true; setlogthreshold(LOGTHING_INFO); break; } @@ -175,17 +206,17 @@ int main(int argc, char *argv[]) if ((argc - optind) < 1) { usage(); } else if (!strcmp("dump", argv[optind])) { - config.dbbackend->initdb(true); + dbctx = config.dbinit(config.backend, true); dumpstate.count = dumpstate.filenum = 0; dumpstate.maxcount = 100000; dumpstate.fd = -1; dumpstate.filebase = "keydump.%d.pgp"; - config.dbbackend->iterate_keys(dump_func, &dumpstate); + dbctx->iterate_keys(dbctx, dump_func, &dumpstate); if (dumpstate.fd != -1) { close(dumpstate.fd); dumpstate.fd = -1; } - config.dbbackend->cleanupdb(); + dbctx->cleanupdb(dbctx); } else if (!strcmp("add", argv[optind])) { if (binary) { result = read_openpgp_stream(stdin_getchar, NULL, @@ -202,13 +233,13 @@ int main(int argc, char *argv[]) logthing(LOGTHING_INFO, "Finished reading %d keys.", result); - result = cleankeys(keys); + result = cleankeys(&keys, config.clean_policies); logthing(LOGTHING_INFO, "%d keys cleaned.", result); - config.dbbackend->initdb(false); + dbctx = config.dbinit(config.backend, false); logthing(LOGTHING_NOTICE, "Got %d new keys.", - config.dbbackend->update_keys(&keys, + dbctx->update_keys(dbctx, &keys, false)); if (keys != NULL && update) { flatten_publickey(keys, @@ -226,7 +257,7 @@ int main(int argc, char *argv[]) free_packet_list(packets); packets = NULL; } - config.dbbackend->cleanupdb(); + dbctx->cleanupdb(dbctx); } else { rc = 1; logthing(LOGTHING_NOTICE, "No keys read."); @@ -257,7 +288,8 @@ int main(int argc, char *argv[]) result); if (keys != NULL) { - result = cleankeys(keys); + result = cleankeys(&keys, + config.clean_policies); logthing(LOGTHING_INFO, "%d keys cleaned.", result); @@ -286,43 +318,52 @@ int main(int argc, char *argv[]) free_publickey(keys); keys = NULL; } + } else if (!strcmp("dumpconfig", argv[optind])) { + if ((argc - optind) == 2) { + writeconfig(argv[optind + 1]); + } else { + /* Dump config to stdout */ + writeconfig(NULL); + } } else if ((argc - optind) == 2) { search = argv[optind+1]; 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; + fingerprint.length = MAX_FINGERPRINT_LEN; + for (i = 0; i < MAX_FINGERPRINT_LEN; i++) { + fingerprint.fp[i] = + (hex2bin(search[2 + i * 2]) << 4) + + hex2bin(search[3 + i * 2]); } + isfp = true; } else if (search != NULL) { - keyid = strtoul(search, &end, 16); + keyid = strtouq(search, &end, 16); if (*search != 0 && end != NULL && *end == 0) { ishex = true; } } - config.dbbackend->initdb(false); + dbctx = config.dbinit(config.backend, false); if (!strcmp("index", argv[optind])) { - find_keys(search, keyid, ishex, fingerprint, skshash, + find_keys(dbctx, search, keyid, &fingerprint, ishex, + isfp, dispfp, skshash, false, false); } else if (!strcmp("vindex", argv[optind])) { - find_keys(search, keyid, ishex, fingerprint, skshash, + find_keys(dbctx, search, keyid, &fingerprint, ishex, + isfp, dispfp, 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 (config.dbbackend->fetch_key(keyid, &keys, + } else if (dbctx->fetch_key_id(dbctx, keyid, &keys, false)) { 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, @@ -334,15 +375,21 @@ int main(int argc, char *argv[]) puts("Key not found"); } } else if (!strcmp("delete", argv[optind])) { - config.dbbackend->delete_key( - config.dbbackend->getfullkeyid(keyid), + dbctx->delete_key(dbctx, + dbctx->getfullkeyid(dbctx, keyid), false); } else if (!strcmp("get", argv[optind])) { - if (!ishex) { + if (!(ishex || isfp)) { puts("Can't get a key on uid text." - " You must supply a keyid."); - } else if (config.dbbackend->fetch_key(keyid, &keys, - false)) { + " You must supply a keyid / " + "fingerprint."); + } else if ((isfp && + dbctx->fetch_key_fp(dbctx, + &fingerprint, + &keys, false)) || + (ishex && + dbctx->fetch_key_id(dbctx, keyid, + &keys, false))) { logthing(LOGTHING_INFO, "Got key."); flatten_publickey(keys, &packets, @@ -365,7 +412,7 @@ int main(int argc, char *argv[]) } 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, + } else if (dbctx->fetch_key_skshash(dbctx, &hash, &keys)) { logthing(LOGTHING_INFO, "Got key."); flatten_publickey(keys, @@ -386,14 +433,25 @@ int main(int argc, char *argv[]) } else { puts("Key not found"); } + } else if (!strcmp("reindex", argv[optind])) { + dbctx->starttrans(dbctx); + if (dbctx->fetch_key_id(dbctx, keyid, &keys, true)) { + dbctx->delete_key(dbctx, keyid, true); + cleankeys(&keys, config.clean_policies); + dbctx->store_key(dbctx, keys, true, false); + } else { + puts("Key not found"); + } + dbctx->endtrans(dbctx); } - config.dbbackend->cleanupdb(); + dbctx->cleanupdb(dbctx); } else { usage(); } cleanuplogthing(); cleanupconfig(); + free(configfile); return rc; }