From e407c8382951d28c7255719bc698074a3ee7b950 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Fri, 9 Jun 2023 16:04:15 +0100 Subject: [PATCH] Dont allow rpc unlock by default if pin locked --- .../xtreme_app_scene_interface_lockscreen.c | 21 ++++++++++++++++++- applications/services/desktop/desktop.c | 5 ++++- .../targets/furi_hal_include/furi_hal_rtc.h | 2 +- lib/xtreme/settings.c | 6 ++++++ lib/xtreme/xtreme.h | 1 + 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c index 632401a7c..21a570bfb 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c @@ -3,6 +3,7 @@ enum VarItemListIndex { VarItemListIndexLockOnBoot, VarItemListIndexFormatOn10BadPins, + VarItemListIndexPinUnlockFromApp, VarItemListIndexShowTime, VarItemListIndexShowSeconds, VarItemListIndexShowDate, @@ -31,6 +32,14 @@ static void xtreme_app_scene_interface_lockscreen_bad_pins_format_changed(Variab app->save_settings = true; } +static void xtreme_app_scene_interface_lockscreen_pin_unlock_from_app_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->pin_unlock_from_app = value; + app->save_settings = true; +} + static void xtreme_app_scene_interface_lockscreen_lockscreen_time_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); @@ -89,13 +98,23 @@ void xtreme_app_scene_interface_lockscreen_on_enter(void* context) { item = variable_item_list_add( var_item_list, - "Format on 10 bad PINs", + "Format on 10 Bad PINs", 2, xtreme_app_scene_interface_lockscreen_bad_pins_format_changed, app); variable_item_set_current_value_index(item, xtreme_settings->bad_pins_format); variable_item_set_current_value_text(item, xtreme_settings->bad_pins_format ? "ON" : "OFF"); + item = variable_item_list_add( + var_item_list, + "PIN Unlock From App", + 2, + xtreme_app_scene_interface_lockscreen_pin_unlock_from_app_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->pin_unlock_from_app); + variable_item_set_current_value_text( + item, xtreme_settings->pin_unlock_from_app ? "ON" : "OFF"); + item = variable_item_list_add( var_item_list, "Show Time", diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 9d48c580e..131b6136f 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -439,7 +439,9 @@ bool desktop_api_is_locked(Desktop* instance) { void desktop_api_unlock(Desktop* instance) { furi_assert(instance); - view_dispatcher_send_custom_event(instance->view_dispatcher, DesktopLockedEventUnlocked); + if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock) || XTREME_SETTINGS()->pin_unlock_from_app) { + view_dispatcher_send_custom_event(instance->view_dispatcher, DesktopLockedEventUnlocked); + } } FuriPubSub* desktop_api_get_status_pubsub(Desktop* instance) { @@ -464,6 +466,7 @@ int32_t desktop_srv(void* p) { if(!ok) { memset(&desktop->settings, 0, sizeof(desktop->settings)); furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); + furi_hal_rtc_set_pin_fails(0); } desktop_clock_toggle_view(desktop, desktop->settings.display_clock); diff --git a/firmware/targets/furi_hal_include/furi_hal_rtc.h b/firmware/targets/furi_hal_include/furi_hal_rtc.h index 186d22f07..98dfc7952 100644 --- a/firmware/targets/furi_hal_include/furi_hal_rtc.h +++ b/firmware/targets/furi_hal_include/furi_hal_rtc.h @@ -27,7 +27,7 @@ typedef struct { typedef enum { FuriHalRtcFlagDebug = (1 << 0), FuriHalRtcFlagFactoryReset = (1 << 1), - FuriHalRtcFlagLock = (1 << 2), + FuriHalRtcFlagLock = (1 << 2), // WITH PIN, on OFW also for keypad (removes option to do both) FuriHalRtcFlagC2Update = (1 << 3), FuriHalRtcFlagHandOrient = (1 << 4), FuriHalRtcFlagLegacySleep = (1 << 5), diff --git a/lib/xtreme/settings.c b/lib/xtreme/settings.c index 023cbcbc9..bdceb6900 100644 --- a/lib/xtreme/settings.c +++ b/lib/xtreme/settings.c @@ -14,6 +14,7 @@ XtremeSettings xtreme_settings = { .wii_menu = true, // ON .lock_on_boot = false, // OFF .bad_pins_format = false, // OFF + .pin_unlock_from_app = false, // OFF .lockscreen_time = true, // ON .lockscreen_seconds = false, // OFF .lockscreen_date = true, // ON @@ -75,6 +76,10 @@ void XTREME_SETTINGS_LOAD() { x->bad_pins_format = b; } flipper_format_rewind(file); + if(flipper_format_read_bool(file, "pin_unlock_from_app", &b, 1)) { + x->pin_unlock_from_app = b; + } + flipper_format_rewind(file); if(flipper_format_read_bool(file, "lock_on_boot", &b, 1)) { x->lock_on_boot = b; } @@ -173,6 +178,7 @@ void XTREME_SETTINGS_SAVE() { flipper_format_write_bool(file, "fallback_anim", &x->fallback_anim, 1); flipper_format_write_bool(file, "wii_menu", &x->wii_menu, 1); flipper_format_write_bool(file, "bad_pins_format", &x->bad_pins_format, 1); + flipper_format_write_bool(file, "pin_unlock_from_app", &x->pin_unlock_from_app, 1); flipper_format_write_bool(file, "lock_on_boot", &x->lock_on_boot, 1); flipper_format_write_bool(file, "lockscreen_time", &x->lockscreen_time, 1); flipper_format_write_bool(file, "lockscreen_seconds", &x->lockscreen_seconds, 1); diff --git a/lib/xtreme/xtreme.h b/lib/xtreme/xtreme.h index 89a126201..b2a86e9c0 100644 --- a/lib/xtreme/xtreme.h +++ b/lib/xtreme/xtreme.h @@ -23,6 +23,7 @@ typedef struct { bool wii_menu; bool lock_on_boot; bool bad_pins_format; + bool pin_unlock_from_app; bool lockscreen_time; bool lockscreen_seconds; bool lockscreen_date;