return ret;
}
-/**
- * getfullkeyid - Maps a 32bit key id to a 64bit one.
- * @keyid: The 32bit keyid.
- *
- * This function maps a 32bit key id to the full 64bit one. It returns the
- * first full keyid that has this short keyid. If the key isn't found a
- * keyid of 0 is returned.
- *
- * FIXME: This should either return the fingerprint or ideally go away
- * entirely.
- */
-static uint64_t db4_getfullkeyid(struct onak_dbctx *dbctx, uint64_t keyid)
-{
- struct onak_db4_dbctx *privctx = (struct onak_db4_dbctx *) dbctx->priv;
- DBT key, data;
- DBC *cursor = NULL;
- uint32_t shortkeyid = 0;
- int ret = 0;
- int i;
-
- if (keyid < 0x100000000LL) {
- ret = privctx->id32db->cursor(privctx->id32db,
- privctx->txn,
- &cursor,
- 0); /* flags */
-
- if (ret != 0) {
- return 0;
- }
-
- shortkeyid = keyid & 0xFFFFFFFF;
-
- memset(&key, 0, sizeof(key));
- memset(&data, 0, sizeof(data));
- key.data = &shortkeyid;
- key.size = sizeof(shortkeyid);
- data.flags = DB_DBT_MALLOC;
-
- ret = cursor->c_get(cursor,
- &key,
- &data,
- DB_SET);
-
- if (ret == 0) {
- keyid = 0;
- /* Only works for v4, not v3 or v5 */
- for (i = 12; i < 20; i++) {
- keyid <<= 8;
- keyid |= ((uint8_t *) data.data)[i];
- }
-
- if (data.data != NULL) {
- free(data.data);
- data.data = NULL;
- }
- }
-
- cursor->c_close(cursor);
- cursor = NULL;
- }
-
- return keyid;
-}
-
/**
* fetch_key_fp - Given a fingerprint fetch the key from storage.
*/
return (numkeys);
}
-
-int worddb_cmp(const void *d1, const void *d2)
-{
- return memcmp(d1, d2, 12);
-}
-
/**
* fetch_key_text - Trys to find the keys that contain the supplied text.
* @search: The text to search for.
/**
* delete_key - Given a keyid delete the key from storage.
- * @keyid: The keyid to delete.
+ * @fp: The fingerprint of the key to delete.
* @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.
*/
static int db4_delete_key(struct onak_dbctx *dbctx,
- uint64_t keyid, bool intrans)
+ struct openpgp_fingerprint *fp,
+ bool intrans)
{
struct onak_db4_dbctx *privctx = (struct onak_db4_dbctx *) dbctx->priv;
struct openpgp_publickey *publickey = NULL;
struct ll *curword = NULL;
bool deadlock = false;
struct skshash hash;
- struct openpgp_fingerprint fingerprint;
+ uint64_t keyid;
if (!intrans) {
db4_starttrans(dbctx);
}
- if (db4_fetch_key_id(dbctx, keyid, &publickey, true) == 0) {
+ if (db4_fetch_key_fp(dbctx, fp, &publickey, true) == 0) {
if (!intrans) {
db4_endtrans(dbctx);
}
return 1;
}
- get_fingerprint(publickey->publickey, &fingerprint);
+ if (get_keyid(publickey, &keyid) != ONAK_E_OK) {
+ return 1;
+ }
/*
* Walk through the uids removing the words from the worddb.
memset(&data, 0, sizeof(data));
key.data = curword->object;
key.size = strlen(key.data);
- data.data = fingerprint.fp;
- data.size = fingerprint.length;
+ data.data = fp->fp;
+ data.size = fp->length;
ret = cursor->c_get(cursor,
&key,
memset(&data, 0, sizeof(data));
key.data = &shortkeyid;
key.size = sizeof(shortkeyid);
- data.data = fingerprint.fp;
- data.size = fingerprint.length;
+ data.data = fp->fp;
+ data.size = fp->length;
ret = cursor->c_get(cursor,
&key,
memset(&data, 0, sizeof(data));
key.data = &keyid;
key.size = sizeof(keyid);
- data.data = fingerprint.fp;
- data.size = fingerprint.length;
+ data.data = fp->fp;
+ data.size = fp->length;
ret = cursor64->c_get(cursor64,
&key,
memset(&data, 0, sizeof(data));
key.data = &shortkeyid;
key.size = sizeof(shortkeyid);
- data.data = fingerprint.fp;
- data.size = fingerprint.length;
+ data.data = fp->fp;
+ data.size = fp->length;
ret = cursor->c_get(cursor,
&key,
memset(&data, 0, sizeof(data));
key.data = &subkeyid;
key.size = sizeof(subkeyid);
- data.data = fingerprint.fp;
- data.size = fingerprint.length;
+ data.data = fp->fp;
+ data.size = fp->length;
ret = cursor64->c_get(cursor64,
&key,
memset(&data, 0, sizeof(data));
key.data = hash.hash;
key.size = sizeof(hash.hash);
- data.data = fingerprint.fp;
- data.size = fingerprint.length;
+ data.data = fp->fp;
+ data.size = fp->length;
ret = cursor->c_get(cursor,
&key,
publickey = NULL;
if (!deadlock) {
- key.data = fingerprint.fp;
- key.size = fingerprint.length;
-
- keydb_fp(privctx, &fingerprint)->del(keydb_fp(privctx,
- &fingerprint),
- privctx->txn,
- &key,
- 0); /* flags */
-
- /* Delete old style 64 bit keyid */
- key.data = &keyid;
- key.size = sizeof(keyid);
+ key.data = fp->fp;
+ key.size = fp->length;
- keydb_id(privctx, keyid)->del(keydb_id(privctx, keyid),
+ keydb_fp(privctx, fp)->del(keydb_fp(privctx, fp),
privctx->txn,
&key,
0); /* flags */
* it definitely needs updated.
*/
if (update) {
- deadlock = (db4_delete_key(dbctx, keyid, true) == -1);
+ deadlock = (db4_delete_key(dbctx, &fingerprint, true) == -1);
}
/*
dbctx->getkeysigs = generic_getkeysigs;
dbctx->cached_getkeysigs = generic_cached_getkeysigs;
dbctx->keyid2uid = generic_keyid2uid;
- dbctx->getfullkeyid = db4_getfullkeyid;
dbctx->iterate_keys = db4_iterate_keys;
return dbctx;