Only seed database for Debian install if we're using default config
[onak.git] / merge.c
diff --git a/merge.c b/merge.c
index 43795966d848cf41e14f42be5127106c667b185b..be97eb4782b32f5550f8f63a6db0db87d858c9ac 100644 (file)
--- a/merge.c
+++ b/merge.c
@@ -43,15 +43,19 @@ bool compare_packets(struct openpgp_packet *a, struct openpgp_packet *b)
  */
 bool compare_signatures(struct openpgp_packet *a, struct openpgp_packet *b)
 {
+       uint64_t a_keyid, b_keyid;
+       time_t a_creation, b_creation;
+
        if (a->data[0] != b->data[0]) {
                /* Different signature versions, so not the same */
                return false;
        } else if (a->data[0] == 4 && a->data[1] != b->data[1]) {
                /* Type 4 signature, but different types */
                return false;
-       /* TODO: Check signature time? */
        } else {
-               return (sig_keyid(a) == sig_keyid(b));
+               sig_info(a, &a_keyid, &a_creation);
+               sig_info(b, &b_keyid, &b_creation);
+               return (a_creation == b_creation) && (a_keyid == b_keyid);
        }
 }
 
@@ -314,12 +318,12 @@ int merge_keys(struct openpgp_publickey *a, struct openpgp_publickey *b)
                /*
                 * Key IDs are the same, so I guess we have to merge them.
                 */
-               curpacket = b->revocations;
+               curpacket = b->sigs;
                while (curpacket != NULL) {
                        nextpacket = curpacket->next;
-                       if (find_packet(a->revocations, curpacket->packet)) {
+                       if (find_packet(a->sigs, curpacket->packet)) {
                                /*
-                                * We already have this revocation, remove it
+                                * We already have this signature, remove it
                                 * from the difference list and free the memory
                                 * allocated for it.
                                 */
@@ -327,8 +331,8 @@ int merge_keys(struct openpgp_publickey *a, struct openpgp_publickey *b)
                                if (lastpacket != NULL) {
                                        lastpacket->next = curpacket->next;
                                } else {
-                                       log_assert(curpacket == b->revocations);
-                                       b->revocations = curpacket->next;
+                                       log_assert(curpacket == b->sigs);
+                                       b->sigs = curpacket->next;
                                }
                                curpacket->next = NULL;
                                free_packet_list(curpacket);
@@ -338,15 +342,15 @@ int merge_keys(struct openpgp_publickey *a, struct openpgp_publickey *b)
                        }
                        curpacket = nextpacket;
                }
-               b->last_revocation = lastpacket;
+               b->last_sig = lastpacket;
 
                /*
-                * Anything left on b->revocations doesn't exist on
-                * a->revocations, so add them to the list.
+                * Anything left on b->sigs doesn't exist on
+                * a->sigs, so add them to the list.
                 */
-               packet_list_add(&a->revocations,
-                               &a->last_revocation,
-                               b->revocations);
+               packet_list_add(&a->sigs,
+                               &a->last_sig,
+                               b->sigs);
 
                /*
                 * Merge uids (signed list).
@@ -359,5 +363,13 @@ int merge_keys(struct openpgp_publickey *a, struct openpgp_publickey *b)
 
        }
 
+       /*
+        * If either key was revoked, make sure both the new ones are marked as
+        * being so.
+        */
+       if (a->revoked || b->revoked) {
+               a->revoked = b->revoked = true;
+       }
+
        return rc;
 }