From e7819b596bb4cc6257a3d38ce507bbd4284678bb Mon Sep 17 00:00:00 2001 From: Jason Edwards Date: Thu, 19 Sep 2024 14:36:35 -0600 Subject: [PATCH] Support NTLM for authentication --- .../webview_flutter_wkwebview/CHANGELOG.md | 4 ++ .../lib/src/foundation/foundation.dart | 3 ++ .../lib/src/webkit_webview_controller.dart | 4 +- .../webview_flutter_wkwebview/pubspec.yaml | 2 +- .../test/webkit_navigation_delegate_test.dart | 38 +++++++++++++++++++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index a552402d0592..e9f216368302 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.16.0 + +* Support NTLM for authentication + ## 3.15.0 * Adds macOS support. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart index 1dabbd0c24a5..2df5c9efc6cd 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart @@ -505,6 +505,9 @@ class NSUrlAuthenticationMethod { /// Use HTTP digest authentication for this protection space. static const String httpDigest = 'NSURLAuthenticationMethodHTTPDigest'; + + /// Use NTLM authentication for this protection space. + static const String httpNtlm = 'NSURLAuthenticationMethodNTLM'; } /// A challenge from a server requiring authentication from the client. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart index e80dc7273476..a1f149ecdd10 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webkit_webview_controller.dart @@ -1147,7 +1147,9 @@ class WebKitNavigationDelegate extends PlatformNavigationDelegate { ) completionHandler, ) { if (challenge.protectionSpace.authenticationMethod == - NSUrlAuthenticationMethod.httpBasic) { + NSUrlAuthenticationMethod.httpBasic || + challenge.protectionSpace.authenticationMethod == + NSUrlAuthenticationMethod.httpNtlm) { final void Function(HttpAuthRequest)? callback = weakThis.target?._onHttpAuthRequest; final String? host = challenge.protectionSpace.host; diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 38d6fafbf54f..5b89dd4fb140 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter_wkwebview issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 3.15.0 +version: 3.16.0 environment: sdk: ^3.5.0 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart index 14561f15ff6c..8a1ba88ee26d 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/test/webkit_navigation_delegate_test.dart @@ -309,6 +309,44 @@ void main() { expect(callbackHost, expectedHost); expect(callbackRealm, expectedRealm); }); + + test('onHttpNtlmAuthRequest emits host and realm', () { + final WebKitNavigationDelegate iosNavigationDelegate = + WebKitNavigationDelegate( + const WebKitNavigationDelegateCreationParams( + webKitProxy: WebKitProxy( + createNavigationDelegate: CapturingNavigationDelegate.new, + ), + ), + ); + + String? callbackHost; + String? callbackRealm; + + iosNavigationDelegate.setOnHttpAuthRequest((HttpAuthRequest request) { + callbackHost = request.host; + callbackRealm = request.realm; + }); + + const String expectedHost = 'expectedHost'; + const String expectedRealm = 'expectedRealm'; + + CapturingNavigationDelegate + .lastCreatedDelegate.didReceiveAuthenticationChallenge!( + WKWebViewIOS.detached(), + NSUrlAuthenticationChallenge.detached( + protectionSpace: NSUrlProtectionSpace.detached( + host: expectedHost, + realm: expectedRealm, + authenticationMethod: NSUrlAuthenticationMethod.httpNtlm, + ), + ), + (NSUrlSessionAuthChallengeDisposition disposition, + NSUrlCredential? credential) {}); + + expect(callbackHost, expectedHost); + expect(callbackRealm, expectedRealm); + }); }); }