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.KeyProvider;
5   import com.atlassian.asap.core.keys.KeyReader;
6   import com.atlassian.asap.core.validator.ValidatedKeyId;
7   import org.slf4j.Logger;
8   import org.slf4j.LoggerFactory;
9   
10  import java.io.File;
11  import java.io.FileInputStream;
12  import java.io.FileNotFoundException;
13  import java.io.IOException;
14  import java.io.InputStreamReader;
15  import java.io.Reader;
16  import java.nio.charset.StandardCharsets;
17  import java.security.PrivateKey;
18  import java.util.Objects;
19  
20  /**
21   * Reads private keys from the filesystem.
22   */
23  public class FilePrivateKeyProvider implements KeyProvider<PrivateKey> {
24      private static final Logger logger = LoggerFactory.getLogger(FilePrivateKeyProvider.class);
25  
26      private final File baseDirectory;
27      private final KeyReader keyReader;
28  
29      /**
30       * Creates a new instance of {@link FilePrivateKeyProvider}.
31       *
32       * @param baseDirectory the base directory in filesystem where private keys are stored
33       * @param keyReader     the key reader to use for reading private keys
34       */
35      public FilePrivateKeyProvider(File baseDirectory, KeyReader keyReader) {
36          this.baseDirectory = Objects.requireNonNull(baseDirectory);
37          this.keyReader = Objects.requireNonNull(keyReader);
38      }
39  
40      @Override
41      public PrivateKey getKey(ValidatedKeyId validatedKeyId) throws CannotRetrieveKeyException {
42          File file = new File(baseDirectory, validatedKeyId.getKeyId());
43          logger.debug("Reading private key from file system: {}", validatedKeyId.getKeyId());
44  
45          try (Reader reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.US_ASCII)) {
46              return keyReader.readPrivateKey(reader);
47          } catch (FileNotFoundException e) {
48              logger.debug("Private key file path {} does not exist or is not a file", file);
49              throw new CannotRetrieveKeyException("Private key file path does not exist or is not a file");
50          } catch (IOException e) {
51              throw new CannotRetrieveKeyException(String.format("Error retrieving private key from file: '%s'", file), e);
52          }
53      }
54  
55      @Override
56      public String toString() {
57          return this.getClass().getSimpleName();
58      }
59  }