Commit Graph
2461 Commits
Author SHA1 Message Date
Kpa-clawbot 9b23200ea1 ci: update e2e-tests.json [skip ci] 2026-06-03 18:16:03 +00:00
f15b677981 fix(security): escape mesh node names before HTML render — stored XSS (#1536) (#1537)
## This PR fixes the stored XSS in full (closes #1536)

Mesh-advertised node names (`adv_name`) and observer names were rendered
into the dashboard DOM **without HTML-escaping** in multiple places —
the same class as the publicly disclosed MeshCore dashboard XSS
(CVE-2026-45323). `adv_name` has no protocol-level validation and the Go
`sanitizeName()` keeps `< > " &`, so a payload like `<img src=x
onerror=...>` reaches the frontend intact and executes.

**I audited every name/sender/text/channel render in `public/` and this
PR escapes all unescaped sinks. There are no known remaining XSS sinks
of this class after this change.**

### Sinks fixed (all escaped via the existing global `escapeHtml`, plus
a local helper for the standalone `area-map.html`)

| File | Sink |
|------|------|
| `app.js` | global search dropdown — node name + channel name |
| `nodes.js` | nodes-table row name; node-detail Leaflet popups (×2) |
| `observers.js` | observers-table name cell |
| `packets.js` | observer-name cells via `obsNameOnly` (×4) + observer
multi-select checkbox label |
| `live.js` | node-filter `<option>` + map marker tooltip |
| `analytics.js` | topology map node tooltip |
| `route-view.js` | hop + union marker tooltips (×2) |
| `area-map.html` | node popups (×2) — added a local `escapeHtml` (file
is standalone) |

### Already-safe (verified, not changed)
`map.js` popups (`safeEsc`), live-feed text (`escapeHtml(preview)`),
packet-detail text, channel messages (`channels.js`), `route-render.js`
popups, `hop-display.js`.

### Why escape at the sink (not the backend)
`sanitizeName()` only strips control chars; HTML-escaping stored names
server-side would be lossy and corrupt legitimate names containing `& <
>`, and break the `meshcore://` deep-links / exports. Output-encoding at
render is the correct OWASP fix and matches `meshcore-card` v0.3.3.

### Tests
- Added 6 `escapeHtml` regression tests including the CVE payload `<img
src=x onerror=alert(1)>` and an attribute-breakout payload.
- `node test-frontend-helpers.js`: **568 passed / 32 failed** — the 32
are pre-existing sandbox limitations (e.g. `AreaFilter is not defined`),
identical to the untouched baseline (562/32). Zero new failures.

### Cache busting
Automatic — the server rewrites `__BUST__` in `index.html` with a
restart timestamp, so no manual bump is needed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: CoreScope Bot <bot@meshcore>
Co-authored-by: Kpa-clawbot <bot@clawbot.local>
2026-06-03 10:55:02 -07:00
Kpa-clawbot c1a055aeb0 ci: update go-server-coverage.json [skip ci] 2026-06-02 21:21:14 +00:00
Kpa-clawbot 819a699493 ci: update go-ingestor-coverage.json [skip ci] 2026-06-02 21:21:13 +00:00
Kpa-clawbot 1c626015be ci: update frontend-tests.json [skip ci] 2026-06-02 21:21:12 +00:00
Kpa-clawbot a8ac6dce17 ci: update frontend-coverage.json [skip ci] 2026-06-02 21:21:11 +00:00
Kpa-clawbot fbb6bd2069 ci: update e2e-tests.json [skip ci] 2026-06-02 21:21:09 +00:00
Eldoon Nemar 99cea7bf72 fix(ui): Fix area not under cog and let live filters break out of scrolling container and improve metrics layout. Should resolve Issue #1529 (#1531)
### Description
This PR addresses several visual and UX issues on the Live page,
specifically focusing on mobile viewport constraints and filter
accessibility.

**Changes:**
1. **Dropdown Clipping Fix**: Previously, the Node, Region, and Area
filters were nested inside `.live-toggles`. On narrow screens,
`.live-toggles` becomes a horizontally scrolling container (`overflow-x:
auto`), which unintentionally clipped the absolute-positioned dropdown
menus for these filters. They have been moved to `.live-controls-body`
as siblings, allowing their dropdowns to correctly break out and overlay
the map.
2. **Cog Positioning**: The settings cog (`#liveControlsToggle`) has
been pushed to the far right of the metrics header using `margin-left:
auto`, creating a cleaner visual separation.
3. **Filter Spacing**: When the controls panel is expanded, a `12px` top
margin is now applied to push the filter buttons further away from the
metrics row for better touch targets and readability.
4. **Test Updates**: The E2E Playwright test for the Area dropdown was
updated to click the cog menu first, matching the new DOM structure.
5. **Area outside cog**: Resolves the initial issue of the area dropdown
being outside of the cog on a mobile display

### Performance Justification
This is a pure HTML/CSS structural refactor. There are no additional
per-item calculations or API calls introduced. Moving the DOM nodes out
of the scrolling container has zero impact on render loop complexity,
and no new JavaScript event listeners were added to the hot path.

### Testing
- [x] Unit tests pass (`npm test`)
- [x] Playwright E2E tests pass (updated to reflect the cog interaction)
- [x] Verified visually in browser (Desktop and Mobile viewports)
2026-06-02 14:00:09 -07:00
Kpa-clawbot 8954deb984 ci: update go-server-coverage.json [skip ci] 2026-06-02 20:14:50 +00:00
Kpa-clawbot e69f2e00be ci: update go-ingestor-coverage.json [skip ci] 2026-06-02 20:14:49 +00:00
Kpa-clawbot 8eda54d1cc ci: update frontend-tests.json [skip ci] 2026-06-02 20:14:47 +00:00
Kpa-clawbot 7957c27bb1 ci: update frontend-coverage.json [skip ci] 2026-06-02 20:14:46 +00:00
Kpa-clawbot c358df517d ci: update e2e-tests.json [skip ci] 2026-06-02 20:14:45 +00:00
Eldoon Nemar 2e70bcb671 UI accent partial fix for issue #1528 (#1530)
Made the suggested changes as listed in the fix path provided by
@Kpa-clawbot

Fix path:

`style.css:1244` `.field-table .section-row td` → `color: var(--text)`
(or new `--section-header-fg`).
`style.css:2620-2631` `.copy-link-btn` → `color: var(--text);`
background/border via `--accent-bg` / `--accent-border` tokens with safe
defaults.
`live.css:987` `.vcr-scope-btn.active` → same token swap; ensure text
remains `--text` on the tinted bg.
`nodes.js:212` `.multibyte-badge` → move inline styles to style.css,
`color:var(--text)`, keep `--accent-bg` background.

When creating the defaults for `--accent-bg` and `--accent-border`, I
chose to go with the default style values embedded in nodes.js, as that
was the safest bet.

We should probably extend the custom themes to include these variables
as well as not to confuse users if they see it. This also causes the
delima of, sometimes the `--accent` is use as the background for
objects, and not `--accent-bg`, example:
`btn active` has background set to` --accent` and border set to
`--accent`.

If we don't extend the config to accept accent-bg and accent-border, we
risk users still making accents of light blue that will be drown out
with the defaults we've set.


Also updated the badge above the multi-byte badge that contains X bytes
of the nodes public key, where X is determined by the path byte length.
This was done because it had styles set that were easy to add to the
styles.css file, to clean up coe. The node-type badge above it is
unfortunately driven by javascript in the nodes.js page, and requires
syling.

**Note:** Accidentally added ghost changes into this push for a second
time. They can be ignored as they were previously merged and shouldn't
have been seen as new.
2026-06-02 12:54:11 -07:00
Kpa-clawbot ffc31bf3ba ci: update go-server-coverage.json [skip ci] 2026-06-02 12:15:26 +00:00
Kpa-clawbot 83a3a52ce5 ci: update go-ingestor-coverage.json [skip ci] 2026-06-02 12:15:25 +00:00
Kpa-clawbot f9862b2166 ci: update frontend-tests.json [skip ci] 2026-06-02 12:15:24 +00:00
Kpa-clawbot 767a5e8862 ci: update frontend-coverage.json [skip ci] 2026-06-02 12:15:22 +00:00
Kpa-clawbot 10e2f53caf ci: update e2e-tests.json [skip ci] 2026-06-02 12:15:21 +00:00
Eldoon Nemar deafe32ba1 Fr(UI) - Rename ghost to inferred hops on live.js as partial fix for issue #1505 (#1527)
Rename of ghost to inferred hops as described as partial fix for issue
#1505
Update of ghostDesc in live.js, also mentioned as partial fix for issue
#1505
2026-06-02 04:54:23 -07:00
Kpa-clawbot b559f310f3 ci: update go-server-coverage.json [skip ci] 2026-06-02 04:14:26 +00:00
Kpa-clawbot 2144ffff14 ci: update go-ingestor-coverage.json [skip ci] 2026-06-02 04:14:25 +00:00
Kpa-clawbot 0000909737 ci: update frontend-tests.json [skip ci] 2026-06-02 04:14:24 +00:00
Kpa-clawbot 86c6d4ab62 ci: update frontend-coverage.json [skip ci] 2026-06-02 04:14:23 +00:00
Kpa-clawbot 1123da43d0 ci: update e2e-tests.json [skip ci] 2026-06-02 04:14:22 +00:00
Eldoon Nemar 0273f1546e fix(live/ui): Fixed a nav-right pin bug (#1526)
## Summary
Fixes a visual bug on the Live page where the navigation bar layout
would break, causing the right-side icons (search, theme toggle,
hamburger menu) to be pushed into the middle of the screen.

## Cause
The Live page dynamically injects a "📌" button to let users lock the
auto-hiding header. However, `live.js` was appending this button as a
direct child of the outer `.nav-bar` container.

Because `.nav-bar` uses flexbox with `justify-content: space-between` to
separate the left, center, and right sections, adding a 4th top-level
child threw off the distribution of space, squeezing `.nav-right` toward
the center.

## Changes
- **DOM Placement (`live.js`)**: Modified the injection logic to target
`.nav-right` and use `appendChild()` so the pin button is cleanly nested
at the far right of the existing right-side cluster (past the hamburger
menu).
- **CSS Cleanup (`live.css`)**: Removed `margin-left: auto;` from
`.nav-pin-btn` as it is no longer necessary and could cause spacing
issues inside the `.nav-right` flex container.

## Verification
- Verified the pin button renders seamlessly on the far right of the
Live page.
- Confirmed the outer `.nav-bar` layout strictly maintains its
left/center/right alignment.
- Confirmed there are no test regressions (the E2E test
`test-issue-1510-live-nav-pin-e2e.js` selects by ID and continues to
pass flawlessly).
2026-06-01 20:53:33 -07:00
Kpa-clawbot 6a623e727c ci: update go-server-coverage.json [skip ci] 2026-06-01 23:27:06 +00:00
Kpa-clawbot 2d67c9c25f ci: update go-ingestor-coverage.json [skip ci] 2026-06-01 23:27:05 +00:00
Kpa-clawbot 7e0d366721 ci: update frontend-tests.json [skip ci] 2026-06-01 23:27:04 +00:00
Kpa-clawbot 6355c74f5f ci: update frontend-coverage.json [skip ci] 2026-06-01 23:27:03 +00:00
Kpa-clawbot 6f915014fd ci: update e2e-tests.json [skip ci] 2026-06-01 23:27:02 +00:00
Sebastian Muszynski 73ceb4779e fix: sync packet hash into URL after trace (#1523)
Closes #1522

## Summary

- Call `history.replaceState` in `doTrace()` after the hash is
validated, so the URL becomes `#/tools/trace/<hash>` and can be shared
directly.

## Change

`public/traces.js` — one line added:
```js
history.replaceState(null, '', `#/tools/trace/${encodeURIComponent(hash)}`);
```

The read path (`init()` picks up the hash from the URL on load) already
existed — only the write path was missing.
2026-06-01 16:06:56 -07:00
Kpa-clawbot d8ac134069 ci: update go-server-coverage.json [skip ci] 2026-06-01 21:13:42 +00:00
Kpa-clawbot ad78b05e60 ci: update go-ingestor-coverage.json [skip ci] 2026-06-01 21:13:42 +00:00
Kpa-clawbot 53b05ca4a1 ci: update frontend-tests.json [skip ci] 2026-06-01 21:13:41 +00:00
Kpa-clawbot 06a771b6b6 ci: update frontend-coverage.json [skip ci] 2026-06-01 21:13:40 +00:00
Kpa-clawbot 0d053b9003 ci: update e2e-tests.json [skip ci] 2026-06-01 21:13:39 +00:00
Eldoon Nemar 3e4c456844 fix(ui): prevent animation fast-forward on tab wake (#1524)
When the browser backgrounds the tab,drops frames due to DOM bloat, or
user goes to another page; the uncapped delta time (`dt`) in the
`requestAnimationFrame` loop caused the physics engine to simulate
massive time jumps, making packets appear to fast-forward at 8x speed.

This commit:
- Clamps `dt` to a maximum of 32ms in both the path animation and node
pulse loops to ensure graceful slowdowns during lag.
- Restricts the `VCR.speed` multiplier strictly to `REPLAY` mode so live
packets are not accidentally accelerated.
2026-06-01 13:54:15 -07:00
Kpa-clawbot 55345517f2 ci: update go-server-coverage.json [skip ci] 2026-06-01 20:14:37 +00:00
Kpa-clawbot 33c72a0e5f ci: update go-ingestor-coverage.json [skip ci] 2026-06-01 20:14:36 +00:00
Kpa-clawbot 0919e9a40d ci: update frontend-tests.json [skip ci] 2026-06-01 20:14:35 +00:00
Kpa-clawbot ceea074017 ci: update frontend-coverage.json [skip ci] 2026-06-01 20:14:33 +00:00
Kpa-clawbot 06bfbfffb2 ci: update e2e-tests.json [skip ci] 2026-06-01 20:14:32 +00:00
efitenandClaude Sonnet 4.6 24a840d199 fix(nodes): align --card-bg with --surface-2 in dark mode — low-contrast card fix (#1470) (#1517)
## Problem

In dark mode, `.node-full-card` and `.node-stats-table` (and all other
`var(--card-bg)` consumers) rendered with a background only ~11 RGB
units away from the page background:

- Page bg: `--surface-0` = `#0f0f23` (RGB 15,15,35)  
- Card bg: `--surface-1` = `#1a1a2e` (RGB 26,26,46)  
- Delta: ~11 units per channel → appears near-white on
OLED/high-contrast LCD screens

## Fix

Align `--card-bg` to `--surface-2` (`#232340`) in dark mode — the same
value already used for `--detail-bg` throughout the app. Delta from page
bg increases to ~35 units per channel, which reads clearly as an
elevated dark surface rather than a washed-out off-white card.

Both dark-mode variable blocks updated in sync (`@media
prefers-color-scheme: dark` + `[data-theme="dark"]`). Light mode is
unchanged.

## Impact

All `var(--card-bg)` consumers in dark mode get the corrected colour:
node full cards, stats tables, analytics cards, packet detail panels,
dropdowns, etc. The value now matches `--detail-bg` so cards and detail
panels use a consistent surface colour.

Closes #1470.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-01 12:55:27 -07:00
Kpa-clawbot 945e3cc153 ci: update go-server-coverage.json [skip ci] 2026-06-01 12:16:06 +00:00
Kpa-clawbot df7b9e5f89 ci: update go-ingestor-coverage.json [skip ci] 2026-06-01 12:16:05 +00:00
Kpa-clawbot 76234f0021 ci: update frontend-tests.json [skip ci] 2026-06-01 12:16:04 +00:00
Kpa-clawbot 029e3674f4 ci: update frontend-coverage.json [skip ci] 2026-06-01 12:16:03 +00:00
Kpa-clawbot fefd8f0710 ci: update e2e-tests.json [skip ci] 2026-06-01 12:16:02 +00:00
Eldoon Nemar 75a38f0285 Additional live map performance optimizations (#1521)
This PR introduces a major performance optimization by migrating the
final DOM-heavy animation (node pulses) into the hardware-accelerated
canvas engine by migrating the concentric "pulse" rings (rendered when a
node receives a packet) from DOM-based Leaflet L.circleMarker elements
into the high-performance HTML5 canvas animation loop (activePulses).
This completely eliminates DOM thrashing when dozens of nodes broadcast
simultaneously, ensuring a buttery-smooth 60 FPS even under extreme
packet volume.
2026-06-01 04:54:50 -07:00