2 * keydb.h - Routines to store and fetch keys.
4 * Copyright 2002-2004 Jonathan McDowell <noodles@earth.li>
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 #include "keystructs.h"
29 * struct dbfuncs - All of the functions a DB backend exports.
33 * initdb - Initialize the key database.
34 * @readonly: If we'll only be reading the DB, not writing to it.
36 * This function should be called before any of the other functions in
37 * this file are called in order to allow the DB to be initialized ready
40 void (*initdb)(bool readonly);
43 * cleanupdb - De-initialize the key database.
45 * This function should be called upon program exit to allow the DB to
46 * cleanup after itself.
48 void (*cleanupdb)(void);
51 * starttrans - Start a transaction.
53 * Start a transaction. Intended to be used if we're about to perform many
54 * operations on the database to help speed it all up, or if we want
55 * something to only succeed if all relevant operations are successful.
57 bool (*starttrans)(void);
60 * endtrans - End a transaction.
64 void (*endtrans)(void);
67 * fetch_key - Given a keyid fetch the key from storage.
68 * @keyid: The keyid to fetch.
69 * @publickey: A pointer to a structure to return the key in.
70 * @intrans: If we're already in a transaction.
72 * This function returns a public key from whatever storage mechanism we
75 * TODO: What about keyid collisions? Should we use fingerprint instead?
77 int (*fetch_key)(uint64_t keyid, struct openpgp_publickey **publickey,
81 * store_key - Takes a key and stores it.
82 * @publickey: A pointer to the public key to store.
83 * @intrans: If we're already in a transaction.
84 * @update: If true the key exists and should be updated.
86 * This function stores a public key in whatever storage mechanism we are
87 * using. intrans indicates if we're already in a transaction so don't
88 * need to start one. update indicates if the key already exists and is
91 * TODO: Do we store multiple keys of the same id? Or only one and replace
94 int (*store_key)(struct openpgp_publickey *publickey, bool intrans,
98 * delete_key - Given a keyid delete the key from storage.
99 * @keyid: The keyid to delete.
100 * @intrans: If we're already in a transaction.
102 * This function deletes a public key from whatever storage mechanism we
103 * are using. Returns 0 if the key existed.
105 int (*delete_key)(uint64_t keyid, bool intrans);
108 * fetch_key_text - Trys to find the keys that contain the supplied text.
109 * @search: The text to search for.
110 * @publickey: A pointer to a structure to return the key in.
112 * This function searches for the supplied text and returns the keys that
115 int (*fetch_key_text)(const char *search,
116 struct openpgp_publickey **publickey);
119 * fetch_key_skshash - Tries to find the keys from an SKS hash
120 * @hash: The hash to search for.
121 * @publickey: A pointer to a structure to return the key in.
123 * This function looks for the key that is referenced by the supplied
124 * SKS hash and returns it.
126 int (*fetch_key_skshash)(const struct skshash *hash,
127 struct openpgp_publickey **publickey);
130 * update_keys - Takes a list of public keys and updates them in the DB.
131 * @keys: The keys to update in the DB.
132 * @sendsync: If we should send a keysync mail.
134 * Takes a list of keys and adds them to the database, merging them with
135 * the key in the database if it's already present there. The key list is
136 * update to contain the minimum set of updates required to get from what
137 * we had before to what we have now (ie the set of data that was added to
138 * the DB). Returns the number of entirely new keys added.
140 * If sendsync is true then we send out a keysync mail to our sync peers
143 int (*update_keys)(struct openpgp_publickey **keys, bool sendsync);
146 * keyid2uid - Takes a keyid and returns the primary UID for it.
147 * @keyid: The keyid to lookup.
149 * This function returns a UID for the given key. Returns NULL if the key
152 char * (*keyid2uid)(uint64_t keyid);
155 * getkeysigs - Gets a linked list of the signatures on a key.
156 * @keyid: The keyid to get the sigs for.
157 * @revoked: Is the key revoked?
159 * This function gets the list of signatures on a key. Used for key
160 * indexing and doing stats bits. If revoked is non-NULL then if the key
161 * is revoked it's set to true.
163 struct ll * (*getkeysigs)(uint64_t keyid, bool *revoked);
166 * cached_getkeysigs - Gets the signatures on a key.
167 * @keyid: The key we want the signatures for.
169 * This function gets the signatures on a key. It's the same as the
170 * getkeysigs function above except we use the hash module to cache the
172 struct ll * (*cached_getkeysigs)(uint64_t keyid);
175 * getfullkeyid - Maps a 32bit key id to a 64bit one.
176 * @keyid: The 32bit keyid.
178 * This function maps a 32bit key id to the full 64bit one. It returns the
179 * full keyid. If the key isn't found a keyid of 0 is returned.
181 uint64_t (*getfullkeyid)(uint64_t keyid);
184 * iterate_keys - call a function once for each key in the db.
185 * @iterfunc: The function to call.
186 * @ctx: A context pointer
188 * Calls iterfunc once for each key in the database. ctx is passed
189 * unaltered to iterfunc. This function is intended to aid database dumps
190 * and statistic calculations.
192 * Returns the number of keys we iterated over.
194 int (*iterate_keys)(void (*iterfunc)(void *ctx,
195 struct openpgp_publickey *key), void *ctx);
198 #endif /* __KEYDB_H__ */