#include <stdbool.h>
#include <inttypes.h>
+#include "keyarray.h"
#include "keystructs.h"
#include "ll.h"
*/
void (*endtrans)(struct onak_dbctx *);
+/**
+ * @brief Given a fingerprint fetch the key from storage.
+ * @param fp The fingerprint to fetch.
+ * @param fpsize Number of bytes in the fingerprint (16 for v3, 20 for v4)
+ * @param publickey A pointer to a structure to return the key in.
+ * @param intrans If we're already in a transaction.
+ *
+ * This function returns a public key from whatever storage mechanism we
+ * are using. This only searches for the fingerprint of the primary key
+ * and will thus only ever return at most a single key.
+ */
+ int (*fetch_key)(struct onak_dbctx *,
+ struct openpgp_fingerprint *fingerprint,
+ struct openpgp_publickey **publickey,
+ bool intrans);
+
/**
* @brief Given a keyid fetch the key from storage.
* @param keyid The keyid to fetch.
* @param intrans If we're already in a transaction.
*
* This function returns a public key from whatever storage mechanism we
- * are using.
- *
- * TODO: What about keyid collisions? Should we use fingerprint instead?
+ * are using. It may return multiple keys in the case where there are
+ * colliding keyids.
*/
int (*fetch_key_id)(struct onak_dbctx *,
uint64_t keyid,
* @param intrans If we're already in a transaction.
*
* This function returns a public key from whatever storage mechanism we
- * are using.
+ * are using. Although the fingerprint should be unique this function may
+ * also search subkeys, which could be bound to multiple primary keys. As
+ * a result multiple keys may be returned.
*/
int (*fetch_key_fp)(struct onak_dbctx *,
struct openpgp_fingerprint *fingerprint,
struct openpgp_publickey **publickey,
bool intrans);
+/**
+ * @brief Tries to find the keys that contain the supplied text.
+ * @param search The text to search for.
+ * @param publickey A pointer to a structure to return the key in.
+ *
+ * This function searches for the supplied text and returns the keys that
+ * contain it. It is likely it will return multiple keys.
+ */
+ int (*fetch_key_text)(struct onak_dbctx *, const char *search,
+ struct openpgp_publickey **publickey);
+
+/**
+ * @brief Tries to find the keys from an SKS hash
+ * @param hash The hash to search for.
+ * @param publickey A pointer to a structure to return the key in.
+ *
+ * This function looks for the key that is referenced by the supplied
+ * SKS hash and returns it.
+ */
+ int (*fetch_key_skshash)(struct onak_dbctx *,
+ const struct skshash *hash,
+ struct openpgp_publickey **publickey);
+
/**
* @brief Takes a key and stores it.
* @param publickey A pointer to the public key to store.
/**
* @brief Given a keyid delete the key from storage.
- * @param keyid The keyid to delete.
+ * @param fp The fingerprint of the key to delete.
* @param intrans If we're already in a transaction.
*
* This function deletes a public key from whatever storage mechanism we
* are using. Returns 0 if the key existed.
*/
- int (*delete_key)(struct onak_dbctx *, uint64_t keyid, bool intrans);
-
-/**
- * @brief Trys to find the keys that contain the supplied text.
- * @param search The text to search for.
- * @param publickey A pointer to a structure to return the key in.
- *
- * This function searches for the supplied text and returns the keys that
- * contain it.
- */
- int (*fetch_key_text)(struct onak_dbctx *, const char *search,
- struct openpgp_publickey **publickey);
-
-/**
- * @brief Tries to find the keys from an SKS hash
- * @param hash The hash to search for.
- * @param publickey A pointer to a structure to return the key in.
- *
- * This function looks for the key that is referenced by the supplied
- * SKS hash and returns it.
- */
- int (*fetch_key_skshash)(struct onak_dbctx *,
- const struct skshash *hash,
- struct openpgp_publickey **publickey);
+ int (*delete_key)(struct onak_dbctx *, struct openpgp_fingerprint *fp,
+ bool intrans);
/**
* @brief Takes a list of public keys and updates them in the DB.
* @param keys The keys to update in the DB.
+ * @param blacklist A keyarray of fingerprints that shouldn't be added.
+ * @updateonly: Only update existing keys, don't add new ones.
* @param sendsync If we should send a keysync mail.
*
* Takes a list of keys and adds them to the database, merging them with
* with the update.
*/
int (*update_keys)(struct onak_dbctx *,
- struct openpgp_publickey **keys, bool sendsync);
+ struct openpgp_publickey **keys,
+ struct keyarray *blacklist,
+ bool updateonly,
+ bool sendsync);
/**
* @brief Takes a keyid and returns the primary UID for it.
struct ll * (*cached_getkeysigs)(struct onak_dbctx *,
uint64_t keyid);
-/**
- * @brief Maps a 32 bit key id to a 64 bit one.
- * @param keyid The 32 bit keyid.
- *
- * This function maps a 32 bit key id to the full 64 bit one. It returns the
- * full keyid. If the key isn't found a keyid of 0 is returned.
- */
- uint64_t (*getfullkeyid)(struct onak_dbctx *, uint64_t keyid);
-
/**
* @brief call a function once for each key in the db.
* @param iterfunc The function to call.