]> the.earth.li Git - onak.git/blobdiff - keydb_fs.c
Enable use of systemd + socket activation support for Debian package
[onak.git] / keydb_fs.c
index a1529456548804a55efc02d98274e1d2c859f14c..277929734c633ab14bb2fd00b2fea1dfe19c7db6 100644 (file)
@@ -128,15 +128,23 @@ static void worddir(char *buffer, size_t length, char *word, uint32_t hash)
                 (uint8_t) ((hash >> 16) & 0xFF), hash, word);
 }
 
-static void subkeypath(char *buffer, size_t length, uint64_t subkey,
-               uint64_t keyid)
+static void subkeypath(char *buffer, size_t length, uint64_t subkey)
 {
        snprintf(buffer, length, "%s/subkeys/%02X/%02X/%08X/%016" PRIX64,
                 config.db_dir,
                 (uint8_t) ((subkey >> 24) & 0xFF),
                 (uint8_t) ((subkey >> 16) & 0xFF),
                 (uint32_t) (subkey & 0xFFFFFFFF),
-                keyid);
+                subkey);
+}
+
+static void subkeydir(char *buffer, size_t length, uint64_t subkey)
+{
+       snprintf(buffer, length, "%s/subkeys/%02X/%02X/%08X",
+                config.db_dir,
+                (uint8_t) ((subkey >> 24) & 0xFF),
+                (uint8_t) ((subkey >> 16) & 0xFF),
+                (uint32_t) (subkey & 0xFFFFFFFF));
 }
 
 static void skshashpath(char *buffer, size_t length,
@@ -152,14 +160,6 @@ static void skshashpath(char *buffer, size_t length,
                 hash->hash[12], hash->hash[13], hash->hash[14],
                 hash->hash[15]);
 }
-static void subkeydir(char *buffer, size_t length, uint64_t subkey)
-{
-       snprintf(buffer, length, "%s/subkeys/%02X/%02X/%08X",
-                config.db_dir,
-                (uint8_t) ((subkey >> 24) & 0xFF),
-                (uint8_t) ((subkey >> 16) & 0xFF),
-                (uint32_t) (subkey & 0xFFFFFFFF));
-}
 
 /*****************************************************************************/
 
@@ -260,7 +260,13 @@ static int fs_fetch_key_id(struct onak_dbctx *dbctx,
                keyid = fs_getfullkeyid(dbctx, keyid);
 
        keypath(buffer, sizeof(buffer), keyid);
-       if ((fd = open(buffer, O_RDONLY)) != -1) {
+       fd = open(buffer, O_RDONLY);
+       if (fd == -1 && errno == ENOENT) {
+               subkeypath(buffer, sizeof(buffer), keyid);
+               fd = open(buffer, O_RDONLY);
+       }
+
+       if (fd != -1) {
                /* File is present, load it in... */
                read_openpgp_stream(file_fetchchar, &fd, &packets, 0);
                parse_keys(packets, publickey);
@@ -294,7 +300,7 @@ static int fs_store_key(struct onak_dbctx *dbctx,
        uint64_t keyid;
        struct ll *wordlist = NULL, *wl = NULL;
        struct skshash hash;
-       uint64_t *subkeyids = NULL;
+       struct openpgp_fingerprint *subkeyids = NULL;
        uint32_t hashid;
        int i = 0;
 
@@ -342,13 +348,14 @@ static int fs_store_key(struct onak_dbctx *dbctx,
                
                subkeyids = keysubkeys(publickey);
                i = 0;
-               while (subkeyids != NULL && subkeyids[i] != 0) {
-                       prove_path_to(subkeyids[i], "subkeys");
+               while (subkeyids != NULL && subkeyids[i].length != 0) {
+                       keyid = fingerprint2keyid(&subkeyids[i]);
 
-                       subkeydir(wbuffer, sizeof(wbuffer), subkeyids[i]);
+                       prove_path_to(keyid, "subkeys");
+
+                       subkeydir(wbuffer, sizeof(wbuffer), keyid);
                        mkdir(wbuffer, 0777);
-                       subkeypath(wbuffer, sizeof(wbuffer), subkeyids[i],
-                               keyid);
+                       subkeypath(wbuffer, sizeof(wbuffer), keyid);
                        link(buffer, wbuffer);
 
                        i++;
@@ -383,7 +390,8 @@ static int fs_delete_key(struct onak_dbctx *dbctx, uint64_t keyid, bool intrans)
        struct openpgp_publickey *pk = NULL;
        struct skshash hash;
        struct ll *wordlist = NULL, *wl = NULL;
-       uint64_t *subkeyids = NULL;
+       struct openpgp_fingerprint *subkeyids = NULL;
+       uint64_t subkeyid;
        int i = 0;
 
        if ((keyid >> 32) == 0)
@@ -413,11 +421,11 @@ static int fs_delete_key(struct onak_dbctx *dbctx, uint64_t keyid, bool intrans)
 
                subkeyids = keysubkeys(pk);
                i = 0;
-               while (subkeyids != NULL && subkeyids[i] != 0) {
-                       prove_path_to(subkeyids[i], "subkeys");
+               while (subkeyids != NULL && subkeyids[i].length != 0) {
+                       subkeyid = fingerprint2keyid(&subkeyids[i]);
+                       prove_path_to(subkeyid, "subkeys");
 
-                       subkeypath(buffer, sizeof(buffer), subkeyids[i],
-                               keyid);
+                       subkeypath(buffer, sizeof(buffer), subkeyid);
                        unlink(buffer);
 
                        i++;
@@ -640,7 +648,15 @@ struct onak_dbctx *keydb_fs_init(bool readonly)
                mkdir(config.db_dir, 0777);
                privctx->lockfile_fd = open(buffer, O_RDWR | O_CREAT, 0600);
        }
-       chdir(config.db_dir);
+       if (chdir(config.db_dir) == -1) {
+               /* Shouldn't happen after the above */
+               logthing(LOGTHING_CRITICAL,
+                       "Couldn't change to database directory: %s",
+                       strerror(errno));
+               free(dbctx->priv);
+               free(dbctx);
+               return NULL;
+       }
        privctx->lockfile_fd = open(buffer,
                                 (privctx->lockfile_readonly) ?
                                 O_RDONLY : O_RDWR);