SHA256
05 01 25
поменял все названия таблиц и полей в таблицах на стиль только маленькие буквы и разделение через "_" . Все тесты проходят норм
This commit is contained in:
@@ -2,27 +2,23 @@ package shine.db.entities;
|
||||
|
||||
/**
|
||||
* Модель активной сессии (таблица active_sessions).
|
||||
*
|
||||
* Теперь вместо loginId:
|
||||
* - login TEXT NOT NULL (FK -> solana_users(login))
|
||||
*/
|
||||
public class ActiveSessionEntry {
|
||||
|
||||
private String sessionId; // TEXT base64(32 bytes)
|
||||
private String login; // TEXT NOT NULL
|
||||
private String sessionPwd; // TEXT
|
||||
private String storagePwd; // TEXT
|
||||
private long sessionCreatedAtMs; // INTEGER
|
||||
private long lastAuthirificatedAtMs; // INTEGER
|
||||
private String pushEndpoint; // TEXT (nullable)
|
||||
private String pushP256dhKey; // TEXT (nullable)
|
||||
private String pushAuthKey; // TEXT (nullable)
|
||||
private String sessionId;
|
||||
private String login;
|
||||
private String sessionPwd;
|
||||
private String storagePwd;
|
||||
private long sessionCreatedAtMs;
|
||||
private long lastAuthirificatedAtMs;
|
||||
private String pushEndpoint;
|
||||
private String pushP256dhKey;
|
||||
private String pushAuthKey;
|
||||
|
||||
// Новые поля
|
||||
private String clientIp; // IP клиента при auth/refresh
|
||||
private String clientInfoFromClient; // строка от клиента (PWA)
|
||||
private String clientInfoFromRequest; // строка, собранная на сервере
|
||||
private String userLanguage; // prefer-language (например, "ru-RU")
|
||||
private String clientIp;
|
||||
private String clientInfoFromClient;
|
||||
private String clientInfoFromRequest;
|
||||
private String userLanguage;
|
||||
|
||||
public ActiveSessionEntry() {
|
||||
}
|
||||
|
||||
@@ -2,41 +2,28 @@ package shine.db.entities;
|
||||
|
||||
/**
|
||||
* Запись блока (таблица blocks).
|
||||
*
|
||||
* Теперь:
|
||||
* - login TEXT NOT NULL
|
||||
* - bchName TEXT NOT NULL (идёт сразу после login)
|
||||
* - to_login TEXT nullable
|
||||
* - toBchName TEXT nullable
|
||||
* - toBlockGlobalNumber INTEGER nullable
|
||||
* - toBlockHashe TEXT nullable
|
||||
*
|
||||
* ДОБАВЛЕНО:
|
||||
* - msgSubType INTEGER (uint16 по смыслу, храним как int)
|
||||
*
|
||||
* PRIMARY KEY пока убран вообще.
|
||||
*/
|
||||
public class BlockEntry {
|
||||
|
||||
private String login; // TEXT
|
||||
private String bchName; // TEXT
|
||||
private String login;
|
||||
private String bchName;
|
||||
|
||||
private int blockGlobalNumber; // int32
|
||||
private String blockGlobalPreHashe; // TEXT
|
||||
private int blockGlobalNumber;
|
||||
private String blockGlobalPreHashe;
|
||||
|
||||
private int blockLineIndex; // int16 (храним как int)
|
||||
private int blockLineNumber; // int32
|
||||
private String blockLinePreHashe; // TEXT
|
||||
private int blockLineIndex;
|
||||
private int blockLineNumber;
|
||||
private String blockLinePreHashe;
|
||||
|
||||
private int msgType; // int16 (храним как int)
|
||||
private int msgSubType; // int16 (храним как int)
|
||||
private int msgType;
|
||||
private int msgSubType;
|
||||
|
||||
private byte[] blockByte; // BLOB
|
||||
private byte[] blockByte;
|
||||
|
||||
private String toLogin; // TEXT nullable
|
||||
private String toBchName; // TEXT nullable
|
||||
private Integer toBlockGlobalNumber; // INTEGER nullable
|
||||
private String toBlockHashe; // TEXT nullable
|
||||
private String toLogin;
|
||||
private String toBchName;
|
||||
private Integer toBlockGlobalNumber;
|
||||
private String toBlockHashe;
|
||||
|
||||
public BlockEntry() {}
|
||||
|
||||
|
||||
@@ -5,29 +5,22 @@ import java.util.Base64;
|
||||
|
||||
/**
|
||||
* Агрегатная сущность текущего состояния блокчейна.
|
||||
* 1 строка = 1 blockchainName, плюс состояние линий 0..7.
|
||||
* 1 строка = 1 blockchain_name, плюс состояние линий 0..7.
|
||||
*/
|
||||
public final class BlockchainStateEntry {
|
||||
|
||||
private String blockchainName;
|
||||
|
||||
private String login;
|
||||
|
||||
/** Ключ блокчейна (pubkey), которым подписываются блоки. Base64(32 bytes). */
|
||||
private String blockchainKey;
|
||||
|
||||
/** Лимит (теперь long). */
|
||||
private long sizeLimit;
|
||||
|
||||
/** Размер файла блокчейна в байтах (то, что будем сверять/чинить при старте). */
|
||||
private long fileSizeBytes;
|
||||
|
||||
private int lastGlobalNumber;
|
||||
private String lastGlobalHash; // HEX(64) либо пустая строка для "нулевого"
|
||||
private String lastGlobalHash;
|
||||
|
||||
/** line 0..7 */
|
||||
private final int[] lastLineNumbers = new int[8];
|
||||
/** line 0..7 */
|
||||
private final String[] lastLineHashes = new String[8];
|
||||
|
||||
private long updatedAtMs;
|
||||
@@ -78,7 +71,6 @@ public final class BlockchainStateEntry {
|
||||
public String getBlockchainKey() { return blockchainKey; }
|
||||
public void setBlockchainKey(String blockchainKey) { this.blockchainKey = blockchainKey; }
|
||||
|
||||
/** blockchainKey в байтах (32) или null, если битый. */
|
||||
public byte[] getBlockchainKeyBytes() {
|
||||
if (blockchainKey == null) return null;
|
||||
String s = blockchainKey.trim();
|
||||
@@ -103,7 +95,6 @@ public final class BlockchainStateEntry {
|
||||
public String getLastGlobalHash() { return lastGlobalHash; }
|
||||
public void setLastGlobalHash(String lastGlobalHash) { this.lastGlobalHash = lastGlobalHash == null ? "" : lastGlobalHash; }
|
||||
|
||||
/** line in [0..7] */
|
||||
public int getLastLineNumber(int line) {
|
||||
checkLine(line);
|
||||
return lastLineNumbers[line];
|
||||
@@ -113,7 +104,6 @@ public final class BlockchainStateEntry {
|
||||
lastLineNumbers[line] = value;
|
||||
}
|
||||
|
||||
/** line in [0..7] */
|
||||
public String getLastLineHash(int line) {
|
||||
checkLine(line);
|
||||
return lastLineHashes[line];
|
||||
|
||||
@@ -2,11 +2,6 @@ package shine.db.entities;
|
||||
|
||||
/**
|
||||
* Запись в таблице ip_geo_cache.
|
||||
*
|
||||
* Храним:
|
||||
* - ip — строка IP-адреса (PRIMARY KEY)
|
||||
* - geo — строка "Country, City" или любое текстовое описание
|
||||
* - updatedAtMs — время последнего обновления (Unix time в мс)
|
||||
*/
|
||||
public class IpGeoCacheEntry {
|
||||
|
||||
|
||||
@@ -8,35 +8,15 @@ import java.util.Base64;
|
||||
* Таблица: solana_users
|
||||
*
|
||||
* Поля:
|
||||
* - login — PRIMARY KEY (TEXT)
|
||||
* Уникальный логин пользователя.
|
||||
*
|
||||
* - deviceKey — TEXT NOT NULL
|
||||
* Публичный ключ устройства.
|
||||
* Поддерживаемые форматы:
|
||||
* • Base64 (32 байта)
|
||||
* • HEX (64 hex-символа)
|
||||
*
|
||||
* - solanaKey — TEXT NULLABLE
|
||||
* Публичный ключ Solana-аккаунта пользователя (если используется).
|
||||
*
|
||||
* Назначение:
|
||||
* - хранение минимальной локальной информации о пользователе
|
||||
* - используется для:
|
||||
* • проверки подписи запросов
|
||||
* • привязки пользователя к блокчейну
|
||||
* • сопоставления login ↔ ключи
|
||||
*
|
||||
* ВАЖНО:
|
||||
* - deviceKey обязателен всегда
|
||||
* - solanaKey может отсутствовать (null)
|
||||
* - login — PRIMARY KEY (TEXT)
|
||||
* - device_key — TEXT NOT NULL
|
||||
* - solana_key — TEXT NULLABLE
|
||||
*/
|
||||
|
||||
public class SolanaUserEntry {
|
||||
|
||||
private String login; // TEXT PK
|
||||
private String deviceKey; // TEXT NOT NULL (Base64(32 bytes))
|
||||
private String solanaKey; // TEXT
|
||||
private String login;
|
||||
private String deviceKey;
|
||||
private String solanaKey;
|
||||
|
||||
public SolanaUserEntry() {}
|
||||
|
||||
@@ -54,32 +34,22 @@ public class SolanaUserEntry {
|
||||
public String getLogin() { return login; }
|
||||
public void setLogin(String login) { this.login = login; }
|
||||
|
||||
/** Публичный ключ устройства (device key). */
|
||||
public String getDeviceKey() { return deviceKey; }
|
||||
public void setDeviceKey(String deviceKey) { this.deviceKey = deviceKey; }
|
||||
|
||||
public String getSolanaKey() { return solanaKey; }
|
||||
public void setSolanaKey(String solanaKey) { this.solanaKey = solanaKey; }
|
||||
|
||||
/**
|
||||
* Device key в байтах (32 байта) или null, если ключ битый/пустой.
|
||||
*
|
||||
* Поддержка форматов:
|
||||
* - Base64 (предпочтительно)
|
||||
* - HEX (ровно 64 hex-символа, без пробелов)
|
||||
*/
|
||||
public byte[] getDeviceKeyByte() {
|
||||
if (deviceKey == null) return null;
|
||||
String s = deviceKey.trim();
|
||||
if (s.isEmpty()) return null;
|
||||
|
||||
// 1) пробуем Base64
|
||||
try {
|
||||
byte[] b = Base64.getDecoder().decode(s);
|
||||
if (b != null && b.length == 32) return b;
|
||||
} catch (IllegalArgumentException ignore) {}
|
||||
|
||||
// 2) пробуем HEX (64 символа)
|
||||
if (s.length() == 64 && s.matches("^[0-9a-fA-F]+$")) {
|
||||
byte[] out = new byte[32];
|
||||
for (int i = 0; i < 32; i++) {
|
||||
|
||||
@@ -10,12 +10,6 @@ package shine.db.entities;
|
||||
* - value TEXT NOT NULL
|
||||
* - device_key TEXT NULL
|
||||
* - signature TEXT NULL
|
||||
*
|
||||
* UNIQUE(login, param)
|
||||
*
|
||||
* Смысл:
|
||||
* - в таблице всегда хранится "последнее" значение параметра по времени.
|
||||
* - time_ms монотонно растёт для каждого (login,param) — сервер не принимает более старые обновления.
|
||||
*/
|
||||
public class UserParamEntry {
|
||||
|
||||
@@ -24,8 +18,8 @@ public class UserParamEntry {
|
||||
private long timeMs;
|
||||
private String value;
|
||||
|
||||
private String deviceKey; // base64(32) — можно хранить как "каким ключом подписано"
|
||||
private String signature; // base64(64)
|
||||
private String deviceKey;
|
||||
private String signature;
|
||||
|
||||
public UserParamEntry() {}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user