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 同步锁屏行为段。
This commit is contained in:
AskaEth committed 2026-09-02 00:57:17 +08:00
1 parent e948a0a44e
commit c3abc3fee4
13 files changed
+409 -10

No files matched your search

+39 -1
View File
@@ -62,6 +62,30 @@ int main(void)
CHECK(lck_lock_required(1) == 1, "wake-required=1 after wake=1");
/* 开机不锁是结构性(boot 路径不调 lck_lock_required)——此处断言决策函数正确即隔离该项 */
/* ---- 唤醒门=主动锁标志:唤醒锁关 + 主动锁标志 → 仍必锁屏(电源菜单「锁定」语义)---- */
unlink("/tmp/meow_pin_locked");
meow_settings_set_int("system.pin_lock_on_wake", 0);
meow_settings_save();
CHECK(lck_wake_should_lock() == 0, "wake_should_lock=0 (wake=0, no manual marker)");
CHECK(lck_manual_lock_set() == MEOW_OK, "manual_lock_set ok");
CHECK(lck_wake_should_lock() == 1, "wake_should_lock=1 (manual marker, wake=0)");
lck_manual_lock_clear();
CHECK(lck_wake_should_lock() == 0, "wake_should_lock=0 after manual marker cleared");
meow_settings_set_int("system.pin_lock_on_wake", 1);
meow_settings_save();
CHECK(lck_wake_should_lock() == 1, "wake_should_lock=1 (wake=1)");
/* ---- 面板一次性解锁恢复口(bypass 标志)---- */
CHECK(lck_unlock_once_consume() == 0, "unlock_once_consume=0 when flag absent");
{
int fd = open("/tmp/meow_pin_unlock_once", O_WRONLY | O_CREAT | O_TRUNC, 0644);
CHECK(fd >= 0, "create unlock_once flag");
if (fd >= 0) { write(fd, "1", 1); close(fd); }
}
CHECK(lck_unlock_once_consume() == 1, "unlock_once_consume=1 when flag present");
CHECK(access("/tmp/meow_pin_unlock_once", F_OK) != 0, "bypass flag consumed (deleted)");
CHECK(lck_unlock_once_consume() == 0, "unlock_once_consume=0 after consumed");
/* ---- 错 5 次锁定(持久化,重启不清)---- */
CHECK(lck_lock_remaining() == 0, "not locked before fails");
int r1 = lck_pin_fail(); /* 1 */
@@ -109,14 +133,28 @@ int main(void)
CHECK(strcmp(sp2, pphash) == 0, "system.pin == panel.pin after migrate");
CHECK(lck_pin_check("5678") == 1, "still accept after migrate (via system.pin)");
/* ---- 清除免旧 PIN(设置页清除语义:物理持机即授权,无旧密码要求)---- */
/* 先设一个 PIN,然后**不验旧 PIN** 直接 lck_pin_clear()(清除 API 本身无旧 PIN 前置)。
* 先清 panel.pin(迁移残留),确保「已设」只由 system.pin 贡献。 */
meow_settings_set_str("panel.pin", "");
meow_settings_save();
CHECK(lck_pin_set("2468") == MEOW_OK, "set pin 2468 for clear");
CHECK(lck_pin_configured() == 1, "configured before clear");
CHECK(lck_pin_clear() == MEOW_OK, "clear WITHOUT old PIN succeeds");
CHECK(lck_pin_configured() == 0, "not configured after clear (no old PIN path)");
/* ---- 清除(兜底解锁):lck_pin_clear 后不再要求锁 ---- */
/* lck_pin_clear 只清 system.pin;panel.pin 仍存(迁移源),先清掉再断言全部未配 */
meow_settings_set_str("panel.pin", "");
meow_settings_save();
CHECK(lck_pin_clear() == MEOW_OK, "pin clear");
CHECK(lck_pin_clear() == MEOW_OK, "pin clear (final)");
CHECK(lck_pin_configured() == 0, "not configured after clear");
CHECK(lck_lock_required(1) == 0, "wake-required=0 after clear");
/* 清理临时标志文件(幂等) */
unlink("/tmp/meow_pin_unlock_once");
unlink("/tmp/meow_pin_locked");
unlink(conf);
printf("\n%s\n", g_fail ? "SOME TESTS FAILED" : "ALL PASS");
return g_fail ? 1 : 0;