diff --git a/datastore/src/main/java/net/jami/datastore/dao/UserDao.java b/datastore/src/main/java/net/jami/datastore/dao/UserDao.java index 4f3723d855a96f63d8e224ca8b854bc9048b77ff..8b9cd045cb9053ea212e8d98ff6331b29da6388b 100644 --- a/datastore/src/main/java/net/jami/datastore/dao/UserDao.java +++ b/datastore/src/main/java/net/jami/datastore/dao/UserDao.java @@ -29,7 +29,9 @@ import net.jami.jams.common.dao.StatementList; import net.jami.jams.common.dao.connectivity.SQLConnection; import net.jami.jams.common.objects.user.User; +import java.security.cert.Certificate; import java.sql.PreparedStatement; +import java.util.Objects; @Slf4j public class UserDao extends AbstractDao<User> { @@ -56,18 +58,12 @@ public class UserDao extends AbstractDao<User> { } } - @Override - public boolean updateObject(StatementList update, StatementList constraints) { - - if(update.getStatements().get(0).getColumn() == "certificate"){ - + public boolean updateUserCertificate(String username, String certificate) { SQLConnection connection = DataStore.connectionPool.getConnection(); try { - String certificate = update.getStatements().get(0).getValue(); - String user = constraints.getStatements().get(0).getValue(); PreparedStatement ps = connection.getConnection().prepareStatement("UPDATE users SET certificate = ? WHERE username = ?"); ps.setString(1, certificate); - ps.setString(2, user); + ps.setString(2, username); return ps.executeUpdate() != 0; } catch (Exception e) { log.error("An error has occurred while trying to update a user certificate: " + e.toString()); @@ -75,8 +71,10 @@ public class UserDao extends AbstractDao<User> { } finally { DataStore.connectionPool.returnConnection(connection); } + } - } + @Override + public boolean updateObject(StatementList update, StatementList constraints) { String pw = update.getStatements().get(0).getValue(); String salt = ""; diff --git a/datastore/src/main/java/net/jami/datastore/main/DataStore.java b/datastore/src/main/java/net/jami/datastore/main/DataStore.java index 8aad8af84676b28bcb91baee3a5f2e5a896c9778..11da21a8a253660fc6d65d20ed56ad562e80c12e 100644 --- a/datastore/src/main/java/net/jami/datastore/main/DataStore.java +++ b/datastore/src/main/java/net/jami/datastore/main/DataStore.java @@ -166,15 +166,7 @@ public class DataStore implements AuthenticationSource { } public boolean updateUserCertificate(User user) { - - StatementList update = new StatementList(); - StatementList constraints = new StatementList(); - - update.addStatement(new StatementElement("certificate","=", X509Utils.getPEMStringFromCertificate(user.getCertificate()),"")); - - constraints.addStatement(new StatementElement("username","=", user.getUsername(),"")); - - return userDao.updateObject(update, constraints); + return userDao.updateUserCertificate(user.getUsername(), X509Utils.getPEMStringFromCertificate(user.getCertificate())); } @Override diff --git a/datastore/src/test/java/net/jami/datastore/dao/DAOTest.java b/datastore/src/test/java/net/jami/datastore/dao/DAOTest.java index 7848edd40d921860882713ac041b2f04b29c7140..3335065bf4e6ff3008ad34fff65d0d8c76f4e100 100644 --- a/datastore/src/test/java/net/jami/datastore/dao/DAOTest.java +++ b/datastore/src/test/java/net/jami/datastore/dao/DAOTest.java @@ -22,6 +22,7 @@ */ package net.jami.datastore.dao; +import lombok.extern.slf4j.Slf4j; import net.jami.datastore.main.DataStore; import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.dao.StatementElement; @@ -41,11 +42,14 @@ import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.SecureRandom; +@Slf4j class DAOTest { static String strPrivateKey; static String strCertificate; static String strPkcs10Request; + static String generatedCertificate; + static String refreshedCertificate; @BeforeAll static void setUp() throws Exception{ @@ -59,6 +63,10 @@ class DAOTest { strCertificate = new String(path.readAllBytes()); path = classLoader.getResourceAsStream("pkcs10request.txt"); strPkcs10Request = new String(path.readAllBytes()); + path = classLoader.getResourceAsStream("cert_a.crt"); + generatedCertificate = new String(path.readAllBytes()); + path = classLoader.getResourceAsStream("cert_b.crt"); + refreshedCertificate = new String(path.readAllBytes()); } @Test @@ -84,6 +92,34 @@ class DAOTest { Assertions.assertEquals(user1.getAccessLevel(),AccessLevel.ADMIN); } + @Test + void refreshUserCertificate() throws Exception { + User user = new User(); + user.setUsername("TestUser"); + user.setUserType(AuthenticationSourceType.LOCAL); + SecureRandom random = new SecureRandom(); + byte[] salt = new byte[16]; + random.nextBytes(salt); + user.setSalt(Base64.encodeBase64String(salt)); + user.setPassword(hashPassword("abc123", salt)); + user.setAccessLevel(AccessLevel.USER); + user.setCertificate(X509Utils.getCertificateFromPEMString(generatedCertificate)); + + UserDao userDAO = new UserDao(); + userDAO.storeObject(user); + + StatementList statementList = new StatementList(); + statementList.addStatement(new StatementElement("username","=","TestUser","")); + User user1 = userDAO.getObjects(statementList).get(0); + Assertions.assertNotNull(user1); + Assertions.assertEquals(user1.getAccessLevel(),AccessLevel.USER); + + userDAO.updateUserCertificate("TestUser", X509Utils.getPEMStringFromCertificate(X509Utils.getCertificateFromPEMString(refreshedCertificate))); + + User user2 = userDAO.getObjects(statementList).get(0); + Assertions.assertNotEquals(user1.getCertificate(), user2.getCertificate()); + } + @Test void storeDevice(){ Device device = new Device(); diff --git a/datastore/src/test/resources/cert_a.crt b/datastore/src/test/resources/cert_a.crt new file mode 100644 index 0000000000000000000000000000000000000000..8bcadcd49f536e9281488551a7b38a4ba9bad79f --- /dev/null +++ b/datastore/src/test/resources/cert_a.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +MIIFgDCCA2igAwIBAgIRALCoDS70cDjZ/NfSny9ADnIwDQYJKoZIhvcNAQENBQAwHzEQMA4GA1UEAwwHVGVzdCBDQTELMAkGA1UEBhMCRlIwHhcNMjIwMzMwMDk0ODMwWhcNMjIwMzMwMjE0ODMxWjBkMSgwJgYDVQQDDB9UZXN0VXNlcidzIFBlcnNvbmFsIENlcnRpZmljYXRlMTgwNgYKCZImiZPyLGQBAQwoOTI4MGZmOTI2Y2I3ZGQ4YzIwMzU2YTcxOGYwNWM2MTgxZWE0ZmI3NzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIOUHl1ahiORERRWM2k1p1vzm7Z+siHqrREsm0a8v9syBnltLfmNjXrFw88VbL4MbXsGtTDm8e1fvtbV3zc1B4pIwWG0x0B1lxTEd1VVpJK2NSJhfgn3GM6hSTafbouqtHeuEKVHLBkx8u84IjsBMDqdP55a9El4upkkwmmJIoodU18/XrSJhSKoGGCx5PKjhetyi8QRR3eh7phZU6Mo3sC7OZs3rR+IIGpaoE68JD+Zig5ShIMTQlRHaaF64i6NVcutjig3gp1wmpSPm9rMivTQp6kpiHGuiVPwjA2Dw0KhwAenQJSujW06YiW/lTx/ahdCd4EVztoYAZY3W3dDtgonFy9jF50tJI9x5ykK/eNhcb14QhZeurrf5mZHJAzxPvUiLC4jTszetpXTia4dE30+fLWxxBkcIIJ7ejGdRI6Qdj7akWSY5g16qqfJWvuN5l+zWq4IMeJ2SCBuCQ33nst9/rNTQZC89PkFk2KsQ/WLpQ1Gg1KPdCPWk6I7gjW7Be4DXZv544bn4i/rB4B3MOolbwkGiUqa+xDZa8f2dGQmjwcWuPThmvgH2O0KXh0e6AGdvvRCelSjgwrOEDHEeih+OYrMfCN8yzoKTDoLM2s/MX8zJbqtSsuLFfJqog5/ZPRCS3N8K3NShN1wgzLUn46EqT6nk2lpat4xTcXdijWFAgMBAAGjcjBwMBIGA1UdEwEB/wQIMAYBAf8CAQowCwYDVR0PBAQDAgEGMCIGA1UdHwQbMBkwF6AVoBOGEW51bGwvYXBpL2F1dGgvY3JsMCkGCCsGAQUFBwEBBB0wGzAZBggrBgEFBQcwAYYNbnVsbC9hcGkvb2NzcDANBgkqhkiG9w0BAQ0FAAOCAgEAsxKqhtGgTsR78bWdsMZqhyXVNS4aYG/MVjwD58zXTtT/VkOMCRbzLXYr7NLNCqzpgv+UOwP75gp/qo7fQFWVc6/bNPiDbdmSrkeCD7/3FYWdTlK6e6wqzX2DiuQm/TDJJ+PqOMqMAmzB8xoVHSI5OJN/PWsI2pyS0CgSy4OlWiBDoJ2tBBXdxBEs/fZUvQS/6k8hoPsrSIepPnfZwddnFWk+Hd00IpgW0nLy7DYI1vAMlJzK+pjMO/5sS373NCq4mDRfi7kf3nRYS1SSEScRoKnbC/fXREVhp5fx5UVtBBjsRYmbUMTIveJBeRofpweBu0KeA6fUSRItD3ABVsGLP/pXOBmV82FKTfex+JITkwRDXOMDKPzmFhqsslqNhnDE8D6B4x4iApIzO3FQ6L/wtnfWy7rzKnMvUHQ6sNHQ+v7UObxtJjcbN5ApeJa9Bx7oQNf5jeyT5IKXiPhnYEUSBLgYNe1rKOTuQloVNSV8GjkigBG3saCXuEjjl55BJtEm8scTKk2tnsCYhuEtMFLwAnW5/pkAfxaYNoghR2T9s1mgu7trblkvhiGT0ad5T3qZjCLgc1pV4BxhVx+lSUi5VwsTfpH912xCgE/Qp3Vy5Ifg93PesCW5SA8GwiqrWvSjgGTgJlolUBnEQr4VJWT1W1e9xAf89D2qXWlikG2wKE4= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/datastore/src/test/resources/cert_b.crt b/datastore/src/test/resources/cert_b.crt new file mode 100644 index 0000000000000000000000000000000000000000..0cd46697d9a342ed2e508facb71a8b26da8117da --- /dev/null +++ b/datastore/src/test/resources/cert_b.crt @@ -0,0 +1,3 @@ +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIQINxgpvbhpzYUVbg0OFZiyzANBgkqhkiG9w0BAQ0FADAfMRAwDgYDVQQDDAdUZXN0IENBMQswCQYDVQQGEwJGUjAeFw0yMjAzMzAwOTQ4MzFaFw0yMjA0MDUwNjU4MzFaMGQxKDAmBgNVBAMMH1Rlc3RVc2VyJ3MgUGVyc29uYWwgQ2VydGlmaWNhdGUxODA2BgoJkiaJk/IsZAEBDCg5MjgwZmY5MjZjYjdkZDhjMjAzNTZhNzE4ZjA1YzYxODFlYTRmYjc3MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAg5QeXVqGI5ERFFYzaTWnW/Obtn6yIeqtESybRry/2zIGeW0t+Y2NesXDzxVsvgxtewa1MObx7V++1tXfNzUHikjBYbTHQHWXFMR3VVWkkrY1ImF+CfcYzqFJNp9ui6q0d64QpUcsGTHy7zgiOwEwOp0/nlr0SXi6mSTCaYkiih1TXz9etImFIqgYYLHk8qOF63KLxBFHd6HumFlToyjewLs5mzetH4ggalqgTrwkP5mKDlKEgxNCVEdpoXriLo1Vy62OKDeCnXCalI+b2syK9NCnqSmIca6JU/CMDYPDQqHAB6dAlK6NbTpiJb+VPH9qF0J3gRXO2hgBljdbd0O2CicXL2MXnS0kj3HnKQr942FxvXhCFl66ut/mZkckDPE+9SIsLiNOzN62ldOJrh0TfT58tbHEGRwggnt6MZ1EjpB2PtqRZJjmDXqqp8la+43mX7Narggx4nZIIG4JDfeey33+s1NBkLz0+QWTYqxD9YulDUaDUo90I9aTojuCNbsF7gNdm/njhufiL+sHgHcw6iVvCQaJSpr7ENlrx/Z0ZCaPBxa49OGa+AfY7QpeHR7oAZ2+9EJ6VKODCs4QMcR6KH45isx8I3zLOgpMOgszaz8xfzMluq1Ky4sV8mqiDn9k9EJLc3wrc1KE3XCDMtSfjoSpPqeTaWlq3jFNxd2KNYUCAwEAAaNyMHAwEgYDVR0TAQH/BAgwBgEB/wIBCjALBgNVHQ8EBAMCAQYwIgYDVR0fBBswGTAXoBWgE4YRbnVsbC9hcGkvYXV0aC9jcmwwKQYIKwYBBQUHAQEEHTAbMBkGCCsGAQUFBzABhg1udWxsL2FwaS9vY3NwMA0GCSqGSIb3DQEBDQUAA4ICAQBRFnPH31HVl44SLqq/q8rm+lwG2i9g9sC80yvYrcsBSEKjMxKodQ+VLoHJQxp6fcfnakNkLdhp7/kVtSc0lTaLZtNti6KXUlYqf8iajpDxRQxs0hIcKs3vRDfMn3/uUbLKvmD8xhyu8e3Vm2tbqWJkkRvMQzw2mKkeGvxWK2pPoFPf51bgrpYsCxlb5v+jOUDSFhp+zED6w0Ggvabnv2QH9+4zKAk6hs2G0PqCUOz4viOfG7EzuWT23JYOMg6Nxqfd/VUx8+CV23f/sMNPNyA0tvxx7sNpyX1s0gEB2xGxVJFrCSOkz1no8qaPvvWqUVSeC8oDuZv5wd2Xw+pr+x1xHN5TjWDOvq5EHNNB6JcTDXRZGVDyhNDKqnsxv1CUuQVclucAlI8hOUfKLrPxAA7l2G1T23aDEQubURd1i4vZtECekBsvsuZ4JRYaymPB6f8U4kJGy+ZE6GsieXTfNLf1WG+Gy56M1zDc/ZJu3p/335BUukKjsGZteZv9VDAXX6WeaORW/sQSyTLvnqVqv0i153GYGjWhT8rOwwIIVZkWegYDbum4xsbCrQKnIwbvD6jqfcjxzgezc5xErl+BwEjtk5rlPHzwS/Sv5RKuCwrIqTLSds0YQAd1mT+mnno2yDAaOR9JaHFs4DWch+U66N1uEpsFDYcTouhLZGVunv/CLg== +-----END CERTIFICATE----- \ No newline at end of file