- system.pin:4 位数字 PIN,sha256+salt 存 settings.conf(格式与面板 panel.pin 全等,绝无明文)。 panel.pin 已设且 system.pin 未设时锁屏接受 panel.pin,首次验证成功后并入 system.pin。 - 锁屏时机:息屏唤醒后(默认开,system.pin_lock_on_wake=1 可关)+ 电源菜单「锁定」手动锁; 开机不锁(boot 进主屏不拦)。 - 锁屏页:launcher 渲染系统级全屏页,App 不可见不可触;SDK 按钮画数字键盘(不调 IME), 输入 4 位自动校验;● 遮罩不回显数字;错 5 次锁 5 分钟(持久化锁定戳/计数,重启不清)。 - 安全细节:锁屏页电源键=息屏(允许再睡),音量键不动,不响应左缘返回/通知中心手势。 兜底:SSH root 删 system.pin 键即解锁(无其它后门)。HibyOS 不涉及。 - 宿主测试(test_lock_screen):设置/校验/错5锁定持久化(重载模拟重启)/唤醒触发/开机不锁 /panel.pin 迁移,全 PASS;既有 settings_brightness/notif_panel/notif_tf/vol_ramp_jack 回归 无碍;交叉 -Wall -Wextra 0 warning。meow_launcherd md5 670f978e71c1e81cfe86d47c21248c9d。
77 lines
4.0 KiB
C
77 lines
4.0 KiB
C
/* lock_screen.h — MeowOS 锁屏 4 位 PIN(系统级安全,纯逻辑;宿主可单测)。
|
||
*
|
||
* 模型(用户定案,2026-09-02):
|
||
* - 设置键 `system.pin`:4 位数字 PIN 的 sha256+salt 哈希,存 settings.conf。
|
||
* 格式与面板 panel.pin **全等**:`<salt_hex>:<sha256_hex(salt||pin)>`,salt 16B
|
||
* /dev/urandom → 32 hex;绝不存明文、绝不在日志/响应中输出 hash。
|
||
* - 面板同源迁移:`panel.pin` 已设而 `system.pin` 未设时,锁屏接受 panel.pin,并在
|
||
* **首次验证成功后并入 system.pin**(lck_pin_success 把 panel.pin 值拷入 system.pin)。
|
||
* - 锁屏时机:息屏唤醒后(默认开,`system.pin_lock_on_wake=1` 可关)+ 电源菜单「锁定」
|
||
* 手动锁;**开机不锁**(boot 进主屏不拦,本逻辑不被 boot 路径调用)。
|
||
* - 错 5 次锁 5 分钟:`system.pin_fails`(连续错计数)与 `system.pin_lock_until`(锁定
|
||
* 截止 epoch 秒)**持久化到 settings.conf**——launcher 重启不清零(面板的进程内存方案
|
||
* 在重启后失效,这里要落盘)。
|
||
* - 兜底:SSH root 删 `system.pin` 键即解锁(无其它后门)。
|
||
*
|
||
* 本头只声明纯逻辑接口;渲染/输入循环在 lock_screen_ui.c(run_lock_screen)。逻辑依赖
|
||
* meow_settings_* API(与 meowpanel 的 settings_get_value 语义同源,走同一 settings.conf)。
|
||
* 宿主测试:#include "lock_screen.c" + 真实 meow_settings.c(-DMEOW_SETTINGS_FILE 覆盖)。
|
||
*/
|
||
#ifndef MEOW_LOCK_SCREEN_H
|
||
#define MEOW_LOCK_SCREEN_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include <time.h>
|
||
|
||
#define LCK_PIN_LEN 4 /* 恰好 4 位数字 */
|
||
#define LCK_PIN_MAX_FAILS 5 /* 连续错 PIN 锁定阈值 */
|
||
#define LCK_PIN_LOCK_SEC 300 /* 锁定 5 分钟 */
|
||
#define LCK_HASH_LEN 64 /* sha256 hex 长度 */
|
||
|
||
/* ---- 设置键(必须已在 meow_settings.c g_defs 注册)---- */
|
||
#define LCK_KEY_PIN "system.pin"
|
||
#define LCK_KEY_WAKE "system.pin_lock_on_wake"
|
||
#define LCK_KEY_LOCK_UNTIL "system.pin_lock_until"
|
||
#define LCK_KEY_FAILS "system.pin_fails"
|
||
#define LCK_KEY_PANEL_PIN "panel.pin" /* 面板 PIN(read-only 兼容源) */
|
||
|
||
/* PIN 合法:恰好 4 位数字(0-9)。NULL/长度不符/含非数字 → 0。 */
|
||
int lck_pin_valid(const char *pin);
|
||
|
||
/* 是否已配锁屏凭据:system.pin 设 或 panel.pin 设(锁屏可开)。 */
|
||
int lck_pin_configured(void);
|
||
|
||
/* 唤醒是否应锁屏:system.pin_lock_on_wake(默认 1) 且 已配凭据。
|
||
* 仅由「息屏唤醒」路径调用——boot 路径不调,天然开机不锁。
|
||
* allow_disable=0 时忽略 WAKE 键(电源菜单「锁定」手动锁用,锁前需已配凭据)。 */
|
||
int lck_lock_required(int allow_disable);
|
||
|
||
/* 明文校验:system.pin 优先;未设时回退校验 panel.pin(迁移)。恒定比较,不反解。 */
|
||
int lck_pin_check(const char *pin);
|
||
|
||
/* 设置/修改 system.pin(明文→sha256+salt 落盘):校验 4 位数字;清连续错计数+锁定戳;**落盘**。
|
||
* 返回 MEOW_OK / 负错误。设置页/CLI 设锁屏 PIN 走此。 */
|
||
int lck_pin_set(const char *pin);
|
||
/* 清除 system.pin(解锁兜底,SSH root 删键即解锁的同义 API):清计数+锁定戳,**落盘**。 */
|
||
int lck_pin_clear(void);
|
||
|
||
/* 记录一次成功验证:首次成功时把 panel.pin 并入 system.pin(迁移);清连续错计数 + 清
|
||
* 锁定戳;**落盘**。返回 MEOW_OK。 */
|
||
int lck_pin_success(void);
|
||
|
||
/* 记录一次失败:递增连续错计数(持久化);达 LCK_PIN_MAX_FAILS → 设锁定戳(now+300s)并清
|
||
* 计数。已处于锁定(now<截止)时不递增。返回**剩余锁定秒**(0=未锁)。
|
||
* 调用方须先 lck_lock_remaining() 确认未锁才让输入;已锁时本函数不改变截止。 */
|
||
int lck_pin_fail(void);
|
||
|
||
/* 剩余锁定秒(0=未锁定)。若截止已过,自动清锁定戳+计数并落盘(进程内已解禁)。 */
|
||
time_t lck_lock_remaining(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* MEOW_LOCK_SCREEN_H */
|