diff --git a/pom.xml b/pom.xml index b8eb2eb..12d7a2c 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ UTF-8 - 1.13.0 + 2.0.5 @@ -88,11 +88,13 @@ org.apache.shiro shiro-core ${shiro.version} + jakarta org.apache.shiro shiro-web ${shiro.version} + jakarta diff --git a/src/main/java/com/epimorphics/appbase/security/AppRealm.java b/src/main/java/com/epimorphics/appbase/security/AppRealm.java index ea438e3..f5be5a0 100644 --- a/src/main/java/com/epimorphics/appbase/security/AppRealm.java +++ b/src/main/java/com/epimorphics/appbase/security/AppRealm.java @@ -18,6 +18,8 @@ import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.SaltedAuthenticationInfo; import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.authc.credential.CredentialsMatcher; +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.cache.Cache; @@ -52,8 +54,8 @@ public static AppRealm getRealm() { public AppRealm() { setCredentialsMatcher( new AppRealmCredentialsMatcher() ); DefaultHashService hashing = new DefaultHashService(); - hashing.setHashAlgorithmName( DEFAULT_ALGORITHM ); - hashing.setHashIterations( DEFAULT_ITERATIONS ); + hashing.setDefaultAlgorithmName( DEFAULT_ALGORITHM ); + // hashing.setHashIterations( DEFAULT_ITERATIONS ); hashService = hashing; } @@ -62,8 +64,19 @@ public AppRealm() { * Must be set before any new credentials (including bootstrap ones) are hashed. */ public void setHashIterations(int iterations) { - ((DefaultHashService) hashService).setHashIterations(iterations); - ((AppRealmCredentialsMatcher)getCredentialsMatcher()).setHashIterations(iterations); + CredentialsMatcher cm = getCredentialsMatcher(); + if (cm instanceof HashedCredentialsMatcher hcm) { + hcm.setHashIterations(iterations); + } + } + + public int getHashIterations() { + CredentialsMatcher cm = getCredentialsMatcher(); + if (cm instanceof HashedCredentialsMatcher hcm) { + return hcm.getHashIterations(); + } else { + return 0; + } } /** diff --git a/src/main/java/com/epimorphics/appbase/security/BaseUserStore.java b/src/main/java/com/epimorphics/appbase/security/BaseUserStore.java index bfcd310..37af97e 100644 --- a/src/main/java/com/epimorphics/appbase/security/BaseUserStore.java +++ b/src/main/java/com/epimorphics/appbase/security/BaseUserStore.java @@ -31,11 +31,11 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.SaltedAuthenticationInfo; import org.apache.shiro.authc.SimpleAuthenticationInfo; -import org.apache.shiro.codec.Hex; +import org.apache.shiro.lang.codec.Hex; import org.apache.shiro.crypto.SecureRandomNumberGenerator; import org.apache.shiro.crypto.hash.Hash; import org.apache.shiro.crypto.hash.HashRequest; -import org.apache.shiro.util.ByteSource; +import org.apache.shiro.lang.util.ByteSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -305,6 +305,7 @@ public void setPassword(ByteSource password, long minstolive) { HashRequest request = new HashRequest.Builder() .setSource(password) .setSalt( getSalt() ) + .addParameter("SimpleHash.iterations", realm.getHashIterations()) .build(); Hash hash = realm.getHashService().computeHash(request); this.password = hash.toHex(); diff --git a/src/main/java/com/epimorphics/appbase/security/DBUserStore.java b/src/main/java/com/epimorphics/appbase/security/DBUserStore.java index abb04d1..fbe5a20 100644 --- a/src/main/java/com/epimorphics/appbase/security/DBUserStore.java +++ b/src/main/java/com/epimorphics/appbase/security/DBUserStore.java @@ -33,8 +33,9 @@ import java.util.List; import java.util.Set; +import org.apache.jena.atlas.web.TypedInputStream; import org.apache.jena.riot.system.stream.StreamManager; -import org.apache.shiro.util.ByteSource; +import org.apache.shiro.lang.util.ByteSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,8 +82,10 @@ protected boolean initstore() { if (!exists) { startTransaction(); - String schema = FileManager.get().readWholeFileAsUTF8(DATABASE_SCHEMA); - Statement s = conn.createStatement(); + String schema; + try (TypedInputStream input = StreamManager.get().open(DATABASE_SCHEMA)) { + schema = new String(input.readAllBytes()); + } Statement s = conn.createStatement(); for (String statement : schema.split(";")) { String sql = statement.trim(); if (!sql.isEmpty() && ! sql.startsWith("--")) { diff --git a/src/main/java/com/epimorphics/appbase/security/Login.java b/src/main/java/com/epimorphics/appbase/security/Login.java index eff14c9..5cfbe48 100644 --- a/src/main/java/com/epimorphics/appbase/security/Login.java +++ b/src/main/java/com/epimorphics/appbase/security/Login.java @@ -25,7 +25,7 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; -import org.apache.shiro.util.ByteSource; +import org.apache.shiro.lang.util.ByteSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/epimorphics/appbase/security/MemUserStore.java b/src/main/java/com/epimorphics/appbase/security/MemUserStore.java index b40fd02..3ec7a21 100644 --- a/src/main/java/com/epimorphics/appbase/security/MemUserStore.java +++ b/src/main/java/com/epimorphics/appbase/security/MemUserStore.java @@ -30,7 +30,7 @@ import java.util.Map; import java.util.Set; -import org.apache.shiro.util.ByteSource; +import org.apache.shiro.lang.util.ByteSource; /** diff --git a/src/main/java/com/epimorphics/appbase/security/UserStore.java b/src/main/java/com/epimorphics/appbase/security/UserStore.java index e6c7629..463e699 100644 --- a/src/main/java/com/epimorphics/appbase/security/UserStore.java +++ b/src/main/java/com/epimorphics/appbase/security/UserStore.java @@ -25,7 +25,7 @@ import java.util.Set; import org.apache.shiro.authc.SaltedAuthenticationInfo; -import org.apache.shiro.util.ByteSource; +import org.apache.shiro.lang.util.ByteSource; /** * Interface abstraction for the store of registered users. The actual diff --git a/src/test/java/com/epimorphics/appbase/security/TestUserStores.java b/src/test/java/com/epimorphics/appbase/security/TestUserStores.java index 52069de..70a9ae0 100644 --- a/src/test/java/com/epimorphics/appbase/security/TestUserStores.java +++ b/src/test/java/com/epimorphics/appbase/security/TestUserStores.java @@ -15,7 +15,7 @@ import java.util.Set; import org.apache.shiro.authc.SaltedAuthenticationInfo; -import org.apache.shiro.util.ByteSource; +import org.apache.shiro.lang.util.ByteSource; import org.junit.jupiter.api.Test; import com.epimorphics.appbase.security.BaseUserStore.UserRecord;