SHA256
homeserver: рендейм subserver→homeserver, документ деривации ключей, запрет пустого пароля
Основное (наша работа в этой сессии): - Переименование «subserver» → «homeserver» по всему проекту: основной ESP32-скетч (папка shine_subserver_ui → shine_homeserver_ui, .ino, flash-скрипт, режим burn.sh homeserver-ui), скетч lvgl_nav_minimal_test (ключ homeserver.key:<имя>), spec-доки reference/*, формат PDA (терминология session_type=100 «Homeserver пользователя»), константа SESSION_TYPE_HOMESERVER в JS и Rust (значение 100 не менялось, формат не затронут), pending/future доки, AGENTS.md, DAO-док. Сохранены отдельный lvgl_subserver_touch_test и историческая пометка о рендейме в DERIVATION.md. - Новый источник истины по деривации ключей: Dev_Docs/Keys/DERIVATION.md (Argon2id-секрет из пароля, формула Ed25519(SHA-256(base64(secret)|suffix)), суффиксы root/bch/dev/homeserver.key, Solana-ключ = dev.key). Уточнены роли root (главный/master) и dev (пополняемый кошелёк) в Dev_Docs/Keys/README.md. - UI: убран легаси-путь пустого пароля (derivePasswordSeed и др.), deriveMasterSecretFromPassword бросает ошибку на пустом пароле, register-view блокирует пустой пароль; экран пополнения переведён на канонический device-адрес из preGeneratedKeyBundle (удалён расходящийся deriveWalletFromPassword). Включены также параллельные правки Solana-аудита №3 (были в рабочем дереве, переплетены в lib.rs): - shine_users: defense-in-depth «строгий список аккаунтов» (require!(it.next().is_none())) в init/update economy config и create/update user PDA, плюс описание в doc/programs/shine_users.md; - Dev_Docs/audit/Solana-audit-3-by-Claude-12июня2026.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
cf6a2830c8
commit
42dcf6970d
@@ -40,7 +40,7 @@ const BLOCKCHAIN_TYPE_MAIN_USER: u8 = 1;
|
||||
const SESSIONS_MODE_MIXED: u8 = 1;
|
||||
const SESSIONS_MODE_PDA_ONLY: u8 = 10;
|
||||
const SESSION_TYPE_USER: u8 = 1;
|
||||
const SESSION_TYPE_SUBSERVER: u8 = 100;
|
||||
const SESSION_TYPE_HOMESERVER: u8 = 100;
|
||||
const LAST_BLOCK_STATE_PREFIX: &[u8] = b"SHiNE_LAST_BLOCK";
|
||||
|
||||
const IX_INIT_USERS_ECONOMY_CONFIG: u8 = 1;
|
||||
@@ -375,6 +375,7 @@ fn process_init_users_economy_config(program_id: &Pubkey, accounts: &[AccountInf
|
||||
let signer = next_account_info(&mut it)?;
|
||||
let users_economy_config_pda = next_account_info(&mut it)?;
|
||||
let system_program_ai = next_account_info(&mut it)?;
|
||||
require!(it.next().is_none(), ShineUsersError::InvalidInstruction);
|
||||
|
||||
require!(signer.is_signer, ShineUsersError::InvalidSigner);
|
||||
require_keys_eq!(*system_program_ai.key, system_program::id(), ShineUsersError::InvalidSystemProgram);
|
||||
@@ -407,6 +408,7 @@ fn process_update_users_economy_config(program_id: &Pubkey, accounts: &[AccountI
|
||||
let mut it = accounts.iter();
|
||||
let signer = next_account_info(&mut it)?;
|
||||
let users_economy_config_pda = next_account_info(&mut it)?;
|
||||
require!(it.next().is_none(), ShineUsersError::InvalidInstruction);
|
||||
|
||||
require!(signer.is_signer, ShineUsersError::InvalidSigner);
|
||||
let dao_authority = Pubkey::from_str(settings::DAO_AUTHORITY).map_err(|_| ProgramError::from(ShineUsersError::InvalidSigner))?;
|
||||
@@ -433,6 +435,7 @@ fn process_create_user_pda(program_id: &Pubkey, accounts: &[AccountInfo], args:
|
||||
let instructions_sysvar = next_account_info(&mut it)?;
|
||||
let users_economy_config_pda = next_account_info(&mut it)?;
|
||||
let login_guard_program = next_account_info(&mut it)?;
|
||||
require!(it.next().is_none(), ShineUsersError::InvalidInstruction);
|
||||
|
||||
require!(signer.is_signer, ShineUsersError::InvalidSigner);
|
||||
require_keys_eq!(*signer.key, args.fields.device_key, ShineUsersError::InvalidSigner);
|
||||
@@ -514,6 +517,7 @@ fn process_update_user_pda(program_id: &Pubkey, accounts: &[AccountInfo], args:
|
||||
let inflow_vault = next_account_info(&mut it)?;
|
||||
let instructions_sysvar = next_account_info(&mut it)?;
|
||||
let users_economy_config_pda = next_account_info(&mut it)?;
|
||||
require!(it.next().is_none(), ShineUsersError::InvalidInstruction);
|
||||
|
||||
require!(signer.is_signer, ShineUsersError::InvalidSigner);
|
||||
require_keys_eq!(*signer.key, args.fields.device_key, ShineUsersError::InvalidSigner);
|
||||
@@ -976,7 +980,7 @@ fn validate_sessions_fields(mode: u8, sessions: &[SessionRecord]) -> ProgramResu
|
||||
}
|
||||
|
||||
fn validate_session_record(session: &SessionRecord) -> ProgramResult {
|
||||
require!(session.session_type == SESSION_TYPE_USER || session.session_type == SESSION_TYPE_SUBSERVER, ShineUsersError::InvalidRecordData);
|
||||
require!(session.session_type == SESSION_TYPE_USER || session.session_type == SESSION_TYPE_HOMESERVER, ShineUsersError::InvalidRecordData);
|
||||
require!(session.session_version == 1, ShineUsersError::InvalidRecordData);
|
||||
let bytes = session.session_name.as_bytes();
|
||||
require!(!bytes.is_empty(), ShineUsersError::InvalidRecordData);
|
||||
|
||||
Reference in New Issue
Block a user