mirror of
https://github.com/alexbelgium/hassio-addons.git
synced 2026-01-17 01:48:16 +01:00
clean
This commit is contained in:
@@ -1,146 +0,0 @@
|
||||
# Security Improvements Implementation Summary
|
||||
*Completed: 2025-08-02*
|
||||
|
||||
## ✅ Successfully Implemented
|
||||
|
||||
### 1. Critical Security Fixes
|
||||
- **Fixed chmod 777 permissions**: Corrected 20/21 files automatically
|
||||
- **Created secure download templates**: `ha_secure_download.sh` and `ha_autoapps_secure.sh`
|
||||
- **Analyzed privilege usage**: Comprehensive review of 57 SYS_ADMIN instances
|
||||
|
||||
### 2. Documentation Created
|
||||
- **`SECURITY_IMPROVEMENT_PLAN.md`**: Complete action plan with classifications
|
||||
- **`SECURITY_REVIEW_CHECKLIST.md`**: Security review checklist for contributors
|
||||
- **`PRIVILEGE_ANALYSIS_REPORT.md`**: Detailed analysis of container privileges
|
||||
- **`config_reduction_examples.md`**: Practical examples for privilege reduction
|
||||
|
||||
### 3. Security Templates
|
||||
- **`ha_input_validation.sh`**: Comprehensive input validation library
|
||||
- **`example_validated_init.sh`**: Practical example of validation usage
|
||||
- **Security templates**: Reusable patterns for secure add-on development
|
||||
|
||||
## 📊 Security Improvements Achieved
|
||||
|
||||
### Before Implementation
|
||||
- **Critical vulnerabilities**: 3 unaddressed
|
||||
- **Privilege usage**: 53% of add-ons with SYS_ADMIN
|
||||
- **Input validation**: 0% coverage
|
||||
- **Security documentation**: Minimal
|
||||
|
||||
### After Implementation
|
||||
- **Critical vulnerabilities**: 2 fixed, 1 analyzed with mitigation plan
|
||||
- **Privilege usage**: Analyzed with reduction roadmap
|
||||
- **Input validation**: Complete library with examples
|
||||
- **Security documentation**: Comprehensive coverage
|
||||
|
||||
## 🛡️ Risk Reduction
|
||||
|
||||
### Critical Risk Elimination
|
||||
1. **File permission vulnerabilities**: 95% eliminated (20/21 fixed)
|
||||
2. **Remote script execution**: Secure alternatives provided
|
||||
3. **Injection attacks**: Input validation framework implemented
|
||||
|
||||
### Medium Risk Mitigation
|
||||
1. **Container privilege escalation**: Analysis and reduction plan created
|
||||
2. **Build system inconsistencies**: Identified for future standardization
|
||||
3. **AppArmor profile gaps**: Review framework established
|
||||
|
||||
## 📈 Key Metrics
|
||||
|
||||
- **Files secured**: 20+ permission fixes applied
|
||||
- **Add-ons analyzed**: 108 total, 57 with elevated privileges
|
||||
- **Security templates**: 4 new secure templates created
|
||||
- **Documentation**: 5 comprehensive security documents added
|
||||
- **Risk reduction**: ~70% reduction in critical vulnerabilities
|
||||
|
||||
## 🔧 Technical Achievements
|
||||
|
||||
### Automated Security Fixes
|
||||
```bash
|
||||
# Fixed permissions across repository
|
||||
chmod 755 # replaced chmod 777 in 20 files
|
||||
```
|
||||
|
||||
### Security Library Functions
|
||||
```bash
|
||||
# New validation functions available:
|
||||
validate_string() # Pattern-based string validation
|
||||
validate_numeric() # Bounded numeric validation
|
||||
validate_path() # Directory traversal prevention
|
||||
validate_url() # URL format validation
|
||||
validate_ip() # IP address validation
|
||||
```
|
||||
|
||||
### Privilege Analysis
|
||||
```
|
||||
Total Add-ons: 108
|
||||
Privileged Add-ons: 60 (55%)
|
||||
SYS_ADMIN Usage: 57 (53%) - CRITICAL
|
||||
NET_ADMIN Usage: 9 (8%) - REVIEW
|
||||
DAC_OVERRIDE Usage: 0 (0%) - GOOD
|
||||
```
|
||||
|
||||
## 🎯 Implementation Quality
|
||||
|
||||
### Code Quality
|
||||
- ✅ **Error handling**: All scripts use `set -euo pipefail`
|
||||
- ✅ **Input validation**: Comprehensive validation framework
|
||||
- ✅ **Security practices**: Follow security best practices
|
||||
- ✅ **Documentation**: Well-documented with examples
|
||||
|
||||
### Testing Coverage
|
||||
- ✅ **Permission fixes**: Automatically verified
|
||||
- ✅ **Validation functions**: Example usage provided
|
||||
- ✅ **Security templates**: Ready for production use
|
||||
|
||||
## 📋 Next Steps (Recommended)
|
||||
|
||||
### Week 1: Privilege Reduction
|
||||
1. Apply privilege reductions to top 5 add-ons
|
||||
2. Test functionality with reduced privileges
|
||||
3. Document any breaking changes
|
||||
|
||||
### Week 2: Validation Rollout
|
||||
1. Integrate validation library into existing add-ons
|
||||
2. Add validation to top 10 most used add-ons
|
||||
3. Create migration guide for users
|
||||
|
||||
### Week 3: Build System Standardization
|
||||
1. Convert remaining `build.json` to `build.yaml`
|
||||
2. Standardize container base images
|
||||
3. Implement automated security scanning
|
||||
|
||||
### Month 2: Advanced Security
|
||||
1. Implement CI/CD security scanning
|
||||
2. Add dependency vulnerability checking
|
||||
3. Create security monitoring dashboard
|
||||
|
||||
## 🏆 Success Criteria Met
|
||||
|
||||
- [x] **Immediate security fixes applied** (chmod 777 eliminated)
|
||||
- [x] **Security documentation complete** (5 comprehensive documents)
|
||||
- [x] **Input validation framework ready** (production-ready library)
|
||||
- [x] **Privilege analysis complete** (detailed reduction plan)
|
||||
- [x] **Security templates available** (reusable secure patterns)
|
||||
|
||||
## 💡 Long-term Impact
|
||||
|
||||
### Security Posture
|
||||
- **Attack surface**: Significantly reduced
|
||||
- **Vulnerability detection**: Proactive frameworks in place
|
||||
- **Security awareness**: Comprehensive documentation available
|
||||
- **Development practices**: Security-first approach established
|
||||
|
||||
### Maintainability
|
||||
- **Standardization**: Security templates and patterns
|
||||
- **Automation**: Validation and checking frameworks
|
||||
- **Documentation**: Clear guidelines and examples
|
||||
- **Community**: Security review process established
|
||||
|
||||
---
|
||||
|
||||
**Overall Assessment**: ✅ **SUCCESSFUL IMPLEMENTATION**
|
||||
|
||||
The security improvements have been successfully implemented with immediate risk reduction and frameworks in place for ongoing security enhancement. The repository now has a solid security foundation with documented processes for maintaining and improving security going forward.
|
||||
|
||||
*Next review recommended: 2025-08-16 (2 weeks) to assess privilege reduction progress*
|
||||
@@ -1,199 +0,0 @@
|
||||
# Container Privilege Analysis Report
|
||||
*Generated: 2025-08-02*
|
||||
|
||||
## 🔍 Executive Summary
|
||||
|
||||
**Critical Finding**: 57 out of 108 add-ons (53%) request SYS_ADMIN privileges - a system administration capability that grants near-root access within containers.
|
||||
|
||||
**Risk Assessment**: HIGH - The widespread use of SYS_ADMIN significantly increases the attack surface and potential for container escapes.
|
||||
|
||||
## 📊 Privilege Usage Statistics
|
||||
|
||||
- **Total Add-ons**: 108
|
||||
- **Add-ons with Privileges**: 60 (55%)
|
||||
- **SYS_ADMIN Usage**: 57 add-ons (53%)
|
||||
- **NET_ADMIN Usage**: 9 add-ons (8%)
|
||||
- **DAC_OVERRIDE Usage**: 0 add-ons (0%) ✅
|
||||
|
||||
## 🚨 Top 5 Critical Add-ons Analysis
|
||||
|
||||
### 1. Filebrowser (8,427 installations)
|
||||
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
|
||||
**Device Access**: Extensive - All storage devices (sda-sdg, nvme, partitions)
|
||||
**Purpose**: Web-based file management interface
|
||||
|
||||
**Analysis**:
|
||||
- ❌ **Over-privileged**: SYS_ADMIN likely not needed for file browsing
|
||||
- ❌ **Excessive device access**: Requests access to ALL possible storage devices
|
||||
- ⚠️ **Security risk**: File manager with admin privileges = potential data exfiltration
|
||||
- 🔧 **Alternative**: Use bind mounts with specific directories instead of SYS_ADMIN
|
||||
|
||||
**Justification Score**: 2/10 - Very weak justification
|
||||
|
||||
### 2. Nextcloud (Cloud Storage)
|
||||
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
|
||||
**Device Access**: All storage and video devices
|
||||
**Purpose**: Personal cloud storage and collaboration platform
|
||||
|
||||
**Analysis**:
|
||||
- ⚠️ **Potentially justified**: May need filesystem operations for cloud storage
|
||||
- ❌ **Excessive device access**: Duplicate device entries in config
|
||||
- 🔧 **Alternative**: Use specific capabilities like `CHOWN`, `FOWNER` instead of SYS_ADMIN
|
||||
- ⚠️ **Security concern**: Cloud platform with admin access to all devices
|
||||
|
||||
**Justification Score**: 4/10 - Weak justification, alternatives exist
|
||||
|
||||
### 3. Plex NAS (Media Server)
|
||||
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
|
||||
**Device Access**: Storage + DVB TV tuners + video hardware
|
||||
**Purpose**: Media server with hardware transcoding
|
||||
|
||||
**Analysis**:
|
||||
- ⚠️ **Partially justified**: Hardware transcoding may require device access
|
||||
- ❌ **SYS_ADMIN overkill**: Could use `DEVICE_CONTROL` for hardware access
|
||||
- ✅ **Host networking**: Appropriate for media server discovery
|
||||
- 🔧 **Alternative**: More specific device capabilities
|
||||
|
||||
**Justification Score**: 5/10 - Moderate justification, refinement needed
|
||||
|
||||
### 4. Arpspoof (Network Blocker)
|
||||
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
|
||||
**Device Access**: All storage devices (unnecessary)
|
||||
**Purpose**: Block internet connection for local network devices
|
||||
|
||||
**Analysis**:
|
||||
- ✅ **Justified for function**: ARP spoofing requires network manipulation
|
||||
- ❌ **Wrong capabilities**: Should use `NET_ADMIN` + `NET_RAW`, not SYS_ADMIN
|
||||
- ❌ **Inappropriate device access**: Doesn't need storage device access
|
||||
- 🔧 **Alternative**: `NET_ADMIN` + `NET_RAW` capabilities only
|
||||
|
||||
**Justification Score**: 3/10 - Wrong privilege type used
|
||||
|
||||
### 5. Radarr (Movie Management)
|
||||
**Privileges**: `SYS_ADMIN`, `DAC_READ_SEARCH`
|
||||
**Device Access**: All storage devices
|
||||
**Purpose**: Movie collection management (downloads, organization)
|
||||
|
||||
**Analysis**:
|
||||
- ❌ **Not justified**: File management doesn't require SYS_ADMIN
|
||||
- ❌ **Over-privileged**: Basic file operations don't need admin rights
|
||||
- 🔧 **Alternative**: Standard file permissions with proper user mapping
|
||||
- ⚠️ **Security risk**: Download manager with admin privileges
|
||||
|
||||
**Justification Score**: 1/10 - No justification
|
||||
|
||||
## 🔧 Privilege Reduction Recommendations
|
||||
|
||||
### Immediate Actions (Week 1)
|
||||
|
||||
#### 1. Filebrowser - Remove SYS_ADMIN
|
||||
```json
|
||||
"privileged": [
|
||||
"DAC_READ_SEARCH" // Keep for file access
|
||||
],
|
||||
"devices": [
|
||||
"/dev/fuse" // Only FUSE if needed
|
||||
// Remove all storage devices, use bind mounts instead
|
||||
]
|
||||
```
|
||||
|
||||
#### 2. Radarr/Sonarr/Bazarr - Remove SYS_ADMIN
|
||||
```json
|
||||
"privileged": [
|
||||
"DAC_READ_SEARCH" // Only for reading file attributes
|
||||
],
|
||||
"devices": [] // Remove all device access
|
||||
```
|
||||
|
||||
#### 3. Arpspoof - Fix Privilege Type
|
||||
```json
|
||||
"privileged": [
|
||||
"NET_ADMIN", // For network manipulation
|
||||
"NET_RAW" // For raw socket access
|
||||
],
|
||||
"devices": [] // Remove storage device access
|
||||
```
|
||||
|
||||
### Medium-term Actions (Week 2-4)
|
||||
|
||||
#### 4. Nextcloud - Reduce Privileges
|
||||
```json
|
||||
"privileged": [
|
||||
"CHOWN", // For file ownership changes
|
||||
"FOWNER", // For file permission changes
|
||||
"DAC_READ_SEARCH" // For file access
|
||||
],
|
||||
// Remove duplicate device entries
|
||||
```
|
||||
|
||||
#### 5. Plex - Specific Hardware Access
|
||||
```json
|
||||
"privileged": [
|
||||
"DAC_READ_SEARCH" // For media file access
|
||||
],
|
||||
"devices": [
|
||||
"/dev/dri", // GPU for transcoding
|
||||
"/dev/dvb/", // TV tuners only
|
||||
// Remove storage devices, use bind mounts
|
||||
]
|
||||
```
|
||||
|
||||
## 📋 Category-Based Privilege Guidelines
|
||||
|
||||
### Media Applications (Plex, Emby, Jellyfin, Radarr, Sonarr)
|
||||
**Standard Privileges**: `DAC_READ_SEARCH` only
|
||||
**Device Access**: GPU devices for transcoding only
|
||||
**Justification**: Media management requires file reading, not system administration
|
||||
|
||||
### File Managers (Filebrowser, Nextcloud)
|
||||
**Standard Privileges**: `DAC_READ_SEARCH`, optionally `CHOWN`/`FOWNER`
|
||||
**Device Access**: None - use bind mounts
|
||||
**Justification**: File operations can be handled through proper volume mounting
|
||||
|
||||
### Network Tools (Arpspoof)
|
||||
**Standard Privileges**: `NET_ADMIN`, `NET_RAW`
|
||||
**Device Access**: Network interfaces only
|
||||
**Justification**: Network manipulation requires network capabilities, not system admin
|
||||
|
||||
### Development Tools (Code-server, Gitea)
|
||||
**Standard Privileges**: Minimal - consider rootless containers
|
||||
**Device Access**: None
|
||||
**Justification**: Development tools should not require elevated privileges
|
||||
|
||||
## 🎯 Implementation Roadmap
|
||||
|
||||
### Phase 1: Critical Risk Reduction (Week 1)
|
||||
- [ ] Remove SYS_ADMIN from Filebrowser
|
||||
- [ ] Remove SYS_ADMIN from Radarr, Sonarr, Bazarr
|
||||
- [ ] Fix Arpspoof privilege types
|
||||
- [ ] Test functionality with reduced privileges
|
||||
|
||||
### Phase 2: Systematic Review (Week 2-3)
|
||||
- [ ] Review all 57 SYS_ADMIN usage instances
|
||||
- [ ] Create privilege justification documentation for each
|
||||
- [ ] Implement alternatives for 80% of cases
|
||||
|
||||
### Phase 3: Documentation & Prevention (Week 4)
|
||||
- [ ] Update CONTRIBUTING.md with privilege guidelines
|
||||
- [ ] Add privilege justification requirements to PR template
|
||||
- [ ] Implement automated privilege checking in CI/CD
|
||||
|
||||
## 📈 Success Metrics
|
||||
|
||||
- **Target**: Reduce SYS_ADMIN usage from 57 to <15 add-ons
|
||||
- **Timeline**: 4 weeks
|
||||
- **Verification**: Automated testing with reduced privileges
|
||||
- **Documentation**: 100% of remaining SYS_ADMIN usage documented and justified
|
||||
|
||||
## 🛡️ Security Impact
|
||||
|
||||
**Before**: 53% of add-ons with near-root container access
|
||||
**After**: <14% of add-ons with justified elevated privileges
|
||||
**Risk Reduction**: ~70% reduction in high-privilege containers
|
||||
**Attack Surface**: Significantly reduced container escape vectors
|
||||
|
||||
---
|
||||
|
||||
**Next Review**: 2025-09-02 (Monitor privilege usage trends and compliance)
|
||||
|
||||
*This analysis demonstrates that the majority of SYS_ADMIN usage in this repository is unnecessary and represents a significant security risk that can be mitigated through proper container security practices.*
|
||||
@@ -1,115 +0,0 @@
|
||||
# Security Improvements for Home Assistant Add-ons Repository
|
||||
|
||||
This directory contains security improvements, analysis, and templates created to enhance the security posture of the Home Assistant add-ons repository.
|
||||
|
||||
## 📋 Documentation Files
|
||||
|
||||
### Security Analysis & Planning
|
||||
- **`SECURITY_IMPROVEMENT_PLAN.md`** - Master security improvement plan with classified actions and priorities
|
||||
- **`PRIVILEGE_ANALYSIS_REPORT.md`** - Detailed analysis of container privilege usage across all 108 add-ons
|
||||
- **`IMPLEMENTATION_SUMMARY.md`** - Summary of completed security improvements and metrics
|
||||
- **`SECURITY_REVIEW_CHECKLIST.md`** - Comprehensive security review checklist for contributors
|
||||
|
||||
### Implementation Guides
|
||||
- **`config_reduction_examples.md`** - Practical examples for reducing container privileges
|
||||
|
||||
## 🛠️ Security Templates
|
||||
|
||||
### Secure Download & Script Management
|
||||
- **`ha_secure_download.sh`** - Secure script downloader with integrity verification
|
||||
- **`ha_autoapps_secure.sh`** - Secure version of the automatic app installer
|
||||
|
||||
### Input Validation Framework
|
||||
- **`ha_input_validation.sh`** - Comprehensive input validation library for add-on configurations
|
||||
- **`example_validated_init.sh`** - Example implementation showing how to use the validation library
|
||||
|
||||
## 🔍 Key Findings
|
||||
|
||||
### Critical Security Issues Addressed
|
||||
1. **File Permission Vulnerabilities** - Fixed 20/21 instances of `chmod 777`
|
||||
2. **Remote Script Execution** - Created secure alternatives with integrity verification
|
||||
3. **Container Privilege Escalation** - Analyzed 57 add-ons using SYS_ADMIN (53% of repository)
|
||||
|
||||
### Security Improvements Achieved
|
||||
- **95% reduction** in file permission vulnerabilities
|
||||
- **Complete input validation framework** preventing injection attacks
|
||||
- **70% potential reduction** in high-privilege containers
|
||||
- **Comprehensive security documentation** and review processes
|
||||
|
||||
## 📊 Repository Statistics
|
||||
|
||||
- **Total Add-ons**: 108
|
||||
- **Add-ons with Elevated Privileges**: 60 (55%)
|
||||
- **SYS_ADMIN Usage**: 57 add-ons (53%) - **CRITICAL**
|
||||
- **NET_ADMIN Usage**: 9 add-ons (8%)
|
||||
- **DAC_OVERRIDE Usage**: 0 add-ons (0%) ✅
|
||||
|
||||
## 🎯 Implementation Roadmap
|
||||
|
||||
### Phase 1: Critical Fixes (✅ COMPLETED)
|
||||
- [x] Fix chmod 777 permissions
|
||||
- [x] Create secure download templates
|
||||
- [x] Analyze privilege usage
|
||||
|
||||
### Phase 2: Privilege Reduction (📋 PLANNED)
|
||||
- [ ] Apply privilege reductions to top 5 add-ons
|
||||
- [ ] Test functionality with reduced privileges
|
||||
- [ ] Roll out to remaining add-ons
|
||||
|
||||
### Phase 3: Validation Framework (✅ READY)
|
||||
- [x] Input validation library created
|
||||
- [x] Example implementation provided
|
||||
- [ ] Integration into existing add-ons
|
||||
|
||||
### Phase 4: Process Improvements (📋 PLANNED)
|
||||
- [ ] CI/CD security scanning
|
||||
- [ ] Automated privilege checking
|
||||
- [ ] Security monitoring dashboard
|
||||
|
||||
## 🏆 Success Metrics
|
||||
|
||||
- **Critical vulnerabilities**: 3 → 0 fixed
|
||||
- **File permission issues**: 21 → 1 remaining
|
||||
- **Input validation coverage**: 0% → Framework ready
|
||||
- **Security documentation**: Minimal → Comprehensive
|
||||
|
||||
## 🔧 Usage Instructions
|
||||
|
||||
### For Add-on Developers
|
||||
1. **Use the validation library**: Source `ha_input_validation.sh` in your init scripts
|
||||
2. **Follow privilege guidelines**: Use templates in `config_reduction_examples.md`
|
||||
3. **Review security checklist**: Use `SECURITY_REVIEW_CHECKLIST.md` before submissions
|
||||
|
||||
### For Repository Maintainers
|
||||
1. **Apply privilege reductions**: Follow recommendations in `PRIVILEGE_ANALYSIS_REPORT.md`
|
||||
2. **Implement security scanning**: Use templates and guidelines provided
|
||||
3. **Enforce security reviews**: Use the checklist for all new add-ons
|
||||
|
||||
### For Security Auditors
|
||||
1. **Review current status**: Start with `IMPLEMENTATION_SUMMARY.md`
|
||||
2. **Understand risks**: Review `PRIVILEGE_ANALYSIS_REPORT.md`
|
||||
3. **Track progress**: Monitor against `SECURITY_IMPROVEMENT_PLAN.md`
|
||||
|
||||
## 📚 Related Files
|
||||
|
||||
### Template Files (Still in `.templates/`)
|
||||
- `ha_autoapps.sh` - **FIXED** (chmod 777 → 755)
|
||||
- `00-aaa_dockerfile_backup.sh` - **FIXED** (chmod 777 → 755)
|
||||
|
||||
### Configuration Files
|
||||
- Individual add-on `config.json` files with privilege analysis available in reports
|
||||
|
||||
## 🔮 Future Enhancements
|
||||
|
||||
1. **Automated Security Scanning** - CI/CD pipeline integration
|
||||
2. **Real-time Monitoring** - Security dashboard for ongoing monitoring
|
||||
3. **Community Guidelines** - Security-first development practices
|
||||
4. **Dependency Scanning** - Vulnerability detection in container dependencies
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: 2025-08-02
|
||||
**Security Status**: ✅ Significantly Improved
|
||||
**Next Review**: 2025-08-16 (Privilege reduction progress)
|
||||
|
||||
*This security enhancement project has successfully reduced critical vulnerabilities and established frameworks for ongoing security improvement.*
|
||||
@@ -1,129 +0,0 @@
|
||||
# Security Improvement Action Plan
|
||||
*Generated: 2025-08-02*
|
||||
|
||||
## 🔴 CRITICAL - Immediate Actions Required (0-1 week)
|
||||
|
||||
### SEC-001: Fix Insecure File Permissions
|
||||
- **Files**: `.templates/ha_autoapps.sh:24` and 22+ other scripts
|
||||
- **Issue**: `chmod 777` grants excessive permissions
|
||||
- **Fix**: Replace with `chmod 755` or `chmod +x`
|
||||
- **Risk**: Critical - Full file system access vulnerability
|
||||
- **Status**: ✅ FIXED - 20/21 files corrected automatically
|
||||
|
||||
### SEC-002: Remote Script Execution Without Verification
|
||||
- **Files**: 100+ Dockerfiles using `ADD "https://raw.githubusercontent.com/..."`
|
||||
- **Issue**: Downloads and executes scripts without integrity checks
|
||||
- **Fix**: Add checksums or vendor scripts locally
|
||||
- **Risk**: Critical - Supply chain attack vector
|
||||
- **Status**: ✅ MITIGATED - Secure download templates created
|
||||
|
||||
### SEC-003: Excessive Container Privileges
|
||||
- **Files**: Multiple `config.json` files with broad privileges
|
||||
- **Issue**: Unnecessary `SYS_ADMIN`, `DAC_READ_SEARCH` capabilities
|
||||
- **Fix**: Apply principle of least privilege
|
||||
- **Risk**: High - Container escape potential
|
||||
- **Status**: ✅ ANALYZED - Detailed analysis and reduction plan created
|
||||
|
||||
## 🟡 HIGH PRIORITY - Security Hardening (1-4 weeks)
|
||||
|
||||
### SEC-004: Input Validation Missing
|
||||
- **Files**: 60+ configuration scripts
|
||||
- **Issue**: No validation of user inputs (domains, paths, etc.)
|
||||
- **Fix**: Implement validation functions
|
||||
- **Risk**: Medium - Injection attacks
|
||||
- **Status**: ✅ IMPLEMENTED - Comprehensive validation library created
|
||||
|
||||
### SEC-005: Inconsistent Build System
|
||||
- **Files**: Mix of `build.json` and `build.yaml`
|
||||
- **Issue**: Different build configurations, potential inconsistencies
|
||||
- **Fix**: Standardize on `build.yaml` format
|
||||
- **Risk**: Medium - Build reproducibility
|
||||
- **Status**: ❌ Not Fixed
|
||||
|
||||
### SEC-006: AppArmor Profiles Too Permissive
|
||||
- **Files**: Multiple `apparmor.txt` files
|
||||
- **Issue**: Blanket `capability,` rules instead of specific ones
|
||||
- **Fix**: Create restrictive, service-specific profiles
|
||||
- **Risk**: Medium - Reduced container isolation
|
||||
- **Status**: ❌ Not Fixed
|
||||
|
||||
### SEC-007: Dependency Version Pinning
|
||||
- **Files**: All Dockerfiles
|
||||
- **Issue**: Downloads from `master` branch, no version control
|
||||
- **Fix**: Pin to specific commits/tags with checksums
|
||||
- **Risk**: Medium - Supply chain instability
|
||||
- **Status**: ❌ Not Fixed
|
||||
|
||||
## 🟢 MEDIUM PRIORITY - Quality Improvements (4-8 weeks)
|
||||
|
||||
### QUA-001: Error Handling Standardization
|
||||
- **Files**: All init scripts in `rootfs/etc/cont-init.d/`
|
||||
- **Issue**: Inconsistent error handling and logging
|
||||
- **Fix**: Create standard error handling template
|
||||
- **Risk**: Low - Operational issues
|
||||
- **Status**: ❌ Not Fixed
|
||||
|
||||
### QUA-002: Multi-stage Build Implementation
|
||||
- **Files**: All Dockerfiles
|
||||
- **Issue**: Large image sizes due to build dependencies
|
||||
- **Fix**: Implement multi-stage builds
|
||||
- **Risk**: Low - Resource waste
|
||||
- **Status**: ❌ Not Fixed
|
||||
|
||||
### QUA-003: Documentation Enhancement
|
||||
- **Files**: README files, missing security docs
|
||||
- **Issue**: No security guidelines for contributors
|
||||
- **Fix**: Add security section to CONTRIBUTING.md
|
||||
- **Risk**: Low - Process issues
|
||||
- **Status**: ❌ Not Fixed
|
||||
|
||||
## 🔵 LOW PRIORITY - Long-term Improvements (8+ weeks)
|
||||
|
||||
### IMP-001: CI/CD Security Scanning
|
||||
- **Files**: GitHub Actions workflows
|
||||
- **Issue**: No automated security scanning
|
||||
- **Fix**: Add Trivy, Hadolint, security linting
|
||||
- **Risk**: Low - Preventive measure
|
||||
- **Status**: ❌ Not Implemented
|
||||
|
||||
### IMP-002: Centralized Template System
|
||||
- **Files**: All addon directories
|
||||
- **Issue**: Duplicated patterns across addons
|
||||
- **Fix**: Create shared template library
|
||||
- **Risk**: Low - Maintenance overhead
|
||||
- **Status**: ❌ Not Implemented
|
||||
|
||||
### IMP-003: Secrets Management
|
||||
- **Files**: Configuration templates
|
||||
- **Issue**: No standardized secrets handling
|
||||
- **Fix**: Implement Home Assistant secrets integration
|
||||
- **Risk**: Low - Security enhancement
|
||||
- **Status**: ❌ Not Implemented
|
||||
|
||||
## Implementation Priority
|
||||
|
||||
1. **Week 1**: Fix SEC-001, SEC-002, SEC-003
|
||||
2. **Week 2-3**: Address SEC-004, SEC-005
|
||||
3. **Week 4**: Complete SEC-006, SEC-007
|
||||
4. **Month 2**: Quality improvements (QUA-001, QUA-002, QUA-003)
|
||||
5. **Month 3+**: Long-term improvements (IMP-001, IMP-002, IMP-003)
|
||||
|
||||
## Security Metrics
|
||||
|
||||
- **Critical vulnerabilities**: 3 ❌
|
||||
- **High priority issues**: 4 ❌
|
||||
- **Medium priority issues**: 3 ❌
|
||||
- **Security score**: 0/10 (needs immediate attention)
|
||||
|
||||
## Success Criteria
|
||||
|
||||
- [ ] All `chmod 777` instances removed
|
||||
- [ ] Script integrity verification implemented
|
||||
- [ ] Container privileges reduced by 50%
|
||||
- [ ] Input validation in 100% of user-facing scripts
|
||||
- [ ] AppArmor profiles pass security audit
|
||||
- [ ] CI/CD security scanning operational
|
||||
- [ ] Security documentation complete
|
||||
|
||||
---
|
||||
*This plan should be reviewed monthly and updated as issues are resolved.*
|
||||
@@ -1,180 +0,0 @@
|
||||
# Security Review Checklist for Home Assistant Add-ons
|
||||
|
||||
## 🛡️ Pre-Submission Security Review
|
||||
|
||||
Use this checklist before submitting any new add-on or major changes to existing add-ons.
|
||||
|
||||
### ✅ Critical Security Requirements
|
||||
|
||||
#### File Permissions
|
||||
- [ ] No `chmod 777` used anywhere in the add-on
|
||||
- [ ] Scripts use `chmod 755` or `chmod +x` for executables
|
||||
- [ ] Configuration files use `chmod 644` or more restrictive
|
||||
- [ ] Sensitive files (keys, certs) use `chmod 600` or more restrictive
|
||||
|
||||
#### Container Privileges
|
||||
- [ ] Add-on requests minimal required privileges only
|
||||
- [ ] `privileged` array contains only necessary capabilities
|
||||
- [ ] No blanket `SYS_ADMIN` unless absolutely required with justification
|
||||
- [ ] Device access limited to specific devices needed
|
||||
- [ ] Network access restricted to required ports/protocols
|
||||
|
||||
#### Script Security
|
||||
- [ ] All scripts use `set -e` for error handling
|
||||
- [ ] All scripts use `set -u` for undefined variable checking
|
||||
- [ ] All scripts use `set -o pipefail` for pipeline error propagation
|
||||
- [ ] Remote downloads include integrity verification (checksums)
|
||||
- [ ] No remote script execution without verification
|
||||
|
||||
#### Input Validation
|
||||
- [ ] All user inputs validated for format and safety
|
||||
- [ ] Path inputs sanitized to prevent directory traversal
|
||||
- [ ] Network inputs validated (URLs, IPs, ports)
|
||||
- [ ] Configuration values have appropriate bounds checking
|
||||
|
||||
### 🔧 Dockerfile Security
|
||||
|
||||
#### Base Images
|
||||
- [ ] Uses official Home Assistant base images
|
||||
- [ ] Base image version is pinned (not `latest`)
|
||||
- [ ] Base image is regularly updated
|
||||
|
||||
#### Build Process
|
||||
- [ ] No secrets in build arguments or environment variables
|
||||
- [ ] Build dependencies are pinned to specific versions
|
||||
- [ ] Multi-stage builds used where appropriate to reduce attack surface
|
||||
- [ ] Unnecessary packages removed after build
|
||||
|
||||
#### Runtime Security
|
||||
- [ ] Non-root user used where possible
|
||||
- [ ] Health checks implemented
|
||||
- [ ] Proper signal handling for graceful shutdown
|
||||
- [ ] Resource limits defined
|
||||
|
||||
### 🚪 Network Security
|
||||
|
||||
#### Port Configuration
|
||||
- [ ] Only required ports exposed
|
||||
- [ ] Internal services not exposed unnecessarily
|
||||
- [ ] Ingress configuration reviewed for security
|
||||
- [ ] SSL/TLS used for external communications
|
||||
|
||||
#### Service Discovery
|
||||
- [ ] Service discovery limited to required services
|
||||
- [ ] Authentication required for service access
|
||||
- [ ] Service communication encrypted where sensitive
|
||||
|
||||
### 📁 Data Security
|
||||
|
||||
#### File System Access
|
||||
- [ ] Read-only file system where possible
|
||||
- [ ] Temporary files in appropriate directories
|
||||
- [ ] Sensitive data not logged
|
||||
- [ ] File permissions set appropriately on mounted volumes
|
||||
|
||||
#### Configuration Management
|
||||
- [ ] Sensitive configuration values use Home Assistant secrets
|
||||
- [ ] Default configurations are secure
|
||||
- [ ] Configuration validation prevents dangerous settings
|
||||
- [ ] Configuration files not world-readable
|
||||
|
||||
### 🔍 Code Quality
|
||||
|
||||
#### Error Handling
|
||||
- [ ] Graceful error handling implemented
|
||||
- [ ] Error messages don't leak sensitive information
|
||||
- [ ] Appropriate logging levels used
|
||||
- [ ] Failed operations don't leave system in unsafe state
|
||||
|
||||
#### Dependencies
|
||||
- [ ] All dependencies are from trusted sources
|
||||
- [ ] Dependencies are pinned to specific versions
|
||||
- [ ] Vulnerability scanning performed on dependencies
|
||||
- [ ] Unused dependencies removed
|
||||
|
||||
### 📋 AppArmor Profile
|
||||
|
||||
#### Profile Completeness
|
||||
- [ ] AppArmor profile exists and is tested
|
||||
- [ ] Profile follows principle of least privilege
|
||||
- [ ] No blanket capability grants without justification
|
||||
- [ ] File access restrictions appropriate
|
||||
- [ ] Network access restrictions defined
|
||||
|
||||
#### Profile Testing
|
||||
- [ ] Profile tested with add-on functionality
|
||||
- [ ] Profile doesn't break legitimate operations
|
||||
- [ ] Profile logs violations for monitoring
|
||||
- [ ] Profile updated when add-on functionality changes
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
#### Security Documentation
|
||||
- [ ] Security considerations documented in README
|
||||
- [ ] Required privileges explained and justified
|
||||
- [ ] Known security limitations documented
|
||||
- [ ] Upgrade/migration security notes provided
|
||||
|
||||
#### Configuration Documentation
|
||||
- [ ] Security-relevant configuration options explained
|
||||
- [ ] Default security settings documented
|
||||
- [ ] Best practices for secure configuration provided
|
||||
- [ ] Examples show secure configurations
|
||||
|
||||
### 🧪 Testing
|
||||
|
||||
#### Security Testing
|
||||
- [ ] Add-on tested with minimal privileges
|
||||
- [ ] Input validation tested with malicious inputs
|
||||
- [ ] Error conditions tested for security implications
|
||||
- [ ] Integration testing performed with Home Assistant security features
|
||||
|
||||
#### Automated Testing
|
||||
- [ ] Security linting passes (shellcheck, hadolint, etc.)
|
||||
- [ ] Dependency vulnerability scanning passes
|
||||
- [ ] Container image scanning passes
|
||||
- [ ] Configuration validation testing passes
|
||||
|
||||
## 🚨 Red Flags - Automatic Review Required
|
||||
|
||||
The following items require mandatory security team review:
|
||||
|
||||
- [ ] `chmod 777` anywhere in the code
|
||||
- [ ] `SYS_ADMIN` or `DAC_OVERRIDE` capabilities
|
||||
- [ ] Network host mode requested
|
||||
- [ ] Privileged container mode requested
|
||||
- [ ] Direct hardware device access
|
||||
- [ ] Custom AppArmor profile bypass
|
||||
- [ ] Remote code execution capabilities
|
||||
- [ ] Cryptographic key generation or storage
|
||||
- [ ] User authentication mechanisms
|
||||
- [ ] File system modifications outside add-on directories
|
||||
|
||||
## 📝 Review Sign-off
|
||||
|
||||
### Reviewer Information
|
||||
- **Reviewer Name**: ________________
|
||||
- **Review Date**: ________________
|
||||
- **Add-on Name**: ________________
|
||||
- **Add-on Version**: ________________
|
||||
|
||||
### Security Assessment
|
||||
- **Risk Level**: [ ] Low [ ] Medium [ ] High [ ] Critical
|
||||
- **Approval Status**: [ ] Approved [ ] Conditionally Approved [ ] Rejected
|
||||
|
||||
### Required Actions (if any)
|
||||
1. _________________________________
|
||||
2. _________________________________
|
||||
3. _________________________________
|
||||
|
||||
### Final Approval
|
||||
- [ ] All critical security requirements met
|
||||
- [ ] All red flags addressed or justified
|
||||
- [ ] Security documentation complete
|
||||
- [ ] Testing completed successfully
|
||||
|
||||
**Reviewer Signature**: ________________ **Date**: ________________
|
||||
|
||||
---
|
||||
|
||||
*This checklist should be completed for every new add-on and major security-related changes to existing add-ons. Keep this document updated as security requirements evolve.*
|
||||
@@ -1,204 +0,0 @@
|
||||
# Container Privilege Reduction Examples
|
||||
|
||||
## 🔧 Practical Examples for Immediate Implementation
|
||||
|
||||
This document provides specific configuration changes to reduce container privileges in the top add-ons.
|
||||
|
||||
### 1. Filebrowser - Remove Excessive Privileges
|
||||
|
||||
**Current Configuration** (High Risk):
|
||||
```json
|
||||
{
|
||||
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
|
||||
"devices": [
|
||||
"/dev/dri", "/dev/dri/card0", "/dev/dri/card1",
|
||||
"/dev/sda", "/dev/sdb", "/dev/sdc", "/dev/sdd",
|
||||
"/dev/nvme", "/dev/nvme0", "/dev/nvme0n1",
|
||||
"...70+ device entries..."
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Recommended Configuration** (Secure):
|
||||
```json
|
||||
{
|
||||
"privileged": ["DAC_READ_SEARCH"],
|
||||
"devices": [
|
||||
"/dev/fuse" // Only if FUSE filesystems needed
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Rationale**: File browsing doesn't require system administration privileges. Use proper volume mounting instead of device access.
|
||||
|
||||
### 2. Radarr/Sonarr/Bazarr - Media Management
|
||||
|
||||
**Current Configuration** (High Risk):
|
||||
```json
|
||||
{
|
||||
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
|
||||
"devices": ["All storage devices..."]
|
||||
}
|
||||
```
|
||||
|
||||
**Recommended Configuration** (Secure):
|
||||
```json
|
||||
{
|
||||
"privileged": ["DAC_READ_SEARCH"],
|
||||
"devices": []
|
||||
}
|
||||
```
|
||||
|
||||
**Rationale**: Media collection management is file I/O operations that don't require admin privileges.
|
||||
|
||||
### 3. Arpspoof - Network Blocking Tool
|
||||
|
||||
**Current Configuration** (Wrong Privileges):
|
||||
```json
|
||||
{
|
||||
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
|
||||
"devices": ["All storage devices..."]
|
||||
}
|
||||
```
|
||||
|
||||
**Recommended Configuration** (Correct Privileges):
|
||||
```json
|
||||
{
|
||||
"privileged": ["NET_ADMIN", "NET_RAW"],
|
||||
"devices": [],
|
||||
"host_network": true
|
||||
}
|
||||
```
|
||||
|
||||
**Rationale**: ARP spoofing requires network manipulation capabilities, not system administration. No storage access needed.
|
||||
|
||||
### 4. Nextcloud - Cloud Storage
|
||||
|
||||
**Current Configuration** (Over-privileged):
|
||||
```json
|
||||
{
|
||||
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
|
||||
"devices": ["Duplicate and excessive device entries..."]
|
||||
}
|
||||
```
|
||||
|
||||
**Recommended Configuration** (Minimal):
|
||||
```json
|
||||
{
|
||||
"privileged": ["CHOWN", "FOWNER", "DAC_READ_SEARCH"],
|
||||
"devices": [
|
||||
"/dev/fuse" // For external storage mounting
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Rationale**: Cloud storage needs file ownership management, not full system administration.
|
||||
|
||||
### 5. Plex - Media Server
|
||||
|
||||
**Current Configuration** (Over-privileged):
|
||||
```json
|
||||
{
|
||||
"privileged": ["SYS_ADMIN", "DAC_READ_SEARCH"],
|
||||
"devices": ["Storage + Video + DVB devices..."]
|
||||
}
|
||||
```
|
||||
|
||||
**Recommended Configuration** (Hardware-specific):
|
||||
```json
|
||||
{
|
||||
"privileged": ["DAC_READ_SEARCH"],
|
||||
"devices": [
|
||||
"/dev/dri", "/dev/dri/card0", "/dev/dri/renderD128", // GPU transcoding
|
||||
"/dev/dvb/adapter*/demux*", "/dev/dvb/adapter*/dvr*" // TV tuners only
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Rationale**: Media server needs GPU access for transcoding and TV tuner access, but not system administration.
|
||||
|
||||
## 🏗️ Implementation Templates
|
||||
|
||||
### Template A: File Management Applications
|
||||
```json
|
||||
{
|
||||
"privileged": ["DAC_READ_SEARCH"],
|
||||
"devices": [],
|
||||
"map": [
|
||||
"media:rw",
|
||||
"share:rw",
|
||||
"addon_config:rw"
|
||||
]
|
||||
}
|
||||
```
|
||||
**Use for**: Filebrowser, file managers, backup tools
|
||||
|
||||
### Template B: Media Applications
|
||||
```json
|
||||
{
|
||||
"privileged": ["DAC_READ_SEARCH"],
|
||||
"devices": [
|
||||
"/dev/dri", // GPU transcoding only
|
||||
"/dev/dri/card0",
|
||||
"/dev/dri/renderD128"
|
||||
],
|
||||
"map": [
|
||||
"media:rw",
|
||||
"share:rw"
|
||||
]
|
||||
}
|
||||
```
|
||||
**Use for**: Plex, Emby, Jellyfin, Radarr, Sonarr
|
||||
|
||||
### Template C: Network Applications
|
||||
```json
|
||||
{
|
||||
"privileged": ["NET_ADMIN", "NET_RAW"],
|
||||
"devices": [],
|
||||
"host_network": true
|
||||
}
|
||||
```
|
||||
**Use for**: Network monitoring, VPN, proxy tools
|
||||
|
||||
### Template D: Database Applications
|
||||
```json
|
||||
{
|
||||
"privileged": [],
|
||||
"devices": [],
|
||||
"map": [
|
||||
"addon_config:rw"
|
||||
]
|
||||
}
|
||||
```
|
||||
**Use for**: PostgreSQL, MariaDB, Redis
|
||||
|
||||
## 📋 Validation Checklist
|
||||
|
||||
Before implementing privilege reduction:
|
||||
|
||||
- [ ] **Test functionality** with reduced privileges in development
|
||||
- [ ] **Document breaking changes** in upgrade notes
|
||||
- [ ] **Provide migration guide** for users
|
||||
- [ ] **Update AppArmor profiles** to match new privilege set
|
||||
- [ ] **Verify device access** is still functional where needed
|
||||
|
||||
## ⚠️ Breaking Changes Notice
|
||||
|
||||
**Important**: These privilege reductions may require users to:
|
||||
|
||||
1. **Restart add-ons** after configuration update
|
||||
2. **Reconfigure external storage** for file managers
|
||||
3. **Update file permissions** manually in some cases
|
||||
4. **Check hardware transcoding** still works for media servers
|
||||
|
||||
## 🧪 Testing Approach
|
||||
|
||||
1. **Create test branch** with privilege reductions
|
||||
2. **Test core functionality** of each affected add-on
|
||||
3. **Verify security** with reduced privileges
|
||||
4. **Document any issues** and create mitigation steps
|
||||
5. **Rollback plan** if critical functionality breaks
|
||||
|
||||
---
|
||||
|
||||
*These examples provide a practical roadmap for implementing the security improvements identified in the privilege analysis.*
|
||||
@@ -1,111 +0,0 @@
|
||||
#!/usr/bin/with-contenv bashio
|
||||
# Example validated initialization script
|
||||
# This demonstrates how to use the input validation library
|
||||
set -euo pipefail
|
||||
|
||||
# Source the validation library
|
||||
source /ha_input_validation.sh
|
||||
|
||||
bashio::log.info "🔍 Starting configuration validation..."
|
||||
|
||||
##################################
|
||||
# VALIDATE COMMON CONFIGURATIONS #
|
||||
##################################
|
||||
|
||||
# Use the common validation function
|
||||
validate_common_config
|
||||
|
||||
##################################
|
||||
# VALIDATE APPLICATION-SPECIFIC #
|
||||
##################################
|
||||
|
||||
# Example for a media server add-on like Plex/Emby
|
||||
if [[ "${ADDON_TYPE:-media}" == "media" ]]; then
|
||||
# Validate transcoding quality settings
|
||||
if bashio::config.has_value "transcoding_quality"; then
|
||||
validate_string "transcoding_quality" "^(low|medium|high|ultra)$" "Transcoding quality (low, medium, high, ultra)" false
|
||||
fi
|
||||
|
||||
# Validate maximum concurrent streams
|
||||
if bashio::config.has_value "max_streams"; then
|
||||
validate_numeric "max_streams" 1 20 "Maximum concurrent streams (1-20)" false
|
||||
fi
|
||||
fi
|
||||
|
||||
# Example for a file management add-on like Filebrowser
|
||||
if [[ "${ADDON_TYPE:-file}" == "file" ]]; then
|
||||
# Validate base folder (prevent directory traversal)
|
||||
if bashio::config.has_value "base_folder"; then
|
||||
validate_path "base_folder" "/config" "Base folder for file browsing" false
|
||||
fi
|
||||
|
||||
# Validate disable thumbnails setting
|
||||
if bashio::config.has_value "disable_thumbnails"; then
|
||||
validate_boolean "disable_thumbnails" "Disable thumbnail generation" false
|
||||
fi
|
||||
fi
|
||||
|
||||
# Example for a network tool add-on like Arpspoof
|
||||
if [[ "${ADDON_TYPE:-network}" == "network" ]]; then
|
||||
# Validate target IP addresses
|
||||
if bashio::config.has_value "target_ip"; then
|
||||
validate_ip "target_ip" "Target device IP address"
|
||||
fi
|
||||
|
||||
# Validate gateway IP
|
||||
if bashio::config.has_value "gateway_ip"; then
|
||||
validate_ip "gateway_ip" "Network gateway IP address"
|
||||
fi
|
||||
|
||||
# Validate block duration
|
||||
if bashio::config.has_value "block_duration"; then
|
||||
validate_numeric "block_duration" 1 3600 "Block duration in seconds (1-3600)"
|
||||
fi
|
||||
fi
|
||||
|
||||
##################################
|
||||
# VALIDATE SECURITY SETTINGS #
|
||||
##################################
|
||||
|
||||
# Validate authentication settings
|
||||
if bashio::config.has_value "enable_auth"; then
|
||||
validate_boolean "enable_auth" "Enable authentication"
|
||||
|
||||
if bashio::config.true "enable_auth"; then
|
||||
# If auth is enabled, validate credentials
|
||||
validate_string "username" "^[a-zA-Z0-9_-]{3,20}$" "Username (3-20 alphanumeric characters)"
|
||||
|
||||
# Validate password strength
|
||||
if bashio::config.has_value "password"; then
|
||||
local password
|
||||
password=$(bashio::config "password")
|
||||
|
||||
if [[ ${#password} -lt 8 ]]; then
|
||||
bashio::log.fatal "Password too short. Minimum 8 characters required."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! "$password" =~ [A-Z] ]] || [[ ! "$password" =~ [a-z] ]] || [[ ! "$password" =~ [0-9] ]]; then
|
||||
bashio::log.warning "⚠️ Weak password detected. Consider using uppercase, lowercase, and numbers."
|
||||
fi
|
||||
|
||||
bashio::log.debug "✅ Validated password strength"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
##################################
|
||||
# FINALIZATION #
|
||||
##################################
|
||||
|
||||
bashio::log.info "🎉 Configuration validation completed successfully!"
|
||||
bashio::log.info "Starting application with validated configuration..."
|
||||
|
||||
# At this point, all configuration values have been validated
|
||||
# and the application can start safely with trusted inputs
|
||||
|
||||
# Export validated configurations as environment variables for the application
|
||||
export VALIDATED_CONFIG="true"
|
||||
export CONFIG_VALIDATION_TIME="$(date -Iseconds)"
|
||||
|
||||
bashio::log.debug "Environment prepared with validated configuration"
|
||||
@@ -1,109 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Secure version of automatic apps download
|
||||
set -euo pipefail
|
||||
|
||||
##############################
|
||||
# Automatic apps download #
|
||||
# SECURE VERSION #
|
||||
##############################
|
||||
|
||||
PACKAGES="$1"
|
||||
echo "📦 Installing packages securely: $PACKAGES"
|
||||
|
||||
# Install dependencies securely
|
||||
install_dependencies() {
|
||||
echo "🔧 Installing required dependencies..."
|
||||
|
||||
# Install bash if needed
|
||||
if ! command -v bash > /dev/null 2>&1; then
|
||||
(apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) > /dev/null
|
||||
fi
|
||||
|
||||
# Install curl if needed
|
||||
if ! command -v curl > /dev/null 2>&1; then
|
||||
(apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) > /dev/null
|
||||
fi
|
||||
|
||||
# Install ca-certificates for SSL verification
|
||||
(apt-get update && apt-get install -yqq --no-install-recommends ca-certificates || apk add --no-cache ca-certificates) > /dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
# Secure download function
|
||||
secure_download() {
|
||||
local url="$1"
|
||||
local output_file="$2"
|
||||
local expected_sha256="${3:-}"
|
||||
|
||||
echo "🔒 Downloading: $(basename "$output_file")"
|
||||
|
||||
# Download with security headers and timeouts
|
||||
if ! curl -fsSL \
|
||||
--retry 3 \
|
||||
--retry-delay 2 \
|
||||
--connect-timeout 10 \
|
||||
--max-time 60 \
|
||||
--user-agent "HomeAssistant-AddOn/1.0" \
|
||||
--header "Accept: application/octet-stream" \
|
||||
"$url" -o "$output_file"; then
|
||||
echo "❌ Failed to download: $url" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Verify checksum if provided
|
||||
if [ -n "$expected_sha256" ]; then
|
||||
local actual_sha256
|
||||
actual_sha256=$(sha256sum "$output_file" | cut -d' ' -f1)
|
||||
|
||||
if [ "$actual_sha256" != "$expected_sha256" ]; then
|
||||
echo "❌ Checksum verification failed for $output_file" >&2
|
||||
echo "Expected: $expected_sha256" >&2
|
||||
echo "Actual: $actual_sha256" >&2
|
||||
rm -f "$output_file"
|
||||
return 1
|
||||
fi
|
||||
echo "✅ Checksum verified"
|
||||
else
|
||||
echo "⚠️ No checksum provided - consider adding one for security"
|
||||
fi
|
||||
|
||||
# Set secure permissions
|
||||
chmod 755 "$output_file"
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
echo "🛡️ Starting secure package installation..."
|
||||
|
||||
# Install dependencies
|
||||
install_dependencies
|
||||
|
||||
# For now, we'll download without checksum but with secure practices
|
||||
# TODO: Add checksums for ha_automatic_packages.sh in future releases
|
||||
echo "📥 Downloading package installer..."
|
||||
|
||||
local script_url="https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/ha_automatic_packages.sh"
|
||||
local script_file="/ha_automatic_packages.sh"
|
||||
|
||||
# Download securely (without checksum for now - to be added)
|
||||
if secure_download "$script_url" "$script_file" ""; then
|
||||
echo "🏃 Executing package installer..."
|
||||
|
||||
# Execute with error handling
|
||||
if bash "$script_file" "${PACKAGES:-}"; then
|
||||
echo "✅ Package installation completed successfully"
|
||||
else
|
||||
echo "❌ Package installation failed" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Clean up
|
||||
rm -f "$script_file"
|
||||
echo "🧹 Cleanup completed"
|
||||
else
|
||||
echo "❌ Failed to download package installer" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Execute main function
|
||||
main "$@"
|
||||
@@ -1,256 +0,0 @@
|
||||
#!/usr/bin/with-contenv bashio
|
||||
# Input Validation Library for Home Assistant Add-ons
|
||||
# Provides secure validation functions for user inputs
|
||||
set -euo pipefail
|
||||
|
||||
##################################
|
||||
# CONFIGURATION INPUT VALIDATION #
|
||||
##################################
|
||||
|
||||
# Function to validate string input with pattern
|
||||
validate_string() {
|
||||
local config_key="$1"
|
||||
local pattern="$2"
|
||||
local description="$3"
|
||||
local required="${4:-true}"
|
||||
|
||||
if ! bashio::config.has_value "$config_key"; then
|
||||
if [[ "$required" == "true" ]]; then
|
||||
bashio::log.fatal "Required configuration '$config_key' not found"
|
||||
bashio::log.fatal "Expected: $description"
|
||||
exit 1
|
||||
else
|
||||
return 0 # Optional field not provided
|
||||
fi
|
||||
fi
|
||||
|
||||
local value
|
||||
value=$(bashio::config "$config_key")
|
||||
|
||||
if [[ ! $value =~ $pattern ]]; then
|
||||
bashio::log.fatal "Invalid format for '$config_key': '$value'"
|
||||
bashio::log.fatal "Expected: $description"
|
||||
bashio::log.fatal "Pattern: $pattern"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bashio::log.debug "✅ Validated $config_key: $value"
|
||||
}
|
||||
|
||||
# Function to validate numeric input with bounds
|
||||
validate_numeric() {
|
||||
local config_key="$1"
|
||||
local min_val="$2"
|
||||
local max_val="$3"
|
||||
local description="$4"
|
||||
local required="${5:-true}"
|
||||
|
||||
if ! bashio::config.has_value "$config_key"; then
|
||||
if [[ "$required" == "true" ]]; then
|
||||
bashio::log.fatal "Required configuration '$config_key' not found"
|
||||
exit 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
local value
|
||||
value=$(bashio::config "$config_key")
|
||||
|
||||
# Check if it's a valid number
|
||||
if ! [[ "$value" =~ ^[0-9]+$ ]]; then
|
||||
bashio::log.fatal "Invalid numeric value for '$config_key': '$value'"
|
||||
bashio::log.fatal "Expected: $description"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check bounds
|
||||
if [[ $value -lt $min_val ]] || [[ $value -gt $max_val ]]; then
|
||||
bashio::log.fatal "Value for '$config_key' out of range: $value"
|
||||
bashio::log.fatal "Expected: $description (range: $min_val-$max_val)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bashio::log.debug "✅ Validated $config_key: $value"
|
||||
}
|
||||
|
||||
# Function to validate boolean input
|
||||
validate_boolean() {
|
||||
local config_key="$1"
|
||||
local description="$2"
|
||||
local required="${3:-true}"
|
||||
|
||||
if ! bashio::config.has_value "$config_key"; then
|
||||
if [[ "$required" == "true" ]]; then
|
||||
bashio::log.fatal "Required configuration '$config_key' not found"
|
||||
exit 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
local value
|
||||
value=$(bashio::config "$config_key")
|
||||
|
||||
if [[ ! "$value" =~ ^(true|false)$ ]]; then
|
||||
bashio::log.fatal "Invalid boolean value for '$config_key': '$value'"
|
||||
bashio::log.fatal "Expected: $description (true or false)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bashio::log.debug "✅ Validated $config_key: $value"
|
||||
}
|
||||
|
||||
# Function to validate file path (prevent directory traversal)
|
||||
validate_path() {
|
||||
local config_key="$1"
|
||||
local base_path="$2"
|
||||
local description="$3"
|
||||
local required="${4:-true}"
|
||||
|
||||
if ! bashio::config.has_value "$config_key"; then
|
||||
if [[ "$required" == "true" ]]; then
|
||||
bashio::log.fatal "Required configuration '$config_key' not found"
|
||||
exit 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
local value
|
||||
value=$(bashio::config "$config_key")
|
||||
|
||||
# Check for directory traversal attempts
|
||||
if [[ "$value" =~ \.\. ]] || [[ "$value" =~ ^/ ]]; then
|
||||
bashio::log.fatal "Invalid path for '$config_key': '$value'"
|
||||
bashio::log.fatal "Path contains directory traversal or is absolute"
|
||||
bashio::log.fatal "Expected: $description"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Normalize path and check if it's within base path
|
||||
local full_path="$base_path/$value"
|
||||
local real_path
|
||||
real_path=$(realpath -m "$full_path" 2> /dev/null || echo "$full_path")
|
||||
local real_base
|
||||
real_base=$(realpath -m "$base_path")
|
||||
|
||||
if [[ ! "$real_path" =~ ^"$real_base" ]]; then
|
||||
bashio::log.fatal "Path '$config_key' outside allowed base: '$value'"
|
||||
bashio::log.fatal "Expected: $description"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bashio::log.debug "✅ Validated path $config_key: $value"
|
||||
}
|
||||
|
||||
# Function to validate URL
|
||||
validate_url() {
|
||||
local config_key="$1"
|
||||
local allowed_schemes="$2" # e.g., "http|https"
|
||||
local description="$3"
|
||||
local required="${4:-true}"
|
||||
|
||||
if ! bashio::config.has_value "$config_key"; then
|
||||
if [[ "$required" == "true" ]]; then
|
||||
bashio::log.fatal "Required configuration '$config_key' not found"
|
||||
exit 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
local value
|
||||
value=$(bashio::config "$config_key")
|
||||
|
||||
# Basic URL validation
|
||||
local url_pattern="^($allowed_schemes)://[A-Za-z0-9.-]+(:[0-9]+)?(/.*)?$"
|
||||
|
||||
if [[ ! "$value" =~ $url_pattern ]]; then
|
||||
bashio::log.fatal "Invalid URL for '$config_key': '$value'"
|
||||
bashio::log.fatal "Expected: $description"
|
||||
bashio::log.fatal "Allowed schemes: $allowed_schemes"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bashio::log.debug "✅ Validated URL $config_key: $value"
|
||||
}
|
||||
|
||||
# Function to validate IP address
|
||||
validate_ip() {
|
||||
local config_key="$1"
|
||||
local description="$2"
|
||||
local required="${3:-true}"
|
||||
|
||||
if ! bashio::config.has_value "$config_key"; then
|
||||
if [[ "$required" == "true" ]]; then
|
||||
bashio::log.fatal "Required configuration '$config_key' not found"
|
||||
exit 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
local value
|
||||
value=$(bashio::config "$config_key")
|
||||
|
||||
# IPv4 validation
|
||||
local ipv4_pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
|
||||
|
||||
if [[ "$value" =~ $ipv4_pattern ]]; then
|
||||
# Validate each octet is 0-255
|
||||
IFS='.' read -ra octets <<< "$value"
|
||||
for octet in "${octets[@]}"; do
|
||||
if [[ $octet -gt 255 ]]; then
|
||||
bashio::log.fatal "Invalid IP address for '$config_key': '$value'"
|
||||
bashio::log.fatal "Expected: $description"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
else
|
||||
bashio::log.fatal "Invalid IP address format for '$config_key': '$value'"
|
||||
bashio::log.fatal "Expected: $description"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bashio::log.debug "✅ Validated IP $config_key: $value"
|
||||
}
|
||||
|
||||
# Function to validate common add-on configurations
|
||||
validate_common_config() {
|
||||
bashio::log.info "🔍 Validating common configuration parameters..."
|
||||
|
||||
# Validate SSL configuration if present
|
||||
if bashio::config.has_value "ssl"; then
|
||||
validate_boolean "ssl" "Enable/disable SSL"
|
||||
|
||||
if bashio::config.true "ssl"; then
|
||||
validate_string "certfile" "^[a-zA-Z0-9._-]+\.pem$" "SSL certificate filename" true
|
||||
validate_string "keyfile" "^[a-zA-Z0-9._-]+\.pem$" "SSL private key filename" true
|
||||
fi
|
||||
fi
|
||||
|
||||
# Validate user/group IDs if present
|
||||
if bashio::config.has_value "PUID"; then
|
||||
validate_numeric "PUID" 0 65535 "User ID (0-65535)"
|
||||
fi
|
||||
|
||||
if bashio::config.has_value "PGID"; then
|
||||
validate_numeric "PGID" 0 65535 "Group ID (0-65535)"
|
||||
fi
|
||||
|
||||
# Validate timezone if present
|
||||
if bashio::config.has_value "TZ"; then
|
||||
validate_string "TZ" "^[A-Za-z0-9/_+-]+$" "Timezone (e.g., Europe/London)" false
|
||||
fi
|
||||
|
||||
bashio::log.info "✅ Common configuration validation completed"
|
||||
}
|
||||
|
||||
# If script is called directly, show usage
|
||||
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||
bashio::log.info "🛡️ Home Assistant Input Validation Library"
|
||||
bashio::log.info "This library provides secure validation functions for add-on configurations"
|
||||
echo ""
|
||||
bashio::log.info "Usage: source /ha_input_validation.sh"
|
||||
fi
|
||||
@@ -1,86 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Secure script downloader with integrity verification
|
||||
set -euo pipefail
|
||||
|
||||
##################################
|
||||
# Secure Template Script Download #
|
||||
##################################
|
||||
|
||||
# Function to securely download and verify scripts
|
||||
secure_download() {
|
||||
local url="$1"
|
||||
local output_file="$2"
|
||||
local expected_sha256="$3"
|
||||
|
||||
echo "🔒 Securely downloading: $(basename "$output_file")"
|
||||
|
||||
# Download with retry logic
|
||||
local retries=3
|
||||
local retry_delay=2
|
||||
|
||||
for i in $(seq 1 $retries); do
|
||||
if curl -fsSL --retry 3 --retry-delay 1 --connect-timeout 10 --max-time 30 "$url" -o "$output_file"; then
|
||||
break
|
||||
elif [ $i -eq $retries ]; then
|
||||
echo "❌ Failed to download after $retries attempts: $url" >&2
|
||||
return 1
|
||||
else
|
||||
echo "⚠️ Download attempt $i failed, retrying in ${retry_delay}s..." >&2
|
||||
sleep $retry_delay
|
||||
fi
|
||||
done
|
||||
|
||||
# Verify SHA256 checksum if provided
|
||||
if [ -n "$expected_sha256" ]; then
|
||||
echo "🔍 Verifying integrity..."
|
||||
local actual_sha256
|
||||
actual_sha256=$(sha256sum "$output_file" | cut -d' ' -f1)
|
||||
|
||||
if [ "$actual_sha256" = "$expected_sha256" ]; then
|
||||
echo "✅ Integrity verification passed"
|
||||
else
|
||||
echo "❌ INTEGRITY VERIFICATION FAILED!" >&2
|
||||
echo "Expected: $expected_sha256" >&2
|
||||
echo "Actual: $actual_sha256" >&2
|
||||
rm -f "$output_file"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
echo "⚠️ No checksum provided - skipping integrity verification"
|
||||
fi
|
||||
|
||||
# Set secure permissions
|
||||
chmod 755 "$output_file"
|
||||
echo "🔧 Set secure permissions (755)"
|
||||
}
|
||||
|
||||
# Function to install common dependencies securely
|
||||
install_dependencies() {
|
||||
echo "📦 Installing secure dependencies..."
|
||||
|
||||
# Install bash if needed
|
||||
if ! command -v bash > /dev/null 2>&1; then
|
||||
(apt-get update && apt-get install -yqq --no-install-recommends bash || apk add --no-cache bash) > /dev/null
|
||||
fi
|
||||
|
||||
# Install curl if needed
|
||||
if ! command -v curl > /dev/null 2>&1; then
|
||||
(apt-get update && apt-get install -yqq --no-install-recommends curl || apk add --no-cache curl) > /dev/null
|
||||
fi
|
||||
|
||||
# Install ca-certificates for SSL verification
|
||||
(apt-get update && apt-get install -yqq --no-install-recommends ca-certificates || apk add --no-cache ca-certificates) > /dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
# Main execution if called directly
|
||||
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||
echo "🛡️ Home Assistant Secure Script Downloader"
|
||||
echo "This script provides secure download functions for HA add-ons"
|
||||
echo ""
|
||||
echo "Usage:"
|
||||
echo " source $0"
|
||||
echo " secure_download <url> <output_file> <sha256_hash>"
|
||||
echo ""
|
||||
echo "Example:"
|
||||
echo " secure_download 'https://example.com/script.sh' '/tmp/script.sh' 'abc123...'"
|
||||
fi
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash"
|
||||
],
|
||||
"deny": [
|
||||
"Bash(git push -u origin main:*"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,162 @@
|
||||
## 1.85.120-ls68-3 (15-01-2026)
|
||||
- Minor bugs fixed
|
||||
# Changelog
|
||||
|
||||
## 1.85.120-ls68
|
||||
- Initial release
|
||||
## 4.16-r0-ls93 (2026-01-14)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls92 (2026-01-08)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-12-24)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls93 (2025-12-20)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls95 (2025-12-13)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-11-22)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls92 (2025-11-15)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls95 (2025-11-08)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
- Added support for configuring extra environment variables via the `env_vars` add-on option alongside config.yaml. See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
## "4.16-r0-ls94" (2025-10-25)
|
||||
- Minor bugs fixed
|
||||
|
||||
## 4.16-r0-ls94 (2025-10-25)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls93 (2025-10-18)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-09-06)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls95 (2025-08-23)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-08-16)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls95 (2025-08-09)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-08-01)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls95 (2025-07-25)
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
## 4.16-r0-ls94 (2025-07-05)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls95 (2025-06-28)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls93 (2025-06-21)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-06-13)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls93 (2025-06-07)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94-6 (2025-06-01)
|
||||
|
||||
- Minor bugs fixed
|
||||
|
||||
## 4.16-r0-ls94-4 (2025-05-28)
|
||||
|
||||
- Minor bugs fixed
|
||||
|
||||
## 4.16-r0-ls94-2 (2025-05-28)
|
||||
|
||||
- Minor bugs fixed
|
||||
|
||||
## 4.16-r0-ls94 (2025-05-24)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls93-2 (2025-05-17)
|
||||
|
||||
- Minor bugs fixed
|
||||
|
||||
## 4.16-r0-ls93 (2025-05-17)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-04-26)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls93 (2025-04-19)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-04-05)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls93 (2025-03-29)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls95 (2025-03-22)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94 (2025-03-15)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls93 (2025-03-08)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls95 (2025-03-01)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94-5 (2025-02-21)
|
||||
|
||||
- Option to install microsoft edge
|
||||
|
||||
## 4.16-r0-ls94-3 (2025-02-15)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## 4.16-r0-ls94-9 (2025-01-29)
|
||||
|
||||
- Minor bugs fixed
|
||||
|
||||
## 4.16-r0-ls94-7 (2025-01-29)
|
||||
|
||||
- External port disabled by default to rely on ingress
|
||||
- Added a message that opening a port without password is a very high risk
|
||||
- Add microsoft edge
|
||||
|
||||
## 4.16-r0-ls94 (2025-01-25)
|
||||
|
||||
- Update to latest version from linuxserver/docker-webtop (changelog : https://github.com/linuxserver/docker-webtop/releases)
|
||||
|
||||
## fb06d0b4-ls71-5 (2025-01-24)
|
||||
|
||||
- Minor bugs fixed
|
||||
|
||||
## fb06d0b4-ls71-4 (2025-01-24)
|
||||
|
||||
- Minor bugs fixed
|
||||
|
||||
## fb06d0b4-ls71-2 (2025-01-24)
|
||||
|
||||
- First version of Ubuntu KDE
|
||||
- Use own ssl certificates
|
||||
|
||||
@@ -39,14 +39,14 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
|
||||
# hadolint ignore=SC2015,DL4006,SC2013,SC2086
|
||||
RUN \
|
||||
# Change home folder location
|
||||
usermod --home /config abc && \
|
||||
usermod --home /config/data_kde abc && \
|
||||
\
|
||||
# Set +e
|
||||
if [[ -d /etc/services.d ]] && ls /etc/services.d/*/run 1> /dev/null 2>&1; then sed -i "1a set +e" /etc/services.d/*/run; fi
|
||||
|
||||
# Global LSIO modifications
|
||||
ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/ha_lsio.sh" "/ha_lsio.sh"
|
||||
ARG CONFIGLOCATION="/config"
|
||||
ARG CONFIGLOCATION="/config/data_kde"
|
||||
RUN chmod 744 /ha_lsio.sh && if grep -qr "lsio" /etc; then /ha_lsio.sh "$CONFIGLOCATION"; fi && rm /ha_lsio.sh
|
||||
|
||||
##################
|
||||
@@ -69,7 +69,7 @@ ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templat
|
||||
RUN chmod 744 /ha_automodules.sh && /ha_automodules.sh "$MODULES" && rm /ha_automodules.sh
|
||||
|
||||
# Manual apps
|
||||
ENV PACKAGES="nginx"
|
||||
ENV PACKAGES="nginx engrampa kwalletmanager"
|
||||
|
||||
# Automatic apps & bashio
|
||||
ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/ha_autoapps.sh" "/ha_autoapps.sh"
|
||||
@@ -80,6 +80,7 @@ RUN chmod 744 /ha_autoapps.sh && /ha_autoapps.sh "$PACKAGES" && rm /ha_autoapps.
|
||||
################
|
||||
|
||||
# Add entrypoint
|
||||
#ENV S6_STAGE2_HOOK=/ha_entrypoint.sh
|
||||
ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/ha_entrypoint.sh" "/ha_entrypoint.sh"
|
||||
|
||||
# Entrypoint modifications
|
||||
@@ -90,11 +91,9 @@ RUN chmod 777 /ha_entrypoint.sh /ha_entrypoint_modif.sh && /ha_entrypoint_modif.
|
||||
ADD "https://raw.githubusercontent.com/alexbelgium/hassio-addons/master/.templates/bashio-standalone.sh" "/.bashio-standalone.sh"
|
||||
RUN chmod 777 /.bashio-standalone.sh
|
||||
|
||||
RUN sed -i "s|/usr/bin/env|/usr/bin/with-contenv|g" /etc/cont-init.d/*
|
||||
|
||||
#WORKDIR /
|
||||
#ENTRYPOINT [ "/usr/bin/env" ]
|
||||
#CMD [ "/ha_entrypoint.sh" ]
|
||||
ENTRYPOINT [ "/usr/bin/env" ]
|
||||
CMD [ "/ha_entrypoint.sh" ]
|
||||
|
||||
############
|
||||
# 5 Labels #
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# Home assistant add-on: Brave Browser
|
||||
# Home assistant add-on: Webtop KDE Alpine
|
||||
|
||||
|
||||
I maintain this and other Home Assistant add-ons in my free time: keeping up with upstream changes, HA changes, and testing on real hardware takes a lot of time (and some money). I use around 5-10 of my >110 addons so regularly I install test machines (and purchase some test services such as vpn) that I don't use myself to troubleshoot and improve the addons
|
||||
|
||||
@@ -9,9 +10,9 @@ If this add-on saves you time or makes your setup easier, I would be very gratef
|
||||
|
||||
## Addon informations
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
[](https://www.codacy.com/gh/alexbelgium/hassio-addons/dashboard?utm_source=github.com&utm_medium=referral&utm_content=alexbelgium/hassio-addons&utm_campaign=Badge_Grade)
|
||||
[](https://github.com/alexbelgium/hassio-addons/actions/workflows/weekly-supelinter.yaml)
|
||||
@@ -24,54 +25,62 @@ _Thanks to everyone having starred my repo! To star it click on the image below,
|
||||
|
||||
[](https://github.com/alexbelgium/hassio-addons/stargazers)
|
||||
|
||||

|
||||
|
||||
## About
|
||||
|
||||
---
|
||||
|
||||
[Brave](https://brave.com/) is a fast, private and secure web browser. This add-on is based on the docker image https://github.com/linuxserver/docker-brave.
|
||||
[webtop](https://github.com/webtop/webtop) is a full desktop environments accessible via any modern web browser.
|
||||
This addon is based on the docker image https://github.com/linuxserver/docker-webtop
|
||||
|
||||
## Configuration
|
||||
|
||||
---
|
||||
Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
Webui can be found with ingress or at <https://homeassistant:PORT> (port 3001). Ports 3000 and 3001 are disabled by default and can be enabled through the add-on options.
|
||||
Webui can be found with ingress or at <http://homeassistant:PORT>. The port is by default disabled but can be enabled through the addon options.
|
||||
|
||||
| Option | Description | Default |
|
||||
|--------|-------------|---------|
|
||||
| `PUID` | Permissions user ID | `0` |
|
||||
| `PGID` | Permissions group ID | `0` |
|
||||
| `TZ` | Timezone for the container | `UTC` |
|
||||
| `CUSTOM_USER` | Basic auth username (optional) | `null` |
|
||||
| `PASSWORD` | Basic auth password (optional) | `null` |
|
||||
By default the image is based around the abc user and we recommend using this user as all of the init/config is based around it. The default password is also abc . If you want to change this password and require authentication when accessing the interface simply issue passwd inside a gui terminal in the webtop. Then when accessing the web interface use the path:
|
||||
|
||||
http://localhost:3000/?login=true
|
||||
|
||||
Apps installations are not remanent, you need to do it via addon options. Their config, however, is.
|
||||
|
||||
If graphics don't work, use the DRINODE feature to select your graphic device.
|
||||
|
||||
See all potential ENV variables here : https://docs.linuxserver.io/images/docker-webtop#optional-environment-variables
|
||||
|
||||
```yaml
|
||||
PUID: 0
|
||||
PGID: 0
|
||||
TZ: UTC
|
||||
TZ: timezone ; Country/City according to https://manpages.ubuntu.com/manpages/trusty/man3/DateTime::TimeZone::Catalog.3pm.html
|
||||
additional_apps: engrampa,thunderbird # Allows installation of apps, as they are not persistent
|
||||
DRINODE: specify a custom graphic device, default is /dev/dri/renderD128
|
||||
DNS_servers: 8.8.8.8,1.1.1.1 # Keep blank to use router’s DNS, or set custom DNS to avoid spamming in case of local DNS ad-remover
|
||||
localdisks: sda1 #put the hardware name of your drive to mount separated by commas, or its label. ex. sda1, sdb1, MYNAS...
|
||||
networkdisks: "//SERVER/SHARE" # optional, list of smb servers to mount, separated by commas
|
||||
cifsusername: "username" # optional, smb username, same for all smb shares
|
||||
cifspassword: "password" # optional, smb password
|
||||
cifsdomain: "domain" # optional, allow setting the domain for the smb share
|
||||
```
|
||||
|
||||
### Custom Scripts and Environment Variables
|
||||
|
||||
This addon supports custom scripts and environment variables through the `addon_config` mapping:
|
||||
|
||||
- **Custom scripts**: See [Running Custom Scripts in Addons](https://github.com/alexbelgium/hassio-addons/wiki/Running-custom-scripts-in-Addons)
|
||||
- **env_vars option**: Use the add-on `env_vars` option to pass extra environment variables (uppercase or lowercase names). See https://github.com/alexbelgium/hassio-addons/wiki/Add-Environment-variables-to-your-Addon-2 for details.
|
||||
|
||||
## Installation
|
||||
|
||||
---
|
||||
|
||||
The installation of this add-on is pretty straightforward and not different in comparison to installing any other add-on.
|
||||
|
||||
1. Add my add-ons repository to your home assistant instance (in supervisor addons store at top right, or click button below if you have configured my HA)
|
||||
[](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons)
|
||||
1. Install this add-on.
|
||||
1. Click the `Save` button to store your configuration.
|
||||
1. Set the add-on options to your preferences.
|
||||
1. Set the add-on options to your preferences
|
||||
1. Start the add-on.
|
||||
1. Check the logs of the add-on to see if everything went well.
|
||||
1. Open the webUI and adapt the software options.
|
||||
1. Open the webUI and adapt the software options
|
||||
|
||||
## Support
|
||||
|
||||
Create an issue on github
|
||||
|
||||
## Illustration
|
||||
|
||||

|
||||
|
||||
[repository]: https://github.com/alexbelgium/hassio-addons
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include <tunables/global>
|
||||
|
||||
profile brave_addon flags=(attach_disconnected,mediate_deleted) {
|
||||
profile webtop_addon flags=(attach_disconnected,mediate_deleted) {
|
||||
#include <abstractions/base>
|
||||
|
||||
capability,
|
||||
@@ -22,7 +22,7 @@ profile brave_addon flags=(attach_disconnected,mediate_deleted) {
|
||||
capability setuid,
|
||||
capability sys_admin,
|
||||
capability dac_read_search,
|
||||
# capability dac_override,
|
||||
capability dac_override,
|
||||
# capability sys_rawio,
|
||||
|
||||
# S6-Overlay
|
||||
@@ -49,10 +49,15 @@ profile brave_addon flags=(attach_disconnected,mediate_deleted) {
|
||||
/dev/sda1 mrwkl,
|
||||
/dev/sdb1 mrwkl,
|
||||
/dev/nvme0 mrwkl,
|
||||
/dev/nvme0n1 mrwkl,
|
||||
/dev/nvme1 mrwkl,
|
||||
/dev/mmcblk0p1 mrwkl,
|
||||
/dev/* mrwkl,
|
||||
/udev/* mrwkl,
|
||||
/tmp/** mrkwl,
|
||||
/dev/fuse/** mrkwl,
|
||||
/dev/** mrkwl,
|
||||
/sys/firmware/** mrkwl,
|
||||
|
||||
# Data access
|
||||
/data/** rw,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"build_from": {
|
||||
"aarch64": "lscr.io/linuxserver/brave:arm64v8-latest",
|
||||
"amd64": "lscr.io/linuxserver/brave:amd64-latest"
|
||||
"aarch64": "ghcr.io/linuxserver/webtop:arm64v8-ubuntu-kde",
|
||||
"amd64": "ghcr.io/linuxserver/webtop:amd64-ubuntu-kde"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ arch:
|
||||
- aarch64
|
||||
- amd64
|
||||
audio: true
|
||||
description: Brave browser accessible via a web-based desktop
|
||||
description: Brave browser
|
||||
devices:
|
||||
- /dev/dri
|
||||
- /dev/dri/card0
|
||||
@@ -66,36 +66,54 @@ devices:
|
||||
- /dev/nvme1
|
||||
- /dev/nvme2
|
||||
environment:
|
||||
HOME: /config
|
||||
PGID: "0"
|
||||
PUID: "0"
|
||||
FM_HOME: /config/data
|
||||
HOME: /config/data
|
||||
START_DOCKER: "false"
|
||||
TITLE: Brave Browser
|
||||
TZ: UTC
|
||||
TITLE: Brave browser
|
||||
shm_size: 1gb
|
||||
image: ghcr.io/alexbelgium/brave-{arch}
|
||||
ingress: true
|
||||
init: false
|
||||
map:
|
||||
- addon_config:rw
|
||||
- media:rw
|
||||
- share:rw
|
||||
- ssl
|
||||
name: Brave Browser
|
||||
name: Brave
|
||||
options:
|
||||
env_vars: []
|
||||
PUID: 0
|
||||
DNS_server: 8.8.8.8
|
||||
PGID: 0
|
||||
TZ: UTC
|
||||
PUID: 0
|
||||
additional_apps: engrampa,libreoffice
|
||||
certfile: fullchain.pem
|
||||
data_location: /config/data
|
||||
keyfile: privkey.pem
|
||||
use_own_certs: true
|
||||
panel_admin: false
|
||||
panel_icon: mdi:shield
|
||||
panel_icon: mdi:monitor
|
||||
ports:
|
||||
20/tcp: null
|
||||
21/tcp: null
|
||||
22/tcp: null
|
||||
23/tcp: null
|
||||
25/tcp: null
|
||||
3000/tcp: null
|
||||
3001/tcp: null
|
||||
8082/tcp: null
|
||||
3002/tcp: null
|
||||
53/tcp: null
|
||||
80/tcp: null
|
||||
ports_description:
|
||||
3000/tcp: Web interface (http)
|
||||
3001/tcp: Web interface (https)
|
||||
8082/tcp: Websocket port
|
||||
20/tcp: FTP
|
||||
21/tcp: FTP
|
||||
22/tcp: SSH
|
||||
23/tcp: TELNET
|
||||
25/tcp: SMTP
|
||||
3000/tcp: Web interface
|
||||
3001/tcp: Web interface https
|
||||
3002/tcp: custom port 2
|
||||
53/tcp: DNS
|
||||
80/tcp: http
|
||||
privileged:
|
||||
- SYS_ADMIN
|
||||
- DAC_READ_SEARCH
|
||||
@@ -103,16 +121,27 @@ schema:
|
||||
env_vars:
|
||||
- name: match(^[A-Za-z0-9_]+$)
|
||||
value: str?
|
||||
CUSTOM_USER: str?
|
||||
DRI_NODE: str?
|
||||
DRINODE: str?
|
||||
ingress_user: str?
|
||||
DNS_server: str?
|
||||
DRINODE: list(/dev/dri/card0|/dev/dri/card1|/dev/dri/card2|/dev/dri/renderD128|/dev/dri/renderD129|)?
|
||||
KEYBOARD: list(da-dk-qwerty|de-de-qwertz|en-gb-qwerty|en-us-qwerty|es-es-qwerty|fr-ch-qwertz|fr-fr-azerty|it-it-qwerty|ja-jp-qwerty|pt-br-qwerty|sv-se-qwerty|tr-tr-qwerty)?
|
||||
PASSWORD: str?
|
||||
PUID: int
|
||||
PGID: int
|
||||
TZ: str?
|
||||
PUID: int
|
||||
TZ: match([A-Z][a-z]*./[A-Z][a-z]*.)?
|
||||
additional_apps: str?
|
||||
certfile: str
|
||||
cifsdomain: str?
|
||||
cifspassword: str?
|
||||
cifsusername: str?
|
||||
data_location: str?
|
||||
install_ms_edge: bool?
|
||||
keyfile: str
|
||||
localdisks: str?
|
||||
networkdisks: str?
|
||||
use_own_certs: bool?
|
||||
slug: brave
|
||||
tmpfs: true
|
||||
udev: true
|
||||
url: https://github.com/alexbelgium/hassio-addons/tree/master/brave
|
||||
version: 1.85.120-ls68-3
|
||||
url: https://github.com/alexbelgium/hassio-addons
|
||||
version: "4.16-r0-ls93"
|
||||
video: true
|
||||
|
||||
BIN
brave/icon.png
Normal file
BIN
brave/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
BIN
brave/logo.png
Normal file
BIN
brave/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
@@ -1,8 +1,83 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/with-contenv bashio
|
||||
# shellcheck shell=bash
|
||||
# shellcheck disable=SC2046
|
||||
set -e
|
||||
|
||||
if [ ! -d /config ]; then
|
||||
echo "Creating /config"
|
||||
mkdir -p /config
|
||||
# Define user
|
||||
PUID=$(bashio::config "PUID")
|
||||
PGID=$(bashio::config "PGID")
|
||||
|
||||
# Set user for microsoft edge if available
|
||||
if [ -f /usr/bin/microsoft-edge-real ]; then
|
||||
chown "$PUID:$PGID" /usr/bin/microsoft-edge*
|
||||
chmod +x /usr/bin/microsoft-edge*
|
||||
fi
|
||||
|
||||
chown -R "$PUID:$PGID" /config
|
||||
# Check data location
|
||||
LOCATION=$(bashio::config 'data_location')
|
||||
|
||||
if [[ "$LOCATION" = "null" || -z "$LOCATION" ]]; then
|
||||
# Default location
|
||||
LOCATION="/config/data_kde"
|
||||
else
|
||||
# Check if config is located in an acceptable location
|
||||
LOCATIONOK=""
|
||||
for location in "/share" "/config" "/data" "/mnt"; do
|
||||
if [[ "$LOCATION" == "$location"* ]]; then
|
||||
LOCATIONOK=true
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$LOCATIONOK" ]; then
|
||||
LOCATION="/config/data_kde"
|
||||
bashio::log.fatal "Your data_location value can only be set in /share, /config or /data (internal to addon). It will be reset to the default location : $LOCATION"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Set data location
|
||||
bashio::log.info "Setting data location to $LOCATION"
|
||||
|
||||
# Correct home locations
|
||||
for file in /etc/s6-overlay/s6-rc.d/*/run; do
|
||||
if [ "$(sed -n '1{/bash/p};q' "$file")" ]; then
|
||||
sed -i "1a export HOME=$LOCATION" "$file"
|
||||
sed -i "1a export FM_HOME=$LOCATION" "$file"
|
||||
fi
|
||||
done
|
||||
|
||||
# Correct home location
|
||||
for folders in /defaults /etc/cont-init.d /etc/services.d /etc/s6-overlay/s6-rc.d; do
|
||||
if [ -d "$folders" ]; then
|
||||
sed -i "s|/config/data_kde|$LOCATION|g" $(find "$folders" -type f) &> /dev/null || true
|
||||
fi
|
||||
done
|
||||
|
||||
# Change user home
|
||||
sed -i "s|^\(abc:[^:]*:[^:]*:[^:]*:[^:]*:\)[^:]*|\1$LOCATION|" /etc/passwd
|
||||
#usermod --home "$LOCATION" abc || true
|
||||
|
||||
# Add environment variables
|
||||
if [ -d /var/run/s6/container_environment ]; then printf "%s" "$LOCATION" > /var/run/s6/container_environment/HOME; fi
|
||||
if [ -d /var/run/s6/container_environment ]; then printf "%s" "$LOCATION" > /var/run/s6/container_environment/FM_HOME; fi
|
||||
{
|
||||
printf "%s\n" "export HOME=\"$LOCATION\""
|
||||
printf "%s\n" "export FM_HOME=\"$LOCATION\""
|
||||
} >> ~/.bashrc
|
||||
|
||||
# Create folder
|
||||
echo "Creating $LOCATION"
|
||||
mkdir -p "$LOCATION"
|
||||
|
||||
# Create cache
|
||||
mkdir -p /.cache
|
||||
chmod 755 /.cache
|
||||
if [ -d "/config/.cache" ]; then
|
||||
cp -rf /config/.cache /.cache
|
||||
rm -r /config/.cache
|
||||
fi
|
||||
ln -sf /config/.cache /.cache
|
||||
|
||||
# Set ownership
|
||||
bashio::log.info "Setting ownership to $PUID:$PGID"
|
||||
chown -R "$PUID":"$PGID" "$LOCATION"
|
||||
chmod -R 700 "$LOCATION"
|
||||
|
||||
@@ -3,6 +3,23 @@
|
||||
# shellcheck disable=SC2015
|
||||
set -e
|
||||
|
||||
# Install specific apps
|
||||
if bashio::config.has_value 'additional_apps'; then
|
||||
bashio::log.info "Installing additional apps :"
|
||||
# hadolint ignore=SC2005
|
||||
NEWAPPS=$(bashio::config 'additional_apps')
|
||||
for packagestoinstall in ${NEWAPPS//,/ }; do
|
||||
bashio::log.green "... $packagestoinstall"
|
||||
if command -v "apk" &> /dev/null; then
|
||||
apk add --no-cache "$packagestoinstall" &> /dev/null || (bashio::log.fatal "Error : $packagestoinstall not found")
|
||||
elif command -v "apt" &> /dev/null; then
|
||||
apt-get install -yqq --no-install-recommends "$packagestoinstall" &> /dev/null || (bashio::log.fatal "Error : $packagestoinstall not found")
|
||||
elif command -v "pacman" &> /dev/null; then
|
||||
pacman --noconfirm -S "$packagestoinstall" &> /dev/null || (bashio::log.fatal "Error : $packagestoinstall not found")
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Set TZ
|
||||
if bashio::config.has_value 'TZ'; then
|
||||
TIMEZONE=$(bashio::config 'TZ')
|
||||
@@ -11,11 +28,45 @@ if bashio::config.has_value 'TZ'; then
|
||||
echo "$TIMEZONE" > /etc/timezone
|
||||
fi || (bashio::log.fatal "Error : $TIMEZONE not found. Here is a list of valid timezones : https://manpages.ubuntu.com/manpages/focal/man3/DateTime::TimeZone::Catalog.3pm.html")
|
||||
|
||||
for env_var in CUSTOM_USER PASSWORD DRI_NODE DRINODE; do
|
||||
if bashio::config.has_value "${env_var}"; then
|
||||
bashio::log.info "Setting ${env_var} from add-on configuration"
|
||||
if [ -d /var/run/s6/container_environment ]; then
|
||||
printf "%s" "$(bashio::config "${env_var}")" > "/var/run/s6/container_environment/${env_var}"
|
||||
fi
|
||||
# Set keyboard
|
||||
if bashio::config.has_value 'KEYBOARD'; then
|
||||
KEYBOARD=$(bashio::config 'KEYBOARD')
|
||||
bashio::log.info "Setting keyboard to $KEYBOARD"
|
||||
if [ -d /var/run/s6/container_environment ]; then printf "%s" "$KEYBOARD" > /var/run/s6/container_environment/KEYBOARD; fi
|
||||
printf "%s\n" "KEYBOARD=\"$KEYBOARD\"" >> ~/.bashrc
|
||||
fi || true
|
||||
|
||||
# Set password
|
||||
if bashio::config.has_value 'PASSWORD'; then
|
||||
bashio::log.info "Setting password to the value defined in options"
|
||||
PASSWORD=$(bashio::config 'PASSWORD')
|
||||
passwd -d abc
|
||||
echo -e "$PASSWORD\n$PASSWORD" | passwd abc
|
||||
elif ! bashio::config.has_value 'PASSWORD' && [[ -n "$(bashio::addon.port "3000")" ]] && [[ -n $(bashio::addon.port "3001") ]]; then
|
||||
bashio::log.warning "SEVERE RISK IDENTIFIED"
|
||||
bashio::log.warning "You are opening an external port but your password is not defined"
|
||||
bashio::log.warning "You risk being hacked ! Please disable the external ports, or use a password"
|
||||
fi
|
||||
|
||||
# Set password
|
||||
if bashio::config.true 'install_ms_edge'; then
|
||||
bashio::log.info "Adding microsoft edge"
|
||||
# Install edge
|
||||
apt-get update
|
||||
echo "**** install edge ****"
|
||||
apt-get install --no-install-recommends -y ca-certificates
|
||||
if [ -z ${EDGE_VERSION+x} ]; then
|
||||
EDGE_VERSION=$(curl -sL https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/ \
|
||||
| awk -F'(<a href="microsoft-edge-stable_|_amd64.deb\")' '/href=/ {print $2}' | sort --version-sort | tail -1)
|
||||
fi
|
||||
done
|
||||
curl -o /tmp/edge.deb -L "https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/microsoft-edge-stable_${EDGE_VERSION}_amd64.deb"
|
||||
dpkg -I /tmp/edge.deb
|
||||
apt-get install --no-install-recommends -y /tmp/edge.deb
|
||||
echo "**** edge docker tweaks ****"
|
||||
if [ -f /usr/bin/microsoft-edge-stable ]; then
|
||||
mv /usr/bin/microsoft-edge-stable /usr/bin/microsoft-edge-real
|
||||
else
|
||||
mv /usr/bin/microsoft-edge /usr/bin/microsoft-edge-real
|
||||
fi
|
||||
mv /helpers/microsoft-edge-stable /usr/bin/
|
||||
fi
|
||||
|
||||
@@ -2,28 +2,28 @@
|
||||
# shellcheck shell=bash
|
||||
set -e
|
||||
|
||||
declare ingress_user
|
||||
declare ingress_interface
|
||||
declare ingress_port
|
||||
|
||||
ingress_user='admin'
|
||||
if bashio::config.has_value 'ingress_user'; then
|
||||
ingress_user=$(bashio::config 'ingress_user')
|
||||
fi
|
||||
|
||||
ingress_port=$(bashio::addon.ingress_port)
|
||||
ingress_interface=$(bashio::addon.ip_address)
|
||||
|
||||
sed -i "s/%%ingress_user%%/${ingress_user}/g" /etc/nginx/servers/ingress.conf
|
||||
sed -i "s/%%port%%/${ingress_port}/g" /etc/nginx/servers/ingress.conf
|
||||
sed -i "s/%%interface%%/${ingress_interface}/g" /etc/nginx/servers/ingress.conf
|
||||
sed -i "s|%%UIPATH%%|$(bashio::addon.ingress_entry)|g" /etc/nginx/servers/ingress.conf
|
||||
|
||||
# nginx Path
|
||||
NGINX_CONFIG=/etc/nginx/sites-available/ingress.conf
|
||||
SUBFOLDER="$(bashio::addon.ingress_entry)"
|
||||
if [[ -n "${SUBFOLDER}" && "${SUBFOLDER}" != "/" ]]; then
|
||||
[[ "${SUBFOLDER}" == */ ]] || SUBFOLDER="${SUBFOLDER}/"
|
||||
fi
|
||||
|
||||
if [ -d /var/run/s6/container_environment ]; then
|
||||
printf "%s" "${SUBFOLDER}" > /var/run/s6/container_environment/SUBFOLDER
|
||||
fi
|
||||
# Copy template
|
||||
cp /defaults/default.conf "${NGINX_CONFIG}"
|
||||
# Remove ssl part
|
||||
awk -v n=4 '/server/{n--}; n > 0' "${NGINX_CONFIG}" > tmpfile
|
||||
mv tmpfile "${NGINX_CONFIG}"
|
||||
|
||||
# Remove ipv6
|
||||
sed -i '/listen \[::\]/d' "${NGINX_CONFIG}"
|
||||
# Add ingress parameters
|
||||
sed -i "s|3000|$(bashio::addon.ingress_port)|g" "${NGINX_CONFIG}"
|
||||
sed -i '/proxy_buffering/a proxy_set_header Accept-Encoding "";' "${NGINX_CONFIG}"
|
||||
sed -i '/proxy_buffering/a sub_filter_once off;' "${NGINX_CONFIG}"
|
||||
sed -i '/proxy_buffering/a sub_filter_types *;' "${NGINX_CONFIG}"
|
||||
sed -i '/proxy_buffering/a sub_filter "vnc/index.html?autoconnect" "vnc/index.html?path=%%path%%/websockify?autoconnect";' "${NGINX_CONFIG}"
|
||||
sed -i "s|%%path%%|${SUBFOLDER:1}|g" "${NGINX_CONFIG}"
|
||||
|
||||
# Correct image
|
||||
sed -i "s|SUBFOLDERwebsockify|/websockify|g" "${NGINX_CONFIG}"
|
||||
|
||||
# Enable ingress
|
||||
cp "${NGINX_CONFIG}" /etc/nginx/sites-enabled
|
||||
|
||||
22
brave/rootfs/etc/cont-init.d/90-ssl.sh
Normal file
22
brave/rootfs/etc/cont-init.d/90-ssl.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/with-contenv bashio
|
||||
# shellcheck shell=bash
|
||||
set -e
|
||||
|
||||
if bashio::config.true 'use_own_certs'; then
|
||||
bashio::log.green "Using referenced ssl certificates to connect with https. Please remember to open the ssl port in the addon options"
|
||||
CERTFILE="$(bashio::config 'certfile')"
|
||||
KEYFILE="$(bashio::config 'keyfile')"
|
||||
NGINX_CONFIG="/defaults/default.conf"
|
||||
|
||||
#Check if files exist
|
||||
echo "... checking if referenced files exist"
|
||||
if [ -f /ssl/"$CERTFILE" ] && [ -f /ssl/"$KEYFILE" ]; then
|
||||
# Add ssl file
|
||||
sed -i "s|/config/data/ssl/cert.pem|/ssl/$CERTFILE|g" "$NGINX_CONFIG"
|
||||
sed -i "s|/config/data/ssl/cert.key|/ssl/$KEYFILE|g" "$NGINX_CONFIG"
|
||||
echo "... done"
|
||||
else
|
||||
bashio::log.warning "... certificate /ssl/$CERTFILE and /ssl/$KEYFILE and not found, using self-generated certificates"
|
||||
fi
|
||||
|
||||
fi
|
||||
@@ -1,3 +1,3 @@
|
||||
upstream backend {
|
||||
server 127.0.0.1:3001;
|
||||
server 127.0.0.1:8080;
|
||||
}
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
# Run nginx in foreground.
|
||||
# daemon off;
|
||||
|
||||
# This is run inside Docker.
|
||||
user root;
|
||||
|
||||
# Pid storage location.
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
# Set number of worker processes.
|
||||
worker_processes 1;
|
||||
|
||||
# Enables the use of JIT for regular expressions to speed-up their processing.
|
||||
pcre_jit on;
|
||||
|
||||
# Write error log to Hass.io add-on log.
|
||||
error_log /proc/1/fd/1 error;
|
||||
|
||||
# Load allowed environment vars
|
||||
env HASSIO_TOKEN;
|
||||
|
||||
# Load dynamic modules.
|
||||
include /etc/nginx/modules/*.conf;
|
||||
|
||||
# Max num of simultaneous connections by a worker process.
|
||||
events {
|
||||
worker_connections 512;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/includes/mime.types;
|
||||
|
||||
log_format hassio '[$time_local] $status '
|
||||
'$http_x_forwarded_for($remote_addr) '
|
||||
'$request ($http_user_agent)';
|
||||
|
||||
access_log /proc/1/fd/1 hassio;
|
||||
client_max_body_size 4G;
|
||||
default_type application/octet-stream;
|
||||
gzip on;
|
||||
keepalive_timeout 65;
|
||||
sendfile on;
|
||||
server_tokens off;
|
||||
tcp_nodelay on;
|
||||
tcp_nopush on;
|
||||
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
include /etc/nginx/includes/resolver.conf;
|
||||
include /etc/nginx/includes/upstream.conf;
|
||||
|
||||
include /etc/nginx/servers/*.conf;
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
server {
|
||||
listen %%interface%%:%%port%% default_server;
|
||||
include /etc/nginx/includes/server_params.conf;
|
||||
include /etc/nginx/includes/proxy_params.conf;
|
||||
client_max_body_size 0;
|
||||
|
||||
location / {
|
||||
allow 172.30.32.2;
|
||||
deny all;
|
||||
proxy_set_header X-WebAuth-User %%ingress_user%%;
|
||||
proxy_set_header X-Script-Name %%UIPATH%%;
|
||||
|
||||
proxy_buffering off;
|
||||
proxy_ssl_verify off;
|
||||
proxy_ssl_server_name on;
|
||||
proxy_pass https://backend;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/execlineb -S0
|
||||
# ==============================================================================
|
||||
# Take down the S6 supervision tree when Nginx fails
|
||||
# ==============================================================================
|
||||
if { s6-test ${1} -ne 0 }
|
||||
if { s6-test ${1} -ne 256 }
|
||||
|
||||
s6-svscanctl -t /var/run/s6/services
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/usr/bin/with-contenv bashio
|
||||
# shellcheck shell=bash
|
||||
set -e
|
||||
# ==============================================================================
|
||||
|
||||
bashio::net.wait_for 3001 localhost 900
|
||||
|
||||
bashio::log.info "Starting NGinx..."
|
||||
|
||||
exec nginx
|
||||
10
brave/rootfs/helpers/microsoft-edge-stable
Normal file
10
brave/rootfs/helpers/microsoft-edge-stable
Normal file
@@ -0,0 +1,10 @@
|
||||
#! /bin/bash
|
||||
|
||||
BIN=/usr/bin/microsoft-edge-real
|
||||
|
||||
# Run normally on privved containers or modified un non priv
|
||||
${BIN} \
|
||||
--password-store=basic \
|
||||
--no-sandbox \
|
||||
--test-type \
|
||||
"$@" >/dev/null 2>&1
|
||||
BIN
brave/stats.png
Normal file
BIN
brave/stats.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"github_fulltag": "false",
|
||||
"last_update": "15-01-2026",
|
||||
"github_fulltag": "true",
|
||||
"last_update": "2026-01-14",
|
||||
"repository": "alexbelgium/hassio-addons",
|
||||
"slug": "brave",
|
||||
"slug": "webtop",
|
||||
"source": "github",
|
||||
"upstream_repo": "linuxserver/docker-brave",
|
||||
"upstream_version": "1.85.120-ls68"
|
||||
"upstream_repo": "linuxserver/docker-webtop",
|
||||
"upstream_version": "4.16-r0-ls93"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user