88package org .seedstack .seed .core .internal .crypto ;
99
1010import com .google .common .io .BaseEncoding ;
11- import java .nio .charset .StandardCharsets ;
12- import java .security .KeyStore ;
13- import java .util .concurrent .atomic .AtomicBoolean ;
1411import org .seedstack .coffig .Coffig ;
1512import org .seedstack .coffig .spi .ConfigFunction ;
1613import org .seedstack .coffig .spi .ConfigFunctionHolder ;
1916import org .seedstack .seed .crypto .CryptoConfig ;
2017import org .seedstack .seed .crypto .EncryptionService ;
2118
19+ import java .nio .charset .StandardCharsets ;
20+ import java .security .KeyStore ;
21+ import java .util .Optional ;
22+ import java .util .concurrent .atomic .AtomicBoolean ;
23+
2224public class DecryptFunction implements ConfigFunctionHolder {
2325 private final AtomicBoolean initInProgress = new AtomicBoolean (false );
24- private EncryptionServiceFactory encryptionServiceFactory ;
25- private CryptoConfig .KeyStoreConfig masterKeyStoreConfig ;
26- private Exception storedException ;
26+ private volatile EncryptionService encryptionService ;
27+ private Coffig coffig ;
2728
2829 @ Override
2930 public void initialize (Coffig coffig ) {
31+ this .coffig = coffig ;
3032 try {
3133 initInProgress .set (true );
32- coffig .getOptional (CryptoConfig .KeyStoreConfig .class , "crypto.keystores.master" ).ifPresent (cfg -> {
33- try {
34- KeyStore keyStore = new KeyStoreLoader ().load (CryptoConfig .MASTER_KEY_STORE_NAME , cfg );
35- encryptionServiceFactory = new EncryptionServiceFactory (keyStore );
36- masterKeyStoreConfig = cfg ;
37- } catch (Exception e ) {
38- storedException = e ;
39- }
40- });
4134 } finally {
4235 initInProgress .set (false );
4336 }
@@ -50,21 +43,21 @@ public ConfigurationComponent fork() {
5043
5144 @ ConfigFunction
5245 String decrypt (String alias , String value ) {
53- if (initInProgress .get ()) {
54- // Cannot decrypt anything during initialization phase
55- return value ;
56- } else {
57- if (encryptionServiceFactory == null ) {
58- if (storedException != null ) {
59- throw SeedException .wrap (storedException , CryptoErrorCode .MISSING_MASTER_KEYSTORE );
60- } else {
61- throw SeedException .createNew (CryptoErrorCode .MISSING_MASTER_KEYSTORE );
46+ if (encryptionService == null ) {
47+ synchronized (this ) {
48+ if (encryptionService == null ) {
49+ Optional <CryptoConfig .KeyStoreConfig > optional = coffig .getOptional (CryptoConfig .KeyStoreConfig .class , "crypto.keystores.master" );
50+ if (optional .isPresent ()) {
51+ CryptoConfig .KeyStoreConfig cfg = optional .get ();
52+ KeyStore keyStore = new KeyStoreLoader ().load (CryptoConfig .MASTER_KEY_STORE_NAME , cfg );
53+ EncryptionServiceFactory encryptionServiceFactory = new EncryptionServiceFactory (keyStore );
54+ encryptionService = CryptoPlugin .getMasterEncryptionService (encryptionServiceFactory , cfg , alias );
55+ } else {
56+ throw SeedException .createNew (CryptoErrorCode .MISSING_MASTER_KEYSTORE );
57+ }
6258 }
6359 }
64- EncryptionService encryptionService = CryptoPlugin .getMasterEncryptionService (encryptionServiceFactory ,
65- masterKeyStoreConfig ,
66- alias );
67- return new String (encryptionService .decrypt (BaseEncoding .base16 ().decode (value )), StandardCharsets .UTF_8 );
6860 }
61+ return new String (encryptionService .decrypt (BaseEncoding .base16 ().decode (value )), StandardCharsets .UTF_8 );
6962 }
7063}
0 commit comments