]> the.earth.li Git - onak.git/blobdiff - keydb/keyd.c
Provide key_fetch routine that will not search subkey fingerprints
[onak.git] / keydb / keyd.c
index ddd1366a9bb7c94b56b6d31fc7b181005ae2c663..ff02116d239a28d62762cfa4b30f3b9f50455611 100644 (file)
@@ -232,10 +232,15 @@ static int sock_init(const char *sockname)
 
                if (ret != -1) {
                        ret = listen(fd, 5);
-                       if (ret == -1) {
-                               close(fd);
-                               fd = -1;
-                       }
+               }
+
+               if (ret == -1) {
+                       logthing(LOGTHING_ERROR,
+                               "Couldn't open socket to listen on: %s (%d)",
+                               strerror(errno),
+                               errno);
+                       close(fd);
+                       fd = -1;
                }
 #ifdef HAVE_SYSTEMD
        }
@@ -295,6 +300,41 @@ static int sock_do(struct onak_dbctx *dbctx, int fd)
                                }
                        }
                        break;
+               case KEYD_CMD_GET:
+                       if (!keyd_write_reply(fd, KEYD_REPLY_OK)) {
+                               ret = 1;
+                       }
+                       if (ret == 0) {
+                               if ((read(fd, &bytes, 1) != 1) ||
+                                               (bytes > MAX_FINGERPRINT_LEN)) {
+                                       ret = 1;
+                               } else {
+                                       fingerprint.length = bytes;
+                                       bytes = read(fd, fingerprint.fp,
+                                               fingerprint.length);
+                                       if (bytes != fingerprint.length) {
+                                               ret = 1;
+                                       }
+                               }
+                       }
+                       if (ret == 0) {
+                               logthing(LOGTHING_INFO,
+                                               "Fetching by fingerprint"
+                                               ", result: %d",
+                                               dbctx->fetch_key(dbctx,
+                                                       &fingerprint,
+                                                       &key, false));
+                               if (key != NULL) {
+                                       keyd_write_key(fd, key);
+                                       free_publickey(key);
+                                       key = NULL;
+                               } else {
+                                       if (!keyd_write_size(fd, 0)) {
+                                               ret = 1;
+                                       }
+                               }
+                       }
+                       break;
                case KEYD_CMD_GET_ID:
                        if (!keyd_write_reply(fd, KEYD_REPLY_OK)) {
                                ret = 1;
@@ -359,7 +399,6 @@ static int sock_do(struct onak_dbctx *dbctx, int fd)
                                }
                        }
                        break;
-
                case KEYD_CMD_GET_TEXT:
                        if (!keyd_write_reply(fd, KEYD_REPLY_OK)) {
                                ret = 1;