Skip to content

Commit a2d414a

Browse files
committed
Add setting to disable DFU and FS access
1 parent e6b96c2 commit a2d414a

File tree

17 files changed

+184
-12
lines changed

17 files changed

+184
-12
lines changed

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ list(APPEND SOURCE_FILES
425425
displayapp/screens/settings/SettingChimes.cpp
426426
displayapp/screens/settings/SettingShakeThreshold.cpp
427427
displayapp/screens/settings/SettingBluetooth.cpp
428+
displayapp/screens/settings/SettingOTA.cpp
428429

429430
## Watch faces
430431
displayapp/screens/WatchFaceAnalog.cpp

src/components/ble/DfuService.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "components/ble/DfuService.h"
22
#include <cstring>
33
#include "components/ble/BleController.h"
4+
#include "components/ble/NotificationManager.h"
5+
#include "components/settings/Settings.h"
46
#include "drivers/SpiNorFlash.h"
57
#include "systemtask/SystemTask.h"
68
#include <nrf_log.h>
@@ -29,9 +31,13 @@ void TimeoutTimerCallback(TimerHandle_t xTimer) {
2931

3032
DfuService::DfuService(Pinetime::System::SystemTask& systemTask,
3133
Pinetime::Controllers::Ble& bleController,
32-
Pinetime::Drivers::SpiNorFlash& spiNorFlash)
34+
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
35+
Pinetime::Controllers::Settings& settingsController,
36+
Pinetime::Controllers::NotificationManager& controllerNotificationManager)
3337
: systemTask {systemTask},
3438
bleController {bleController},
39+
settingsController {settingsController},
40+
controllerNotificationManager {controllerNotificationManager},
3541
dfuImage {spiNorFlash},
3642
characteristicDefinition {{
3743
.uuid = &packetCharacteristicUuid.u,
@@ -78,6 +84,18 @@ void DfuService::Init() {
7884
}
7985

8086
int DfuService::OnServiceData(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context) {
87+
#ifndef PINETIME_IS_RECOVERY
88+
if (__builtin_expect(settingsController.GetDfuAndFsMode() == Pinetime::Controllers::Settings::DfuAndFsMode::Disabled, 0)) {
89+
Pinetime::Controllers::NotificationManager::Notification notif;
90+
memcpy(notif.message.data(), denyAlert, denyAlertLength);
91+
notif.size = denyAlertLength;
92+
notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert;
93+
controllerNotificationManager.Push(std::move(notif));
94+
systemTask.PushMessage(Pinetime::System::Messages::OnNewNotification);
95+
return BLE_ATT_ERR_INSUFFICIENT_RES;
96+
}
97+
#endif
98+
8199
if (bleController.IsFirmwareUpdating()) {
82100
xTimerStart(timeoutTimer, 0);
83101
}

src/components/ble/DfuService.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,16 @@ namespace Pinetime {
2020

2121
namespace Controllers {
2222
class Ble;
23+
class Settings;
24+
class NotificationManager;
2325

2426
class DfuService {
2527
public:
2628
DfuService(Pinetime::System::SystemTask& systemTask,
2729
Pinetime::Controllers::Ble& bleController,
28-
Pinetime::Drivers::SpiNorFlash& spiNorFlash);
30+
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
31+
Pinetime::Controllers::Settings& settingsController,
32+
Pinetime::Controllers::NotificationManager& controllerNotificationManager);
2933
void Init();
3034
int OnServiceData(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context);
3135
void OnTimeout();
@@ -80,9 +84,14 @@ namespace Pinetime {
8084
private:
8185
Pinetime::System::SystemTask& systemTask;
8286
Pinetime::Controllers::Ble& bleController;
87+
Pinetime::Controllers::Settings& settingsController;
88+
Pinetime::Controllers::NotificationManager& controllerNotificationManager;
8389
DfuImage dfuImage;
8490
NotificationManager notificationManager;
8591

92+
static constexpr const char* denyAlert = "InfiniTime\0Firmware update attempted, but disabled.";
93+
static constexpr const uint8_t denyAlertLength = 52;
94+
8695
static constexpr uint16_t dfuServiceId {0x1530};
8796
static constexpr uint16_t packetCharacteristicId {0x1532};
8897
static constexpr uint16_t controlPointCharacteristicId {0x1531};

src/components/ble/FSService.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include <nrf_log.h>
22
#include "FSService.h"
33
#include "components/ble/BleController.h"
4+
#include "components/ble/NotificationManager.h"
5+
#include "components/settings/Settings.h"
46
#include "systemtask/SystemTask.h"
57

68
using namespace Pinetime::Controllers;
@@ -14,9 +16,14 @@ int FSServiceCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gat
1416
return fsService->OnFSServiceRequested(conn_handle, attr_handle, ctxt);
1517
}
1618

17-
FSService::FSService(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::FS& fs)
19+
FSService::FSService(Pinetime::System::SystemTask& systemTask,
20+
Pinetime::Controllers::FS& fs,
21+
Pinetime::Controllers::Settings& settingsController,
22+
Pinetime::Controllers::NotificationManager& notificationManager)
1823
: systemTask {systemTask},
1924
fs {fs},
25+
settingsController {settingsController},
26+
notificationManager {notificationManager},
2027
characteristicDefinition {{.uuid = &fsVersionUuid.u,
2128
.access_cb = FSServiceCallback,
2229
.arg = this,
@@ -49,6 +56,18 @@ void FSService::Init() {
4956
}
5057

5158
int FSService::OnFSServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context) {
59+
#ifndef PINETIME_IS_RECOVERY
60+
if (__builtin_expect(settingsController.GetDfuAndFsMode() == Pinetime::Controllers::Settings::DfuAndFsMode::Disabled, 0)) {
61+
Pinetime::Controllers::NotificationManager::Notification notif;
62+
memcpy(notif.message.data(), denyAlert, denyAlertLength);
63+
notif.size = denyAlertLength;
64+
notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert;
65+
notificationManager.Push(std::move(notif));
66+
systemTask.PushMessage(Pinetime::System::Messages::OnNewNotification);
67+
return BLE_ATT_ERR_INSUFFICIENT_RES;
68+
}
69+
#endif
70+
5271
if (attributeHandle == versionCharacteristicHandle) {
5372
NRF_LOG_INFO("FS_S : handle = %d", versionCharacteristicHandle);
5473
int res = os_mbuf_append(context->om, &fsVersion, sizeof(fsVersion));

src/components/ble/FSService.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,15 @@ namespace Pinetime {
1414

1515
namespace Controllers {
1616
class Ble;
17+
class Settings;
18+
class NotificationManager;
1719

1820
class FSService {
1921
public:
20-
FSService(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::FS& fs);
22+
FSService(Pinetime::System::SystemTask& systemTask,
23+
Pinetime::Controllers::FS& fs,
24+
Pinetime::Controllers::Settings& settingsController,
25+
Pinetime::Controllers::NotificationManager& notificationManager);
2126
void Init();
2227

2328
int OnFSServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context);
@@ -26,6 +31,12 @@ namespace Pinetime {
2631
private:
2732
Pinetime::System::SystemTask& systemTask;
2833
Pinetime::Controllers::FS& fs;
34+
Pinetime::Controllers::Settings& settingsController;
35+
Pinetime::Controllers::NotificationManager& notificationManager;
36+
37+
static constexpr const char* denyAlert = "InfiniTime\0File access attempted, but disabled.";
38+
static constexpr const uint8_t denyAlertLength = 48;
39+
2940
static constexpr uint16_t FSServiceId {0xFEBB};
3041
static constexpr uint16_t fsVersionId {0x0100};
3142
static constexpr uint16_t fsTransferId {0x0200};

src/components/ble/NimbleController.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,14 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
3030
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
3131
HeartRateController& heartRateController,
3232
MotionController& motionController,
33-
FS& fs)
33+
FS& fs,
34+
Settings& settingsController)
3435
: systemTask {systemTask},
3536
bleController {bleController},
3637
dateTimeController {dateTimeController},
3738
spiNorFlash {spiNorFlash},
3839
fs {fs},
39-
dfuService {systemTask, bleController, spiNorFlash},
40+
dfuService {systemTask, bleController, spiNorFlash, settingsController, notificationManager},
4041

4142
currentTimeClient {dateTimeController},
4243
anService {systemTask, notificationManager},
@@ -48,7 +49,7 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
4849
immediateAlertService {systemTask, notificationManager},
4950
heartRateService {*this, heartRateController},
5051
motionService {*this, motionController},
51-
fsService {systemTask, fs},
52+
fsService {systemTask, fs, settingsController, notificationManager},
5253
serviceDiscovery({&currentTimeClient, &alertNotificationClient}) {
5354
}
5455

src/components/ble/NimbleController.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ namespace Pinetime {
4949
Pinetime::Drivers::SpiNorFlash& spiNorFlash,
5050
HeartRateController& heartRateController,
5151
MotionController& motionController,
52-
FS& fs);
52+
FS& fs,
53+
Settings& settingsController);
5354
void Init();
5455
void StartAdvertising();
5556
int OnGAPEvent(ble_gap_event* event);

src/components/settings/Settings.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ void Settings::LoadSettingsFromFile() {
3434
if (bufferSettings.version == settingsVersion) {
3535
settings = bufferSettings;
3636
}
37+
if (settings.dfuAndFsMode == DfuAndFsMode::EnabledTillReboot) {
38+
settings.dfuAndFsMode = DfuAndFsMode::Disabled;
39+
}
3740
}
3841

3942
void Settings::SaveSettingsToFile() {

src/components/settings/Settings.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ namespace Pinetime {
3535
};
3636
enum class PTSGaugeStyle : uint8_t { Full, Half, Numeric };
3737
enum class PTSWeather : uint8_t { On, Off };
38+
enum class DfuAndFsMode : uint8_t { Disabled = 0, Enabled = 1, EnabledTillReboot = 2 };
3839

3940
struct PineTimeStyle {
4041
Colors ColorTime = Colors::Teal;
@@ -271,10 +272,21 @@ namespace Pinetime {
271272
return bleRadioEnabled;
272273
};
273274

275+
void SetDfuAndFsMode(DfuAndFsMode mode) {
276+
if (mode != settings.dfuAndFsMode) {
277+
settingsChanged = true;
278+
}
279+
settings.dfuAndFsMode = mode;
280+
};
281+
282+
DfuAndFsMode GetDfuAndFsMode() const {
283+
return settings.dfuAndFsMode;
284+
};
285+
274286
private:
275287
Pinetime::Controllers::FS& fs;
276288

277-
static constexpr uint32_t settingsVersion = 0x0006;
289+
static constexpr uint32_t settingsVersion = 0x0007;
278290

279291
struct SettingsData {
280292
uint32_t version = settingsVersion;
@@ -295,6 +307,8 @@ namespace Pinetime {
295307
uint16_t shakeWakeThreshold = 150;
296308

297309
Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
310+
311+
DfuAndFsMode dfuAndFsMode = DfuAndFsMode::Disabled;
298312
};
299313

300314
SettingsData settings;

src/displayapp/Apps.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ namespace Pinetime {
3737
SettingChimes,
3838
SettingShakeThreshold,
3939
SettingBluetooth,
40+
SettingOTA,
4041
Error
4142
};
4243
}

0 commit comments

Comments
 (0)