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 43e0ec3f7322ee763c430188169bfee3a3816442..357f06972d432c113a05c27fceaca35161be7be2 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 @@ -30,6 +30,7 @@ public class RevokeDeviceFlow { log.error("Could not find device!"); return null; } + request.setIdentifier(device.getCertificate().getSerialNumber()); certificateAuthority.revokeCertificate(request); long statTime = System.currentTimeMillis(); while(certificateAuthority.getLatestCRL().get() diff --git a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RevokeUserFlow.java b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RevokeUserFlow.java index 59bc146717729cd36b853be788145030dad0a9ad..62ebcfaf4c2963576702c57dd31a2fc35e86d08a 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RevokeUserFlow.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RevokeUserFlow.java @@ -1,4 +1,51 @@ 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.RevocationRequest; +import net.jami.jams.common.objects.responses.DeviceRevocationResponse; +import net.jami.jams.common.objects.user.User; + +import static net.jami.jams.server.Server.certificateAuthority; +import static net.jami.jams.server.Server.dataStore; + +@Slf4j public class RevokeUserFlow { + + public static DeviceRevocationResponse revokeUser(String username, RevocationRequest request){ + DeviceRevocationResponse response = new DeviceRevocationResponse(); + try { + StatementList statementList = new StatementList(); + StatementElement st1 = new StatementElement("username","=",username,""); + statementList.addStatement(st1); + User user = dataStore.getUserDao().getObjects(statementList).get(0); + if (user == null) { + log.error("Could not find user!"); + return null; + } + request.setIdentifier(user.getCertificate().getSerialNumber()); + certificateAuthority.revokeCertificate(request); + long statTime = System.currentTimeMillis(); + while(certificateAuthority.getLatestCRL().get() + .getRevokedCertificate(user.getCertificate().getSerialNumber()) == null){ + log.warn("Certificate has not yet appeared in CRL!"); + if(System.currentTimeMillis() - statTime > 1000){ + log.error("The certificate has not appeared within 1 second, we are considering the operation has failed"); + response.setSuccess(false); + return response; + } + } + //Finally we return the successful response + response.setSuccess(true); + 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/admin/users/UserServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java index 9b4cb4373ae36b90b7ff161334f75a22c2f7bc79..045ba9ad439a842b3b39e972b46d01395f2533b1 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/users/UserServlet.java @@ -1,12 +1,19 @@ package net.jami.jams.server.servlets.api.admin.users; +import com.jsoniter.output.JsonStream; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +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 net.jami.jams.server.core.workflows.RevokeDeviceFlow; +import net.jami.jams.server.core.workflows.RevokeUserFlow; import java.io.IOException; +import java.math.BigInteger; @WebServlet("/api/admin/user/*") public class UserServlet extends HttpServlet { @@ -32,6 +39,10 @@ public class UserServlet extends HttpServlet { //Revoke a user. @Override protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doDelete(req, resp); + RevocationRequest request = new RevocationRequest(); + request.setRevocationType(RevocationType.USER); + DeviceRevocationResponse devResponse = RevokeUserFlow.revokeUser(req.getParameter("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!"); } }