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
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
31
32
33
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 }