Commit Graph

612 Commits

Author SHA1 Message Date
JingleManSweep a358363c2f Merge pull request #180 from ipnet-mesh/chore/ui-refactoring
Refactor SPA frontend: eliminate inline SVGs, extract shared components
2026-05-02 16:55:31 +01:00
Louis King 5a8160da0e Refactor SPA frontend: eliminate inline SVGs, extract shared components and templates
- Add 4 missing icons to icons.js (iconSettings, iconLogout, iconPause, iconPlay)
- Replace 13 inline SVGs with icons.js functions across 5 files
- Remove 3 raw-string SVG helpers from components.js
- Rewrite renderAuthSection() to lit-html (was innerHTML)
- Add renderFilterCard() and renderStatCard() to components.js
- Adopt renderFilterCard() in nodes, messages, advertisements pages
- Extract sub-renderers from home.js (hero, stats, activity chart)
- Extract 5 modal dialogs from admin/node-tags.js
- Use renderStatCard() in home.js and dashboard.js
- Extract renderChartCards() helper from dashboard.js
2026-05-02 16:52:09 +01:00
JingleManSweep 4c4c2b4823 Merge pull request #179 from ipnet-mesh/feature/auth-improvements
Auth improvements: OIDC-gated member filter, profile page fixes, members refactor
2026-05-02 14:48:25 +01:00
Louis King 486178a471 Add OIDC-gated member filter to Nodes/Advertisements/Map pages, fix profile page issues
- Add member filter dropdown to Nodes, Advertisements, and Map pages
  (visible only when OIDC is enabled), showing profiles as
  "Name (Callsign)" format
- Add adopted_by query param to /map/data endpoint for server-side
  member filtering on the map
- Fix members feature flag: auto-disables when OIDC is disabled
- Fix profile page: remove duplicate adopted nodes section,
  extract renderMemberSince(), align form labels with fixed-width
  label column
- Add i18n keys: common.all_members, common.filter_member_label
- Add map endpoint adopted_by tests, update features tests
2026-05-02 14:43:55 +01:00
Louis King f42cf92664 Fixed map JS error 2026-05-01 00:22:24 +01:00
Louis King d37b30a05b Replace Member model with UserProfile-backed data
Remove the static Member model/table, CRUD API, YAML seed files, and
admin UI. Replace with UserProfile-driven members page that reads roles
from OIDC identity provider. Key changes:

- Drop members table, add roles column to user_profiles (Alembic migration)
- Add GET /api/v1/user/profiles (paginated, no user_id exposed)
- Add GET /api/v1/user/profile/me (auto-creates profile for current user)
- Replace member_id node tag filter with adopted_by (profile UUID)
- Members page now shows profiles grouped by operator/member roles
- Profile page supports public view (/profile/:id) and owner edit (/profile)
- Node detail page shows adoption card side-by-side with public key card
- Auto-create user profile during OIDC login callback
- Hide Adopted Nodes section for non-operator/admin users
- Add member since date to profile cards
- Add role badges and adopted node badges to member tiles
- Add antenna/users icons to Members page group headers
2026-04-30 20:57:26 +01:00
Louis King 378f04d183 Hide admin UI when OIDC is disabled 2026-04-30 00:56:55 +01:00
Louis King 38c792196f Auto-populate user profile name from IdP on first access
Proxy now injects X-User-Name header from session. Profile auto-creation
uses it as the initial name value. Existing profile names are never
overwritten.
2026-04-30 00:23:16 +01:00
Louis King 31418e6847 Add user profiles with node adoption via /v1/adoptions endpoint
Move adopt/release from profile routes to dedicated /v1/adoptions endpoint.
Node API now returns adopted_by field. Profile page shows read-only adopted
nodes. Node detail page has adopt/release buttons (operator adopts, admin
can release any). Admin release bypasses ownership check.
2026-04-30 00:07:49 +01:00
JingleManSweep 6a5a23845f Merge pull request #178 from ipnet-mesh/feature/oidc-oauth-support
Add OIDC/OAuth2 authentication for web dashboard
2026-04-29 12:57:58 +01:00
Louis King a14dbaec45 Add OIDC authentication section to README before Webhooks 2026-04-29 12:55:40 +01:00
Louis King a37971b05c Add docs/auth.md and update documentation cross-references
- Create docs/auth.md covering OIDC architecture, login flow, configuration,
  local development setup, and LogTo provider guide
- Remove direnv-specific quoting note from .env.example
- Clarify OIDC_DISCOVERY_URL auto-appends .well-known/openid-configuration
- Fix admin route references from /a/ to /admin/
- Add auth.md links to README.md and AGENTS.md doc lists
- Add docs/auth.md to AGENTS.md documentation sync rule
2026-04-29 12:50:50 +01:00
Louis King 2cb7a96294 Use replace mode for admin form handler navigations to prevent stale page
When form handlers navigate to the same URL (e.g. adding two tags in a row
produces the same &message=... URL), the router's same-URL check skipped
the re-render. Using replace=true bypasses the check and avoids polluting
browser history with repeated flash-message entries.
2026-04-29 00:50:55 +01:00
Louis King 2af8b281ea Add OPTIONS to API proxy, fix admin event listener accumulation, rename admin routes from /a/ to /admin/
- Add OPTIONS to the web API proxy route methods for CORS preflight support
- Fix event listener accumulation in admin/node-tags.js and admin/members.js
  using AbortController with cleanup functions returned to the SPA router.
  lit-html reuses DOM elements across re-renders, causing addEventListener
  calls to accumulate and fire multiple times per form submission.
- Rename admin routes from /a/ prefix to /admin/ for clarity
- Add debug logging for admin route access and OIDC role checks
- Move auth section in navbar after theme toggle
- Update tests and AGENTS.md accordingly
2026-04-29 00:45:45 +01:00
Louis King d1b6f0d0a7 Fix OIDC logout redirect and username display for LogTo
- Pass client_id in logout redirect so LogTo can validate post_logout_redirect_uri
- Add OIDC_POST_LOGOUT_REDIRECT_URI config option with fallback derivation
- Move session.clear() after logout_redirect() to allow state data save
- Add 'username' to strip_userinfo() name fallback chain (LogTo uses this)
- Strip quotes from OIDC_SCOPES and pass as list to Authlib (fixes direnv
  quoting issue where literal quotes were sent in the authorization URL)
- Add OIDC_POST_LOGOUT_REDIRECT_URI to config, app state, and docs
- Add INFO-level logging to callback and logout handlers for diagnostics
- Update .env.example, README.md, AGENTS.md, docs/upgrading.md
2026-04-28 22:44:01 +01:00
Louis King 02c0a8f1b7 Add OIDC/OAuth2 authentication via Authlib
Replace WEB_ADMIN_ENABLED with full OIDC support using Authlib.
Admin access now requires authenticated sessions with IdP-assigned
roles instead of an open toggle.

- Add authlib and itsdangerous dependencies
- Add OIDC settings to WebSettings (13 env vars)
- Create web/oidc.py module (OAuth registry, session helpers)
- Add /auth/login, /auth/callback, /auth/logout, /auth/user routes
- Gate API proxy writes to admin sessions when OIDC enabled
- Protect /a/ routes with session check (redirect to login)
- Add SessionMiddleware for signed session cookies
- Add renderAuthSection navbar component (login/avatar dropdown)
- Add 401/403 interceptor in api.js for auto-redirect
- Exclude /auth/ from SPA client-side router interception
- Render auth section after translations load (fixes raw key display)
- Add custom error pages for 500s (standalone HTML, no JS deps)
- Update docker-compose.yml to pass OIDC_* env vars to web container
- Update .env.example, README, AGENTS.md, upgrading.md, i18n.md
- Add auth.* and errors.* i18n keys
- Add 200 tests (OIDC, admin, error pages)
2026-04-28 17:36:44 +01:00
JingleManSweep 963dabbbd5 Merge pull request #177 from ipnet-mesh/chore/remove-header-auth-pattern
Remove header-based auth (ProxyHeadersMiddleware, is_authenticated config, OAuth2 SPA flows)
2026-04-28 13:36:47 +01:00
Louis King 9873aa202b Remove header-based auth (ProxyHeadersMiddleware, is_authenticated config, OAuth2 SPA flows)
Remove the reverse-proxy header authentication pattern (X-Forwarded-User,
X-Auth-Request-User, Basic auth forwarding) from the web dashboard. Admin
access is now controlled solely by the WEB_ADMIN_ENABLED flag.

- Remove web_trusted_proxy_hosts config field and ProxyHeadersMiddleware
- Remove _is_authenticated_proxy_request() and api_proxy() 401 guard
- Remove is_authenticated from SPA config JSON
- Remove OAuth2 login/sign-out UI from admin pages and router
- Remove auth_required i18n keys (en, nl)
- Remove auth-related tests and fixtures
- Delete docs/hosting/nginx-proxy-manager.md
- Update README, AGENTS.md, .env.example, docs/i18n.md, agents docs-sync refs

572 tests pass, pre-commit clean.
2026-04-28 13:33:52 +01:00
JingleManSweep 2cc76b853b Merge pull request #176 from ipnet-mesh/chore/observer-ux-tweaks
Update observer table: SNR/Path headers and value suffix cleanup
v0.9.2
2026-04-26 14:53:07 +01:00
Louis King 51d7de9d88 Update observer table: SNR/Path headers and value suffix cleanup
- Rename SNR header to 'SNR (dB)', Path header to 'Hops'
- Remove ' dB' and ' hop/s' suffixes from column values
- Add i18n keys for snr_db and hops to en.json and docs/i18n.md
- Fix README ARM note: only 32-bit ARM unsupported, RPi 3/4/5 work
2026-04-26 14:50:28 +01:00
JingleManSweep 8139cbc17e Merge pull request #175 from ipnet-mesh/chore/fix-network-error-display
Preserve table content on API errors with header warning badge
2026-04-26 14:05:37 +01:00
Louis King 8dec688917 Preserve table content on API errors with header warning badge
Instead of replacing the entire table with an error alert on network
failures, the previous data now stays visible and a warning icon with
tooltip appears in the sub-header bar. The warning clears automatically
on the next successful poll.

Restructured page headers into title row + sub-header row (count,
auto-refresh, warning) for better mobile layout.
2026-04-26 14:03:26 +01:00
JingleManSweep e4655a6b59 Merge pull request #174 from ipnet-mesh/feature/improve-snr-path-visibility
Add observer detail rows with SNR/path data and UI polish
2026-04-26 13:05:10 +01:00
Louis King e867f0074a Add observer detail rows with SNR/path data and UI polish
- Add path_len column to event_observers table with Alembic migration
- Create shared observer_utils.py for building observer responses
- Extract SNR and path_len from LetsMesh uploads via normalizer
- Pass snr/path_len from all 4 handlers to add_event_observer()
- Add expandable observer detail sub-tables to messages and ads pages
- Rename Receivers column to Observers with updated i18n key
- Add satellite dish icon to observer badges and detail rows
- Add mobile card observer detail toggle
- Show full datetime tooltip on hover for relative times
- Hide Path column from advertisement observer tables (not populated)
2026-04-26 13:02:39 +01:00
JingleManSweep a0d59748f2 Merge pull request #172 from ipnet-mesh/chore/change-meshcore-links
Update MeshCore URLs to meshcore.io and tagline
v0.9.1
2026-04-24 11:18:30 +01:00
Louis King 74901441f5 Update MeshCore URLs to meshcore.io and tagline
- Replace meshcore.dev and meshcore.co.uk with meshcore.io across all files
- Replace flasher.meshcore.co.uk with flasher.meshcore.io
- Update MeshCore tagline to 'Off-Grid, Open-Source Encrypted Messaging'
2026-04-24 11:15:23 +01:00
JingleManSweep 7f5650d3f5 Merge pull request #171 from ipnet-mesh/chore/fix-markdown-styling
Fix markdown table borders in custom content pages
2026-04-21 22:00:49 +01:00
Louis King 55eb54ba10 Fix markdown table borders in custom content pages
Use DaisyUI v5 prose CSS custom properties (--tw-prose-td-borders,
--tw-prose-th-borders, --tw-prose-quote-borders, --tw-prose-hr)
instead of color-mix(in oklch, ..., transparent) which produced
invisible borders due to oklch/transparent color space mismatch.
2026-04-21 21:58:13 +01:00
JingleManSweep 305df54e1b Merge pull request #165 from ipnet-mesh/renovate/tailwindcss-monorepo
Update tailwindcss monorepo to v4.2.4
2026-04-21 20:51:26 +01:00
renovate[bot] ca92b85b57 Update tailwindcss monorepo to v4.2.4 2026-04-21 19:01:36 +00:00
JingleManSweep 0b9fa0cb2a Merge pull request #170 from ipnet-mesh/fix/traefik-priority
Add TRAEFIK_PRIORITY support for multi-instance deployments
v0.9.0
2026-04-21 20:00:56 +01:00
JingleManSweep 2aefb428d9 Merge branch 'main' into fix/traefik-priority 2026-04-21 19:59:04 +01:00
Louis King 0938ba4fd0 Add TRAEFIK_PRIORITY support for multi-instance deployments 2026-04-21 19:58:42 +01:00
JingleManSweep 7d0126aa87 Merge pull request #169 from ipnet-mesh/fix/test-fixes
Fix test_collector_with_data_home_override by unsetting SEED_HOME env var
2026-04-21 19:53:41 +01:00
JingleManSweep 6177835065 Merge branch 'main' into fix/test-fixes 2026-04-21 19:47:15 +01:00
Louis King 6d8b7642b0 Fix test_collector_with_data_home_override by unsetting SEED_HOME env var 2026-04-21 19:45:44 +01:00
JingleManSweep d442c5f75e Merge pull request #168 from ipnet-mesh/fix/public-key-casing
fix: normalize public keys to lowercase to prevent tag/event mismatches
2026-04-21 19:35:01 +01:00
Louis King 0478bb00a1 fix: normalize public keys to lowercase to prevent tag/event mismatches
The LetsMesh normalizer stored public keys as UPPERCASE while the tag
importer stored them as lowercase, creating duplicate nodes for the same
device. Normalize all public keys to lowercase throughout:
- MQTT topic parsing (event, command, LetsMesh upload)
- LetsMesh normalizer output
- Node model __init__ enforcement
- Alembic migration to merge duplicates and normalize existing data
2026-04-21 08:50:38 +01:00
JingleManSweep 4887463515 Merge pull request #164 from ipnet-mesh/feature/ui-bundling
Replace all CDN dependencies with locally built vendor assets
2026-04-20 13:18:56 +01:00
Louis King 4f202c068b Replace all CDN dependencies with locally built vendor assets
- Add Node.js 22 LTS frontend build stage (package.json, build.js)
- Build Tailwind CSS v4 + DaisyUI v5 via CLI instead of runtime CDN
- Vendor lit-html, Leaflet, Chart.js, QRCode.js locally
- Update Dockerfile with multi-stage Node.js frontend build
- Migrate all DaisyUI v4 CSS variables to v5 syntax in app.css
- Fix dashboard grid layout (static class names for Tailwind JIT)
- Fix map popup transparent background (v5 variable rename)
- Fix leaflet.js.map 404 (include source maps in vendor copy)
- Fix custom page button contrast (remove btn-neutral)
- Replace table-compact with table-sm (DaisyUI v5 rename)
2026-04-20 13:16:13 +01:00
JingleManSweep 49bbcf1b7c Merge pull request #163 from ipnet-mesh/chore/fix-subdomains
More fixes
2026-04-19 23:05:14 +01:00
Louis King d43a15bab0 More fixes 2026-04-19 23:03:03 +01:00
JingleManSweep fed4f7ba34 Merge pull request #162 from ipnet-mesh/chore/fix-subdomains
Added subdomain support for web service
2026-04-19 22:46:46 +01:00
Louis King 14e2ead4d2 Added subdomain support for web service 2026-04-19 22:44:36 +01:00
JingleManSweep 0f86870ba6 Merge pull request #161 from ipnet-mesh/chore/fix-packetcapture-compose
Fixed Packet Capture Docker Compose
2026-04-19 22:16:46 +01:00
JingleManSweep 3d681fc2da Merge branch 'main' into chore/fix-packetcapture-compose 2026-04-19 22:15:00 +01:00
JingleManSweep fb4d01ac5c Merge pull request #159 from ipnet-mesh/chore/action-fixes-2
Updates
2026-04-19 22:14:27 +01:00
Louis King 846e12ce66 Fixed Packet Capture Docker Compose 2026-04-19 22:13:38 +01:00
Louis King 79ab4ee06f Updates 2026-04-19 21:58:43 +01:00
Louis King 5df308b6bc Updates 2026-04-19 21:56:59 +01:00