]> the.earth.li Git - onak.git/blob - keydb.h
Extend database backends to support fetching by key fingerprint
[onak.git] / keydb.h
1 /**
2  * @file keydb.h
3  * @brief Routines to store and fetch keys.
4  *
5  * Copyright 2002-2004 Jonathan McDowell <noodles@earth.li>
6  *
7  * This program is free software: you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the Free
9  * Software Foundation; version 2 of the License.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * this program; if not, write to the Free Software Foundation, Inc., 51
18  * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef __KEYDB_H__
22 #define __KEYDB_H__
23
24 #include <inttypes.h>
25
26 #include "keystructs.h"
27 #include "ll.h"
28
29 /**
30  * @brief All of the functions a DB backend exports.
31  */
32 struct dbfuncs {
33 /**
34  * @brief Initialize the key database.
35  * @param readonly If we'll only be reading the DB, not writing to it.
36  *
37  * This function should be called before any of the other functions in
38  * this file are called in order to allow the DB to be initialized ready
39  * for access.
40  */
41         void (*initdb)(bool readonly);
42
43 /**
44  * @brief De-initialize the key database.
45  *
46  * This function should be called upon program exit to allow the DB to
47  * cleanup after itself.
48  */
49         void (*cleanupdb)(void);
50
51 /**
52  * @brief Start a transaction.
53  *
54  * Start a transaction. Intended to be used if we're about to perform many
55  * operations on the database to help speed it all up, or if we want
56  * something to only succeed if all relevant operations are successful.
57  */
58         bool (*starttrans)(void);
59
60 /**
61  * @brief End a transaction.
62  *
63  * Ends a transaction.
64  */
65         void (*endtrans)(void);
66
67 /**
68  * @brief Given a keyid fetch the key from storage.
69  * @param keyid The keyid to fetch.
70  * @param publickey A pointer to a structure to return the key in.
71  * @param intrans  If we're already in a transaction.
72  *
73  * This function returns a public key from whatever storage mechanism we
74  * are using.
75  *
76  * TODO: What about keyid collisions? Should we use fingerprint instead?
77  */
78         int (*fetch_key_id)(uint64_t keyid,
79                         struct openpgp_publickey **publickey,
80                         bool intrans);
81
82 /**
83  * @brief Given a fingerprint fetch the key from storage.
84  * @param fp The fingerprint to fetch.
85  * @param fpsize Number of bytes in the fingerprint (16 for v3, 20 for v4)
86  * @param publickey A pointer to a structure to return the key in.
87  * @param intrans  If we're already in a transaction.
88  *
89  * This function returns a public key from whatever storage mechanism we
90  * are using.
91  */
92         int (*fetch_key_fp)(uint8_t *fp,
93                         size_t fpsize,
94                         struct openpgp_publickey **publickey,
95                         bool intrans);
96
97 /**
98  * @brief Takes a key and stores it.
99  * @param publickey A pointer to the public key to store.
100  * @param intrans If we're already in a transaction.
101  * @param update If true the key exists and should be updated.
102  *
103  * This function stores a public key in whatever storage mechanism we are
104  * using. intrans indicates if we're already in a transaction so don't
105  * need to start one. update indicates if the key already exists and is
106  * just being updated.
107  *
108  * TODO: Do we store multiple keys of the same id? Or only one and replace it?
109  */
110         int (*store_key)(struct openpgp_publickey *publickey, bool intrans,
111                         bool update);
112
113 /**
114  * @brief Given a keyid delete the key from storage.
115  * @param keyid The keyid to delete.
116  * @param intrans If we're already in a transaction.
117  *
118  * This function deletes a public key from whatever storage mechanism we
119  * are using. Returns 0 if the key existed.
120  */
121         int (*delete_key)(uint64_t keyid, bool intrans);
122
123 /**
124  * @brief Trys to find the keys that contain the supplied text.
125  * @param search The text to search for.
126  * @param publickey A pointer to a structure to return the key in.
127  *
128  * This function searches for the supplied text and returns the keys that
129  * contain it.
130  */
131         int (*fetch_key_text)(const char *search,
132                         struct openpgp_publickey **publickey);
133
134 /**
135  * @brief Tries to find the keys from an SKS hash
136  * @param hash The hash to search for.
137  * @param publickey A pointer to a structure to return the key in.
138  *
139  * This function looks for the key that is referenced by the supplied
140  * SKS hash and returns it.
141  */
142         int (*fetch_key_skshash)(const struct skshash *hash,
143                         struct openpgp_publickey **publickey);
144
145 /**
146  * @brief Takes a list of public keys and updates them in the DB.
147  * @param keys The keys to update in the DB.
148  * @param sendsync If we should send a keysync mail.
149  *
150  * Takes a list of keys and adds them to the database, merging them with
151  * the key in the database if it's already present there. The key list is
152  * update to contain the minimum set of updates required to get from what
153  * we had before to what we have now (ie the set of data that was added to
154  * the DB). Returns the number of entirely new keys added.
155  *
156  * If sendsync is true then we send out a keysync mail to our sync peers
157  * with the update.
158  */
159         int (*update_keys)(struct openpgp_publickey **keys, bool sendsync);
160
161 /**
162  * @brief Takes a keyid and returns the primary UID for it.
163  * @param keyid The keyid to lookup.
164  *
165  * This function returns a UID for the given key. Returns NULL if the key
166  * isn't found.
167  */
168         char * (*keyid2uid)(uint64_t keyid);
169
170 /**
171  * @brief Gets a linked list of the signatures on a key.
172  * @param keyid The keyid to get the sigs for.
173  * @param revoked Is the key revoked?
174  *
175  * This function gets the list of signatures on a key. Used for key 
176  * indexing and doing stats bits. If revoked is non-NULL then if the key
177  * is revoked it's set to true.
178  */
179         struct ll * (*getkeysigs)(uint64_t keyid, bool *revoked);
180
181 /**
182  * @brief Gets the signatures on a key.
183  * @param keyid The key we want the signatures for.
184  *
185  * This function gets the signatures on a key. It's the same as the
186  * getkeysigs function above except we use the hash module to cache the
187  */
188         struct ll * (*cached_getkeysigs)(uint64_t keyid);
189
190 /**
191  * @brief Maps a 32 bit key id to a 64 bit one.
192  * @param keyid The 32 bit keyid.
193  *
194  * This function maps a 32 bit key id to the full 64 bit one. It returns the
195  * full keyid. If the key isn't found a keyid of 0 is returned.
196  */
197         uint64_t (*getfullkeyid)(uint64_t keyid);
198
199 /**
200  * @brief call a function once for each key in the db.
201  * @param iterfunc The function to call.
202  * @param ctx A context pointer
203  *
204  * Calls iterfunc once for each key in the database. ctx is passed
205  * unaltered to iterfunc. This function is intended to aid database dumps
206  * and statistic calculations.
207  *
208  * Returns the number of keys we iterated over.
209  */
210         int (*iterate_keys)(void (*iterfunc)(void *ctx,
211                         struct openpgp_publickey *key), void *ctx);
212 };
213
214 #endif /* __KEYDB_H__ */