all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH proxmox_dart_api_client v2 0/2] fix: ios: add support for custom user certificates
@ 2025-09-17 12:06 Shan Shaji
  2025-09-17 12:06 ` [pve-devel] [PATCH proxmox_dart_api_client v2 1/2] fix: ios: use `cupertino_http` package to honor " Shan Shaji
  2025-09-17 12:06 ` [pve-devel] [PATCH proxmox_dart_api_client v2 2/2] fix: ios: add explicit throw of `HandshakeException` Shan Shaji
  0 siblings, 2 replies; 3+ messages in thread
From: Shan Shaji @ 2025-09-17 12:06 UTC (permalink / raw)
  To: pve-devel

The app was not honoring the user installed certificate and was still
throwing `HandShakeException` when using `IOClient`. Inorder to fix the
issue used the `cupertino_http` package. This patch series only includes
the changes specific to iOS. Android related changes can be found here
[0].

- [0] https://lore.proxmox.com/pve-devel/DCKQF7FSYTGT.HK16P9PBZEDS@proxmox.com/T/#t

History:
==============

changes since  v1: https://lore.proxmox.com/pve-devel/DCUXS353OF44.2TCRIG1U97LAK@proxmox.com/T/#m18041c4e36f4188d46a6fa224a61e76ac394abfa
- Rebased with master

Shan Shaji (2):
  fix: ios: use `cupertino_http` package to honor custom user
    certificates
  fix: ios: add explicit throw of `HandshakeException`

 lib/src/authenticate.dart | 14 +++++++++++++-
 lib/src/utils_native.dart | 10 +++++++++-
 pubspec.lock              | 26 +++++++++++++++++++++++++-
 pubspec.yaml              |  1 +
 4 files changed, 48 insertions(+), 3 deletions(-)

-- 
2.50.1



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [pve-devel] [PATCH proxmox_dart_api_client v2 1/2] fix: ios: use `cupertino_http` package to honor custom user certificates
  2025-09-17 12:06 [pve-devel] [PATCH proxmox_dart_api_client v2 0/2] fix: ios: add support for custom user certificates Shan Shaji
@ 2025-09-17 12:06 ` Shan Shaji
  2025-09-17 12:06 ` [pve-devel] [PATCH proxmox_dart_api_client v2 2/2] fix: ios: add explicit throw of `HandshakeException` Shan Shaji
  1 sibling, 0 replies; 3+ messages in thread
From: Shan Shaji @ 2025-09-17 12:06 UTC (permalink / raw)
  To: pve-devel

In iOS when a user installs a custom certificate and manually trusts it
from the certificate trust settings of iOS. The app was not
honoring the installed certificate [0] and was still throwing
`HandShakeException`.

The issue is because the `IOClient` doesn't by default honor user
installed certificate. To fix the issue, used the `cupertino_http` [1]
package which will honor the user installed certificates.
The `cupertino_http` package internally uses the native
iOS URL loading system [2].

- [0] https://support.apple.com/en-us/102390
- [1] https://pub.dev/packages/cupertino_http
- [2] https://developer.apple.com/documentation/foundation/url-loading-system

Signed-off-by: Shan Shaji <s.shaji@proxmox.com>
---
 changes since v1:
 - Rebased with master

 lib/src/utils_native.dart | 10 +++++++++-
 pubspec.lock              | 26 +++++++++++++++++++++++++-
 pubspec.yaml              |  1 +
 3 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/lib/src/utils_native.dart b/lib/src/utils_native.dart
index a4b7397..de66b31 100644
--- a/lib/src/utils_native.dart
+++ b/lib/src/utils_native.dart
@@ -1,4 +1,5 @@
 import 'package:cronet_http/cronet_http.dart';
+import 'package:cupertino_http/cupertino_http.dart';
 import 'package:http/http.dart' as http;
 import 'package:http/io_client.dart' as http_io;
 import 'dart:io';
@@ -6,9 +7,10 @@ import 'dart:io';
 http.Client getCustomIOHttpClient({bool validateSSL = true}) {
   var ioClient = HttpClient();
 
+  const cacheMaxSizeInBytes = 1024 * 1024;
   if (Platform.isAndroid && validateSSL) {
     final engine = CronetEngine.build(
-      cacheMaxSize: 1024 * 1024,
+      cacheMaxSize: cacheMaxSizeInBytes,
       cacheMode: CacheMode.memory,
     );
     return CronetClient.fromCronetEngine(
@@ -17,6 +19,12 @@ http.Client getCustomIOHttpClient({bool validateSSL = true}) {
     );
   }
 
+  if (Platform.isIOS && validateSSL) {
+    final config = URLSessionConfiguration.ephemeralSessionConfiguration()
+      ..cache = URLCache.withCapacity(memoryCapacity: cacheMaxSizeInBytes);
+    return CupertinoClient.fromSessionConfiguration(config);
+  }
+
   if (!validateSSL) {
     ioClient.badCertificateCallback =
         ((X509Certificate cert, String host, int port) {
diff --git a/pubspec.lock b/pubspec.lock
index 6496e27..9a754ea 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -177,6 +177,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.0.3"
+  cupertino_http:
+    dependency: "direct main"
+    description:
+      name: cupertino_http
+      sha256: "72187f715837290a63479a5b0ae709f4fedad0ed6bd0441c275eceaa02d5abae"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.3.0"
   dart_style:
     dependency: transitive
     description:
@@ -358,6 +366,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.0.2"
+  objective_c:
+    dependency: transitive
+    description:
+      name: objective_c
+      sha256: "9f034ba1eeca53ddb339bc8f4813cb07336a849cd735559b60cdc068ecce2dc7"
+      url: "https://pub.dev"
+    source: hosted
+    version: "7.1.0"
   package_config:
     dependency: transitive
     description:
@@ -595,6 +611,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.5.1"
+  web_socket:
+    dependency: transitive
+    description:
+      name: web_socket
+      sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.1"
   web_socket_channel:
     dependency: transitive
     description:
@@ -621,4 +645,4 @@ packages:
     version: "3.1.2"
 sdks:
   dart: ">=3.7.0 <4.0.0"
-  flutter: ">=3.22.0"
+  flutter: ">=3.24.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 3aa881b..c864606 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -11,6 +11,7 @@ dependencies:
   built_collection: ^5.1.1
   retry: ^3.1.0
   cronet_http: ^1.5.0
+  cupertino_http: ^2.3.0
 
 dev_dependencies:
   lints: ^3.0.0
-- 
2.50.1



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [pve-devel] [PATCH proxmox_dart_api_client v2 2/2] fix: ios: add explicit throw of `HandshakeException`
  2025-09-17 12:06 [pve-devel] [PATCH proxmox_dart_api_client v2 0/2] fix: ios: add support for custom user certificates Shan Shaji
  2025-09-17 12:06 ` [pve-devel] [PATCH proxmox_dart_api_client v2 1/2] fix: ios: use `cupertino_http` package to honor " Shan Shaji
@ 2025-09-17 12:06 ` Shan Shaji
  1 sibling, 0 replies; 3+ messages in thread
From: Shan Shaji @ 2025-09-17 12:06 UTC (permalink / raw)
  To: pve-devel

The `cupertino_http` package is throwing `ClientException` [0] instead
of `HandShakeException` when the certificate is not valid.

Due to this the exception was directly shown in the UI. Inorder to make
the error more user friendly catch the `NSErrorClientException` and
rethrow `HandShakeException` if the certificate is not valid.

Signed-off-by: Shan Shaji <s.shaji@proxmox.com>
---
 changes since v1:
 - Rebased with master

 lib/src/authenticate.dart | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/lib/src/authenticate.dart b/lib/src/authenticate.dart
index a142a4c..04f363f 100644
--- a/lib/src/authenticate.dart
+++ b/lib/src/authenticate.dart
@@ -2,12 +2,12 @@ import 'dart:async';
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:cupertino_http/cupertino_http.dart';
 import 'package:http/http.dart' as http;
 import 'package:proxmox_dart_api_client/proxmox_dart_api_client.dart';
 import 'package:proxmox_dart_api_client/src/handle_ticket_response.dart';
 import 'package:proxmox_dart_api_client/src/models/serializers.dart';
 
-
 /// Returns an authenticated client to work with if successful.
 ///
 /// This is the function you are looking for if you want to interact with any
@@ -62,6 +62,12 @@ Future<ProxmoxApiClient> authenticate(
       throw HandshakeException(e.message);
     }
     rethrow;
+  } on NSErrorClientException catch (e) {
+    // Treat untrusted server certificate (-1202) as a handshake failure.
+    if (e.error.code == -1202) {
+      throw HandshakeException(e.message);
+    }
+    rethrow;
   }
 }
 
@@ -86,5 +92,11 @@ Future<List<PveAccessDomainModel?>> accessDomains(
       throw HandshakeException(e.message);
     }
     rethrow;
+  } on NSErrorClientException catch (e) {
+    // Treat untrusted server certificate (-1202) as a handshake failure.
+    if (e.error.code == -1202) {
+      throw HandshakeException(e.message);
+    }
+    rethrow;
   }
 }
-- 
2.50.1



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2025-09-17 12:06 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-09-17 12:06 [pve-devel] [PATCH proxmox_dart_api_client v2 0/2] fix: ios: add support for custom user certificates Shan Shaji
2025-09-17 12:06 ` [pve-devel] [PATCH proxmox_dart_api_client v2 1/2] fix: ios: use `cupertino_http` package to honor " Shan Shaji
2025-09-17 12:06 ` [pve-devel] [PATCH proxmox_dart_api_client v2 2/2] fix: ios: add explicit throw of `HandshakeException` Shan Shaji

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal