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
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
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 }