3232import java .security .InvalidAlgorithmParameterException ;
3333import java .security .InvalidKeyException ;
3434import java .security .NoSuchAlgorithmException ;
35- import java .security .NoSuchProviderException ;
3635import java .security .spec .InvalidKeySpecException ;
3736import java .util .HashMap ;
3837import java .util .Map ;
@@ -112,6 +111,13 @@ public ByteSizeValue chunkSize() {
112111 * Returns a new encrypted repository factory
113112 */
114113 public static Repository .Factory newRepositoryFactory (final Settings settings ) {
114+ final Map <String , char []> cachedRepositoryPasswords = new HashMap <>();
115+ for (String repositoryName : ENCRYPTION_PASSWORD_SETTING .getNamespaces (settings )) {
116+ Setting <SecureString > encryptionPasswordSetting = ENCRYPTION_PASSWORD_SETTING
117+ .getConcreteSettingForNamespace (repositoryName );
118+ SecureString encryptionPassword = encryptionPasswordSetting .get (settings );
119+ cachedRepositoryPasswords .put (repositoryName , encryptionPassword .getChars ());
120+ }
115121 return new Repository .Factory () {
116122
117123 @ Override
@@ -125,15 +131,11 @@ public Repository create(RepositoryMetaData metaData, Function<String, Repositor
125131 if (Strings .hasLength (delegateType ) == false ) {
126132 throw new IllegalArgumentException (DELEGATE_TYPE .getKey () + " must be set" );
127133 }
128- Setting <SecureString > encryptionPasswordSetting = ENCRYPTION_PASSWORD_SETTING
129- .getConcreteSettingForNamespace (metaData .name ());
130- final SecretKey secretKey ;
131- try (SecureString encryptionPassword = encryptionPasswordSetting .get (settings )) {
132- if (encryptionPassword .length () == 0 ) {
133- throw new IllegalArgumentException (encryptionPasswordSetting .getKey () + " must be set" );
134- }
135- secretKey = generateSecretKeyFromPassword (encryptionPassword .getChars ());
134+ if (false == cachedRepositoryPasswords .containsKey (metaData .name ())) {
135+ throw new IllegalArgumentException (
136+ ENCRYPTION_PASSWORD_SETTING .getConcreteSettingForNamespace (metaData .name ()).getKey () + " must be set" );
136137 }
138+ SecretKey secretKey = generateSecretKeyFromPassword (cachedRepositoryPasswords .get (metaData .name ()));
137139 Repository .Factory factory = typeLookup .apply (delegateType );
138140 Repository delegatedRepository = factory .create (new RepositoryMetaData (metaData .name (),
139141 delegateType , metaData .settings ()));
0 commit comments