diff --git a/app-apple/Sources/AppLibrary/Domain/EditableProfile.swift b/app-apple/Sources/AppLibrary/Domain/EditableProfile.swift index c5e69abc5..e0e5e315a 100644 --- a/app-apple/Sources/AppLibrary/Domain/EditableProfile.swift +++ b/app-apple/Sources/AppLibrary/Domain/EditableProfile.swift @@ -56,7 +56,7 @@ public struct EditableProfile: MutableProfileType { // some modules may require an active connection module (VPN) // for example, IP and HTTP Proxy modules require a VPN in NE - if builder.activeConnectionModule == nil, + if !builder.hasConnection, let requiringConnection = builder.activeModules.first(where: \.requiresConnection) { throw ABI.AppError.moduleRequiresConnection(requiringConnection) } @@ -65,6 +65,16 @@ public struct EditableProfile: MutableProfileType { } } +private extension Profile.Builder { + var hasConnection: Bool { + if activeConnectionModule != nil { return true } + if let providerModule = firstModule(ofType: ProviderModule.self, ifActive: true) { + return providerModule.buildsConnection + } + return false + } +} + extension Profile { public func editable() -> EditableProfile { EditableProfile( diff --git a/app-apple/Sources/AppLibrary/L10n/AppError+L10n.swift b/app-apple/Sources/AppLibrary/L10n/AppError+L10n.swift index 29a0f0a15..a3f94975c 100644 --- a/app-apple/Sources/AppLibrary/L10n/AppError+L10n.swift +++ b/app-apple/Sources/AppLibrary/L10n/AppError+L10n.swift @@ -22,10 +22,9 @@ extension ABI.AppError: @retroactive LocalizedError { case .malformedModule(let module, let error): return V.malformedModule(module.moduleType.localizedDescription, error.localizedDescription) case .moduleRequiresConnection(let module): - let connectionTypes = ModuleType.allCases.filter(\.isConnection) return V.moduleRequiresConnection( module.moduleType.localizedDescription, - connectionTypes + ModuleType.connectionTypes .map(\.localizedDescription) .joined(separator: ", ") ) diff --git a/app-cross/Sources/CommonLibraryCore/Extensions/ModuleType+Known.swift b/app-cross/Sources/CommonLibraryCore/Extensions/ModuleType+Known.swift index e87a2d4b0..4fc32f498 100644 --- a/app-cross/Sources/CommonLibraryCore/Extensions/ModuleType+Known.swift +++ b/app-cross/Sources/CommonLibraryCore/Extensions/ModuleType+Known.swift @@ -17,6 +17,10 @@ extension ModuleType: @retroactive CaseIterable { list.append(.Provider) return list }() + + public static var connectionTypes: [ModuleType] { + ModuleType.allCases.filter(\.isConnection) + } } extension ModuleType { @@ -29,3 +33,9 @@ extension ModuleType { } } } + +extension ProviderModule { + public var buildsConnection: Bool { + ModuleType.connectionTypes.contains(providerModuleType) + } +}