taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

commit 7bdb1cf0e455e9071816e82061b62654d477272b
parent bd4aba81a7f8d254aca342101a6b12fc803758a7
Author: Marc Stibane <marc@taler.net>
Date:   Mon, 14 Sep 2026 14:29:10 +0200

httpsScheme

Diffstat:
MTalerWallet1/Controllers/Controller.swift | 57+++++++++++++++++++++++++++++++++++++++++++++------------
MTalerWallet1/Views/Sheets/URLSheet.swift | 8+++-----
2 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/TalerWallet1/Controllers/Controller.swift b/TalerWallet1/Controllers/Controller.swift @@ -640,8 +640,8 @@ class Controller: ObservableObject { // MARK: - extension Controller { - func urlCommand(_ url: URL, stack: CallStack) -> UrlCommand { - guard let scheme = url.scheme else {return UrlCommand.unknown} + func urlCommand(_ url: URL, stack: CallStack) -> (UrlCommand, URL) { + guard let scheme = url.scheme else {return (UrlCommand.unknown, url) } #if DEBUG symLog.log(url) #else @@ -649,21 +649,49 @@ extension Controller { self.logger.trace("urlCommand(\(scheme)\(host)") #endif var urlCommand = UrlCommand.unknown + var talerURI: URL = url switch scheme.lowercased() { - case "taler": - urlCommand = talerScheme(url) + case "https": + (urlCommand, talerURI) = httpsScheme(url) // case "payto": // messageForSheet = url.absoluteString // return paytoScheme(url) + case "taler": + urlCommand = talerScheme(url) default: self.logger.error("unknown scheme: <\(scheme)>") // should never happen } - saveURL(url, urlCommand: urlCommand) - return urlCommand + saveURL(talerURI, urlCommand: urlCommand) + return (urlCommand, talerURI) } } // MARK: - extension Controller { + func httpsScheme(_ url: URL) -> (UrlCommand, URL) { + // https://wallet.taler.net/#taler://${action}/${rest} + // https://wallet.taler.net/#/${action}/${rest} + // https://wallet.taler.net/#${action}/${rest} + // are all mapped to taler://${action}/${rest} + if let host = url.host, host == "wallet.taler.net" { + if url.path == "/link" { + if let fragment = url.fragment { + var split = fragment.split(separator: "/") + if split.first == "taler:" { + split.removeFirst() + } + if let action = split.first { + let joined = split.joined(separator: "/") + if let talerURI = URL(string: "taler://\(joined)") { + return (command(String(action)), talerURI) + } + } + } + } + } + self.logger.error("❗️unknown url:\(url.absoluteString)") + return (.unknown, url) + } + // func paytoScheme(_ url:URL) -> UrlCommand { // let logItem = "scheme payto:// is not yet implemented" // // TODO: write logItem to somewhere in Debug section of SettingsView @@ -671,8 +699,7 @@ extension Controller { // return UrlCommand.unknown // } - func talerScheme(_ url:URL) -> UrlCommand { - if let command = url.host { + func command(_ command:String) -> UrlCommand { switch command.lowercased() { case "withdraw": return .withdraw case "withdraw-exchange": return .withdrawExchange @@ -689,9 +716,15 @@ extension Controller { self.logger.error("❗️unknown command taler://\(command)") } messageForSheet = command.lowercased() - } else { - self.logger.error("❗️No taler command") - } - return .unknown + return .unknown + } + + func talerScheme(_ url:URL) -> UrlCommand { + if let command = url.host { + return self.command(command) + } else { + self.logger.error("❗️No taler command") + } + return .unknown } } diff --git a/TalerWallet1/Views/Sheets/URLSheet.swift b/TalerWallet1/Views/Sheets/URLSheet.swift @@ -38,13 +38,11 @@ struct URLSheet: View { // don't need @MainActor here private func passUrlOnce() { if let url = urlToOpen { - passedURL = url - symLog.log("❗️ passed urlToOpen: \(String(describing: urlToOpen?.absoluteString))") - urlCommand = controller.urlCommand(urlToOpen!, stack: stack.push()) + symLog.log("❗️ passed urlToOpen: \(url.absoluteString)") + (urlCommand, passedURL) = controller.urlCommand(url, stack: stack.push()) urlToOpen = nil // make sure we don't get this a second time } else if let sheetURL { - passedURL = sheetURL - urlCommand = controller.urlCommand(sheetURL, stack: stack.push()) + (urlCommand, passedURL) = controller.urlCommand(sheetURL, stack: stack.push()) } }