@ -10,7 +10,10 @@ import static java.util.Optional.empty;
import de.srsoftware.oidc.api.* ;
import de.srsoftware.oidc.api.* ;
import de.srsoftware.oidc.api.data.* ;
import de.srsoftware.oidc.api.data.* ;
import de.srsoftware.utils.Error ;
import de.srsoftware.utils.PasswordHasher ;
import de.srsoftware.utils.PasswordHasher ;
import de.srsoftware.utils.Payload ;
import de.srsoftware.utils.Result ;
import jakarta.mail.Authenticator ;
import jakarta.mail.Authenticator ;
import jakarta.mail.PasswordAuthentication ;
import jakarta.mail.PasswordAuthentication ;
import java.io.File ;
import java.io.File ;
@ -176,31 +179,32 @@ public class FileStore implements AuthorizationService, ClientService, SessionSe
}
}
@Override
@Override
public Optional < User > login ( String user , String password ) {
public Result < User > login ( String username , String password ) {
if ( ! json . has ( USERS ) ) return empty ( ) ;
if ( ! json . has ( USERS ) ) return Error . message ( ERROR_LOGIN_FAILED ) ;
var optLock = getLock ( user ) ;
if ( username = = null | | username . isBlank ( ) ) return Error . message ( ERROR_NO_USERNAME ) ;
var optLock = getLock ( username ) ;
if ( optLock . isPresent ( ) ) {
if ( optLock . isPresent ( ) ) {
var lock = optLock . get ( ) ;
var lock = optLock . get ( ) ;
LOG . log ( WARNING , "{} is locked after {} failed logins. Lock will be released at {}" , user , lock . attempts ( ) , lock . releaseTime ( ) ) ;
LOG . log ( WARNING , "{0 } is locked after {1 } failed logins. Lock will be released at {2 }" , username , lock . attempts ( ) , lock . releaseTime ( ) ) ;
return empty ( ) ;
return Error . message ( ERROR_LOCKED , ATTEMPTS , lock . attempts ( ) , RELEASE , lock . releaseTime ( ) ) ;
}
}
try {
try {
var users = json . getJSONObject ( USERS ) ;
var users = json . getJSONObject ( USERS ) ;
for ( String userId : users . keySet ( ) ) {
for ( String userId : users . keySet ( ) ) {
var userData = users . getJSONObject ( userId ) ;
var userData = users . getJSONObject ( userId ) ;
if ( KEYS . stream ( ) . map ( userData : : getString ) . noneMatch ( val - > val . equals ( user ) ) ) continue ;
if ( KEYS . stream ( ) . map ( userData : : getString ) . noneMatch ( val - > val . equals ( username ) ) ) continue ;
var loadedUser = User . of ( userData , userId ) . filter ( u - > passwordMatches ( password , u ) ) ;
var loadedUser = User . of ( userData , userId ) . filter ( u - > passwordMatches ( password , u ) ) ;
if ( loadedUser . isPresent ( ) ) {
if ( loadedUser . isPresent ( ) ) {
unlock ( user ) ;
unlock ( username ) ;
return loadedUser ;
return Payload . of ( loadedUser . get ( ) ) ;
}
}
lock ( userId ) ;
}
}
lock ( user ) ;
var lock = lock ( username ) ;
return empty ( ) ;
LOG . log ( WARNING , "Login failed for {0} → locking account until {1}" , username , lock . releaseTime ( ) ) ;
return Error . message ( ERROR_LOGIN_FAILED , RELEASE , lock . releaseTime ( ) ) ;
} catch ( Exception e ) {
} catch ( Exception e ) {
return empty ( ) ;
return Error . message ( ERROR_LOGIN_FAILED ) ;
}
}
}
}