Check provider requirements before connecting (#896)

E.g. interactive login must be presented afterwards.
This commit is contained in:
Davide 2024-11-19 20:51:55 +01:00 committed by GitHub
parent d8545a01b4
commit 74ed93a966
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 38 additions and 26 deletions

View File

@ -41,7 +41,7 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "git@github.com:passepartoutvpn/passepartoutkit-source", "location" : "git@github.com:passepartoutvpn/passepartoutkit-source",
"state" : { "state" : {
"revision" : "db02de5247d0231ff06fb3c4d166645a434255be" "revision" : "d11036e59b65601b617120471dc9a469567388f5"
} }
}, },
{ {

View File

@ -44,7 +44,7 @@ let package = Package(
], ],
dependencies: [ dependencies: [
// .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source", from: "0.11.0"), // .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source", from: "0.11.0"),
.package(url: "git@github.com:passepartoutvpn/passepartoutkit-source", revision: "db02de5247d0231ff06fb3c4d166645a434255be"), .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source", revision: "d11036e59b65601b617120471dc9a469567388f5"),
// .package(path: "../../../passepartoutkit-source"), // .package(path: "../../../passepartoutkit-source"),
.package(url: "git@github.com:passepartoutvpn/passepartoutkit-source-openvpn-openssl", from: "0.9.1"), .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source-openvpn-openssl", from: "0.9.1"),
// .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source-openvpn-openssl", revision: "031863a1cd683962a7dfe68e20b91fa820a1ecce"), // .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source-openvpn-openssl", revision: "031863a1cd683962a7dfe68e20b91fa820a1ecce"),

View File

@ -83,6 +83,9 @@ extension PassepartoutError: @retroactive LocalizedError {
.compactMap { $0 } .compactMap { $0 }
.joined(separator: " ") .joined(separator: " ")
case .missingProviderEntity:
return Strings.Errors.App.Passepartout.missingProviderEntity
case .noActiveModules: case .noActiveModules:
return Strings.Errors.App.Passepartout.noActiveModules return Strings.Errors.App.Passepartout.noActiveModules

View File

@ -110,16 +110,40 @@ private extension TunnelToggleButton {
nextProfileId = nil nextProfileId = nil
} }
} }
if canConnect && profile.isInteractive { if canConnect {
do {
try iapManager.verify(profile) // provider module -> check requirements
pp_log(.app, .notice, "Present interactive login") if let providerModule = profile.firstProviderModule,
interactiveManager.present(with: profile) { providerModule.isProviderRequired {
await perform(with: $0)
// missing required provider -> show error
guard let provider = providerModule.provider else {
errorHandler.handle(
PassepartoutError(.providerRequired),
title: Strings.Global.connection
)
return
}
// missing provider entity -> show selector
guard provider.entity != nil else {
onProviderEntityRequired(profile)
return
}
}
// interactive login -> show interactive view
if profile.isInteractive {
do {
try iapManager.verify(profile)
pp_log(.app, .notice, "Present interactive login")
interactiveManager.present(with: profile) {
await perform(with: $0)
}
return
} catch {
pp_log(.app, .error, "Verification failed for profile \(profile.id), suppress interactive login: \(error)")
} }
return
} catch {
pp_log(.app, .notice, "Ineligible, suppress interactive login")
} }
} }
await perform(with: profile) await perform(with: profile)
@ -142,21 +166,6 @@ private extension TunnelToggleButton {
} catch is CancellationError { } catch is CancellationError {
// //
} catch { } catch {
switch (error as? PassepartoutError)?.code {
case .missingProviderEntity:
onProviderEntityRequired(profile)
return
case .providerRequired:
errorHandler.handle(
error,
title: Strings.Global.connection
)
return
default:
break
}
errorHandler.handle( errorHandler.handle(
error, error,
title: Strings.Global.connection, title: Strings.Global.connection,