You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2016/01/18 11:18:16 UTC

svn commit: r1725214 [2/2] - in /james/project/trunk/server: ./ container/cassandra-guice/src/main/java/org/apache/james/jmap/ container/cassandra-guice/src/main/java/org/apache/james/modules/protocols/ container/cassandra-guice/src/test/java/org/apach...

Added: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/BypassAuthOnRequestMethodTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/BypassAuthOnRequestMethodTest.java?rev=1725214&view=auto
==============================================================================
--- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/BypassAuthOnRequestMethodTest.java (added)
+++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/BypassAuthOnRequestMethodTest.java Mon Jan 18 10:18:15 2016
@@ -0,0 +1,107 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.jmap;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import javax.servlet.FilterChain;
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class BypassAuthOnRequestMethodTest {
+
+    private HttpServletRequest mockedRequest;
+    private AuthenticationFilter nestedFilter;
+    private BypassAuthOnRequestMethod sut;
+    private FilterChain filterChain;
+
+    @Before
+    public void setup() throws Exception {
+        mockedRequest = mock(HttpServletRequest.class);
+        nestedFilter = mock(AuthenticationFilter.class);
+        sut = BypassAuthOnRequestMethod.bypass(nestedFilter).on("POST").and("OPTIONS").only();
+        filterChain = mock(FilterChain.class);
+    }
+
+    @Test
+    public void filterShouldCallNestedFilterOnGet() throws Exception {
+        when(mockedRequest.getMethod())
+                .thenReturn("GET");
+
+        sut.doFilter(mockedRequest, null, filterChain);
+
+        verify(nestedFilter).doFilter(mockedRequest, null, filterChain);
+    }
+
+    @Test
+    public void filterShouldNotCallDirectlyChainOnGet() throws Exception {
+        when(mockedRequest.getMethod())
+                .thenReturn("GET");
+
+        sut.doFilter(mockedRequest, null, filterChain);
+
+        verify(filterChain, never()).doFilter(mockedRequest, null);
+    }
+
+    @Test
+    public void filterShouldNotCallNestedFilterOnPost() throws Exception {
+        when(mockedRequest.getMethod())
+                .thenReturn("POST");
+
+        sut.doFilter(mockedRequest, null, filterChain);
+
+        verify(nestedFilter, never()).doFilter(mockedRequest, null, filterChain);
+    }
+
+    @Test
+    public void filterShouldCallChainOnPost() throws Exception {
+        when(mockedRequest.getMethod())
+                .thenReturn("POST");
+
+        sut.doFilter(mockedRequest, null, filterChain);
+
+        verify(filterChain).doFilter(mockedRequest, null);
+    }
+
+    @Test
+    public void filterShouldNotCallNestedFilterOnOptions() throws Exception {
+        when(mockedRequest.getMethod())
+                .thenReturn("OPTIONS");
+
+        sut.doFilter(mockedRequest, null, filterChain);
+
+        verify(nestedFilter, never()).doFilter(mockedRequest, null, filterChain);
+    }
+
+    @Test
+    public void filterShouldCallChainOnOptions() throws Exception {
+        when(mockedRequest.getMethod())
+                .thenReturn("OPTIONS");
+
+        sut.doFilter(mockedRequest, null, filterChain);
+
+        verify(filterChain).doFilter(mockedRequest, null);
+    }
+
+}

Added: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JWTAuthenticationStrategyTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JWTAuthenticationStrategyTest.java?rev=1725214&view=auto
==============================================================================
--- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JWTAuthenticationStrategyTest.java (added)
+++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/JWTAuthenticationStrategyTest.java Mon Jan 18 10:18:15 2016
@@ -0,0 +1,151 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.jmap;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.stream.Stream;
+
+import org.apache.james.jmap.crypto.JwtTokenVerifier;
+import org.apache.james.jmap.exceptions.MailboxSessionCreationException;
+import org.apache.james.jmap.exceptions.NoValidAuthHeaderException;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+
+
+public class JWTAuthenticationStrategyTest {
+
+    private JWTAuthenticationStrategy testee;
+    private MailboxManager mockedMailboxManager;
+    private JwtTokenVerifier stubTokenVerifier;
+
+    @Before
+    public void setup() {
+        mockedMailboxManager = mock(MailboxManager.class);
+
+        stubTokenVerifier = mock(JwtTokenVerifier.class);
+
+        testee = new JWTAuthenticationStrategy(stubTokenVerifier, mockedMailboxManager);
+    }
+
+
+    @Test
+    public void createMailboxSessionShouldThrowWhenAuthHeaderIsEmpty() throws Exception {
+        assertThatThrownBy(() -> testee.createMailboxSession(Stream.empty()))
+            .isExactlyInstanceOf(NoValidAuthHeaderException.class);
+    }
+
+    @Test
+    public void createMailboxSessionShouldReturnEmptyWhenAuthHeaderIsInvalid() throws Exception {
+        assertThatThrownBy(() -> testee.createMailboxSession(Stream.of("bad")))
+            .isExactlyInstanceOf(NoValidAuthHeaderException.class);
+    }
+
+    @Test
+    public void createMailboxSessionShouldThrowWhenMailboxExceptionHasOccurred() throws Exception {
+        String username = "username";
+        String validAuthHeader = "valid";
+        String fakeAuthHeaderWithPrefix = JWTAuthenticationStrategy.AUTHORIZATION_HEADER_PREFIX + validAuthHeader;
+
+        when(stubTokenVerifier.verify(validAuthHeader)).thenReturn(true);
+        when(stubTokenVerifier.extractLogin(validAuthHeader)).thenReturn(username);
+        when(mockedMailboxManager.createSystemSession(eq(username), any(Logger.class)))
+                .thenThrow(new MailboxException());
+
+        assertThatThrownBy(() -> testee.createMailboxSession(Stream.of(fakeAuthHeaderWithPrefix)))
+                .isExactlyInstanceOf(MailboxSessionCreationException.class);
+    }
+
+    @Test
+    public void createMailboxSessionShouldReturnWhenAuthHeadersAreValid() throws Exception {
+        String username = "123456789";
+        String validAuthHeader = "valid";
+        String fakeAuthHeaderWithPrefix = JWTAuthenticationStrategy.AUTHORIZATION_HEADER_PREFIX + validAuthHeader;
+        MailboxSession fakeMailboxSession = mock(MailboxSession.class);
+
+        when(stubTokenVerifier.verify(validAuthHeader)).thenReturn(true);
+        when(stubTokenVerifier.extractLogin(validAuthHeader)).thenReturn(username);
+        when(mockedMailboxManager.createSystemSession(eq(username), any(Logger.class)))
+                .thenReturn(fakeMailboxSession);
+
+        MailboxSession result = testee.createMailboxSession(Stream.of(fakeAuthHeaderWithPrefix));
+        assertThat(result).isEqualTo(fakeMailboxSession);
+    }
+
+    @Test
+    public void checkAuthorizationHeaderShouldReturnFalsewWhenAuthHeaderIsEmpty() {
+        assertThat(testee.checkAuthorizationHeader(Stream.empty())).isFalse();
+    }
+
+    @Test
+    public void checkAuthorizationHeaderShouldReturnFalseWhenAuthHeaderIsInvalid() {
+        String wrongAuthHeader = "invalid";
+        String fakeAuthHeaderWithPrefix = JWTAuthenticationStrategy.AUTHORIZATION_HEADER_PREFIX + wrongAuthHeader;
+
+        when(stubTokenVerifier.verify(wrongAuthHeader)).thenReturn(false);
+
+        assertThat(testee.checkAuthorizationHeader(Stream.of(fakeAuthHeaderWithPrefix))).isFalse();
+    }
+
+    @Test
+    public void checkAuthorizationHeaderShouldReturnFalseWhenAuthHeadersAreInvalid() {
+        String wrongAuthHeader = "invalid";
+        String invalidAuthHeader = "INVALID";
+
+        when(stubTokenVerifier.verify(wrongAuthHeader)).thenReturn(false);
+        when(stubTokenVerifier.verify(invalidAuthHeader)).thenReturn(false);
+
+        Stream<String> authHeadersStream = Stream.of(wrongAuthHeader, invalidAuthHeader)
+                .map(h -> JWTAuthenticationStrategy.AUTHORIZATION_HEADER_PREFIX + h);
+        assertThat(testee.checkAuthorizationHeader(authHeadersStream)).isFalse();
+    }
+
+    @Test
+    public void checkAuthorizationHeaderShouldReturnTrueWhenAuthHeaderIsValid() {
+        String validAuthHeader = "valid";
+        String validAuthHeaderWithPrefix = JWTAuthenticationStrategy.AUTHORIZATION_HEADER_PREFIX + validAuthHeader;
+
+        when(stubTokenVerifier.verify(validAuthHeader)).thenReturn(true);
+
+        assertThat(testee.checkAuthorizationHeader(Stream.of(validAuthHeaderWithPrefix))).isTrue();
+    }
+
+    @Test
+    public void checkAuthorizationHeaderShouldReturnTrueWhenOneAuthHeaderIsValid() {
+        String dummyAuthHeader = "invalid";
+        String validAuthHeader = "correct";
+
+        when(stubTokenVerifier.verify(dummyAuthHeader)).thenReturn(false);
+        when(stubTokenVerifier.verify(validAuthHeader)).thenReturn(true);
+
+        Stream<String> authHeadersStream = Stream.of(dummyAuthHeader, validAuthHeader)
+                .map(h -> JWTAuthenticationStrategy.AUTHORIZATION_HEADER_PREFIX + h);
+        assertThat(testee.checkAuthorizationHeader(authHeadersStream)).isTrue();
+    }
+
+}
\ No newline at end of file

Added: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JwtTokenVerifierTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JwtTokenVerifierTest.java?rev=1725214&view=auto
==============================================================================
--- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JwtTokenVerifierTest.java (added)
+++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/JwtTokenVerifierTest.java Mon Jan 18 10:18:15 2016
@@ -0,0 +1,96 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.jmap.crypto;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.security.Security;
+import java.util.Optional;
+
+import org.apache.james.jmap.JMAPConfiguration;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import io.jsonwebtoken.SignatureException;
+
+public class JwtTokenVerifierTest {
+
+    private static final String PUBLIC_PEM_KEY = "-----BEGIN PUBLIC KEY-----\n" +
+            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh\n" +
+            "16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H\n" +
+            "lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi\n" +
+            "+d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+\n" +
+            "GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6\n" +
+            "U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj\n" +
+            "kwIDAQAB\n" +
+            "-----END PUBLIC KEY-----";
+    private static final String VALID_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.T04BTk" +
+            "LXkJj24coSZkK13RfG25lpvmSl2MJ7N10KpBk9_-95EGYZdog-BDAn3PJzqVw52z-Bwjh4VOj1-j7cURu0cT4jXehhUrlCxS4n7QHZD" +
+            "N_bsEYGu7KzjWTpTsUiHe-rN7izXVFxDGG1TGwlmBCBnPW-EFCf9ylUsJi0r2BKNdaaPRfMIrHptH1zJBkkUziWpBN1RNLjmvlAUf49" +
+            "t1Tbv21ZqYM5Ht2vrhJWczFbuC-TD-8zJkXhjTmA1GVgomIX5dx1cH-dZX1wANNmshUJGHgepWlPU-5VIYxPEhb219RMLJIELMY2qN" +
+            "OR8Q31ydinyqzXvCSzVJOf6T60-w";
+
+    private JwtTokenVerifier sut;
+
+    @BeforeClass
+    public static void init() {
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    @Before
+    public void setup() {
+        PublicKeyProvider pubKeyProvider = new PublicKeyProvider(getJWTConfiguration(), new PublicKeyReader());
+        sut = new JwtTokenVerifier(pubKeyProvider);
+    }
+
+    private JMAPConfiguration getJWTConfiguration() {
+
+        return JMAPConfiguration.builder()
+                .keystore(".")
+                .secret(".")
+                .jwtPublicKeyPem(Optional.ofNullable(PUBLIC_PEM_KEY))
+                .build();
+    }
+
+    @Test
+    public void shouldReturnTrueOnValidSignature() {
+
+        assertThat(sut.verify(VALID_TOKEN)).isTrue();
+    }
+
+    @Test
+    public void shouldThrowOnMismatchingSigningKey() {
+        String token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.Pd6t82" +
+                "tPL3EZdkeYxw_DV2KimE1U2FvuLHmfR_mimJ5US3JFU4J2Gd94O7rwpSTGN1B9h-_lsTebo4ua4xHsTtmczZ9xa8a_kWKaSkqFjNFa" +
+                "Fp6zcoD6ivCu03SlRqsQzSRHXo6TKbnqOt9D6Y2rNa3C4igSwoS0jUE4BgpXbc0";
+
+        assertThatThrownBy(() -> sut.verify(token))
+            .isInstanceOf(SignatureException.class);
+    }
+
+    @Test
+    public void shouldReturnUserLoginFromValidToken() {
+
+        assertThat(sut.extractLogin(VALID_TOKEN)).isEqualTo("1234567890");
+    }
+
+}

Added: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/PublicKeyProviderTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/PublicKeyProviderTest.java?rev=1725214&view=auto
==============================================================================
--- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/PublicKeyProviderTest.java (added)
+++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/PublicKeyProviderTest.java Mon Jan 18 10:18:15 2016
@@ -0,0 +1,74 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.jmap.crypto;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.security.Security;
+import java.security.interfaces.RSAPublicKey;
+import java.util.Optional;
+
+import org.apache.james.jmap.JMAPConfiguration;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class PublicKeyProviderTest {
+
+    private static final String PUBLIC_PEM_KEY = "-----BEGIN PUBLIC KEY-----\n" +
+            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh\n" +
+            "16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H\n" +
+            "lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi\n" +
+            "+d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+\n" +
+            "GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6\n" +
+            "U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj\n" +
+            "kwIDAQAB\n" +
+            "-----END PUBLIC KEY-----";
+
+    @BeforeClass
+    public static void init() {
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    @Test
+    public void getShouldNotThrowWhenPEMKeyProvided() {
+
+        JMAPConfiguration configWithPEMKey = JMAPConfiguration.builder()
+                .jwtPublicKeyPem(Optional.ofNullable(PUBLIC_PEM_KEY))
+                .keystore(".").secret(".")
+                .build();
+
+        PublicKeyProvider sut = new PublicKeyProvider(configWithPEMKey, new PublicKeyReader());
+
+        assertThat(sut.get()).isInstanceOf(RSAPublicKey.class);
+    }
+
+    @Test
+    public void getShouldThrowWhenPEMKeyNotProvided() {
+        JMAPConfiguration configWithPEMKey = JMAPConfiguration.builder()
+                .jwtPublicKeyPem(Optional.ofNullable(""))
+                .keystore(" ").secret(" ")
+                .build();
+
+        PublicKeyProvider sut = new PublicKeyProvider(configWithPEMKey, new PublicKeyReader());
+
+        assertThatThrownBy(() -> sut.get()).isExactlyInstanceOf(MissingOrInvalidKeyException.class);
+    }
+}
\ No newline at end of file

Added: james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/PublicKeyReaderTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/PublicKeyReaderTest.java?rev=1725214&view=auto
==============================================================================
--- james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/PublicKeyReaderTest.java (added)
+++ james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/PublicKeyReaderTest.java Mon Jan 18 10:18:15 2016
@@ -0,0 +1,62 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.crypto;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.security.Security;
+import java.util.Optional;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class PublicKeyReaderTest {
+
+    private static final String PUBLIC_PEM_KEY = "-----BEGIN PUBLIC KEY-----\n" +
+            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlChO/nlVP27MpdkG0Bh\n" +
+            "16XrMRf6M4NeyGa7j5+1UKm42IKUf3lM28oe82MqIIRyvskPc11NuzSor8HmvH8H\n" +
+            "lhDs5DyJtx2qp35AT0zCqfwlaDnlDc/QDlZv1CoRZGpQk1Inyh6SbZwYpxxwh0fi\n" +
+            "+d/4RpE3LBVo8wgOaXPylOlHxsDizfkL8QwXItyakBfMO6jWQRrj7/9WDhGf4Hi+\n" +
+            "GQur1tPGZDl9mvCoRHjFrD5M/yypIPlfMGWFVEvV5jClNMLAQ9bYFuOc7H1fEWw6\n" +
+            "U1LZUUbJW9/CH45YXz82CYqkrfbnQxqRb2iVbVjs/sHopHd1NTiCfUtwvcYJiBVj\n" +
+            "kwIDAQAB\n" +
+            "-----END PUBLIC KEY-----";
+
+    @BeforeClass
+    public static void init() {
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    @Test
+    public void fromPEMShouldReturnEmptyWhenEmptyProvided() {
+        assertThat(new PublicKeyReader().fromPEM(Optional.empty())).isEmpty();
+    }
+
+    @Test
+    public void fromPEMShouldReturnEmptyWhenInvalidPEMKey() {
+        assertThat(new PublicKeyReader().fromPEM(Optional.of("blabla"))).isEmpty();
+    }
+
+    @Test
+    public void fromPEMShouldReturnRSAPublicKeyWhenValidPEMKey() {
+        assertThat(new PublicKeyReader().fromPEM(Optional.of(PUBLIC_PEM_KEY))).isPresent();
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org