X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/blobdiff_plain/b1cb08b256587f6c5d2c484438d942e58583ba88..28052481c1892cd06a2626a1ecd7221c3814f0e6:/keydb_pg.c?ds=inline diff --git a/keydb_pg.c b/keydb_pg.c index adfbc69..dd7cbfd 100644 --- a/keydb_pg.c +++ b/keydb_pg.c @@ -9,8 +9,6 @@ #include #include -//#include -//#include #include #include #include @@ -25,6 +23,7 @@ #include "keyid.h" #include "decodekey.h" #include "keystructs.h" +#include "log.h" #include "mem.h" #include "onak-conf.h" #include "parsekey.h" @@ -39,7 +38,7 @@ static PGconn *dbconn = NULL; */ static int keydb_fetchchar(void *fd, size_t count, unsigned char *c) { - return (!lo_read(dbconn, *(int *) fd, c, count)); + return (!lo_read(dbconn, *(int *) fd, (char *) c, count)); } /** @@ -47,7 +46,7 @@ static int keydb_fetchchar(void *fd, size_t count, unsigned char *c) */ static int keydb_putchar(void *fd, size_t count, unsigned char *c) { - return !(lo_write(dbconn, *(int *) fd, c, count)); + return !(lo_write(dbconn, *(int *) fd, (char *) c, count)); } /** @@ -57,7 +56,7 @@ static int keydb_putchar(void *fd, size_t count, unsigned char *c) * this file are called in order to allow the DB to be initialized ready * for access. */ -void initdb(void) +void initdb(bool readonly) { dbconn = PQsetdbLogin(config.pg_dbhost, // host NULL, // port @@ -68,8 +67,8 @@ void initdb(void) config.pg_dbpass); // password if (PQstatus(dbconn) == CONNECTION_BAD) { - fprintf(stderr, "Connection to database failed.\n"); - fprintf(stderr, "%s\n", PQerrorMessage(dbconn)); + logthing(LOGTHING_CRITICAL, "Connection to database failed."); + logthing(LOGTHING_CRITICAL, "%s", PQerrorMessage(dbconn)); PQfinish(dbconn); dbconn = NULL; exit(1); @@ -169,10 +168,11 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey, fd = lo_open(dbconn, key_oid, INV_READ); if (fd < 0) { - fprintf(stderr, "Can't open large object.\n"); + logthing(LOGTHING_ERROR, + "Can't open large object."); } else { read_openpgp_stream(keydb_fetchchar, &fd, - &packets); + &packets, 0); parse_keys(packets, publickey); lo_close(dbconn, fd); free_packet_list(packets); @@ -180,7 +180,7 @@ int fetch_key(uint64_t keyid, struct openpgp_publickey **publickey, } } } else if (PQresultStatus(result) != PGRES_TUPLES_OK) { - fprintf(stderr, "Problem retrieving key from DB.\n"); + logthing(LOGTHING_ERROR, "Problem retrieving key from DB."); } PQclear(result); @@ -235,10 +235,12 @@ int fetch_key_text(const char *search, struct openpgp_publickey **publickey) fd = lo_open(dbconn, key_oid, INV_READ); if (fd < 0) { - fprintf(stderr, "Can't open large object.\n"); + logthing(LOGTHING_ERROR, + "Can't open large object."); } else { read_openpgp_stream(keydb_fetchchar, &fd, - &packets); + &packets, + 0); parse_keys(packets, publickey); lo_close(dbconn, fd); free_packet_list(packets); @@ -246,7 +248,7 @@ int fetch_key_text(const char *search, struct openpgp_publickey **publickey) } } } else if (PQresultStatus(result) != PGRES_TUPLES_OK) { - fprintf(stderr, "Problem retrieving key from DB.\n"); + logthing(LOGTHING_ERROR, "Problem retrieving key from DB."); } PQclear(result); @@ -307,7 +309,7 @@ int store_key(struct openpgp_publickey *publickey, bool intrans, bool update) key_oid = lo_creat(dbconn, INV_READ | INV_WRITE); if (key_oid == 0) { - fprintf(stderr, "Can't create key OID\n"); + logthing(LOGTHING_ERROR, "Can't create key OID"); } else { fd = lo_open(dbconn, key_oid, INV_WRITE); write_openpgp_stream(keydb_putchar, &fd, packets); @@ -324,8 +326,8 @@ int store_key(struct openpgp_publickey *publickey, bool intrans, bool update) result = PQexec(dbconn, statement); if (PQresultStatus(result) != PGRES_COMMAND_OK) { - fprintf(stderr, "Problem storing key in DB.\n"); - fprintf(stderr, "%s\n", PQresultErrorMessage(result)); + logthing(LOGTHING_ERROR, "Problem storing key in DB."); + logthing(LOGTHING_ERROR, "%s", PQresultErrorMessage(result)); } PQclear(result); @@ -356,8 +358,9 @@ int store_key(struct openpgp_publickey *publickey, bool intrans, bool update) } if (PQresultStatus(result) != PGRES_COMMAND_OK) { - fprintf(stderr, "Problem storing key in DB.\n"); - fprintf(stderr, "%s\n", + logthing(LOGTHING_ERROR, + "Problem storing key in DB."); + logthing(LOGTHING_ERROR, "%s", PQresultErrorMessage(result)); } /* @@ -445,7 +448,8 @@ int delete_key(uint64_t keyid, bool intrans) keyid); result = PQexec(dbconn, statement); } else if (PQresultStatus(result) != PGRES_TUPLES_OK) { - fprintf(stderr, "Problem retrieving key (%llX) from DB.\n", + logthing(LOGTHING_ERROR, + "Problem retrieving key (%llX) from DB.", keyid); } @@ -484,7 +488,8 @@ char *keyid2uid(uint64_t keyid) PQntuples(result) >= 1) { uid = strdup(PQgetvalue(result, 0, 0)); } else if (PQresultStatus(result) != PGRES_TUPLES_OK) { - fprintf(stderr, "Problem retrieving key (%llX) from DB.\n", + logthing(LOGTHING_ERROR, + "Problem retrieving key (%llX) from DB.", keyid); } @@ -496,11 +501,12 @@ char *keyid2uid(uint64_t keyid) /** * getkeysigs - Gets a linked list of the signatures on a key. * @keyid: The keyid to get the sigs for. + * @revoked: If the key is revoked. * * This function gets the list of signatures on a key. Used for key * indexing and doing stats bits. */ -struct ll *getkeysigs(uint64_t keyid) +struct ll *getkeysigs(uint64_t keyid, bool *revoked) { struct ll *sigs = NULL; PGresult *result = NULL; @@ -539,7 +545,7 @@ struct ll *getkeysigs(uint64_t keyid) sigs = lladd(sigs, createandaddtohash(signer)); } } else if (PQresultStatus(result) != PGRES_TUPLES_OK) { - fprintf(stderr, "Problem retrieving key from DB.\n"); + logthing(LOGTHING_ERROR, "Problem retrieving key from DB."); } PQclear(result); @@ -548,9 +554,34 @@ struct ll *getkeysigs(uint64_t keyid) result = PQexec(dbconn, "COMMIT"); PQclear(result); } + + /* + * TODO: What do we do about revocations? We don't have the details + * stored in a separate table, so we'd have to grab the key and decode + * it, which we're trying to avoid by having a signers table. + */ + if (revoked != NULL) { + *revoked = false; + } + return sigs; } +/** + * dumpdb - dump the key database + * @filenamebase: The base filename to use for the dump. + * + * Dumps the database into one or more files, which contain pure OpenPGP + * that can be reimported into onak or gpg. filenamebase provides a base + * file name for the dump; several files may be created, all of which will + * begin with this string and then have a unique number and a .pgp + * extension. + * */ +int dumpdb(char *filenamebase) +{ + return 0; +} + /* * Include the basic keydb routines. */