View Javadoc

1   package com.atlassian.asap.core.keys.publickey;
2   
3   import com.atlassian.asap.api.exception.CannotRetrieveKeyException;
4   import com.atlassian.asap.core.exception.PublicKeyNotFoundException;
5   import com.atlassian.asap.core.exception.PublicKeyRetrievalException;
6   import com.atlassian.asap.core.keys.KeyProvider;
7   import com.atlassian.asap.core.keys.PemReader;
8   import com.atlassian.asap.core.validator.ValidatedKeyId;
9   import org.slf4j.Logger;
10  import org.slf4j.LoggerFactory;
11  
12  import java.io.File;
13  import java.io.FileInputStream;
14  import java.io.FileNotFoundException;
15  import java.io.IOException;
16  import java.io.InputStreamReader;
17  import java.io.Reader;
18  import java.nio.charset.StandardCharsets;
19  import java.security.PublicKey;
20  import java.util.Objects;
21  
22  /**
23   * Reads public keys from the filesystem.
24   */
25  public class FilePublicKeyProvider implements KeyProvider<PublicKey> {
26      private static final Logger logger = LoggerFactory.getLogger(FilePublicKeyProvider.class);
27      private final File baseDirectory;
28      private final PemReader pemReader;
29  
30      public FilePublicKeyProvider(File baseDirectory, PemReader pemReader) {
31          this.baseDirectory = Objects.requireNonNull(baseDirectory);
32          this.pemReader = Objects.requireNonNull(pemReader);
33      }
34  
35      @Override
36      public PublicKey getKey(ValidatedKeyId validatedKeyId) throws CannotRetrieveKeyException {
37          File file = new File(baseDirectory, validatedKeyId.getKeyId());
38          logger.debug("Reading public key from file system: {}", file);
39  
40          try (Reader reader = new InputStreamReader(new FileInputStream(file), StandardCharsets.US_ASCII)) {
41              return pemReader.readPublicKey(reader);
42          } catch (FileNotFoundException e) {
43              // log at debug level because this can be caused by invalid input
44              logger.debug("Public key file path {} was not found or it is not a file", file);
45              throw new PublicKeyNotFoundException(
46                      "Public key file path was not found or it is not a file", validatedKeyId, file.toURI());
47          } catch (CannotRetrieveKeyException | IOException e) {
48              logger.warn("A problem occurred when trying to retrieve public key from file: {}", file, e);
49              throw new PublicKeyRetrievalException("Error reading public key from file", validatedKeyId, file.toURI());
50          }
51      }
52  
53      @Override
54      public String toString() {
55          return this.getClass().getSimpleName();
56      }
57  }