Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion spi/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm</artifactId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,98 +1,61 @@
package org.cryptomator.hub.persistence.entities;
package org.cryptomator.hub.entities;

import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.panache.common.Parameters;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EntityNotFoundException;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MapsId;
import javax.persistence.NamedQuery;
import javax.persistence.NoResultException;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Objects;

@Entity
@Table(name = "access")
@NamedQuery(name = "Access.get",
query = """
SELECT a
FROM Access a
WHERE a.device.id = :deviceId
AND a.device.owner.id = :userId
AND a.id.vaultId = :vaultId
""")
@NamedQuery(name = "Access.get", query = """
SELECT a
FROM Access a
WHERE a.device.id = :deviceId
AND a.device.owner.id = :userId
AND a.id.vaultId = :vaultId
""")
@NamedQuery(name = "Access.revokeDevice", query = "DELETE FROM Access a WHERE a.id.deviceId = :deviceId AND a.id.vaultId = :vaultId")
@NamedQuery(name = "Access.revokeUser",
query = """
DELETE
FROM Access a
WHERE a.id.vaultId = :vaultId
AND a.id.deviceId IN (SELECT d.id FROM Device d WHERE d.owner.id = :userId)
""")
public class Access {
@NamedQuery(name = "Access.revokeUser", query = """
DELETE
FROM Access a
WHERE a.id.vaultId = :vaultId
AND a.id.deviceId IN (SELECT d.id FROM Device d WHERE d.owner.id = :userId)
""")
public class Access extends PanacheEntityBase {

// FIXME @ManyToOne(...cascade = {CascadeType.REMOVE}) doesn't add 'ON DELETE CASCADE' to foreign keys

@EmbeddedId
private AccessId id = new AccessId();
public AccessId id = new AccessId();

@ManyToOne(optional = false, cascade = {CascadeType.REMOVE})
@MapsId("deviceId")
@JoinColumn(name = "device_id")
private Device device;
public Device device;

@ManyToOne(optional = false, cascade = {CascadeType.REMOVE})
@MapsId("vaultId")
@JoinColumn(name = "vault_id")
private Vault vault;
public Vault vault;

@Column(name = "device_specific_masterkey", nullable = false)
private String deviceSpecificMasterkey;
public String deviceSpecificMasterkey;

@Column(name = "ephemeral_public_key", nullable = false)
private String ephemeralPublicKey;

public AccessId getId() {
return id;
}

public void setId(AccessId id) {
this.id = id;
}

public Device getDevice() {
return device;
}

public void setDevice(Device device) {
this.device = device;
}

public Vault getVault() {
return vault;
}

public void setVault(Vault vault) {
this.vault = vault;
}

public String getDeviceSpecificMasterkey() {
return deviceSpecificMasterkey;
}

public void setDeviceSpecificMasterkey(String deviceSpecificMasterkey) {
this.deviceSpecificMasterkey = deviceSpecificMasterkey;
}

public String getEphemeralPublicKey() {
return ephemeralPublicKey;
}

public void setEphemeralPublicKey(String ephemeralPublicKey) {
this.ephemeralPublicKey = ephemeralPublicKey;
}
public String ephemeralPublicKey;

@Override
public boolean equals(Object o) {
Expand All @@ -114,8 +77,8 @@ public int hashCode() {
public String toString() {
return "Access{" +
"id=" + id +
", device=" + device.getId() +
", vault=" + vault.getId() +
", device=" + device.id +
", vault=" + vault.id +
", deviceSpecificMasterkey='" + deviceSpecificMasterkey + '\'' +
'}';
}
Expand Down Expand Up @@ -158,4 +121,31 @@ public int hashCode() {
return Objects.hash(deviceId, vaultId);
}
}

// --- data layer queries ---

public static Access unlock(String vaultId, String deviceId, String userId) {
try {
return find("#Access.get", Parameters.with("deviceId", deviceId).and("vaultId", vaultId).and("userId", userId)).firstResult();
} catch (NoResultException e) {
return null;
}
}

public static void deleteDeviceAccess(String vaultId, String deviceId) {
//TODO Replace with PanacheEntityBase.delete(...) once https://github.com/quarkusio/quarkus/issues/20758 is fixed
int affected = getEntityManager().createNamedQuery("Access.revokeDevice").setParameter("vaultId", vaultId).setParameter("deviceId", deviceId).executeUpdate();
if (affected == 0) {
throw new EntityNotFoundException("Access(vault: " + vaultId + ", device: " + deviceId + ") not found");
}
}

public static void deleteUserAccess(String vaultId, String userId) {
//TODO Replace with PanacheEntityBase.delete(...) once https://github.com/quarkusio/quarkus/issues/20758 is fixed
int affected = getEntityManager().createNamedQuery("Access.revokeUser").setParameter("vaultId", vaultId).setParameter("userId", userId).executeUpdate();
if (affected == 0) {
throw new EntityNotFoundException("Access(vault: " + vaultId + ", user: " + userId + ") not found");
}
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package org.cryptomator.hub.persistence.entities;
package org.cryptomator.hub.entities;

import io.quarkus.hibernate.orm.panache.PanacheEntityBase;

import javax.persistence.CascadeType;
import javax.persistence.Column;
Expand All @@ -15,71 +17,35 @@

@Entity
@Table(name = "device")
public class Device {
public class Device extends PanacheEntityBase {

@Id
@Column(name = "id", nullable = false)
private String id;
public String id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", updatable = false, nullable = false)
private User owner;
public User owner;

@OneToMany(mappedBy = "device", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<Access> access = new HashSet<>();
public Set<Access> access = new HashSet<>();

@Column(name = "name", nullable = false)
private String name;
public String name;

@Column(name = "publickey", nullable = false)
private String publickey;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public User getOwner() {
return owner;
}

public void setOwner(User owner) {
this.owner = owner;
}

public Set<Access> getAccess() {
return access;
}
public String publickey;

public void setAccess(Set<Access> access) {
this.access.clear();
this.access.addAll(access);
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPublickey() {
return publickey;
}

public void setPublickey(String publickey) {
this.publickey = publickey;
}

@Override
public String toString() {
return "Device{" +
"id='" + id + '\'' +
", owner=" + owner.getId() +
", owner=" + owner.id +
", name='" + name + '\'' +
", publickey='" + publickey + '\'' +
'}';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
package org.cryptomator.hub.persistence.entities;
package org.cryptomator.hub.entities;

import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.panache.common.Parameters;

import javax.persistence.CascadeType;
import javax.persistence.Column;
Expand All @@ -9,12 +12,12 @@
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

@Entity
@Table(name = "user")
@NamedQuery(name = "User.count", query = "SELECT COUNT(u) FROM User u")
@NamedQuery(name = "User.includingDevices", query = "SELECT u FROM User u LEFT JOIN FETCH u.devices")
@NamedQuery(name = "User.includingDevicesAndVaults",
query = """
Expand All @@ -32,55 +35,31 @@
LEFT JOIN FETCH a.vault
WHERE u.id = :userId
""")
public class User {
public class User extends PanacheEntityBase {

@Id
@Column(name = "id", nullable = false)
private String id;
public String id;

@OneToMany(mappedBy = "owner", cascade = {CascadeType.PERSIST}, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<Device> devices = new HashSet<>();
public Set<Device> devices = new HashSet<>();

@OneToMany(mappedBy = "owner", cascade = {CascadeType.PERSIST}, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<Vault> vaults = new HashSet<>();
public Set<Vault> vaults = new HashSet<>();

@Column(name = "name", nullable = false)
private String name;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public Set<Device> getDevices() {
return devices;
}
public String name;

public void setDevices(Set<Device> devices) {
this.devices.clear();
this.devices.addAll(devices);
}

public Set<Vault> getVaults() {
return vaults;
}

public void setVaults(Set<Vault> vaults) {
this.vaults.clear();
this.vaults.addAll(vaults);
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "User{" +
Expand All @@ -106,4 +85,22 @@ public boolean equals(Object o) {
public int hashCode() {
return Objects.hash(id, devices, vaults, name);
}*/

// --- data layer queries ---

public static User findById(String id) {
return PanacheEntityBase.findById(id);
}

public static List<User> getAllWithDevices() {
return list("#User.includingDevices");
}

public static List<User> getAllWithDevicesAndAccess() {
return list("#User.includingDevicesAndVaults");
}

public static User getWithDevicesAndAccess(String userId) {
return find("#User.withDevicesAndAccess", Parameters.with("userId", userId)).firstResult();
}
}
Loading