mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-24 03:29:57 -07:00
Add sanity checks for pin code validity
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user