X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;f=keydb_keyd.c;h=cd1a2819d98eefc04b53a060d718e7c1fc58ab19;hb=85187675424f3854869f1607afd8a1e84e536946;hp=5fd084398d048568df01867785f24453c93304a4;hpb=8e0907be1d73011075a99a0c029c56664e12843e;p=onak.git
diff --git a/keydb_keyd.c b/keydb_keyd.c
index 5fd0843..cd1a281 100644
--- a/keydb_keyd.c
+++ b/keydb_keyd.c
@@ -13,12 +13,13 @@
* 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.
+ * this program. If not, see .
*/
#include
#include
+#include
+#include
#include
#include
#include
@@ -34,6 +35,7 @@
#include "keystructs.h"
#include "log.h"
#include "mem.h"
+#include "onak.h"
#include "onak-conf.h"
#include "parsekey.h"
@@ -59,6 +61,28 @@ static void keyd_endtrans(struct onak_dbctx *dbctx)
return;
}
+static bool keyd_send_cmd(int fd, enum keyd_ops _cmd)
+{
+ uint32_t cmd = _cmd;
+ ssize_t bytes;
+
+ bytes = write(fd, &cmd, sizeof(cmd));
+ if (bytes != sizeof(cmd)) {
+ return false;
+ }
+
+ bytes = read(fd, &cmd, sizeof(cmd));
+ if (bytes != sizeof(cmd)) {
+ return false;
+ }
+
+ if (cmd != KEYD_REPLY_OK) {
+ return false;
+ }
+
+ return true;
+}
+
/**
* fetch_key - Given a keyid fetch the key from storage.
* @keyid: The keyid to fetch.
@@ -78,13 +102,10 @@ static int keyd_fetch_key_id(struct onak_dbctx *dbctx,
int keyd_fd = (intptr_t) dbctx->priv;
struct buffer_ctx keybuf;
struct openpgp_packet_list *packets = NULL;
- uint32_t cmd = KEYD_CMD_GET_ID;
ssize_t bytes = 0;
ssize_t count = 0;
- write(keyd_fd, &cmd, sizeof(cmd));
- read(keyd_fd, &cmd, sizeof(cmd));
- if (cmd == KEYD_REPLY_OK) {
+ if (keyd_send_cmd(keyd_fd, KEYD_CMD_GET_ID)) {
write(keyd_fd, &keyid, sizeof(keyid));
keybuf.offset = 0;
read(keyd_fd, &keybuf.size, sizeof(keybuf.size));
@@ -116,28 +137,25 @@ static int keyd_fetch_key_id(struct onak_dbctx *dbctx,
}
static int keyd_fetch_key_fp(struct onak_dbctx *dbctx,
- uint8_t *fp, size_t fpsize,
+ struct openpgp_fingerprint *fingerprint,
struct openpgp_publickey **publickey,
bool intrans)
{
int keyd_fd = (intptr_t) dbctx->priv;
struct buffer_ctx keybuf;
struct openpgp_packet_list *packets = NULL;
- uint32_t cmd = KEYD_CMD_GET_FP;
ssize_t bytes = 0;
ssize_t count = 0;
uint8_t size;
- if (fpsize > MAX_FINGERPRINT_LEN) {
+ if (fingerprint->length > MAX_FINGERPRINT_LEN) {
return 0;
}
- write(keyd_fd, &cmd, sizeof(cmd));
- read(keyd_fd, &cmd, sizeof(cmd));
- if (cmd == KEYD_REPLY_OK) {
- size = fpsize;
+ if (keyd_send_cmd(keyd_fd, KEYD_CMD_GET_FP)) {
+ size = fingerprint->length;
write(keyd_fd, &size, sizeof(size));
- write(keyd_fd, fp, size);
+ write(keyd_fd, fingerprint->fp, size);
keybuf.offset = 0;
read(keyd_fd, &keybuf.size, sizeof(keybuf.size));
if (keybuf.size > 0) {
@@ -179,11 +197,8 @@ static int keyd_delete_key(struct onak_dbctx *dbctx,
uint64_t keyid, bool intrans)
{
int keyd_fd = (intptr_t) dbctx->priv;
- uint32_t cmd = KEYD_CMD_DELETE;
- write(keyd_fd, &cmd, sizeof(cmd));
- read(keyd_fd, &cmd, sizeof(cmd));
- if (cmd == KEYD_REPLY_OK) {
+ if (keyd_send_cmd(keyd_fd, KEYD_CMD_DELETE)) {
write(keyd_fd, &keyid, sizeof(keyid));
}
@@ -213,8 +228,8 @@ static int keyd_store_key(struct onak_dbctx *dbctx,
struct openpgp_packet_list *packets = NULL;
struct openpgp_packet_list *list_end = NULL;
struct openpgp_publickey *next = NULL;
- uint32_t cmd = KEYD_CMD_STORE;
uint64_t keyid;
+ enum keyd_ops cmd = KEYD_CMD_STORE;
if (get_keyid(publickey, &keyid) != ONAK_E_OK) {
logthing(LOGTHING_ERROR, "Couldn't find key ID for key.");
@@ -222,12 +237,10 @@ static int keyd_store_key(struct onak_dbctx *dbctx,
}
if (update) {
- keyd_delete_key(dbctx, keyid, false);
+ cmd = KEYD_CMD_UPDATE;
}
- write(keyd_fd, &cmd, sizeof(cmd));
- read(keyd_fd, &cmd, sizeof(cmd));
- if (cmd == KEYD_REPLY_OK) {
+ if (keyd_send_cmd(keyd_fd, cmd)) {
keybuf.offset = 0;
keybuf.size = 8192;
keybuf.buffer = malloc(keybuf.size);
@@ -269,13 +282,10 @@ static int keyd_fetch_key_text(struct onak_dbctx *dbctx,
int keyd_fd = (intptr_t) dbctx->priv;
struct buffer_ctx keybuf;
struct openpgp_packet_list *packets = NULL;
- uint32_t cmd = KEYD_CMD_GET_TEXT;
ssize_t bytes = 0;
ssize_t count = 0;
- write(keyd_fd, &cmd, sizeof(cmd));
- read(keyd_fd, &cmd, sizeof(cmd));
- if (cmd == KEYD_REPLY_OK) {
+ if (keyd_send_cmd(keyd_fd, KEYD_CMD_GET_TEXT)) {
bytes = strlen(search);
write(keyd_fd, &bytes, sizeof(bytes));
write(keyd_fd, search, bytes);
@@ -317,13 +327,10 @@ static int keyd_fetch_key_skshash(struct onak_dbctx *dbctx,
int keyd_fd = (intptr_t) dbctx->priv;
struct buffer_ctx keybuf;
struct openpgp_packet_list *packets = NULL;
- uint32_t cmd = KEYD_CMD_GET_SKSHASH;
ssize_t bytes = 0;
ssize_t count = 0;
- write(keyd_fd, &cmd, sizeof(cmd));
- read(keyd_fd, &cmd, sizeof(cmd));
- if (cmd == KEYD_REPLY_OK) {
+ if (keyd_send_cmd(keyd_fd, KEYD_CMD_GET_SKSHASH)) {
write(keyd_fd, hash->hash, sizeof(hash->hash));
keybuf.offset = 0;
read(keyd_fd, &keybuf.size, sizeof(keybuf.size));
@@ -367,9 +374,7 @@ static uint64_t keyd_getfullkeyid(struct onak_dbctx *dbctx, uint64_t keyid)
int keyd_fd = (intptr_t) dbctx->priv;
uint32_t cmd = KEYD_CMD_GETFULLKEYID;
- write(keyd_fd, &cmd, sizeof(cmd));
- read(keyd_fd, &cmd, sizeof(cmd));
- if (cmd == KEYD_REPLY_OK) {
+ if (keyd_send_cmd(keyd_fd, KEYD_CMD_GETFULLKEYID)) {
write(keyd_fd, &keyid, sizeof(keyid));
read(keyd_fd, &cmd, sizeof(cmd));
if (cmd != sizeof(keyid)) {
@@ -400,14 +405,11 @@ static int keyd_iterate_keys(struct onak_dbctx *dbctx,
struct buffer_ctx keybuf;
struct openpgp_packet_list *packets = NULL;
struct openpgp_publickey *key = NULL;
- uint32_t cmd = KEYD_CMD_KEYITER;
ssize_t bytes = 0;
ssize_t count = 0;
int numkeys = 0;
- write(keyd_fd, &cmd, sizeof(cmd));
- read(keyd_fd, &cmd, sizeof(cmd));
- if (cmd == KEYD_REPLY_OK) {
+ if (keyd_send_cmd(keyd_fd, KEYD_CMD_KEYITER)) {
keybuf.offset = 0;
read(keyd_fd, &keybuf.size, sizeof(keybuf.size));
while (keybuf.size > 0) {
@@ -489,7 +491,6 @@ static void keyd_cleanupdb(struct onak_dbctx *dbctx)
logthing(LOGTHING_NOTICE, "Error closing down socket: %d",
errno);
}
- keyd_fd = -1;
free(dbctx);
@@ -504,7 +505,7 @@ static void keyd_cleanupdb(struct onak_dbctx *dbctx)
* this file are called in order to allow the DB to be initialized ready
* for access.
*/
-struct onak_dbctx *keydb_keyd_init(bool readonly)
+struct onak_dbctx *keydb_keyd_init(struct onak_db_config *dbcfg, bool readonly)
{
struct sockaddr_un sock;
uint32_t cmd = KEYD_CMD_UNKNOWN;
@@ -517,6 +518,7 @@ struct onak_dbctx *keydb_keyd_init(bool readonly)
if (dbctx == NULL) {
return NULL;
}
+ dbctx->config = dbcfg;
keyd_fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (keyd_fd < 0) {
@@ -529,7 +531,7 @@ struct onak_dbctx *keydb_keyd_init(bool readonly)
sock.sun_family = AF_UNIX;
snprintf(sock.sun_path, sizeof(sock.sun_path) - 1, "%s/%s",
- config.db_dir,
+ config.sock_dir,
KEYD_SOCKET);
if (connect(keyd_fd, (struct sockaddr *) &sock, sizeof(sock)) < 0) {
logthing(LOGTHING_CRITICAL,
@@ -559,6 +561,13 @@ struct onak_dbctx *keydb_keyd_init(bool readonly)
}
count = read(keyd_fd, &reply, sizeof(reply));
+ if (count != sizeof(reply)) {
+ logthing(LOGTHING_CRITICAL,
+ "Error! Unexpected keyd version "
+ "length: %d != %d",
+ count, sizeof(reply));
+ exit(EXIT_FAILURE);
+ }
logthing(LOGTHING_DEBUG,
"keyd protocol version %d",
reply);