Commit Graph
1150 Commits
Author SHA1 Message Date
yellowcooln f280bbdc5c fix: secure modem migration and backup paths 2026-08-24 09:00:50 -04:00
yellowcooln ada8ba98fb Merge current dev and preserve modem tokens 2026-08-24 08:50:44 -04:00
Rightup b4b261980a feat(manage): add cleanup for broken distribution metadata and service diagnostics 2026-08-24 10:08:50 +01:00
Lloyd 5c318e0d7f Merge pull request #404 from agessaman/fix/login-perms
fix(acl): align ACL role numbering with MeshCore
2026-08-24 09:29:14 +01:00
agessaman f91d2e9504 test(acl): drive the wire tests from core's conformance vectors
The end-to-end tests asserted reply[7] == PERM_ACL_ADMIN, which follows
the constant wherever it goes — the one thing these tests exist to stop.
They now assert the literal bytes from openhop_core's acl_conformance
table, so both repos are pinned to the same numbers rather than to each
other's vocabulary. Checked out against 2a55dd6 with these tests copied
in, all seven fail.

Also cover the fail-closed import guard, which was the only untested
path protecting against a mixed-version install, plus its happy path so
a guard that always fires cannot pass unnoticed.
2026-08-21 18:56:23 -07:00
agessaman 7a2fb9b2df fix(acl): fail closed when openhop_core is too old for the role numbering
acl.py kept its own copy of the role constants, so an installation could
pair the new numbering with a core that still derives is_admin from the
0x02 bit. That combination announces a room server's READ_WRITE clients
(role 2) as admins on the login reply's is_admin byte — silently, and
exactly where this change is meant to make the two bytes agree. The
dependency is a mutable openhop_core@dev, so nothing prevented it.

Import the roles and acl_is_admin/acl_role from openhop_core instead of
duplicating them, and raise an actionable ImportError when they are
absent: refusing to start beats misannouncing a client's privileges. The
drift test no longer skips on an old core, so CI reports the mismatch
rather than hiding it.
2026-08-21 12:00:58 -07:00
agessaman 437a7ee332 fix(api): declare read_write in the ACL client permissions enum
The ACL client list now reports the real role, so a room server's
read-write clients emit "read_write" — a value the OpenAPI schema did
not allow, which generated clients and validators reject.

Add it to the enum, document all four roles, and add a test asserting
every role_name() we can emit is declared in the schema.
2026-08-21 11:57:24 -07:00
agessaman 3023eaca89 fix(acl): align ACL role numbering with upstream MeshCore
OpenHop numbered the ACL roles GUEST=0x01, ADMIN=0x02, READ_WRITE=0x01.
Firmware ClientACL.h uses GUEST=0, READ_ONLY=1, READ_WRITE=2, ADMIN=3 in
the low two bits, so our admin byte decoded as READ_WRITE in every stock
MeshCore client (KiekR showed admin sessions as guest and hid the admin
controls), and GUEST/READ_WRITE were indistinguishable from each other.

Adopt the firmware values and split the guest password by server type,
as firmware does: a repeater's guest password grants GUEST (fetch base
telemetry, no settings changes) and a room server's grants READ_WRITE
(post and read messages). Blank-password read-only access stays GUEST,
matching simple_room_server's allow_read_only branch.

Also fix the mesh-CLI admin gate in text.py, which shadowed a local
PERM_ACL_ADMIN = 0x02 and tested the bit rather than the role — under
the corrected numbering that would have let READ_WRITE clients run admin
commands. The web ACL list now reports the real role name instead of
collapsing every non-admin to "guest".

Requires openhop_core with acl_is_admin() in the login reply
(openhop_core fix/login-perms); the two must land together.

Fixes #388
2026-08-21 11:17:15 -07:00
yellowcooln 4ec79ed1dc fix: centralize config redaction marker 2026-08-20 13:37:45 -04:00
yellowcooln 301ba2cce8 fix: read canonical modem token status 2026-08-20 13:21:51 -04:00
yellowcooln 76e9a9c745 feat: migrate openHop modem sensor 2026-08-20 12:17:26 -04:00
yellowcooln 9511a8477f feat: migrate openHop modem transport names 2026-08-20 09:40:09 -04:00
Yellowcooln 2a55dd6034 Merge pull request #396 from yellowcooln/ci/versioned-docker-tags
ci: publish versioned Docker image tags
2026-08-19 20:22:27 -04:00
yellowcooln bd6b45227d ci: constrain automatic Docker channel builds 2026-08-19 19:44:42 -04:00
yellowcooln 05db509a6f refactor: rename bundled openHop Console build settings 2026-08-19 17:47:05 -04:00
yellowcooln 2d04085b76 ci: use upstream tags for fork image versions 2026-08-19 17:42:09 -04:00
yellowcooln 9708cbe9a2 ci: publish versioned Docker image tags 2026-08-19 17:31:36 -04:00
Rightup 653733a8b5 feat(mqtt): add support for custom base topic in MQTT configuration UI 2026-08-18 22:33:47 +01:00
Rightup 4633520149 fix: add missing stats item for direct adverts + extra filters to archive packets screen. 2026-08-18 22:22:36 +01:00
Rightup 1035666066 feat(config): add direct_advert_interval_hours to repeater configuration stats 2026-08-18 17:17:23 +01:00
Rightup c7157d280b feat: UI update packet table 2026-08-18 13:34:42 +01:00
Rightup aa59c313e4 Merge branch 'pr-395' into dev 2026-08-18 08:40:11 +01:00
Rightup e840c10ed9 Merge branch 'pr-392' into dev 2026-08-18 08:33:11 +01:00
Rightup f75200de6c Merge branch 'pr-393' into dev 2026-08-18 08:30:55 +01:00
Thibault VINCENT 9c1b3b4650 fix(update): never install a fabricated version
The OTA updater could stamp a build with a version that did not come from
the code being installed, which left nodes stuck on a version they could
not upgrade away from.

Two independent defects combined:

  * _fetch_latest_version() returned the newest repository tag whenever the
    GitHub lookup failed. On a dynamic channel such as dev, that value is
    from a different branch entirely, so the UI reported "up to date" while
    tracking a channel that was hundreds of commits ahead. The fallback also
    swallowed _RateLimitError, defeating the backoff path already built for
    it.

  * _do_install() then passed that predicted version to setuptools_scm as
    SETUPTOOLS_SCM_PRETEND_VERSION (and as the pretend-version argument of
    pymc-do-upgrade), so pip built the channel's code but recorded the
    predicted version as the installed one. When the two matched, every
    later upgrade — including Force Reinstall — resolved as "requirement
    already satisfied" and did nothing.

Observed on a node tracking dev: installed 1.1.1, latest 1.1.1, no update
offered, while dev was at 1.1.2.dev201.

A version lookup that cannot be resolved now raises, so a failed check is
reported as a failed check instead of a wrong version, and the install
derives its version from the checkout pip clones.

The remaining pretend-version uses in manage.sh are scoped to this
distribution. The unscoped variable applies to every setuptools_scm-based
project built in the same pip invocation, not only ours: dependencies
normally arrive as wheels and are unaffected, but one built from an sdist
inherits our version. With it set, pip wheel on the portend sdist produces
portend-9.9.9; portend and jaraco.functools both build with setuptools_scm.
buildroot-manage.sh already exports the scoped variant.

Signed-off-by: Thibault VINCENT <root@devcat.org>
2026-08-17 18:00:46 +02:00
Rightup 6e5c2d3e73 feat(advert): enhance advert sending with mode selection and routing options 2026-08-17 14:45:35 +01:00
Rightup 2f6dcf3c69 feat(advert): add direct advert interval configuration and scheduling 2026-08-17 14:25:19 +01:00
Chicagoland Mesh 0fc2c692dc enable neighbors 2026-08-15 23:46:38 -05:00
Chicagoland Mesh 1de4aa2ae3 feat(presets): add chimesh broker preset for ChicagolandMesh.org 2026-08-15 21:44:00 -05:00
ViezeVingertjes fd4e364fa3 Install the USB modem udev rule and document the Docker device path limitation 2026-08-15 10:38:47 +02:00
ViezeVingertjes 823f604585 Flag serial ports whose path Docker cannot map in the port picker 2026-08-15 10:38:47 +02:00
Lloyd 6028dcdc33 Merge pull request #390 from openhop-dev/intergration
Intergration
2026-08-13 16:48:15 +01:00
Rightup 9660f8f389 fix(api_endpoints): simplify token removal from request parameters 2026-08-13 16:46:21 +01:00
Rightup 8b785bfeda fix(dependencies): update openhop_core repository links to the correct source 2026-08-13 16:41:50 +01:00
Rightup 951b77fba1 fix(dependencies): update openhop_core repository links to use the correct source 2026-08-13 16:39:42 +01:00
Rightup 8fc0a2965d fix(api_endpoints): use getattr for request headers to avoid attribute errors
fix(tests): update _DummySX1262Radio to inherit from _DummyRadio for better structure
2026-08-13 16:27:16 +01:00
Rightup a85a04bffc Merge branch 'pr-385' into intergration 2026-08-13 16:06:08 +01:00
Rightup fd2c6102f3 Merge branch 'pr-386' into intergration 2026-08-13 16:06:08 +01:00
Rightup 51e16efcbb Merge branch 'pr-387' into intergration 2026-08-13 16:06:08 +01:00
Rightup 6d3218da7b Merge branch 'pr-389' into intergration 2026-08-13 16:06:08 +01:00
Étienne Fesser 258c256ba4 feat(telemetry): emit barometric pressure in environment telemetry 2026-08-12 17:24:38 +02:00
Étienne Fesser 22acdff6d3 feat(sensors): add BME280 temperature/humidity/pressure plug-in 2026-08-12 17:24:38 +02:00
Rightup 4c2a3af30a feat: add multi-radio stack support and related tests
- Added tests for multi-radio stack functionality, including merging radio entries and building radio stacks.
- Implemented policy context tests to ensure correct handling of radio IDs in multi-radio scenarios.
2026-08-11 16:14:36 +01:00
yellowcooln 5b5f2a0b84 docs: point Repeater guidance to central site 2026-08-10 21:42:34 -04:00
Étienne Fesser 43c1b342bd fix: assign one telemetry channel per sensor reading 2026-08-10 00:39:23 +02:00
Rightup d57baabf2e bug: fix ui Neigbours/map and filters. 2026-08-06 14:13:33 +01:00
Rightup 420f8e2230 feat(manage): update package installation to use python3-pip and install setuptools_scm in venv 2026-08-03 10:42:01 +01:00
Lloyd 2c66e9c51e Merge pull request #369 from d3c3p710n/fix/meshadv-mini-dio-flags
fix: enable DIO3 TCXO and DIO2 RF switch for MeshAdv Mini preset
2026-08-03 10:41:01 +01:00
Lloyd 73d685ea4b Merge pull request #380 from agessaman/feat/neighbors-defaults 2026-07-30 21:34:58 +01:00
agessaman e1b480d279 feat(mqtt): enable neighbors configuration in meshat-se preset
Added a new `neighbors: true` setting to the `meshat-se.yaml` configuration file under the MQTT brokers section, allowing for neighbor discovery functionality to be enabled in this preset.
2026-07-30 13:03:31 -07:00