From 85e1d031578b6f2c8859b54faccf97a22a429787 Mon Sep 17 00:00:00 2001
From: AskaEth
Date: Wed, 2 Sep 2026 01:01:54 +0800
Subject: [PATCH] =?UTF-8?q?feat(panel):=20=E9=94=81=E5=B1=8F=E4=B8=80?=
=?UTF-8?q?=E6=AC=A1=E6=80=A7=E8=A7=A3=E9=94=81=E7=AB=AF=E7=82=B9=20POST?=
=?UTF-8?q?=20/api/system/pin-unlock-once=EF=BC=88=E5=86=99=20/tmp/meow=5F?=
=?UTF-8?q?pin=5Funlock=5Fonce=EF=BC=8Clauncher=20=E9=94=81=E5=B1=8F?=
=?UTF-8?q?=E9=A1=B5=E6=B6=88=E8=B4=B9=E6=94=BE=E8=A1=8C=E4=B8=80=E6=AC=A1?=
=?UTF-8?q?=EF=BC=89+=20=E8=AE=BE=E7=BD=AE=E9=A1=B5=20PIN=20=E5=8D=A1?=
=?UTF-8?q?=E3=80=8C=E4=B8=80=E6=AC=A1=E6=80=A7=E8=A7=A3=E9=94=81=E8=AE=BE?=
=?UTF-8?q?=E5=A4=87=E3=80=8D=E6=8C=89=E9=92=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
patch_v2/meowpanel/meowpanel.c | 12 ++++++++++++
patch_v2/meowpanel/web/meowpanel.js | 12 +++++++++++-
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/patch_v2/meowpanel/meowpanel.c b/patch_v2/meowpanel/meowpanel.c
index 4f7a0da..2d4df50 100644
--- a/patch_v2/meowpanel/meowpanel.c
+++ b/patch_v2/meowpanel/meowpanel.c
@@ -3493,6 +3493,17 @@ static int api_system(int sock)
return ret;
}
+/* ---------------- 锁屏一次性解锁(写 /tmp/meow_pin_unlock_once,launcher 锁屏页消费) ---------------- */
+static int api_pin_unlock_once(int sock)
+{
+ const char *path = "/tmp/meow_pin_unlock_once";
+ FILE *f = fopen(path, "w");
+ if (!f) return send_err(sock, 500, "INTERNAL", "无法写入一次性解锁标志");
+ fputs("1\n", f);
+ fclose(f);
+ return send_json(sock, 200, "{\"unlock_once\":true}");
+}
+
/* ---------------- 系统动作(经 meow_svc_power IPC) ---------------- */
static int api_system_action(int sock, const char *which, const req_t *r)
{
@@ -5397,6 +5408,7 @@ static int handle(int sock, req_t *r)
if (!strcmp(p, "/api/system/reboot")) return api_system_action(sock, "reboot", r);
if (!strcmp(p, "/api/system/shutdown")) return api_system_action(sock, "shutdown", r);
if (!strcmp(p, "/api/system/ota")) return api_system_action(sock, "ota", r);
+ if (!strcmp(p, "/api/system/pin-unlock-once")) return api_pin_unlock_once(sock);
if (!strcmp(p, "/api/settings")) return api_settings_batch(sock, r);
if (!strcmp(p, "/api/settings/restore")) return api_settings_restore(sock);
if (!strcmp(p, "/api/theme")) return api_theme_put(sock, r);
diff --git a/patch_v2/meowpanel/web/meowpanel.js b/patch_v2/meowpanel/web/meowpanel.js
index 3964398..95625eb 100644
--- a/patch_v2/meowpanel/web/meowpanel.js
+++ b/patch_v2/meowpanel/web/meowpanel.js
@@ -1681,6 +1681,9 @@
'' +
(st.locked ? '锁定期间不可修改/清空' : '修改/清空需先验证当前 PIN') +
'';
+ h += '
4 位数字 PIN,纯加盐哈希存储(不落明文);未设 PIN 时写端点一律拒绝。
'; box.innerHTML = h; } @@ -1736,9 +1739,16 @@ } function bindPin() { const c = $('#content'); - c.addEventListener('click', function (e) { + c.addEventListener('click', async function (e) { if (e.target.closest('#pin-change')) { pinEdit('change'); return; } if (e.target.closest('#pin-clear')) { pinEdit('clear'); return; } + if (e.target.closest('#pin-unlock-once')) { + try { + await api('POST', '/api/system/pin-unlock-once', {}); + toast('已下发:设备下次亮屏免 PIN 进入一次'); + } catch (err) { toast('下发失败:' + errText(err)); } + return; + } }); ['#pindlg-old', '#pindlg-new', '#pindlg-new2'].forEach(function (sel) { const el = $(sel);