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.DataUriUtil;
6   import com.atlassian.asap.core.keys.KeyProvider;
7   import com.atlassian.asap.core.validator.ValidatedKeyId;
8   
9   import java.io.StringReader;
10  import java.net.URI;
11  import java.security.PrivateKey;
12  
13  import static com.google.common.base.Preconditions.checkArgument;
14  
15  /**
16   * Key provider for keys embedded in data uri.
17   *
18   * @see DataUriKeyReader
19   */
20  public class DataUriKeyProvider implements KeyProvider<PrivateKey> {
21      static final String URI_SCHEME = "data";
22  
23      private final String dataUriKeyId;
24      private final PrivateKey privateKey;
25  
26      public DataUriKeyProvider(URI dataUri, DataUriKeyReader dataUriKeyReader) {
27          checkArgument(dataUri.isAbsolute(), "URI must be absolute"); // implies that scheme != null
28          checkArgument(dataUri.isOpaque(), "URI must not have path components");
29          checkArgument(URI_SCHEME.equals(dataUri.getScheme()), "URI must have data scheme");
30  
31          this.dataUriKeyId = DataUriUtil.getKeyId(dataUri.toString());
32          this.privateKey = getKeyFromDataUri(dataUri, dataUriKeyReader);
33      }
34  
35      @Override
36      public PrivateKey getKey(ValidatedKeyId keyId) throws CannotRetrieveKeyException {
37          if (dataUriKeyId.equals(keyId.getKeyId())) {
38              return privateKey;
39          } else {
40              throw new CannotRetrieveKeyException("Unrecognized key id: " + keyId.getKeyId());
41          }
42      }
43  
44      private static PrivateKey getKeyFromDataUri(URI dataUri, DataUriKeyReader keyReader) {
45          try (StringReader reader = new StringReader(dataUri.toString())) {
46              return keyReader.readPrivateKey(reader);
47          } catch (CannotRetrieveKeyException ex) {
48              throw new IllegalArgumentException("Unable to parse key from data uri", ex);
49          }
50      }
51  
52      @Override
53      public String toString() {
54          return this.getClass().getSimpleName();
55      }
56  }