Fix error alert when importing files from external apps (#1078)

URL.startAccessingSecurityScopedResource() fails in that case, but
permission is not required at all.

Could reproduce by importing .ovpn file from a Telegram chat.
This commit is contained in:
Davide 2025-01-19 11:59:20 +01:00 committed by GitHub
parent 54c66f48b5
commit 524243ebaa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 21 additions and 6 deletions

View File

@ -115,12 +115,12 @@ private extension ProfileImporter {
profileManager: ProfileManager, profileManager: ProfileManager,
importer: ModuleImporter importer: ModuleImporter
) async throws { ) async throws {
guard url.startAccessingSecurityScopedResource() else { let didStartAccess = url.startAccessingSecurityScopedResource()
throw AppError.permissionDenied
}
defer { defer {
if didStartAccess {
url.stopAccessingSecurityScopedResource() url.stopAccessingSecurityScopedResource()
} }
}
let module = try importer.module(fromURL: url, object: passphrase) let module = try importer.module(fromURL: url, object: passphrase)
let onDemandModule = OnDemandModule.Builder().tryBuild() let onDemandModule = OnDemandModule.Builder().tryBuild()

View File

@ -51,7 +51,7 @@ extension AppError: LocalizedError {
return V.malformedModule(module.moduleType.localizedDescription, error.localizedDescription) return V.malformedModule(module.moduleType.localizedDescription, error.localizedDescription)
case .permissionDenied: case .permissionDenied:
return V.default return V.permissionDenied
case .generic(let error): case .generic(let error):
return error.localizedDescription return error.localizedDescription

View File

@ -112,6 +112,8 @@ public enum Strings {
public static func malformedModule(_ p1: Any, _ p2: Any) -> String { public static func malformedModule(_ p1: Any, _ p2: Any) -> String {
return Strings.tr("Localizable", "errors.app.malformed_module", String(describing: p1), String(describing: p2), fallback: "Module %@ is malformed. %@") return Strings.tr("Localizable", "errors.app.malformed_module", String(describing: p1), String(describing: p2), fallback: "Module %@ is malformed. %@")
} }
/// Permission denied
public static let permissionDenied = Strings.tr("Localizable", "errors.app.permission_denied", fallback: "Permission denied")
/// Unable to execute operation. /// Unable to execute operation.
public static let tunnel = Strings.tr("Localizable", "errors.app.tunnel", fallback: "Unable to execute operation.") public static let tunnel = Strings.tr("Localizable", "errors.app.tunnel", fallback: "Unable to execute operation.")
public enum Passepartout { public enum Passepartout {

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "Das Profil hat keine aktiven Module."; "errors.app.passepartout.no_active_modules" = "Das Profil hat keine aktiven Module.";
"errors.app.passepartout.parsing" = "Datei konnte nicht analysiert werden."; "errors.app.passepartout.parsing" = "Datei konnte nicht analysiert werden.";
"errors.app.passepartout.provider_required" = "Kein Anbieter ausgewählt."; "errors.app.passepartout.provider_required" = "Kein Anbieter ausgewählt.";
"errors.app.permission_denied" = "Zugriff verweigert";
"errors.app.tunnel" = "Aktion konnte nicht ausgeführt werden."; "errors.app.tunnel" = "Aktion konnte nicht ausgeführt werden.";
"errors.tunnel.auth" = "Authentifizierung fehlgeschlagen"; "errors.tunnel.auth" = "Authentifizierung fehlgeschlagen";
"errors.tunnel.compression" = "Kompression wird nicht unterstützt"; "errors.tunnel.compression" = "Kompression wird nicht unterstützt";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "Το προφίλ δεν έχει ενεργές μονάδες."; "errors.app.passepartout.no_active_modules" = "Το προφίλ δεν έχει ενεργές μονάδες.";
"errors.app.passepartout.parsing" = "Δεν ήταν δυνατή η ανάλυση αρχείου."; "errors.app.passepartout.parsing" = "Δεν ήταν δυνατή η ανάλυση αρχείου.";
"errors.app.passepartout.provider_required" = "Δεν έχει επιλεγεί πάροχος."; "errors.app.passepartout.provider_required" = "Δεν έχει επιλεγεί πάροχος.";
"errors.app.permission_denied" = "Άρνηση άδειας";
"errors.app.tunnel" = "Δεν ήταν δυνατή η εκτέλεση της ενέργειας."; "errors.app.tunnel" = "Δεν ήταν δυνατή η εκτέλεση της ενέργειας.";
"errors.tunnel.auth" = "Η επαλήθευση απέτυχε"; "errors.tunnel.auth" = "Η επαλήθευση απέτυχε";
"errors.tunnel.compression" = "Η συμπίεση δεν υποστηρίζεται"; "errors.tunnel.compression" = "Η συμπίεση δεν υποστηρίζεται";

View File

@ -339,6 +339,7 @@
"errors.app.empty_profile_name" = "Profile name is empty."; "errors.app.empty_profile_name" = "Profile name is empty.";
"errors.app.import" = "Unable to import profiles."; "errors.app.import" = "Unable to import profiles.";
"errors.app.malformed_module" = "Module %@ is malformed. %@"; "errors.app.malformed_module" = "Module %@ is malformed. %@";
"errors.app.permission_denied" = "Permission denied";
"errors.app.tunnel" = "Unable to execute operation."; "errors.app.tunnel" = "Unable to execute operation.";
// MARK: Global (PassepartoutKit errors) // MARK: Global (PassepartoutKit errors)

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "El perfil no tiene módulos activos."; "errors.app.passepartout.no_active_modules" = "El perfil no tiene módulos activos.";
"errors.app.passepartout.parsing" = "No se pudo analizar el archivo."; "errors.app.passepartout.parsing" = "No se pudo analizar el archivo.";
"errors.app.passepartout.provider_required" = "No se ha seleccionado proveedor."; "errors.app.passepartout.provider_required" = "No se ha seleccionado proveedor.";
"errors.app.permission_denied" = "Permiso denegado";
"errors.app.tunnel" = "No se pudo ejecutar la operación."; "errors.app.tunnel" = "No se pudo ejecutar la operación.";
"errors.tunnel.auth" = "Autenticación fallida"; "errors.tunnel.auth" = "Autenticación fallida";
"errors.tunnel.compression" = "Compresión no soportada"; "errors.tunnel.compression" = "Compresión no soportada";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "Le profil n'a pas de modules actifs."; "errors.app.passepartout.no_active_modules" = "Le profil n'a pas de modules actifs.";
"errors.app.passepartout.parsing" = "Impossible d'analyser le fichier."; "errors.app.passepartout.parsing" = "Impossible d'analyser le fichier.";
"errors.app.passepartout.provider_required" = "Aucun fournisseur sélectionné."; "errors.app.passepartout.provider_required" = "Aucun fournisseur sélectionné.";
"errors.app.permission_denied" = "Permission refusée";
"errors.app.tunnel" = "Impossible d'exécuter l'opération."; "errors.app.tunnel" = "Impossible d'exécuter l'opération.";
"errors.tunnel.auth" = "Échec de l'authentification"; "errors.tunnel.auth" = "Échec de l'authentification";
"errors.tunnel.compression" = "Compression non supportée"; "errors.tunnel.compression" = "Compression non supportée";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "Il profilo non ha moduli attivi."; "errors.app.passepartout.no_active_modules" = "Il profilo non ha moduli attivi.";
"errors.app.passepartout.parsing" = "Impossibile analizzare il file."; "errors.app.passepartout.parsing" = "Impossibile analizzare il file.";
"errors.app.passepartout.provider_required" = "Nessun provider selezionato."; "errors.app.passepartout.provider_required" = "Nessun provider selezionato.";
"errors.app.permission_denied" = "Permesso negato";
"errors.app.tunnel" = "Impossibile eseguire l'operazione."; "errors.app.tunnel" = "Impossibile eseguire l'operazione.";
"errors.tunnel.auth" = "Autenticazione fallita"; "errors.tunnel.auth" = "Autenticazione fallita";
"errors.tunnel.compression" = "Compressione non supportata"; "errors.tunnel.compression" = "Compressione non supportata";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "Het profiel heeft geen actieve modules."; "errors.app.passepartout.no_active_modules" = "Het profiel heeft geen actieve modules.";
"errors.app.passepartout.parsing" = "Kan bestand niet parseren."; "errors.app.passepartout.parsing" = "Kan bestand niet parseren.";
"errors.app.passepartout.provider_required" = "Geen provider geselecteerd."; "errors.app.passepartout.provider_required" = "Geen provider geselecteerd.";
"errors.app.permission_denied" = "Toegang geweigerd";
"errors.app.tunnel" = "Actie kan niet worden uitgevoerd."; "errors.app.tunnel" = "Actie kan niet worden uitgevoerd.";
"errors.tunnel.auth" = "Verificatie mislukt"; "errors.tunnel.auth" = "Verificatie mislukt";
"errors.tunnel.compression" = "Compressie niet ondersteund"; "errors.tunnel.compression" = "Compressie niet ondersteund";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "Profil nie ma aktywnych modułów."; "errors.app.passepartout.no_active_modules" = "Profil nie ma aktywnych modułów.";
"errors.app.passepartout.parsing" = "Nie można przeanalizować pliku."; "errors.app.passepartout.parsing" = "Nie można przeanalizować pliku.";
"errors.app.passepartout.provider_required" = "Nie wybrano dostawcy."; "errors.app.passepartout.provider_required" = "Nie wybrano dostawcy.";
"errors.app.permission_denied" = "Brak uprawnień";
"errors.app.tunnel" = "Nie można wykonać operacji."; "errors.app.tunnel" = "Nie można wykonać operacji.";
"errors.tunnel.auth" = "Błąd uwierzytelniania"; "errors.tunnel.auth" = "Błąd uwierzytelniania";
"errors.tunnel.compression" = "Kompresja nieobsługiwana"; "errors.tunnel.compression" = "Kompresja nieobsługiwana";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "O perfil não possui módulos ativos."; "errors.app.passepartout.no_active_modules" = "O perfil não possui módulos ativos.";
"errors.app.passepartout.parsing" = "Não foi possível analisar o arquivo."; "errors.app.passepartout.parsing" = "Não foi possível analisar o arquivo.";
"errors.app.passepartout.provider_required" = "Nenhum provedor selecionado."; "errors.app.passepartout.provider_required" = "Nenhum provedor selecionado.";
"errors.app.permission_denied" = "Permissão negada";
"errors.app.tunnel" = "Não foi possível executar a operação."; "errors.app.tunnel" = "Não foi possível executar a operação.";
"errors.tunnel.auth" = "Falha na autenticação"; "errors.tunnel.auth" = "Falha na autenticação";
"errors.tunnel.compression" = "Compressão não suportada"; "errors.tunnel.compression" = "Compressão não suportada";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "В профиле нет активных модулей."; "errors.app.passepartout.no_active_modules" = "В профиле нет активных модулей.";
"errors.app.passepartout.parsing" = "Не удалось разобрать файл."; "errors.app.passepartout.parsing" = "Не удалось разобрать файл.";
"errors.app.passepartout.provider_required" = "Поставщик не выбран."; "errors.app.passepartout.provider_required" = "Поставщик не выбран.";
"errors.app.permission_denied" = "Доступ запрещен";
"errors.app.tunnel" = "Не удалось выполнить операцию."; "errors.app.tunnel" = "Не удалось выполнить операцию.";
"errors.tunnel.auth" = "Ошибка аутентификации"; "errors.tunnel.auth" = "Ошибка аутентификации";
"errors.tunnel.compression" = "Сжатие не поддерживается"; "errors.tunnel.compression" = "Сжатие не поддерживается";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "Profilen har inga aktiva moduler."; "errors.app.passepartout.no_active_modules" = "Profilen har inga aktiva moduler.";
"errors.app.passepartout.parsing" = "Kan inte tolka filen."; "errors.app.passepartout.parsing" = "Kan inte tolka filen.";
"errors.app.passepartout.provider_required" = "Ingen leverantör vald."; "errors.app.passepartout.provider_required" = "Ingen leverantör vald.";
"errors.app.permission_denied" = "Åtkomst nekad";
"errors.app.tunnel" = "Kunde inte utföra åtgärden."; "errors.app.tunnel" = "Kunde inte utföra åtgärden.";
"errors.tunnel.auth" = "Autentisering misslyckades"; "errors.tunnel.auth" = "Autentisering misslyckades";
"errors.tunnel.compression" = "Kompression stöds inte"; "errors.tunnel.compression" = "Kompression stöds inte";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "Профіль не має активних модулів."; "errors.app.passepartout.no_active_modules" = "Профіль не має активних модулів.";
"errors.app.passepartout.parsing" = "Не вдалося обробити файл."; "errors.app.passepartout.parsing" = "Не вдалося обробити файл.";
"errors.app.passepartout.provider_required" = "Не вибрано постачальника."; "errors.app.passepartout.provider_required" = "Не вибрано постачальника.";
"errors.app.permission_denied" = "Доступ заборонено";
"errors.app.tunnel" = "Не вдалося виконати операцію."; "errors.app.tunnel" = "Не вдалося виконати операцію.";
"errors.tunnel.auth" = "Помилка аутентифікації"; "errors.tunnel.auth" = "Помилка аутентифікації";
"errors.tunnel.compression" = "Стиснення не підтримується"; "errors.tunnel.compression" = "Стиснення не підтримується";

View File

@ -36,6 +36,7 @@
"errors.app.passepartout.no_active_modules" = "配置文件没有激活模块。"; "errors.app.passepartout.no_active_modules" = "配置文件没有激活模块。";
"errors.app.passepartout.parsing" = "无法解析文件。"; "errors.app.passepartout.parsing" = "无法解析文件。";
"errors.app.passepartout.provider_required" = "未选择提供商。"; "errors.app.passepartout.provider_required" = "未选择提供商。";
"errors.app.permission_denied" = "权限被拒绝";
"errors.app.tunnel" = "无法执行操作。"; "errors.app.tunnel" = "无法执行操作。";
"errors.tunnel.auth" = "认证失败"; "errors.tunnel.auth" = "认证失败";
"errors.tunnel.compression" = "不支持压缩"; "errors.tunnel.compression" = "不支持压缩";

View File

@ -27,7 +27,7 @@
// https://help.apple.com/xcode/#/dev745c5c974 // https://help.apple.com/xcode/#/dev745c5c974
MARKETING_VERSION = 3.0.1 MARKETING_VERSION = 3.0.1
CURRENT_PROJECT_VERSION = 3719 CURRENT_PROJECT_VERSION = 3721
// tweak these based on app and team // tweak these based on app and team
CFG_APP_ID = com.algoritmico.ios.Passepartout CFG_APP_ID = com.algoritmico.ios.Passepartout