Add sanity checks for pin code validity

This commit is contained in:
Willy-JL
2023-06-08 16:51:02 +01:00
parent 5c2e7f9e08
commit f2cc1fcac1
6 changed files with 25 additions and 8 deletions

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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",