Skip to content

Commit 9640e85

Browse files
committed
Allow clients to programmatically accept an identity change
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 9e11016 commit 9640e85

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
@@ -3471,6 +3471,26 @@ extension Workspace {
34713471
// remove the local copy
34723472
try registryDownloadsManager.remove(package: dependency.packageRef.identity)
34733473
}
3474+
3475+
public func acceptIdentityChange(
3476+
package: PackageIdentity,
3477+
version: Version,
3478+
signingEntity: SigningEntity,
3479+
origin: SigningEntity.Origin,
3480+
observabilityScope: ObservabilityScope,
3481+
callbackQueue: DispatchQueue,
3482+
completion: @escaping (Result<Void, Error>) -> Void
3483+
) {
3484+
self.registryClient.changeSigningEntityFromVersion(
3485+
package: package,
3486+
version: version,
3487+
signingEntity: signingEntity,
3488+
origin: origin,
3489+
observabilityScope: observabilityScope,
3490+
callbackQueue: callbackQueue,
3491+
completion: completion
3492+
)
3493+
}
34743494
}
34753495

34763496
// MARK: - Utility extensions

0 commit comments

Comments
 (0)