* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox