Commit Graph

1024 Commits

Author SHA1 Message Date
686fe113c5 feat(vhosts-checker): Add KISS UI dashboard for HAProxy vhosts status
Renamed from routes-status to vhosts-checker to avoid conflict with
OpenWrt's default network routes page.

- KISS UI theme with header chips and status cards
- Shows HAProxy vhosts with mitmproxy route status (OUT/IN)
- SSL certificate status indicators
- WAF bypass detection
- Sync routes and add missing route actions
- Accessible at Status → VHosts Checker and KISS UI Network → VHosts Checker

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-04 11:07:22 +01:00
bd2883d612 Revert "feat(routes-status): Add KISS UI theme integration"
This reverts commit 5b8c7f498a.
2026-03-04 11:04:21 +01:00
5b8c7f498a feat(routes-status): Add KISS UI theme integration
- Rewrite overview.js with KissTheme.wrap() for consistent SecuBox styling
- Add header chips for stats (vhosts, active, missing routes, WAF bypass, SSL)
- Add service status cards (HAProxy, mitmproxy, host IP)
- Add to KISS navigation under Network → Routes Status

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-04 11:02:33 +01:00
eb9adfd06a feat(routes-status): Add LuCI dashboard for HAProxy vhosts and mitmproxy routes
New package luci-app-routes-status providing:
- HAProxy vhosts status overview (218+ vhosts supported)
- mitmproxy route configuration status (OUT/IN routes)
- SSL certificate status indicators
- WAF bypass detection (vhosts not using mitmproxy_inspector)
- Sync routes and add missing route actions
- RPCD backend with batch processing for large vhost counts

Accessible at Status → Routes Status in LuCI.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-04 10:50:27 +01:00
2bb40d9419 fix(users,routing): Add gitea/jellyfin support and fix mitmproxy routes
secubox-users:
- Add gitea and jellyfin to supported services list
- Add create/update/delete handlers for gitea (via API) and jellyfin
- Update CLI help and status display to include new services

luci-app-secubox-users:
- Add jellyfin service checkbox and badge in frontend
- Update RPCD handler to check jellyfin service status

mitmproxy routing fix:
- nextcloudctl: Use host LAN IP instead of 127.0.0.1 for WAF routes
  (mitmproxy runs in container, can't reach host's localhost)
- metablogizerctl: Same fix for mitmproxy route registration
- mitmproxyctl: Fix sync_metablogizer_routes to use host IP

This fixes 502/403 errors when accessing services through HAProxy->mitmproxy
because the mitmproxy container couldn't route to 127.0.0.1 on the host.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-04 10:16:07 +01:00
518891d538 fix(rpcd): Fix shell syntax errors in RPCD handlers
- network-modes: Remove orphan code block after final esac statement
- netdata-dashboard: Replace bash process substitution with POSIX awk

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-04 09:59:42 +01:00
8769a60275 feat(sbom): Add CRA Annex I compliant SBOM pipeline
Implements comprehensive Software Bill of Materials generation for
EU Cyber Resilience Act compliance with ANSSI CSPN certification path.

SBOM Pipeline:
- scripts/check-sbom-prereqs.sh: Prerequisites validation (OpenWrt, tools, Kconfig)
- scripts/sbom-generate.sh: Multi-source SBOM generation (native, feed, rootfs, firmware)
- scripts/sbom-audit-feed.sh: PKG_HASH/PKG_LICENSE feed audit with MANIFEST.md
- Makefile: SBOM targets (sbom, sbom-quick, sbom-validate, sbom-scan, sbom-audit)
- .github/workflows/sbom-release.yml: CI with CVE gating and auto-security issues

Documentation:
- SECURITY.md: CRA Art. 13 §6 compliant vulnerability disclosure policy
- docs/sbom-pipeline.md: Architecture, CRA mapping, ANSSI CSPN guidance

AI Gateway (bonus feed):
- secubox-ai-gateway: 3-tier data classification (LOCAL_ONLY/SANITIZED/CLOUD_DIRECT)
- luci-app-ai-gateway: LuCI dashboard with provider management and audit logging

Output formats: CycloneDX 1.6 (primary) + SPDX 2.3 (secondary)
Tools: syft, grype, cyclonedx-cli (auto-installed if missing)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-04 08:01:00 +01:00
684673d714 fix(emancipate): Direct mitmproxy route registration on emancipation
Previously, emancipation relied on secubox-route or mitmproxyctl sync-routes
which didn't reliably add routes to haproxy-routes.json. This caused newly
emancipated services to return 404 from mitmproxy.

Changes:
- streamlitctl: Direct JSON write as primary method for route registration
- metablogizerctl: Direct JSON write as primary method
- peertubectl: Direct JSON write as primary method
- pinaforectl: Direct JSON write + route through mitmproxy_inspector for WAF

All emancipation flows now directly write to /srv/mitmproxy-in/haproxy-routes.json
using Python, with secubox-route and mitmproxyctl as fallbacks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-03 16:38:30 +01:00
8a242cb229 fix(cdn-cache): Use correct field name for bandwidth saved stats
The RPCD returns 'bytes_saved' but the JS was looking for
'bandwidth_saved_bytes', causing the "BW Saved" stat to always show 0.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-03 11:32:47 +01:00
59dbd714a5 fix(tools): Add curl redirect handling to image builder scripts
Validated secubox-image.sh and secubox-sysupgrade.sh scripts:
- Fixed curl redirect issue: ASU API returns 301 redirects
- Added -L flag to 9 curl calls across both scripts
- Verified all device profiles valid (mochabin, espressobin, x86-64)
- Confirmed POSIX sh compatibility for sysupgrade script
- Validated first-boot script syntax

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-03 09:44:04 +01:00
29d309649e feat(wireguard): Implement Reverse MWAN WireGuard v2 Phase 1
WireGuard mesh peers as backup internet uplinks via mwan3 failover.

CLI (wgctl) uplink commands:
- uplink list/add/remove/status/test - Manage peer uplinks
- uplink failover enable/disable - Toggle automatic failover
- uplink priority/offer/withdraw - Priority and mesh advertising

Uplink Library (/usr/lib/wireguard-dashboard/uplink.sh):
- Gossip protocol integration via secubox-p2p
- WireGuard interface creation with IP allocation (172.31.x.x/16)
- mwan3 failover integration
- Connectivity testing and latency measurement

RPCD Backend (9 new methods):
- Read: uplink_status, uplinks
- Write: add_uplink, remove_uplink, test_uplink, offer_uplink,
         withdraw_uplink, set_uplink_priority, set_uplink_failover

UCI Config (/etc/config/wireguard_uplink):
- Global settings: auto_failover, failover_threshold, ping_interval
- Provider settings: offering state, bandwidth/latency advertisement
- Per-uplink config: interface, peer_pubkey, endpoint, priority

Phase 2 pending: LuCI dashboard integration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-01 15:43:17 +01:00
0c55ef6ec1 feat(nextcloud): Enhance integration with WAF, backups, mail, sync URLs
- WAF-safe SSL: Route through mitmproxy_inspector, auto-add routes
- Scheduled backups: setup-backup-cron with hourly/daily/weekly support
- Email/SMTP: setup-mail command for outbound notifications
- CalDAV/CardDAV: connections command shows sync URLs for all clients
- New RPCD methods: get_connections, setup_mail, setup_backup_cron
- ACL updated with new method permissions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-01 09:07:19 +01:00
b542ac7d3c feat: WAF auto-ban, cache busting, deployment docs, CVE Layer 7 docs
Changes:
- Enable WAF auto-ban by default (sensitivity: moderate, min_severity: high)
- Add whitelist for common safe IPs (localhost, router)
- Add browser cache busting via version parameter in CSS loads
- Document deployment scripts in secubox-tools/README.md
- Create CVE Layer 7 architecture documentation

WAF auto-ban now active with:
- 3 threats within 5 minutes triggers ban
- 4-hour ban duration
- Critical CVEs (Log4Shell, SQLi, CMDi) ban immediately

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-28 18:06:12 +01:00
d351ae515a feat(ai): Integrate MCP server and threat-analyst with AI Gateway
Route AI requests through the AI Gateway for data sovereignty compliance.

Changes:
- secubox-mcp-server: ai.sh now prefers AI Gateway (port 4050), falls back to LocalAI
- secubox-threat-analyst: UCI config adds ai_gateway_url option
- threat-analyst CLI shows both Gateway and LocalAI status
- analyzer.sh and appliers.sh use ai_url (Gateway preferred)
- README updated with AI Gateway integration section

The AI Gateway ensures threat data (IPs, MACs, logs) is classified as
LOCAL_ONLY and never leaves the device, supporting ANSSI CSPN compliance.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-28 17:59:20 +01:00
f3cea01792 feat(ai-gateway): Add Data Classifier (Sovereignty Engine) for ANSSI CSPN
Implement secubox-ai-gateway package with intelligent AI request routing
based on data sensitivity classification for GDPR/ANSSI compliance.

Features:
- 3-tier data classification: LOCAL_ONLY, SANITIZED, CLOUD_DIRECT
- Provider hierarchy: LocalAI > Mistral (EU) > Claude > GPT > Gemini > xAI
- PII sanitizer: IPv4/IPv6, MAC, credentials, private keys scrubbing
- OpenAI-compatible API proxy on port 4050
- aigatewayctl CLI: status, classify, sanitize, provider, audit commands
- RPCD backend with 11 ubus methods for LuCI integration
- ANSSI CSPN audit logging in JSONL format

Classification patterns detect:
- IP addresses, MAC addresses, private keys
- Credentials (password, secret, token, api_key)
- System paths, security tool references
- WireGuard configuration data

All cloud providers are opt-in. Default LOCAL_ONLY ensures data
sovereignty - sensitive data never leaves the device.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-28 17:55:22 +01:00
4a0ab9530f feat(mesh): Yggdrasil extended peer discovery + bugfixes
## New Features
- secubox-app-yggdrasil-discovery: Mesh peer discovery via gossip protocol
  - yggctl CLI: status, self, peers, announce, discover, bootstrap
  - Auto-peering with trust verification (master-link fingerprint)
  - Daemon for periodic announcements

## Bug Fixes
- tor-shield: Fix opkg downloads failing when Tor active
  - DNS over Tor disabled by default
  - Auto-exclude public DNS servers from iptables rules
  - Excluded domains bypass list (openwrt.org, pool.ntp.org, etc.)

- haproxy: Fix portal 503 "End of Internet" error
  - Corrected malformed vhost backend configuration
  - Regenerated HAProxy config from UCI

- luci-app-nextcloud: Fix users list showing empty
  - RPC expect clause was extracting array, render expected object

## Updated
- Bonus feed: All IPKs rebuilt
- Documentation: HISTORY.md, WIP.md, TODO.md updated

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-28 17:32:41 +01:00
19632e38e0 feat(routing): Centralize mitmproxy route management in secubox-core
Add centralized route registry (`secubox-route`) in secubox-core to eliminate
route management duplication across metablogizerctl, streamlitctl, and
mitmproxyctl.

New features:
- `/etc/config/secubox-routes` - UCI config for central route registry
- `/usr/sbin/secubox-route` - CLI for route management (add, remove, sync)
- Import routes from HAProxy, MetaBlogizer, Streamlit with source tracking
- Auto-sync to all mitmproxy instances on route changes
- Skip wildcard domains and LuCI (port 8081) routes

Updated services to use centralized registry:
- metablogizerctl: Use secubox-route add instead of mitmproxyctl sync
- streamlitctl: Use secubox-route add with domain/port params
- peertubectl: Use secubox-route add for emancipation
- vhost-manager/mitmproxy.sh: Prefer secubox-route when available
- mitmproxyctl: Delegate to secubox-route import-all for sync-routes

This prevents route mixups between services and provides a single
source of truth for all WAF routing configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-28 08:56:04 +01:00
0389f93667 fix(mitmproxy): Wildcard routing fallback and JSON output corruption
- Skip wildcard domains (starting with '.') in sync-routes to allow
  unknown subdomains to show "WAF SAYS NO" 404 page instead of blog
- Fix log_info() to output to stderr to prevent JSON corruption in
  sync-routes when log messages mixed with JSON fragments
- Escape CSS curly braces in NOT_FOUND_HTML for Python .format()
  compatibility (fixes KeyError: 'box-sizing')

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-28 08:45:44 +01:00
356e2814ca fix(streamlit): Add Re-upload and Gitea Sync buttons to Apps table
Restores missing functionality in the Streamlit dashboard:
- Re-upload button: Upload new .py/.zip to replace existing app code
- Gitea Sync button: Pull latest changes from Gitea repository

The buttons appear in the Apps Library table for each app.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-28 08:15:19 +01:00
07705f458c feat(meshname-dns): Add decentralized .ygg domain resolution
Implements Meshname DNS for Yggdrasil mesh networks with gossip-based
service discovery and dnsmasq integration.

New packages:
- secubox-app-meshname-dns: Core service with meshnamectl CLI
- luci-app-meshname-dns: LuCI dashboard for service management

Features:
- Services announce .ygg domains via gossip protocol (meshname_announce)
- dnsmasq integration via /tmp/hosts/meshname dynamic hosts file
- Cross-node resolution through gossip message propagation
- RPCD handler with 8 methods for LuCI integration

CLI commands: announce, revoke, resolve, list, sync, status, daemon

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-28 07:57:16 +01:00
af222328ee fix(waf): Add 'strict' sensitivity alias and fix false positives
- secubox_analytics.py: Add 'strict' as alias for 'aggressive' in autoban
- Fix waf_bypass false positives on LuCI static resources
- Root cause: different analytics versions across mitmproxy instances
- Update HISTORY.md with OpenClaw Gemini fix and WAF tuning

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 16:39:49 +01:00
55ec009c13 fix(openclaw): Update Gemini models to 2.0/2.5 versions
Gemini 1.5 models no longer available in API. Updated model list to:
- gemini-2.0-flash
- gemini-2.5-flash
- gemini-2.5-pro
- gemini-flash-latest

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 12:27:25 +01:00
5d905c23ac feat(openclaw): Add Google Gemini API support
- Added gemini provider with models: gemini-1.5-flash, gemini-1.5-pro, gemini-pro
- Updated RPCD handler with Gemini API endpoint
- Updated settings.js with Google AI Studio link
- Updated chat.js to parse Gemini response format
- Changed Ollama default URL to LocalAI (port 8091)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 11:47:17 +01:00
56f5d8c61f feat(openclaw): Add LuCI web interface for OpenClaw AI assistant
Complete LuCI app with:
- Chat view with real-time AI conversation
- Settings view for provider/model/API key configuration
- Integrations view for Telegram/Discord/Slack/Email/Calendar
- RPCD backend handling all ubus calls
- Support for Anthropic, OpenAI, and Ollama providers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 09:47:35 +01:00
a8dc5f58fe feat(waf): Never fallback to LuCI, add funny 404 page + OpenClaw package
mitmproxy haproxy_router.py:
- Return 404 instead of routing to LuCI (8081) for missing routes
- Block any routes that point to port 8081
- Add "WAF Says NO" themed 404 page with multi-layer WAF visual

HAProxy (deployed on router):
- Configure end_of_internet backend with custom errorfiles
- Add "End of Internet" themed error pages for 5xx errors
- Patched haproxyctl to include errorfile directives

New package: secubox-app-openclaw
- Personal AI assistant integration for SecuBox
- Supports Anthropic Claude, OpenAI, and Ollama providers
- Chat integrations (Telegram, Discord, Slack)
- Email/calendar automation support
- CLI tool: openclawctl

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 09:23:43 +01:00
c453cef5db perf(services-registry): Optimize RPCD handler for 200+ vhosts
Was timing out with 199 HAProxy vhosts due to ~600 UCI calls.

Optimizations:
- get_haproxy_vhosts(): Single uci show + awk parsing instead of
  per-vhost uci -q get calls (600 calls → 1 call)
- get_init_services(): Check only key services, use symlink detection
  instead of executing init scripts
- get_metrics_summary(): Read CrowdSec data from cache file instead
  of slow cscli commands

Result: Handler now responds in <1s with 204 published services.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 08:48:04 +01:00
0d40efea28 feat(kiss-theme): Redesign navigation with service subcategories
Reorganized sidebar menu into 9 logical categories:
- Dashboard: Home, Dashboard, System Hub, App Store
- Security: CrowdSec, mitmproxy WAF, IP Blocklist, Vortex FW, Wazuh, etc.
- Network: HAProxy, WireGuard, Tor Shield, DNS Master, CDN Cache, etc.
- Media: Jellyfin, PeerTube, Lyrion, WebRadio, MagicMirror
- Communication: Mail Server, Jabber, Matrix, SimpleX, Jitsi, VoIP
- Apps: Nextcloud, Gitea, HexoJS, MetaBlogizer, Streamlit
- AI & LLM: AI Insights, Ollama, LocalAI
- P2P & Mesh: Master Link, P2P Network, Exposure, Service Registry
- System: Settings, Cloner, File Sharing, Software

Added section comments for maintainability.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 08:15:34 +01:00
2924707e35 fix(luci): Await form.Map.render() Promise before KissTheme.wrap()
form.Map.render() returns a Promise, not a DOM element. Passing it
directly to KissTheme.wrap() caused "does not implement interface Node"
errors. Fixed by awaiting the Promise with .then() before wrapping.

Affected views:
- metablogizer/settings.js
- localai/settings.js
- domoticz/overview.js
- simplex/overview.js

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-27 07:24:10 +01:00
33bc1e1732 feat(haproxy): Add CrowdSec HAProxy bouncer for dual-layer WAF
- Add lua-load directive for CrowdSec bouncer script
- Add http-request lua.crowdsec_check to HTTP/HTTPS frontends
- Block requests where txn.blocked=1 with 403 status
- Skip CrowdSec check for ACME challenges (HTTP frontend)
- Dual-layer WAF: CrowdSec IP blocking + mitmproxy inspection

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 16:05:37 +01:00
d9913c4c17 fix: Mailserver webmail LXC detection, Nextcloud nginx MIME types
- luci.mailserver: Detect LXC containers for webmail status (not just Docker)
- docs: Add nginx static file fix and webmail detection to HISTORY/WIP

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 13:56:06 +01:00
27bb26df01 fix(metablogizer): Optimize list_sites RPC for 78 sites performance
- Replace per-site UCI calls with single-pass awk parsing
- Pre-fetch listening ports, HAProxy backends, and Tor services
- Fix getline variable corruption that produced invalid JSON
- Reduce execution time from 30+ seconds to 0.23 seconds
- Update signaling.gk2.secubox.in route to port 8083 (LXC)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 13:30:28 +01:00
40fcba797f fix(portal): Optimize get_vhosts RPC method for 191 vhosts
- Rewrote method_get_vhosts() to use single-pass awk parsing
- Reduced execution time from 30+ seconds timeout to 0.24 seconds
- Added arm, armada, files42 routes to mitmproxy config

The previous implementation made 4 UCI calls per vhost (764 total)
causing the luci-tree page to timeout. New implementation parses
uci show output once with awk.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 12:27:39 +01:00
e5e1151ffb feat(mitmproxy): Add route management and auto-sync for services
- Add route management commands:
  - `mitmproxyctl route list` - List all routes
  - `mitmproxyctl route add <domain> <ip> <port>` - Add manual route
  - `mitmproxyctl route remove <domain>` - Remove route
  - `mitmproxyctl route check` - Check for missing routes

- Improve sync-routes to scan MetaBlogizer and Streamlit services:
  - Auto-detect enabled MetaBlogizer sites and add routes
  - Auto-detect enabled Streamlit instances with matching vhosts
  - Warn about mitmproxy_inspector vhosts with missing routes

- Update routes config with 188 routes

This fixes the issue where services using mitmproxy_inspector backend
would fall back to default because their routes were not configured.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 11:52:01 +01:00
495d5da768 docs: Add Yggdrasil IPv6 overlay network milestone
- Deployed Yggdrasil on master (aarch64) and clone (x86_64)
- Connected to 2 public peers + LAN multicast auto-discovery
- Bidirectional ping6 and SSH over Yggdrasil working
- Fixed firewall zones: device="ygg0" required for nftables
- IPv6: master 201:e4d4:..., clone 201:a9d8:...
- Marks v1.1+ Yggdrasil overlay as complete

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 09:24:17 +01:00
a612bbe199 fix(haproxyctl): Handle multiple users in userlist
- Changed _print_uci_userlist to use config_list_foreach
- Each user now gets separate "user ... password ..." line
- Fixes HAProxy basic auth with multiple users

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 15:25:28 +01:00
a85a7dd39c feat(portal): Add ALERTE.DEPOT to SecuBox portal
- New section: Sécurité & Conformité
- Links to alerte.gk2.secubox.in
- Anonymous whistleblower platform (Loi Waserman)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 15:09:45 +01:00
a1a01b362b feat(alerte-depot): Add SecuBox Users HTTP authentication
- Fix auth for Streamlit container (no ubus access)
- Use HTTP JSON-RPC to /ubus endpoint for authentication
- Add ALERTE.DEPOT app source to repo
- Update HISTORY.md with VoIP and auth fixes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 14:54:33 +01:00
701558f611 fix(luci-app-voip): Remove invalid 'local' keywords from RPCD handler
- Shell 'local' keyword only works inside functions, not case statements
- Remove all 'local' declarations to fix RPCD handler execution
- Fixes "not in a function" error when calling trunk_test and other methods

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 14:41:43 +01:00
c137296dcd fix(voipctl): Fix JSON output in status command
- Fix active_calls and extensions count to output clean integers
- Remove tr -cd which was causing duplicate values in JSON
- Use simpler variable assignment with fallback to 0
- Prevents malformed JSON output from cmd_status()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 14:37:33 +01:00
4fee9e4c12 feat(secubox-users): Add Gitea integration with password sync
- Add Gitea as a service option in SecuBox Users UI
- Add Gitea checkbox in Add User modal
- Add Gitea service badge in status display
- Implement password sync to Gitea via API on password change
- Fix Gitea API call to include login_name parameter
- Add gitea to check_service() and get_status()
- Sync passwords to all enabled services (email, jabber, nextcloud, gitea)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 13:42:41 +01:00
33426e90e5 fix(streamlit): Fix ZIP extraction - except catches SystemExit
The bare `except:` clause catches SystemExit which is raised by
sys.exit(0), causing the script to fall through to sys.exit(1).

Changed to `except Exception:` which doesn't catch SystemExit,
allowing proper exit code propagation.

Also:
- Simplified Python extraction script
- Use double quotes for string literals (shell compatibility)
- Write Python script to temp file instead of heredoc (RPCD stdin conflict)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 12:51:15 +01:00
20cf959185 feat(streamlit): KISS upload - auto-detect ZIP, extract app.py, install deps
Streamlit upload now matches MetaBlogizer KISS pattern:
- Auto-detects ZIP files by magic bytes (PK header)
- Extracts app.py from ZIP archives automatically
- Adds UTF-8 encoding declaration to Python files
- Installs requirements.txt dependencies in background
- Restarts instance on re-upload for immediate update

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 12:32:45 +01:00
af1564821f feat(metablogizer): Add "Set as index" checkbox to upload modal
- Upload modal now defaults to replacing index.html
- "Set as index" checkbox checked by default
- Uncheck to use original filename (shows destination field)
- Fixes issue where uploads weren't updating main page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 12:16:23 +01:00
ed0c95f8da fix(metablogizer): Use emancipated flag for Expose/Unpublish button
- Changed button logic from exp.vhost_exists to exp.emancipated
- Non-emancipated sites now correctly show "Expose" button
- Emancipated sites show "Unpublish" button
- vhost_exists was incorrectly true for some non-emancipated sites

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 12:14:26 +01:00
3b32d631cb fix(metablogizer): Auto-republish and Gitea push on file upload
- Add auto-republish to method_upload_file (was only in upload_finalize)
- Add Gitea push to cmd_publish when gitea.enabled=1
- Use haproxyctl reload instead of init.d (container-aware)
- Uploaded content now triggers full republish flow for emancipated sites

This fixes the issue where uploading new HTML content didn't update
the live site because republish wasn't triggered.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 12:08:58 +01:00
629c21a75c feat(portal): Add password change feature for authenticated users
- New RPC method `change_password` in luci.secubox-users
  - Verifies current password before allowing change
  - Syncs new password to all enabled services (email, jabber, nextcloud)
  - Matrix/PeerTube require manual password update (noted in response)
- Portal UI updates:
  - New "Account" section with "Change Password" card
  - Password change modal with current/new/confirm fields
  - "My Services" card showing enabled services
- ACL updated to include new authentication methods

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 12:05:29 +01:00
adc83c3d8e fix(streamlit): Domain editing UCI update before async HAProxy reload
- Move UCI domain update BEFORE slow haproxyctl reload (prevents RPC timeout)
- Run HAProxy generate/reload/cert in background subshell
- Fix vhost name encoding: use tr '.-' '_' (matches streamlitctl)
- Use sed instead of jq for mitmproxy routes (jq may not be installed)
- Tested: domain edit returns immediately, UCI updated correctly

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 11:51:31 +01:00
41d5fadf3f fix(streamlit): CLI emancipate sets waf_enabled and uses container reload
- streamlitctl emancipate now sets waf_enabled="1" in instance UCI
- _emancipate_reload() uses haproxyctl reload (container) instead of
  deprecated /etc/init.d/haproxy restart (host init script)
- Properly verifies LXC container status after reload
- Tested: test2.gk2.secubox.in emancipation successful with WAF

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 11:31:21 +01:00
80c496b57e feat(streamlit): Add domain column with editing in dashboard
- Show domain column with editable input for non-exposed instances
- Show clickable domain link + edit button for exposed instances
- Add editDomain modal for changing domain on exposed instances
- Domain input pre-filled with default (id.gk2.secubox.in)
- Separate Status column for SSL/WAF badges
- Update API to support domain parameter in renameInstance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 11:18:01 +01:00
93fcefa5c3 fix(streamlit): Route CLI emancipate through WAF (mitmproxy_inspector)
- Update _emancipate_haproxy() to use mitmproxy_inspector backend
- Add mitmproxy route entries for domain -> streamlit port
- Aligns CLI behavior with RPCD emancipate_instance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 11:12:29 +01:00
dd9d1f1236 feat(streamlit): Gitea auto-push, WAF integration, and rename enhancements
- Add auto Gitea push on emancipate and app rename
- Route emancipated instances through mitmproxy_inspector (WAF) by default
- Add mitmproxy route entries for domains
- Enhanced rename_app to actually rename folders/files
- Enhanced rename_instance to update HAProxy vhost and mitmproxy routes
- Display WAF badge in dashboard for exposed instances

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 10:46:01 +01:00
2335578203 fix(haproxy): Permanent container-only architecture
- Add lxc_start_bg() and lxc_reload() functions for container management
- Replace all /etc/init.d/haproxy calls with container-aware functions
- Fix haproxy-sync-certs to use haproxyctl reload
- Host HAProxy init script disabled, container is sole handler

Resolves intermittent 404 errors caused by dual HAProxy instances.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 10:40:56 +01:00
36fbff3958 fix(metablogizer): Resolve HAProxy stability and add WAF status display
- Fixed random 404 errors caused by multiple HAProxy instances (container + host)
- Disabled host HAProxy service, container HAProxy now sole traffic handler
- Added auto-republish on upload for emancipated sites
- Added waf_enabled and emancipated fields to list_sites RPCD response
- Added WAF badge in LuCI dashboard Exposure column

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 10:19:33 +01:00
d267474ba3 fix(publish): Ensure uhttpd instances created on publish/emancipate
Streamlit RPCD:
- Fix backend address: 127.0.0.1 -> 192.168.255.1 (host network)
- Remove waf_bypass=1 (all traffic through mitmproxy)
- Add mitmproxy sync-routes call
- Use wildcard cert for *.gk2.secubox.in domains
- Restart HAProxy instead of just reload

MetaBlogizer:
- Add uhttpd instance creation check in cmd_publish()
- Add uhttpd instance creation check in _emancipate_haproxy()
- Sites now auto-start on publish/emancipate

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 09:46:51 +01:00
c5c488b7cb feat(cloner): Add OpenWrt version selection and package profiles to image builder
- Add --version and --profile CLI options to secubox-cloner build command
- Add versions command to list available OpenWrt releases (24.10.5, 24.10.0, 23.05.5, 23.05.4)
- Add package profiles: slim (minimal), core (mesh essentials), full (clone current device)
- Add list_versions and list_build_profiles RPCD methods for LuCI
- Update build_image RPCD to accept version and profile parameters
- Update ACL permissions for new read methods

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 09:28:20 +01:00
b0b27be82f feat(cloner): Implement staged remote flash (KISS v2)
Replaces unreliable nohup-based remote flash with staged approach:

1. remote_prepare_flash: Upload image + store options
2. remote_confirm_flash: Execute sysupgrade directly
3. remote_flash_status: Check flash state
4. remote_cancel_flash: Abort pending flash

Key fixes:
- Use /tmp for firmware (large tmpfs vs small rootfs)
- Direct sysupgrade execution (no nohup, works on OpenWrt)
- Proper dbclient SSH without unavailable commands
- Background job with & instead of nohup

Tested: x86_64 VM successfully flashed from 24.10.5 to 24.10.0

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 09:06:12 +01:00
164647b1e0 fix(cloner): Map discovery_enabled field for Factory tab UI
Backend returns discovery_enabled but UI expected enabled property.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 08:03:34 +01:00
ea9a86d485 feat(cloner): Add Factory Dashboard for zero-touch provisioning
Add Factory tab to Cloning Station with:
- Discovery Mode toggle (enable/disable zero-touch provisioning)
- Pending Devices list with approve/reject and profile assignment
- Bulk Token Generator (1-50 tokens with profile selection)
- Hardware Inventory table (MAC, Model, CPU, RAM, Storage)

Implementation:
- 8 RPC declarations for factory methods
- 5 state properties for factory data
- 5 render functions, 6 event handlers
- Factory data polling in 5-second refresh cycle when on tab
- KISS theme UI components throughout

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 07:30:15 +01:00
d43855b3d1 fix(mailserver): Use uid/gid 5000 for vmail user in Dovecot config
Fixes Roundcube IMAP "Internal error occurred" caused by Dovecot
running mail processes as uid 102 (Alpine default) instead of the
actual vmail user uid 5000.

Changes:
- configure_postfix: virtual_uid_maps/gid_maps 102/105 → 5000/5000
- configure_dovecot: mail_uid/gid, first_valid_uid, userdb args
- cmd_add_user: passwd file entries and ownership

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 07:11:43 +01:00
5fd3ebb17a feat(factory): Add zero-touch auto-provisioning for mesh devices
- Add inventory.sh for hardware inventory collection (MAC, serial, model, CPU, RAM, storage)
- Add profiles.sh for profile management and device matching
- Add default.json profile template for auto-provisioned peers
- Add discovery mode to master-link.sh with pending queue and approval workflow
- Add bulk token generation (up to 100 tokens per batch)
- Enhance 50-secubox-clone-provision with inventory collection and discovery join
- Add 9 new RPCD methods to luci.cloner for factory provisioning
- Fix p2p-mesh.sh to be silent when sourced as library
- Add UCI options: discovery_mode, auto_approve_known, discovery_window, default_profile

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 17:58:36 +01:00
997f4e47c2 fix(p2p-intel): Remove ash-incompatible redirection in for loop
The 2>/dev/null in for loop header causes syntax error in BusyBox ash.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 17:24:55 +01:00
a8eb8b1271 feat(p2p-intel): ZKP trust integration and IOC blockchain recording
P2P Mesh Intelligence implementation:
- Add ZKP trust bonus (+20) for verified peers in IOC validation
- Create blockchain.sh for permanent threat_ioc and ioc_feedback blocks
- Create feedback.sh for IOC effectiveness tracking and reputation updates
- Enhance gossip.sh IOC handler with ZKP-validated trust checks
- Add SCORE_IOC_EFFECTIVE (+5) and SCORE_IOC_FALSE_POSITIVE (-8) to reputation
- Add zkp_trust_bonus and feedback config options

fix(mailserver): Correct vmail UID from 102 to 5000

Dovecot was using wrong UID (102/redis instead of 5000/vmail) causing
permission denied errors when accessing mailboxes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 17:20:33 +01:00
6b7aa62a0e feat(mesh): ZKP authentication and blockchain sync
- ZKP Mesh Authentication: Zero-Knowledge Proof identity for mesh nodes
  - New API endpoints: zkp-challenge, zkp-verify, zkp/graph
  - Shell functions: ml_zkp_init, ml_zkp_challenge, ml_zkp_verify
  - Enhanced join flow with optional ZKP proof requirement
  - Blockchain acknowledgment via peer_zkp_verified blocks
  - LuCI dashboard with ZKP status section and peer badges

- MirrorNet Ash Compatibility: Fixed BusyBox shell incompatibilities
  - Replaced process substitution with pipe-based patterns
  - Fixed mirror.sh, gossip.sh, health.sh, identity.sh

- Mesh Blockchain Sync: Fixed chain synchronization between nodes
  - Fixed /api/chain/since endpoint to return only new blocks
  - chain_add_block/chain_merge_block use awk for safe JSON insertion
  - Handles varying JSON formatting (whitespace, newlines)
  - Tested bidirectional sync: Master <-> Clone at height 70

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 16:45:42 +01:00
7889cbb7bc fix(mitmproxy): Check route file changes on every request
Changed _check_interval from 10 to 1 to ensure new routes are picked up
immediately when the haproxy-routes.json file is updated.

This fixes the quick publish flow where new sites weren't accessible
immediately because mitmproxy only checked for route changes every
10 requests.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 14:01:56 +01:00
97aaf902fc fix(metablogizer): Add original_backend to vhost config for WAF route sync
When MetaBlogizer creates HAProxy vhosts, it routes through mitmproxy_inspector
for WAF inspection. However, mitmproxyctl sync-routes needs the original_backend
field to determine where to forward traffic after WAF inspection.

Without original_backend, sites would return 404 after upload because mitmproxy
had no route to forward traffic to the actual backend.

This fix adds original_backend=$backend_name to all 3 vhost creation locations:
- method_create_site (line 491)
- method_emancipate_site (line 1210)
- method_upload_and_create_site (line 2001)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 11:12:34 +01:00
a469076297 feat(waf): Add CVE-2025-14528 router botnet detection
Add new router_botnet WAF category for IoT/router exploitation:

CVE-2025-14528 (D-Link DIR-803 getcfg.php):
- AUTHORIZED_GROUP parameter manipulation
- SERVICES=DEVICE.ACCOUNT enumeration
- Newline injection bypass (%0a, %0d)

Additional router exploit patterns:
- D-Link hedwig.cgi, HNAP, service.cgi RCE
- UPnP SOAP injection
- Goform command injection
- ASUS/TP-Link/Netgear/Zyxel exploits

Mirai-variant botnet scanner detection:
- User-Agent signatures (Mirai, Hajime, Mozi, BotenaGo, etc.)
- Router payload injection patterns

Sources: CrowdSec Threat Intel, Global Security Mag

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 11:04:05 +01:00
4a972ab0ae fix(zkp-hamiltonian): ARM64 build fixes and RPCD CLI flag corrections
- Add #ifndef guard for ZKP_MAX_N in zkp_types.h to allow command-line override
- Copy OpenWrt Makefile to package root for proper feed detection
- Fix RPCD luci.zkp CLI flags: -r for ratio, -o for output prefix
- Add temp directory handling for keygen file generation

Tested on MochaBin router:
- zkp_keygen: generates graph + key pair
- zkp_prover: creates NIZK proof
- zkp_verifier: validates proof → ACCEPT

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 10:50:25 +01:00
a5fc33c8bc docs(luci-app-zkp): Add README with usage and protocol docs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 10:33:12 +01:00
b60d7fd009 feat(luci-app-zkp): Add ZKP Hamiltonian cryptographic dashboard
LuCI web interface for the ZKP Hamiltonian library:
- Status display: version, key count, storage paths
- Key generation: node count (4-50), edge density selection
- Prove/Verify workflow with ACCEPT/REJECT display
- Keys table with actions (Prove, Verify, Delete)
- KISS theme with dark mode support

RPCD backend methods:
- status: library info and stats
- keygen: generate graph + Hamiltonian cycle
- prove: create NIZK proof
- verify: validate proof
- list_keys, delete_key, get_graph

Note: Requires zkp-hamiltonian CLI tools to be installed.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 10:31:39 +01:00
ec8e96a7fd fix(metablogizer): Auto-sync mitmproxy routes on HAProxy reload
Upload workflow now works without needing to unpublish/expose again.
The reload_haproxy() function now calls mitmproxyctl sync-routes to
ensure mitmproxy picks up new routes immediately after vhost creation.

Root cause: Upload created HAProxy vhost and mitmproxy route file entry,
but mitmproxy never received a reload signal to activate the route.
Running emancipate fixed it because it called mitmproxyctl sync-routes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 10:06:31 +01:00
6553936886 feat(zkp-hamiltonian): Add Zero-Knowledge Proof library based on Hamiltonian Cycle
Implements NIZK (Non-Interactive Zero-Knowledge) proof protocol using
Blum's Hamiltonian Cycle construction with Fiat-Shamir transformation.

Features:
- Complete C99 library with SHA3-256 commitments (via OpenSSL)
- Graph generation with embedded trapdoor (Hamiltonian cycle)
- NIZK proof generation and verification
- Binary serialization for proofs, graphs, and cycles
- CLI tools: zkp_keygen, zkp_prover, zkp_verifier
- Comprehensive test suite (41 tests)

Security properties:
- Completeness: honest prover always convinces verifier
- Soundness: cheater fails with probability >= 1 - 2^(-128)
- Zero-Knowledge: verifier learns nothing about the secret cycle

Target: OpenWrt ARM (SecuBox authentication module)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 09:59:16 +01:00
29e2eac616 fix(haproxy): Sync generated config to /etc/haproxy.cfg
- metablogizer: reload_haproxy() now copies config to /etc/haproxy.cfg
- haproxyctl: generate_config() syncs to /etc/haproxy.cfg after generation
- Fixes issue where newly uploaded sites return 404 because HAProxy
  reads config from /etc/haproxy.cfg but config was only generated to
  /srv/haproxy/config/haproxy.cfg

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 08:02:42 +01:00
8a51a3e655 fix(led-pulse): Check HAProxy on host instead of LXC container
HAProxy runs on the host, not in an LXC container. The LED pulse
script was incorrectly checking `lxc-attach -n haproxy -- pgrep haproxy`
which always failed, causing constant SPUNK ALERT red LED flashing.

Changed to check host process directly with `pgrep haproxy`.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 07:03:57 +01:00
d5f2a0a319 feat(theme): Integrate kiss-theme.js into luci-theme-secubox
- Move kiss-theme.js from luci-app-secubox-portal to theme package
- Bump theme version to 0.4.8
- Prevents file conflict between packages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 17:40:12 +01:00
379fe8e4fe feat(vm-builder): Add QCOW2 support for Proxmox/KVM
- Add convert_to_qcow2() function using qemu-img
- Add QCOW2_FILE output path variable
- Create proxmox-import.sh helper script for easy VM import
- Update distribution package to include QCOW2 and Proxmox script
- Add Proxmox VE instructions to README
- Update usage help with QCOW2 output

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 16:14:56 +01:00
11833410aa feat(lyrion): Add extra_media_paths config for USB/external media
- Add extra_media_paths UCI option for additional bind mounts
- Supports both simple paths (/mnt/usb) and mapped paths (host:container)
- Automatically skips non-existent paths with info message

Example UCI config:
  option extra_media_paths '/mnt/sdb1:/mnt/usb /mnt/nas:/mnt/nas'

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 12:37:00 +01:00
4f931289db fix(lyrion): Fix LXC cgroup v2 compatibility and host networking
- Remove cgroup:mixed from mount.auto (incompatible with cgroup v2)
- Add lxc.net.0.type = none for proper host network sharing
- Add lxc.seccomp.profile = and lxc.autodev = 1 for cgroup v2

Fixes container startup failure with "Failed to mount /sys/fs/cgroup"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 12:31:52 +01:00
b414ea3284 fix(haproxy): Disable HTTP/2 to fix inconsistent vhost auth
HTTP/2 multiplexing caused HAProxy's http_auth() to inconsistently
evaluate auth rules, resulting in protected vhosts randomly returning
200 (bypass) or 401 (auth required).

Disabled HTTP/2 ALPN negotiation (alpn h2,http/1.1 → alpn http/1.1)
to ensure consistent HTTP Basic Auth behavior for protected sites.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 12:18:34 +01:00
a2bc5dd7d8 fix(gk2hub): Use placeholder for empty TSV fields (BusyBox read compat)
BusyBox ash's read command collapses consecutive tab delimiters,
causing the protected field to end up in the wrong variable.

Fix: Use "-" as placeholder for empty fields, then strip it when reading.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 09:48:39 +01:00
c2de15f861 feat(gk2hub): Add authentication support for protected MetaBlogizer sites
- Add lock badge CSS for protected site cards
- Add login banner for unauthenticated users
- Detect auth_required flag from metablogizer UCI config
- Hide protected cards until sessionStorage token present
- Filter respects authentication state in search and category views

Works with secubox-core portal-auth system.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 09:40:53 +01:00
5bf6d0d84c fix(metablogizer): Add wildcard SSL cert mapping on site creation
Sites on *.gk2.secubox.in were failing because HAProxy couldn't match
the SNI to the correct certificate. New add_haproxy_cert() helper:
- Extracts base domain from subdomain
- Creates UCI cert entry mapping domain to wildcard cert file
- Applied to all vhost creation paths (create, upload, republish)

Sites now work immediately after one-click deploy without manual
certificate configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 08:45:50 +01:00
2b7850379d fix(metablogizer): Use Python for reliable mitmproxy route updates
Replace fragile sed-based JSON manipulation with Python for adding
mitmproxy routes. The new add_mitmproxy_route() helper function:
- Updates both /srv/mitmproxy/ and /srv/mitmproxy-in/ routes files
- Uses proper JSON parsing instead of string substitution
- Ensures sites are immediately accessible after one-click deploy

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 08:29:33 +01:00
4f40316757 fix(metablogizer): Republish HAProxy vhost on domain change
When editing a site and changing its domain, automatically:
- Remove the old HAProxy vhost for the previous domain
- Create a new vhost for the new domain with priority=50
- Regenerate and reload HAProxy configuration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 08:20:08 +01:00
0da6c125a8 feat(metablogizer): Add Edit button to site dashboard
Add inline Edit button for each site in the dashboard allowing users
to modify site name, domain, description, and enabled status directly
from the overview page without navigating to settings.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 08:19:12 +01:00
daacdb731c feat(talk-hpb): Add Nextcloud Talk High Performance Backend package
New package secubox-app-talk-hpb:
- Docker-based signaling server and Janus WebRTC gateway
- Auto-generates TURN/SIGNALING/INTERNAL secrets
- Creates HAProxy vhost with SSL/ACME
- STUN/TURN server with UDP+TCP support
- CLI tool: talk-hpbctl setup/status/test/logs

Hub generator v5:
- Add PeerTube videos with thumbnails and duration badges
- Fix Streamlit instance detection (=instance vs =app)
- Total count now: sites + streamlit + videos

MetaBlogizer fix:
- Add priority=50 to new vhosts to prevent wildcard catch

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-22 15:13:02 +01:00
8223692436 feat(gk2hub): Add dynamic hub generator v3 with categories and previews
- Multi-view portal with grid/list/compact modes
- Automatic site categorization (Intelligence, Dev, Finance, etc.)
- Iframe thumbnail previews of real site content
- Tag cloud and category tabs with emoji indicators
- Instant search by domain/name/category
- Auto-refresh via cron every 5 minutes
- Created explicit vhosts for 54 MetaBlogizer sites
- Fixed wildcard routing priority

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-22 09:41:45 +01:00
a0ac5e1a16 fix(metablogizer): Add vhost creation for chunked upload methods
Both create_site_from_upload and upload_and_create_site were missing
HAProxy vhost creation step (step 8 from create_site method).

Changes:
- Add vhost creation with backend=mitmproxy_inspector for WAF routing
- Add mitmproxy route to /srv/mitmproxy-in/haproxy-routes.json
- Apply same fix to original create_site method for consistency

This ensures all MetaBlogizer uploaded sites are immediately accessible
via HTTPS and all traffic passes through WAF inspection.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-22 00:07:27 +01:00
011b59892a feat(metablogizer): Add chunked upload for large files
- Add create_site_from_upload RPC method for chunked site creation
- Modify JS api to auto-chunk files >40KB (ubus message size limit)
- Upload chunks sequentially via upload_chunk, then finalize with
  create_site_from_upload
- Add no_cache vhost option to haproxyctl for cache-control headers
- Fix large file upload failures caused by shell argument size limits

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 23:54:35 +01:00
50ddd2c1fe fix(peertube-import): Improve subtitle file detection pattern
- Changed glob pattern from ${slug}*.vtt to *.vtt to catch all subtitle files
- Fixed language extraction regex to work with any filename format
- Redirected yt-dlp subtitle output to stderr

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 20:24:07 +01:00
bbf2b19415 feat(peertube): Add video import with multi-track subtitle sync
- New peertube-import script for importing from YouTube, Vimeo, 1000+ sites
- CGI endpoints for portal integration (peertube-import, peertube-import-status)
- Portal UI: Video Import card with progress tracking
- Multi-language subtitle download and PeerTube caption upload
- Fixed stdout/stderr separation for reliable function returns
- UCI config: uses peertube.admin.username/password
- Package version bumped to 1.2.0
- Added README.md with full documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 20:18:51 +01:00
e3db75cd0a fix(peertube-analyse): Handle missing automatic_captions field in yt-dlp output
PeerTube videos don't include the automatic_captions field in their
yt-dlp JSON output. The jq filter was attempting (.automatic_captions | keys)
which fails with "null (null) has no keys" when the field is missing.

Fixed by adding null-coalescing: ((.automatic_captions // {}) | keys)
Also applied same fix to subtitles field for consistency.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 19:10:52 +01:00
f76dfe8a67 feat(peertube): Add web interface for video analysis
- Create standalone web UI at /peertube-analyse/
- Add CGI backend (peertube-analyse, peertube-analyse-status)
- Add RPCD methods: analyse, analyse_status
- Update portal with Intelligence & Analyse section
- Expose via analyse.gk2.secubox.in with SSL

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 18:34:26 +01:00
ab49e19c32 feat(peertube): Add transcript extraction & AI analysis tool
New CLI: peertube-analyse
- Extract video metadata via yt-dlp
- Download existing PeerTube subtitles (VTT)
- Fallback to Whisper local transcription (medium model)
- Claude AI analysis with structured intelligence report

Features:
- POSIX-compatible (OpenWrt, Alpine, Debian)
- Modular pipeline with graceful degradation
- Colored terminal output with status indicators
- Configurable Whisper model and language
- Truncation for large transcripts (12k chars)

CLI flags:
  --url <url>         Video URL
  --no-whisper        Subtitles only
  --force-whisper     Force transcription
  --no-analyse        Skip Claude analysis
  --model <name>      Whisper model
  --lang <code>       Language code

Output structure:
  ./output/<slug>/
    ├── <slug>.meta.json
    ├── <slug>.transcript.txt
    └── <slug>.analyse.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 18:15:55 +01:00
df58e96a9a feat(turn): Add setup-nextcloud command for Nextcloud Talk
- turnctl setup-nextcloud [turn-domain] [use-port-443]
  - Configures TURN for Nextcloud Talk compatibility
  - Uses port 443 by default (firewall-friendly)
  - Generates auth secret if not exists
  - Outputs admin settings to paste into Nextcloud Talk

- LuCI integration:
  - New "Nextcloud Talk" section in TURN overview
  - Shows STUN/TURN/secret settings for easy copy-paste
  - RPC method: setup_nextcloud

- ACL updated with setup_nextcloud permission

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 18:11:42 +01:00
6db547f7f8 feat: Add WebRadio, TURN server, and Lyrion streaming integration
New packages:
- luci-app-webradio: Web radio management with Lyrion bridge tab
- luci-app-turn: TURN/STUN server UI for WebRTC (Jitsi integration)
- secubox-app-lyrion-bridge: Lyrion → Squeezelite → FFmpeg → Icecast pipeline
- secubox-app-squeezelite: Squeezelite audio player with FIFO output
- secubox-app-turn: TURN server with ACME SSL and Jitsi setup
- secubox-app-webradio: Icecast/ezstream web radio server

Features:
- HTTPS streaming via HAProxy (stream.gk2.secubox.in)
- Lyrion Music Server bridge for streaming playlists to Icecast
- TURN server with time-limited credential generation
- CrowdSec integration for WebRadio security
- Schedule-based radio programming with jingles

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 17:46:54 +01:00
05d12ab130 feat(portal): Add guide link to login page
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 14:07:08 +01:00
d3ab23b07d feat(portal): Redirect root URL to login page
portal.secubox.in/ now redirects to /login.html for SSO flow

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 13:36:33 +01:00
20e4680d1a feat(portal): Update services dashboard with SecuBox theme
- Use SecuBox blue cyberpunk theme (matching login.html)
- Check secubox_token for authentication, redirect to login.html if missing
- Add Guacamole to administration services
- Consistent styling across all portal pages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 13:27:23 +01:00
08ebaefafb feat(portal): Add login and password reset pages for SSO
- Add login.html with RPCD authentication via luci.secubox-users
- Add reset.html for token-based password recovery
- Both pages use SecuBox cyberpunk dark theme
- Default password: Secubox@2026

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 13:21:15 +01:00
e7b6039c96 feat(portal): Add SSO authentication with SecuBox core users
Portal login now authenticates against SecuBox users (UCI config)
instead of hardcoded credentials.

New RPCD methods in luci.secubox-users:
- authenticate: Verify username/password, return session token
- recover: Send password reset email
- reset_password: Set new password with recovery token

Portal pages:
- login.html: Login form with password recovery link
- reset.html: Password reset form (from email link)

Features:
- SHA256 password hashing
- Session tokens stored in /tmp/secubox-sessions/
- Email-based password recovery via mailctl
- Public ACL access (no LuCI login required)
- Passwords synced to services if sync_passwords=1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-21 12:58:38 +01:00