Skip to content

Commit b23ef58

Browse files
committed
Make user keys short-lived.
1 parent 161c847 commit b23ef58

File tree

4 files changed

+24
-13
lines changed

4 files changed

+24
-13
lines changed

hub/src/main/java/cloud/katta/protocols/hub/HubSession.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,11 @@ public class HubSession extends HttpSession<HubApiClient> {
8989

9090
private UserDto me;
9191
private ConfigDto config;
92-
private UserKeys userKeys;
93-
private AttributedList<Path> vaults;
92+
93+
private final ExpiringObjectHolder<UserKeys> userKeys
94+
= new ExpiringObjectHolder<>(preferences.getLong("katta.userkeys.ttl"));
95+
96+
private HubVaultListService vaults;
9497

9598
public HubSession(final Host host, final X509TrustManager trust, final X509KeyManager key) {
9699
super(host, trust, key);
@@ -166,7 +169,7 @@ public void login(final LoginCallback prompt, final CancelCallback cancel) throw
166169
// Ensure device key is available
167170
final DeviceSetupCallback setup = prompt.getFeature(DeviceSetupCallback.class);
168171
log.debug("Configured with setup prompt {}", setup);
169-
userKeys = this.pair(setup);
172+
userKeys.set(this.pair(setup));
170173
final List<StorageProfileDto> storageProfileDtos = new StorageProfileResourceApi(client).apiStorageprofileGet(false);
171174
for(StorageProfileDto storageProfileDto : storageProfileDtos) {
172175
final StorageProfileDtoWrapper storageProfile = StorageProfileDtoWrapper.coerce(storageProfileDto);
@@ -184,8 +187,7 @@ public void login(final LoginCallback prompt, final CancelCallback cancel) throw
184187
throw new InteroperabilityException(String.format("Unsupported storage configuration %s", storageProfile.getProtocol().name()));
185188
}
186189
}
187-
// Ensure vaults are registered
188-
vaults = new HubVaultListService(this, prompt).list(Home.root(), new DisabledListProgressListener());
190+
vaults = new HubVaultListService(this, prompt);
189191
}
190192
catch(ApiException e) {
191193
throw new HubExceptionMappingService().map(e);
@@ -230,18 +232,18 @@ public UserDto getMe() {
230232
*
231233
* @return Destroyed keys after login
232234
*/
233-
public UserKeys getUserKeys() {
234-
return userKeys;
235+
public UserKeys getUserKeys(final DeviceSetupCallback setup) throws BackgroundException {
236+
if(userKeys.get() == null) {
237+
userKeys.set(this.pair(setup));
238+
}
239+
return userKeys.get();
235240
}
236241

237242
@Override
238243
@SuppressWarnings("unchecked")
239244
public <T> T _getFeature(final Class<T> type) {
240245
if(type == ListService.class) {
241-
return (T) (ListService) (Path directory, ListProgressListener listener) -> {
242-
listener.chunk(directory, vaults);
243-
return vaults;
244-
};
246+
return (T) vaults;
245247
}
246248
if(type == Scheduler.class) {
247249
return (T) access;

hub/src/main/java/cloud/katta/protocols/hub/HubUVFVault.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import cloud.katta.client.api.VaultResourceApi;
3838
import cloud.katta.client.model.UserDto;
3939
import cloud.katta.client.model.VaultDto;
40+
import cloud.katta.core.DeviceSetupCallback;
4041
import cloud.katta.crypto.UserKeys;
4142
import cloud.katta.crypto.uvf.UvfMetadataPayload;
4243
import cloud.katta.crypto.uvf.UvfMetadataPayloadPasswordCallback;
@@ -182,7 +183,8 @@ public Path create(final Session<?> session, final String region, final VaultCre
182183
// Upload JWE
183184
log.debug("Grant access to vault {}", vaultDto);
184185
final UserDto userDto = hub.getMe();
185-
final UserKeys userKeys = hub.getUserKeys();
186+
final DeviceSetupCallback setup = prompt.getFeature(DeviceSetupCallback.class);
187+
final UserKeys userKeys = hub.getUserKeys(setup);
186188
vaultResourceApi.apiVaultsVaultIdAccessTokensPost(vaultDto.getId(),
187189
Collections.singletonMap(userDto.getId(), jwks.toOwnerAccessToken().encryptForUser(userKeys.ecdhKeyPair().getPublic())));
188190
// Upload vault template to storage

hub/src/main/java/cloud/katta/protocols/hub/HubVaultListService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import cloud.katta.client.ApiException;
2626
import cloud.katta.client.api.VaultResourceApi;
2727
import cloud.katta.client.model.VaultDto;
28+
import cloud.katta.core.DeviceSetupCallback;
2829
import cloud.katta.crypto.uvf.UvfMetadataPayload;
2930
import cloud.katta.protocols.hub.exceptions.HubExceptionMappingService;
3031
import cloud.katta.workflows.VaultServiceImpl;
@@ -57,7 +58,8 @@ public AttributedList<Path> list(final Path directory, final ListProgressListene
5758
try {
5859
// Find storage configuration in vault metadata
5960
final VaultServiceImpl vaultService = new VaultServiceImpl(session);
60-
final UvfMetadataPayload vaultMetadata = vaultService.getVaultMetadataJWE(vaultDto.getId(), session.getUserKeys());
61+
final DeviceSetupCallback setup = prompt.getFeature(DeviceSetupCallback.class);
62+
final UvfMetadataPayload vaultMetadata = vaultService.getVaultMetadataJWE(vaultDto.getId(), session.getUserKeys(setup));
6163
final HubUVFVault vault = new HubUVFVault(session, vaultDto.getId(), vaultMetadata, prompt);
6264
try {
6365
registry.add(vault.load(session, prompt));

hub/src/test/resources/Katta Server.cyberduckprofile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,10 @@
3838
<false/>
3939
<key>Username Configurable</key>
4040
<false/>
41+
<key>Properties</key>
42+
<dict>
43+
<key>katta.userkeys.ttl</key>
44+
<string>3600</string>
45+
</dict>
4146
</dict>
4247
</plist>

0 commit comments

Comments
 (0)