Add support for key revocation in mock gpg tool
authorJacob Bachmeyer <jcb@gnu.org>
Fri, 10 Mar 2023 04:12:49 +0000 (22:12 -0600)
committerJacob Bachmeyer <jcb@gnu.org>
Fri, 10 Mar 2023 04:12:49 +0000 (22:12 -0600)
testsuite/lib/exec/mockgpg
testsuite/mock.gpg/keymgr.exp

index d323b71afec92d9d63957681c1b76de15f079124..a46d78bb602c69b472c856e7c00ca861e478bac3 100755 (executable)
@@ -188,6 +188,20 @@ function list_keyring() {
     fi
 }
 
+# import_key <keyfile> <keyring>
+function import_key() {
+    [ -f "$1" ] || return
+    KRTmpFile=mockgpg-import.$$
+    cat "$1" >> "$2"
+    sort -u -t : -k 1 -k 2 -k 4 -o "$2" "$2"
+    awk -F: 'BEGIN { OFS = FS }
+            $2 == "R" { RevKeyID = $1 }
+            $1 == RevKeyID { $2 = "R" }
+            { print }' "$2" > "$KRTmpFile"
+    sort -u -t : -k 1 -k 4 -o "$2" "$KRTmpFile"
+    rm -f "$KRTmpFile"
+}
+
 case ${Command:?no command given} in
     import)
        # The mock keyring format is such that import is accomplished by
@@ -195,7 +209,7 @@ case ${Command:?no command given} in
        if [ "${#Files[*]}" -gt 0 ]; then
            for file in "${Files[@]}"; do
                for keyring in "${Keyrings[@]}"; do
-                   [ -f "$file" ] && cat "$file" >>"$keyring"
+                   import_key "$file" "$keyring"
                done
            done
        else
@@ -203,7 +217,7 @@ case ${Command:?no command given} in
            TmpFile=mockgpg-scratchpad.$$
            cat >"$TmpFile"
            for keyring in "${Keyrings[@]}"; do
-               cat "$TmpFile" >>"$keyring"
+               import_key "$TmpFile" "$keyring"
            done
            rm -f "$TmpFile"
        fi
index fe66f5a249f3f52bfd7f9ef6f2c6498f1f8792dd..a72a12849511c9ff9396f64af8fda02b6116bb47 100644 (file)
@@ -55,6 +55,58 @@ check_test_keyring "simple import" [testfile K1.gpg] {
     { id 1002 name {test 1-2} }
 }
 
+run_gpg [testfile K1.gpg] --import [testfile k1a.pgp]
+
+check_test_keyring "duplicate import" [testfile K1.gpg] {
+    { id 1001 name {test 1-1} }
+    { id 1002 name {test 1-2} }
+}
+
+write_test_keyring [testfile k1a1.pgp] {
+    { id 1001 name {test 1-1a} }
+}
+
+run_gpg [testfile K1.gpg] --import [testfile k1a1.pgp]
+
+check_test_keyring "merge import" [testfile K1.gpg] {
+    { id 1001 name {test 1-1} }
+    { id 1001 name {test 1-1a} }
+    { id 1002 name {test 1-2} }
+}
+
+write_test_keyring [testfile k1b1.pgp] {
+    { id 1002 name {test 1-2} is revoked }
+}
+
+run_gpg [testfile K1.gpg] --import [testfile k1b1.pgp]
+
+check_test_keyring "import revocation certificate" [testfile K1.gpg] {
+    { id 1001 name {test 1-1} }
+    { id 1001 name {test 1-1a} }
+    { id 1002 name {test 1-2} is revoked }
+}
+
+write_test_keyring [testfile k1c.pgp] {
+    { id 1003 name {test 1-3} }
+    { id 1004 name {test 1-4} }
+}
+
+write_test_keyring [testfile k1c1.pgp] {
+    { id 1003 name {test 1-3r} is revoked }
+}
+
+run_gpg [testfile K1.gpg] --import [testfile k1c.pgp]
+run_gpg [testfile K1.gpg] --import [testfile k1c1.pgp]
+
+check_test_keyring "import revocation merge" [testfile K1.gpg] {
+    { id 1001 name {test 1-1} }
+    { id 1001 name {test 1-1a} }
+    { id 1002 name {test 1-2} is revoked }
+    { id 1003 name {test 1-3} is revoked }
+    { id 1003 name {test 1-3r} is revoked }
+    { id 1004 name {test 1-4} }
+}
+
 #
 
 write_test_keyring [testfile K2.gpg] {