From a57a146ebc3f15f1ba2dfe8ecb9b59702fb8f799 Mon Sep 17 00:00:00 2001 From: Jonathan McDowell Date: Sat, 25 Sep 2004 09:36:21 +0000 Subject: [PATCH] Move update_keys to keydb rather than merge. Move update_keys to the database backends, as in some senses it makes more sense there - we have multiple DB calls and this is the main thing that needs transactions, so by moving it here we should be able to hide them from the rest of the code. --- Makefile.in | 16 ++++++------ keydb.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++- keydb.h | 14 ++++++++++- keydb_db2.c | 1 + keydb_db4.c | 1 + keydb_file.c | 1 + keydb_fs.c | 1 + keydb_keyd.c | 1 + keydb_pg.c | 1 + merge.c | 67 +------------------------------------------------ merge.h | 14 +---------- 11 files changed, 98 insertions(+), 89 deletions(-) diff --git a/Makefile.in b/Makefile.in index cd6620e..896711c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -18,7 +18,7 @@ exec_prefix ?= @exec_prefix@ PROGS = add lookup gpgwww onak splitkeys onak-mail.pl stripkey CORE_OBJS = armor.o charfuncs.o decodekey.o getcgi.o hash.o \ keyid.o keyindex.o ll.o mem.o onak-conf.o parsekey.o sha1.o md5.o \ - log.o photoid.o wordlist.o cleanup.o + log.o photoid.o wordlist.o cleanup.o merge.o SRCS = armor.c parsekey.c merge.c keyid.c md5.c sha1.c main.c getcgi.c mem.c \ keyindex.c stats.c lookup.c add.c keydb_$(DBTYPE).c ll.c hash.c \ gpgwww.c onak-conf.c charfuncs.c sendsync.c log.c photoid.c \ @@ -32,7 +32,7 @@ else KEYDB_OBJ = keydb_$(DBTYPE).o endif -OBJS = merge.o stats.o sendsync.o cleankey.o $(CORE_OBJS) $(KEYDB_OBJ) +OBJS = stats.o sendsync.o cleankey.o $(CORE_OBJS) $(KEYDB_OBJ) all: .depend $(PROGS) testparse maxpath sixdegrees splitkeys onak.conf @@ -58,16 +58,16 @@ stripkey: stripkey.o $(OBJS) gpgwww: gpgwww.o $(OBJS) $(CC) $(LDFLAGS) -o gpgwww gpgwww.o $(OBJS) $(LIBS) -lookup: lookup.o cleankey.o merge.o $(CORE_OBJS) $(KEYDB_OBJ) - $(CC) $(LDFLAGS) -o lookup lookup.o cleankey.o merge.o $(CORE_OBJS) \ +lookup: lookup.o cleankey.o $(CORE_OBJS) $(KEYDB_OBJ) + $(CC) $(LDFLAGS) -o lookup lookup.o cleankey.o $(CORE_OBJS) \ $(KEYDB_OBJ) $(LIBS) -add: add.o cleankey.o merge.o sendsync.o $(CORE_OBJS) $(KEYDB_OBJ) - $(CC) $(LDFLAGS) -o add add.o cleankey.o merge.o sendsync.o \ +add: add.o cleankey.o sendsync.o $(CORE_OBJS) $(KEYDB_OBJ) + $(CC) $(LDFLAGS) -o add add.o cleankey.o sendsync.o \ $(CORE_OBJS) $(KEYDB_OBJ) $(LIBS) -onak: onak.o merge.o cleankey.o $(CORE_OBJS) $(KEYDB_OBJ) - $(CC) $(LDFLAGS) -o onak onak.o merge.o cleankey.o \ +onak: onak.o cleankey.o $(CORE_OBJS) $(KEYDB_OBJ) + $(CC) $(LDFLAGS) -o onak onak.o cleankey.o \ $(CORE_OBJS) $(KEYDB_OBJ) $(LIBS) onak-conf.o: onak-conf.c onak-conf.h diff --git a/keydb.c b/keydb.c index 2b419ca..1621782 100644 --- a/keydb.c +++ b/keydb.c @@ -3,7 +3,7 @@ * * Jonathan McDowell * - * Copyright 2002 Project Purple + * Copyright 2002-2004 Project Purple */ /** @@ -22,6 +22,7 @@ #include "keyid.h" #include "keystructs.h" #include "mem.h" +#include "merge.h" #include "parsekey.h" #ifdef NEED_KEYID2UID @@ -150,3 +151,70 @@ uint64_t getfullkeyid(uint64_t keyid) return keyid; } #endif + +#ifdef NEED_UPDATEKEYS +/** + * update_keys - Takes a list of public keys and updates them in the DB. + * @keys: The keys to update in the DB. + * + * Takes a list of keys and adds them to the database, merging them with + * the key in the database if it's already present there. The key list is + * update to contain the minimum set of updates required to get from what + * we had before to what we have now (ie the set of data that was added to + * the DB). Returns the number of entirely new keys added. + */ +int update_keys(struct openpgp_publickey **keys) +{ + struct openpgp_publickey *curkey = NULL; + struct openpgp_publickey *oldkey = NULL; + struct openpgp_publickey *prev = NULL; + int newkeys = 0; + bool intrans; + + for (curkey = *keys; curkey != NULL; curkey = curkey->next) { + intrans = starttrans(); + logthing(LOGTHING_INFO, + "Fetching key 0x%llX, result: %d", + get_keyid(curkey), + fetch_key(get_keyid(curkey), &oldkey, intrans)); + + /* + * If we already have the key stored in the DB then merge it + * with the new one that's been supplied. Otherwise the key + * we've just got is the one that goes in the DB and also the + * one that we send out. + */ + if (oldkey != NULL) { + merge_keys(oldkey, curkey); + if (curkey->revocations == NULL && + curkey->uids == NULL && + curkey->subkeys == NULL) { + if (prev == NULL) { + *keys = curkey->next; + } else { + prev->next = curkey->next; + curkey->next = NULL; + free_publickey(curkey); + curkey = prev; + } + } else { + prev = curkey; + logthing(LOGTHING_INFO, + "Merged key; storing updated key."); + store_key(oldkey, intrans, true); + } + free_publickey(oldkey); + oldkey = NULL; + } else { + logthing(LOGTHING_INFO, + "Storing completely new key."); + store_key(curkey, intrans, false); + newkeys++; + } + endtrans(); + intrans = false; + } + + return newkeys; +} +#endif /* NEED_UPDATEKEYS */ diff --git a/keydb.h b/keydb.h index ae87ce3..b484831 100644 --- a/keydb.h +++ b/keydb.h @@ -3,7 +3,7 @@ * * Jonathan McDowell * - * Copyright 2002 Project Purple + * Copyright 2002-2004 Project Purple */ #ifndef __KEYDB_H__ @@ -97,6 +97,18 @@ int delete_key(uint64_t keyid, bool intrans); */ int fetch_key_text(const char *search, struct openpgp_publickey **publickey); +/** + * update_keys - Takes a list of public keys and updates them in the DB. + * @keys: The keys to update in the DB. + * + * Takes a list of keys and adds them to the database, merging them with + * the key in the database if it's already present there. The key list is + * update to contain the minimum set of updates required to get from what + * we had before to what we have now (ie the set of data that was added to + * the DB). Returns the number of entirely new keys added. + */ +int update_keys(struct openpgp_publickey **keys); + /** * keyid2uid - Takes a keyid and returns the primary UID for it. * @keyid: The keyid to lookup. diff --git a/keydb_db2.c b/keydb_db2.c index 6a1e2e8..020ee83 100644 --- a/keydb_db2.c +++ b/keydb_db2.c @@ -271,4 +271,5 @@ int dumpdb(char *filenamebase) #define NEED_KEYID2UID 1 #define NEED_GETKEYSIGS 1 #define NEED_GETFULLKEYID 1 +#define NEED_UPDATEKEYS 1 #include "keydb.c" diff --git a/keydb_db4.c b/keydb_db4.c index 0163ed5..7f8e498 100644 --- a/keydb_db4.c +++ b/keydb_db4.c @@ -1032,4 +1032,5 @@ uint64_t getfullkeyid(uint64_t keyid) */ #define NEED_GETKEYSIGS 1 #define NEED_KEYID2UID 1 +#define NEED_UPDATEKEYS 1 #include "keydb.c" diff --git a/keydb_file.c b/keydb_file.c index 4a4322b..81cb22a 100644 --- a/keydb_file.c +++ b/keydb_file.c @@ -188,4 +188,5 @@ int dumpdb(char *filenamebase) #define NEED_KEYID2UID 1 #define NEED_GETKEYSIGS 1 #define NEED_GETFULLKEYID 1 +#define NEED_UPDATEKEYS 1 #include "keydb.c" diff --git a/keydb_fs.c b/keydb_fs.c index 33fe51a..73d9758 100644 --- a/keydb_fs.c +++ b/keydb_fs.c @@ -537,4 +537,5 @@ uint64_t getfullkeyid(uint64_t keyid) */ #define NEED_KEYID2UID 1 #define NEED_GETKEYSIGS 1 +#define NEED_UPDATEKEYS 1 #include "keydb.c" diff --git a/keydb_keyd.c b/keydb_keyd.c index 10716ee..0399bc3 100644 --- a/keydb_keyd.c +++ b/keydb_keyd.c @@ -358,4 +358,5 @@ int dumpdb(char *filenamebase) #define NEED_KEYID2UID 1 #define NEED_GETKEYSIGS 1 +#define NEED_UPDATEKEYS 1 #include "keydb.c" diff --git a/keydb_pg.c b/keydb_pg.c index dd7cbfd..88682af 100644 --- a/keydb_pg.c +++ b/keydb_pg.c @@ -586,4 +586,5 @@ int dumpdb(char *filenamebase) * Include the basic keydb routines. */ #define NEED_GETFULLKEYID 1 +#define NEED_UPDATEKEYS 1 #include "keydb.c" diff --git a/merge.c b/merge.c index d2d2beb..95abbba 100644 --- a/merge.c +++ b/merge.c @@ -3,7 +3,7 @@ * * Jonathan McDowell * - * Copyright 2002 Project Purple + * Copyright 2002-2004 Project Purple */ #include @@ -352,68 +352,3 @@ int merge_keys(struct openpgp_publickey *a, struct openpgp_publickey *b) return rc; } - -/** - * update_keys - Takes a list of public keys and updates them in the DB. - * @keys: The keys to update in the DB. - * - * Takes a list of keys and adds them to the database, merging them with - * the key in the database if it's already present there. The key list is - * update to contain the minimum set of updates required to get from what - * we had before to what we have now (ie the set of data that was added to - * the DB). Returns the number of entirely new keys added. - */ -int update_keys(struct openpgp_publickey **keys) -{ - struct openpgp_publickey *curkey = NULL; - struct openpgp_publickey *oldkey = NULL; - struct openpgp_publickey *prev = NULL; - int newkeys = 0; - bool intrans; - - for (curkey = *keys; curkey != NULL; curkey = curkey->next) { - intrans = starttrans(); - logthing(LOGTHING_INFO, - "Fetching key 0x%llX, result: %d", - get_keyid(curkey), - fetch_key(get_keyid(curkey), &oldkey, intrans)); - - /* - * If we already have the key stored in the DB then merge it - * with the new one that's been supplied. Otherwise the key - * we've just got is the one that goes in the DB and also the - * one that we send out. - */ - if (oldkey != NULL) { - merge_keys(oldkey, curkey); - if (curkey->revocations == NULL && - curkey->uids == NULL && - curkey->subkeys == NULL) { - if (prev == NULL) { - *keys = curkey->next; - } else { - prev->next = curkey->next; - curkey->next = NULL; - free_publickey(curkey); - curkey = prev; - } - } else { - prev = curkey; - logthing(LOGTHING_INFO, - "Merged key; storing updated key."); - store_key(oldkey, intrans, true); - } - free_publickey(oldkey); - oldkey = NULL; - } else { - logthing(LOGTHING_INFO, - "Storing completely new key."); - store_key(curkey, intrans, false); - newkeys++; - } - endtrans(); - intrans = false; - } - - return newkeys; -} diff --git a/merge.h b/merge.h index bbefcc3..cabbc18 100644 --- a/merge.h +++ b/merge.h @@ -3,7 +3,7 @@ * * Jonathan McDowell * - * Copyright 2002 Project Purple + * Copyright 2002-2004 Project Purple */ #ifndef __MERGE_H__ @@ -25,18 +25,6 @@ */ int merge_keys(struct openpgp_publickey *a, struct openpgp_publickey *b); -/** - * update_keys - Takes a list of public keys and updates them in the DB. - * @keys: The keys to update in the DB. - * - * Takes a list of keys and adds them to the database, merging them with - * the key in the database if it's already present there. The key list is - * update to contain the minimum set of updates required to get from what - * we had before to what we have now (ie the set of data that was added to - * the DB). Returns the number of entirely new keys added. - */ -int update_keys(struct openpgp_publickey **keys); - /** * get_signed_packet - Gets a signed packet from a list. * @packet_list: The list of packets to look in. -- 2.39.5