Files
MeowOS-For-R3P2/patch_v2/meow_launcherd/lock_screen.h
T
AskaEth c3abc3fee4 feat(launcher,lock): 锁屏补充三定案—面板一次性解锁恢复口 / 设置页 PIN 管理 / 电源菜单主动锁强化
- 面板一次性解锁恢复口:/tmp/meow_pin_unlock_once 存在即被锁屏页消费删除并放行一次
  (不校验 PIN、不清 system.pin、不重置失败计数;重启标志自然消失;lck_unlock_once_consume,
  launcher 侧只做检查/消费,panel 端点由主会话另实现)。
- 系统设置「安全 → 锁屏 PIN」页(lock_settings.c,subpage.c 脚手架):状态(未设置/已设置/
  锁定中+剩余)/ 设置(4 位双输确认)/ 修改(需旧 PIN 一次)/ 清除(**免旧 PIN**,仅二次确认弹窗)
  / system.pin_lock_on_wake 开关;数字输入用 SDK 按钮键盘(lck_input_pin_modal)。
- 电源菜单「锁定」主动锁强化:立即熄屏 + 写 /tmp/meow_pin_locked(主动锁标志,重启消失,
  唤醒时无论 pin_lock_on_wake 是否开都必锁屏)+ rm /tmp/meow_pin_unlock_once 作废挂起绕过;
  lck_wake_should_lock() 作为唤醒门取代 lck_lock_required(1)(主菜单 2 处 + App 会话 2 处)。
- 测试:test_lock_screen 扩 51 ok——bypass 存在即消费/不存在不影响/消费后删除;清除免旧 PIN;
  主动锁标志唤醒必锁/清除后回退;全回归 settings_brightness/notif_panel/notif_tf/vol_ramp_jack 无碍;
  交叉 -Wall -Wextra 0 warning。meow_launcherd md5 bdf884756ef8a8353aa8e5dfb6e10a0a。
- SYSTEM_SETTINGS.md 同步锁屏行为段。
2026-09-02 00:57:17 +08:00

95 lines
5.3 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 兼容源) */
/* ---- 文件标志(tmpfs,重启自然消失)---- */
#define LCK_UNLOCK_ONCE_FILE "/tmp/meow_pin_unlock_once" /* 面板一次性解锁恢复口:存在即消费放行 */
#define LCK_MANUAL_LOCK_FILE "/tmp/meow_pin_locked" /* 电源菜单「锁定」主动锁标志:唤醒必锁屏 */
/* 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);
/* ---- 面板一次性解锁恢复口(tmpfs 标志文件)----
* 锁屏页进入时 / 每次重试前调用:LCK_UNLOCK_ONCE_FILE 存在 → **删除并返回 1(放行进入系统一次)**;
* 不存在 → 0。不校验 PIN、不清除 system.pin 本身、不重置失败计数(重启标志自然消失)。 */
int lck_unlock_once_consume(void);
/* ---- 电源菜单「锁定」主动锁标志(tmpfs,重启消失)----
* 主动锁屏:写 LCK_MANUAL_LOCK_FILE → 之后唤醒 `lck_wake_should_lock()` 无论 system.pin_lock_on_wake
* 是否开都必走锁屏;解锁(PIN 或面板绕过)时清除。 */
int lck_manual_lock_set(void); /* 写标志;返回 MEOW_OK */
void lck_manual_lock_clear(void); /* 删标志(幂等) */
/* 唤醒是否应锁屏:已配凭据 且 (system.pin_lock_on_wake=1 或 主动锁标志存在)。
* 取代 lck_lock_required(1) 作为唤醒门——主动锁强制锁屏,覆盖「关闭唤醒锁」的手动锁场景。 */
int lck_wake_should_lock(void);
#ifdef __cplusplus
}
#endif
#endif /* MEOW_LOCK_SCREEN_H */