Commit Graph
13 Commits
Author SHA1 Message Date
agessaman 4ebde385dd fix(anon-req): allow requests to destinations that are not contacts
send_anon_req() refused to send whenever the destination pubkey was absent
from the client-side contact cache, returning ERROR contact_not_found.

The contact is consulted for one thing only: building the reply-path bytes
appended to the request. The companion firmware needs no contact of its own --
since FIRMWARE_VER_CODE 13 its CMD_SEND_ANON_REQ handler synthesises a
transient anon contact for an unknown pubkey with out_path_len = 0 (zero-hop
direct). Those entries live in a reserved slot ring, are hidden from
CMD_GET_CONTACTS and are never persisted, so nothing is polluted by them.

The client-side refusal therefore blocked a case the device supports, such as
asking a freshly discovered neighbour for its regions before it has ever been
added as a contact. Fall back to a zero-hop reply path instead.

Two smaller fixes in the same function:

- out_path_len is now read once into a local rather than re-read from the
  contact dict after the await. That dict is a live reference other commands
  mutate in place (send_msg_with_retry's flood fallback, reset_path); if it
  flipped to -1 mid-send the suggested_timeout multiplier became 4000 * 0 = 0,
  registering the binary request with a zero timeout so the response was
  dropped the moment it arrived.
- The value is clamped at 0. update_contact() normally reflects the change
  back onto the dict, but if it fails the dict stays -1 and the unsigned
  to_bytes raises OverflowError -- which skipped the reset_path at the end of
  the method and left the contact pinned to zero-hop on the device.

Verified against a companion radio on fw ver 13: without the change all five
discovered repeaters were refused client-side in 0.0s with no RF sent; with it
all three answered with their region scopes in ~1.1s.

test_send_anon_req_contact_not_found is replaced -- it codified the removed
limitation -- but its original regression (a TypeError on the NoneType
subscript) stays covered.
2026-07-26 19:23:32 -07:00
agessaman a9f68c2971 modify event callback handling to call synchronous callbacks inline, ensuring futures are resolved before waiting. This prevents race conditions when scheduling callbacks asynchronously. 2026-02-19 19:31:56 -08:00
agessaman ad7e48d028 add support for recv_errors in STATUS_PACKETS response 2026-01-29 20:41:48 -08:00
agessaman 45c265f9c9 Update BLE signing example to use a default chunk size of 120 bytes and add signature verification with the device's public key. Enhance debug output for data length and signature verification results. 2025-12-15 21:29:12 -08:00
agessaman 1ecc1d8055 Add timeout argument to sign and sign_finish methods for improved BLE operation handling 2025-12-15 19:54:44 -08:00
agessaman a814bd19b6 update documentation to reflect new signing commands 2025-12-15 05:58:18 -08:00
agessaman c42c30c25d implement device signing binary frames and sign() command for on-device signing. 2025-12-14 22:23:33 -08:00
agessaman f80988208b Clean up packets.py to remove unnecessary comment 2025-11-24 17:41:54 -08:00
agessaman e49d5c4c7b Fix residual packet types and rename STATS_CORE to STATS to match MyMesh.cpp 2025-11-24 17:41:17 -08:00
agessaman 4a97dd0968 Modify statistics handling in MessageReader to support binary parsing for core, radio, and packet stats. Update DeviceCommands to send appropriate commands for each stats type. 2025-11-17 09:59:50 -08:00
agessaman f82ed89c02 Add support for new statistics event types and commands 2025-11-07 22:44:43 -08:00
agessaman bc68af6805 removed example from the README 2025-10-12 18:31:44 -07:00
agessaman e0f71482c6 Add private key export support
- Add PRIVATE_KEY and DISABLED event types
- Add packet parsing for private key export responses
- Add export_private_key() method to DeviceCommands
- Add comprehensive unit tests
- Add BLE private key export example
- Update documentation with security notes
2025-10-12 18:23:32 -07:00