From 77f85ccdd1034ce48b3d9690e2f89335057d110b Mon Sep 17 00:00:00 2001 From: Lysann Tranvouez Date: Wed, 11 Mar 2026 22:57:51 +0100 Subject: [PATCH] support reading several key IDs in .gpg-id files --- passKit/Models/PasswordStore.swift | 10 +++++++--- .../23/44f8116ab49ad30dd96d92e306a2b28839ee71 | Bin 0 -> 175 bytes .../34/22e35e46f42b12fdca050c9bc424028d0e89c8 | Bin 0 -> 87 bytes .../8b/08bf485e19720eae26df62ddceefbb8b4d8247 | Bin 0 -> 897 bytes .../bb/1f455127743a2e202840fc39201937a2457ed2 | 1 + .../c7/c52ac6962d08d69e5651eedd6cbaf2f8bd05c3 | 3 +++ .../refs/heads/master | 1 + passKitTests/Models/PasswordStoreTest.swift | 13 +++++++------ 8 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 passKitTests/Fixtures/password-store-with-gpgid.git/objects/23/44f8116ab49ad30dd96d92e306a2b28839ee71 create mode 100644 passKitTests/Fixtures/password-store-with-gpgid.git/objects/34/22e35e46f42b12fdca050c9bc424028d0e89c8 create mode 100644 passKitTests/Fixtures/password-store-with-gpgid.git/objects/8b/08bf485e19720eae26df62ddceefbb8b4d8247 create mode 100644 passKitTests/Fixtures/password-store-with-gpgid.git/objects/bb/1f455127743a2e202840fc39201937a2457ed2 create mode 100644 passKitTests/Fixtures/password-store-with-gpgid.git/objects/c7/c52ac6962d08d69e5651eedd6cbaf2f8bd05c3 create mode 100644 passKitTests/Fixtures/password-store-with-gpgid.git/refs/heads/master diff --git a/passKit/Models/PasswordStore.swift b/passKit/Models/PasswordStore.swift index f71b8a6..b6d01b1 100644 --- a/passKit/Models/PasswordStore.swift +++ b/passKit/Models/PasswordStore.swift @@ -410,7 +410,7 @@ public class PasswordStore { } if Defaults.isEnableGPGIDOn { let encryptedDataPath = password.fileURL(in: storeURL) - return [findGPGID(from: encryptedDataPath)] + return findGPGIDs(from: encryptedDataPath) } return [] }() @@ -461,7 +461,7 @@ extension PasswordStore { } } -func findGPGID(from url: URL) -> String { +func findGPGIDs(from url: URL) -> [String] { var path = url while !FileManager.default.fileExists(atPath: path.appendingPathComponent(".gpg-id").path), path.path != "file:///" { @@ -469,5 +469,9 @@ func findGPGID(from url: URL) -> String { } path = path.appendingPathComponent(".gpg-id") - return (try? String(contentsOf: path))?.trimmed ?? "" + let allKeysSeparatedByNewline = (try? String(contentsOf: path)) ?? "" + return allKeysSeparatedByNewline + .split(separator: "\n") + .map { String($0).trimmed } + .filter { !$0.isEmpty } } diff --git a/passKitTests/Fixtures/password-store-with-gpgid.git/objects/23/44f8116ab49ad30dd96d92e306a2b28839ee71 b/passKitTests/Fixtures/password-store-with-gpgid.git/objects/23/44f8116ab49ad30dd96d92e306a2b28839ee71 new file mode 100644 index 0000000000000000000000000000000000000000..d798c2c294d12b85ea7a3759cf4f4cc42e3232e3 GIT binary patch literal 175 zcmV;g08syU0V^p=O;s>7GiNX~FfcPQQP4{-NY~9wVF;MEM)0C}-pWn7_ih~&=68LQ z*ehsa00atYiMg3Ml?-x8=jI8R38ly#^Hnq0JnMr^giHZMK|yL!aeiK64#T`WPp%NY z85-IVyE~Z$k6D;aulWa2Qk;=kl$yd|qVzbFUn?6 dUZFU*LVVqsSv|i>wR^Y5+wXDK0|3aiKI4&zP~89k literal 0 HcmV?d00001 diff --git a/passKitTests/Fixtures/password-store-with-gpgid.git/objects/34/22e35e46f42b12fdca050c9bc424028d0e89c8 b/passKitTests/Fixtures/password-store-with-gpgid.git/objects/34/22e35e46f42b12fdca050c9bc424028d0e89c8 new file mode 100644 index 0000000000000000000000000000000000000000..69995d0a287cad2ca6f8ab7be65d971c47169976 GIT binary patch literal 87 zcmV-d0I2_X0V^p=O;s>AXD~D{Ff%bx&`U2!*Ud~}*e&lGs9s{Fr=a2R$5KJke35J2 tC8(10%#w`KB)#PPT##ahZjSvPags%R>(uTi-97hyceihoI{-x<9TKf%DR%$> literal 0 HcmV?d00001 diff --git a/passKitTests/Fixtures/password-store-with-gpgid.git/objects/8b/08bf485e19720eae26df62ddceefbb8b4d8247 b/passKitTests/Fixtures/password-store-with-gpgid.git/objects/8b/08bf485e19720eae26df62ddceefbb8b4d8247 new file mode 100644 index 0000000000000000000000000000000000000000..ea752fb59f479221ee814ac65c743cb495168ece GIT binary patch literal 897 zcmV-{1AhE?0ReUciTq-0Z(<-gH#Y!<0Sp7X@s5I6Xj^>&2mrSx8ci2rXT~yI0?r=U zB7^)Ywla$k7VwNAk;QJ2>1!cRe3`dbQ77lFfqxzC3>hg9*hU;h6zB3I331U=q4{9A z3_i`XHsP61g@dgTV2XPMCbf+?cJQqY$Q1(N&t7=Yr(=GDQ?KweP$NXTlv5kx_TYhw zQ6Kr`NMTMIaZ2v=K!8Qs6sBuY^(GSx%f2!T+apH|xC)x_0HUc_IB;wYd!x6W?M6mt z>2h;~ygQgIFRNQOSH|-6(Ar|9C1gWuZh2*-*4udsiR+LMcZ`u_YrJ+NlSw_q%fN)) zqa^;Mr8`-Zyan=SE)B&bYfO7D97D-E*}mAUHpI|#;R1yM3p(+pUf+*1kQdG=rdA&*DV&};_tyO zFKXQMK4?WynL^WzE`Haj121xS-4>dW-%|U{)+42w-uL;try7TXr=gjCZc{E3PW#~-B zAxk8Kuz=R{=*8Z6mxS>bz0Af#xb<+=2{7pE`H)>H&_u5j-M0}x_i#BGbRrmxJ*p}f zBH5($1FGc=ut-hFD9ueHxev=(2NPIG`*yFo_@9!(j=#_r2ldmLDo;+ve~2k;AvU+nOZU3rTPI~e#~n z+ntE1`D=z1t{)^cW5k+xeg64Ffp=pDf!)&V@I zwJjJBV~d@)5So_=at(N#Xxs5NM|z2fI6e+M7PnJNi|P}n%G8637cl%kN9rNRN;3IbgM&o`FH4tVZqpuh-|Tq@e#H+ literal 0 HcmV?d00001 diff --git a/passKitTests/Fixtures/password-store-with-gpgid.git/objects/bb/1f455127743a2e202840fc39201937a2457ed2 b/passKitTests/Fixtures/password-store-with-gpgid.git/objects/bb/1f455127743a2e202840fc39201937a2457ed2 new file mode 100644 index 0000000..61d0371 --- /dev/null +++ b/passKitTests/Fixtures/password-store-with-gpgid.git/objects/bb/1f455127743a2e202840fc39201937a2457ed2 @@ -0,0 +1 @@ +x1 @k^BI(9Bj]lEUMC{lD+=rKd8.4uy: n痈Ky1F \ No newline at end of file diff --git a/passKitTests/Fixtures/password-store-with-gpgid.git/objects/c7/c52ac6962d08d69e5651eedd6cbaf2f8bd05c3 b/passKitTests/Fixtures/password-store-with-gpgid.git/objects/c7/c52ac6962d08d69e5651eedd6cbaf2f8bd05c3 new file mode 100644 index 0000000..89b191d --- /dev/null +++ b/passKitTests/Fixtures/password-store-with-gpgid.git/objects/c7/c52ac6962d08d69e5651eedd6cbaf2f8bd05c3 @@ -0,0 +1,3 @@ +xAj0s+bF#Y < |@m]Hry}B>C_ +~O S+"@yڅh}`ޱ'1EGEP$7KEiyh8f +G[g 9g {;^oH'a0d{D ϨlUKS5T B-BfH’z9RS9v qkcJ \ No newline at end of file diff --git a/passKitTests/Fixtures/password-store-with-gpgid.git/refs/heads/master b/passKitTests/Fixtures/password-store-with-gpgid.git/refs/heads/master new file mode 100644 index 0000000..2b6288a --- /dev/null +++ b/passKitTests/Fixtures/password-store-with-gpgid.git/refs/heads/master @@ -0,0 +1 @@ +c7c52ac6962d08d69e5651eedd6cbaf2f8bd05c3 diff --git a/passKitTests/Models/PasswordStoreTest.swift b/passKitTests/Models/PasswordStoreTest.swift index 4fe2c80..bb78bbf 100644 --- a/passKitTests/Models/PasswordStoreTest.swift +++ b/passKitTests/Models/PasswordStoreTest.swift @@ -32,7 +32,7 @@ final class PasswordStoreTest: XCTestCase { try cloneRepository(.withGPGID) XCTAssertEqual(passwordStore.numberOfPasswords, 4) - XCTAssertEqual(passwordStore.numberOfCommits, 16) + XCTAssertEqual(passwordStore.numberOfCommits, 17) XCTAssertEqual(passwordStore.numberOfLocalCommits, 0) let entity = passwordStore.fetchPasswordEntity(with: "personal/github.com.gpg") @@ -319,11 +319,12 @@ final class PasswordStoreTest: XCTestCase { Defaults.isEnableGPGIDOn = true [ - ("work/github.com", "4712286271220DB299883EA7062E678DA1024DAE"), - ("personal/github.com", "787EAE1A5FA3E749AA34CC6AA0645EBED862027E"), - ].forEach { path, id in - let keyID = findGPGID(from: localRepoURL.appendingPathComponent(path)) - XCTAssertEqual(keyID, id) + ("work/github.com", ["4712286271220DB299883EA7062E678DA1024DAE"]), + ("personal/github.com", ["787EAE1A5FA3E749AA34CC6AA0645EBED862027E"]), + ("shared/github.com", ["4712286271220DB299883EA7062E678DA1024DAE", "787EAE1A5FA3E749AA34CC6AA0645EBED862027E"]), + ].forEach { path, keyIDs in + let foundKeyIDs = findGPGIDs(from: localRepoURL.appendingPathComponent(path)) + XCTAssertEqual(foundKeyIDs, keyIDs) } let personal = try decrypt(path: "personal/github.com.gpg")