Implemented loading VC from gz files & updated OAuth2 expiry check.
Change-Id: I01c607b86b992526400a3df9c5a66fa6211f4ac8
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/OAuth2Authentication.java b/full/src/main/java/de/ids_mannheim/korap/authentication/OAuth2Authentication.java
index 1b42d3e..d203b51 100644
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/OAuth2Authentication.java
+++ b/full/src/main/java/de/ids_mannheim/korap/authentication/OAuth2Authentication.java
@@ -1,13 +1,11 @@
package de.ids_mannheim.korap.authentication;
-import java.time.ZonedDateTime;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.config.FullConfiguration;
import de.ids_mannheim.korap.constant.TokenType;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
@@ -25,8 +23,6 @@
private AccessTokenDao accessDao;
@Autowired
private OAuth2ScopeService scopeService;
- @Autowired
- private FullConfiguration config;
@Override
public TokenContext getTokenContext (String authToken)
@@ -38,14 +34,12 @@
"Access token has been revoked");
}
- ZonedDateTime expiry = accessToken.getCreatedDate()
- .plusSeconds(config.getAccessTokenExpiry());
String scopes = scopeService
.convertAccessScopesToString(accessToken.getScopes());
TokenContext c = new TokenContext();
c.setUsername(accessToken.getUserId());
- c.setExpirationTime(expiry.toInstant().toEpochMilli());
+ c.setExpirationTime(accessToken.getExpiryDate().toInstant().toEpochMilli());
c.setToken(authToken);
c.setTokenType(TokenType.BEARER);
c.addContextParameter(Attributes.SCOPE, scopes);
diff --git a/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java b/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
index 043f77e..0549106 100644
--- a/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
+++ b/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
@@ -1,9 +1,12 @@
package de.ids_mannheim.korap.config;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
+import java.util.zip.GZIPInputStream;
import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,11 +21,10 @@
private FullConfiguration config;
@Autowired
private SearchKrill searchKrill;
-
+
private static Logger jlog = LogManager.getLogger(NamedVCLoader.class);
- public void loadVCToCache ()
- throws IOException {
+ public void loadVCToCache () throws IOException {
String dir = config.getNamedVCPath();
File d = new File(dir);
@@ -34,23 +36,45 @@
if (!file.exists()) {
throw new IOException("File " + file + " is not found.");
}
- else if (!file.getName().endsWith(".jsonld")) {
- throw new IOException("File " + file
- + " is not allowed. Filename must ends with .jsonld");
- }
- long start = System.currentTimeMillis();
- String json = FileUtils.readFileToString(file, "utf-8");
+ long start, end;
+ String json;
+ String filename = file.getName();
+
+ if (file.getName().endsWith(".jsonld")) {
+ filename = filename.substring(0, filename.length() - 7);
+ start = System.currentTimeMillis();
+ json = FileUtils.readFileToString(file, "utf-8");
+ end = System.currentTimeMillis();
+ }
+ else if (filename.endsWith(".jsonld.gz")) {
+ filename = filename.substring(0, filename.length() - 10);
+ start = System.currentTimeMillis();
+
+ GZIPInputStream gzipInputStream =
+ new GZIPInputStream(new FileInputStream(file));
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(512);
+ bos.write(gzipInputStream);
+ json = bos.toString("utf-8");
+ bos.close();
+ end = System.currentTimeMillis();
+ }
+ else {
+ System.err.println("File " + filename
+ + " is not allowed. Filename must ends with .jsonld or .jsonld.gz");
+ continue;
+ }
+ jlog.debug(
+ "READ " + file.getName() + " duration: " + (end - start));
+
KrillCollection collection = new KrillCollection(json);
collection.setIndex(searchKrill.getIndex());
-
- String filename = file.getName();
- filename = filename.substring(0,filename.length()-7);
+
if (collection != null) {
collection.storeInCache(filename);
}
- long end = System.currentTimeMillis();
- jlog.debug(filename + " duration: " + (end - start));
+ end = System.currentTimeMillis();
+ jlog.debug(filename + "caching duration: " + (end - start));
jlog.debug("memory cache: "
+ KrillCollection.cache.calculateInMemorySize());
}
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AccessTokenDao.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AccessTokenDao.java
index 5564ee7..f701777 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AccessTokenDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AccessTokenDao.java
@@ -1,5 +1,6 @@
package de.ids_mannheim.korap.oauth2.dao;
+import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Set;
@@ -13,9 +14,12 @@
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.FullConfiguration;
import de.ids_mannheim.korap.config.KustvaktCacheable;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
@@ -30,13 +34,15 @@
@Transactional
public class AccessTokenDao extends KustvaktCacheable {
+ @PersistenceContext
+ private EntityManager entityManager;
+ @Autowired
+ private FullConfiguration config;
+
public AccessTokenDao () {
super("access_token", "key:access_token");
}
- @PersistenceContext
- private EntityManager entityManager;
-
@Deprecated
public void storeAccessToken (Authorization authorization, String token)
throws KustvaktException {
@@ -64,7 +70,15 @@
ParameterChecker.checkObjectValue(authenticationTime,
"authentication time");
+ ZonedDateTime now =
+ ZonedDateTime.now(ZoneId.of(Attributes.DEFAULT_TIME_ZONE));
+
AccessToken accessToken = new AccessToken();
+ accessToken.setCreatedDate(now);
+ accessToken
+ .setExpiryDate(now.plusSeconds(config.getAccessTokenExpiry()));
+ accessToken.setRefreshTokenExpiryDate(
+ now.plusSeconds(config.getRefreshTokenExpiry()));
accessToken.setToken(token);
accessToken.setRefreshToken(refreshToken);
accessToken.setScopes(scopes);
@@ -150,7 +164,6 @@
builder.equal(root.get(AccessToken_.token), token),
builder.equal(root.get(AccessToken_.refreshToken), token));
-
query.select(root);
query.where(condition);
Query q = entityManager.createQuery(query);
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AuthorizationCacheDao.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AuthorizationCacheDao.java
index af83e16..ee2b130 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AuthorizationCacheDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AuthorizationCacheDao.java
@@ -1,11 +1,16 @@
package de.ids_mannheim.korap.oauth2.dao;
+import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.FullConfiguration;
import de.ids_mannheim.korap.config.KustvaktCacheable;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
@@ -19,6 +24,9 @@
public class AuthorizationCacheDao extends KustvaktCacheable
implements AuthorizationDaoInterface {
+ @Autowired
+ private FullConfiguration config;
+
public AuthorizationCacheDao () {
super("authorization", "key:authorization");
}
@@ -43,7 +51,12 @@
authorization.setRedirectURI(redirectURI);
authorization.setUserAuthenticationTime(authenticationTime);
authorization.setNonce(nonce);
- authorization.setCreatedDate(ZonedDateTime.now());
+
+ ZonedDateTime now =
+ ZonedDateTime.now(ZoneId.of(Attributes.DEFAULT_TIME_ZONE));
+ authorization.setCreatedDate(now);
+ authorization.setExpiryDate(
+ now.plusSeconds(config.getAuthorizationCodeExpiry()));
this.storeInCache(code, authorization);
return authorization;
@@ -77,11 +90,11 @@
public List<Authorization> retrieveAuthorizationsByClientId (
String clientId) {
List<Authorization> authList = new ArrayList<>();
-
+
Map<Object, Element> map = getAllCacheElements();
- for (Object key : map.keySet()){
- Authorization auth = (Authorization) map.get(key).getObjectValue();
- if (auth.getClientId().equals(clientId)){
+ for (Object key : map.keySet()) {
+ Authorization auth = (Authorization) map.get(key).getObjectValue();
+ if (auth.getClientId().equals(clientId)) {
authList.add(auth);
}
}
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AuthorizationDao.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AuthorizationDao.java
index ff82d9c..4abb92b 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AuthorizationDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/AuthorizationDao.java
@@ -1,5 +1,6 @@
package de.ids_mannheim.korap.oauth2.dao;
+import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Set;
@@ -12,9 +13,12 @@
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.FullConfiguration;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import de.ids_mannheim.korap.oauth2.constant.OAuth2Error;
@@ -30,7 +34,9 @@
@PersistenceContext
private EntityManager entityManager;
-
+ @Autowired
+ private FullConfiguration config;
+
public Authorization storeAuthorizationCode (String clientId, String userId,
String code, Set<AccessScope> scopes, String redirectURI,
ZonedDateTime authenticationTime, String nonce)
@@ -50,6 +56,12 @@
authorization.setRedirectURI(redirectURI);
authorization.setUserAuthenticationTime(authenticationTime);
authorization.setNonce(nonce);
+
+ ZonedDateTime now =
+ ZonedDateTime.now(ZoneId.of(Attributes.DEFAULT_TIME_ZONE));
+ authorization.setCreatedDate(now);
+ authorization.setExpiryDate(
+ now.plusSeconds(config.getAuthorizationCodeExpiry()));
entityManager.persist(authorization);
// what if unique fails
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/AccessToken.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/AccessToken.java
index e9aa596..e7509d0 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/AccessToken.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/AccessToken.java
@@ -31,8 +31,10 @@
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String token;
- @Column(name = "created_date")
+ @Column(name = "created_date", updatable = false)
private ZonedDateTime createdDate;
+ @Column(name = "expiry_date", updatable = false)
+ private ZonedDateTime expiryDate;
@Column(name = "user_id")
private String userId;
@Column(name = "client_id")
@@ -43,6 +45,8 @@
private ZonedDateTime userAuthenticationTime;
@Column(name = "refresh_token", updatable = false)
private String refreshToken;
+ @Column(name = "refresh_expiry_date", updatable = false)
+ private ZonedDateTime refreshTokenExpiryDate;
@Column(name = "is_refresh_revoked")
private boolean isRefreshTokenRevoked;
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/Authorization.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/Authorization.java
index bbd954b..bb38fb5 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/Authorization.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/entity/Authorization.java
@@ -35,6 +35,8 @@
private String redirectURI;
@Column(name = "created_date", updatable = false)
private ZonedDateTime createdDate;
+ @Column(name = "expiry_date")
+ private ZonedDateTime expiryDate;
@Column(name = "is_revoked")
private boolean isRevoked;
@Column(name = "total_attempts")
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/oltu/service/OltuTokenService.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/oltu/service/OltuTokenService.java
index 1aba796..7730b1e 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/oltu/service/OltuTokenService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/oltu/service/OltuTokenService.java
@@ -124,8 +124,7 @@
OAuth2Error.INVALID_GRANT);
}
else if (ZonedDateTime.now(ZoneId.of(Attributes.DEFAULT_TIME_ZONE))
- .isAfter(origin.getCreatedDate()
- .plusSeconds(config.getRefreshTokenExpiry()))) {
+ .isAfter(origin.getRefreshTokenExpiryDate())) {
throw new KustvaktException(StatusCodes.INVALID_REFRESH_TOKEN,
"Refresh token is expired.", OAuth2Error.INVALID_GRANT);
}
@@ -221,7 +220,7 @@
if (scopes == null || scopes.isEmpty()) {
scopes = new HashSet<String>(1);
scopes.add("all");
-// scopes = config.getDefaultAccessScopes();
+ // scopes = config.getDefaultAccessScopes();
}
ZonedDateTime authenticationTime =
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2AuthorizationService.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2AuthorizationService.java
index ae29e4c..a8e7106 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2AuthorizationService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2AuthorizationService.java
@@ -1,5 +1,6 @@
package de.ids_mannheim.korap.oauth2.service;
+import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Set;
@@ -8,6 +9,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import de.ids_mannheim.korap.config.Attributes;
import de.ids_mannheim.korap.config.FullConfiguration;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
@@ -123,7 +125,6 @@
return redirectUri;
}
-
public Authorization retrieveAuthorization (String code)
throws KustvaktException {
return authorizationDao.retrieveAuthorizationCode(code);
@@ -143,7 +144,7 @@
"Invalid authorization", OAuth2Error.INVALID_GRANT);
}
- if (isExpired(authorization.getCreatedDate())) {
+ if (isExpired(authorization.getExpiryDate())) {
throw new KustvaktException(StatusCodes.INVALID_AUTHORIZATION,
"Authorization expired", OAuth2Error.INVALID_GRANT);
}
@@ -175,14 +176,13 @@
authorizationDao.updateAuthorization(authorization);
}
- private boolean isExpired (ZonedDateTime createdDate) {
- jlog.debug("createdDate: " + createdDate);
- ZonedDateTime expiration =
- createdDate.plusSeconds(config.getAuthorizationCodeExpiry());
- ZonedDateTime now = ZonedDateTime.now();
- jlog.debug("expiration: " + expiration + ", now: " + now);
+ private boolean isExpired (ZonedDateTime expiryDate) {
+ ZonedDateTime now =
+ ZonedDateTime.now(ZoneId.of(Attributes.DEFAULT_TIME_ZONE));
+ jlog.debug("createdDate: " + expiryDate);
+ jlog.debug("expiration: " + expiryDate + ", now: " + now);
- if (expiration.isAfter(now)) {
+ if (expiryDate.isAfter(now)) {
return false;
}
return true;
diff --git a/full/src/main/resources/db/insert/V3.5__insert_oauth2_clients.sql b/full/src/main/resources/db/insert/V3.5__insert_oauth2_clients.sql
index 68bbfa7..0d518a3 100644
--- a/full/src/main/resources/db/insert/V3.5__insert_oauth2_clients.sql
+++ b/full/src/main/resources/db/insert/V3.5__insert_oauth2_clients.sql
@@ -47,6 +47,7 @@
-- "https://korap.ids-mannheim.de/public/redirect","system",
-- "This is a test super public client.");
-INSERT INTO oauth2_access_token(token,user_id,created_date, user_auth_time)
-VALUES("fia0123ikBWn931470H8s5gRqx7Moc4p","marlin","2018-05-30 16:25:50",
-"2018-05-30 16:23:10");
\ No newline at end of file
+INSERT INTO oauth2_access_token(token,user_id,created_date,
+expiry_date, refresh_expiry_date, user_auth_time)
+VALUES("fia0123ikBWn931470H8s5gRqx7Moc4p","marlin","2018-05-30 16:25:50",
+"2018-05-31 16:25:50", "2018-08-30 16:25:50", "2018-05-30 16:23:10");
diff --git a/full/src/main/resources/db/new-mysql/V1.4__oauth2_tables.sql b/full/src/main/resources/db/new-mysql/V1.4__oauth2_tables.sql
index 4c35fca..10e069d 100644
--- a/full/src/main/resources/db/new-mysql/V1.4__oauth2_tables.sql
+++ b/full/src/main/resources/db/new-mysql/V1.4__oauth2_tables.sql
@@ -11,7 +11,7 @@
name VARCHAR(200) NOT NULL,
secret VARCHAR(200) DEFAULT NULL,
type VARCHAR(200) NOT NULL,
- native BOOLEAN DEFAULT FALSE,
+ super BOOLEAN DEFAULT FALSE,
redirect_uri TEXT DEFAULT NULL,
description VARCHAR(250) NOT NULL,
registered_by VARCHAR(100) NOT NULL,
@@ -27,6 +27,7 @@
user_id VARCHAR(100) NOT NULL,
redirect_uri TEXT DEFAULT NULL,
created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ expiry_date TIMESTAMP NULL,
is_revoked BOOLEAN DEFAULT 0,
total_attempts INTEGER DEFAULT 0,
user_auth_time TIMESTAMP NULL,
@@ -57,9 +58,11 @@
user_id VARCHAR(100) DEFAULT NULL,
client_id VARCHAR(100) DEFAULT NULL,
created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ expiry_date TIMESTAMP NULL,
is_revoked BOOLEAN DEFAULT 0,
user_auth_time TIMESTAMP NULL,
refresh_token VARCHAR(255) DEFAULT NULL,
+ refresh_expiry_date TIMESTAMP NULL,
is_refresh_revoked BOOLEAN DEFAULT 0,
FOREIGN KEY (client_id)
REFERENCES oauth2_client(id)
diff --git a/full/src/main/resources/db/new-sqlite/V1.4__oauth2_tables.sql b/full/src/main/resources/db/new-sqlite/V1.4__oauth2_tables.sql
index 47f0a0f..45fa1f4 100644
--- a/full/src/main/resources/db/new-sqlite/V1.4__oauth2_tables.sql
+++ b/full/src/main/resources/db/new-sqlite/V1.4__oauth2_tables.sql
@@ -28,7 +28,8 @@
client_id VARCHAR(100) NOT NULL,
user_id VARCHAR(100) NOT NULL,
redirect_uri TEXT DEFAULT NULL,
- created_date TIMESTAMP DEFAULT (datetime('now','localtime')),
+ created_date TIMESTAMP NOT NULL,
+ expiry_date TIMESTAMP NOT NULL,
is_revoked BOOLEAN DEFAULT 0,
total_attempts INTEGER DEFAULT 0,
user_auth_time TIMESTAMP NOT NULL,
@@ -61,10 +62,12 @@
token VARCHAR(255) NOT NULL,
user_id VARCHAR(100) DEFAULT NULL,
client_id VARCHAR(100) DEFAULT NULL,
- created_date TIMESTAMP DEFAULT (datetime('now','localtime')),
+ created_date TIMESTAMP NOT NULL,
+ expiry_date TIMESTAMP NOT NULL,
is_revoked BOOLEAN DEFAULT 0,
user_auth_time TIMESTAMP NOT NULL,
refresh_token VARCHAR(255) DEFAULT NULL,
+ refresh_expiry_date TIMESTAMP NOT NULL,
is_refresh_revoked BOOLEAN DEFAULT 0,
FOREIGN KEY (client_id)
REFERENCES oauth2_client(id)
diff --git a/full/src/main/resources/db/new-sqlite/V1.5__oauth2_triggers.sql b/full/src/main/resources/db/new-sqlite/V1.5__oauth2_triggers.sql
index d62e4df..96329af 100644
--- a/full/src/main/resources/db/new-sqlite/V1.5__oauth2_triggers.sql
+++ b/full/src/main/resources/db/new-sqlite/V1.5__oauth2_triggers.sql
@@ -1,14 +1,15 @@
-CREATE TRIGGER insert_authorization_date AFTER INSERT ON oauth2_authorization
- BEGIN
- UPDATE oauth2_authorization
- SET created_date = DATETIME('now', 'localtime')
- WHERE rowid = new.rowid;
- END;
-
-CREATE TRIGGER insert_access_token_date AFTER INSERT ON oauth2_access_token
- BEGIN
- UPDATE oauth2_access_token
- SET created_date = DATETIME('now', 'localtime')
- WHERE rowid = new.rowid;
- END;
+--CREATE TRIGGER insert_authorization_date AFTER INSERT ON oauth2_authorization
+-- BEGIN
+-- UPDATE oauth2_authorization
+-- SET created_date = DATETIME('now', 'localtime')
+-- WHERE rowid = new.rowid;
+-- END;
+--
+--
+--CREATE TRIGGER insert_access_token_date AFTER INSERT ON oauth2_access_token
+-- BEGIN
+-- UPDATE oauth2_access_token
+-- SET created_date = DATETIME('now', 'localtime')
+-- WHERE rowid = new.rowid;
+-- END;
\ No newline at end of file
diff --git a/full/src/main/resources/default-config.xml b/full/src/main/resources/default-config.xml
index 32ebb35..f9ce666 100644
--- a/full/src/main/resources/default-config.xml
+++ b/full/src/main/resources/default-config.xml
@@ -139,6 +139,7 @@
</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider}</prop>
<prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory}</prop>
+ <prop key="hibernate.jdbc.time_zone">${hibernate.jdbc.time_zone}</prop>
<!-- <prop key="net.sf.ehcache.configurationResourceName">classpath:ehcache.xml</prop> -->
</props>
</property>
diff --git a/full/src/main/resources/properties/hibernate.properties b/full/src/main/resources/properties/hibernate.properties
index 161b737..199dc73 100644
--- a/full/src/main/resources/properties/hibernate.properties
+++ b/full/src/main/resources/properties/hibernate.properties
@@ -4,4 +4,5 @@
hibernate.cache.use_query_cache=false
hibernate.cache.use_second_level_cache=false
hibernate.cache.provider=org.hibernate.cache.EhCacheProvider
-hibernate.cache.region.factory=org.hibernate.cache.ehcache.EhCacheRegionFactory
\ No newline at end of file
+hibernate.cache.region.factory=org.hibernate.cache.ehcache.EhCacheRegionFactory
+hibernate.jdbc.time_zone=UTC
\ No newline at end of file
diff --git a/full/src/main/resources/properties/jdbc.properties b/full/src/main/resources/properties/jdbc.properties
index 1afe44b..1f5e8ab 100644
--- a/full/src/main/resources/properties/jdbc.properties
+++ b/full/src/main/resources/properties/jdbc.properties
@@ -4,7 +4,7 @@
#jdbc.database=mysql
#jdbc.driverClassName=com.mysql.jdbc.Driver
-#jdbc.url=jdbc:mysql://localhost:3306/kustvakt?autoReconnect=true&useLegacyDatetimeCode=false
+#jdbc.url=jdbc:mysql://localhost:3306/kustvakt?autoReconnect=true&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
#jdbc.username=korap
#jdbc.password=password
diff --git a/full/src/test/resources/test-config.xml b/full/src/test/resources/test-config.xml
index f438fd2..945720b 100644
--- a/full/src/test/resources/test-config.xml
+++ b/full/src/test/resources/test-config.xml
@@ -140,6 +140,7 @@
</prop>
<prop key="hibernate.cache.provider_class">${hibernate.cache.provider}</prop>
<prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory}</prop>
+ <prop key="hibernate.jdbc.time_zone">${hibernate.jdbc.time_zone}</prop>
<!-- <prop key="net.sf.ehcache.configurationResourceName">classpath:ehcache.xml</prop> -->
</props>
</property>
diff --git a/full/src/test/resources/test-hibernate.properties b/full/src/test/resources/test-hibernate.properties
index 161b737..199dc73 100644
--- a/full/src/test/resources/test-hibernate.properties
+++ b/full/src/test/resources/test-hibernate.properties
@@ -4,4 +4,5 @@
hibernate.cache.use_query_cache=false
hibernate.cache.use_second_level_cache=false
hibernate.cache.provider=org.hibernate.cache.EhCacheProvider
-hibernate.cache.region.factory=org.hibernate.cache.ehcache.EhCacheRegionFactory
\ No newline at end of file
+hibernate.cache.region.factory=org.hibernate.cache.ehcache.EhCacheRegionFactory
+hibernate.jdbc.time_zone=UTC
\ No newline at end of file