From 4ef3ae08696794eebbf085bac06d268ac2941a28 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Fri, 30 Aug 2019 16:01:28 +0200 Subject: [PATCH] [Fix] Fixed Certificate locale not restored on reboot --- .../handler/DefaultPrivilegeHandler.java | 38 ++++++++++--------- .../xml/CertificateStubsSaxReader.java | 2 +- .../rest/DefaultStrolchSessionHandler.java | 9 ++++- .../rest/endpoint/UserSessionsService.java | 2 +- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/li.strolch.privilege/src/main/java/li/strolch/privilege/handler/DefaultPrivilegeHandler.java b/li.strolch.privilege/src/main/java/li/strolch/privilege/handler/DefaultPrivilegeHandler.java index b52e85db5..90534850d 100644 --- a/li.strolch.privilege/src/main/java/li/strolch/privilege/handler/DefaultPrivilegeHandler.java +++ b/li.strolch.privilege/src/main/java/li/strolch/privilege/handler/DefaultPrivilegeHandler.java @@ -1038,7 +1038,7 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { if (ctx.getUserRep().getUsername().equals(newUser.getUsername())) { Certificate cert = ctx.getCertificate(); cert = buildCertificate(cert.getUsage(), newUser, cert.getAuthToken(), cert.getSessionId(), - cert.getSource()); + cert.getSource(), cert.getLoginTime()); PrivilegeContext privilegeContext = buildPrivilegeContext(cert, newUser); this.privilegeContextMap.put(cert.getSessionId(), privilegeContext); } @@ -1063,7 +1063,7 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { Certificate cert = ctx.getCertificate(); cert = buildCertificate(cert.getUsage(), user, cert.getAuthToken(), cert.getSessionId(), - cert.getSource()); + cert.getSource(), cert.getLoginTime()); PrivilegeContext privilegeContext = buildPrivilegeContext(cert, user); this.privilegeContextMap.put(cert.getSessionId(), privilegeContext); } @@ -1127,7 +1127,8 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { // create a new certificate, with details of the user Usage usage = userChallenge.getUsage(); - Certificate certificate = buildCertificate(usage, user, authToken, sessionId, userChallenge.getSource()); + Certificate certificate = buildCertificate(usage, user, authToken, sessionId, userChallenge.getSource(), + new Date()); PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user); this.privilegeContextMap.put(sessionId, privilegeContext); @@ -1177,7 +1178,7 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { String sessionId = UUID.randomUUID().toString(); // create a new certificate, with details of the user - Certificate certificate = buildCertificate(Usage.ANY, user, authToken, sessionId, source); + Certificate certificate = buildCertificate(Usage.ANY, user, authToken, sessionId, source, new Date()); PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user); this.privilegeContextMap.put(sessionId, privilegeContext); @@ -1233,7 +1234,7 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { String sessionId = UUID.randomUUID().toString(); // create a new certificate, with details of the user - Certificate certificate = buildCertificate(Usage.ANY, user, authToken, sessionId, source); + Certificate certificate = buildCertificate(Usage.ANY, user, authToken, sessionId, source, new Date()); PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user); this.privilegeContextMap.put(sessionId, privilegeContext); @@ -1246,15 +1247,16 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { return certificate; } - private Certificate buildCertificate(Usage usage, User user, String authToken, String sessionId, String source) { + private Certificate buildCertificate(Usage usage, User user, String authToken, String sessionId, String source, + Date loginTime) { DBC.PRE.assertNotEmpty("source must not be empty!", source); Set userRoles = user.getRoles(); return new Certificate(usage, sessionId, user.getUsername(), user.getFirstname(), user.getLastname(), - user.getUserState(), authToken, source, new Date(), user.getLocale(), userRoles, + user.getUserState(), authToken, source, loginTime, user.getLocale(), userRoles, new HashMap<>(user.getProperties())); } - private boolean persistSessions() { + private synchronized boolean persistSessions() { if (!this.persistSessions) return false; @@ -1315,12 +1317,12 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { return; } - for (CertificateStub certificateStub : certificateStubs) { - Usage usage = certificateStub.getUsage(); - String username = certificateStub.getUsername(); - String sessionId = certificateStub.getSessionId(); - String authToken = certificateStub.getAuthToken(); - String source = certificateStub.getSource(); + for (CertificateStub stub : certificateStubs) { + Usage usage = stub.getUsage(); + String username = stub.getUsername(); + String sessionId = stub.getSessionId(); + String authToken = stub.getAuthToken(); + String source = stub.getSource(); User user = this.persistenceHandler.getUser(username); if (user == null) { logger.error("Ignoring session data for missing user " + username); @@ -1339,8 +1341,9 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { } // create a new certificate, with details of the user - Certificate certificate = buildCertificate(usage, user, authToken, sessionId, source); - certificate.setLastAccess(certificateStub.getLastAccess()); + Certificate certificate = buildCertificate(usage, user, authToken, sessionId, source, stub.getLoginTime()); + certificate.setLocale(stub.getLocale()); + certificate.setLastAccess(stub.getLastAccess()); PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user); this.privilegeContextMap.put(sessionId, privilegeContext); @@ -2002,7 +2005,8 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler { String sessionId = UUID.randomUUID().toString(); // create a new certificate, with details of the user - Certificate systemUserCertificate = buildCertificate(Usage.ANY, user, authToken, sessionId, this.identifier); + Certificate systemUserCertificate = buildCertificate(Usage.ANY, user, authToken, sessionId, this.identifier, + new Date()); // create and save a new privilege context PrivilegeContext privilegeContext = buildPrivilegeContext(systemUserCertificate, user); diff --git a/li.strolch.privilege/src/main/java/li/strolch/privilege/xml/CertificateStubsSaxReader.java b/li.strolch.privilege/src/main/java/li/strolch/privilege/xml/CertificateStubsSaxReader.java index 3ff719a86..f2dc02e3c 100644 --- a/li.strolch.privilege/src/main/java/li/strolch/privilege/xml/CertificateStubsSaxReader.java +++ b/li.strolch.privilege/src/main/java/li/strolch/privilege/xml/CertificateStubsSaxReader.java @@ -66,7 +66,7 @@ public class CertificateStubsSaxReader extends DefaultHandler { stub.username = attributes.getValue(XmlConstants.XML_ATTR_USERNAME); stub.authToken = attributes.getValue(XmlConstants.XML_ATTR_AUTH_TOKEN); stub.source = attributes.getValue(XmlConstants.XML_ATTR_SOURCE); - stub.locale = new Locale(attributes.getValue(XmlConstants.XML_ATTR_LOCALE)); + stub.locale = Locale.forLanguageTag(attributes.getValue(XmlConstants.XML_ATTR_LOCALE)); stub.loginTime = ISO8601FormatFactory.getInstance() .parseDate(attributes.getValue(XmlConstants.XML_ATTR_LOGIN_TIME)); stub.lastAccess = ISO8601FormatFactory.getInstance() diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/DefaultStrolchSessionHandler.java b/li.strolch.rest/src/main/java/li/strolch/rest/DefaultStrolchSessionHandler.java index 6a90e4f88..3e84288fb 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/DefaultStrolchSessionHandler.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/DefaultStrolchSessionHandler.java @@ -234,7 +234,8 @@ public class DefaultStrolchSessionHandler extends StrolchComponent implements St private void persistSessions() { try { - runAsAgent(ctx -> this.privilegeHandler.getPrivilegeHandler().persistSessions(ctx.getCertificate(), ctx.getCertificate().getSource())); + runAsAgent(ctx -> this.privilegeHandler.getPrivilegeHandler() + .persistSessions(ctx.getCertificate(), ctx.getCertificate().getSource())); } catch (Exception e) { logger.error("Failed to persist sessions", e); } finally { @@ -390,7 +391,11 @@ public class DefaultStrolchSessionHandler extends StrolchComponent implements St synchronized (this.certificateMap) { for (Certificate cert : certificateMap.values()) { if (cert.getSessionId().equals(sessionId)) { - cert.setLocale(locale); + if (!cert.getLocale().equals(locale)) { + cert.setLocale(locale); + persistSessions(); + } + break; } } } diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/UserSessionsService.java b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/UserSessionsService.java index 3a0300906..474b5a8e4 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/UserSessionsService.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/UserSessionsService.java @@ -104,7 +104,7 @@ public class UserSessionsService { StrolchSessionHandler sessionHandler = RestfulStrolchComponent.getInstance().getSessionHandler(); Locale locale; try { - locale = new Locale(localeS); + locale = Locale.forLanguageTag(localeS); } catch (Exception e) { String msg = MessageFormat.format("Locale {0} is not valid!", localeS); return Response.serverError().entity(ResponseUtil.toResponse(msg)).type(MediaType.APPLICATION_JSON).build();