X-Git-Url: http://the.earth.li/gitweb/?a=blobdiff_plain;f=keyd.c;h=a89f0e1f37aade33ecf00d4f171f92d191bf1dee;hb=cab77e4ffc25ba4fb2e5289beaa47c7d915de942;hp=4528c96fef874963542b56eccac17896887ab493;hpb=5b5ac2317e047dd77bf96a171a5e236973606a83;p=onak.git diff --git a/keyd.c b/keyd.c index 4528c96..a89f0e1 100644 --- a/keyd.c +++ b/keyd.c @@ -151,6 +151,7 @@ int sock_do(int fd) ssize_t count = 0; int ret = 0; uint64_t keyid = 0; + uint8_t fp[MAX_FINGERPRINT_LEN]; char *search = NULL; struct openpgp_publickey *key = NULL; struct openpgp_packet_list *packets = NULL; @@ -183,7 +184,7 @@ int sock_do(int fd) write(fd, &cmd, sizeof(cmd)); write(fd, &keyd_version, sizeof(keyd_version)); break; - case KEYD_CMD_GET: + case KEYD_CMD_GET_ID: cmd = KEYD_REPLY_OK; write(fd, &cmd, sizeof(cmd)); bytes = read(fd, &keyid, sizeof(keyid)); @@ -197,7 +198,8 @@ int sock_do(int fd) ", result: %d", keyid, config.dbbackend-> - fetch_key(keyid, &key, false)); + fetch_key_id(keyid, + &key, false)); if (key != NULL) { storebuf.size = 8192; storebuf.buffer = malloc(8192); @@ -229,7 +231,56 @@ int sock_do(int fd) } } break; - case KEYD_CMD_GETTEXT: + case KEYD_CMD_GET_FP: + cmd = KEYD_REPLY_OK; + write(fd, &cmd, sizeof(cmd)); + read(fd, &bytes, 1); + if (bytes > MAX_FINGERPRINT_LEN) { + ret = 1; + } else { + read(fd, fp, bytes); + } + storebuf.offset = 0; + if (ret == 0) { + logthing(LOGTHING_INFO, + "Fetching by fingerprint" + ", result: %d", + config.dbbackend-> + fetch_key_fp(fp, bytes, + &key, false)); + if (key != NULL) { + storebuf.size = 8192; + storebuf.buffer = malloc(8192); + + flatten_publickey(key, + &packets, + &list_end); + write_openpgp_stream(buffer_putchar, + &storebuf, + packets); + logthing(LOGTHING_TRACE, + "Sending %d bytes.", + storebuf.offset); + write(fd, &storebuf.offset, + sizeof(storebuf.offset)); + write(fd, storebuf.buffer, + storebuf.offset); + + free(storebuf.buffer); + storebuf.buffer = NULL; + storebuf.size = storebuf.offset = 0; + free_packet_list(packets); + packets = list_end = NULL; + free_publickey(key); + key = NULL; + } else { + write(fd, &storebuf.offset, + sizeof(storebuf.offset)); + } + } + break; + + case KEYD_CMD_GET_TEXT: cmd = KEYD_REPLY_OK; write(fd, &cmd, sizeof(cmd)); bytes = read(fd, &count, sizeof(count)); @@ -275,6 +326,7 @@ int sock_do(int fd) write(fd, &storebuf.offset, sizeof(storebuf.offset)); } + free(search); } break; case KEYD_CMD_STORE: @@ -374,7 +426,7 @@ int sock_do(int fd) write(fd, stats, sizeof(*stats)); break; - case KEYD_CMD_GETSKSHASH: + case KEYD_CMD_GET_SKSHASH: cmd = KEYD_REPLY_OK; write(fd, &cmd, sizeof(cmd)); bytes = read(fd, hash.hash, sizeof(hash.hash));