|
|
|
|
@ -8,15 +8,15 @@ import static de.srsoftware.umbrella.core.Constants.*;
@@ -8,15 +8,15 @@ import static de.srsoftware.umbrella.core.Constants.*;
|
|
|
|
|
import static de.srsoftware.umbrella.user.Constants.*; |
|
|
|
|
import static de.srsoftware.umbrella.user.model.DbUser.ADMIN_PERMISSIONS; |
|
|
|
|
import static java.lang.System.Logger.Level.*; |
|
|
|
|
import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED; |
|
|
|
|
import static java.text.MessageFormat.format; |
|
|
|
|
import static java.time.ZoneOffset.UTC; |
|
|
|
|
|
|
|
|
|
import de.srsoftware.tools.PasswordHasher; |
|
|
|
|
import de.srsoftware.tools.jdbc.Query; |
|
|
|
|
import de.srsoftware.umbrella.core.BaseDb; |
|
|
|
|
import de.srsoftware.umbrella.core.exceptions.UmbrellaException; |
|
|
|
|
import de.srsoftware.umbrella.core.model.EmailAddress; |
|
|
|
|
import de.srsoftware.umbrella.core.model.Session; |
|
|
|
|
import de.srsoftware.umbrella.core.model.Token; |
|
|
|
|
import de.srsoftware.umbrella.core.model.UmbrellaUser; |
|
|
|
|
import de.srsoftware.umbrella.core.model.*; |
|
|
|
|
import de.srsoftware.umbrella.user.BadHasher; |
|
|
|
|
import de.srsoftware.umbrella.user.api.LoginServiceDb; |
|
|
|
|
import de.srsoftware.umbrella.user.api.UserDb; |
|
|
|
|
@ -29,20 +29,15 @@ import java.sql.ResultSet;
@@ -29,20 +29,15 @@ import java.sql.ResultSet;
|
|
|
|
|
import java.sql.SQLException; |
|
|
|
|
import java.time.Instant; |
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
|
import java.time.ZoneOffset; |
|
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
|
|
public class SqliteDB implements LoginServiceDb, UserDb { |
|
|
|
|
public class SqliteDB extends BaseDb implements LoginServiceDb, UserDb { |
|
|
|
|
private static final System.Logger LOG = System.getLogger(SqliteDB.class.getSimpleName()); |
|
|
|
|
|
|
|
|
|
private static final int INITIAL_DB_VERSION = 4; |
|
|
|
|
|
|
|
|
|
private HashMap<String,Session> sessions = new HashMap<>(); |
|
|
|
|
private final Connection db; |
|
|
|
|
|
|
|
|
|
public SqliteDB(Connection conn){ |
|
|
|
|
db = conn; |
|
|
|
|
init(); |
|
|
|
|
super(conn); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -94,43 +89,21 @@ CREATE TABLE IF NOT EXISTS {0} (
@@ -94,43 +89,21 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private int createSettingsTable() { |
|
|
|
|
var createTable = """ |
|
|
|
|
CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) NOT NULL); |
|
|
|
|
"""; |
|
|
|
|
try { |
|
|
|
|
var stmt = db.prepareStatement(format(createTable,TABLE_SETTINGS, KEY, VALUE)); |
|
|
|
|
stmt.execute(); |
|
|
|
|
stmt.close(); |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
LOG.log(ERROR,ERROR_FAILED_CREATE_TABLE,TABLE_SETTINGS,e); |
|
|
|
|
throw new RuntimeException(e); |
|
|
|
|
protected int createTables() { |
|
|
|
|
int currentVersion = createSettingsTable(); |
|
|
|
|
switch (currentVersion){ |
|
|
|
|
case 0: |
|
|
|
|
case 1: |
|
|
|
|
case 2: |
|
|
|
|
case 3: |
|
|
|
|
createUserTables(); |
|
|
|
|
createLoginServiceTables(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Integer version = null; |
|
|
|
|
try { |
|
|
|
|
var rs = Query.select(VALUE).from(TABLE_SETTINGS).where(KEY, equal(DB_VERSION)).exec(db); |
|
|
|
|
if (rs.next()) version = rs.getInt(VALUE); |
|
|
|
|
rs.close(); |
|
|
|
|
if (version == null) { |
|
|
|
|
version = INITIAL_DB_VERSION; |
|
|
|
|
insertInto(TABLE_SETTINGS, KEY, VALUE).values(DB_VERSION,version).execute(db).close(); |
|
|
|
|
} |
|
|
|
|
return setCurrentVersion(4); |
|
|
|
|
|
|
|
|
|
return version; |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
LOG.log(ERROR,ERROR_READ_TABLE,DB_VERSION,TABLE_SETTINGS,e); |
|
|
|
|
throw new RuntimeException(e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int createTables() { |
|
|
|
|
createUserTables(); |
|
|
|
|
createLoginServiceTables(); |
|
|
|
|
return createSettingsTable(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void createUserTables() { |
|
|
|
|
PasswordHasher<String> hasher; |
|
|
|
|
@ -287,13 +260,6 @@ CREATE TABLE IF NOT EXISTS {0} (
@@ -287,13 +260,6 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|
|
|
|
return userId; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void init(){ |
|
|
|
|
var version = createTables(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Map<Long, UmbrellaUser> list(Integer start, Integer limit, Collection<Long> ids) throws UmbrellaException { |
|
|
|
|
var list = new HashMap<Long, UmbrellaUser>(); |
|
|
|
|
@ -423,9 +389,8 @@ CREATE TABLE IF NOT EXISTS {0} (
@@ -423,9 +389,8 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|
|
|
|
rs.close(); |
|
|
|
|
} catch (SQLException e) { |
|
|
|
|
LOG.log(WARNING,"Failed to load user \"{0}\"!",key,e); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
if (user == null) throw new UmbrellaException(401,"Failed to load user \"{0}\"!",key); |
|
|
|
|
if (user == null) throw new UmbrellaException(HTTP_UNAUTHORIZED,"Failed to load user \"{0}\"!",key); |
|
|
|
|
return user; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
@ -447,7 +412,7 @@ CREATE TABLE IF NOT EXISTS {0} (
@@ -447,7 +412,7 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public long now() { |
|
|
|
|
return LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); |
|
|
|
|
return LocalDateTime.now().toEpochSecond(UTC); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
@ -516,7 +481,7 @@ CREATE TABLE IF NOT EXISTS {0} (
@@ -516,7 +481,7 @@ CREATE TABLE IF NOT EXISTS {0} (
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public Instant then(){ |
|
|
|
|
return LocalDateTime.now().plus(DEFAULT_SESSION_DURATION).toInstant(ZoneOffset.UTC); |
|
|
|
|
return LocalDateTime.now().plus(DEFAULT_SESSION_DURATION).toInstant(UTC); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private ForeignLogin toForeignLogin(ResultSet rs) throws SQLException { |
|
|
|
|
|