@@ -1130,58 +1130,14 @@ extension Workspace {
1130
1130
observabilityScope: observabilityScope
1131
1131
)
1132
1132
1133
- try expectedSigningEntities. forEach { identity, expectedSigningEntity in
1134
- if let package = packageGraph. packages. first ( where: { $0. identity == identity } ) {
1135
- if let actualSigningEntity = package . registryMetadata? . signature? . signedBy {
1136
- if actualSigningEntity != expectedSigningEntity {
1137
- throw SigningError . mismatchedSigningEntity (
1138
- package : identity,
1139
- expected: expectedSigningEntity,
1140
- actual: actualSigningEntity
1141
- )
1142
- }
1143
- } else {
1144
- throw SigningError . unsigned ( package : identity, expected: expectedSigningEntity)
1145
- }
1146
- } else {
1147
- if let mirror = self . mirrors. mirror ( for: identity. description) {
1148
- let mirroredIdentity = PackageIdentity . plain ( mirror)
1149
- if mirroredIdentity. isRegistry {
1150
- if let package = packageGraph. packages. first ( where: { $0. identity == mirroredIdentity } ) {
1151
- if let actualSigningEntity = package . registryMetadata? . signature? . signedBy {
1152
- if actualSigningEntity != expectedSigningEntity {
1153
- throw SigningError . mismatchedSigningEntity (
1154
- package : identity,
1155
- expected: expectedSigningEntity,
1156
- actual: actualSigningEntity
1157
- )
1158
- }
1159
- } else {
1160
- throw SigningError . unsigned ( package : identity, expected: expectedSigningEntity)
1161
- }
1162
- } else {
1163
- // Unsure if this case is reachable in practice.
1164
- throw SigningError . expectedIdentityNotFound ( package : identity)
1165
- }
1166
- } else {
1167
- throw SigningError . expectedSignedMirroredToSourceControl ( package : identity, expected: expectedSigningEntity)
1168
- }
1169
- } else {
1170
- throw SigningError . expectedIdentityNotFound ( package : identity)
1171
- }
1172
- }
1173
- }
1133
+ try self . validateSignatures (
1134
+ packageGraph: packageGraph,
1135
+ expectedSigningEntities: expectedSigningEntities
1136
+ )
1174
1137
1175
1138
return packageGraph
1176
1139
}
1177
1140
1178
- public enum SigningError : Swift . Error {
1179
- case expectedIdentityNotFound( package : PackageIdentity )
1180
- case expectedSignedMirroredToSourceControl( package : PackageIdentity , expected: RegistryReleaseMetadata . SigningEntity )
1181
- case mismatchedSigningEntity( package : PackageIdentity , expected: RegistryReleaseMetadata . SigningEntity , actual: RegistryReleaseMetadata . SigningEntity )
1182
- case unsigned( package : PackageIdentity , expected: RegistryReleaseMetadata . SigningEntity )
1183
- }
1184
-
1185
1141
@discardableResult
1186
1142
public func loadPackageGraph(
1187
1143
rootPath: AbsolutePath ,
@@ -3552,6 +3508,59 @@ extension Workspace {
3552
3508
}
3553
3509
}
3554
3510
3511
+ // MARK: - Signatures
3512
+
3513
+ extension Workspace {
3514
+ private func validateSignatures(
3515
+ packageGraph: PackageGraph ,
3516
+ expectedSigningEntities: [ PackageIdentity : RegistryReleaseMetadata . SigningEntity ]
3517
+ ) throws {
3518
+ try expectedSigningEntities. forEach { identity, expectedSigningEntity in
3519
+ if let package = packageGraph. packages. first ( where: { $0. identity == identity } ) {
3520
+ guard let actualSigningEntity = package . registryMetadata? . signature? . signedBy else {
3521
+ throw SigningError . unsigned ( package : identity, expected: expectedSigningEntity)
3522
+ }
3523
+ if actualSigningEntity != expectedSigningEntity {
3524
+ throw SigningError . mismatchedSigningEntity (
3525
+ package : identity,
3526
+ expected: expectedSigningEntity,
3527
+ actual: actualSigningEntity
3528
+ )
3529
+ }
3530
+ } else {
3531
+ guard let mirror = self . mirrors. mirror ( for: identity. description) else {
3532
+ throw SigningError . expectedIdentityNotFound ( package : identity)
3533
+ }
3534
+ let mirroredIdentity = PackageIdentity . plain ( mirror)
3535
+ guard mirroredIdentity. isRegistry else {
3536
+ throw SigningError . expectedSignedMirroredToSourceControl ( package : identity, expected: expectedSigningEntity)
3537
+ }
3538
+ guard let package = packageGraph. packages. first ( where: { $0. identity == mirroredIdentity } ) else {
3539
+ // Unsure if this case is reachable in practice.
3540
+ throw SigningError . expectedIdentityNotFound ( package : identity)
3541
+ }
3542
+ guard let actualSigningEntity = package . registryMetadata? . signature? . signedBy else {
3543
+ throw SigningError . unsigned ( package : identity, expected: expectedSigningEntity)
3544
+ }
3545
+ if actualSigningEntity != expectedSigningEntity {
3546
+ throw SigningError . mismatchedSigningEntity (
3547
+ package : identity,
3548
+ expected: expectedSigningEntity,
3549
+ actual: actualSigningEntity
3550
+ )
3551
+ }
3552
+ }
3553
+ }
3554
+ }
3555
+
3556
+ public enum SigningError : Swift . Error {
3557
+ case expectedIdentityNotFound( package : PackageIdentity )
3558
+ case expectedSignedMirroredToSourceControl( package : PackageIdentity , expected: RegistryReleaseMetadata . SigningEntity )
3559
+ case mismatchedSigningEntity( package : PackageIdentity , expected: RegistryReleaseMetadata . SigningEntity , actual: RegistryReleaseMetadata . SigningEntity )
3560
+ case unsigned( package : PackageIdentity , expected: RegistryReleaseMetadata . SigningEntity )
3561
+ }
3562
+ }
3563
+
3555
3564
// MARK: - Utility extensions
3556
3565
3557
3566
fileprivate extension Workspace . ManagedArtifact {
0 commit comments