|
1 | 1 | package io.lenses.connect.secrets.providers
|
2 | 2 |
|
| 3 | +import java.nio.file.Paths |
| 4 | +import java.util |
| 5 | + |
| 6 | +import io.lenses.connect.secrets.config.Aes256ProviderConfig |
| 7 | +import io.lenses.connect.secrets.connect.decodeKey |
| 8 | +import io.lenses.connect.secrets.connect.Encoding |
| 9 | +import io.lenses.connect.secrets.io.FileWriter |
| 10 | +import io.lenses.connect.secrets.io.FileWriterOnce |
| 11 | +import io.lenses.connect.secrets.utils.EncodingAndId |
3 | 12 | import org.apache.kafka.common.config.ConfigData
|
4 | 13 | import org.apache.kafka.common.config.provider.ConfigProvider
|
5 |
| -import org.apache.kafka.connect.errors.ConnectException |
6 | 14 | import org.apache.kafka.common.config.ConfigException
|
7 |
| -import java.util |
8 |
| -import javax.crypto.SecretKey |
9 |
| -import javax.crypto.SecretKeyFactory |
10 |
| -import javax.crypto.spec.PBEKeySpec |
11 |
| -import javax.crypto.spec.SecretKeySpec |
12 |
| -import io.lenses.connect.secrets.config.Aes256ProviderConfig |
13 |
| -import io.lenses.connect.secrets.connect.{decodeKey, getFileName} |
| 15 | +import org.apache.kafka.connect.errors.ConnectException |
| 16 | + |
14 | 17 | import scala.collection.JavaConverters._
|
15 |
| -import scala.util.Try |
16 |
| -import io.lenses.connect.secrets.connect.Encoding |
17 |
| -import java.nio.file.FileSystems |
18 |
| -import java.util.UUID.randomUUID |
| 18 | + |
19 | 19 |
|
20 | 20 | class Aes256DecodingProvider extends ConfigProvider {
|
21 | 21 |
|
22 | 22 | var decoder: Option[Aes256DecodingHelper] = None
|
23 | 23 | var writeDir: String = ""
|
24 |
| - |
| 24 | + |
| 25 | + private var fileWriter:FileWriter = _ |
25 | 26 | override def configure(configs: util.Map[String, _]): Unit = {
|
26 | 27 | val aes256Cfg = Aes256ProviderConfig(configs)
|
27 | 28 | val aes256Key = aes256Cfg.aes256Key
|
28 | 29 | decoder = Option(aes256Key)
|
29 | 30 | .map(Aes256DecodingHelper.init)
|
30 | 31 | .map(_.fold(e => throw new ConfigException(e), identity))
|
31 | 32 | writeDir = aes256Cfg.writeDirectory
|
| 33 | + fileWriter = new FileWriterOnce(Paths.get(writeDir, "secrets")) |
32 | 34 | }
|
33 | 35 |
|
34 | 36 | override def get(path: String): ConfigData = new ConfigData(Map.empty[String, String].asJava)
|
35 |
| - |
36 |
| - override def get(path: String, keys: util.Set[String]): ConfigData = |
| 37 | + |
| 38 | + override def get(path: String, keys: util.Set[String]): ConfigData = { |
| 39 | + val encodingAndId = EncodingAndId.from(path) |
37 | 40 | decoder match {
|
38 | 41 | case Some(d) =>
|
39 | 42 | def decrypt(key: String): String = {
|
40 |
| - val decrypted = d.decrypt(key).fold(e => throw new ConnectException(e.getMessage(), e), identity) |
41 |
| - val keyPrefixedWithEncoding = if (path.nonEmpty) s"${path.toLowerCase}_$key" else key |
| 43 | + val decrypted = d.decrypt(key).fold(e => throw new ConnectException("Failed to decrypt the secret.", e), identity) |
42 | 44 | decodeKey(
|
43 |
| - key = keyPrefixedWithEncoding, |
| 45 | + key = key, |
44 | 46 | value = decrypted,
|
45 |
| - fileName = getFileName(writeDir, "secrets", randomUUID().toString, FileSystems.getDefault.getSeparator) |
| 47 | + encoding = encodingAndId.encoding, |
| 48 | + writeFileFn = { content => |
| 49 | + encodingAndId.id match { |
| 50 | + case Some(value) => fileWriter.write(value, content, key).toString |
| 51 | + case None => throw new ConnectException(s"Invalid argument received for key:$key. Expecting a file identifier.") |
| 52 | + } |
| 53 | + } |
46 | 54 | )
|
47 | 55 | }
|
48 |
| - |
| 56 | + |
49 | 57 | new ConfigData(keys.asScala.map(k => k -> decrypt(k)).toMap.asJava)
|
50 | 58 | case None =>
|
51 | 59 | throw new ConnectException("decoder is not configured.")
|
52 | 60 | }
|
| 61 | + } |
53 | 62 |
|
54 | 63 | override def close(): Unit = {}
|
55 | 64 | }
|
0 commit comments