diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index b10fa53a7..9d48c580e 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -237,7 +237,7 @@ static void desktop_clock_timer_callback(void* context) { } void desktop_lock(Desktop* desktop, bool pin_lock) { - pin_lock = pin_lock && desktop->settings.pin_code.length > 0; + pin_lock = pin_lock && desktop_pin_is_valid(&desktop->settings.pin_code); if(!furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { furi_hal_rtc_set_pin_fails(0); } @@ -457,7 +457,11 @@ int32_t desktop_srv(void* p) { Desktop* desktop = desktop_alloc(); - if(!DESKTOP_SETTINGS_LOAD(&desktop->settings)) { + bool ok = DESKTOP_SETTINGS_LOAD(&desktop->settings); + if(ok) { + ok = desktop_pin_is_valid(&desktop->settings.pin_code); + } + if(!ok) { memset(&desktop->settings, 0, sizeof(desktop->settings)); furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); } diff --git a/applications/services/desktop/helpers/pin.c b/applications/services/desktop/helpers/pin.c index d6ab48df2..b41001552 100644 --- a/applications/services/desktop/helpers/pin.c +++ b/applications/services/desktop/helpers/pin.c @@ -53,3 +53,12 @@ bool desktop_pin_compare(const PinCode* pin_code1, const PinCode* pin_code2) { return result; } + +bool desktop_pin_is_valid(const PinCode* pin_code) { + bool ok = pin_code->length >= MIN_PIN_SIZE && pin_code->length <= MAX_PIN_SIZE; + for(size_t i = 0; ok && i < pin_code->length; i++) { + ok = ok && (pin_code->data[i] == InputKeyUp || pin_code->data[i] == InputKeyDown || + pin_code->data[i] == InputKeyRight || pin_code->data[i] == InputKeyLeft); + } + return ok; +} diff --git a/applications/services/desktop/helpers/pin.h b/applications/services/desktop/helpers/pin.h index e5410723e..ce9fcfec3 100644 --- a/applications/services/desktop/helpers/pin.h +++ b/applications/services/desktop/helpers/pin.h @@ -9,3 +9,5 @@ void desktop_pin_lock_error_notify(); uint32_t desktop_pin_lock_get_fail_timeout(); bool desktop_pin_compare(const PinCode* pin_code1, const PinCode* pin_code2); + +bool desktop_pin_is_valid(const PinCode* pin_code); diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index c56fd16f2..d1c7e48bc 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -27,7 +27,8 @@ void desktop_scene_lock_menu_on_enter(void* context) { DESKTOP_SETTINGS_LOAD(&desktop->settings); scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); desktop_lock_menu_set_callback(desktop->lock_menu, desktop_scene_lock_menu_callback, desktop); - desktop_lock_menu_set_pin_state(desktop->lock_menu, desktop->settings.pin_code.length > 0); + desktop_lock_menu_set_pin_state( + desktop->lock_menu, desktop_pin_is_valid(&desktop->settings.pin_code)); desktop_lock_menu_set_stealth_mode_state( desktop->lock_menu, furi_hal_rtc_is_flag_set(FuriHalRtcFlagStealthMode)); desktop_lock_menu_set_idx(desktop->lock_menu, 3); @@ -63,7 +64,7 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLockMenu); if(check_pin_changed) { DESKTOP_SETTINGS_LOAD(&desktop->settings); - if(desktop->settings.pin_code.length > 0) { + if(desktop_pin_is_valid(&desktop->settings.pin_code)) { desktop_lock_menu_set_pin_state(desktop->lock_menu, true); scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); desktop_lock(desktop, true); @@ -90,7 +91,7 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { break; case DesktopLockMenuEventLockPin: desktop_scene_lock_menu_save_settings(desktop); - if(desktop->settings.pin_code.length > 0) { + if(desktop_pin_is_valid(&desktop->settings.pin_code)) { desktop_lock(desktop, true); } else { LoaderStatus status = @@ -105,7 +106,7 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { break; case DesktopLockMenuEventLockPinOff: desktop_scene_lock_menu_save_settings(desktop); - if(desktop->settings.pin_code.length > 0) { + if(desktop_pin_is_valid(&desktop->settings.pin_code)) { desktop_lock(desktop, true); Power* power = furi_record_open(RECORD_POWER); furi_delay_ms(500); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c index f153aac7a..86886ead9 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_auth.c @@ -34,7 +34,7 @@ void desktop_settings_scene_pin_auth_on_enter(void* context) { DesktopSettingsApp* app = context; DESKTOP_SETTINGS_LOAD(&app->settings); - furi_assert(app->settings.pin_code.length > 0); + furi_assert(desktop_pin_is_valid(&app->settings.pin_code)); desktop_view_pin_input_set_context(app->pin_input_view, app); desktop_view_pin_input_set_back_callback(app->pin_input_view, pin_auth_back_callback); diff --git a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c index 5721846c6..bd9dda727 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_pin_menu.c @@ -4,6 +4,7 @@ #include "../desktop_settings_app.h" #include "desktop_settings_scene.h" #include "desktop_settings_scene_i.h" +#include "desktop/helpers/pin.h" #define SCENE_EVENT_SET_PIN 0 #define SCENE_EVENT_CHANGE_PIN 1 @@ -19,7 +20,7 @@ void desktop_settings_scene_pin_menu_on_enter(void* context) { Submenu* submenu = app->submenu; submenu_reset(submenu); - if(!app->settings.pin_code.length) { + if(!desktop_pin_is_valid(&app->settings.pin_code)) { submenu_add_item( submenu, "Set Pin",