Files
ghproxy/auth/ipfilter.go
2025-07-22 16:37:59 +08:00

61 lines
1.6 KiB
Go

package auth
import (
"fmt"
"ghproxy/config"
"os"
"github.com/go-json-experiment/json"
"github.com/go-json-experiment/json/jsontext"
)
func ReadIPFilterList(cfg *config.Config) (whitelist []string, blacklist []string, err error) {
if cfg.IPFilter.IPFilterFile == "" {
return nil, nil, nil
}
// 检查文件是否存在, 不存在则创建空json
if _, err := os.Stat(cfg.IPFilter.IPFilterFile); os.IsNotExist(err) {
if err := CreateEmptyIPFilterFile(cfg.IPFilter.IPFilterFile); err != nil {
return nil, nil, fmt.Errorf("failed to create empty IP filter file: %w", err)
}
}
data, err := os.ReadFile(cfg.IPFilter.IPFilterFile)
if err != nil {
return nil, nil, fmt.Errorf("failed to read IP filter file: %w", err)
}
var ipFilterData struct {
AllowList []string `json:"allow"`
BlockList []string `json:"block"`
}
if err := json.Unmarshal(data, &ipFilterData); err != nil {
return nil, nil, fmt.Errorf("invalid IP filter file format: %w", err)
}
return ipFilterData.AllowList, ipFilterData.BlockList, nil
}
// 创建空列表json
func CreateEmptyIPFilterFile(filePath string) error {
emptyData := struct {
AllowList []string `json:"allow"`
BlockList []string `json:"block"`
}{
AllowList: []string{},
BlockList: []string{},
}
jsonData, err := json.Marshal(emptyData, jsontext.Multiline(true), jsontext.WithIndent(" "))
if err != nil {
return fmt.Errorf("failed to marshal empty IP filter data: %w", err)
}
err = os.WriteFile(filePath, jsonData, 0644)
if err != nil {
return fmt.Errorf("failed to write empty IP filter file: %w", err)
}
return nil
}