[Fix] Fixed Certificate locale not restored on reboot

This commit is contained in:
Robert von Burg 2019-08-30 16:01:28 +02:00
parent bdda43822d
commit 4ef3ae0869
4 changed files with 30 additions and 21 deletions

View File

@ -1038,7 +1038,7 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler {
if (ctx.getUserRep().getUsername().equals(newUser.getUsername())) { if (ctx.getUserRep().getUsername().equals(newUser.getUsername())) {
Certificate cert = ctx.getCertificate(); Certificate cert = ctx.getCertificate();
cert = buildCertificate(cert.getUsage(), newUser, cert.getAuthToken(), cert.getSessionId(), cert = buildCertificate(cert.getUsage(), newUser, cert.getAuthToken(), cert.getSessionId(),
cert.getSource()); cert.getSource(), cert.getLoginTime());
PrivilegeContext privilegeContext = buildPrivilegeContext(cert, newUser); PrivilegeContext privilegeContext = buildPrivilegeContext(cert, newUser);
this.privilegeContextMap.put(cert.getSessionId(), privilegeContext); this.privilegeContextMap.put(cert.getSessionId(), privilegeContext);
} }
@ -1063,7 +1063,7 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler {
Certificate cert = ctx.getCertificate(); Certificate cert = ctx.getCertificate();
cert = buildCertificate(cert.getUsage(), user, cert.getAuthToken(), cert.getSessionId(), cert = buildCertificate(cert.getUsage(), user, cert.getAuthToken(), cert.getSessionId(),
cert.getSource()); cert.getSource(), cert.getLoginTime());
PrivilegeContext privilegeContext = buildPrivilegeContext(cert, user); PrivilegeContext privilegeContext = buildPrivilegeContext(cert, user);
this.privilegeContextMap.put(cert.getSessionId(), privilegeContext); this.privilegeContextMap.put(cert.getSessionId(), privilegeContext);
} }
@ -1127,7 +1127,8 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler {
// create a new certificate, with details of the user // create a new certificate, with details of the user
Usage usage = userChallenge.getUsage(); 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); PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user);
this.privilegeContextMap.put(sessionId, privilegeContext); this.privilegeContextMap.put(sessionId, privilegeContext);
@ -1177,7 +1178,7 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler {
String sessionId = UUID.randomUUID().toString(); String sessionId = UUID.randomUUID().toString();
// create a new certificate, with details of the user // 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); PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user);
this.privilegeContextMap.put(sessionId, privilegeContext); this.privilegeContextMap.put(sessionId, privilegeContext);
@ -1233,7 +1234,7 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler {
String sessionId = UUID.randomUUID().toString(); String sessionId = UUID.randomUUID().toString();
// create a new certificate, with details of the user // 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); PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user);
this.privilegeContextMap.put(sessionId, privilegeContext); this.privilegeContextMap.put(sessionId, privilegeContext);
@ -1246,15 +1247,16 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler {
return certificate; 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); DBC.PRE.assertNotEmpty("source must not be empty!", source);
Set<String> userRoles = user.getRoles(); Set<String> userRoles = user.getRoles();
return new Certificate(usage, sessionId, user.getUsername(), user.getFirstname(), user.getLastname(), 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())); new HashMap<>(user.getProperties()));
} }
private boolean persistSessions() { private synchronized boolean persistSessions() {
if (!this.persistSessions) if (!this.persistSessions)
return false; return false;
@ -1315,12 +1317,12 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler {
return; return;
} }
for (CertificateStub certificateStub : certificateStubs) { for (CertificateStub stub : certificateStubs) {
Usage usage = certificateStub.getUsage(); Usage usage = stub.getUsage();
String username = certificateStub.getUsername(); String username = stub.getUsername();
String sessionId = certificateStub.getSessionId(); String sessionId = stub.getSessionId();
String authToken = certificateStub.getAuthToken(); String authToken = stub.getAuthToken();
String source = certificateStub.getSource(); String source = stub.getSource();
User user = this.persistenceHandler.getUser(username); User user = this.persistenceHandler.getUser(username);
if (user == null) { if (user == null) {
logger.error("Ignoring session data for missing user " + username); 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 // create a new certificate, with details of the user
Certificate certificate = buildCertificate(usage, user, authToken, sessionId, source); Certificate certificate = buildCertificate(usage, user, authToken, sessionId, source, stub.getLoginTime());
certificate.setLastAccess(certificateStub.getLastAccess()); certificate.setLocale(stub.getLocale());
certificate.setLastAccess(stub.getLastAccess());
PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user); PrivilegeContext privilegeContext = buildPrivilegeContext(certificate, user);
this.privilegeContextMap.put(sessionId, privilegeContext); this.privilegeContextMap.put(sessionId, privilegeContext);
@ -2002,7 +2005,8 @@ public class DefaultPrivilegeHandler implements PrivilegeHandler {
String sessionId = UUID.randomUUID().toString(); String sessionId = UUID.randomUUID().toString();
// create a new certificate, with details of the user // 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 // create and save a new privilege context
PrivilegeContext privilegeContext = buildPrivilegeContext(systemUserCertificate, user); PrivilegeContext privilegeContext = buildPrivilegeContext(systemUserCertificate, user);

View File

@ -66,7 +66,7 @@ public class CertificateStubsSaxReader extends DefaultHandler {
stub.username = attributes.getValue(XmlConstants.XML_ATTR_USERNAME); stub.username = attributes.getValue(XmlConstants.XML_ATTR_USERNAME);
stub.authToken = attributes.getValue(XmlConstants.XML_ATTR_AUTH_TOKEN); stub.authToken = attributes.getValue(XmlConstants.XML_ATTR_AUTH_TOKEN);
stub.source = attributes.getValue(XmlConstants.XML_ATTR_SOURCE); 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() stub.loginTime = ISO8601FormatFactory.getInstance()
.parseDate(attributes.getValue(XmlConstants.XML_ATTR_LOGIN_TIME)); .parseDate(attributes.getValue(XmlConstants.XML_ATTR_LOGIN_TIME));
stub.lastAccess = ISO8601FormatFactory.getInstance() stub.lastAccess = ISO8601FormatFactory.getInstance()

View File

@ -234,7 +234,8 @@ public class DefaultStrolchSessionHandler extends StrolchComponent implements St
private void persistSessions() { private void persistSessions() {
try { 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) { } catch (Exception e) {
logger.error("Failed to persist sessions", e); logger.error("Failed to persist sessions", e);
} finally { } finally {
@ -390,7 +391,11 @@ public class DefaultStrolchSessionHandler extends StrolchComponent implements St
synchronized (this.certificateMap) { synchronized (this.certificateMap) {
for (Certificate cert : certificateMap.values()) { for (Certificate cert : certificateMap.values()) {
if (cert.getSessionId().equals(sessionId)) { if (cert.getSessionId().equals(sessionId)) {
cert.setLocale(locale); if (!cert.getLocale().equals(locale)) {
cert.setLocale(locale);
persistSessions();
}
break;
} }
} }
} }

View File

@ -104,7 +104,7 @@ public class UserSessionsService {
StrolchSessionHandler sessionHandler = RestfulStrolchComponent.getInstance().getSessionHandler(); StrolchSessionHandler sessionHandler = RestfulStrolchComponent.getInstance().getSessionHandler();
Locale locale; Locale locale;
try { try {
locale = new Locale(localeS); locale = Locale.forLanguageTag(localeS);
} catch (Exception e) { } catch (Exception e) {
String msg = MessageFormat.format("Locale {0} is not valid!", localeS); String msg = MessageFormat.format("Locale {0} is not valid!", localeS);
return Response.serverError().entity(ResponseUtil.toResponse(msg)).type(MediaType.APPLICATION_JSON).build(); return Response.serverError().entity(ResponseUtil.toResponse(msg)).type(MediaType.APPLICATION_JSON).build();