From: Jonathan McDowell <noodles@earth.li>
Date: Mon, 31 May 2004 23:47:42 +0000 (+0000)
Subject: cscvs to tla changeset 78
X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/commitdiff_plain/6105d01bd446c4a27638e90ff8fd539e093b3ea2

cscvs to tla changeset 78
Author: noodles
Date: 2003/06/04 22:11:40
First cut at supporting the MRHKP for key searches.
---

diff --git a/keyindex.c b/keyindex.c
index 219f3a1..180c312 100644
--- a/keyindex.c
+++ b/keyindex.c
@@ -5,7 +5,7 @@
  *
  * Copyright 2002 Project Purple
  *
- * $Id: keyindex.c,v 1.9 2003/06/04 20:57:09 noodles Exp $
+ * $Id: keyindex.c,v 1.10 2003/06/04 22:11:40 noodles Exp $
  */
 
 #include <assert.h>
@@ -254,3 +254,73 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint,
 
 	return 0;
 }
+
+/**
+ *	mrkey_index - List a set of OpenPGP keys in the MRHKP format.
+ *	@keys: The keys to display.
+ *
+ *	This function takes a list of OpenPGP public keys and displays a
+ *	machine readable list of them.
+ */
+int mrkey_index(struct openpgp_publickey *keys)
+{
+	struct openpgp_signedpacket_list	*curuid = NULL;
+	time_t					 created_time = 0;
+	int					 type = 0;
+	int					 length = 0;
+	int					 i = 0;
+	size_t					 fplength = 0;
+	unsigned char				 fp[20];
+
+
+
+	while (keys != NULL) {
+		created_time = (keys->publickey->data[1] << 24) +
+					(keys->publickey->data[2] << 16) +
+					(keys->publickey->data[3] << 8) +
+					keys->publickey->data[4];
+
+		printf("pub:");
+
+		switch (keys->publickey->data[0]) {
+		case 2:
+		case 3:
+			printf("%016llX", get_keyid(keys));
+			type = keys->publickey->data[7];
+			length = (keys->publickey->data[8] << 8) +
+					keys->publickey->data[9];
+			break;
+		case 4:
+			get_fingerprint(keys->publickey, fp, &fplength);
+
+			for (i = 0; i < fplength; i++) {
+				printf("%02X", fp[i]);
+			}
+
+			type = keys->publickey->data[5];
+			length = (keys->publickey->data[6] << 8) +
+					keys->publickey->data[7];
+			break;
+		default:
+			logthing(LOGTHING_ERROR, "Unknown key type: %d",
+				keys->publickey->data[0]);
+		}
+
+		printf(":%d:%d:%d::\n",
+			type,
+			length,
+			created_time);
+	
+		for (curuid = keys->uids; curuid != NULL;
+			 curuid = curuid->next) {
+		
+			if (curuid->packet->tag == 13) {
+				printf("uid:%.*s\n",
+					(int) curuid->packet->length,
+					curuid->packet->data);
+			}
+		}
+		keys = keys->next;
+	}
+	return 0;
+}
diff --git a/lookup.c b/lookup.c
index 33fc9ab..33d023d 100644
--- a/lookup.c
+++ b/lookup.c
@@ -5,7 +5,7 @@
  *
  * Copyright 2002 Project Purple
  *
- * $Id: lookup.c,v 1.8 2003/06/04 20:57:10 noodles Exp $
+ * $Id: lookup.c,v 1.9 2003/06/04 22:11:41 noodles Exp $
  */
 
 //#include <stdint.h>
@@ -35,7 +35,7 @@ int putnextchar(void *ctx, size_t count, unsigned char *c)
 }
 
 void find_keys(char *search, uint64_t keyid, bool ishex,
-		bool fingerprint, bool exact, bool verbose)
+		bool fingerprint, bool exact, bool verbose, bool mrhkp)
 {
 	struct openpgp_publickey *publickey = NULL;
 	int count = 0;
@@ -46,15 +46,29 @@ void find_keys(char *search, uint64_t keyid, bool ishex,
 		count = fetch_key_text(search, &publickey);
 	}
 	if (publickey != NULL) {
-		key_index(publickey, verbose, fingerprint, true);
+		if (mrhkp) {
+			printf("info:1:%d\n", count);
+			mrkey_index(publickey);
+		} else {
+			key_index(publickey, verbose, fingerprint, true);
+		}
 		free_publickey(publickey);
 	} else if (count == 0) {
-		puts("Key not found.");
+		if (mrhkp) {
+			puts("info:1:0");
+		} else {
+			puts("Key not found.");
+		}
 	} else {
-		printf("Found %d keys, but maximum number to return is %d.\n",
+		if (mrhkp) {
+			puts("info:1:0");
+		} else {
+			printf("Found %d keys, but maximum number to return"
+				" is %d.\n",
 				count,
 				config.maxkeys);
-		puts("Try again with a more specific search.");
+			puts("Try again with a more specific search.");
+		}
 	}
 }
 
@@ -66,6 +80,7 @@ int main(int argc, char *argv[])
 	bool fingerprint = false;
 	bool exact = false;
 	bool ishex = false;
+	bool mrhkp = false;
 	uint64_t keyid = 0;
 	char *search = NULL;
 	char *end = NULL;
@@ -102,6 +117,15 @@ int main(int argc, char *argv[])
 			if (!strcmp(params[i+1], "on")) {
 				exact = true;
 			}
+		} else if (!strcmp(params[i], "options")) {
+			/*
+			 * TODO: We should be smarter about this; options may
+			 * have several entries. For now mr is the only valid
+			 * one though.
+			 */
+			if (!strcmp(params[i+1], "mr")) {
+				mrhkp = true;
+			}
 		}
 		free(params[i]);
 		params[i] = NULL;
@@ -115,7 +139,11 @@ int main(int argc, char *argv[])
 		params = NULL;
 	}
 
-	start_html("Lookup of key");
+	if (mrhkp) {
+		puts("Content-Type: text/plain\n");
+	} else {
+		start_html("Lookup of key");
+	}
 
 	if (op == OP_UNKNOWN) {
 		puts("Error: No operation supplied.");
@@ -142,11 +170,11 @@ int main(int argc, char *argv[])
 			break;
 		case OP_INDEX:
 			find_keys(search, keyid, ishex, fingerprint, exact,
-					false);
+					false, mrhkp);
 			break;
 		case OP_VINDEX:
 			find_keys(search, keyid, ishex, fingerprint, exact,
-					true);
+					true, mrhkp);
 			break;
 		default:
 			puts("Unknown operation!");
@@ -155,9 +183,11 @@ int main(int argc, char *argv[])
 		cleanuplogthing();
 		cleanupconfig();
 	}
-	puts("<hr>");
-	puts("Produced by onak " VERSION " by Jonathan McDowell");
-	end_html();
+	if (!mrhkp) {
+		puts("<hr>");
+		puts("Produced by onak " VERSION " by Jonathan McDowell");
+		end_html();
+	}
 
 	if (search != NULL) {
 		free(search);