Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for adding certificate in a nested trustManager of CompositeX509ExtendedTrustManager #436

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -276,11 +276,27 @@ public static void addCertificate(X509ExtendedTrustManager trustManager, List<X5
return;
}

if (trustManager instanceof HotSwappableX509ExtendedTrustManager
&& ((HotSwappableX509ExtendedTrustManager) trustManager).getInnerTrustManager() instanceof InflatableX509ExtendedTrustManager) {
((InflatableX509ExtendedTrustManager) ((HotSwappableX509ExtendedTrustManager) trustManager)
.getInnerTrustManager()).addCertificates(certificates);
return;
if (trustManager instanceof HotSwappableX509ExtendedTrustManager) {
if (((HotSwappableX509ExtendedTrustManager) trustManager).getInnerTrustManager() instanceof InflatableX509ExtendedTrustManager) {
((InflatableX509ExtendedTrustManager) ((HotSwappableX509ExtendedTrustManager) trustManager)
.getInnerTrustManager()).addCertificates(certificates);
return;
}

if (((HotSwappableX509ExtendedTrustManager) trustManager).getInnerTrustManager() instanceof CompositeX509ExtendedTrustManager) {
List<X509ExtendedTrustManager> innerTrustManagers = ((CompositeX509ExtendedTrustManager) ((HotSwappableX509ExtendedTrustManager) trustManager)
.getInnerTrustManager()).getInnerTrustManagers();

Optional<InflatableX509ExtendedTrustManager> inflatableX509ExtendedTrustManager = innerTrustManagers.stream()
.filter(InflatableX509ExtendedTrustManager.class::isInstance)
.map(InflatableX509ExtendedTrustManager.class::cast)
.findFirst();

if (inflatableX509ExtendedTrustManager.isPresent()) {
inflatableX509ExtendedTrustManager.get().addCertificates(certificates);
return;
}
}
}

if (trustManager instanceof CompositeX509ExtendedTrustManager) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,21 @@ void addCertificateToInflatableX509ExtendedTrustManagerEvenThoughItIsWrappedInAH
verify(inflatableX509ExtendedTrustManager, times(1)).addCertificates(certificates);
}

@Test
void addCertificateToInflatableX509ExtendedTrustManagerEvenThoughItIsWrappedInAHotSwappableX509ExtendedTrustManagerWhichIsWrappedIntoACompositeX509ExtendedTrustManager() {
X509Certificate certificate = mock(X509Certificate.class);
List<X509Certificate> certificates = Collections.singletonList(certificate);

InflatableX509ExtendedTrustManager inflatableX509ExtendedTrustManager = mock(InflatableX509ExtendedTrustManager.class);
X509ExtendedTrustManager jdkTrustManager = TrustManagerUtils.createTrustManagerWithJdkTrustedCertificates();
X509ExtendedTrustManager combinedTrustManager = TrustManagerUtils.combine(inflatableX509ExtendedTrustManager, jdkTrustManager);
HotSwappableX509ExtendedTrustManager hotSwappableX509ExtendedTrustManager = (HotSwappableX509ExtendedTrustManager) TrustManagerUtils.createSwappableTrustManager(combinedTrustManager);

TrustManagerUtils.addCertificate(hotSwappableX509ExtendedTrustManager, certificates);

verify(inflatableX509ExtendedTrustManager, times(1)).addCertificates(certificates);
}

@Test
void addCertificateToInflatableX509ExtendedTrustManagerEvenThoughItIsWrappedInACompositeX509ExtendedTrustManager() {
X509Certificate certificate = mock(X509Certificate.class);
Expand Down Expand Up @@ -909,6 +924,21 @@ void throwExceptionWhenAddingCertificateToANonInflatableX509ExtendedTrustManager
.hasMessage("The provided trustManager should be an instance of [nl.altindag.ssl.trustmanager.InflatableX509ExtendedTrustManager]");
}

@Test
void throwExceptionWhenAddingCertificateToANonInflatableX509ExtendedTrustManagerEvenThoughItIsWrappedInAHotSwappableX509ExtendedTrustManagerContainingACompositeX509ExtendedTrustManager() {
X509Certificate certificate = mock(X509Certificate.class);
List<X509Certificate> certificates = Collections.singletonList(certificate);
X509ExtendedTrustManager nonInflatableTrustManager = mock(X509ExtendedTrustManager.class);
CompositeX509ExtendedTrustManager compositeX509ExtendedTrustManager = mock(CompositeX509ExtendedTrustManager.class);
HotSwappableX509ExtendedTrustManager hotSwappableX509ExtendedTrustManager = mock(HotSwappableX509ExtendedTrustManager.class);
when(hotSwappableX509ExtendedTrustManager.getInnerTrustManager()).thenReturn(compositeX509ExtendedTrustManager);
when(compositeX509ExtendedTrustManager.getInnerTrustManagers()).thenReturn(Collections.singletonList(nonInflatableTrustManager));

assertThatThrownBy(() -> TrustManagerUtils.addCertificate(hotSwappableX509ExtendedTrustManager, certificates))
.isInstanceOf(GenericTrustManagerException.class)
.hasMessage("The provided trustManager should be an instance of [nl.altindag.ssl.trustmanager.InflatableX509ExtendedTrustManager]");
}

@Test
void throwExceptionWhenAddingCertificateToANonInflatableX509ExtendedTrustManagerEvenThoughItIsWrappedInACompositeX509ExtendedTrustManager() {
X509Certificate certificate = mock(X509Certificate.class);
Expand Down
Loading