View Javadoc

1   package com.atlassian.asap.core.keys.privatekey;
2   
3   import com.atlassian.asap.api.exception.CannotRetrieveKeyException;
4   import com.atlassian.asap.core.keys.DataUriKeyReader;
5   import com.atlassian.asap.core.keys.KeyProvider;
6   import com.atlassian.asap.core.validator.ValidatedKeyId;
7   import org.junit.Rule;
8   import org.junit.Test;
9   import org.junit.contrib.java.lang.system.ProvideSystemProperty;
10  import org.junit.rules.ExpectedException;
11  import org.mockito.Mock;
12  import org.mockito.junit.MockitoJUnit;
13  import org.mockito.junit.MockitoRule;
14  
15  import java.io.InputStreamReader;
16  import java.net.URI;
17  import java.security.PrivateKey;
18  import java.security.interfaces.RSAPrivateKey;
19  
20  import static org.hamcrest.Matchers.containsString;
21  import static org.hamcrest.Matchers.not;
22  import static org.junit.Assert.assertSame;
23  import static org.mockito.Matchers.any;
24  import static org.mockito.Mockito.when;
25  
26  public class SystemPropertyKeyProviderTest {
27      private static final String VALID_KID = "issuer/kid";
28      private static final String PROPERTY_NAME_1 = "property.name.1";
29      private static final String PROPERTY_NAME_2 = "property.name.2";
30      private static final URI VALID_URL = URI.create("sysprop:///" + PROPERTY_NAME_1);
31      private static final URI INVALID_URL = URI.create("sysprop:///" + PROPERTY_NAME_2);
32      private static final String VALID_KEY_DATA = "data:application/pkcs8;kid=issuer%2Fkid;base64,EncodedKeyData";
33      private static final String UNPARSEABLE_PRIVATE_KEY_DATA = "unparseable private key data uri";
34  
35      @Rule
36      public final MockitoRule mockitoRule = MockitoJUnit.rule();
37  
38      @Rule
39      public final ProvideSystemProperty provideSystemProperty1 =
40              new ProvideSystemProperty(PROPERTY_NAME_1, VALID_KEY_DATA);
41  
42      @Rule
43      public final ProvideSystemProperty provideSystemProperty2 =
44              new ProvideSystemProperty(PROPERTY_NAME_2, UNPARSEABLE_PRIVATE_KEY_DATA);
45  
46      @Rule
47      public final ExpectedException expectedException = ExpectedException.none();
48  
49      @Mock
50      private DataUriKeyReader keyReader;
51      @Mock
52      private RSAPrivateKey privateKey;
53  
54      @Test
55      public void shouldBeAbleToReadKeyFromSystemProperty() throws Exception {
56          when(keyReader.readPrivateKey(any(InputStreamReader.class))).thenReturn(privateKey);
57  
58          KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(VALID_URL, keyReader);
59  
60          assertSame(privateKey, keyProvider.getKey(ValidatedKeyId.validate(VALID_KID)));
61      }
62  
63      @Test
64      public void shouldFailWhenKeyIsNotAUri() throws Exception {
65          expectedException.expect(IllegalArgumentException.class);
66          expectedException.expectMessage(not(containsString("private key")));
67  
68          KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(INVALID_URL, keyReader);
69          keyProvider.getKey(ValidatedKeyId.validate(VALID_KID));
70      }
71  
72      @Test
73      public void shouldFailWhenKeyParserFails() throws Exception {
74          when(keyReader.readPrivateKey(any(InputStreamReader.class)))
75                  .thenThrow(new CannotRetrieveKeyException("Random error"));
76  
77          expectedException.expect(IllegalArgumentException.class);
78          expectedException.expectMessage(not(containsString(VALID_KEY_DATA)));
79  
80          // we don't care whether it fails on construction (eager) or on use (lazy)
81          KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(VALID_URL, keyReader);
82          keyProvider.getKey(ValidatedKeyId.validate(VALID_KID));
83      }
84  
85      @Test(expected = IllegalArgumentException.class)
86      public void shouldFailWhenSystemPropertyIsNotDefined() throws Exception {
87          KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(URI.create("sysprop:///asap.key"), keyReader);
88          keyProvider.getKey(ValidatedKeyId.validate(VALID_KID));
89      }
90  
91      @Test(expected = CannotRetrieveKeyException.class)
92      public void shouldFailWhenKeyIdIsNotDefined() throws Exception {
93          KeyProvider<PrivateKey> keyProvider = SystemPropertyKeyProvider.fromUri(VALID_URL, keyReader);
94          keyProvider.getKey(ValidatedKeyId.validate("some/other/key/identifier"));
95      }
96  
97      @Test(expected = IllegalArgumentException.class)
98      public void shouldFailToConstructIfUriDoesNotHaveSyspropSchema() throws Exception {
99          SystemPropertyKeyProvider.fromUri(new URI("sysprop:opaque"), keyReader);
100     }
101 }