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 02db13401ea14315cf8b65b82ab4426889831b71..99dd88b5a596413bfb4a124ff179916d8d1cabe1 100644 --- a/datastore/src/main/java/net/jami/datastore/dao/UserDao.java +++ b/datastore/src/main/java/net/jami/datastore/dao/UserDao.java @@ -24,6 +24,7 @@ package net.jami.datastore.dao; import lombok.extern.slf4j.Slf4j; import net.jami.datastore.main.DataStore; +import net.jami.jams.common.dao.StatementList; import net.jami.jams.common.dao.connectivity.SQLConnection; import net.jami.jams.common.objects.user.User; @@ -82,4 +83,31 @@ public class UserDao extends AbstractDao<User> { DataStore.connectionPool.returnConnection(connection); } } + + @Override + public boolean updateObject(StatementList update, StatementList constraints) { + + String pw = update.getStatements().get(0).getValue(); + String user = update.getStatements().get(1).getValue(); + SQLConnection connection = DataStore.connectionPool.getConnection(); + + try{ + PreparedStatement ps = connection.getConnection().prepareStatement("UPDATE users SET password = ? WHERE username = ?"); + ps.setString(1, pw); + ps.setString(2, user); + ps.executeUpdate(); + + ps = connection.getConnection().prepareStatement("UPDATE users SET needsPasswordReset = ? WHERE username = ?"); + ps.setString(1, "false"); + ps.setString(2, user); + return ps.executeUpdate() != 0; + } + catch (Exception e){ + log.error("An error has occurred while trying to update a user: " + e.toString()); + return false; + } + finally { + DataStore.connectionPool.returnConnection(connection); + } + } } 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 5c6cba380b9355eb46186e78bd32b06ddcec5e43..c8db40ee40a89003739f5248f4affa7114fb8f51 100644 --- a/datastore/src/main/java/net/jami/datastore/main/DataStore.java +++ b/datastore/src/main/java/net/jami/datastore/main/DataStore.java @@ -24,15 +24,7 @@ package net.jami.datastore.main; import lombok.Getter; import lombok.Setter; -<<<<<<< HEAD -import net.jami.datastore.dao.ContactDao; -import net.jami.datastore.dao.DeviceDao; -import net.jami.datastore.dao.JwtDao; -import net.jami.datastore.dao.SystemDao; -import net.jami.datastore.dao.UserDao; -======= import net.jami.datastore.dao.*; ->>>>>>> 18375d3... cleanup for local users display import net.jami.jams.common.authentication.AuthenticationSource; import net.jami.jams.common.authentication.AuthenticationSourceInfo; import net.jami.jams.common.authentication.AuthenticationSourceType; diff --git a/jams-common/pom.xml b/jams-common/pom.xml index 0f92e87d5b902990434a4ddb5b525440fa5fcbab..69dc94883f8a731a3eeb5b49bf6c22fdd5e5ef06 100644 --- a/jams-common/pom.xml +++ b/jams-common/pom.xml @@ -40,7 +40,7 @@ <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> - <version>7.0.1</version> + <version>8.17</version> <scope>compile</scope> </dependency> </dependencies> 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 6730905ae63c5ae91b2f438cbab8b20b4a077b71..a3f4a83c0e2dbd0aead24409b2c2ff3c828e9ad3 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 @@ -40,6 +40,9 @@ import net.jami.jams.common.objects.user.UserProfile; import net.jami.jams.server.core.workflows.RevokeUserFlow; import java.io.IOException; +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.stream.Collectors; import static net.jami.jams.server.Server.dataStore; import static net.jami.jams.server.Server.nameServer; @@ -63,11 +66,15 @@ public class UserServlet extends HttpServlet { User user = new User(); user.setUsername(req.getParameter("username")); user.setNeedsPasswordReset(true); - user.setPassword("TEMP-PASSWORD"); + String pw = new SecureRandom().ints(12, 48, 58).mapToObj(i -> String.valueOf((char)i)).collect(Collectors.joining()); + user.setPassword(pw); user.setRealm("LOCAL"); user.setUserType(AuthenticationSourceType.LOCAL); if(userAuthenticationModule.createUser(user.getUserType(),user.getRealm(),nameServer,user)){ - resp.getOutputStream().write(JsonStream.serialize(user).getBytes()); + // resp.getOutputStream().write(JsonStream.serialize(user).getBytes()); + HashMap<String,String> statusInfo = new HashMap<>(); + statusInfo.put("password", pw); + resp.getOutputStream().write(JsonStream.serialize(statusInfo).getBytes()); return; } resp.sendError(500,"Could not create a user successfully!"); @@ -75,7 +82,7 @@ public class UserServlet extends HttpServlet { //Update user data. @Override - protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException { String username = req.getParameter("username"); //Check if he is AD/LDAP - then return a 403, because we can't set such password. StatementList select = new StatementList(); @@ -96,7 +103,7 @@ public class UserServlet extends HttpServlet { //Revoke a user. @Override - protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException { DeviceRevocationResponse devResponse = RevokeUserFlow.revokeUser(req.getParameter("username")); if(devResponse != null) resp.getOutputStream().write(JsonStream.serialize(devResponse).getBytes()); else resp.sendError(500,"An exception has occurred while trying to revoke a device!"); 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 c4ad339f119e0afa86503ca5da0400dc8f38206a..1428b70744aef82fcf37f53a2ce6efd1e61adca5 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 @@ -94,11 +94,12 @@ public class UserServlet extends HttpServlet { */ @Override @ScopedServletMethod(securityGroups = AccessLevel.USER) - protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + 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. 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!"); return; diff --git a/jams-server/src/main/resources/webapp/js/api.js b/jams-server/src/main/resources/webapp/js/api.js index a5ad018c4d08173e90b59c66ba16dc396076d31a..56212c3b8fa23761f1b1f0dce5344a472e809233 100644 --- a/jams-server/src/main/resources/webapp/js/api.js +++ b/jams-server/src/main/resources/webapp/js/api.js @@ -47,7 +47,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_put_update_user = '/api/admin/user'; +var api_path_put_update_user = '/api/auth/user'; +var api_path_put_admin_update_user = '/api/admin/user'; var api_path_get_exists_user = '/api/admin/user'; var api_path_get_user_directory_search ='/api/auth/directory/search'; var api_path_get_user_needs_reset ='/api/user/needsreset'; @@ -78,7 +79,6 @@ function ajaxApiCall(api_path, request_type, data, credentials, callBackFunction if (window.localStorage.getItem('access_token')) { var jwt = localStorage.getItem('access_token'); - ajax['headers'] = { "Bearer": jwt, } @@ -87,7 +87,8 @@ function ajaxApiCall(api_path, request_type, data, credentials, callBackFunction // pass data in the header 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_needs_reset || (api_path == api_path_post_create_user && request_type == 'POST')) + api_path == api_path_get_user_needs_reset || (api_path == api_path_post_create_user && request_type == 'POST') || + api_path == api_path_put_update_user) isSearch = true; // search dataType diff --git a/jams-server/src/main/resources/webapp/js/new-password.js b/jams-server/src/main/resources/webapp/js/new-password.js index 9e0c33b0e63f3a6474d3ad83093a9f64d9553e50..785d35a83e933fecb0b5f70d9fbc285dc9a4fe59 100644 --- a/jams-server/src/main/resources/webapp/js/new-password.js +++ b/jams-server/src/main/resources/webapp/js/new-password.js @@ -25,7 +25,6 @@ var credentials = null; document.getElementById("changePasswordButton").addEventListener('click', function() { event.preventDefault(); - console.log("in click event"); var inputPassword = $('#inputNewPassword').val(); var inputConfirmPassword = $('#inputConfirmPassword').val(); var oldPassword = $('#inputCurrentPassword').val(); @@ -53,15 +52,14 @@ document.getElementById("changePasswordButton").addEventListener('click', functi else if (inputPassword == inputConfirmPassword) { $('#message').html('Password Match: Welcome to Jams').css('color', '#28a745'); if (credentials["username"] && credentials["password"] && credentials["oldPassword"]) { - console.log("updating local account..."); - ajaxApiCall(api_path_post_update_user, "POST", jsonData, null, updateLocalAccountPasswordCallBackHandler); + ajaxApiCall(api_path_put_update_user, "POST", credentials, null, updateLocalAccountPasswordCallBackHandler); } } }); -function updateLocalAccountPasswordCallBackHandler() { - console.log("account update successful!"); +function updateLocalAccountPasswordCallBackHandler(data) { // now we can login normally - ajaxApiCall(api_path_post_auth_login, "POST", jsonData, null, signinCallBackHandler); + if (data.status != 500) + ajaxApiCall(api_path_post_auth_login, "POST", jsonData, null, signinCallBackHandler); } \ No newline at end of file diff --git a/jams-server/src/main/resources/webapp/js/search.js b/jams-server/src/main/resources/webapp/js/search.js index 56ea4384bf0b982a04225ec6d0a7a0335b7ef910..a973a5a444f2151e1264304c132d470f6e7fd549 100644 --- a/jams-server/src/main/resources/webapp/js/search.js +++ b/jams-server/src/main/resources/webapp/js/search.js @@ -346,7 +346,6 @@ function submitForm(data) { } function handleUserProfileCreation(data) { - console.log(data); ajaxApiCall(api_path_post_create_user, 'POST', {"username": data.username}, null, handleUserCreation); } @@ -462,7 +461,7 @@ function handleUserCreation(data) { " on the public nameserver, or another unknown error has occurred. " + "Please choose another one."); else - $('#user-pw-modal-body').text("New user successfully created. Here is the one time password: " + data.pw); + $('#user-pw-modal-body').text("New user successfully created. Here is the one time password: " + data.password); ajaxApiCall(api_path_get_user_directory_search, 'GET', {"queryString":"*"}, null, listAllUsers); } diff --git a/jams-server/src/main/resources/webapp/js/signup.js b/jams-server/src/main/resources/webapp/js/signup.js index 8f20f95ac9da1f6d61933f1d7b8c57b5d60c6b04..a43dfe921f0e1afaccc4dd726e2c35bf7ab90f8a 100644 --- a/jams-server/src/main/resources/webapp/js/signup.js +++ b/jams-server/src/main/resources/webapp/js/signup.js @@ -92,14 +92,18 @@ function createAdminCallBackHandler(data, statusCode, jqXHR) { function signinCallBackHandler(data, statusCode, jqXHR) { - if (jqXHR.status == 200 && data.access_token != 'null' && (data.needsReset == false || data.needsReset == null)) { - setJWT(data); - var tokenJSON = JSON.parse(atob(window.localStorage.getItem('access_token').split('.')[1])); + var tokenJSON = ''; + if (data.access_token) { + setJWT(data); + tokenJSON = JSON.parse(atob(window.localStorage.getItem('access_token').split('.')[1])); + } + + if (jqXHR.status == 200 && tokenJSON != '' && tokenJSON.oneTimePassword == false) { + // check server configuration status getServerConfigStatus(); - } else if (jqXHR.status == 200 && tokenJSON.oneTimePassword == true) { - getServerConfigStatus(); - window.location.replace("new-password.html?username=" + credentials["username"]); + } else if (jqXHR.status == 200 && tokenJSON != '' && tokenJSON.oneTimePassword == true) { + window.location.replace("new-password.html?username=" + getUser()); } else { invalidLogin(); diff --git a/jams-server/src/main/resources/webapp/js/user.js b/jams-server/src/main/resources/webapp/js/user.js index ca0c9b35e47767f671ac0bdff12c854384cfee9f..d809d9657eff967382e5460f6f63257625ba4577 100644 --- a/jams-server/src/main/resources/webapp/js/user.js +++ b/jams-server/src/main/resources/webapp/js/user.js @@ -82,7 +82,7 @@ $(document).ready(function() { 'extension': $('#input-extension-update').val(), 'mobile': $('#input-mobile-update').val() } - ajaxApiCall(api_path_post_update_user, 'POST', data, null, handleUserUpdate); + ajaxApiCall(api_path_put_update_user, 'POST', data, null, handleUserUpdate); }); }); diff --git a/jams-server/src/main/resources/webapp/templates/new-password.html b/jams-server/src/main/resources/webapp/templates/new-password.html index b0c0461f3efb07f0bac09c60c5ac8816fa6f11da..112bd4e3289bf34023b119fb25bd64390ccd0b5a 100644 --- a/jams-server/src/main/resources/webapp/templates/new-password.html +++ b/jams-server/src/main/resources/webapp/templates/new-password.html @@ -42,7 +42,6 @@ <script src="../js/api.js" charset="utf-8"></script> <script src="../js/auth.js" charset="utf-8"></script> <script> - checkAuthentication(); $(function () { $("#header").load("header.html"); $("#footer").load("footer.html");