mirror of
https://github.com/pe1hvh/meshcore-gui.git
synced 2026-07-06 18:01:23 +02:00
fix: channel attribution, dedup, cache bugs + channel edit/move (v1.19.0)
fix(packet_decoder): brute-force channel resolution when hash lookup fails
ChannelCrypto.calculate_channel_hash() and the MeshCore firmware compute
different channel identifiers for the same secret, causing _hash_to_idx to
return None for all hashtag-channel messages. Fallback: try each registered
key individually via a single-key keystore. First valid decryption wins.
Result cached in _hash_to_idx for O(1) resolution on subsequent packets.
fix(events): channel-agnostic sentinel prevents cross-channel duplicates
on_rx_log now marks '*' in DualDeduplicator after storing a message.
on_channel_msg checks this sentinel and suppresses storage regardless of
channel_idx or message_hash differences between the two library systems.
Fixes #mc-radar messages appearing in #weather and vice versa.
fix(events): secondary path-cache keyed by content for hash-mismatch
_path_cache keyed by meshcoredecoder hash; CHANNEL_MSG_RECV carries meshcore
hash (different value). Added _path_cache_by_content ("sender:text[:100]")
as fallback so path_hashes are recovered when the two hashes disagree.
fix(commands,cache): remove stale channel key after del_channel reindex
Cache entry for old_idx not removed after slot move, causing same channel
to appear twice. New DeviceCache.remove_channel_key(idx) called after each
move. asyncio.sleep(0.5) added before re-discovery to let device settle.
feat(channel_panel,commands,dashboard): channel edit — move/reindex support
First channel-edit capability in the GUI. New '↕️ Move / Reindex' mode in
Channel Manager dialog. Source channel selected from dropdown, target index
in number field. ↕ button inline with 🗑 in Messages and Archive submenus.
_cmd_move_channel reads secret from cache or device, writes new slot, clears
old slot, updates cache atomically, triggers re-discovery with settle delay.
This commit is contained in:
@@ -153,6 +153,20 @@ class DeviceCache:
|
||||
self._data["channel_keys"] = keys
|
||||
self.save()
|
||||
|
||||
def remove_channel_key(self, channel_idx: int) -> None:
|
||||
"""Remove a channel key from the cache and persist.
|
||||
|
||||
No-op if the index is not present.
|
||||
|
||||
Args:
|
||||
channel_idx: Channel slot index whose key should be removed.
|
||||
"""
|
||||
keys = self._data.get("channel_keys", {})
|
||||
removed = keys.pop(str(channel_idx), None)
|
||||
if removed is not None:
|
||||
self._data["channel_keys"] = keys
|
||||
self.save()
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Contacts (merge strategy)
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user