From c806cfadc67d33fa5e9b8a728d14ddd076bb6c10 Mon Sep 17 00:00:00 2001 From: William Enright <william.enright@savoirfairelinux.com> Date: Tue, 16 Jun 2020 17:09:05 -0400 Subject: [PATCH] cleanup and workflow improvements to login and JWT handling Change-Id: I4c7989f7c6c318fcce7fff03248568762919ebf3 --- .../jams/server/servlets/LoginServlet.java | 5 ++ .../servlets/api/admin/users/UserServlet.java | 1 + .../install/CreateServerSettingsServlet.java | 2 +- .../api/install/StartInstallServlet.java | 3 - .../src/main/resources/webapp/js/api.js | 8 +- .../src/main/resources/webapp/js/auth.js | 87 ++++++------------- .../resources/webapp/js/server-parameters.js | 1 - .../src/main/resources/webapp/js/signup.js | 4 +- .../src/main/resources/webapp/js/user.js | 2 +- .../resources/webapp/templates/search.html | 1 - 10 files changed, 39 insertions(+), 75 deletions(-) diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/LoginServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/LoginServlet.java index 15d53ed6..b006def1 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/LoginServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/LoginServlet.java @@ -75,4 +75,9 @@ public class LoginServlet extends HttpServlet { if(res == null) TomcatCustomErrorHandler.sendCustomError(resp,401,"Invalid credentials provided!"); else resp.getOutputStream().write(JsonStream.serialize(res).getBytes()); } + + @Override + protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException { + resp.setStatus(200); + } } 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 ce6f0915..6730905a 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 @@ -62,6 +62,7 @@ public class UserServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { User user = new User(); user.setUsername(req.getParameter("username")); + user.setNeedsPasswordReset(true); user.setPassword("TEMP-PASSWORD"); user.setRealm("LOCAL"); user.setUserType(AuthenticationSourceType.LOCAL); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateServerSettingsServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateServerSettingsServlet.java index a67fc61f..d7ac12d9 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateServerSettingsServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/CreateServerSettingsServlet.java @@ -52,6 +52,6 @@ public class CreateServerSettingsServlet extends HttpServlet { resp.sendError(500, "Could not store settings, a problem occured with finishing the installation"); return; } - resp.sendRedirect("/"); + resp.setStatus(200); } } diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/StartInstallServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/StartInstallServlet.java index e15bc234..5475a954 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/StartInstallServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/install/StartInstallServlet.java @@ -50,13 +50,10 @@ public class StartInstallServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //Here we must decide which page to show - login or sign-up - StatementList statementList = new StatementList(); - statementList.addStatement(new StatementElement("username","=","*","")); if(dataStore != null && dataStore.getUserDao() != null && !dataStore.getUserDao().getObjects(null).isEmpty()) resp.setHeader("showLogin","true"); else resp.setHeader("showLogin","false"); - } @Override diff --git a/jams-server/src/main/resources/webapp/js/api.js b/jams-server/src/main/resources/webapp/js/api.js index c0a35a78..03ff6c8a 100644 --- a/jams-server/src/main/resources/webapp/js/api.js +++ b/jams-server/src/main/resources/webapp/js/api.js @@ -160,10 +160,8 @@ function set_installation_response(url) { window.location.replace(url); } } - else if (jqXHR) { - if (jqXHR.status = 200) { - window.location.replace(url); - } - } + else if (jqXHR && jqXHR.status == 200) + window.location.replace(url); + } } \ No newline at end of file diff --git a/jams-server/src/main/resources/webapp/js/auth.js b/jams-server/src/main/resources/webapp/js/auth.js index 8396c766..8e916e75 100644 --- a/jams-server/src/main/resources/webapp/js/auth.js +++ b/jams-server/src/main/resources/webapp/js/auth.js @@ -24,8 +24,7 @@ ajaxApiCall(api_path_post_install_admin, "GET", null, null, signupPageHandler); } - function signupPageHandler(data, statusCode, jqXHR) { - // create Admin + function signupPageHandler(data) { if(data.getResponseHeader('showLogin') == "false") { var inputConfirmPassword = '<div class="form-label-group"><label for="confirmPassword" class="label-title">Confirm Password</label><input type="password" name="confirmPassword" id="inputConfirmPassword" class="form-control" required autocomplete="off"><span id="message"></span></div>'; @@ -37,7 +36,7 @@ $('#form-signup').removeClass('d-none'); $('#admin-password-progress-bar-container').show(); } - else if (data.getResponseHeader('showLogin') == "true") { + else if (data.getResponseHeader('showLogin') == "true" || data.status == 404) { admin_account = true; $('.title').text("Access your account"); $('.form-submit').val("Log in"); @@ -62,88 +61,54 @@ function setLogout(data) { } } -function authorizedAdmin() { - window.location.replace("search.html"); -} - -function authorizedUser(username) { - window.location.replace("user.html?username=" + username); -} - function noAuthorization() { window.location.replace("signup.html"); } function getAdminStatus() { - return true; -} -function getApiCheck() { - apiCheck = true; + var tokenJSON = JSON.parse(atob(window.localStorage.getItem('access_token').split('.')[1])); + if (tokenJSON.scope == "ADMIN") + return true; + else + return false; } -function setApiStatus(data, statusCode, jqXHR) { - if (data.status == 200) { - apiCheck = true; - } +function getUser() { + var tokenJSON = JSON.parse(atob(window.localStorage.getItem('access_token').split('.')[1])); + if (tokenJSON.scope == "USER") + return tokenJSON.sub; + else + return ""; } function getServerConfigStatus() { ajaxApiCall(api_path_get_server_status, 'GET', null, null, serverConfigStatus, false); } -function serverConfigStatus(data, statusCode, jqXHR) { - // hasConnectionToAPI - getApiCheck(); - - if (apiCheck) { - // server is installed +function serverConfigStatus(data) { + // check if server is installed if (data.installed == "true") { - if (getAdminStatus() && (!current_uri.includes('search.html')) && (!current_uri.includes('user.html')) && (!current_uri.includes('config.html'))) { - authorizedAdmin(); - } - else if (!getAdminStatus() && (!current_uri.includes('user.html'))) { - authorizedUser(getUser()); - } - else if (!getAdminStatus() && (!current_uri.includes('signup.html'))) { - noAuthorization(); - } + if (getAdminStatus() && (!current_uri.includes('search.html')) && (!current_uri.includes('user.html')) && (!current_uri.includes('config.html'))) { + window.location.replace("search.html"); + } + else if (!getAdminStatus() && getUser() && (!current_uri.includes('user.html'))) { + window.location.replace("user.html?username=" + getUser()); + } + else if (!getAdminStatus() && !getUser() && (!current_uri.includes('signup.html'))) { + noAuthorization(); + } } // has an Admin account but server is not installed else if (getAdminStatus()) { - ajaxApiCall(api_path_get_install_lastKnownStep, 'GET', null, null, lastServerConfigurationStepUri, false); + ajaxApiCall(api_path_get_install_lastKnownStep, 'GET', null, null, lastServerConfigurationStepUri, false); } else if (!current_uri.includes('signup.html')) { - noAuthorization(); + noAuthorization(); } - } - else if (!current_uri.includes('signup.html') && !current_uri.includes('new-password.html')) { - noAuthorization(); - } } function lastServerConfigurationStepUri(data, statusCode, jqXHR) { - // if (jqXHR.status == 200) { - // // lastKnownStep - // var current_page = false; - // uri_endpoint = data.uri; - // if (uri_endpoint == api_path_post_install_ca) { - // uri = ca_setup_page; - // } - // else if (uri_endpoint == api_path_post_install_auth) { - // uri = identity_management_page; - // } - // else if (uri_endpoint == api_path_post_install_server) { - // uri = server_parameters_page; - // } - // // redirect to lastKnownStep - // if (!(current_uri.includes(uri))) { - // window.location.replace(uri); - // } - // } - // else { - // invalidLogin(); - // } } function invalidLogin() { diff --git a/jams-server/src/main/resources/webapp/js/server-parameters.js b/jams-server/src/main/resources/webapp/js/server-parameters.js index 2a64a659..3c9f41de 100644 --- a/jams-server/src/main/resources/webapp/js/server-parameters.js +++ b/jams-server/src/main/resources/webapp/js/server-parameters.js @@ -18,7 +18,6 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ -var type_int_name_input = ['deviceLifetime', 'userLifetime']; var callback = set_installation_response("search.html", true); $(document).ready(function () { diff --git a/jams-server/src/main/resources/webapp/js/signup.js b/jams-server/src/main/resources/webapp/js/signup.js index 2d237818..8f20f95a 100644 --- a/jams-server/src/main/resources/webapp/js/signup.js +++ b/jams-server/src/main/resources/webapp/js/signup.js @@ -25,7 +25,6 @@ var date = new Date(); var minutes = 15; checkAdminAccountStatus(); -checkAuthentication(); $(".form-submit").click(function (event) { event.preventDefault(); @@ -95,9 +94,10 @@ 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])); // check server configuration status getServerConfigStatus(); - } else if (jqXHR.status == 200 && data.needsReset == true) { + } else if (jqXHR.status == 200 && tokenJSON.oneTimePassword == true) { getServerConfigStatus(); window.location.replace("new-password.html?username=" + credentials["username"]); } diff --git a/jams-server/src/main/resources/webapp/js/user.js b/jams-server/src/main/resources/webapp/js/user.js index 473360a8..ca0c9b35 100644 --- a/jams-server/src/main/resources/webapp/js/user.js +++ b/jams-server/src/main/resources/webapp/js/user.js @@ -399,7 +399,7 @@ function handleUserUpdate(){ setTimeout(function() { ajaxApiCall(api_path_get_user_directory_search, 'GET', searchData, null, setUserInfoDataSource); ajaxApiCall(api_path_get_user_directory_search, 'GET', searchData, null, setUserExtendedData); - }, 300); + }, 500); } function handleFileSelect(evt) { diff --git a/jams-server/src/main/resources/webapp/templates/search.html b/jams-server/src/main/resources/webapp/templates/search.html index 33161729..86378cf1 100644 --- a/jams-server/src/main/resources/webapp/templates/search.html +++ b/jams-server/src/main/resources/webapp/templates/search.html @@ -41,7 +41,6 @@ <script src="../js/auth.js" charset="utf-8"></script> <script> $(function () { - checkAuthentication(); $("#header").load("header.html"); $("#footer").load("footer.html"); }); -- GitLab