Skip to content

Commit 7b37649

Browse files
authored
Allow clients to programmatically accept an identity change (#6248)
This will allow clients to take the information from specific registry error cases and programmatically accept them as valid. This can be useful if a client wants to offer a way for users to accept an allowed identity change.
1 parent 55faf3c commit 7b37649

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

Sources/PackageRegistry/RegistryClient.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,26 @@ public final class RegistryClient: Cancellable {
126126
try self.httpClient.cancel(deadline: deadline)
127127
}
128128

129+
public func changeSigningEntityFromVersion(
130+
package: PackageIdentity,
131+
version: Version,
132+
signingEntity: SigningEntity,
133+
origin: SigningEntity.Origin,
134+
observabilityScope: ObservabilityScope,
135+
callbackQueue: DispatchQueue,
136+
completion: @escaping (Result<Void, Error>) -> Void
137+
) {
138+
self.signingEntityStorage?.changeSigningEntityFromVersion(
139+
package: package,
140+
version: version,
141+
signingEntity: signingEntity,
142+
origin: origin,
143+
observabilityScope: observabilityScope,
144+
callbackQueue: callbackQueue,
145+
callback: completion
146+
)
147+
}
148+
129149
public func getPackageMetadata(
130150
package: PackageIdentity,
131151
timeout: DispatchTimeInterval? = .none,
@@ -1586,7 +1606,7 @@ public enum RegistryError: Error, CustomStringConvertible {
15861606
case unknownSignatureFormat(String)
15871607
case invalidSignature(reason: String)
15881608
case invalidSigningCertificate(reason: String)
1589-
case signerNotTrusted(SigningEntity)
1609+
case signerNotTrusted(PackageIdentity, SigningEntity)
15901610
case failedToValidateSignature(Error)
15911611
case signingEntityForReleaseChanged(
15921612
registry: Registry,
@@ -1694,7 +1714,7 @@ public enum RegistryError: Error, CustomStringConvertible {
16941714
return "signature is invalid: \(reason)"
16951715
case .invalidSigningCertificate(let reason):
16961716
return "the signing certificate is invalid: \(reason)"
1697-
case .signerNotTrusted(let signingEntity):
1717+
case .signerNotTrusted(_, let signingEntity):
16981718
return "the signer \(signingEntity) is not trusted"
16991719
case .failedToValidateSignature(let error):
17001720
return "failed to validate signature: \(error)"

Sources/PackageRegistry/SignatureValidation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ struct SignatureValidation {
375375
))
376376
}
377377

378-
let signerNotTrustedError = RegistryError.signerNotTrusted(signingEntity)
378+
let signerNotTrustedError = RegistryError.signerNotTrusted(package.underlying, signingEntity)
379379

380380
switch onUntrusted {
381381
case .prompt:

Sources/Workspace/Workspace.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3468,6 +3468,26 @@ extension Workspace {
34683468
// remove the local copy
34693469
try registryDownloadsManager.remove(package: dependency.packageRef.identity)
34703470
}
3471+
3472+
public func acceptIdentityChange(
3473+
package: PackageIdentity,
3474+
version: Version,
3475+
signingEntity: SigningEntity,
3476+
origin: SigningEntity.Origin,
3477+
observabilityScope: ObservabilityScope,
3478+
callbackQueue: DispatchQueue,
3479+
completion: @escaping (Result<Void, Error>) -> Void
3480+
) {
3481+
self.registryClient.changeSigningEntityFromVersion(
3482+
package: package,
3483+
version: version,
3484+
signingEntity: signingEntity,
3485+
origin: origin,
3486+
observabilityScope: observabilityScope,
3487+
callbackQueue: callbackQueue,
3488+
completion: completion
3489+
)
3490+
}
34713491
}
34723492

34733493
// MARK: - Utility extensions

0 commit comments

Comments
 (0)