Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
8bca259
Partially implemented ssl error decision
Colman Oct 3, 2024
32b3c83
Partially implemented ssl error decision
Colman Oct 3, 2024
f24ded9
Partially implemented ssl error decision
Colman Oct 7, 2024
c44a50d
Partially implemented ssl error decision
Colman Oct 7, 2024
b1ed63e
Partially implemented ssl error decision
Colman Oct 7, 2024
90b1457
Partially implemented ssl error decision
Colman Oct 7, 2024
de9acf9
Partially implemented ssl error decision
Colman Oct 7, 2024
fdaa89f
Partially implemented ssl error decision
Colman Oct 7, 2024
0458aba
Partially implemented ssl error decision
Colman Oct 7, 2024
e2cb3a1
Partially implemented ssl error decision
Colman Oct 7, 2024
ca81379
Partially implemented ssl error decision
Colman Oct 7, 2024
5a94528
Partially implemented ssl error decision
Colman Oct 8, 2024
ae64dae
Partially implemented ssl error decision
Colman Oct 8, 2024
a06c18c
Partially implemented ssl error decision
Colman Oct 9, 2024
7634b1f
Partially implemented ssl error decision
Colman Oct 9, 2024
c9edcdc
Partially implemented ssl error decision
Colman Oct 9, 2024
81d045a
Partially implemented ssl error decision
Colman Oct 11, 2024
a81420d
Partially implemented ssl error decision
Colman Oct 15, 2024
384e94c
Partially implemented ssl error decision
Colman Oct 15, 2024
55fb7ef
Partially implemented ssl error decision
Colman Oct 16, 2024
8cd4127
Partially implemented ssl error decision
Colman Oct 16, 2024
515580a
Partially implemented ssl error decision
Colman Oct 16, 2024
97d26ea
Partially implemented ssl error decision
Colman Oct 16, 2024
3a9f7c6
Partially implemented ssl error decision
Colman Oct 16, 2024
464dba3
Partially implemented ssl error decision
Colman Oct 16, 2024
e8a591e
Partially implemented ssl error decision
Colman Oct 16, 2024
1f396ca
Partially implemented ssl error decision
Colman Oct 16, 2024
ffe9f00
Partially implemented ssl error decision
Colman Oct 16, 2024
7a3b559
Partially implemented ssl error decision
Colman Oct 16, 2024
ffe6662
Partially implemented ssl error decision
Colman Oct 16, 2024
4988352
Partially implemented ssl error test
Colman Oct 16, 2024
9333d5d
Partially implemented ssl error test
Colman Oct 16, 2024
ac544c9
Partially implemented ssl error decision
Colman Oct 17, 2024
afe3943
Partially implemented ssl error decision
Colman Oct 17, 2024
998e334
Partially implemented ssl error decision
Colman Oct 17, 2024
941915c
Partially implemented ssl error decision
Colman Oct 17, 2024
7ef9309
Fixed versions
Colman Oct 17, 2024
b62371c
Fixed versions
Colman Oct 17, 2024
b0735a7
Added test
Colman Oct 17, 2024
7a10765
Merge branch 'main' into add-an-option-to-bypass-ssl-checks
Colman Oct 18, 2024
64266f6
Fixed change logs
Colman Oct 18, 2024
91cdee9
Added path based dependency overrides
Colman Oct 18, 2024
ae9162d
Added Dart unit tests to the Android package
Colman Oct 18, 2024
f2e0b64
Formatted files
Colman Oct 18, 2024
af4a93a
Fixed switch statements
Colman Oct 18, 2024
0fffc68
Merge branch 'main' into add-an-option-to-bypass-ssl-checks
Colman Oct 31, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Formatted files
  • Loading branch information
Colman committed Oct 18, 2024
commit f2e0b643d12428500a23ff7f4aa642fbab629e94
Original file line number Diff line number Diff line change
Expand Up @@ -16,37 +16,36 @@
* arguments of callbacks methods to a Dart instance.
*/
public class SslErrorHandlerFlutterApiImpl {
// To ease adding additional methods, this value is added prematurely.
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final BinaryMessenger binaryMessenger;
// To ease adding additional methods, this value is added prematurely.
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final BinaryMessenger binaryMessenger;

private final InstanceManager instanceManager;
private final InstanceManager instanceManager;

private final SslErrorHandlerFlutterApi api;
private final SslErrorHandlerFlutterApi api;

/**
* Constructs a {@link SslErrorHandlerFlutterApiImpl}.
*
* @param binaryMessenger used to communicate with Dart over asynchronous messages
* @param instanceManager maintains instances stored to communicate with attached Dart objects
*/
public SslErrorHandlerFlutterApiImpl(
@NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) {
this.binaryMessenger = binaryMessenger;
this.instanceManager = instanceManager;
api = new SslErrorHandlerFlutterApi(binaryMessenger);
}
/**
* Constructs a {@link SslErrorHandlerFlutterApiImpl}.
*
* @param binaryMessenger used to communicate with Dart over asynchronous messages
* @param instanceManager maintains instances stored to communicate with attached Dart objects
*/
public SslErrorHandlerFlutterApiImpl(
@NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) {
this.binaryMessenger = binaryMessenger;
this.instanceManager = instanceManager;
api = new SslErrorHandlerFlutterApi(binaryMessenger);
}

/**
* Stores the `SslErrorHandler` instance and notifies Dart to create and store a new
* `SslErrorHandler` instance that is attached to this one. If `instance` has already been added,
* this method does nothing.
*/
public void create(
@NonNull SslErrorHandler instance,
@NonNull SslErrorHandlerFlutterApi.Reply<Void> callback) {
if (!instanceManager.containsInstance(instance)) {
api.create(instanceManager.addHostCreatedInstance(instance), callback);
}
/**
* Stores the `SslErrorHandler` instance and notifies Dart to create and store a new
* `SslErrorHandler` instance that is attached to this one. If `instance` has already been added,
* this method does nothing.
*/
public void create(
@NonNull SslErrorHandler instance, @NonNull SslErrorHandlerFlutterApi.Reply<Void> callback) {
if (!instanceManager.containsInstance(instance)) {
api.create(instanceManager.addHostCreatedInstance(instance), callback);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,35 +16,35 @@
* <p>Handles creating {@link SslErrorHandler}s that intercommunicate with a paired Dart object.
*/
public class SslErrorHandlerHostApiImpl implements SslErrorHandlerHostApi {
// To ease adding additional methods, this value is added prematurely.
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final BinaryMessenger binaryMessenger;

private final InstanceManager instanceManager;

/**
* Constructs a {@link SslErrorHandlerHostApiImpl}.
*
* @param binaryMessenger used to communicate with Dart over asynchronous messages
* @param instanceManager maintains instances stored to communicate with attached Dart objects
*/
public SslErrorHandlerHostApiImpl(
@NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) {
this.binaryMessenger = binaryMessenger;
this.instanceManager = instanceManager;
}

@Override
public void cancel(@NonNull Long instanceId) {
getSslErrorHandlerInstance(instanceId).cancel();
}

@Override
public void proceed(@NonNull Long instanceId) {
getSslErrorHandlerInstance(instanceId).proceed();
}

private SslErrorHandler getSslErrorHandlerInstance(@NonNull Long instanceId) {
return Objects.requireNonNull(instanceManager.getInstance(instanceId));
}
// To ease adding additional methods, this value is added prematurely.
@SuppressWarnings({"unused", "FieldCanBeLocal"})
private final BinaryMessenger binaryMessenger;

private final InstanceManager instanceManager;

/**
* Constructs a {@link SslErrorHandlerHostApiImpl}.
*
* @param binaryMessenger used to communicate with Dart over asynchronous messages
* @param instanceManager maintains instances stored to communicate with attached Dart objects
*/
public SslErrorHandlerHostApiImpl(
@NonNull BinaryMessenger binaryMessenger, @NonNull InstanceManager instanceManager) {
this.binaryMessenger = binaryMessenger;
this.instanceManager = instanceManager;
}

@Override
public void cancel(@NonNull Long instanceId) {
getSslErrorHandlerInstance(instanceId).cancel();
}

@Override
public void proceed(@NonNull Long instanceId) {
getSslErrorHandlerInstance(instanceId).proceed();
}

private SslErrorHandler getSslErrorHandlerInstance(@NonNull Long instanceId) {
return Objects.requireNonNull(instanceManager.getInstance(instanceId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import androidx.webkit.WebResourceErrorCompat;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebViewClientFlutterApi;

import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
Expand Down Expand Up @@ -88,53 +87,53 @@ static GeneratedAndroidWebView.WebResourceResponseData createWebResourceResponse
}

static GeneratedAndroidWebView.SslErrorData createSslErrorData(SslError error) {
final SslCertificate certificate = error.getCertificate();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
String notValidNotAfterIso8601Date = sdf.format(certificate.getValidNotAfterDate());
String notValidNotBeforeIso8601Date = sdf.format(certificate.getValidNotBeforeDate());

GeneratedAndroidWebView.SslCertificateData.Builder sslCertificateData =
new GeneratedAndroidWebView.SslCertificateData.Builder()
.setIssuedBy(certificate.getIssuedBy().toString())
.setIssuedTo(certificate.getIssuedTo().toString())
.setValidNotAfterIso8601Date(notValidNotAfterIso8601Date)
.setValidNotBeforeIso8601Date(notValidNotBeforeIso8601Date);

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
X509Certificate x509Certificate = error.getCertificate().getX509Certificate();
if (x509Certificate != null) {
try {
byte[] encoded = x509Certificate.getEncoded();
sslCertificateData.setX509CertificateDer(encoded);
} catch (CertificateEncodingException e) {
//Do nothing
}
}
final SslCertificate certificate = error.getCertificate();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US);
String notValidNotAfterIso8601Date = sdf.format(certificate.getValidNotAfterDate());
String notValidNotBeforeIso8601Date = sdf.format(certificate.getValidNotBeforeDate());

GeneratedAndroidWebView.SslCertificateData.Builder sslCertificateData =
new GeneratedAndroidWebView.SslCertificateData.Builder()
.setIssuedBy(certificate.getIssuedBy().toString())
.setIssuedTo(certificate.getIssuedTo().toString())
.setValidNotAfterIso8601Date(notValidNotAfterIso8601Date)
.setValidNotBeforeIso8601Date(notValidNotBeforeIso8601Date);

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
X509Certificate x509Certificate = error.getCertificate().getX509Certificate();
if (x509Certificate != null) {
try {
byte[] encoded = x509Certificate.getEncoded();
sslCertificateData.setX509CertificateDer(encoded);
} catch (CertificateEncodingException e) {
//Do nothing
}
}
}

GeneratedAndroidWebView.SslErrorData.Builder sslErrorData =
new GeneratedAndroidWebView.SslErrorData.Builder()
.setErrorTypeData(toSslErrorTypeData(error.getPrimaryError()))
.setCertificateData(sslCertificateData.build())
.setUrl(error.getUrl());
new GeneratedAndroidWebView.SslErrorData.Builder()
.setErrorTypeData(toSslErrorTypeData(error.getPrimaryError()))
.setCertificateData(sslCertificateData.build())
.setUrl(error.getUrl());

return sslErrorData.build();
}

static GeneratedAndroidWebView.SslErrorTypeData toSslErrorTypeData(int error) {
static GeneratedAndroidWebView.SslErrorTypeData toSslErrorTypeData(int error) {
switch (error) {
case SslError.SSL_DATE_INVALID:
return GeneratedAndroidWebView.SslErrorTypeData.DATE_INVALID;
case SslError.SSL_EXPIRED:
return GeneratedAndroidWebView.SslErrorTypeData.EXPIRED;
case SslError.SSL_IDMISMATCH:
return GeneratedAndroidWebView.SslErrorTypeData.ID_MISMATCH;
case SslError.SSL_NOTYETVALID:
return GeneratedAndroidWebView.SslErrorTypeData.NOT_YET_VALID;
case SslError.SSL_UNTRUSTED:
return GeneratedAndroidWebView.SslErrorTypeData.UNTRUSTED;
default:
return GeneratedAndroidWebView.SslErrorTypeData.INVALID;
case SslError.SSL_DATE_INVALID:
return GeneratedAndroidWebView.SslErrorTypeData.DATE_INVALID;
case SslError.SSL_EXPIRED:
return GeneratedAndroidWebView.SslErrorTypeData.EXPIRED;
case SslError.SSL_IDMISMATCH:
return GeneratedAndroidWebView.SslErrorTypeData.ID_MISMATCH;
case SslError.SSL_NOTYETVALID:
return GeneratedAndroidWebView.SslErrorTypeData.NOT_YET_VALID;
case SslError.SSL_UNTRUSTED:
return GeneratedAndroidWebView.SslErrorTypeData.UNTRUSTED;
default:
return GeneratedAndroidWebView.SslErrorTypeData.INVALID;
}
}

Expand Down Expand Up @@ -337,13 +336,13 @@ public void onReceivedHttpAuthRequest(

/** Passes arguments from {@link WebViewClient#onReceivedSslError} to Dart. */
public void onReceivedSslError(
@NonNull WebViewClient webViewClient,
@NonNull WebView webview,
@NonNull SslErrorHandler sslErrorHandler,
@NonNull SslError error,
@NonNull Reply<Void> callback) {
@NonNull WebViewClient webViewClient,
@NonNull WebView webview,
@NonNull SslErrorHandler sslErrorHandler,
@NonNull SslError error,
@NonNull Reply<Void> callback) {
new SslErrorHandlerFlutterApiImpl(binaryMessenger, instanceManager)
.create(sslErrorHandler, reply -> {});
.create(sslErrorHandler, reply -> {});

onReceivedSslError(
Objects.requireNonNull(instanceManager.getIdentifierForStrongReference(webViewClient)),
Expand All @@ -352,6 +351,7 @@ public void onReceivedSslError(
createSslErrorData(error),
callback);
}

private long getIdentifierForClient(WebViewClient webViewClient) {
final Long identifier = instanceManager.getIdentifierForStrongReference(webViewClient);
if (identifier == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,7 @@ public void onReceivedHttpAuthRequest(

@Override
public void onReceivedSslError(
@NonNull WebView view,
@NonNull SslErrorHandler handler,
@NonNull SslError error) {
@NonNull WebView view, @NonNull SslErrorHandler handler, @NonNull SslError error) {
flutterApi.onReceivedSslError(this, view, handler, error, reply -> {});
}

Expand Down Expand Up @@ -231,7 +229,6 @@ public void onReceivedSslError(@NonNull WebView view, SslErrorHandler handler, S
flutterApi.onReceivedSslError(this, view, handler, error, reply -> {});
}


@Override
public void onUnhandledKeyEvent(@NonNull WebView view, @NonNull KeyEvent event) {
// Deliberately empty. Occasionally the webview will mark events as having failed to be
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ private void setUp(
HttpAuthHandlerHostApi.setup(
binaryMessenger, new HttpAuthHandlerHostApiImpl(binaryMessenger, instanceManager));
SslErrorHandlerHostApi.setup(
binaryMessenger, new SslErrorHandlerHostApiImpl(binaryMessenger, instanceManager));
binaryMessenger, new SslErrorHandlerHostApiImpl(binaryMessenger, instanceManager));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1715,4 +1715,3 @@ class SslErrorHandler extends JavaObject {
return api.proceedFromInstance(this);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,9 @@ class NSUrlProtectionSpace extends NSObject {
port: port,
realm: realm,
sslErrorType: sslErrorType,
x509CertificateDer: x509CertificateDer == null ? null : Uint8List.fromList(x509CertificateDer!.toList()),
x509CertificateDer: x509CertificateDer == null
? null
: Uint8List.fromList(x509CertificateDer!.toList()),
);
}
}
Expand Down