From: Jonathan McDowell <noodles@earth.li>
Date: Mon, 31 May 2004 23:47:40 +0000 (+0000)
Subject: cscvs to tla changeset 76
X-Git-Url: https://git.sommitrealweird.co.uk/onak.git/commitdiff_plain/6a721665f41611f80cb878237b5d7fa650ccbe20?ds=sidebyside;hp=dd37c5ea8e61e9bec43d01ff1551202bea7402dc

cscvs to tla changeset 76
Author: noodles
Date: 2003/04/21 00:26:49
Readd a limited degree of bidirectional key linkage (signers & signees)
---

diff --git a/keydb.c b/keydb.c
index 406f857..7cfb6a1 100644
--- a/keydb.c
+++ b/keydb.c
@@ -95,29 +95,22 @@ struct ll *getkeysigs(uint64_t keyid)
 struct ll *cached_getkeysigs(uint64_t keyid)
 {
 	struct stats_key *key = NULL;
+	struct stats_key *signedkey = NULL;
+	struct ll        *cursig = NULL;
 
 	if (keyid == 0)  {
 		return NULL;
 	}
 
-	key = findinhash(keyid);
-	if (key == NULL) {
-		key = malloc(sizeof(*key));
-		if (key != NULL) {
-			key->keyid = keyid;
-			key->colour = 0;
-			key->parent = 0;
-			key->sigs = NULL;
-			key->gotsigs = false;
-			key->disabled = false;
-			addtohash(key);
-		} else {
-			perror("cached_getkeysigs()");
-			return NULL;
-		}
-	}
+	key = createandaddtohash(keyid);
+
 	if (key->gotsigs == false) {
 		key->sigs = getkeysigs(key->keyid);
+		for (cursig = key->sigs; cursig != NULL;
+				cursig = cursig->next) {
+			signedkey = (struct stats_key *) cursig->object;
+			signedkey->signs = lladd(signedkey->signs, key);
+		}
 		key->gotsigs = true;
 	}
 
diff --git a/keystructs.h b/keystructs.h
index e145fdf..3b46680 100644
--- a/keystructs.h
+++ b/keystructs.h
@@ -94,6 +94,7 @@ struct stats_key {
 	int colour;
 	uint64_t parent;
 	struct ll *sigs;
+	struct ll *signs;
 	bool gotsigs;
 	bool disabled;
 };
diff --git a/mem.c b/mem.c
index bb68ac3..325b07a 100644
--- a/mem.c
+++ b/mem.c
@@ -187,6 +187,10 @@ void free_statskey(struct stats_key *key)
 			llfree(key->sigs, NULL);
 			key->sigs = NULL;
 		}
+		if (key->signs != NULL) {
+			llfree(key->signs, NULL);
+			key->signs = NULL;
+		}
 		free(key);
 	}
 }
diff --git a/sixdegrees.c b/sixdegrees.c
index 128e8f3..d647f5e 100644
--- a/sixdegrees.c
+++ b/sixdegrees.c
@@ -16,10 +16,11 @@
 #include "onak-conf.h"
 #include "stats.h"
 
-unsigned long countdegree(struct stats_key *have, int maxdegree)
+unsigned long countdegree(struct stats_key *have, bool sigs, int maxdegree)
 {
-	unsigned long count = 0, curdegree = 0;
-	struct ll *curll, *nextll, *sigll, *tmp;
+	unsigned long     count = 0, curdegree = 0;
+	struct ll        *curll, *nextll, *sigll, *tmp;
+	struct stats_key *key = NULL;
 
 	++curdegree;
 
@@ -27,8 +28,17 @@ unsigned long countdegree(struct stats_key *have, int maxdegree)
 	curll = lladd(NULL, have);
 
 	while (curll != NULL && curdegree <= maxdegree) {
-		sigll = cached_getkeysigs(((struct stats_key *)
+		if (sigs) {
+			sigll = cached_getkeysigs(((struct stats_key *)
 				curll->object)->keyid);
+		} else {
+			sigll = NULL;
+			key = findinhash(((struct stats_key *)
+				curll->object)->keyid);
+			if (key != NULL) {
+				sigll = key->signs;
+			}
+		}
 		while (sigll != NULL) {
 			if (((struct stats_key *) sigll->object)->colour==0) {
 				/* We've never seen it. Count it, mark it and
@@ -83,17 +93,26 @@ void sixdegrees(uint64_t keyid)
 	free(uid);
 	uid = NULL;
 
-	puts("\t\tSigned by");
+	/*
+	 * Cheat. This prefills the ->sign part of all the keys we want to
+	 * look at so that we can output that info at the same time as the
+	 * signers. However we're assuming that the signers and signees are
+	 * reasonably closely related otherwise the info is wildly off - the
+	 * only way to get 100% accurate results is to examine every key to see
+	 * if it's signed by the key we're looking at.
+	 */
+	initcolour(false);
+	degree = countdegree(keyinfo, true, 7);
+
+	puts("\t\tSigned by\t\tSigns");
 	for (loop = 1; loop < 7; loop++) {
 		initcolour(false);
-		degree = countdegree(keyinfo, loop);
-		printf("Degree %d:\t%8ld\n", loop, degree);
-		/*
-		 * TODO: Used to have keys we signed as well but this takes a
-		 * lot of resource and isn't quite appropriate for something
-		 * intended to be run on the fly. Given this isn't a CGI at
-		 * present perhaps should be readded.
-		 */
+		degree = countdegree(keyinfo, true, loop);
+		printf("Degree %d:\t%8ld", loop, degree);
+
+		initcolour(false);
+		degree = countdegree(keyinfo, false, loop);
+		printf("\t\t%8ld\n", degree);
 	}
 }
 
@@ -108,7 +127,7 @@ int main(int argc, char *argv[])
 	readconfig();
 	initdb();
 	inithash();
-	sixdegrees(keyid);
+	sixdegrees(getfullkeyid(keyid));
 	destroyhash();
 	cleanupdb();
 	cleanupconfig();