From e03414ce6d96c3acdc6bb56be59c50fb6a1721fc Mon Sep 17 00:00:00 2001 From: Dāvis Mošenkovs Date: Wed, 3 Sep 2025 21:50:13 +0300 Subject: Setting to disable DFU and FS access (#1891) * Expose SystemTask dependency controllers Expose NotificationManager and Settings for use by the feature in next commit. This is a memory efficient way for accessing SystemTask dependencies from controllers that have SystemTask injected as a dependency. Looks like each direct dependency injection uses 4 bytes RAM. As InfiniTime is close to running out of RAM (using 16 more bytes causes build to fail with "ld: region RAM overflowed with stack") it might be helpful to use this approach more. * Add setting to disable DFU and FS access --- src/components/ble/DfuService.cpp | 14 ++++++++++++++ src/components/ble/DfuService.h | 5 +++++ src/components/ble/FSService.cpp | 14 ++++++++++++++ src/components/ble/FSService.h | 6 ++++++ 4 files changed, 39 insertions(+) (limited to 'src/components/ble') diff --git a/src/components/ble/DfuService.cpp b/src/components/ble/DfuService.cpp index 2427513d..ad9c99e9 100644 --- a/src/components/ble/DfuService.cpp +++ b/src/components/ble/DfuService.cpp @@ -1,6 +1,8 @@ #include "components/ble/DfuService.h" #include #include "components/ble/BleController.h" +#include "components/ble/NotificationManager.h" +#include "components/settings/Settings.h" #include "drivers/SpiNorFlash.h" #include "systemtask/SystemTask.h" #include @@ -78,6 +80,18 @@ void DfuService::Init() { } int DfuService::OnServiceData(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context) { +#ifndef PINETIME_IS_RECOVERY + if (systemTask.GetSettings().GetDfuAndFsMode() == Pinetime::Controllers::Settings::DfuAndFsMode::Disabled) { + Pinetime::Controllers::NotificationManager::Notification notif; + memcpy(notif.message.data(), denyAlert, denyAlertLength); + notif.size = denyAlertLength; + notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; + systemTask.GetNotificationManager().Push(std::move(notif)); + systemTask.PushMessage(Pinetime::System::Messages::OnNewNotification); + return BLE_ATT_ERR_INSUFFICIENT_AUTHOR; + } +#endif + if (bleController.IsFirmwareUpdating()) { xTimerStart(timeoutTimer, 0); } diff --git a/src/components/ble/DfuService.h b/src/components/ble/DfuService.h index 6652cdc1..99be27b9 100644 --- a/src/components/ble/DfuService.h +++ b/src/components/ble/DfuService.h @@ -20,6 +20,8 @@ namespace Pinetime { namespace Controllers { class Ble; + class Settings; + class NotificationManager; class DfuService { public: @@ -87,6 +89,9 @@ namespace Pinetime { DfuImage dfuImage; NotificationManager notificationManager; + static constexpr const char denyAlert[] = "InfiniTime\0Firmware update attempted, but disabled in settings."; + static constexpr const uint8_t denyAlertLength = sizeof(denyAlert); // for this to work denyAlert MUST be array + static constexpr uint16_t dfuServiceId {0x1530}; static constexpr uint16_t packetCharacteristicId {0x1532}; static constexpr uint16_t controlPointCharacteristicId {0x1531}; diff --git a/src/components/ble/FSService.cpp b/src/components/ble/FSService.cpp index fda6b392..721ed297 100644 --- a/src/components/ble/FSService.cpp +++ b/src/components/ble/FSService.cpp @@ -1,6 +1,8 @@ #include #include "FSService.h" #include "components/ble/BleController.h" +#include "components/ble/NotificationManager.h" +#include "components/settings/Settings.h" #include "systemtask/SystemTask.h" using namespace Pinetime::Controllers; @@ -49,6 +51,18 @@ void FSService::Init() { } int FSService::OnFSServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context) { +#ifndef PINETIME_IS_RECOVERY + if (systemTask.GetSettings().GetDfuAndFsMode() == Pinetime::Controllers::Settings::DfuAndFsMode::Disabled) { + Pinetime::Controllers::NotificationManager::Notification notif; + memcpy(notif.message.data(), denyAlert, denyAlertLength); + notif.size = denyAlertLength; + notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; + systemTask.GetNotificationManager().Push(std::move(notif)); + systemTask.PushMessage(Pinetime::System::Messages::OnNewNotification); + return BLE_ATT_ERR_INSUFFICIENT_AUTHOR; + } +#endif + if (attributeHandle == versionCharacteristicHandle) { NRF_LOG_INFO("FS_S : handle = %d", versionCharacteristicHandle); int res = os_mbuf_append(context->om, &fsVersion, sizeof(fsVersion)); diff --git a/src/components/ble/FSService.h b/src/components/ble/FSService.h index b2299623..b43bc9e4 100644 --- a/src/components/ble/FSService.h +++ b/src/components/ble/FSService.h @@ -14,6 +14,8 @@ namespace Pinetime { namespace Controllers { class Ble; + class Settings; + class NotificationManager; class FSService { public: @@ -26,6 +28,10 @@ namespace Pinetime { private: Pinetime::System::SystemTask& systemTask; Pinetime::Controllers::FS& fs; + + static constexpr const char denyAlert[] = "InfiniTime\0File access attempted, but disabled in settings."; + static constexpr const uint8_t denyAlertLength = sizeof(denyAlert); // for this to work denyAlert MUST be array + static constexpr uint16_t FSServiceId {0xFEBB}; static constexpr uint16_t fsVersionId {0x0100}; static constexpr uint16_t fsTransferId {0x0200}; -- cgit v1.2.3-70-g09d2