From 42d43e0ec08e249cecf74ec448cb6405b3c89d84 Mon Sep 17 00:00:00 2001 From: Jonathan McDowell Date: Mon, 31 May 2004 23:48:19 +0000 Subject: [PATCH] cscvs to tla changeset 125 Author: noodles Date: 2004/05/27 01:25:37 First cut of photo ID uid support. --- Makefile | 7 ++++--- keyindex.c | 23 +++++++++++++++++------ lookup.c | 25 ++++++++++++++++++++++++- onak.c | 24 +++++++++++++++++++++++- photoid.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ photoid.h | 27 +++++++++++++++++++++++++++ 6 files changed, 147 insertions(+), 11 deletions(-) create mode 100644 photoid.c create mode 100644 photoid.h diff --git a/Makefile b/Makefile index 557e921..c980e4c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # # Makefile for onak. # -# $Id: Makefile,v 1.18 2003/10/03 23:07:31 noodles Exp $ +# $Id: Makefile,v 1.19 2004/05/27 01:25:37 noodles Exp $ # CC = gcc @@ -17,11 +17,12 @@ LIBS = -L/usr/local/lib -ldb3 PROGS = add lookup gpgwww onak splitkeys CORE_OBJS = armor.o charfuncs.o decodekey.o getcgi.o hash.o keydb_$(DBTYPE).o \ - keyid.o keyindex.o ll.o mem.o onak-conf.o parsekey.o sha.o md5.o log.o + keyid.o keyindex.o ll.o mem.o onak-conf.o parsekey.o sha.o md5.o \ + log.o photoid.o OBJS = merge.o stats.o sendsync.o $(CORE_OBJS) SRCS = armor.c parsekey.c merge.c keyid.c md5.c sha.c main.c getcgi.c stats.c \ keyindex.c mem.c lookup.c add.c keydb_$(DBTYPE).c ll.c hash.c \ - gpgwww.c onak-conf.c charfuncs.c sendsync.c log.c + gpgwww.c onak-conf.c charfuncs.c sendsync.c log.c photoid.c all: .depend $(PROGS) testparse maxpath sixdegrees splitkeys diff --git a/keyindex.c b/keyindex.c index 1f13851..9210cc8 100644 --- a/keyindex.c +++ b/keyindex.c @@ -5,7 +5,7 @@ * * Copyright 2002 Project Purple * - * $Id: keyindex.c,v 1.14 2004/05/26 17:48:02 noodles Exp $ + * $Id: keyindex.c,v 1.15 2004/05/27 01:25:37 noodles Exp $ */ #include @@ -63,9 +63,11 @@ int list_sigs(struct openpgp_packet_list *sigs, bool html) return 0; } -int list_uids(struct openpgp_signedpacket_list *uids, bool verbose, bool html) +int list_uids(uint64_t keyid, struct openpgp_signedpacket_list *uids, + bool verbose, bool html) { char buf[1024]; + int imgindx = 0; while (uids != NULL) { if (uids->packet->tag == 13) { @@ -75,8 +77,15 @@ int list_uids(struct openpgp_signedpacket_list *uids, bool verbose, bool html) printf(" %s\n", (html) ? txt2html(buf) : buf); } else if (uids->packet->tag == 17) { - printf(" " - "[photo id]\n"); + printf(" "); + if (html) { + printf("\"[photo\n", + keyid, + imgindx); + imgindx++; + } else { + printf("[photo id]\n"); + } } if (verbose) { list_sigs(uids->sigs, html); @@ -184,6 +193,7 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint, int type = 0; int length = 0; char buf[1024]; + uint64_t keyid; if (html) { puts("
");
@@ -213,11 +223,12 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint,
 				keys->publickey->data[0]);
 		}
 		
+		keyid = (get_keyid(keys) & 0xFFFFFFFF),
 		printf("pub  %5d%c/%08X %04d/%02d/%02d ",
 			length,
 			(type == 1) ? 'R' : ((type == 16) ? 'g' : 
 				((type == 17) ? 'D' : '?')),
-			(uint32_t) (get_keyid(keys) & 0xFFFFFFFF),
+			(uint32_t) keyid,
 			created->tm_year + 1900,
 			created->tm_mon + 1,
 			created->tm_mday);
@@ -247,7 +258,7 @@ int key_index(struct openpgp_publickey *keys, bool verbose, bool fingerprint,
 			}
 		}
 
-		list_uids(curuid, verbose, html);
+		list_uids(keyid, curuid, verbose, html);
 		if (verbose) {
 			list_subkeys(keys->subkeys, verbose, html);
 		}
diff --git a/lookup.c b/lookup.c
index 67eac59..5d638ea 100644
--- a/lookup.c
+++ b/lookup.c
@@ -5,7 +5,7 @@
  *
  * Copyright 2002 Project Purple
  *
- * $Id: lookup.c,v 1.14 2004/05/26 18:53:14 noodles Exp $
+ * $Id: lookup.c,v 1.15 2004/05/27 01:25:37 noodles Exp $
  */
 
 #include 
@@ -24,11 +24,13 @@
 #include "mem.h"
 #include "onak-conf.h"
 #include "parsekey.h"
+#include "photoid.h"
 
 #define OP_UNKNOWN 0
 #define OP_GET     1
 #define OP_INDEX   2
 #define OP_VINDEX  3
+#define OP_PHOTO   4
 
 void find_keys(char *search, uint64_t keyid, bool ishex,
 		bool fingerprint, bool exact, bool verbose, bool mrhkp)
@@ -73,6 +75,7 @@ int main(int argc, char *argv[])
 	char **params = NULL;
 	int op = OP_UNKNOWN;
 	int i;
+	int indx = 0;
 	bool fingerprint = false;
 	bool exact = false;
 	bool ishex = false;
@@ -93,6 +96,8 @@ int main(int argc, char *argv[])
 				op = OP_INDEX;
 			} else if (!strcmp(params[i+1], "vindex")) {
 				op = OP_VINDEX;
+			} else if (!strcmp(params[i+1], "photo")) {
+				op = OP_PHOTO;
 			}
 		} else if (!strcmp(params[i], "search")) {
 			search = params[i+1];
@@ -105,6 +110,8 @@ int main(int argc, char *argv[])
 					ishex = true;
 				}
 			}
+		} else if (!strcmp(params[i], "idx")) {
+			indx = atoi(params[i+1]);
 		} else if (!strcmp(params[i], "fingerprint")) {
 			if (!strcmp(params[i+1], "on")) {
 				fingerprint = true;
@@ -137,6 +144,8 @@ int main(int argc, char *argv[])
 
 	if (mrhkp) {
 		puts("Content-Type: text/plain\n");
+	} else if (op == OP_PHOTO) {
+		puts("Content-Type: image/jpeg\n");
 	} else {
 		start_html("Lookup of key");
 	}
@@ -174,6 +183,20 @@ int main(int argc, char *argv[])
 			find_keys(search, keyid, ishex, fingerprint, exact,
 					true, mrhkp);
 			break;
+		case OP_PHOTO:
+			if (fetch_key(keyid, &publickey, false)) {
+				struct openpgp_packet *photo = NULL;
+				photo = getphoto(publickey, 0);
+				if (photo != NULL) {
+					fwrite(photo->data+19,
+							1,
+							(photo->length - 19),
+							stdout);
+				}
+				free_publickey(publickey);
+				publickey = NULL;
+			}
+			break;
 		default:
 			puts("Unknown operation!");
 		}
diff --git a/onak.c b/onak.c
index 0fdb7e4..3a4c4e8 100644
--- a/onak.c
+++ b/onak.c
@@ -7,7 +7,7 @@
  * 
  * Copyright 2002 Project Purple
  *
- * $Id: onak.c,v 1.19 2004/03/23 12:33:47 noodles Exp $
+ * $Id: onak.c,v 1.20 2004/05/27 01:25:37 noodles Exp $
  */
 
 #include 
@@ -26,6 +26,7 @@
 #include "merge.h"
 #include "onak-conf.h"
 #include "parsekey.h"
+#include "photoid.h"
 
 void find_keys(char *search, uint64_t keyid, bool ishex,
 		bool fingerprint, bool exact, bool verbose)
@@ -173,6 +174,27 @@ int main(int argc, char *argv[])
 		} else if (!strcmp("vindex", argv[optind])) {
 			find_keys(search, keyid, ishex, fingerprint,
 					false, true);
+		} else if (!strcmp("getphoto", argv[optind])) {
+			if (!ishex) {
+				puts("Can't get a key on uid text."
+					" You must supply a keyid.");
+			} else if (fetch_key(keyid, &keys, false)) {
+				struct openpgp_packet *photo = NULL;
+				FILE *photof = NULL;
+				photo = getphoto(keys, 0);
+				if (photo != NULL) {
+					photof = fopen("keyphoto.jpg", "w");
+					fwrite(photo->data+19,
+							1,
+							(photo->length - 19),
+							photof);
+					fclose(photof);
+				}
+				free_publickey(keys);
+				keys = NULL;
+			} else {
+				puts("Key not found");
+			}
 		} else if (!strcmp("delete", argv[optind])) {
 			delete_key(getfullkeyid(keyid), false);
 		} else if (!strcmp("get", argv[optind])) {
diff --git a/photoid.c b/photoid.c
new file mode 100644
index 0000000..4416e3e
--- /dev/null
+++ b/photoid.c
@@ -0,0 +1,52 @@
+/*
+ * photoid.c - Routines for OpenPGP id photos.
+ *
+ * Jonathan McDowell 
+ *
+ * Copyright 2004 Project Purple
+ *
+ * $Id: photoid.c,v 1.1 2004/05/27 01:25:37 noodles Exp $
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "keyid.h"
+#include "keyindex.h"
+#include "keystructs.h"
+
+/**
+ * 	getphoto - returns an OpenPGP packet containing a photo id.
+ * 	@key: The key to return the photo id from.
+ * 	@index: The index of the photo to return.
+ *
+ * 	This function returns the OpenPGP packet containing a photo id from a
+ * 	supplied key. index specifies which photo id should be returned. If
+ * 	there's no such photo id NULL is returned.
+ */
+struct openpgp_packet *getphoto(struct openpgp_publickey *key, int index)
+{
+	struct openpgp_signedpacket_list *curuid = NULL;
+	struct openpgp_packet            *photo = NULL;
+	int                               i = 0;
+
+	assert(key != NULL);
+
+	curuid = key->uids;
+	i = 0;
+	while (photo == NULL && curuid != NULL && i <= index) {
+		if (curuid->packet->tag == 17) {
+			if (i == index) {
+				photo = curuid->packet;
+			} else {
+				i++;
+			}
+		}
+		curuid = curuid->next;
+	}
+
+	return photo;
+}
diff --git a/photoid.h b/photoid.h
new file mode 100644
index 0000000..03bbf32
--- /dev/null
+++ b/photoid.h
@@ -0,0 +1,27 @@
+/*
+ * photoid.h - Routines for OpenPGP id photos.
+ *
+ * Jonathan McDowell 
+ *
+ * Copyright 2004 Project Purple
+ *
+ * $Id: photoid.h,v 1.1 2004/05/27 01:25:37 noodles Exp $
+ */
+
+#ifndef __PHOTOID_H__
+#define __PHOTOID_H__
+
+#include "keystructs.h"
+
+/**
+ * 	getphoto - returns an OpenPGP packet containing a photo id.
+ * 	@key: The key to return the photo id from.
+ * 	@index: The index of the photo to return.
+ *
+ * 	This function returns the OpenPGP packet containing a photo id from a
+ * 	supplied key. index specifies which photo id should be returned. If
+ * 	there's no such photo id NULL is returned.
+ */
+struct openpgp_packet *getphoto(struct openpgp_publickey *key, int index);
+
+#endif /* __PHOTOID_H__ */
-- 
2.39.5