summaryrefslogtreecommitdiffhomepage
path: root/mullvad-api
diff options
context:
space:
mode:
authorBug Magnet <marco.nikic@mullvad.net>2025-05-08 09:32:52 +0200
committerBug Magnet <marco.nikic@mullvad.net>2025-05-08 09:32:52 +0200
commitcaf05bc110aeb3f6c0b4db9723629818e7e81d99 (patch)
tree4a15da846efe1f5fe9bf486d2c35727b1e2d1b31 /mullvad-api
parenta74a0c0aa3270bb2cf7861f94ad7dc590ed50d22 (diff)
parent01660f7d4af6fc539ce938f44f26bdf55337b57a (diff)
downloadmullvadvpn-caf05bc110aeb3f6c0b4db9723629818e7e81d99.tar.xz
mullvadvpn-caf05bc110aeb3f6c0b4db9723629818e7e81d99.zip
Merge branch 'implement-storekit2-api-calls-using-mullvad-api-ios-1158'
Diffstat (limited to 'mullvad-api')
-rw-r--r--mullvad-api/src/lib.rs33
-rw-r--r--mullvad-api/src/rest.rs23
2 files changed, 51 insertions, 5 deletions
diff --git a/mullvad-api/src/lib.rs b/mullvad-api/src/lib.rs
index fb44b5ba89..d203d4dd04 100644
--- a/mullvad-api/src/lib.rs
+++ b/mullvad-api/src/lib.rs
@@ -65,6 +65,10 @@ pub const API_IP_CACHE_FILENAME: &str = "api-ip-address.txt";
const ACCOUNTS_URL_PREFIX: &str = "accounts/v1";
const APP_URL_PREFIX: &str = "app/v1";
+
+#[cfg(target_os = "ios")]
+const APPLE_PAYMENT_URL_PREFIX: &str = "payments/apple/v2";
+
#[cfg(target_os = "android")]
const GOOGLE_PAYMENTS_URL_PREFIX: &str = "payments/google-play/v1";
@@ -599,6 +603,35 @@ impl AccountsProxy {
}
}
+ #[cfg(target_os = "ios")]
+ pub async fn init_storekit_payment(
+ &self,
+ account: AccountNumber,
+ ) -> Result<rest::Response<Incoming>, rest::Error> {
+ let request = self
+ .handle
+ .factory
+ .post(&format!("{APPLE_PAYMENT_URL_PREFIX}/init"))?
+ .expected_status(&[StatusCode::OK])
+ .account(account)?;
+ self.handle.service.request(request).await
+ }
+
+ #[cfg(target_os = "ios")]
+ pub async fn check_storekit_payment(
+ &self,
+ account: AccountNumber,
+ body: Vec<u8>,
+ ) -> Result<rest::Response<Incoming>, rest::Error> {
+ let request = self
+ .handle
+ .factory
+ .post_json_bytes(&format!("{APPLE_PAYMENT_URL_PREFIX}/check"), body)?
+ .expected_status(&[StatusCode::OK])
+ .account(account)?;
+ self.handle.service.request(request).await
+ }
+
#[cfg(target_os = "android")]
pub fn init_play_purchase(
&mut self,
diff --git a/mullvad-api/src/rest.rs b/mullvad-api/src/rest.rs
index 94c43392ad..14e37ec29e 100644
--- a/mullvad-api/src/rest.rs
+++ b/mullvad-api/src/rest.rs
@@ -606,6 +606,10 @@ impl RequestFactory {
self.json_request(Method::POST, path, body)
}
+ pub fn post_json_bytes(&self, path: &str, body: Vec<u8>) -> Result<Request<Full<Bytes>>> {
+ self.json_request_with_bytes(Method::POST, path, body)
+ }
+
pub fn put_json<S: serde::Serialize>(
&self,
path: &str,
@@ -618,17 +622,16 @@ impl RequestFactory {
self.default_timeout = timeout;
self
}
- fn json_request<S: serde::Serialize>(
+ fn json_request_with_bytes(
&self,
method: Method,
path: &str,
- body: &S,
+ body: Vec<u8>,
) -> Result<Request<Full<Bytes>>> {
let mut request = self.hyper_request(path, method)?;
- let json_body = serde_json::to_vec(&body)?;
- let body_length = json_body.len();
- *request.body_mut() = Full::new(Bytes::from(json_body));
+ let body_length = body.len();
+ *request.body_mut() = Full::new(Bytes::from(body));
let headers = request.headers_mut();
headers.insert(header::CONTENT_LENGTH, HeaderValue::from(body_length));
@@ -640,6 +643,16 @@ impl RequestFactory {
Ok(Request::new(request, self.token_store.clone()).timeout(self.default_timeout))
}
+ fn json_request<S: serde::Serialize>(
+ &self,
+ method: Method,
+ path: &str,
+ body: &S,
+ ) -> Result<Request<Full<Bytes>>> {
+ let json_body = serde_json::to_vec(&body)?;
+ self.json_request_with_bytes(method, path, json_body)
+ }
+
fn hyper_request<B: Default>(&self, path: &str, method: Method) -> Result<http::Request<B>> {
let uri = self.get_uri(path)?;
let request = http::request::Builder::new()