Files
MeowOS-For-R3P2/patch_v2/meow_launcherd/lock_screen.h
T
AskaEth e948a0a44e feat(launcher,lock): MeowOS 锁屏 4 位 PIN(system.pin 同源面板,错5锁5分钟持久化,唤醒/电源菜单手动锁)
- 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。
2026-09-02 00:48:23 +08:00

77 lines
4.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 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 */