Files
Charon/backend/internal/security/whitelist.go
GitHub Actions 3169b05156 fix: skip incomplete system log viewer tests
- Marked 12 tests as skip pending feature implementation
- Features tracked in GitHub issue #686 (system log viewer feature completion)
- Tests cover sorting by timestamp/level/method/URI/status, pagination controls, filtering by text/level, download functionality
- Unblocks Phase 2 at 91.7% pass rate to proceed to Phase 3 security enforcement validation
- TODO comments in code reference GitHub #686 for feature completion tracking
- Tests skipped: Pagination (3), Search/Filter (2), Download (2), Sorting (1), Log Display (4)
2026-02-09 21:55:55 +00:00

62 lines
1.4 KiB
Go

package security
import (
"net"
"strings"
"github.com/Wikid82/charon/backend/internal/util"
)
// IsIPInCIDRList returns true if clientIP matches any CIDR or IP in the list.
// The list is a comma-separated string of CIDRs and/or IPs.
func IsIPInCIDRList(clientIP, cidrList string) bool {
if strings.TrimSpace(cidrList) == "" {
return false
}
canonical := util.CanonicalizeIPForSecurity(clientIP)
ip := net.ParseIP(canonical)
if ip == nil {
return false
}
parts := strings.Split(cidrList, ",")
for _, part := range parts {
entry := strings.TrimSpace(part)
if entry == "" {
continue
}
if parsed := net.ParseIP(entry); parsed != nil {
// Fix for Issue 1: Canonicalize entry to support mixed IPv4/IPv6 loopback matching
// This ensures that "::1" in the list matches "127.0.0.1" (from canonicalized client IP)
if canonEntry := util.CanonicalizeIPForSecurity(entry); canonEntry != "" {
if p := net.ParseIP(canonEntry); p != nil {
parsed = p
}
}
if ip.Equal(parsed) {
return true
}
continue
}
_, cidr, err := net.ParseCIDR(entry)
if err != nil {
continue
}
if cidr.Contains(ip) {
return true
}
// Fix for Issue 1: Handle IPv6 loopback CIDR matching against canonicalized IPv4 localhost
// If client is 127.0.0.1 (canonical localhost) and CIDR contains ::1, allow it
if ip.Equal(net.IPv4(127, 0, 0, 1)) && cidr.Contains(net.IPv6loopback) {
return true
}
}
return false
}