Commit Graph

914 Commits

Author SHA1 Message Date
niccellular
8cab967c14 feat(lockdown): gate toggle on Capabilities.supportsLockdown; soften enable warning
- Add Capabilities.supportsLockdown (atLeast V2_8_0) and gate the security-screen
  lockdown toggle visibility on it, consistent with the other firmware-version
  capability flags. SecurityConfigScreen computes Capabilities from the connected
  node's firmware_version; LockdownModeSetting takes a `supported` flag.
- Reword the enable-lockdown warning: it's reversible (disable with passphrase, or
  a full erase), so drop the inaccurate "permanent/irreversible" framing and the
  red error styling; rename strings lockdown_irreversible_* -> lockdown_enable_*.
- Update CapabilitiesTest for the V2_8_0 floor.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 18:36:20 -04:00
niccellular
28f92d07f2 test: fix Kotlin/Native test compile for lockdown changes
The CI shard-core allTests job compiles commonTest for the iosSimulatorArm64
target, which surfaced issues the JVM-only local run missed:

- Update stale test fakes to the current interfaces: FakePassphraseStore
  (maxSessionSeconds on savePassphrase) and core/takserver's FakeCommandSender /
  FakeServiceRepository (lockdown send + state members). These predate this
  change but only the Native test compile catches them.
- Rename the DISABLED test: Kotlin/Native rejects commas in backtick names.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 16:49:11 -04:00
niccellular
d0857ef278 feat(lockdown): runtime enable/disable toggle and DISABLED state
Make lockdown a runtime, user-toggleable setting rather than a one-way lock:

- Thread a `disable` flag through the lockdown send path (CommandSender,
  LockdownCoordinator, MeshActionHandler, RadioController, AIDL, UIViewModel)
  so the app can send LockdownAuth{passphrase, disable=true} to decrypt
  storage and leave lockdown.
- Add LockdownState.Disabled and map LockdownStatus.State.DISABLED; clear the
  stored passphrase and session authorization when a device reports DISABLED
  (or when the user disables it), so we never auto-unlock a disabled device.
- Add a "Lockdown mode" switch to the security settings screen
  (LockdownModeSetting): enable from DISABLED via a set-passphrase dialog with
  a one-time irreversible-SWD warning + explicit confirm; disable from UNLOCKED
  via a passphrase prompt; "Lock now" and session info while unlocked. The
  setting is hidden when the device never reports lockdown_status (non-capable).
- Tests for the disable round-trip and DISABLED mapping; refresh fakes/strings.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 16:30:37 -04:00
niccellular
2d6425e078 fix(proto): bump submodule to #927 (disable/DISABLED) and drop stale Marti prune
Moves core/proto to PR #927 head (c834f6b), which adds LockdownAuth.disable
and LockdownStatus.State.DISABLED on top of develop. That tree has no
meshtastic.Marti message, so the Marti prune left over from the master merge
was unused and broke generateCommonMainProtos; remove it.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 16:30:27 -04:00
niccellular
2f6c8288c4 Merge remote-tracking branch 'origin/main' into features/lockdown-v2
# Conflicts:
#	.specify/feature.json
#	AGENTS.md
#	core/proto/src/main/proto
#	feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/radio/component/SecurityConfigScreen.kt
2026-05-28 15:13:33 -04:00
Ben Meadors
a5e6894fe8 Enhance TAKTALK support with message and room handling, update SDK to v0.3.2 (#5634)
Co-authored-by: James Rich <james.a.rich@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-28 17:33:16 +00:00
James Rich
d892f43e00 fix(database): stabilize flaky DatabaseManagerWithDbRetryTest (#5635)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-28 10:44:59 -05:00
James Rich
a79e30e698 chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5631)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2026-05-28 03:42:49 -07:00
renovate[bot]
19ea164f93 chore(deps): update core/proto/src/main/proto digest to e3c8af5 (#5629)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-28 02:42:34 +00:00
James Rich
2277aae6e9 chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5625)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2026-05-28 00:34:34 +00:00
James Rich
fda8f97f32 fix(proto): prune TakTalkMessage and TakTalkRoomData from Wire codegen (#5624)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-27 13:54:52 -05:00
James Rich
562ac73901 chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5616) 2026-05-27 12:04:04 -05:00
renovate[bot]
7df0ee08e5 chore(deps): update core/proto/src/main/proto digest to 9ab4a1d (#5617) 2026-05-27 11:57:51 -05:00
James Rich
a4522f9f4d fix(flatpak): generate complete offline-buildable manifest for desktopApp (#5610)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 20:33:23 +00:00
renovate[bot]
5431ba87c4 chore(deps): update core/proto/src/main/proto digest to e4219a0 (#5608) 2026-05-26 13:14:11 -05:00
James Rich
a95cfdfb72 chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5604)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2026-05-26 08:04:24 -05:00
James Rich
184d547c78 chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5598)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2026-05-25 16:25:01 -05:00
James Rich
f17c38bf64 fix(emoji): enable androidResources for core:ui to package emoji-data.json (#5597)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 20:40:55 +00:00
James Rich
55e7f8f3de fix: consistent column width for compact node list items (#5596)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 20:32:31 +00:00
James Rich
684c4a9678 fix: hide battery indicator when level is 0 (never reported) (#5595)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 20:12:32 +00:00
James Rich
4b42e2c76c chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5577)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2026-05-22 19:07:46 -07:00
James Rich
a67927818b Extract node list display settings to dedicated screen (#5580)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-23 00:01:50 +00:00
James Rich
d870141b7c feat(ai): upgrade Chirpy on-device AI with proper APIs, download UX, and streaming (#5579)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-22 23:51:02 +00:00
James Rich
5ec6d80f61 docs: comprehensive documentation audit and refresh (#5572)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 20:50:01 -05:00
James Rich
479ed4f7fc chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5563) 2026-05-21 18:19:39 -05:00
renovate[bot]
c56432bf02 chore(deps): update core/proto/src/main/proto digest to 59cb394 (#5571) 2026-05-21 18:19:22 -05:00
James Rich
5d9e71da39 feat: node list density switching with compact layout and field toggles (#5444)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 17:44:48 -05:00
niccellular
3b02df3e67 Merge remote-tracking branch 'origin/main' into features/lockdown-v2
# Conflicts:
#	.specify/feature.json
#	AGENTS.md
#	core/proto/src/main/proto
2026-05-21 14:01:47 -04:00
James Rich
c26ef946b1 feat(docs): upgrade Chirpy assistant with streaming and live diagnostics (#5564) 2026-05-21 10:25:19 -05:00
James Rich
e67ebb7a0d feat: enable WAL connection pool for parallel reads (#5372)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 19:42:31 -05:00
renovate[bot]
6ffb320099 chore(deps): update com.github.luben:zstd-jni to v1.5.7-9 (#5556) 2026-05-20 19:39:45 -05:00
James Rich
4eae950ba1 chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5537) 2026-05-20 18:26:01 -05:00
James Rich
ea85b906e8 feat(nav): rename tab labels to canonical order (#5551)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 17:57:08 -05:00
James Rich
9d5e20c742 feat: align node list context menu to canonical 6-item order (#5548)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 22:31:35 +00:00
James Rich
4c09377ba5 fix: use single-shot low battery notifications (#5550)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 21:53:44 +00:00
James Rich
4c588b73f8 fix(settings): rename UDP toggle label for cross-platform audit alignment (#5549)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-20 21:51:29 +00:00
James Rich
0076be3a24 chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5532)
Co-authored-by: github-merge-queue <118344674+github-merge-queue@users.noreply.github.com>
2026-05-20 09:11:32 -05:00
James Rich
8113167833 build(flatpak): overhaul offline source generation with native cache scanner (#5533) 2026-05-20 09:11:03 -05:00
James Rich
99b5688b00 build(flatpak): overhaul and automate flatpak offline manifest generation (#5529) 2026-05-20 07:12:03 -05:00
James Rich
7ae1b26813 chore(flatpak): optimize CI source generation and clean up redundant tasks (#5525) 2026-05-20 04:51:47 -05:00
James Rich
e13a4359e1 fix(ci): exclude kotlinNativeBundleConfiguration from flatpak source generation (#5517)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 21:03:51 -05:00
James Rich
877909fa94 fix: prevent node details hang when device hardware API is unreachable (#5514)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 20:37:42 -05:00
James Rich
01d32e15c0 fix(database): update @Relation annotations for Room 3.0.0-alpha05 (#5507)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 14:36:47 -05:00
James Rich
228765a159 fix(ci): unblock Dokka documentation generation (#5496)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 13:00:45 -05:00
James Rich
83bb1a31f7 chore: Scheduled updates (Firmware, Hardware, Translations, Graphs) (#5465) 2026-05-19 10:12:04 -05:00
James Rich
fc0df1a79a feat(docs): In-app documentation browser with Jekyll site and Docusaurus sync (#5445)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 04:00:22 +00:00
James Rich
f5128798a8 feat: adopt Material 3 Expressive design system (M3-native APIs only) (#5479)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-19 01:10:47 +00:00
renovate[bot]
72436e70bc chore(deps): update core/proto/src/main/proto digest to 59cb394 (#5480) 2026-05-18 18:01:43 -05:00
niccellular
6ce565f16c feat(lockdown): thread max_session_seconds through coordinator and UI
End-to-end plumbing for LockdownAuth.max_session_seconds (per-boot
uptime cap on the unlocked session; 0 = unlimited).

Wire:
- CommandSenderImpl populates LockdownAuth.max_session_seconds in the
  outbound admin packet (clamped non-negative).

Coordinator + persistence:
- LockdownCoordinator.submitPassphrase gains optional maxSessionSeconds
  (default 0); persisted alongside boots/hours and replayed by
  auto-unlock so cached sessions keep the operator's cap on reconnect.
- StoredPassphrase gains a new field with a default of 0 so existing
  call sites stay source-compatible.
- LockdownPassphraseStore (Android EncryptedSharedPreferences impl):
  reads/writes the new field with a `_maxSessionSeconds` key suffix;
  legacy entries decode to 0.
- LockdownPassphraseStore (JVM file-backed impl): bumps the per-entry
  on-disk serialization from 3-line to 4-line; legacy 3-line entries
  still decode (treated as maxSessionSeconds=0).

IPC + radio plumbing:
- IMeshService.sendLockdownUnlock AIDL gains a 4th int parameter.
- MeshService stub, MeshActionHandler, RadioController interface, and
  both impls (AndroidRadioControllerImpl, DirectRadioControllerImpl)
  thread the field through.
- FakeIMeshService, FakeRadioController, FakeLockdownCoordinator
  updated to match.

UI:
- LockdownDialog adds a single optional "Session cap (minutes)" field
  below the boots/hours row. Operators enter minutes for ergonomics;
  the dialog multiplies by 60 before passing to the coordinator. Blank
  or 0 = unlimited (firmware default).
- UIViewModel.sendLockdownUnlock gains the new param with default 0.
- New string resources: lockdown_session_minutes,
  lockdown_session_minutes_help. Strings re-sorted via
  scripts/sort-strings.py.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:57:49 -04:00
niccellular
b5b56a3f11 chore(proto): bump submodule to develop (1c62540 -> 7ffb4bb)
Pulls in protobufs PR #916 which adds LockdownAuth.max_session_seconds
(uint32, field 5) — per-boot uptime cap on the unlocked session.
Wire-compatible (proto3 default 0 = unchanged behaviour).

Note: this pointer is on the upstream `develop` branch — `master` has
not absorbed it yet. Will need updating if the maintainer prefers a
master pointer at merge time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 16:57:49 -04:00