From 9d46ff51f3f94043eeec3ace1d79f6d8d49746c5 Mon Sep 17 00:00:00 2001 From: CyberMind-FR Date: Sat, 31 Jan 2026 08:15:24 +0100 Subject: [PATCH] fix(factory): Use HMAC-style signing for OpenWrt compatibility - Replace signify-openbsd calls with HMAC-based signatures (OpenWrt's signify lacks -n flag for no-passphrase) - Fix API paths in UI: use /factory/ not /api/factory/ - Support cross-port API calls (UI on 8081, API on 7331) - Update LuCI view to use relative /factory/ path - Update feed with secubox-p2p 0.4.0 packages Co-Authored-By: Claude Opus 4.5 --- .../resources/view/secubox-p2p/factory.js | 5 +- .../root/www/secubox-feed/Packages | 150 ++++++++++-------- .../root/www/secubox-feed/Packages.gz | Bin 7835 -> 7914 bytes .../root/www/secubox-feed/apps-local.json | 146 +++++++++-------- .../luci-app-secubox-p2p_0.1.0-r1_all.ipk | Bin 0 -> 39254 bytes .../secubox-feed/secubox-p2p_0.3.0-r1_all.ipk | Bin 16997 -> 0 bytes .../secubox-feed/secubox-p2p_0.4.0-r1_all.ipk | Bin 0 -> 27891 bytes .../root/usr/lib/secubox/factory.sh | 78 +++------ .../secubox-p2p/root/www/factory/index.html | 10 +- 9 files changed, 196 insertions(+), 193 deletions(-) create mode 100644 package/secubox/secubox-app-bonus/root/www/secubox-feed/luci-app-secubox-p2p_0.1.0-r1_all.ipk delete mode 100644 package/secubox/secubox-app-bonus/root/www/secubox-feed/secubox-p2p_0.3.0-r1_all.ipk create mode 100644 package/secubox/secubox-app-bonus/root/www/secubox-feed/secubox-p2p_0.4.0-r1_all.ipk diff --git a/package/secubox/luci-app-secubox-p2p/htdocs/luci-static/resources/view/secubox-p2p/factory.js b/package/secubox/luci-app-secubox-p2p/htdocs/luci-static/resources/view/secubox-p2p/factory.js index 14f83c38..83f7883a 100644 --- a/package/secubox/luci-app-secubox-p2p/htdocs/luci-static/resources/view/secubox-p2p/factory.js +++ b/package/secubox/luci-app-secubox-p2p/htdocs/luci-static/resources/view/secubox-p2p/factory.js @@ -5,8 +5,9 @@ return view.extend({ render: function() { // Get the current host to build the factory URL + // Factory UI is served from main uhttpd, API is on 7331 var host = window.location.hostname; - var factoryUrl = 'http://' + host + ':7331/factory/'; + var factoryUrl = '/factory/'; return E('div', { 'class': 'cbi-map' }, [ E('h2', {}, _('SecuBox Factory')), @@ -21,7 +22,7 @@ return view.extend({ 'style': 'margin-right: 0.5rem;' }, _('Open in New Tab')), E('span', { 'style': 'color: #888; font-size: 0.85rem;' }, - _('Factory runs on port 7331') + _('Factory API on port 7331') ) ]), E('iframe', { diff --git a/package/secubox/secubox-app-bonus/root/www/secubox-feed/Packages b/package/secubox/secubox-app-bonus/root/www/secubox-feed/Packages index d1aad179..286c9185 100644 --- a/package/secubox/secubox-app-bonus/root/www/secubox-feed/Packages +++ b/package/secubox/secubox-app-bonus/root/www/secubox-feed/Packages @@ -8,7 +8,7 @@ Architecture: all Installed-Size: 71680 Description: Comprehensive authentication and session management with captive portal, OAuth2/OIDC integration, voucher system, and time-based access control Filename: luci-app-auth-guardian_0.4.0-r3_all.ipk -Size: 12078 +Size: 12081 Package: luci-app-bandwidth-manager Version: 0.5.0-r2 @@ -20,7 +20,7 @@ Architecture: all Installed-Size: 378880 Description: Advanced bandwidth management with QoS rules, client quotas, and SQM integration Filename: luci-app-bandwidth-manager_0.5.0-r2_all.ipk -Size: 66973 +Size: 66966 Package: luci-app-cdn-cache Version: 0.5.0-r3 @@ -32,7 +32,7 @@ Architecture: all Installed-Size: 122880 Description: Dashboard for managing local CDN caching proxy on OpenWrt Filename: luci-app-cdn-cache_0.5.0-r3_all.ipk -Size: 23192 +Size: 23189 Package: luci-app-client-guardian Version: 0.4.0-r7 @@ -44,7 +44,7 @@ Architecture: all Installed-Size: 307200 Description: Network Access Control with client monitoring, zone management, captive portal, parental controls, and SMS/email alerts Filename: luci-app-client-guardian_0.4.0-r7_all.ipk -Size: 57045 +Size: 57042 Package: luci-app-crowdsec-dashboard Version: 0.7.0-r29 @@ -68,7 +68,7 @@ Architecture: all Installed-Size: 71680 Description: Cyberpunk-themed RSS feed aggregator dashboard with social media support Filename: luci-app-cyberfeed_0.1.1-r1_all.ipk -Size: 12839 +Size: 12838 Package: luci-app-exposure Version: 1.0.0-r3 @@ -92,7 +92,7 @@ Architecture: all Installed-Size: 92160 Description: Modern dashboard for Gitea Platform management on OpenWrt Filename: luci-app-gitea_1.0.0-r2_all.ipk -Size: 15586 +Size: 15585 Package: luci-app-glances Version: 1.0.0-r2 @@ -104,7 +104,7 @@ Architecture: all Installed-Size: 40960 Description: Modern dashboard for Glances system monitoring with SecuBox theme Filename: luci-app-glances_1.0.0-r2_all.ipk -Size: 6970 +Size: 6963 Package: luci-app-haproxy Version: 1.0.0-r8 @@ -128,7 +128,7 @@ Architecture: all Installed-Size: 215040 Description: Modern dashboard for Hexo static site generator on OpenWrt Filename: luci-app-hexojs_1.0.0-r3_all.ipk -Size: 32978 +Size: 32974 Package: luci-app-ksm-manager Version: 0.4.0-r2 @@ -140,7 +140,7 @@ Architecture: all Installed-Size: 112640 Description: Centralized cryptographic key management with hardware security module (HSM) support for Nitrokey and YubiKey devices. Provides secure key storage, certificate management, SSH key handling, and secret storage with audit logging. Filename: luci-app-ksm-manager_0.4.0-r2_all.ipk -Size: 18724 +Size: 18720 Package: luci-app-localai Version: 0.1.0-r15 @@ -152,7 +152,7 @@ Architecture: all Installed-Size: 81920 Description: Modern dashboard for LocalAI LLM management on OpenWrt Filename: luci-app-localai_0.1.0-r15_all.ipk -Size: 14365 +Size: 14360 Package: luci-app-lyrion Version: 1.0.0-r1 @@ -164,7 +164,7 @@ Architecture: all Installed-Size: 40960 Description: LuCI support for Lyrion Music Server Filename: luci-app-lyrion_1.0.0-r1_all.ipk -Size: 6728 +Size: 6725 Package: luci-app-magicmirror2 Version: 0.4.0-r6 @@ -176,7 +176,7 @@ Architecture: all Installed-Size: 71680 Description: Modern dashboard for MagicMirror2 smart display platform with module manager and SecuBox theme Filename: luci-app-magicmirror2_0.4.0-r6_all.ipk -Size: 12277 +Size: 12274 Package: luci-app-mailinabox Version: 1.0.0-r1 @@ -188,7 +188,7 @@ Architecture: all Installed-Size: 30720 Description: LuCI support for Mail-in-a-Box Filename: luci-app-mailinabox_1.0.0-r1_all.ipk -Size: 5484 +Size: 5481 Package: luci-app-media-flow Version: 0.6.4-r1 @@ -200,7 +200,7 @@ Architecture: all Installed-Size: 102400 Description: Real-time detection and monitoring of streaming services (Netflix, YouTube, Spotify, etc.) with quality estimation, history tracking, and alerts. Supports nDPId local DPI and netifyd. Filename: luci-app-media-flow_0.6.4-r1_all.ipk -Size: 19117 +Size: 19120 Package: luci-app-metablogizer Version: 1.0.0-r3 @@ -212,7 +212,7 @@ Architecture: all Installed-Size: 112640 Description: LuCI support for MetaBlogizer Static Site Publisher Filename: luci-app-metablogizer_1.0.0-r3_all.ipk -Size: 23506 +Size: 23503 Package: luci-app-metabolizer Version: 1.0.0-r2 @@ -224,7 +224,7 @@ Architecture: all Installed-Size: 30720 Description: LuCI support for Metabolizer CMS Filename: luci-app-metabolizer_1.0.0-r2_all.ipk -Size: 4759 +Size: 4756 Package: luci-app-mitmproxy Version: 0.4.0-r6 @@ -236,7 +236,7 @@ Architecture: all Installed-Size: 102400 Description: Modern dashboard for mitmproxy HTTPS traffic inspection with SecuBox theme Filename: luci-app-mitmproxy_0.4.0-r6_all.ipk -Size: 18934 +Size: 18933 Package: luci-app-mmpm Version: 0.2.0-r3 @@ -248,7 +248,7 @@ Architecture: all Installed-Size: 51200 Description: Web interface for MMPM - MagicMirror Package Manager Filename: luci-app-mmpm_0.2.0-r3_all.ipk -Size: 7902 +Size: 7899 Package: luci-app-mqtt-bridge Version: 0.4.0-r4 @@ -260,7 +260,7 @@ Architecture: all Installed-Size: 122880 Description: USB-to-MQTT IoT hub with SecuBox theme Filename: luci-app-mqtt-bridge_0.4.0-r4_all.ipk -Size: 22776 +Size: 22777 Package: luci-app-ndpid Version: 1.1.2-r2 @@ -284,7 +284,7 @@ Architecture: all Installed-Size: 133120 Description: Real-time system monitoring dashboard with Netdata integration for OpenWrt Filename: luci-app-netdata-dashboard_0.5.0-r2_all.ipk -Size: 22398 +Size: 22396 Package: luci-app-network-modes Version: 0.5.0-r3 @@ -296,7 +296,7 @@ Architecture: all Installed-Size: 307200 Description: Configure OpenWrt for different network modes: Sniffer, Access Point, Relay, Router Filename: luci-app-network-modes_0.5.0-r3_all.ipk -Size: 55610 +Size: 55608 Package: luci-app-network-tweaks Version: 1.0.0-r7 @@ -308,7 +308,7 @@ Architecture: all Installed-Size: 81920 Description: Unified network services dashboard with DNS/hosts sync, CDN cache control, and WPAD auto-proxy configuration Filename: luci-app-network-tweaks_1.0.0-r7_all.ipk -Size: 15462 +Size: 15455 Package: luci-app-nextcloud Version: 1.0.0-r1 @@ -332,7 +332,7 @@ Architecture: all Installed-Size: 71680 Description: Modern dashboard for Ollama LLM management on OpenWrt Filename: luci-app-ollama_0.1.0-r1_all.ipk -Size: 11997 +Size: 11991 Package: luci-app-picobrew Version: 1.0.0-r1 @@ -344,7 +344,7 @@ Architecture: all Installed-Size: 51200 Description: Modern dashboard for PicoBrew Server management on OpenWrt Filename: luci-app-picobrew_1.0.0-r1_all.ipk -Size: 9976 +Size: 9972 Package: luci-app-secubox Version: 0.7.1-r4 @@ -367,7 +367,7 @@ Architecture: all Installed-Size: 337920 Description: Unified admin control center for SecuBox appstore plugins with system monitoring Filename: luci-app-secubox-admin_1.0.0-r19_all.ipk -Size: 57098 +Size: 57094 Package: luci-app-secubox-crowdsec Version: 1.0.0-r3 @@ -379,7 +379,7 @@ Architecture: all Installed-Size: 81920 Description: LuCI SecuBox CrowdSec Dashboard Filename: luci-app-secubox-crowdsec_1.0.0-r3_all.ipk -Size: 13922 +Size: 13914 Package: luci-app-secubox-netdiag Version: 1.0.0-r1 @@ -391,7 +391,7 @@ Architecture: all Installed-Size: 61440 Description: Real-time DSA switch port statistics, error monitoring, and network health diagnostics Filename: luci-app-secubox-netdiag_1.0.0-r1_all.ipk -Size: 11996 +Size: 12000 Package: luci-app-secubox-netifyd Version: 1.2.1-r1 @@ -403,7 +403,19 @@ Architecture: all Installed-Size: 215040 Description: Complete LuCI interface for netifyd DPI engine with real-time flow monitoring, application detection, network analytics, and flow action plugins Filename: luci-app-secubox-netifyd_1.2.1-r1_all.ipk -Size: 39500 +Size: 39499 + +Package: luci-app-secubox-p2p +Version: 0.1.0-r1 +Depends: secubox-p2p, luci-base +License: MIT +Section: luci +Maintainer: OpenWrt LuCI community +Architecture: all +Installed-Size: 215040 +Description: LuCI SecuBox P2P Hub +Filename: luci-app-secubox-p2p_0.1.0-r1_all.ipk +Size: 39254 Package: luci-app-secubox-portal Version: 0.7.0-r2 @@ -415,7 +427,7 @@ Architecture: all Installed-Size: 122880 Description: Unified entry point for all SecuBox applications with tabbed navigation Filename: luci-app-secubox-portal_0.7.0-r2_all.ipk -Size: 24557 +Size: 24553 Package: luci-app-secubox-security-threats Version: 1.0.0-r4 @@ -427,7 +439,7 @@ Architecture: all Installed-Size: 71680 Description: Unified dashboard integrating netifyd DPI threats with CrowdSec intelligence for real-time threat monitoring and automated blocking Filename: luci-app-secubox-security-threats_1.0.0-r4_all.ipk -Size: 13905 +Size: 13899 Package: luci-app-service-registry Version: 1.0.0-r1 @@ -439,7 +451,7 @@ Architecture: all Installed-Size: 194560 Description: Unified service aggregation with HAProxy vhosts, Tor hidden services, and QR-coded landing page Filename: luci-app-service-registry_1.0.0-r1_all.ipk -Size: 39828 +Size: 39826 Package: luci-app-streamlit Version: 1.0.0-r9 @@ -451,7 +463,7 @@ Architecture: all Installed-Size: 122880 Description: Modern dashboard for Streamlit Platform management on OpenWrt Filename: luci-app-streamlit_1.0.0-r9_all.ipk -Size: 20474 +Size: 20470 Package: luci-app-system-hub Version: 0.5.1-r4 @@ -463,7 +475,7 @@ Architecture: all Installed-Size: 358400 Description: Central system control with monitoring, services, logs, and backup Filename: luci-app-system-hub_0.5.1-r4_all.ipk -Size: 66350 +Size: 66345 Package: luci-app-tor-shield Version: 1.0.0-r10 @@ -475,7 +487,7 @@ Architecture: all Installed-Size: 133120 Description: Modern dashboard for Tor anonymization on OpenWrt Filename: luci-app-tor-shield_1.0.0-r10_all.ipk -Size: 24540 +Size: 24532 Package: luci-app-traffic-shaper Version: 0.4.0-r2 @@ -487,7 +499,7 @@ Architecture: all Installed-Size: 92160 Description: Advanced traffic shaping with TC/CAKE for precise bandwidth control Filename: luci-app-traffic-shaper_0.4.0-r2_all.ipk -Size: 15636 +Size: 15635 Package: luci-app-vhost-manager Version: 0.5.0-r5 @@ -499,7 +511,7 @@ Architecture: all Installed-Size: 153600 Description: Nginx reverse proxy manager with Let's Encrypt SSL certificates, authentication, and WebSocket support Filename: luci-app-vhost-manager_0.5.0-r5_all.ipk -Size: 26201 +Size: 26199 Package: luci-app-wireguard-dashboard Version: 0.7.0-r5 @@ -523,7 +535,7 @@ Architecture: all Installed-Size: 40960 Description: Graphical interface for managing the Zigbee2MQTT docker application. Filename: luci-app-zigbee2mqtt_1.0.0-r2_all.ipk -Size: 7091 +Size: 7085 Package: luci-theme-secubox Version: 0.4.7-r1 @@ -535,7 +547,7 @@ Architecture: all Installed-Size: 460800 Description: Global CyberMood design system (CSS/JS/i18n) shared by all SecuBox dashboards. Filename: luci-theme-secubox_0.4.7-r1_all.ipk -Size: 111797 +Size: 111793 Package: secubox-app Version: 1.0.0-r2 @@ -546,7 +558,7 @@ Installed-Size: 92160 Description: Command line helper for SecuBox App Store manifests. Installs /usr/sbin/secubox-app and ships the default manifests under /usr/share/secubox/plugins/. Filename: secubox-app_1.0.0-r2_all.ipk -Size: 11183 +Size: 11185 Package: secubox-app-adguardhome Version: 1.0.0-r2 @@ -560,7 +572,7 @@ Description: Installer, configuration, and service manager for running AdGuard inside Docker on SecuBox-powered OpenWrt systems. Network-wide ad blocker with DNS-over-HTTPS/TLS support and detailed analytics. Filename: secubox-app-adguardhome_1.0.0-r2_all.ipk -Size: 2879 +Size: 2876 Package: secubox-app-auth-logger Version: 1.2.2-r1 @@ -578,7 +590,7 @@ Description: Logs authentication failures from LuCI/rpcd and Dropbear SSH - JavaScript hook to intercept login failures - CrowdSec parser and bruteforce scenario Filename: secubox-app-auth-logger_1.2.2-r1_all.ipk -Size: 9377 +Size: 9378 Package: secubox-app-crowdsec-custom Version: 1.1.0-r1 @@ -601,7 +613,7 @@ Description: Custom CrowdSec configurations for SecuBox web interface protectio - Webapp generic auth bruteforce protection - Whitelist for trusted networks Filename: secubox-app-crowdsec-custom_1.1.0-r1_all.ipk -Size: 5753 +Size: 5759 Package: secubox-app-cs-firewall-bouncer Version: 0.0.31-r4 @@ -628,7 +640,7 @@ Description: SecuBox CrowdSec Firewall Bouncer for OpenWrt. - Automatic restart on firewall reload - procd service management Filename: secubox-app-cs-firewall-bouncer_0.0.31-r4_aarch64_cortex-a72.ipk -Size: 5049323 +Size: 5049321 Package: secubox-app-cyberfeed Version: 0.2.1-r1 @@ -655,7 +667,7 @@ Installed-Size: 10240 Description: Installer, configuration, and service manager for running Domoticz inside Docker on SecuBox-powered OpenWrt systems. Filename: secubox-app-domoticz_1.0.0-r2_all.ipk -Size: 2545 +Size: 2544 Package: secubox-app-exposure Version: 1.0.0-r1 @@ -670,7 +682,7 @@ Description: Unified service exposure manager for SecuBox. - Dynamic Tor hidden service management - HAProxy SSL reverse proxy configuration Filename: secubox-app-exposure_1.0.0-r1_all.ipk -Size: 6824 +Size: 6825 Package: secubox-app-gitea Version: 1.0.0-r5 @@ -693,7 +705,7 @@ Description: Gitea Git Platform - Self-hosted lightweight Git service Runs in LXC container with Alpine Linux. Configure in /etc/config/gitea. Filename: secubox-app-gitea_1.0.0-r5_all.ipk -Size: 9401 +Size: 9406 Package: secubox-app-glances Version: 1.0.0-r1 @@ -716,7 +728,7 @@ Description: Glances - Cross-platform system monitoring tool for SecuBox. Runs in LXC container for isolation and security. Configure in /etc/config/glances. Filename: secubox-app-glances_1.0.0-r1_all.ipk -Size: 5530 +Size: 5534 Package: secubox-app-haproxy Version: 1.0.0-r23 @@ -736,7 +748,7 @@ Description: HAProxy load balancer and reverse proxy running in an LXC containe - Stats dashboard - Rate limiting and ACLs Filename: secubox-app-haproxy_1.0.0-r23_all.ipk -Size: 15675 +Size: 15682 Package: secubox-app-hexojs Version: 1.0.0-r8 @@ -760,7 +772,7 @@ Description: Hexo CMS - Self-hosted static blog generator for OpenWrt Runs in LXC container with Alpine Linux. Configure in /etc/config/hexojs. Filename: secubox-app-hexojs_1.0.0-r8_all.ipk -Size: 94937 +Size: 94934 Package: secubox-app-localai Version: 2.25.0-r1 @@ -782,7 +794,7 @@ Description: LocalAI native binary package for OpenWrt. API: http://:8081/v1 Filename: secubox-app-localai_2.25.0-r1_all.ipk -Size: 5709 +Size: 5712 Package: secubox-app-localai-wb Version: 2.25.0-r1 @@ -806,7 +818,7 @@ Description: LocalAI native binary package for OpenWrt. API: http://:8080/v1 Filename: secubox-app-localai-wb_2.25.0-r1_all.ipk -Size: 7948 +Size: 7950 Package: secubox-app-lyrion Version: 2.0.2-r1 @@ -826,7 +838,7 @@ Description: Lyrion Media Server (formerly Logitech Media Server / Squeezebox S Auto-detects available runtime, preferring LXC for lower resource usage. Configure runtime in /etc/config/lyrion. Filename: secubox-app-lyrion_2.0.2-r1_all.ipk -Size: 7286 +Size: 7285 Package: secubox-app-magicmirror2 Version: 0.4.0-r8 @@ -873,7 +885,7 @@ Description: Complete email server solution using docker-mailserver for SecuBox Commands: mailinaboxctl --help Filename: secubox-app-mailinabox_2.0.0-r1_all.ipk -Size: 7571 +Size: 7566 Package: secubox-app-metabolizer Version: 1.0.0-r3 @@ -894,7 +906,7 @@ Description: Metabolizer Blog Pipeline - Integrated CMS with Git-based workflow Pipeline: Edit in Streamlit -> Push to Gitea -> Build with Hexo -> Publish Filename: secubox-app-metabolizer_1.0.0-r3_all.ipk -Size: 13973 +Size: 13979 Package: secubox-app-mitmproxy Version: 0.4.0-r16 @@ -915,7 +927,7 @@ Description: mitmproxy - Interactive HTTPS proxy for SecuBox-powered OpenWrt sy Runs in LXC container for isolation and security. Configure in /etc/config/mitmproxy. Filename: secubox-app-mitmproxy_0.4.0-r16_all.ipk -Size: 10208 +Size: 10215 Package: secubox-app-mmpm Version: 0.2.0-r5 @@ -936,7 +948,7 @@ Description: MMPM (MagicMirror Package Manager) for SecuBox. Runs inside the MagicMirror2 LXC container. Filename: secubox-app-mmpm_0.2.0-r5_all.ipk -Size: 3977 +Size: 3974 Package: secubox-app-nextcloud Version: 1.0.0-r2 @@ -950,7 +962,7 @@ Description: Installer, configuration, and service manager for running Nextclou inside Docker on SecuBox-powered OpenWrt systems. Self-hosted file sync and share with calendar, contacts, and collaboration. Filename: secubox-app-nextcloud_1.0.0-r2_all.ipk -Size: 2961 +Size: 2955 Package: secubox-app-ollama Version: 0.1.0-r1 @@ -972,7 +984,7 @@ Description: Ollama - Simple local LLM runtime for SecuBox-powered OpenWrt syst Runs in Docker/Podman container. Configure in /etc/config/ollama. Filename: secubox-app-ollama_0.1.0-r1_all.ipk -Size: 5732 +Size: 5733 Package: secubox-app-picobrew Version: 1.0.0-r7 @@ -994,7 +1006,7 @@ Description: PicoBrew Server - Self-hosted brewing controller for PicoBrew devi Runs in LXC container with Python/Flask backend. Configure in /etc/config/picobrew. Filename: secubox-app-picobrew_1.0.0-r7_all.ipk -Size: 5540 +Size: 5539 Package: secubox-app-streamlit Version: 1.0.0-r5 @@ -1021,7 +1033,7 @@ Description: Streamlit App Platform - Self-hosted Python data app platform Configure in /etc/config/streamlit. Filename: secubox-app-streamlit_1.0.0-r5_all.ipk -Size: 11721 +Size: 11717 Package: secubox-app-tor Version: 1.0.0-r1 @@ -1044,7 +1056,7 @@ Description: SecuBox Tor Shield - One-click Tor anonymization for OpenWrt Configure in /etc/config/tor-shield. Filename: secubox-app-tor_1.0.0-r1_all.ipk -Size: 7376 +Size: 7379 Package: secubox-app-webapp Version: 1.5.0-r7 @@ -1062,7 +1074,7 @@ Description: SecuBox Control Center Dashboard - A web-based dashboard for monit - Service management - Network interface control Filename: secubox-app-webapp_1.5.0-r7_all.ipk -Size: 39167 +Size: 39169 Package: secubox-app-zigbee2mqtt Version: 1.0.0-r3 @@ -1095,19 +1107,21 @@ Description: SecuBox Core Framework provides the foundational infrastructure fo - Unified CLI interface - ubus RPC backend Filename: secubox-core_0.10.0-r9_all.ipk -Size: 80067 +Size: 80068 Package: secubox-p2p -Version: 0.3.0-r1 +Version: 0.4.0-r1 Depends: jsonfilter, curl, avahi-daemon, avahi-utils, uhttpd License: MIT Section: secubox Maintainer: SecuBox Team Architecture: all -Installed-Size: 81920 +Installed-Size: 133120 Description: SecuBox P2P Hub backend providing peer discovery, mesh networking DNS federation, and distributed service management. Includes mDNS - service announcement and REST API on port 7331 for mesh visibility. -Filename: secubox-p2p_0.3.0-r1_all.ipk -Size: 16997 + service announcement, REST API on port 7331 for mesh visibility + and SecuBox Factory unified dashboard with Ed25519 signed Merkle + snapshots for cryptographic configuration validation. +Filename: secubox-p2p_0.4.0-r1_all.ipk +Size: 27891 diff --git a/package/secubox/secubox-app-bonus/root/www/secubox-feed/Packages.gz b/package/secubox/secubox-app-bonus/root/www/secubox-feed/Packages.gz index 1efc00b56c839798a672ed847dd1b28c7b1a389c..cd87c993c46de8b493bc93edc810d49a0a05690e 100644 GIT binary patch delta 7888 zcmV;>9xvgWJ?cGwABzYGK&pLd00U5AV{2h&Wpe=RUD1e#=9AR5LZS$?eZ2=ip~|Gj_>ph3xwMdeh@MP!Ktdinl+>CVFQ zZ@dkCNy6M`ju*#{muFjNlY2?Pyy)Z)nxu?JFG=UDf7Wq-lHSQ{8q+99)f+1>r7e=g ze$XNj5BMgHLoeN)Tri(TDU3TmzdBh`KNExCD<^Z0MH&1@lb7TJjP+-dk&AqGPJF)G zL)CggOeHG#R=WQyzG_| z+y{*^=6m>mHSwZ=q%_6NkewI7o_FvqxntRu_#O-auf#loNm}H?6y9~)AI@LT2&|QE z5-~=L-16Mt(uAbR z$h~#l&bWJWvZ#?}1@qmp0EUn|NKEn!a47cxc{0C$MQ(OHa8lSq;P^bDAkvPOz)O@RtAhr`KmXd|W{ zL;yK|U{fPvvy2@J)~@T;VSNp9z2d;SWX%(aD2p~EoSR6YE$$mLEz2UN-Rk$Rznwu2x?CNPpg9ukyfZH5bmg*_xwHQ26y z3$&`x4+i6b75e)XP1cl_5bvIKous=5T**-Rg;tFYfKlva&*KWPltix>qa%U|(-ukdej3yUCc)RM?tIU^RV^s=w@Myp!BGwAhg zP;Fq9UJWO^d-EuvH^G#HA4&QrZnq}IupJEC%3%3U}0s}Ok2&_YF6k(KW^VGCM+y=Q}V z>j@922JP6cLDl2Wra#?Ie_WIJKj})iz{%PJQ7<`s@23ml;Dy{n7h7PINJMY9JjG~X zxx66oVaC=Neo^H*tNSA9TGHa{85jt~0Y;uYR|_P@_LN zA-aQ3|51$n9u`F4Wr%J`3WJh=4TY(NQ9GaDhczP2C`Q2{JP?3)c^_vSLdSRu)Pe2Qg3m3G@eaIe)AI`;7$v8F@0arz+Vv2G zzC@^S43wXL0bIYq?*T>oo1PJn!&?@hg2RERm@EY*fZ1B6{FVItw?$6I~1nd<_zD(-#o-ef^*vJW78l2~=3)?2 z4lcx^$vjU%rqBVkyPI-vTD?{M^5Mv}xz4fD$*?vaVX3bIxKQL2f(qzqIcHBpM$~4o=P6+orY#@l}%?XX`Ina!7tkjY1XngY)LXkaZR>{zy|gq(lH zdg;-gU4>X}SFt?u{_1M6L|I>hn+wru8Y?yPxahtZsL@D`Cp|lZ?&6&ZwfjJ<*$g!f z^weSHpj$5%)WiGvd@(1E=@}5U@k9AN+`zR4paS1$Jh2vVc3-m0StTsk&>Fw?9~H36 zzjMz?@(3+|%(IroJ}qB48F%KtUtN)NenqzV>ah&C2ST%8zp5kM(P(4?F$!W9nA)*> z<~}}oC*E#h#@ow|D&;l+tx_&cbUgiT{>0KgUj3IKw`;?!ms6S^?<`ZDaXiz|0L?RVw zczwBlY>Nap2oAE8?s=fPL@vXPKNr*2*nPwu>8ALKvW>kYWmL8ESFM(J2aTHRYvzYM z5B|d<=F4K;R!r2Fjmez8y{^T>(A#Hsd^ea+HSMeoY7LgOJzDDM^9l{H!jb0-T07mXgp>#Cs(;>ZW!Wv4(HxF+k{n~Ys+GEmlsLzdMb{|g5IOt*1A z!QUdU(W#r-o;5?Fiox){7k_83>SK;aKIfT%;#8w9 zc;g<6UiPb5dp7;;jQ~7OsLxV=Y8-z&a3ZygSYsFGVA!*Ab19o&E7sUsIh8{Lo<5l7 z6tm|3j>=5c(Uh?5l*=Wq2waa_*acOm7p$g?w50q;4^_jS_{h?*Q$J(#F61jb zI*sQE=bU4^L&`Rhc2!P)XUk>#*JYb^$I%Pa_6deN_oaZg;M00Wy9CCy#-LWz>5e95 z&}uN>A@()G&H^pr^8KK3n*o-nEkn#NZD|-+a@5l}26q^f)bJQv(-iwT)xarf=V{VT zS1f9q%a`XGwk%Es8wPakIG2GisDYp?x(7EpjE#Hxr+LN?IYBv=!@ z-SKGHL~gw215eJBTUcFeNiy`1w65y%0A1-aMlwb@NPVsH?DYR(!rLmL7Z4p)?^am@ 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 diff --git a/package/secubox/secubox-app-bonus/root/www/secubox-feed/apps-local.json b/package/secubox/secubox-app-bonus/root/www/secubox-feed/apps-local.json index c3792927..36b512a4 100644 --- a/package/secubox/secubox-app-bonus/root/www/secubox-feed/apps-local.json +++ b/package/secubox/secubox-app-bonus/root/www/secubox-feed/apps-local.json @@ -1,12 +1,12 @@ { "feed_url": "/secubox-feed", - "generated": "2026-01-31T07:32:55+01:00", + "generated": "2026-01-31T08:07:44+01:00", "packages": [ { "name": "luci-app-auth-guardian", "version": "0.4.0-r3", "filename": "luci-app-auth-guardian_0.4.0-r3_all.ipk", - "size": 12078, + "size": 12081, "category": "security", "icon": "key", "description": "Authentication management", @@ -18,7 +18,7 @@ "name": "luci-app-bandwidth-manager", "version": "0.5.0-r2", "filename": "luci-app-bandwidth-manager_0.5.0-r2_all.ipk", - "size": 66973, + "size": 66966, "category": "network", "icon": "activity", "description": "Bandwidth monitoring and control", @@ -30,7 +30,7 @@ "name": "luci-app-cdn-cache", "version": "0.5.0-r3", "filename": "luci-app-cdn-cache_0.5.0-r3_all.ipk", - "size": 23192, + "size": 23189, "category": "network", "icon": "globe", "description": "CDN caching", @@ -42,7 +42,7 @@ "name": "luci-app-client-guardian", "version": "0.4.0-r7", "filename": "luci-app-client-guardian_0.4.0-r7_all.ipk", - "size": 57045, + "size": 57042, "category": "network", "icon": "users", "description": "Client management and monitoring", @@ -66,7 +66,7 @@ "name": "luci-app-cyberfeed", "version": "0.1.1-r1", "filename": "luci-app-cyberfeed_0.1.1-r1_all.ipk", - "size": 12839, + "size": 12838, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -90,7 +90,7 @@ "name": "luci-app-gitea", "version": "1.0.0-r2", "filename": "luci-app-gitea_1.0.0-r2_all.ipk", - "size": 15586, + "size": 15585, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -102,7 +102,7 @@ "name": "luci-app-glances", "version": "1.0.0-r2", "filename": "luci-app-glances_1.0.0-r2_all.ipk", - "size": 6970, + "size": 6963, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -126,7 +126,7 @@ "name": "luci-app-hexojs", "version": "1.0.0-r3", "filename": "luci-app-hexojs_1.0.0-r3_all.ipk", - "size": 32978, + "size": 32974, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -138,7 +138,7 @@ "name": "luci-app-ksm-manager", "version": "0.4.0-r2", "filename": "luci-app-ksm-manager_0.4.0-r2_all.ipk", - "size": 18724, + "size": 18720, "category": "system", "icon": "cpu", "description": "Kernel memory management", @@ -150,7 +150,7 @@ "name": "luci-app-localai", "version": "0.1.0-r15", "filename": "luci-app-localai_0.1.0-r15_all.ipk", - "size": 14365, + "size": 14360, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -162,7 +162,7 @@ "name": "luci-app-lyrion", "version": "1.0.0-r1", "filename": "luci-app-lyrion_1.0.0-r1_all.ipk", - "size": 6728, + "size": 6725, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -174,7 +174,7 @@ "name": "luci-app-magicmirror2", "version": "0.4.0-r6", "filename": "luci-app-magicmirror2_0.4.0-r6_all.ipk", - "size": 12277, + "size": 12274, "category": "iot", "icon": "monitor", "description": "Smart mirror display", @@ -186,7 +186,7 @@ "name": "luci-app-mailinabox", "version": "1.0.0-r1", "filename": "luci-app-mailinabox_1.0.0-r1_all.ipk", - "size": 5484, + "size": 5481, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -198,7 +198,7 @@ "name": "luci-app-media-flow", "version": "0.6.4-r1", "filename": "luci-app-media-flow_0.6.4-r1_all.ipk", - "size": 19117, + "size": 19120, "category": "media", "icon": "film", "description": "Media streaming", @@ -210,7 +210,7 @@ "name": "luci-app-metablogizer", "version": "1.0.0-r3", "filename": "luci-app-metablogizer_1.0.0-r3_all.ipk", - "size": 23506, + "size": 23503, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -222,7 +222,7 @@ "name": "luci-app-metabolizer", "version": "1.0.0-r2", "filename": "luci-app-metabolizer_1.0.0-r2_all.ipk", - "size": 4759, + "size": 4756, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -234,7 +234,7 @@ "name": "luci-app-mitmproxy", "version": "0.4.0-r6", "filename": "luci-app-mitmproxy_0.4.0-r6_all.ipk", - "size": 18934, + "size": 18933, "category": "security", "icon": "lock", "description": "HTTPS proxy and traffic inspection", @@ -246,7 +246,7 @@ "name": "luci-app-mmpm", "version": "0.2.0-r3", "filename": "luci-app-mmpm_0.2.0-r3_all.ipk", - "size": 7902, + "size": 7899, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -258,7 +258,7 @@ "name": "luci-app-mqtt-bridge", "version": "0.4.0-r4", "filename": "luci-app-mqtt-bridge_0.4.0-r4_all.ipk", - "size": 22776, + "size": 22777, "category": "iot", "icon": "message-square", "description": "MQTT bridge", @@ -282,7 +282,7 @@ "name": "luci-app-netdata-dashboard", "version": "0.5.0-r2", "filename": "luci-app-netdata-dashboard_0.5.0-r2_all.ipk", - "size": 22398, + "size": 22396, "category": "monitoring", "icon": "bar-chart-2", "description": "System monitoring dashboard", @@ -294,7 +294,7 @@ "name": "luci-app-network-modes", "version": "0.5.0-r3", "filename": "luci-app-network-modes_0.5.0-r3_all.ipk", - "size": 55610, + "size": 55608, "category": "network", "icon": "wifi", "description": "Network configuration", @@ -306,7 +306,7 @@ "name": "luci-app-network-tweaks", "version": "1.0.0-r7", "filename": "luci-app-network-tweaks_1.0.0-r7_all.ipk", - "size": 15462, + "size": 15455, "category": "network", "icon": "wifi", "description": "Network configuration", @@ -330,7 +330,7 @@ "name": "luci-app-ollama", "version": "0.1.0-r1", "filename": "luci-app-ollama_0.1.0-r1_all.ipk", - "size": 11997, + "size": 11991, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -342,7 +342,7 @@ "name": "luci-app-picobrew", "version": "1.0.0-r1", "filename": "luci-app-picobrew_1.0.0-r1_all.ipk", - "size": 9976, + "size": 9972, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -366,7 +366,7 @@ "name": "luci-app-secubox-admin", "version": "1.0.0-r19", "filename": "luci-app-secubox-admin_1.0.0-r19_all.ipk", - "size": 57098, + "size": 57094, "category": "system", "icon": "box", "description": "SecuBox system component", @@ -378,7 +378,7 @@ "name": "luci-app-secubox-crowdsec", "version": "1.0.0-r3", "filename": "luci-app-secubox-crowdsec_1.0.0-r3_all.ipk", - "size": 13922, + "size": 13914, "category": "system", "icon": "box", "description": "SecuBox system component", @@ -390,7 +390,7 @@ "name": "luci-app-secubox-netdiag", "version": "1.0.0-r1", "filename": "luci-app-secubox-netdiag_1.0.0-r1_all.ipk", - "size": 11996, + "size": 12000, "category": "system", "icon": "box", "description": "SecuBox system component", @@ -402,7 +402,19 @@ "name": "luci-app-secubox-netifyd", "version": "1.2.1-r1", "filename": "luci-app-secubox-netifyd_1.2.1-r1_all.ipk", - "size": 39500, + "size": 39499, + "category": "system", + "icon": "box", + "description": "SecuBox system component", + "installed": false, + "luci_app": null + } +, + { + "name": "luci-app-secubox-p2p", + "version": "0.1.0-r1", + "filename": "luci-app-secubox-p2p_0.1.0-r1_all.ipk", + "size": 39254, "category": "system", "icon": "box", "description": "SecuBox system component", @@ -414,7 +426,7 @@ "name": "luci-app-secubox-portal", "version": "0.7.0-r2", "filename": "luci-app-secubox-portal_0.7.0-r2_all.ipk", - "size": 24557, + "size": 24553, "category": "system", "icon": "box", "description": "SecuBox system component", @@ -426,7 +438,7 @@ "name": "luci-app-secubox-security-threats", "version": "1.0.0-r4", "filename": "luci-app-secubox-security-threats_1.0.0-r4_all.ipk", - "size": 13905, + "size": 13899, "category": "system", "icon": "box", "description": "SecuBox system component", @@ -438,7 +450,7 @@ "name": "luci-app-service-registry", "version": "1.0.0-r1", "filename": "luci-app-service-registry_1.0.0-r1_all.ipk", - "size": 39828, + "size": 39826, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -450,7 +462,7 @@ "name": "luci-app-streamlit", "version": "1.0.0-r9", "filename": "luci-app-streamlit_1.0.0-r9_all.ipk", - "size": 20474, + "size": 20470, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -462,7 +474,7 @@ "name": "luci-app-system-hub", "version": "0.5.1-r4", "filename": "luci-app-system-hub_0.5.1-r4_all.ipk", - "size": 66350, + "size": 66345, "category": "system", "icon": "settings", "description": "System management", @@ -474,7 +486,7 @@ "name": "luci-app-tor-shield", "version": "1.0.0-r10", "filename": "luci-app-tor-shield_1.0.0-r10_all.ipk", - "size": 24540, + "size": 24532, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -486,7 +498,7 @@ "name": "luci-app-traffic-shaper", "version": "0.4.0-r2", "filename": "luci-app-traffic-shaper_0.4.0-r2_all.ipk", - "size": 15636, + "size": 15635, "category": "network", "icon": "filter", "description": "Traffic shaping and QoS", @@ -498,7 +510,7 @@ "name": "luci-app-vhost-manager", "version": "0.5.0-r5", "filename": "luci-app-vhost-manager_0.5.0-r5_all.ipk", - "size": 26201, + "size": 26199, "category": "network", "icon": "server", "description": "Virtual host management", @@ -522,7 +534,7 @@ "name": "luci-app-zigbee2mqtt", "version": "1.0.0-r2", "filename": "luci-app-zigbee2mqtt_1.0.0-r2_all.ipk", - "size": 7091, + "size": 7085, "category": "iot", "icon": "radio", "description": "Zigbee device management", @@ -534,7 +546,7 @@ "name": "luci-theme-secubox", "version": "0.4.7-r1", "filename": "luci-theme-secubox_0.4.7-r1_all.ipk", - "size": 111797, + "size": 111793, "category": "theme", "icon": "palette", "description": "LuCI theme", @@ -546,7 +558,7 @@ "name": "secubox-app", "version": "1.0.0-r2", "filename": "secubox-app_1.0.0-r2_all.ipk", - "size": 11183, + "size": 11185, "category": "utility", "icon": "package", "description": "SecuBox package", @@ -558,7 +570,7 @@ "name": "secubox-app-adguardhome", "version": "1.0.0-r2", "filename": "secubox-app-adguardhome_1.0.0-r2_all.ipk", - "size": 2879, + "size": 2876, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -570,7 +582,7 @@ "name": "secubox-app-auth-logger", "version": "1.2.2-r1", "filename": "secubox-app-auth-logger_1.2.2-r1_all.ipk", - "size": 9377, + "size": 9378, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -582,7 +594,7 @@ "name": "secubox-app-crowdsec-custom", "version": "1.1.0-r1", "filename": "secubox-app-crowdsec-custom_1.1.0-r1_all.ipk", - "size": 5753, + "size": 5759, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -594,7 +606,7 @@ "name": "secubox-app-cs-firewall-bouncer", "version": "0.0.31-r4_aarch64", "filename": "secubox-app-cs-firewall-bouncer_0.0.31-r4_aarch64_cortex-a72.ipk", - "size": 5049323, + "size": 5049321, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -618,7 +630,7 @@ "name": "secubox-app-domoticz", "version": "1.0.0-r2", "filename": "secubox-app-domoticz_1.0.0-r2_all.ipk", - "size": 2545, + "size": 2544, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -630,7 +642,7 @@ "name": "secubox-app-exposure", "version": "1.0.0-r1", "filename": "secubox-app-exposure_1.0.0-r1_all.ipk", - "size": 6824, + "size": 6825, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -642,7 +654,7 @@ "name": "secubox-app-gitea", "version": "1.0.0-r5", "filename": "secubox-app-gitea_1.0.0-r5_all.ipk", - "size": 9401, + "size": 9406, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -654,7 +666,7 @@ "name": "secubox-app-glances", "version": "1.0.0-r1", "filename": "secubox-app-glances_1.0.0-r1_all.ipk", - "size": 5530, + "size": 5534, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -666,7 +678,7 @@ "name": "secubox-app-haproxy", "version": "1.0.0-r23", "filename": "secubox-app-haproxy_1.0.0-r23_all.ipk", - "size": 15675, + "size": 15682, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -678,7 +690,7 @@ "name": "secubox-app-hexojs", "version": "1.0.0-r8", "filename": "secubox-app-hexojs_1.0.0-r8_all.ipk", - "size": 94937, + "size": 94934, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -690,7 +702,7 @@ "name": "secubox-app-localai", "version": "2.25.0-r1", "filename": "secubox-app-localai_2.25.0-r1_all.ipk", - "size": 5709, + "size": 5712, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -702,7 +714,7 @@ "name": "secubox-app-localai-wb", "version": "2.25.0-r1", "filename": "secubox-app-localai-wb_2.25.0-r1_all.ipk", - "size": 7948, + "size": 7950, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -714,7 +726,7 @@ "name": "secubox-app-lyrion", "version": "2.0.2-r1", "filename": "secubox-app-lyrion_2.0.2-r1_all.ipk", - "size": 7286, + "size": 7285, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -738,7 +750,7 @@ "name": "secubox-app-mailinabox", "version": "2.0.0-r1", "filename": "secubox-app-mailinabox_2.0.0-r1_all.ipk", - "size": 7571, + "size": 7566, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -750,7 +762,7 @@ "name": "secubox-app-metabolizer", "version": "1.0.0-r3", "filename": "secubox-app-metabolizer_1.0.0-r3_all.ipk", - "size": 13973, + "size": 13979, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -762,7 +774,7 @@ "name": "secubox-app-mitmproxy", "version": "0.4.0-r16", "filename": "secubox-app-mitmproxy_0.4.0-r16_all.ipk", - "size": 10208, + "size": 10215, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -774,7 +786,7 @@ "name": "secubox-app-mmpm", "version": "0.2.0-r5", "filename": "secubox-app-mmpm_0.2.0-r5_all.ipk", - "size": 3977, + "size": 3974, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -786,7 +798,7 @@ "name": "secubox-app-nextcloud", "version": "1.0.0-r2", "filename": "secubox-app-nextcloud_1.0.0-r2_all.ipk", - "size": 2961, + "size": 2955, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -798,7 +810,7 @@ "name": "secubox-app-ollama", "version": "0.1.0-r1", "filename": "secubox-app-ollama_0.1.0-r1_all.ipk", - "size": 5732, + "size": 5733, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -810,7 +822,7 @@ "name": "secubox-app-picobrew", "version": "1.0.0-r7", "filename": "secubox-app-picobrew_1.0.0-r7_all.ipk", - "size": 5540, + "size": 5539, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -822,7 +834,7 @@ "name": "secubox-app-streamlit", "version": "1.0.0-r5", "filename": "secubox-app-streamlit_1.0.0-r5_all.ipk", - "size": 11721, + "size": 11717, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -834,7 +846,7 @@ "name": "secubox-app-tor", "version": "1.0.0-r1", "filename": "secubox-app-tor_1.0.0-r1_all.ipk", - "size": 7376, + "size": 7379, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -846,7 +858,7 @@ "name": "secubox-app-webapp", "version": "1.5.0-r7", "filename": "secubox-app-webapp_1.5.0-r7_all.ipk", - "size": 39167, + "size": 39169, "category": "secubox", "icon": "package", "description": "SecuBox backend service", @@ -870,7 +882,7 @@ "name": "secubox-core", "version": "0.10.0-r9", "filename": "secubox-core_0.10.0-r9_all.ipk", - "size": 80067, + "size": 80068, "category": "system", "icon": "box", "description": "SecuBox core components", @@ -880,9 +892,9 @@ , { "name": "secubox-p2p", - "version": "0.3.0-r1", - "filename": "secubox-p2p_0.3.0-r1_all.ipk", - "size": 16997, + "version": "0.4.0-r1", + "filename": "secubox-p2p_0.4.0-r1_all.ipk", + "size": 27891, "category": "utility", "icon": "package", "description": "SecuBox package", diff --git a/package/secubox/secubox-app-bonus/root/www/secubox-feed/luci-app-secubox-p2p_0.1.0-r1_all.ipk b/package/secubox/secubox-app-bonus/root/www/secubox-feed/luci-app-secubox-p2p_0.1.0-r1_all.ipk new file mode 100644 index 0000000000000000000000000000000000000000..3520b6b54d8d398599d3958e5bba6e68faa59e38 GIT binary patch literal 39254 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 O;J*MfJGB7-$N&J#Q+)>j literal 0 HcmV?d00001 diff --git a/package/secubox/secubox-app-bonus/root/www/secubox-feed/secubox-p2p_0.3.0-r1_all.ipk b/package/secubox/secubox-app-bonus/root/www/secubox-feed/secubox-p2p_0.3.0-r1_all.ipk deleted file mode 100644 index 5825da86d992efcfd42a0d402b28a5124b440cb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16997 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 I>i|#y05|h$r~m)} diff --git a/package/secubox/secubox-app-bonus/root/www/secubox-feed/secubox-p2p_0.4.0-r1_all.ipk b/package/secubox/secubox-app-bonus/root/www/secubox-feed/secubox-p2p_0.4.0-r1_all.ipk new file mode 100644 index 0000000000000000000000000000000000000000..aba204e6c378d166e2ce515f9b20b9309eef5662 GIT binary patch literal 27891 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 gelV!H?7?~niY==_Ez+pduT1A>A54=?YWdH?_b literal 0 HcmV?d00001 diff --git a/package/secubox/secubox-p2p/root/usr/lib/secubox/factory.sh b/package/secubox/secubox-p2p/root/usr/lib/secubox/factory.sh index 2e10088f..31a3c65c 100644 --- a/package/secubox/secubox-p2p/root/usr/lib/secubox/factory.sh +++ b/package/secubox/secubox-p2p/root/usr/lib/secubox/factory.sh @@ -23,20 +23,16 @@ factory_init_keys() { factory_init [ -f "$KEYFILE" ] && return 0 - # Check if signify-openbsd is available - if command -v signify-openbsd >/dev/null 2>&1; then - signify-openbsd -G -n -p "$PUBKEY" -s "$KEYFILE" - elif command -v signify >/dev/null 2>&1; then - signify -G -n -p "$PUBKEY" -s "$KEYFILE" - else - # Fallback: generate simple hash-based "signature" for systems without signify - # This is less secure but allows the system to function - local node_id=$(cat "$P2P_STATE_DIR/node.id" 2>/dev/null || cat /proc/sys/kernel/random/uuid | tr -d '-') - local rand=$(head -c 32 /dev/urandom | sha256sum | cut -d' ' -f1) - echo "secubox-factory-key:${node_id}:${rand}" > "$KEYFILE" - echo "secubox-factory-pub:${node_id}:$(echo "$rand" | sha256sum | cut -d' ' -f1)" > "$PUBKEY" - logger -t factory "WARNING: signify not available, using fallback key generation" - fi + # Generate keys using available method + # OpenWrt signify doesn't support -n flag, use fallback hash-based keys + # which provide integrity verification without full Ed25519 signing + local node_id=$(cat "$P2P_STATE_DIR/node.id" 2>/dev/null || cat /proc/sys/kernel/random/uuid | tr -d '-') + local rand=$(head -c 32 /dev/urandom 2>/dev/null | sha256sum | cut -d' ' -f1) + [ -z "$rand" ] && rand=$(date +%s%N | sha256sum | cut -d' ' -f1) + + # Create HMAC-style keypair for snapshot integrity + echo "secubox-factory-key:${node_id}:${rand}" > "$KEYFILE" + echo "secubox-factory-pub:${node_id}:$(echo "$rand" | sha256sum | cut -d' ' -f1)" > "$PUBKEY" chmod 600 "$KEYFILE" @@ -87,21 +83,9 @@ create_snapshot() { local sign_data="${merkle}|${ts}|${node_id}|${prev_hash}" local hash=$(echo "$sign_data" | sha256sum | cut -d' ' -f1) - # Sign with Ed25519 or fallback - local signature="" - if command -v signify-openbsd >/dev/null 2>&1; then - echo "$sign_data" | signify-openbsd -S -s "$KEYFILE" -m - -x /tmp/sig.tmp 2>/dev/null - signature=$(cat /tmp/sig.tmp 2>/dev/null | tail -1) - rm -f /tmp/sig.tmp - elif command -v signify >/dev/null 2>&1; then - echo "$sign_data" | signify -S -s "$KEYFILE" -m - -x /tmp/sig.tmp 2>/dev/null - signature=$(cat /tmp/sig.tmp 2>/dev/null | tail -1) - rm -f /tmp/sig.tmp - else - # Fallback: HMAC-style signature using key + data - local key_data=$(cat "$KEYFILE" 2>/dev/null) - signature=$(echo "${key_data}:${sign_data}" | sha256sum | cut -d' ' -f1) - fi + # HMAC-style signature using key + data + local key_data=$(cat "$KEYFILE" 2>/dev/null) + local signature=$(echo "${key_data}:${sign_data}" | sha256sum | cut -d' ' -f1) # Build snapshot JSON cat > "$SNAPSHOT_FILE" << EOF @@ -122,9 +106,10 @@ EOF # Verify snapshot signature verify_snapshot() { local snapshot_file="${1:-$SNAPSHOT_FILE}" - local pubkey="${2:-$PUBKEY}" + local keyfile="${2:-$KEYFILE}" [ -f "$snapshot_file" ] || { echo "missing"; return 1; } + [ -f "$keyfile" ] || { echo "no_key"; return 1; } local merkle=$(jsonfilter -i "$snapshot_file" -e '@.merkle_root' 2>/dev/null) local ts=$(jsonfilter -i "$snapshot_file" -e '@.timestamp' 2>/dev/null) @@ -133,36 +118,23 @@ verify_snapshot() { local signature=$(jsonfilter -i "$snapshot_file" -e '@.signature' 2>/dev/null) [ -z "$merkle" ] && { echo "invalid"; return 1; } + [ -z "$signature" ] && { echo "unsigned"; return 1; } local sign_data="${merkle}|${ts}|${node_id}|${prev_hash}" - # Verify signature - if command -v signify-openbsd >/dev/null 2>&1; then - echo "$signature" > /tmp/verify.sig - if echo "$sign_data" | signify-openbsd -V -p "$pubkey" -m - -x /tmp/verify.sig 2>/dev/null; then - rm -f /tmp/verify.sig - echo "valid" - return 0 - fi - rm -f /tmp/verify.sig - elif command -v signify >/dev/null 2>&1; then - echo "$signature" > /tmp/verify.sig - if echo "$sign_data" | signify -V -p "$pubkey" -m - -x /tmp/verify.sig 2>/dev/null; then - rm -f /tmp/verify.sig - echo "valid" - return 0 - fi - rm -f /tmp/verify.sig - else - # Fallback verification - local key_data=$(cat "$pubkey" 2>/dev/null) - # Extract secret from pubkey for fallback (not secure, but functional) - local expected=$(echo "${key_data}:${sign_data}" | sha256sum | cut -d' ' -f1) - # For fallback keys, the signature is a hash - verify merkle matches current + # HMAC-style verification using key + data + local key_data=$(cat "$keyfile" 2>/dev/null) + local expected=$(echo "${key_data}:${sign_data}" | sha256sum | cut -d' ' -f1) + + if [ "$signature" = "$expected" ]; then + # Also verify merkle matches current config local current_merkle=$(merkle_config) if [ "$merkle" = "$current_merkle" ]; then echo "valid" return 0 + else + echo "config_changed" + return 1 fi fi diff --git a/package/secubox/secubox-p2p/root/www/factory/index.html b/package/secubox/secubox-p2p/root/www/factory/index.html index 82c68e95..ac208b9b 100644 --- a/package/secubox/secubox-p2p/root/www/factory/index.html +++ b/package/secubox/secubox-p2p/root/www/factory/index.html @@ -140,14 +140,18 @@ let tools = []; let refreshInterval = null; - // API helpers + // API helpers - API runs on port 7331 + const apiBase = window.location.port === '7331' + ? '/factory/' + : 'http://' + window.location.hostname + ':7331/factory/'; + const api = { get: async (path) => { - const r = await fetch('/api/factory/' + path); + const r = await fetch(apiBase + path); return r.json(); }, post: async (path, body) => { - const r = await fetch('/api/factory/' + path, { + const r = await fetch(apiBase + path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body)