diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index a5ead6502..17922932a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -12,7 +12,7 @@ on:
env:
NODE_VERSION: 20
- JAVA_VERSION: 17
+ JAVA_VERSION: 21
defaults:
run:
diff --git a/backend/.idea/misc.xml b/backend/.idea/misc.xml
index 82ab2ccf1..e8e9dd894 100644
--- a/backend/.idea/misc.xml
+++ b/backend/.idea/misc.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/backend/README.md b/backend/README.md
index 1337db8b9..383aee786 100644
--- a/backend/README.md
+++ b/backend/README.md
@@ -63,5 +63,5 @@ Tell JIB which executable to use (replace `nerctl` with `podman` etc):
3x smaller but takes longer to build. Docker VM requires sufficient memory during the build:
```shell script
-mvn clean package -Pnative -Dquarkus.container-image.build=true -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-mandrel:22.2-java17 -Dquarkus.container-image.tag=latest
+mvn clean package -Pnative -Dquarkus.container-image.build=true -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-mandrel-builder-image:23.1-java21 -Dquarkus.container-image.tag=latest
```
diff --git a/backend/pom.xml b/backend/pom.xml
index d5e7cf0a6..a94e1a29e 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -7,16 +7,16 @@
1.4.0-SNAPSHOT
- 3.11.0
+ 3.12.1
UTF-8
- 17
+ 21
UTF-8
cryptomator
hub
- 3.2.12.Final
- eclipse-temurin:17-jre
+ 3.8.2
+ eclipse-temurin:21-jre
4.4.0
- 3.1.2
+ 3.2.3
@@ -28,18 +28,6 @@
pom
import
-
-
- org.flywaydb
- flyway-core
- 9.22.3
-
-
-
- io.quarkus
- quarkus-flyway
- 3.3.0
-
diff --git a/backend/src/main/java/org/cryptomator/hub/api/AuditLogResource.java b/backend/src/main/java/org/cryptomator/hub/api/AuditLogResource.java
index 73f93bb61..78dd8832f 100644
--- a/backend/src/main/java/org/cryptomator/hub/api/AuditLogResource.java
+++ b/backend/src/main/java/org/cryptomator/hub/api/AuditLogResource.java
@@ -96,30 +96,19 @@ public interface AuditEventDto {
Instant timestamp();
static AuditEventDto fromEntity(AuditEvent entity) {
- // TODO: refactor to switch in JDK21
- if (entity instanceof AuditEventDeviceRegister evt) {
- return new AuditEventDeviceRegisterDto(evt.id, evt.timestamp, AuditEventDeviceRegister.TYPE, evt.registeredBy, evt.deviceId, evt.deviceName, evt.deviceType);
- } else if (entity instanceof AuditEventDeviceRemove evt) {
- return new AuditEventDeviceRemoveDto(evt.id, evt.timestamp, AuditEventDeviceRemove.TYPE, evt.removedBy, evt.deviceId);
- } else if (entity instanceof AuditEventVaultCreate evt) {
- return new AuditEventVaultCreateDto(evt.id, evt.timestamp, AuditEventVaultCreate.TYPE, evt.createdBy, evt.vaultId, evt.vaultName, evt.vaultDescription);
- } else if (entity instanceof AuditEventVaultUpdate evt) {
- return new AuditEventVaultUpdateDto(evt.id, evt.timestamp, AuditEventVaultUpdate.TYPE, evt.updatedBy, evt.vaultId, evt.vaultName, evt.vaultDescription, evt.vaultArchived);
- } else if (entity instanceof AuditEventVaultAccessGrant evt) {
- return new AuditEventVaultAccessGrantDto(evt.id, evt.timestamp, AuditEventVaultAccessGrant.TYPE, evt.grantedBy, evt.vaultId, evt.authorityId);
- } else if (entity instanceof AuditEventVaultKeyRetrieve evt) {
- return new AuditEventVaultKeyRetrieveDto(evt.id, evt.timestamp, AuditEventVaultKeyRetrieve.TYPE, evt.retrievedBy, evt.vaultId, evt.result);
- } else if (entity instanceof AuditEventVaultMemberAdd evt) {
- return new AuditEventVaultMemberAddDto(evt.id, evt.timestamp, AuditEventVaultMemberAdd.TYPE, evt.addedBy, evt.vaultId, evt.authorityId, evt.role);
- } else if (entity instanceof AuditEventVaultMemberRemove evt) {
- return new AuditEventVaultMemberRemoveDto(evt.id, evt.timestamp, AuditEventVaultMemberRemove.TYPE, evt.removedBy, evt.vaultId, evt.authorityId);
- } else if (entity instanceof AuditEventVaultMemberUpdate evt) {
- return new AuditEventVaultMemberUpdateDto(evt.id, evt.timestamp, AuditEventVaultMemberUpdate.TYPE, evt.updatedBy, evt.vaultId, evt.authorityId, evt.role);
- } else if (entity instanceof AuditEventVaultOwnershipClaim evt) {
- return new AuditEventVaultOwnershipClaimDto(evt.id, evt.timestamp, AuditEventVaultOwnershipClaim.TYPE, evt.claimedBy, evt.vaultId);
- } else {
- throw new UnsupportedOperationException("conversion not implemented for event type " + entity.getClass());
- }
+ return switch (entity) {
+ case AuditEventDeviceRegister evt -> new AuditEventDeviceRegisterDto(evt.id, evt.timestamp, AuditEventDeviceRegister.TYPE, evt.registeredBy, evt.deviceId, evt.deviceName, evt.deviceType);
+ case AuditEventDeviceRemove evt -> new AuditEventDeviceRemoveDto(evt.id, evt.timestamp, AuditEventDeviceRemove.TYPE, evt.removedBy, evt.deviceId);
+ case AuditEventVaultCreate evt -> new AuditEventVaultCreateDto(evt.id, evt.timestamp, AuditEventVaultCreate.TYPE, evt.createdBy, evt.vaultId, evt.vaultName, evt.vaultDescription);
+ case AuditEventVaultUpdate evt -> new AuditEventVaultUpdateDto(evt.id, evt.timestamp, AuditEventVaultUpdate.TYPE, evt.updatedBy, evt.vaultId, evt.vaultName, evt.vaultDescription, evt.vaultArchived);
+ case AuditEventVaultAccessGrant evt -> new AuditEventVaultAccessGrantDto(evt.id, evt.timestamp, AuditEventVaultAccessGrant.TYPE, evt.grantedBy, evt.vaultId, evt.authorityId);
+ case AuditEventVaultKeyRetrieve evt -> new AuditEventVaultKeyRetrieveDto(evt.id, evt.timestamp, AuditEventVaultKeyRetrieve.TYPE, evt.retrievedBy, evt.vaultId, evt.result);
+ case AuditEventVaultMemberAdd evt -> new AuditEventVaultMemberAddDto(evt.id, evt.timestamp, AuditEventVaultMemberAdd.TYPE, evt.addedBy, evt.vaultId, evt.authorityId, evt.role);
+ case AuditEventVaultMemberRemove evt -> new AuditEventVaultMemberRemoveDto(evt.id, evt.timestamp, AuditEventVaultMemberRemove.TYPE, evt.removedBy, evt.vaultId, evt.authorityId);
+ case AuditEventVaultMemberUpdate evt -> new AuditEventVaultMemberUpdateDto(evt.id, evt.timestamp, AuditEventVaultMemberUpdate.TYPE, evt.updatedBy, evt.vaultId, evt.authorityId, evt.role);
+ case AuditEventVaultOwnershipClaim evt -> new AuditEventVaultOwnershipClaimDto(evt.id, evt.timestamp, AuditEventVaultOwnershipClaim.TYPE, evt.claimedBy, evt.vaultId);
+ default -> throw new UnsupportedOperationException("conversion not implemented for event type " + entity.getClass());
+ };
}
}
diff --git a/backend/src/main/java/org/cryptomator/hub/api/AuthorityDto.java b/backend/src/main/java/org/cryptomator/hub/api/AuthorityDto.java
index dcdc6666b..cfe468b25 100644
--- a/backend/src/main/java/org/cryptomator/hub/api/AuthorityDto.java
+++ b/backend/src/main/java/org/cryptomator/hub/api/AuthorityDto.java
@@ -31,14 +31,11 @@ protected AuthorityDto(String id, Type type, String name, String pictureUrl) {
}
static AuthorityDto fromEntity(Authority a) {
- // TODO refactor to JEP 441 in JDK 21
- if (a instanceof User user) {
- return UserDto.justPublicInfo(user);
- } else if (a instanceof Group group) {
- return GroupDto.fromEntity(group);
- } else {
- throw new IllegalStateException("authority is not of type user or group");
- }
+ return switch (a) {
+ case User u -> UserDto.justPublicInfo(u);
+ case Group g -> GroupDto.fromEntity(g);
+ default -> throw new IllegalStateException("authority is not of type user or group");
+ };
}
}
diff --git a/backend/src/main/java/org/cryptomator/hub/api/VaultResource.java b/backend/src/main/java/org/cryptomator/hub/api/VaultResource.java
index 9649d6d26..2acb24c18 100644
--- a/backend/src/main/java/org/cryptomator/hub/api/VaultResource.java
+++ b/backend/src/main/java/org/cryptomator/hub/api/VaultResource.java
@@ -89,7 +89,6 @@ public class VaultResource {
@Operation(summary = "list all accessible vaults", description = "list all vaults that have been shared with the currently logged in user or a group in wich this user is")
public List getAccessible(@Nullable @QueryParam("role") VaultAccess.Role role) {
var currentUserId = jwt.getSubject();
- // TODO refactor to JEP 441 in JDK 21
final Stream resultStream;
if (role == null) {
resultStream = Vault.findAccessibleByUser(currentUserId);
@@ -130,15 +129,10 @@ public List getAllVaults() {
@APIResponse(responseCode = "200")
@APIResponse(responseCode = "403", description = "not a vault owner")
public List getDirectMembers(@PathParam("vaultId") UUID vaultId) {
- return VaultAccess.forVault(vaultId).map(access -> {
- // TODO switch to switch expressions, once we can make Authority sealed
- if (access.authority instanceof User u) {
- return MemberDto.fromEntity(u, access.role);
- } else if (access.authority instanceof Group g) {
- return MemberDto.fromEntity(g, access.role);
- } else {
- throw new IllegalStateException();
- }
+ return VaultAccess.forVault(vaultId).map(access -> switch (access.authority) {
+ case User u -> MemberDto.fromEntity(u, access.role);
+ case Group g -> MemberDto.fromEntity(g, access.role);
+ default -> throw new IllegalStateException();
}).toList();
}
diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties
index 76d81e38d..af3d66e85 100644
--- a/backend/src/main/resources/application.properties
+++ b/backend/src/main/resources/application.properties
@@ -58,7 +58,7 @@ quarkus.datasource.db-kind=postgresql
quarkus.datasource.jdbc.driver=org.postgresql.Driver
quarkus.datasource.jdbc.transaction-requirement=off
quarkus.datasource.jdbc.max-size=16
-quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQL10Dialect
+quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQLDialect
quarkus.hibernate-orm.database.globally-quoted-identifiers=true
quarkus.flyway.migrate-at-start=true
quarkus.flyway.locations=classpath:org/cryptomator/hub/flyway