diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/requests/DeviceRevocationRequest.java b/jams-common/src/main/java/net/jami/jams/common/objects/requests/DeviceRevocationRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..2ef3f7d8514d8efcf6f09f213b394bd6f05fba17 --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/objects/requests/DeviceRevocationRequest.java @@ -0,0 +1,17 @@ +package net.jami.jams.common.objects.requests; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class DeviceRevocationRequest { + + private String owner; + private String deviceId; + + public DeviceRevocationRequest(String username, String deviceId) { + this.owner = owner; + this.deviceId = deviceId; + } +} diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/responses/DeviceRevocationResponse.java b/jams-common/src/main/java/net/jami/jams/common/objects/responses/DeviceRevocationResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..31f8ae30e7467fab1939910275e024aa1cb1da8f --- /dev/null +++ b/jams-common/src/main/java/net/jami/jams/common/objects/responses/DeviceRevocationResponse.java @@ -0,0 +1,19 @@ +package net.jami.jams.common.objects.responses; + +import lombok.Getter; +import lombok.Setter; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@Getter +@Setter +public class DeviceRevocationResponse { + + + private boolean success; + private String errorDetails; + private static final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss'Z'X"); + private String timestamp = dateFormatter.format(new Date()); + +} diff --git a/jams-server/src/main/java/module-info.java b/jams-server/src/main/java/module-info.java index 6024a4383902e5a0f5003b4416d8271996a6bcd7..559226c409985e51337db186cb74624bfd6579b3 100644 --- a/jams-server/src/main/java/module-info.java +++ b/jams-server/src/main/java/module-info.java @@ -10,6 +10,8 @@ module jams.server { requires javassist; requires datastore; requires org.apache.xbean.classloader; + requires org.bouncycastle.pkix; + requires org.bouncycastle.provider; requires jami.nameserver; requires jami.dht; requires nimbus.jose.jwt; diff --git a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java index 0b5640e9213ebf60055e79605a895b8bbd685f7f..673a5b136c2f9a6f42cc06f3dc50017a805b1353 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java @@ -60,7 +60,4 @@ public class RegisterDeviceFlow { return null; } } - - - } diff --git a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RevokeDeviceFlow.java b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RevokeDeviceFlow.java index ea433ee5ed2420848a78507ddfa44a0ac6c5733e..e8d51cc0721fe2072e466c5d88b8c7bbd9803f6c 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RevokeDeviceFlow.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RevokeDeviceFlow.java @@ -1,4 +1,50 @@ package net.jami.jams.server.core.workflows; +import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.dao.StatementElement; +import net.jami.jams.common.dao.StatementList; +import net.jami.jams.common.objects.devices.Device; +import net.jami.jams.common.objects.requests.DeviceRevocationRequest; +import net.jami.jams.common.objects.requests.RevocationRequest; +import net.jami.jams.common.objects.requests.RevocationType; +import net.jami.jams.common.objects.responses.DeviceRevocationResponse; + +import java.math.BigInteger; + +import static net.jami.jams.server.Server.*; +import static net.jami.jams.server.Server.certificateAuthority; + +@Slf4j public class RevokeDeviceFlow { + + public static DeviceRevocationResponse revokeDevice(String username, RevocationRequest request){ + DeviceRevocationResponse response = new DeviceRevocationResponse(); + try { + + StatementList statementList = new StatementList(); + StatementElement st1 = new StatementElement("owner","=",username,"AND"); + StatementElement st2 = new StatementElement("deviceId","=",request.getIdentifier().toString(),""); + statementList.addStatement(st1); + statementList.addStatement(st2); + Device device = dataStore.getDeviceDao().getObjects(statementList).get(0); + if (device == null) { + log.error("Could not find device!"); + return null; + } + + certificateAuthority.revokeCertificate(request); + if (certificateAuthority.getLatestCRL().get().getRevokedCertificates().toArray().length != 0) { + response.setSuccess(true); + } + + //Finally we return the successful response + return response; + } + catch (Exception e){ + log.error("An exception has occurred while trying to revoke a device with error {}", e.getMessage()); + response.setSuccess(false); + response.setErrorDetails(e.getMessage()); + return response; + } + } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DeviceServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DeviceServlet.java index 91dd970c7bacfbd888636313260f21a695d40781..67a10b2dc150ae5c1e803e062117c6c797b07590 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DeviceServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/device/DeviceServlet.java @@ -10,10 +10,15 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.dao.StatementElement; import net.jami.jams.common.dao.StatementList; import net.jami.jams.common.objects.requests.DeviceRegistrationRequest; +import net.jami.jams.common.objects.requests.RevocationRequest; +import net.jami.jams.common.objects.requests.RevocationType; import net.jami.jams.common.objects.responses.DeviceRegistrationResponse; +import net.jami.jams.common.objects.responses.DeviceRevocationResponse; import net.jami.jams.server.core.workflows.RegisterDeviceFlow; +import net.jami.jams.server.core.workflows.RevokeDeviceFlow; import java.io.IOException; +import java.math.BigInteger; import static net.jami.jams.server.Server.dataStore; @@ -48,5 +53,11 @@ public class DeviceServlet extends HttpServlet { @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doDelete(req, resp); + RevocationRequest request = new RevocationRequest(); + request.setIdentifier(new BigInteger(req.getAttribute("deviceId").toString())); + request.setRevocationType(RevocationType.DEVICE); + DeviceRevocationResponse devResponse = RevokeDeviceFlow.revokeDevice(req.getAttribute("username").toString(), request); + if(devResponse != null) resp.getOutputStream().write(JsonStream.serialize(devResponse).getBytes()); + else resp.sendError(500,"An exception has occurred while trying to revoke a device!"); } }