Сделал авторификацию новую через sessionKey

(Но пока тесты сессии падают)
This commit is contained in:
AidarKC
2026-01-23 20:50:58 +03:00
parent 580695b486
commit e84c63c3d1
27 changed files with 1010 additions and 849 deletions
@@ -18,9 +18,9 @@ import java.sql.Statement;
* - создаём ТОЛЬКО таблицы/индексы
* - в конце вызываем DatabaseTriggersInstaller.createAllTriggers(st)
*
* Зачем так:
* - триггеры часто ломают совместимость с внешними SQLite-просмотрщиками/сборками
* - проще поддерживать/мигрировать
* v2 (sessions):
* - active_sessions.session_pwd удалён
* - active_sessions.session_key хранит публичный ключ сессии (sessionPubKeyB64)
*/
public final class DatabaseInitializer {
@@ -28,25 +28,16 @@ public final class DatabaseInitializer {
/* ===================== TEXT (msg_type=1) ===================== */
/** Новое сообщение (начало ветки). */
public static final short TEXT_NEW = 1;
/** Ответ на сообщение (reply). */
public static final short TEXT_REPLY = 2;
/** Репост (repost). */
public static final short TEXT_REPOST = 3;
/** Редактирование (edit). ВАЖНО: серверное значение = 10. */
public static final short TEXT_EDIT = 10;
/* ===================== REACTION (msg_type=2) ===================== */
/** Лайк (LIKE). */
public static final short REACTION_LIKE = 1;
/* ===================== CONNECTION (msg_type=3) ===================== */
// FRIEND=10/11, CONTACT=20/21, FOLLOW=30/31
public static final short CONNECTION_FRIEND = 10;
public static final short CONNECTION_UNFRIEND = 11;
@@ -123,12 +114,12 @@ public final class DatabaseInitializer {
ON solana_users (login);
""");
// 2. active_sessions
// 2. active_sessions (v2)
st.executeUpdate("""
CREATE TABLE IF NOT EXISTS active_sessions (
session_id TEXT NOT NULL PRIMARY KEY,
login TEXT NOT NULL,
session_pwd TEXT NOT NULL,
session_key TEXT NOT NULL,
storage_pwd TEXT NOT NULL,
session_created_at_ms INTEGER NOT NULL,
last_authirificated_at_ms INTEGER NOT NULL,
@@ -325,7 +316,6 @@ public final class DatabaseInitializer {
ON message_stats (to_login);
""");
// ВАЖНО: триггеры ставим отдельно
DatabaseTriggersInstaller.createAllTriggers(st);
}
}
@@ -32,13 +32,12 @@ public final class ActiveSessionsDAO {
// -------------------- INSERT --------------------
/** Вставка с внешним соединением. Соединение НЕ закрывает. */
public void insert(Connection c, ActiveSessionEntry session) throws SQLException {
String sql = """
INSERT INTO active_sessions (
session_id,
login,
session_pwd,
session_key,
storage_pwd,
session_created_at_ms,
last_authirificated_at_ms,
@@ -55,7 +54,7 @@ public final class ActiveSessionsDAO {
try (PreparedStatement ps = c.prepareStatement(sql)) {
ps.setString(1, session.getSessionId());
ps.setString(2, session.getLogin());
ps.setString(3, session.getSessionPwd());
ps.setString(3, session.getSessionKey());
ps.setString(4, session.getStoragePwd());
ps.setLong(5, session.getSessionCreatedAtMs());
ps.setLong(6, session.getLastAuthirificatedAtMs());
@@ -70,7 +69,6 @@ public final class ActiveSessionsDAO {
}
}
/** Вставка без внешнего соединения. Сам открывает/закрывает. */
public void insert(ActiveSessionEntry session) throws SQLException {
try (Connection c = db.getConnection()) {
insert(c, session);
@@ -79,13 +77,12 @@ public final class ActiveSessionsDAO {
// -------------------- SELECT --------------------
/** Получить по sessionId с внешним соединением. Соединение НЕ закрывает. */
public ActiveSessionEntry getBySessionId(Connection c, String sessionId) throws SQLException {
String sql = """
SELECT
session_id,
login,
session_pwd,
session_key,
storage_pwd,
session_created_at_ms,
last_authirificated_at_ms,
@@ -109,20 +106,18 @@ public final class ActiveSessionsDAO {
}
}
/** Получить по sessionId без внешнего соединения. Сам открывает/закрывает. */
public ActiveSessionEntry getBySessionId(String sessionId) throws SQLException {
try (Connection c = db.getConnection()) {
return getBySessionId(c, sessionId);
}
}
/** Получить список по login с внешним соединением. Соединение НЕ закрывает. */
public List<ActiveSessionEntry> getByLogin(Connection c, String login) throws SQLException {
String sql = """
SELECT
session_id,
login,
session_pwd,
session_key,
storage_pwd,
session_created_at_ms,
last_authirificated_at_ms,
@@ -149,7 +144,6 @@ public final class ActiveSessionsDAO {
return result;
}
/** Получить список по login без внешнего соединения. Сам открывает/закрывает. */
public List<ActiveSessionEntry> getByLogin(String login) throws SQLException {
try (Connection c = db.getConnection()) {
return getByLogin(c, login);
@@ -158,7 +152,6 @@ public final class ActiveSessionsDAO {
// -------------------- UPDATE --------------------
/** Обновить lastAuthirificatedAtMs с внешним соединением. Соединение НЕ закрывает. */
public void updateLastAuthirificatedAtMs(Connection c, String sessionId, long lastAuthMs) throws SQLException {
String sql = """
UPDATE active_sessions
@@ -173,14 +166,12 @@ public final class ActiveSessionsDAO {
}
}
/** Обновить lastAuthirificatedAtMs без внешнего соединения. Сам открывает/закрывает. */
public void updateLastAuthirificatedAtMs(String sessionId, long lastAuthMs) throws SQLException {
try (Connection c = db.getConnection()) {
updateLastAuthirificatedAtMs(c, sessionId, lastAuthMs);
}
}
/** Обновить данные refresh с внешним соединением. Соединение НЕ закрывает. */
public void updateOnRefresh(
Connection c,
String sessionId,
@@ -213,7 +204,6 @@ public final class ActiveSessionsDAO {
}
}
/** Обновить данные refresh без внешнего соединения. Сам открывает/закрывает. */
public void updateOnRefresh(
String sessionId,
long lastAuthMs,
@@ -229,7 +219,6 @@ public final class ActiveSessionsDAO {
// -------------------- DELETE --------------------
/** Удалить по sessionId с внешним соединением. Соединение НЕ закрывает. */
public void deleteBySessionId(Connection c, String sessionId) throws SQLException {
String sql = "DELETE FROM active_sessions WHERE session_id = ?";
@@ -239,7 +228,6 @@ public final class ActiveSessionsDAO {
}
}
/** Удалить по sessionId без внешнего соединения. Сам открывает/закрывает. */
public void deleteBySessionId(String sessionId) throws SQLException {
try (Connection c = db.getConnection()) {
deleteBySessionId(c, sessionId);
@@ -251,7 +239,7 @@ public final class ActiveSessionsDAO {
private ActiveSessionEntry mapRow(ResultSet rs) throws SQLException {
String sessionId = rs.getString("session_id");
String login = rs.getString("login");
String sessionPwd = rs.getString("session_pwd");
String sessionKey = rs.getString("session_key");
String storagePwd = rs.getString("storage_pwd");
long sessionCreatedAtMs = rs.getLong("session_created_at_ms");
long lastAuthirificatedAtMs = rs.getLong("last_authirificated_at_ms");
@@ -266,7 +254,7 @@ public final class ActiveSessionsDAO {
return new ActiveSessionEntry(
sessionId,
login,
sessionPwd,
sessionKey,
storagePwd,
sessionCreatedAtMs,
lastAuthirificatedAtMs,
@@ -7,10 +7,14 @@ public class ActiveSessionEntry {
private String sessionId;
private String login;
private String sessionPwd;
/** session_key: публичный ключ сессии (base64 от 32 байт). */
private String sessionKey;
private String storagePwd;
private long sessionCreatedAtMs;
private long lastAuthirificatedAtMs;
private String pushEndpoint;
private String pushP256dhKey;
private String pushAuthKey;
@@ -20,12 +24,11 @@ public class ActiveSessionEntry {
private String clientInfoFromRequest;
private String userLanguage;
public ActiveSessionEntry() {
}
public ActiveSessionEntry() { }
public ActiveSessionEntry(String sessionId,
String login,
String sessionPwd,
String sessionKey,
String storagePwd,
long sessionCreatedAtMs,
long lastAuthirificatedAtMs,
@@ -38,7 +41,7 @@ public class ActiveSessionEntry {
String userLanguage) {
this.sessionId = sessionId;
this.login = login;
this.sessionPwd = sessionPwd;
this.sessionKey = sessionKey;
this.storagePwd = storagePwd;
this.sessionCreatedAtMs = sessionCreatedAtMs;
this.lastAuthirificatedAtMs = lastAuthirificatedAtMs;
@@ -57,8 +60,8 @@ public class ActiveSessionEntry {
public String getLogin() { return login; }
public void setLogin(String login) { this.login = login; }
public String getSessionPwd() { return sessionPwd; }
public void setSessionPwd(String sessionPwd) { this.sessionPwd = sessionPwd; }
public String getSessionKey() { return sessionKey; }
public void setSessionKey(String sessionKey) { this.sessionKey = sessionKey; }
public String getStoragePwd() { return storagePwd; }
public void setStoragePwd(String storagePwd) { this.storagePwd = storagePwd; }