]> the.earth.li Git - onak.git/blobdiff - keydb_pg.c
Skip signature hash verification for X509 signatures
[onak.git] / keydb_pg.c
index 0771317e747ab1c65a22e5ef71ddb2e7a936a903..04c760dfbf9759cca2e60241f1fdaeac1f2f8bb3 100644 (file)
@@ -1,9 +1,20 @@
 /*
  * keydb_pg.c - Routines to store and fetch keys in a PostGres database.
  *
- * Jonathan McDowell <noodles@earth.li>
+ * Copyright 2002-2004 Jonathan McDowell <noodles@earth.li>
  *
- * Copyright 2002-2004 Project Purple
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #include <postgresql/libpq-fe.h>
@@ -120,7 +131,7 @@ static void pg_endtrans(void)
 }
 
 /**
- *     fetch_key - Given a keyid fetch the key from storage.
+ *     fetch_key_id - Given a keyid fetch the key from storage.
  *     @keyid: The keyid to fetch.
  *     @publickey: A pointer to a structure to return the key in.
  *     @intrans: If we're already in a transaction.
@@ -131,7 +142,8 @@ static void pg_endtrans(void)
  *     in and then parse_keys() to parse the packets into a publickey
  *     structure.
  */
-static int pg_fetch_key(uint64_t keyid, struct openpgp_publickey **publickey,
+static int pg_fetch_key_id(uint64_t keyid,
+               struct openpgp_publickey **publickey,
                bool intrans)
 {
        struct openpgp_packet_list *packets = NULL;
@@ -358,12 +370,18 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
        char *primary = NULL;
        char *safeuid = NULL;
        int i;
+       uint64_t keyid;
 
        if (!intrans) {
                result = PQexec(dbconn, "BEGIN");
                PQclear(result);
        }
 
+       if (get_keyid(publickey, &keyid) != ONAK_E_OK) {
+               logthing(LOGTHING_ERROR, "Couldn't find key ID for key.");
+               return 0;
+       }
+
        /*
         * Delete the key if we already have it.
         *
@@ -373,7 +391,7 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
         * it definitely needs updated.
         */
        if (update) {
-               pg_delete_key(get_keyid(publickey), true);
+               pg_delete_key(keyid, true);
        }
 
        next = publickey->next;
@@ -395,7 +413,7 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
        snprintf(statement, 1023, 
                        "INSERT INTO onak_keys (keyid, keydata) VALUES "
                        "('%" PRIX64 "', '%d')", 
-                       get_keyid(publickey),
+                       keyid,
                        key_oid);
        result = PQexec(dbconn, statement);
 
@@ -418,7 +436,7 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
                                        "INSERT INTO onak_uids "
                                        "(keyid, uid, pri) "
                                        "VALUES ('%" PRIX64 "', '%s', '%c')",
-                                       get_keyid(publickey),
+                                       keyid,
                                        safeuid,
                                        (uids[i] == primary) ? 't' : 'f');
                                result = PQexec(dbconn, statement);
@@ -453,7 +471,7 @@ static int pg_store_key(struct openpgp_publickey *publickey, bool intrans,
                                "INSERT INTO onak_sigs (signer, signee) "
                                "VALUES ('%" PRIX64 "', '%" PRIX64 "')",
                                sig_keyid(packets->packet),
-                               get_keyid(publickey));
+                               keyid);
                        result = PQexec(dbconn, statement);
                        PQclear(result);
                }
@@ -638,6 +656,7 @@ static int pg_iterate_keys(void (*iterfunc)(void *ctx,
  */
 #define NEED_GETFULLKEYID 1
 #define NEED_UPDATEKEYS 1
+#define NEED_GET_FP 1
 #include "keydb.c"
 
 struct dbfuncs keydb_pg_funcs = {
@@ -645,7 +664,8 @@ struct dbfuncs keydb_pg_funcs = {
        .cleanupdb              = pg_cleanupdb,
        .starttrans             = pg_starttrans,
        .endtrans               = pg_endtrans,
-       .fetch_key              = pg_fetch_key,
+       .fetch_key_id           = pg_fetch_key_id,
+       .fetch_key_fp           = generic_fetch_key_fp,
        .fetch_key_text         = pg_fetch_key_text,
        .store_key              = pg_store_key,
        .update_keys            = generic_update_keys,