org.digidoc4j.SkDataLoaderTest.java Source code

Java tutorial

Introduction

Here is the source code for org.digidoc4j.SkDataLoaderTest.java

Source

/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/

package org.digidoc4j;

import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.containing;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
import static org.apache.commons.lang.StringUtils.isEmpty;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import org.bouncycastle.cert.ocsp.OCSPResp;
import org.bouncycastle.tsp.TimeStampRequest;
import org.bouncycastle.tsp.TimeStampResponse;
import org.digidoc4j.impl.bdoc.CachingDataLoader;
import org.digidoc4j.impl.bdoc.SkDataLoader;
import org.digidoc4j.impl.bdoc.tsl.TslLoader;
import org.digidoc4j.testutils.TestDataBuilder;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;

import com.github.tomakehurst.wiremock.junit.WireMockRule;

import eu.europa.esig.dss.MimeType;
import eu.europa.esig.dss.client.http.commons.CommonsDataLoader;
import eu.europa.esig.dss.client.http.proxy.ProxyPreferenceManager;

public class SkDataLoaderTest {

    @Rule
    public WireMockRule wireMockRule = new WireMockRule(12189);

    static Configuration configuration = new Configuration(Configuration.Mode.TEST);
    static final String MOCK_PROXY_URL = "http://localhost:12189/";

    @Test
    public void getTimestampViaSpy() throws Exception {
        stubFor(post(urlEqualTo("/")).willReturn(aResponse().proxiedFrom(configuration.getTspSource())));

        byte[] tsRequest = new byte[] { 48, 57, 2, 1, 1, 48, 49, 48, 13, 6, 9, 96, -122, 72, 1, 101, 3, 4, 2, 1, 5,
                0, 4, 32, 2, 91, 64, 111, 35, -23, -19, -46, 57, -80, -63, -80, -74, 100, 72, 97, -47, -17, -35,
                -62, 102, 52, 116, 73, -10, -120, 115, 62, 2, 87, -29, -21, 1, 1, -1 };
        SkDataLoader dataLoader = SkDataLoader.createTimestampDataLoader(configuration);
        dataLoader.setUserAgentSignatureProfile(SignatureProfile.LT);
        byte[] response = dataLoader.post(MOCK_PROXY_URL, tsRequest);
        assertNotNull(response);
        TimeStampResponse timeStampResponse = new TimeStampResponse(response);
        assertEquals(0, timeStampResponse.getStatus());
        timeStampResponse.validate(new TimeStampRequest(tsRequest));

        verify(postRequestedFor(urlMatching("/"))
                .withHeader("Content-Type", containing("application/timestamp-query"))
                .withHeader("User-Agent", containing("LIB DigiDoc4j")));
    }

    @Test
    public void getOcspViaSpy() throws Exception {
        stubFor(post(urlEqualTo("/")).willReturn(aResponse().proxiedFrom(configuration.getOcspSource())));

        byte[] ocspRequest = new byte[] { 48, 120, 48, 118, 48, 77, 48, 75, 48, 73, 48, 9, 6, 5, 43, 14, 3, 2, 26,
                5, 0, 4, 20, -20, -37, 96, 16, 51, -48, 76, 118, -7, -123, -78, 28, -40, 58, -45, -98, 2, -101,
                -109, 49, 4, 20, 73, -64, -14, 68, 57, 101, -43, -101, 70, 59, 13, 56, 96, -125, -79, -42, 45, 40,
                -122, -90, 2, 16, 83, 11, -28, 27, -68, 89, 124, 68, 87, 14, 43, 124, 19, -68, -6, 12, -94, 37, 48,
                35, 48, 33, 6, 9, 43, 6, 1, 5, 5, 7, 48, 1, 2, 4, 20, -55, 25, 66, -2, -90, 61, 30, -49, 20, -82,
                91, 49, -4, -52, -64, 23, 106, 12, -114, 67 };
        SkDataLoader dataLoader = SkDataLoader.createOcspDataLoader(configuration);
        dataLoader.setUserAgentSignatureProfile(SignatureProfile.LT);
        byte[] response = dataLoader.post(MOCK_PROXY_URL, ocspRequest);
        OCSPResp ocspResp = new OCSPResp(response);
        assertNotNull(ocspResp.getResponseObject());

        verify(postRequestedFor(urlMatching("/")).withHeader("Content-Type", containing("application/ocsp-request"))
                .withHeader("User-Agent", containing("LIB DigiDoc4j")));
    }

    @Test
    public void ocspDataLoader_withoutProxyConfiguration() throws Exception {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        SkDataLoader dataLoader = SkDataLoader.createOcspDataLoader(configuration);
        assertNull(dataLoader.getProxyPreferenceManager());
    }

    @Test
    public void cachingDataLoader_withoutProxyConfiguration() throws Exception {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        CommonsDataLoader dataLoader = new CachingDataLoader(configuration);
        assertNull(dataLoader.getProxyPreferenceManager());
    }

    @Test
    public void ocspDataLoader_withProxyConfiguration() throws Exception {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        configuration.setHttpProxyHost("proxyHost");
        configuration.setHttpProxyPort(1345);
        SkDataLoader dataLoader = SkDataLoader.createOcspDataLoader(configuration);
        assertProxyConfigured(dataLoader, "proxyHost", 1345);
        assertProxyUsernamePasswordNotSet(dataLoader);
    }

    @Test
    public void cachingDataLoader_withProxyConfiguration() throws Exception {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        configuration.setHttpProxyHost("proxyHost");
        configuration.setHttpProxyPort(1345);
        CommonsDataLoader dataLoader = new CachingDataLoader(configuration);
        assertProxyConfigured(dataLoader, "proxyHost", 1345);
        assertProxyUsernamePasswordNotSet(dataLoader);
    }

    @Test
    public void dataLoader_withPasswordProxyConfiguration() throws Exception {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        configuration.setHttpProxyHost("proxyHost");
        configuration.setHttpProxyPort(1345);
        configuration.setHttpProxyUser("proxyUser");
        configuration.setHttpProxyPassword("proxyPassword");
        SkDataLoader dataLoader = SkDataLoader.createOcspDataLoader(configuration);
        assertProxyConfigured(dataLoader, "proxyHost", 1345);
        assertProxyUsernamePassword(dataLoader, "proxyPassword", "proxyUser");
    }

    @Test
    @Ignore("Requires access to the proxy server")
    public void createSignAsicOverProxy() throws Exception {
        TslLoader.invalidateCache();
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        configuration.setHttpProxyHost("cache.elion.ee");
        configuration.setHttpProxyPort(8080);
        Container container = ContainerBuilder.aContainer(ContainerBuilder.BDOC_CONTAINER_TYPE)
                .withConfiguration(configuration)
                .withDataFile("testFiles/test.txt", MimeType.TEXT.getMimeTypeString()).build();
        Signature signature = TestDataBuilder.signContainer(container, SignatureProfile.LT);
        assertTrue(signature.validateSignature().isValid());

    }

    @Test
    public void dataLoader_withoutSslConfiguration_shouldNotSetSslValues() throws Exception {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        SkDataLoaderSpy dataLoader = new SkDataLoaderSpy(configuration);
        assertNull(dataLoader.getSslKeystorePath());
        assertNull(dataLoader.getSslKeystoreType());
        assertNull(dataLoader.getSslKeystorePassword());
        assertNull(dataLoader.getSslTruststorePath());
        assertNull(dataLoader.getSslTruststoreType());
        assertNull(dataLoader.getSslTruststorePassword());
        assertFalse(dataLoader.isSslKeystoreTypeSet());
        assertFalse(dataLoader.isSslKeystorePasswordSet());
        assertFalse(dataLoader.isSslTruststoreTypeSet());
        assertFalse(dataLoader.isSslTruststorePasswordSet());
    }

    @Test
    public void dataLoader_withSslConfiguration_shouldSetSslValues() throws Exception {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        configuration.setSslKeystorePath("keystore.path");
        configuration.setSslKeystoreType("keystore.type");
        configuration.setSslKeystorePassword("keystore.password");
        configuration.setSslTruststorePath("truststore.path");
        configuration.setSslTruststoreType("truststore.type");
        configuration.setSslTruststorePassword("truststore.password");
        SkDataLoaderSpy dataLoader = new SkDataLoaderSpy(configuration);
        assertEquals("keystore.path", dataLoader.getSslKeystorePath());
        assertEquals("keystore.type", dataLoader.getSslKeystoreType());
        assertEquals("keystore.password", dataLoader.getSslKeystorePassword());
        assertEquals("truststore.path", dataLoader.getSslTruststorePath());
        assertEquals("truststore.type", dataLoader.getSslTruststoreType());
        assertEquals("truststore.password", dataLoader.getSslTruststorePassword());
        assertTrue(dataLoader.isSslKeystoreTypeSet());
        assertTrue(dataLoader.isSslKeystorePasswordSet());
        assertTrue(dataLoader.isSslTruststoreTypeSet());
        assertTrue(dataLoader.isSslTruststorePasswordSet());
    }

    @Test
    public void dataLoader_withMinimalSslConfiguration_shouldNotSetNullValues() throws Exception {
        Configuration configuration = new Configuration(Configuration.Mode.TEST);
        configuration.setSslKeystorePath("keystore.path");
        configuration.setSslTruststorePath("truststore.path");
        SkDataLoaderSpy dataLoader = new SkDataLoaderSpy(configuration);
        assertEquals("keystore.path", dataLoader.getSslKeystorePath());
        assertNull(dataLoader.getSslKeystoreType());
        assertNull(dataLoader.getSslKeystorePassword());
        assertEquals("truststore.path", dataLoader.getSslTruststorePath());
        assertNull(dataLoader.getSslTruststoreType());
        assertNull(dataLoader.getSslTruststorePassword());
        assertFalse(dataLoader.isSslKeystoreTypeSet());
        assertFalse(dataLoader.isSslKeystorePasswordSet());
        assertFalse(dataLoader.isSslTruststoreTypeSet());
        assertFalse(dataLoader.isSslTruststorePasswordSet());
    }

    private void assertProxyConfigured(CommonsDataLoader dataLoader, String proxyHost, int proxyPort) {
        ProxyPreferenceManager preferenceManager = dataLoader.getProxyPreferenceManager();
        assertNotNull(preferenceManager);
        assertEquals(proxyHost, preferenceManager.getHttpHost());
        assertEquals(proxyPort, preferenceManager.getHttpPort().longValue());
        assertTrue(preferenceManager.isHttpEnabled());
        assertEquals(proxyHost, preferenceManager.getHttpsHost());
        assertEquals(proxyPort, preferenceManager.getHttpsPort().longValue());
        assertTrue(preferenceManager.isHttpsEnabled());
    }

    private void assertProxyUsernamePasswordNotSet(CommonsDataLoader dataLoader) {
        ProxyPreferenceManager preferenceManager = dataLoader.getProxyPreferenceManager();
        assertTrue(isEmpty(preferenceManager.getHttpUser()));
        assertTrue(isEmpty(preferenceManager.getHttpsUser()));
        assertTrue(isEmpty(preferenceManager.getHttpPassword()));
        assertTrue(isEmpty(preferenceManager.getHttpsPassword()));
    }

    private void assertProxyUsernamePassword(SkDataLoader dataLoader, String proxyPassword, String proxyUser) {
        ProxyPreferenceManager preferenceManager = dataLoader.getProxyPreferenceManager();
        assertEquals(proxyUser, preferenceManager.getHttpUser());
        assertEquals(proxyUser, preferenceManager.getHttpsUser());
        assertEquals(proxyPassword, preferenceManager.getHttpPassword());
        assertEquals(proxyPassword, preferenceManager.getHttpsPassword());
    }

    public static class SkDataLoaderSpy extends SkDataLoader {

        private String sslKeystorePath;
        private String sslKeystoreType;
        private String sslKeystorePassword;
        private String sslTruststorePath;
        private String sslTruststoreType;
        private String sslTruststorePassword;

        private boolean isSslKeystoreTypeSet;
        private boolean sslKeystorePasswordSet;
        private boolean sslTruststoreTypeSet;
        private boolean sslTruststorePasswordSet;

        protected SkDataLoaderSpy(Configuration configuration) {
            super(configuration);
        }

        public String getSslKeystorePath() {
            return sslKeystorePath;
        }

        public void setSslKeystorePath(String sslKeystorePath) {
            this.sslKeystorePath = sslKeystorePath;
            super.setSslKeystorePath(sslKeystorePath);
        }

        public String getSslKeystoreType() {
            return sslKeystoreType;
        }

        public void setSslKeystoreType(String sslKeystoreType) {
            this.sslKeystoreType = sslKeystoreType;
            super.setSslKeystoreType(sslKeystoreType);
            isSslKeystoreTypeSet = true;
        }

        public String getSslKeystorePassword() {
            return sslKeystorePassword;
        }

        public void setSslKeystorePassword(String sslKeystorePassword) {
            this.sslKeystorePassword = sslKeystorePassword;
            super.setSslKeystorePassword(sslKeystorePassword);
            sslKeystorePasswordSet = true;
        }

        public String getSslTruststorePath() {
            return sslTruststorePath;
        }

        public void setSslTruststorePath(String sslTruststorePath) {
            this.sslTruststorePath = sslTruststorePath;
            super.setSslTruststorePath(sslTruststorePath);
        }

        public String getSslTruststoreType() {
            return sslTruststoreType;
        }

        public void setSslTruststoreType(String sslTruststoreType) {
            this.sslTruststoreType = sslTruststoreType;
            super.setSslTruststoreType(sslTruststoreType);
            sslTruststoreTypeSet = true;
        }

        public String getSslTruststorePassword() {
            return sslTruststorePassword;
        }

        public void setSslTruststorePassword(String sslTruststorePassword) {
            this.sslTruststorePassword = sslTruststorePassword;
            super.setSslTruststorePassword(sslTruststorePassword);
            sslTruststorePasswordSet = true;
        }

        public boolean isSslKeystoreTypeSet() {
            return isSslKeystoreTypeSet;
        }

        public boolean isSslKeystorePasswordSet() {
            return sslKeystorePasswordSet;
        }

        public boolean isSslTruststoreTypeSet() {
            return sslTruststoreTypeSet;
        }

        public boolean isSslTruststorePasswordSet() {
            return sslTruststorePasswordSet;
        }
    }
}