diff options
| author | mojganii <mojgan.jelodar@codic.se> | 2025-03-20 15:54:50 +0100 |
|---|---|---|
| committer | mojganii <mojgan.jelodar@codic.se> | 2025-04-15 15:38:45 +0200 |
| commit | f8aeeb42fa5cc7f1cc428bb4b34cb8d5de09bb51 (patch) | |
| tree | 7c6c740793dc53b39ae916d5f688a81e94218c6f /ios/MullvadREST | |
| parent | 59f4f47a1ed3e89d6273ba1cb8a9749ef45e49b9 (diff) | |
| download | mullvadvpn-f8aeeb42fa5cc7f1cc428bb4b34cb8d5de09bb51.tar.xz mullvadvpn-f8aeeb42fa5cc7f1cc428bb4b34cb8d5de09bb51.zip | |
Call sendProblemReport from Rust in Swift
Diffstat (limited to 'ios/MullvadREST')
5 files changed, 63 insertions, 1 deletions
diff --git a/ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift b/ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift index d45745446e..39585a88b7 100644 --- a/ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift +++ b/ios/MullvadREST/ApiHandlers/RESTAPIProxy.swift @@ -263,6 +263,20 @@ extension REST { let newExpiry: Date } + public struct ProblemReportRequest: Codable, Sendable { + public let address: String + public let message: String + public let log: String + public let metadata: [String: String] + + public init(address: String, message: String, log: String, metadata: [String: String]) { + self.address = address + self.message = message + self.log = log + self.metadata = metadata + } + } + private struct SubmitVoucherRequest: Encodable, Sendable { let voucherCode: String } diff --git a/ios/MullvadREST/Extensions/String+UnsafePointer.swift b/ios/MullvadREST/Extensions/String+UnsafePointer.swift new file mode 100644 index 0000000000..4d60a1c77e --- /dev/null +++ b/ios/MullvadREST/Extensions/String+UnsafePointer.swift @@ -0,0 +1,16 @@ +// +// String+UnsafePointer.swift +// MullvadVPN +// +// Created by Mojgan on 2025-03-19. +// Copyright © 2025 Mullvad VPN AB. All rights reserved. +// +import Foundation +extension String { + func toUnsafePointer() -> UnsafePointer<UInt8>? { + guard let data = self.data(using: .utf8) else { return nil } + let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: data.count) + data.copyBytes(to: buffer, count: data.count) + return UnsafePointer(buffer) + } +} diff --git a/ios/MullvadREST/MullvadAPI/APIRequest/APIRequest.swift b/ios/MullvadREST/MullvadAPI/APIRequest/APIRequest.swift index 68e7e41663..7810230464 100644 --- a/ios/MullvadREST/MullvadAPI/APIRequest/APIRequest.swift +++ b/ios/MullvadREST/MullvadAPI/APIRequest/APIRequest.swift @@ -9,6 +9,8 @@ public enum APIRequest: Codable, Sendable { case getAddressList(_ retryStrategy: REST.RetryStrategy) case getRelayList(_ retryStrategy: REST.RetryStrategy, etag: String?) + case sendProblemReport(_ retryStrategy: REST.RetryStrategy, problemReportRequest: REST.ProblemReportRequest) + case createAccount(_ retryStrategy: REST.RetryStrategy) case getAccount(_ retryStrategy: REST.RetryStrategy, accountNumber: String) case deleteAccount(_ retryStrategy: REST.RetryStrategy, accountNumber: String) @@ -19,6 +21,8 @@ public enum APIRequest: Codable, Sendable { "get-address-list" case .getRelayList: "get-relay-list" + case .sendProblemReport: + "send-problem-report" case .createAccount: "create-account" case .getAccount: @@ -33,6 +37,7 @@ public enum APIRequest: Codable, Sendable { case let .getAddressList(strategy), let .getRelayList(strategy, _), + let .sendProblemReport(strategy, _), let .createAccount(strategy), let .getAccount(strategy, _), let .deleteAccount(strategy, _): diff --git a/ios/MullvadREST/MullvadAPI/MullvadApiRequestFactory.swift b/ios/MullvadREST/MullvadAPI/MullvadApiRequestFactory.swift index 298d3ac31f..970f70ef76 100644 --- a/ios/MullvadREST/MullvadAPI/MullvadApiRequestFactory.swift +++ b/ios/MullvadREST/MullvadAPI/MullvadApiRequestFactory.swift @@ -39,6 +39,13 @@ public struct MullvadApiRequestFactory: Sendable { retryStrategy.toRustStrategy(), etag )) + case let .sendProblemReport(retryStrategy, problemReportRequest): + MullvadApiCancellable(handle: mullvad_api_send_problem_report( + apiContext.context, + rawCompletionPointer, + retryStrategy.toRustStrategy(), + problemReportRequest.toRust() + )) case let .getAccount(retryStrategy, accountNumber: accountNumber): MullvadApiCancellable(handle: mullvad_api_get_account( apiContext.context, @@ -67,3 +74,24 @@ public struct MullvadApiRequestFactory: Sendable { extension REST { public typealias MullvadApiRequestHandler = (((MullvadApiResponse) throws -> Void)?) -> MullvadApiCancellable } + +private extension REST.ProblemReportRequest { + func toRust() -> UnsafePointer<SwiftProblemReportRequest> { + let structPointer = UnsafeMutablePointer<SwiftProblemReportRequest>.allocate(capacity: 1) + + let addressPointer = address.toUnsafePointer() + let messagePointer = message.toUnsafePointer() + let logPointer = log.toUnsafePointer() + + structPointer.initialize(to: SwiftProblemReportRequest( + address: addressPointer, + address_len: UInt(address.utf8.count), + message: messagePointer, + message_len: UInt(message.utf8.count), + log: logPointer, + log_len: UInt(log.utf8.count) + )) + + return UnsafePointer(structPointer) + } +} diff --git a/ios/MullvadREST/Transport/APITransport.swift b/ios/MullvadREST/Transport/APITransport.swift index 9af1f2779f..d0bf7db48d 100644 --- a/ios/MullvadREST/Transport/APITransport.swift +++ b/ios/MullvadREST/Transport/APITransport.swift @@ -34,7 +34,6 @@ public final class APITransport: APITransportProtocol { let apiRequest = requestFactory.makeRequest(request) return apiRequest { response in - let error: APIError? = if !response.success { APIError( statusCode: Int(response.statusCode), |
