Skip to content

Commit 75440da

Browse files
committed
Adapt interface changes for Vault#load.
1 parent 1fb18c4 commit 75440da

File tree

5 files changed

+58
-40
lines changed

5 files changed

+58
-40
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright (c) 2025 shift7 GmbH. All rights reserved.
3+
*/
4+
5+
package cloud.katta.crypto.uvf;
6+
7+
import ch.cyberduck.core.Host;
8+
import ch.cyberduck.core.LoginOptions;
9+
import ch.cyberduck.core.exception.LoginCanceledException;
10+
import ch.cyberduck.core.vault.JWKCallback;
11+
import ch.cyberduck.core.vault.JWKCredentials;
12+
13+
import com.fasterxml.jackson.core.JsonProcessingException;
14+
import com.nimbusds.jose.jwk.JWK;
15+
16+
public class UvfJWKCallback implements JWKCallback {
17+
18+
private final JWK key;
19+
20+
public UvfJWKCallback(final JWK key) throws JsonProcessingException {
21+
this.key = key;
22+
}
23+
24+
@Override
25+
public void close(final String input) {
26+
//
27+
}
28+
29+
@Override
30+
public JWKCredentials prompt(final Host bookmark, final String title, final String reason, final LoginOptions options) throws LoginCanceledException {
31+
return new JWKCredentials(key);
32+
}
33+
}

hub/src/main/java/cloud/katta/crypto/uvf/UvfMetadataPayloadPasswordCallback.java

Lines changed: 0 additions & 32 deletions
This file was deleted.

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,11 @@ public AbstractVault create(final Session<?> session, final String region, final
151151
*
152152
* @param session Hub Connection
153153
* @param prompt Return user keys
154+
* @param metadata metadata
154155
* @return Vault configuration with storage connection
155156
*/
156157
@Override
157-
public HubUVFVault load(final Session<?> session, final PasswordCallback prompt) throws BackgroundException {
158+
public HubUVFVault load(final Session<?> session, final PasswordCallback prompt, final VaultMetadataProvider metadata) throws BackgroundException {
158159
log.debug("Connect to {}", storage);
159160
try {
160161
storage.open(ProxyFactory.get(), new DisabledHostKeyCallback(), login, new DisabledCancelCallback());
@@ -165,7 +166,7 @@ public HubUVFVault load(final Session<?> session, final PasswordCallback prompt)
165166
}
166167
log.debug("Initialize vault {}", this);
167168
// Initialize cryptors
168-
super.load(storage, prompt);
169+
super.load(storage, prompt, metadata);
169170
return this;
170171
}
171172

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,26 @@
2222
import org.apache.logging.log4j.LogManager;
2323
import org.apache.logging.log4j.Logger;
2424

25+
import java.nio.charset.StandardCharsets;
2526
import java.text.MessageFormat;
27+
import java.util.Base64;
2628
import java.util.EnumSet;
2729

2830
import cloud.katta.client.ApiException;
2931
import cloud.katta.client.api.VaultResourceApi;
3032
import cloud.katta.client.model.VaultDto;
3133
import cloud.katta.core.DeviceSetupCallback;
34+
import cloud.katta.crypto.uvf.UvfAccessTokenPayload;
35+
import cloud.katta.crypto.uvf.UvfJWKCallback;
3236
import cloud.katta.crypto.uvf.UvfMetadataPayload;
33-
import cloud.katta.crypto.uvf.UvfMetadataPayloadPasswordCallback;
37+
import cloud.katta.crypto.uvf.VaultIdMetadataUVFProvider;
3438
import cloud.katta.protocols.hub.exceptions.HubExceptionMappingService;
3539
import cloud.katta.workflows.VaultServiceImpl;
3640
import cloud.katta.workflows.exceptions.AccessException;
3741
import cloud.katta.workflows.exceptions.SecurityFailure;
3842
import com.fasterxml.jackson.core.JsonProcessingException;
43+
import com.nimbusds.jose.JOSEException;
44+
import com.nimbusds.jose.jwk.OctetSequenceKey;
3945

4046
public class HubVaultListService implements ListService {
4147
private static final Logger log = LogManager.getLogger(HubVaultListService.class);
@@ -69,7 +75,12 @@ public AttributedList<Path> list(final Path directory, final ListProgressListene
6975
final Path bucket = new Path(vaultMetadata.storage().getDefaultPath(), EnumSet.of(Path.Type.directory, Path.Type.volume),
7076
new PathAttributes().setDisplayname(vaultMetadata.storage().getNickname()));
7177
try {
72-
final HubUVFVault vault = new HubUVFVault(storage, bucket, prompt).load(session, new UvfMetadataPayloadPasswordCallback(vaultMetadata.toJSON()));
78+
final UvfAccessTokenPayload accessToken = vaultService.getVaultAccessTokenJWE(vaultDto.getId(), session.getUserKeys(setup));
79+
final OctetSequenceKey rawMemberKey = UvfMetadataPayload.UniversalVaultFormatJWKS.memberKeyFromRawKey(Base64.getDecoder().decode(accessToken.key()));
80+
final HubUVFVault vault = new HubUVFVault(storage, bucket, prompt).load(session, new UvfJWKCallback(rawMemberKey), new VaultIdMetadataUVFProvider(
81+
vaultDto.getId(), UvfMetadataPayload.createKeys(), vaultDto.getUvfMetadataFile().getBytes(StandardCharsets.US_ASCII),
82+
vaultMetadata.computeRootDirUvf(), vaultMetadata.computeRootDirIdHash()
83+
));
7384
log.info("Loaded vault {}", vault);
7485
registry.add(vault);
7586
vaults.add(vault.getHome());
@@ -78,7 +89,7 @@ public AttributedList<Path> list(final Path directory, final ListProgressListene
7889
catch(VaultUnlockCancelException e) {
7990
log.warn("Skip vault {} with failure {} loading", vaultDto, e);
8091
}
81-
catch(JsonProcessingException e) {
92+
catch(JsonProcessingException | JOSEException e) {
8293
throw new SecurityFailure(e);
8394
}
8495
}

hub/src/test/java/cloud/katta/crypto/uvf/UvfMetadataPayloadTest.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import ch.cyberduck.core.AlphanumericRandomStringService;
99
import ch.cyberduck.core.Host;
1010
import ch.cyberduck.core.Path;
11+
import ch.cyberduck.core.TestProtocol;
1112
import ch.cyberduck.core.cryptomator.impl.uvf.CryptoVault;
1213
import ch.cyberduck.core.cryptomator.random.FastSecureRandomProvider;
1314
import ch.cyberduck.core.exception.BackgroundException;
@@ -169,10 +170,14 @@ void testUVFMasterkeyFromUvfMetadataPayload() throws JsonProcessingException {
169170
}
170171

171172
@Test
172-
void testUvfVaultLoadFromMetadataPayload() throws JsonProcessingException, BackgroundException {
173+
void testUvfVaultLoadFromMetadataPayload() throws JsonProcessingException, BackgroundException, JOSEException {
173174
final UvfMetadataPayload uvfMetadataPayload = UvfMetadataPayload.create();
175+
final UvfMetadataPayload.UniversalVaultFormatJWKS keys = UvfMetadataPayload.createKeys();
176+
final UUID vaultId = UUID.randomUUID();
177+
final VaultIdMetadataUVFProvider provider = new VaultIdMetadataUVFProvider(new Host(new TestProtocol()), vaultId, keys, uvfMetadataPayload);
174178
final CryptoVault uvfVault = new CryptoVault(new Path("/", EnumSet.of(AbstractPath.Type.directory)));
175-
uvfVault.load(new HubSession(new Host(new HubProtocol()), new DisabledX509TrustManager(), new DefaultX509KeyManager()),
176-
new UvfMetadataPayloadPasswordCallback(uvfMetadataPayload));
179+
final Host host = new Host(new HubProtocol());
180+
uvfVault.load(new HubSession(host, new DisabledX509TrustManager(), new DefaultX509KeyManager()),
181+
new UvfJWKCallback(keys.memberKey()), provider);
177182
}
178183
}

0 commit comments

Comments
 (0)