From e1f32c274bececb156718829eb0cfc85f39b615b Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 27 Aug 2025 19:09:56 +0200 Subject: [PATCH] implemented brute force counter measure --- .../umbrella/core/ConnectionProvider.java | 9 ++- frontend/src/Components/Login.svelte | 12 ++- frontend/src/user.svelte.js | 4 +- translations/src/main/resources/de.json | 1 + .../srsoftware/umbrella/user/Constants.java | 5 +- .../srsoftware/umbrella/user/UserModule.java | 9 +++ .../srsoftware/umbrella/user/model/Lock.java | 60 +++++++++++++++ .../umbrella/user/sqlite/SqliteDB.java | 73 +++++-------------- 8 files changed, 111 insertions(+), 62 deletions(-) create mode 100644 user/src/main/java/de/srsoftware/umbrella/user/model/Lock.java diff --git a/core/src/main/java/de/srsoftware/umbrella/core/ConnectionProvider.java b/core/src/main/java/de/srsoftware/umbrella/core/ConnectionProvider.java index c5f5df1..456667b 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/ConnectionProvider.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/ConnectionProvider.java @@ -1,6 +1,8 @@ /* © SRSoftware 2025 */ package de.srsoftware.umbrella.core; +import static java.lang.System.Logger.Level.INFO; + import java.io.File; import java.sql.Connection; import java.sql.SQLException; @@ -8,7 +10,7 @@ import java.util.HashMap; import org.sqlite.SQLiteDataSource; public class ConnectionProvider { - + private static final System.Logger LOG = System.getLogger(ConnectionProvider.class.getSimpleName()); private static final HashMap connections = new HashMap<>(); private ConnectionProvider(){} @@ -17,7 +19,10 @@ public class ConnectionProvider { if (o instanceof String filename) o = new File(filename); if (o instanceof File dbFile) try { var conn = connections.get(dbFile); - if (conn == null) connections.put(dbFile, conn = open(dbFile)); + if (conn == null) { + connections.put(dbFile, conn = open(dbFile)); + LOG.log(INFO,"Using {0}",dbFile); + } return conn; } catch (SQLException sqle) { throw new RuntimeException(sqle); diff --git a/frontend/src/Components/Login.svelte b/frontend/src/Components/Login.svelte index 912f40c..c0e86b2 100644 --- a/frontend/src/Components/Login.svelte +++ b/frontend/src/Components/Login.svelte @@ -9,11 +9,16 @@ let credentials = $state({ username : null, password : null }); const router = useTinyRouter(); let services = $state([]); + let error = $state(null); - function doLogin(ev){ + async function doLogin(ev){ ev.preventDefault(); - tryLogin(credentials); + const json = await tryLogin(credentials); + if (json) { + json.release_time = json.release_time.replace('T',' '); + error = t('failed_login_attempts',json); + } } function init(element){ @@ -76,6 +81,9 @@
+ {#if error} + {error} + {/if} {t('login')}