Skip to content

Commit cd73a58

Browse files
committed
Lookup user keys only once when iterating vaults.
1 parent 77da88c commit cd73a58

File tree

4 files changed

+29
-38
lines changed

4 files changed

+29
-38
lines changed

hub/src/main/java/ch/iterate/hub/protocols/hub/HubStorageVaultSyncSchedulerService.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import ch.iterate.hub.client.model.VaultDto;
3131
import ch.iterate.hub.core.FirstLoginDeviceSetupCallback;
3232
import ch.iterate.hub.core.FirstLoginDeviceSetupCallbackFactory;
33+
import ch.iterate.hub.crypto.UserKeys;
3334
import ch.iterate.hub.crypto.uvf.VaultMetadataJWEBackendDto;
3435
import ch.iterate.hub.protocols.hub.exceptions.HubExceptionMappingService;
3536
import ch.iterate.hub.workflows.UserKeysServiceImpl;
@@ -62,6 +63,7 @@ public List<VaultDto> operate(final PasswordCallback callback) throws Background
6263
final FirstLoginDeviceSetupCallback prompt = FirstLoginDeviceSetupCallbackFactory.get();
6364
log.info("Bookmark sync for {}", session.getHost());
6465
try {
66+
final UserKeys userKeys = new UserKeysServiceImpl(session).getUserKeys(session.getHost(), prompt);
6567
final List<VaultDto> vaults = new VaultResourceApi(session.getClient()).apiVaultsAccessibleGet(null);
6668
for(final VaultDto vaultDto : vaults) {
6769
try {
@@ -79,7 +81,9 @@ public List<VaultDto> operate(final PasswordCallback callback) throws Background
7981
}
8082
else {
8183
log.info("Adding bookmark for vault {} in hub {}", vaultDto, session.getHost());
82-
final Host bookmark = this.toBookmark(vaultId, prompt);
84+
// Find storage configuration in vault metadata
85+
final VaultMetadataJWEBackendDto vaultMetadata = new VaultServiceImpl(session).getVaultMetadataJWE(vaultId, userKeys).storage();
86+
final Host bookmark = toBookmark(session.getHost(), vaultId, vaultMetadata);
8387
if(bookmark.getCredentials().isPasswordAuthentication()) {
8488
log.warn("Save static access tokens for {} in keychain", vaultDto);
8589
final HostPasswordStore keychain = PasswordStoreFactory.get();
@@ -93,29 +97,15 @@ public List<VaultDto> operate(final PasswordCallback callback) throws Background
9397
catch(AccessDeniedException e) {
9498
log.info("Access not granted yet, ignoring vault {} ({}) for hub {}", vaultDto.getName(), vaultDto.getId(), session.getHost(), e);
9599
}
96-
catch(AccessException | SecurityFailure e) {
97-
throw new InteroperabilityException(LocaleFactory.localizedString("Login failed", "Credentials"), e);
98-
}
99100
}
100101
return vaults;
101102
}
102103
catch(ApiException e) {
103104
log.error("Scheduler for {}: Syncing vaults failed.", session, e);
104105
throw new HubExceptionMappingService().map(e);
105106
}
106-
}
107-
108-
public Host toBookmark(final UUID vaultId, final FirstLoginDeviceSetupCallback prompt) throws AccessException, BackgroundException, SecurityFailure {
109-
final UserKeysServiceImpl userKeysService = new UserKeysServiceImpl(session);
110-
final VaultServiceImpl vaultService = new VaultServiceImpl(session);
111-
// Find storage configuration in vault metadata
112-
try {
113-
final VaultMetadataJWEBackendDto vaultMetadata = vaultService.getVaultMetadataJWE(vaultId,
114-
userKeysService.getUserKeys(session.getHost(), prompt)).storage();
115-
return toBookmark(session.getHost(), vaultId, vaultMetadata);
116-
}
117-
catch(ApiException e) {
118-
throw new HubExceptionMappingService().map(e);
107+
catch(AccessException | SecurityFailure e) {
108+
throw new InteroperabilityException(LocaleFactory.localizedString("Login failed", "Credentials"), e);
119109
}
120110
}
121111

hub/src/main/java/ch/iterate/hub/workflows/CreateVaultService.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import ch.iterate.hub.client.model.CreateS3STSBucketDto;
3535
import ch.iterate.hub.client.model.UserDto;
3636
import ch.iterate.hub.client.model.VaultDto;
37-
import ch.iterate.hub.core.FirstLoginDeviceSetupCallbackFactory;
3837
import ch.iterate.hub.crypto.UserKeys;
3938
import ch.iterate.hub.crypto.uvf.UvfMetadataPayload;
4039
import ch.iterate.hub.crypto.uvf.VaultMetadataJWEAutomaticAccessGrantDto;
@@ -67,24 +66,21 @@ public CreateVaultService(final HubSession hubSession) {
6766
this.hubSession = hubSession;
6867
}
6968

70-
public void createVault(final StorageProfileDtoWrapper storageProfileWrapper, final CreateVaultModel vaultModel) throws ApiException, AccessException, SecurityFailure, BackgroundException {
69+
public void createVault(final UserKeys userKeys, final StorageProfileDtoWrapper storageProfileWrapper, final CreateVaultModel vaultModel) throws ApiException, AccessException, SecurityFailure, BackgroundException {
7170
try {
72-
// prepare vault creation
73-
final UserKeys userKeys = new UserKeysServiceImpl(hubSession).getUserKeys(
74-
hubSession.getHost(), FirstLoginDeviceSetupCallbackFactory.get());
75-
7671
final UvfMetadataPayload.UniversalVaultFormatJWKS jwks = UvfMetadataPayload.createKeys();
72+
final VaultMetadataJWEBackendDto backendDto = new VaultMetadataJWEBackendDto()
73+
.provider(storageProfileWrapper.getId().toString())
74+
.defaultPath(storageProfileWrapper.getStsEndpoint() != null ? storageProfileWrapper.getBucketPrefix() + vaultModel.vaultId() : vaultModel.bucketName())
75+
.nickname(vaultModel.vaultName())
76+
.username(vaultModel.accessKeyId())
77+
.password(vaultModel.secretKey());
78+
final VaultMetadataJWEAutomaticAccessGrantDto accessGrantDto = new VaultMetadataJWEAutomaticAccessGrantDto()
79+
.enabled(vaultModel.automaticAccessGrant())
80+
.maxWotDepth(vaultModel.maxWotLevel());
7781
final UvfMetadataPayload metadataJWE = UvfMetadataPayload.create()
78-
.withStorage(new VaultMetadataJWEBackendDto()
79-
.provider(storageProfileWrapper.getId().toString())
80-
.defaultPath(storageProfileWrapper.getStsEndpoint() != null ? storageProfileWrapper.getBucketPrefix() + vaultModel.vaultId() : vaultModel.bucketName())
81-
.nickname(vaultModel.vaultName())
82-
.username(vaultModel.accessKeyId())
83-
.password(vaultModel.secretKey()))
84-
.withAutomaticAccessGrant(new VaultMetadataJWEAutomaticAccessGrantDto()
85-
.enabled(vaultModel.automaticAccessGrant())
86-
.maxWotDepth(vaultModel.maxWotLevel())
87-
);
82+
.withStorage(backendDto)
83+
.withAutomaticAccessGrant(accessGrantDto);
8884
log.debug("Created metadata JWE {}", metadataJWE);
8985
final String uvfMetadataFile = metadataJWE.encrypt(
9086
String.format("%s/api", new HostUrlProvider(false, true).get(hubSession.getHost())),

hub/src/test/java/ch/iterate/hub/core/AbstractHubSynchronizeTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.apache.commons.lang3.StringUtils;
3030
import org.apache.logging.log4j.LogManager;
3131
import org.apache.logging.log4j.Logger;
32-
import org.junit.jupiter.api.Assertions;
3332
import org.junit.jupiter.params.ParameterizedTest;
3433
import org.openapitools.jackson.nullable.JsonNullableModule;
3534

@@ -45,6 +44,7 @@
4544
import ch.iterate.hub.client.model.StorageProfileDto;
4645
import ch.iterate.hub.client.model.StorageProfileS3Dto;
4746
import ch.iterate.hub.client.model.StorageProfileS3STSDto;
47+
import ch.iterate.hub.crypto.UserKeys;
4848
import ch.iterate.hub.model.StorageProfileDtoWrapper;
4949
import ch.iterate.hub.protocols.hub.HubSession;
5050
import ch.iterate.hub.protocols.hub.HubStorageProfileListService;
@@ -55,6 +55,8 @@
5555
import ch.iterate.hub.testsetup.HubTestConfig;
5656
import ch.iterate.hub.testsetup.MethodIgnorableSource;
5757
import ch.iterate.hub.workflows.CreateVaultService;
58+
import ch.iterate.hub.workflows.UserKeysServiceImpl;
59+
import ch.iterate.hub.workflows.VaultServiceImpl;
5860
import com.fasterxml.jackson.annotation.JsonInclude;
5961
import com.fasterxml.jackson.databind.ObjectMapper;
6062

@@ -176,7 +178,7 @@ public void test02AddStorageProfile(final HubTestConfig hubTestConfig) throws Ex
176178
final int numProtocols = ProtocolFactory.get().find().size();
177179

178180
log.info("Add storage profile for UUID {}", uuid);
179-
Assertions.assertNull(ProtocolFactory.get().forName(uuid.toString().toLowerCase()));
181+
assertNull(ProtocolFactory.get().forName(uuid.toString().toLowerCase()));
180182

181183
final StorageProfileDto storageProfile = storageProfiles.get(0);
182184
// client-generated code is not subclassed...
@@ -226,11 +228,13 @@ public void test03AddVault(final HubTestConfig config) throws Exception {
226228

227229
log.info("Creating vault in {}", hubSession);
228230
final UUID vaultId = UUID.randomUUID();
229-
new CreateVaultService(hubSession).createVault(storageProfileWrapper, new CreateVaultService.CreateVaultModel(
231+
final UserKeys userKeys = new UserKeysServiceImpl(hubSession).getUserKeys(hubSession.getHost(), FirstLoginDeviceSetupCallback.disabled);
232+
new CreateVaultService(hubSession).createVault(userKeys, storageProfileWrapper, new CreateVaultService.CreateVaultModel(
230233
vaultId, "vault", null,
231234
config.vault.storageProfileId, config.vault.username, config.vault.password, config.vault.bucketName, config.vault.region, true, 3));
232235
log.info("Getting vault bookmark for vault {}", vaultId);
233-
final Host vaultBookmark = new HubStorageVaultSyncSchedulerService(hubSession).toBookmark(vaultId, FirstLoginDeviceSetupCallback.disabled);
236+
final Host vaultBookmark = HubStorageVaultSyncSchedulerService.toBookmark(hubSession.getHost(), vaultId,
237+
new VaultServiceImpl(hubSession).getVaultMetadataJWE(vaultId, userKeys).storage());
234238
log.info("Using vault bookmark {}", vaultBookmark);
235239

236240
final DefaultVaultRegistry vaultRegistry = new DefaultVaultRegistry(new DisabledPasswordCallback());

hub/src/test/java/ch/iterate/hub/workflows/AbstractHubWorkflowTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ public void testHubWorkflow(final HubTestConfig config) throws Exception {
6565
// upload template (STS: create bucket first, static: existing bucket)
6666
// TODO test with multiple wot levels?
6767

68-
new CreateVaultService(hubSession).createVault(storageProfileWrapper,
68+
final UserKeys userKeys = new UserKeysServiceImpl(hubSession).getUserKeys(hubSession.getHost(), FirstLoginDeviceSetupCallback.disabled);
69+
new CreateVaultService(hubSession).createVault(userKeys, storageProfileWrapper,
6970
new CreateVaultService.CreateVaultModel(vaultId,
7071
"vault", null,
7172
config.vault.storageProfileId, config.vault.username, config.vault.password, config.vault.bucketName,

0 commit comments

Comments
 (0)