diff --git a/jams-ca/pom.xml b/jams-ca/pom.xml index 66e9aa03f5051e4c07a047565b601ac2c5c97e78..4d698d14f781d65b4c419ed669b9faec2497b1d8 100644 --- a/jams-ca/pom.xml +++ b/jams-ca/pom.xml @@ -24,7 +24,6 @@ <scope>compile</scope> </dependency> </dependencies> - <build> <plugins> <plugin> diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DevicesServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DevicesServlet.java index 161a9e75178d64246ad45819910bb4b78050f4b8..0979e7c616866f84dd7beee7c4731ce895a867d8 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DevicesServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/admin/devices/DevicesServlet.java @@ -31,10 +31,13 @@ import jakarta.servlet.http.HttpServletResponse; import net.jami.jams.common.annotations.ScopedServletMethod; 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.user.AccessLevel; import java.io.IOException; +import java.util.List; +import static net.jami.jams.server.Server.certificateAuthority; import static net.jami.jams.server.Server.dataStore; @WebServlet("/api/admin/devices") @@ -46,8 +49,16 @@ public class DevicesServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); StatementList statementList = new StatementList(); - StatementElement st1 = new StatementElement("owner","=",username,""); - statementList.addStatement(st1); - resp.getOutputStream().write(JsonStream.serialize(dataStore.getDeviceDao().getObjects(statementList)).getBytes()); + statementList.addStatement(new StatementElement("owner","=",username,"")); + List<Device> devices = dataStore.getDeviceDao().getObjects(statementList); + if(certificateAuthority.getLatestCRL() != null) { + devices.forEach(device -> { + device.setRevoked(certificateAuthority.getLatestCRL().get().getRevokedCertificate(device.getCertificate().getSerialNumber()) != null); + }); + } + else + devices.forEach(device -> device.setRevoked(false)); + + resp.getOutputStream().write(JsonStream.serialize(devices).getBytes()); } } 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 d8ad89d7f254839e35247f4a2c29d3865a84e137..6e6f1fb38c345b5c2d9e2bfeafc454a07ee0c9de 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 @@ -41,6 +41,7 @@ import net.jami.jams.server.core.workflows.RevokeUserFlow; import java.io.IOException; import java.util.HashMap; +import static net.jami.jams.server.Server.certificateAuthority; import static net.jami.jams.server.Server.dataStore; import static net.jami.jams.server.Server.nameServer; import static net.jami.jams.server.Server.userAuthenticationModule; @@ -55,7 +56,12 @@ public class UserServlet extends HttpServlet { StatementList statementList = new StatementList(); StatementElement st1 = new StatementElement("username","=",req.getParameter("username"),""); statementList.addStatement(st1); - resp.getOutputStream().write(JsonStream.serialize(dataStore.getUserDao().getObjects(statementList)).getBytes()); + User user = dataStore.getUserDao().getObjects(statementList).get(0); + if(certificateAuthority.getLatestCRL().get() != null) { + user.setRevoked(certificateAuthority.getLatestCRL().get().getRevokedCertificate(user.getCertificate().getSerialNumber()) == null); + } + else user.setRevoked(false); + resp.getOutputStream().write(JsonStream.serialize(user).getBytes()); } //Create an internal user - this is always technically available, because internal users have the right to exist. 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 c80845ad4e595c92223e57128063d187bece9582..02c4bf65f0d5a32761ae245a45bcdbfe5edb0d43 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 @@ -163,7 +163,6 @@ public class DeviceServlet extends HttpServlet { @Override @ScopedServletMethod(securityGroups = {AccessLevel.USER}) protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - super.doDelete(req,resp); String deviceId = req.getPathInfo().replace("/",""); //If the device does not belong to the user throw a 403 StatementList statementList = new StatementList(); @@ -176,6 +175,7 @@ public class DeviceServlet extends HttpServlet { } DeviceRevocationResponse devResponse = RevokeDeviceFlow.revokeDevice(req.getAttribute("username").toString(),deviceId); if(devResponse != null) resp.getOutputStream().write(JsonStream.serialize(devResponse).getBytes()); - TomcatCustomErrorHandler.sendCustomError(resp,500,"could not revoke device due to server-side error"); + else + TomcatCustomErrorHandler.sendCustomError(resp,500,"could not revoke device due to server-side error"); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java index 881a7aa085fad1750fa0e9333f7208321d8f9902..8a7c87fe99d61cc34b622f8d00458592e3f73197 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java @@ -196,7 +196,7 @@ public class DirectoryEntryServlet extends HttpServlet { UserProfile[] profiles = userAuthenticationModule.getAuthSources() .get(new AuthModuleKey(req.getParameter("directory"), AuthenticationSourceType.fromString(req.getParameter("directoryType")))) .getUserProfile(req.getParameter("username"), "LOGON_NAME"); - if(req.getParameter("format").equals("vcard")){ + if(req.getParameter("format") != null && req.getParameter("format").equals("vcard")){ resp.getOutputStream().write(profiles[0].getAsVCard().getBytes()); } else resp.getOutputStream().write(JsonStream.serialize(profiles[0]).getBytes()); @@ -207,7 +207,7 @@ public class DirectoryEntryServlet extends HttpServlet { UserProfile[] profiles = v.getUserProfile(req.getParameter("username"), "LOGON_NAME"); if (profiles != null && profiles.length != 0) userProfiles.addAll(Arrays.asList(profiles)); }); - if(req.getParameter("format").equals("vcard")){ + if(req.getParameter("format") != null && req.getParameter("format").equals("vcard")){ resp.getOutputStream().write(userProfiles.get(0).getAsVCard().getBytes()); } else resp.getOutputStream().write(JsonStream.serialize(userProfiles.get(0)).getBytes()); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java index 80c5aee1c2bb205ddd673039e338daefa42f90a7..56806c52c16b1451790473e51f37c68b8e1e49ab 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/user/UserServlet.java @@ -22,6 +22,7 @@ */ package net.jami.jams.server.servlets.api.auth.user; +import com.jsoniter.output.JsonStream; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; @@ -69,35 +70,17 @@ public class UserServlet extends HttpServlet { * @apiError (500) {null} null could not fetch user information */ @Override + @ScopedServletMethod(securityGroups = {AccessLevel.USER}) protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { StatementList statementList = new StatementList(); - StatementElement st = new StatementElement("username","=",req.getParameter("username").toString(),""); + StatementElement st = new StatementElement("username","=",req.getAttribute("username").toString(),""); statementList.addStatement(st); User user = dataStore.getUserDao().getObjects(statementList).get(0); - String password = user.getPassword(); - if (!user.getNeedsPasswordReset()) { - password = PasswordGenerator.generatePassword(); - StatementList update = new StatementList(); - StatementElement st0 = new StatementElement("password","=",password,""); - update.addStatement(st0); - StatementList constraint = new StatementList(); - StatementElement st1 = new StatementElement("username","=",req.getParameter("username"),""); - update.addStatement(st1); - StatementElement st2 = new StatementElement("needsPasswordReset","=","true",""); - update.addStatement(st2); - // refresh variable - user = dataStore.getUserDao().getObjects(statementList).get(0); - dataStore.getUserDao().updateObject(update,constraint); + if(certificateAuthority.getLatestCRL().get() != null) { + user.setRevoked(certificateAuthority.getLatestCRL().get().getRevokedCertificate(user.getCertificate().getSerialNumber()) == null); } - - resp.setHeader("needspasswordreset", (user.getNeedsPasswordReset()).toString()); - resp.setHeader("password", password); - - if (certificateAuthority.getLatestCRL().get() - .getRevokedCertificate(user.getCertificate().getSerialNumber()) == null) - resp.setHeader("revoked", "false"); - else - resp.setHeader("revoked", "true"); + else user.setRevoked(false); + resp.getOutputStream().write(JsonStream.serialize(user).getBytes()); } //The user can update 3 fields: password,privatekey,publickey @@ -116,12 +99,12 @@ public class UserServlet extends HttpServlet { @ScopedServletMethod(securityGroups = AccessLevel.USER) protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getAttribute("username").toString(); - //Check if he is AD/LDAP - then return a 401, because we can't set such password. + //Check if he is AD/LDAP - then return a 403, because we can't set such password. StatementList select = new StatementList(); StatementElement st = new StatementElement("username","=",username,""); select.addStatement(st); if(dataStore.getUserDao().getObjects(select).get(0).getUserType() != AuthenticationSourceType.LOCAL){ - resp.sendError(500,"The user is not a local user, therefore we cannot change his data!"); + resp.sendError(403,"The user is not a local user, therefore we cannot change his data!"); return; } StatementList update = new StatementList(); @@ -129,7 +112,7 @@ public class UserServlet extends HttpServlet { update.addStatement(st0); StatementList constraint = new StatementList(); StatementElement st1 = new StatementElement("username","=",username,""); - update.addStatement(st1); + constraint.addStatement(st1); if(dataStore.getUserDao().updateObject(update,constraint)) resp.setStatus(200); else resp.sendError(500,"could not update the users's data field!"); } diff --git a/jams-server/src/main/resources/webapp/js/api.js b/jams-server/src/main/resources/webapp/js/api.js index 9e1f297fc2338404ac37b11dec368a09a8769dc0..b1adf1cee1411510b2bdf17724887aeeb70175de 100644 --- a/jams-server/src/main/resources/webapp/js/api.js +++ b/jams-server/src/main/resources/webapp/js/api.js @@ -32,6 +32,7 @@ var api_path_post_install_auth = '/api/install/auth'; var api_path_post_install_server = '/api/install/settings'; var api_path_get_install_lastKnownStep = '/api/install/lastStep'; var api_path_get_auth_user_search = '/api/auth/users'; +var api_path_get_admin_devices = '/api/admin/devices'; var api_path_get_auth_devices = '/api/auth/devices'; var api_path_delete_admin_user_revoke = '/api/admin/user'; var api_path_delete_auth_user_revoke = '/api/auth/user'; @@ -48,7 +49,8 @@ var api_path_get_directories = '/api/auth/directories'; var api_path_get_needs_update = '/api/admin/update'; var api_path_get_start_update = '/api/admin/update'; var api_path_post_create_user = '/api/admin/user'; -var api_path_get_user = '/api/auth/user'; +var api_path_get_auth_user = '/api/auth/user'; +var api_path_get_admin_user = '/api/admin/user'; var api_path_post_update_user = '/api/auth/user'; var api_path_get_exists_user = '/api/admin/user'; var api_path_get_user_directory_search ='/api/auth/directory/search'; @@ -97,7 +99,7 @@ function ajaxApiCall(api_path, request_type, data, credentials, callBackFunction if (data) { if (api_path == api_path_get_user_directory_search || api_path == api_path_get_auth_user_search || api_path == api_path_get_user_search || (api_path == api_path_post_create_user && request_type == 'POST') || api_path == api_path_post_update_user - || api_path == api_path_get_auth_devices || api_path == api_path_post_configuration_change_password) + || api_path == api_path_get_auth_devices || api_path == api_path_post_configuration_change_password || api_path == api_path_get_admin_devices) isSearch = true; // search dataType diff --git a/jams-server/src/main/resources/webapp/js/identity-management.js b/jams-server/src/main/resources/webapp/js/identity-management.js index de5c61ee2070913ed4f0970bfd48db0cbbadbca5..c16fccae6cbe510ce3976b23d9af40a1bcbe54e5 100644 --- a/jams-server/src/main/resources/webapp/js/identity-management.js +++ b/jams-server/src/main/resources/webapp/js/identity-management.js @@ -62,6 +62,7 @@ function setLDAPParametersData(form) { settings[field.name] = field.value; }); settings['fieldMappings'] = {}; + settings['fieldMappings']['uid'] = "Username" settings['fieldMappings']['givenName'] = "FirstName"; settings['fieldMappings']['sn'] = "LastName"; settings['fieldMappings']['jpegPhoto'] = "ProfilePicture"; @@ -93,6 +94,7 @@ function setADParametersData(form) { }); settings['fieldMappings'] = {}; + settings['fieldMappings']['sAMAccountName'] = "Username" settings['fieldMappings']['givenName'] = "FirstName"; settings['fieldMappings']['sn'] = "LastName"; settings['fieldMappings']['jpegPhoto'] = "ProfilePicture"; diff --git a/jams-server/src/main/resources/webapp/js/user.js b/jams-server/src/main/resources/webapp/js/user.js index 917c3e26f93014ee7b368e5d5f99bcb5bc1af92a..bed9af7bf48645a5bdf104b93d633e220b0c21cd 100644 --- a/jams-server/src/main/resources/webapp/js/user.js +++ b/jams-server/src/main/resources/webapp/js/user.js @@ -54,19 +54,33 @@ $(document).ready(function() { ajaxApiCall(api_path_get_directories, 'GET', null, null, isLocalDB).then(function() { setTimeout(function() { - ajaxApiCall(api_path_get_user, 'GET', userData, null, setStatus).then(function() { - ajaxApiCall(api_path_get_user_directory_search, 'GET', searchData, null, setUserInfoDataSource).then(function() { - setTimeout(function() { - ajaxApiCall(api_path_get_user_directory_search, 'GET', searchData, null, setUserExtendedData); - }, 300); + if (getAdminStatus()) { + ajaxApiCall(api_path_get_admin_user, 'GET', userData, null, setStatus).then(function() { + ajaxApiCall(api_path_get_user_directory_search, 'GET', searchData, null, setUserInfoDataSource).then(function() { + setTimeout(function() { + ajaxApiCall(api_path_get_user_directory_search, 'GET', searchData, null, setUserExtendedData); + }, 700); + }); + }); + } else { + ajaxApiCall(api_path_get_auth_user, 'GET', null, null, setStatus).then(function() { + ajaxApiCall(api_path_get_user_directory_search, 'GET', searchData, null, setUserInfoDataSource).then(function() { + setTimeout(function() { + ajaxApiCall(api_path_get_user_directory_search, 'GET', searchData, null, setUserExtendedData); + }, 700); + + }); }); - }); - }, 300) + } + }, 700) }); // set User devices information - ajaxApiCall(api_path_get_auth_devices, 'GET', userData, null, setUserDevices); + if (getAdminStatus()) + ajaxApiCall(api_path_get_admin_devices, 'GET', userData, null, setUserDevices); + else + ajaxApiCall(api_path_get_auth_devices, 'GET', null, null, setUserDevices); // revoke user $( '.user-information' ).on( 'click', '.de-authorize-user', function () { @@ -114,7 +128,10 @@ $(document).ready(function() { }); $( '.user-information' ).on( 'click', '.reset-password', function (e) { - ajaxApiCall(api_path_get_user, 'GET', userData, null, handleNewOTP); + if (getAdminStatus()) + ajaxApiCall(api_path_get_admin_user, 'GET', userData, null, handleNewOTP); + else + ajaxApiCall(api_path_get_auth_user, 'GET', null, null, handleNewOTP); }); // change device name @@ -150,9 +167,9 @@ $(document).ready(function() { isSearch = false; $('.loading').show(); if (getAdminStatus()) - ajaxApiCall(api_path_delete_admin_device_revoke + "?deviceId=" + deviceId, 'DELETE', null, null, revokeDeviceHandler); + ajaxApiCall(api_path_delete_admin_device_revoke + "?username=" + username + "&deviceId=" + deviceId, 'DELETE', null, null, revokeDeviceHandler); else - ajaxApiCall(api_path_delete_auth_device_revoke + "?deviceId=" + deviceId, 'DELETE', null, null, revokeDeviceHandler); + ajaxApiCall(api_path_delete_auth_device_revoke + "/" + deviceId, 'DELETE', null, null, revokeDeviceHandler); }); $('.dismiss-device').on('click', function(){ diff --git a/ldap-connector/pom.xml b/ldap-connector/pom.xml index f0a74061eb034e326b0d7338d945dc5371f228cb..8fa16a8f32d097e6a55cc314f63b9698b69dab49 100644 --- a/ldap-connector/pom.xml +++ b/ldap-connector/pom.xml @@ -26,7 +26,7 @@ <dependency> <groupId>org.zapodot</groupId> <artifactId>embedded-ldap-junit</artifactId> - <version>0.8.1</version> + <version>${embedded.ldap.unit}</version> <scope>test</scope> </dependency> </dependencies> diff --git a/pom.xml b/pom.xml index 65f67bb7af33e03370ffc3a1c9f5713cd3180f81..ceba8d1dab08b3b33827125648150b6e731a7f64 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,7 @@ <apache.httpclient.version>4.5.10</apache.httpclient.version> <ez.vcard.version>0.10.6</ez.vcard.version> <maven.resources.version>3.1.0</maven.resources.version> + <embedded.ldap.unit>0.8.1</embedded.ldap.unit> </properties> <dependencies>