]> the.earth.li Git - onak.git/blobdiff - keydb_dynamic.c
Add option to only accept updates for existing keys
[onak.git] / keydb_dynamic.c
index 1e7d6b2aac2076a5e769b9ada5315c6b54534753..385c09cbb5ef3600e2b9e9a59a79b61d423f4c03 100644 (file)
@@ -13,8 +13,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 <https://www.gnu.org/licenses/>.
  */
 
 #include <dlfcn.h>
@@ -109,24 +108,28 @@ static int dynamic_store_key(struct onak_dbctx *dbctx,
                        publickey, intrans, update);
 }
 
-static int dynamic_delete_key(struct onak_dbctx *dbctx, uint64_t keyid,
+static int dynamic_delete_key(struct onak_dbctx *dbctx,
+               struct openpgp_fingerprint *fp,
                bool intrans)
 {
        struct onak_dynamic_dbctx *privctx =
                        (struct onak_dynamic_dbctx *) dbctx->priv;
 
        return privctx->loadeddbctx->delete_key(privctx->loadeddbctx,
-                       keyid, intrans);
+                       fp, intrans);
 }
 
 static int dynamic_update_keys(struct onak_dbctx *dbctx,
-               struct openpgp_publickey **keys, bool sendsync)
+               struct openpgp_publickey **keys,
+               struct keyarray *blacklist,
+               bool updateonly,
+               bool sendsync)
 {
        struct onak_dynamic_dbctx *privctx =
                        (struct onak_dynamic_dbctx *) dbctx->priv;
 
        return privctx->loadeddbctx->update_keys(privctx->loadeddbctx,
-                       keys, sendsync);
+                       keys, blacklist, updateonly, sendsync);
 }
 
 static struct ll *dynamic_getkeysigs(struct onak_dbctx *dbctx,
@@ -159,15 +162,6 @@ static char *dynamic_keyid2uid(struct onak_dbctx *dbctx,
                        keyid);
 }
 
-static uint64_t dynamic_getfullkeyid(struct onak_dbctx *dbctx,
-               uint64_t keyid)
-{
-       struct onak_dynamic_dbctx *privctx =
-                       (struct onak_dynamic_dbctx *) dbctx->priv;
-
-       return privctx->loadeddbctx->getfullkeyid(privctx->loadeddbctx, keyid);
-}
-
 static int dynamic_iterate_keys(struct onak_dbctx *dbctx,
                void (*iterfunc)(void *ctx, struct openpgp_publickey *key),
                void *ctx)
@@ -206,13 +200,21 @@ static void dynamic_cleanupdb(struct onak_dbctx *dbctx)
        }
 }
 
-struct onak_dbctx *keydb_dynamic_init(bool readonly)
+struct onak_dbctx *keydb_dynamic_init(struct onak_db_config *dbcfg,
+               bool readonly)
 {
        struct onak_dbctx *dbctx;
        char *soname;
        char *initname;
-       struct onak_dbctx *(*backend_init)(bool);
+       struct onak_dbctx *(*backend_init)(struct onak_db_config *, bool);
        struct onak_dynamic_dbctx *privctx;
+       char *type;
+
+       if (dbcfg == NULL) {
+               logthing(LOGTHING_CRITICAL,
+                       "No backend database configuration supplied.");
+               return NULL;
+       }
 
        dbctx = malloc(sizeof(struct onak_dbctx));
 
@@ -220,15 +222,16 @@ struct onak_dbctx *keydb_dynamic_init(bool readonly)
                return NULL;
        }
 
+       dbctx->config = dbcfg;
        dbctx->priv = privctx = malloc(sizeof(struct onak_dynamic_dbctx));
        if (dbctx->priv == NULL) {
                free(dbctx);
                return (NULL);
        }
 
+       type = dbcfg->type;
        if (config.use_keyd) {
-               free(config.db_backend);
-               config.db_backend = strdup("keyd");
+               type = "keyd";
        }
 
        if (!config.db_backend) {
@@ -237,21 +240,21 @@ struct onak_dbctx *keydb_dynamic_init(bool readonly)
        }
 
        if (config.backends_dir == NULL) {
-               soname = malloc(strlen(config.db_backend)
+               soname = malloc(strlen(type)
                        + strlen("./libkeydb_")
                        + strlen(".so")
                        + 1);
 
-               sprintf(soname, "./libkeydb_%s.so", config.db_backend);
+               sprintf(soname, "./libkeydb_%s.so", type);
        } else {
-               soname = malloc(strlen(config.db_backend)
+               soname = malloc(strlen(type)
                        + strlen("/libkeydb_")
                        + strlen(".so")
                        + strlen(config.backends_dir)
                        + 1);
 
                sprintf(soname, "%s/libkeydb_%s.so", config.backends_dir,
-                       config.db_backend);
+                       type);
        }
 
        logthing(LOGTHING_INFO, "Loading dynamic backend: %s", soname);
@@ -270,7 +273,7 @@ struct onak_dbctx *keydb_dynamic_init(bool readonly)
                        + strlen("keydb_")
                        + strlen("_init")
                        + 1);
-       sprintf(initname, "keydb_%s_init", config.db_backend);
+       sprintf(initname, "keydb_%s_init", type);
 
        *(void **) (&backend_init) = dlsym(privctx->backend_handle, initname);
        free(initname);
@@ -283,11 +286,20 @@ struct onak_dbctx *keydb_dynamic_init(bool readonly)
                soname = NULL;
                exit(EXIT_FAILURE);
        }
+
+       privctx->loadeddbctx = backend_init(dbcfg, readonly);
+
+       if (privctx->loadeddbctx == NULL) {
+               logthing(LOGTHING_CRITICAL,
+                               "Failed to initialise dynamic backend: %s",
+                               soname);
+               free(soname);
+               soname = NULL;
+               exit(EXIT_FAILURE);
+       }
        free(soname);
        soname = NULL;
 
-       privctx->loadeddbctx = backend_init(readonly);
-
        if (privctx->loadeddbctx != NULL) {
                dbctx->cleanupdb = dynamic_cleanupdb;
                dbctx->starttrans = dynamic_starttrans;
@@ -302,7 +314,6 @@ struct onak_dbctx *keydb_dynamic_init(bool readonly)
                dbctx->getkeysigs = dynamic_getkeysigs;
                dbctx->cached_getkeysigs = dynamic_cached_getkeysigs;
                dbctx->keyid2uid = dynamic_keyid2uid;
-               dbctx->getfullkeyid = dynamic_getfullkeyid;
                dbctx->iterate_keys = dynamic_iterate_keys;
        }