Move update_keys to keydb rather than merge.
authorJonathan McDowell <noodles@earth.li>
Sat, 25 Sep 2004 09:36:21 +0000 (09:36 +0000)
committerJonathan McDowell <noodles@earth.li>
Sat, 25 Sep 2004 09:36:21 +0000 (09:36 +0000)
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
keydb.c
keydb.h
keydb_db2.c
keydb_db4.c
keydb_file.c
keydb_fs.c
keydb_keyd.c
keydb_pg.c
merge.c
merge.h

index cd6620ef24d8e38b91e3eee014bd2c7719938dc2..896711cea1cc7779c776ebd3400d7aee1cfe530f 100644 (file)
@@ -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 2b419ca2af99d162643448489a0f9850de665651..16217823e543b4e0cc827aca6fbb58e660514421 100644 (file)
--- a/keydb.c
+++ b/keydb.c
@@ -3,7 +3,7 @@
  *
  * Jonathan McDowell <noodles@earth.li>
  *
- * 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 ae87ce385c561b2811d8324922d03aa86735cdf5..b484831f8f19351b7e673e85933dcf41c90a99bc 100644 (file)
--- a/keydb.h
+++ b/keydb.h
@@ -3,7 +3,7 @@
  *
  * Jonathan McDowell <noodles@earth.li>
  *
- * 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.
index 6a1e2e873d0eaa364a0188afe1aaf88dc95773f4..020ee83a05730973d110c3fd7641f89d6d478fd0 100644 (file)
@@ -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"
index 0163ed53ea5bfdfb9cfb72c6e8a0b50d0cf7d6ca..7f8e498b3d20897a4d2b0c609ac6285a9b6a62e7 100644 (file)
@@ -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"
index 4a4322b5b88ff3460c8a97eab7add35c9edf7e6f..81cb22a2db38acf34e7e4c3ffbe9039770689ebb 100644 (file)
@@ -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"
index 33fe51ad1c265e923bf8889b11910327c2287914..73d9758ff1111c5d344f679c8f8a5ba364fb51d9 100644 (file)
@@ -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"
index 10716ee0c5504c1b15742236146adc8cf31bbc9c..0399bc367a806dbcd453707d6b5b76920d3edc71 100644 (file)
@@ -358,4 +358,5 @@ int dumpdb(char *filenamebase)
 
 #define NEED_KEYID2UID 1
 #define NEED_GETKEYSIGS 1
+#define NEED_UPDATEKEYS 1
 #include "keydb.c"
index dd7cbfdbbdc30b203246503fba1f984e281d3ce1..88682af9bdcf2139fdc4304c35d295ae49a550d4 100644 (file)
@@ -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 d2d2beb1ace4f87471cdb5b9396323f9fb3389f8..95abbbafbf8d6e663367d34fc68c9ff7e638ccee 100644 (file)
--- a/merge.c
+++ b/merge.c
@@ -3,7 +3,7 @@
  *
  * Jonathan McDowell <noodles@earth.li>
  *
- * Copyright 2002 Project Purple
+ * Copyright 2002-2004 Project Purple
  */
 
 #include <stdio.h>
@@ -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 bbefcc3e3bf3f0deb27ef7433d2c045af18cfd1f..cabbc1886a35db8e26654690ba065b51f4185db7 100644 (file)
--- a/merge.h
+++ b/merge.h
@@ -3,7 +3,7 @@
  *
  * Jonathan McDowell <noodles@earth.li>
  *
- * Copyright 2002 Project Purple
+ * Copyright 2002-2004 Project Purple
  */
 
 #ifndef __MERGE_H__
  */
 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.