From dc8f4a28e9a48f55c2a939e3c4991e314c7854d9 Mon Sep 17 00:00:00 2001 From: WJQSERVER Date: Tue, 8 Oct 2024 05:28:56 +0800 Subject: [PATCH] 24w11a --- CHANGELOG.md | 35 ++++++++++++++++++++++++++++++---- DEV-VERSION | 2 +- auth/blacklist.go | 10 +++++----- auth/whitelist.go | 44 +++++++++++++++++++++++++++++++++++++++++++ config/config.go | 5 +++++ config/config.yaml | 7 ++++++- config/whitelist.json | 8 ++++++++ main.go | 5 +++-- proxy/proxy.go | 9 +++++++++ 9 files changed, 112 insertions(+), 13 deletions(-) create mode 100644 auth/whitelist.go create mode 100644 config/whitelist.json diff --git a/CHANGELOG.md b/CHANGELOG.md index ed7fc11..9e9adc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # 更新日志 +24w11a +--- +- PRE-RELEASE: 此版本是v1.4.0的预发布版本,请勿在生产环境中使用 +- **ANNOUNCE**: 自此版本起,DEV版本号格式进行修改,小版本号不再仅限于a/b,而是采用字母表顺序进行排列,此修改将带来一个重要改变,正式版前的预发布版本的数字版本号将会统一,以便于版本管理与发布管理 +- CHANGE: 优化代码结构,提升性能 +- ADD: 新增auth子模块whitelist.go,支持白名单功能 +- ADD: 新增whitelist.json文件,用于配置白名单 +- FIX: 由于新加入未在原开发路线上计划的白名单功能,导致函数命名冲突,在此修复blacklist.go的函数命名问题 + v1.3.1 --- - CHANGE: 优化代码结构,提升性能 @@ -8,6 +17,7 @@ v1.3.1 24w10a --- +- PRE-RELEASE: 此版本是v1.3.1的预发布版本,请勿在生产环境中使用 - CHANGE: 优化代码结构,提升性能 - CHANGE: 剃刀计划,减少多余日志输出 - CHANGE: 调整缓存参数 @@ -24,12 +34,14 @@ v1.3.0 24w09b --- +- PRE-RELEASE: 此版本是v1.3.0的预发布版本,请勿在生产环境中使用 - CHANGE: 优化代码结构,提升性能 - CHANGE: 修正配置,提升稳定性 - WARNING: 此版本配置文件重构,此版本不再向前兼容,请注意备份文件并重新部署 24w09a --- +- PRE-RELEASE: 此版本是v1.3.0的预发布版本,请勿在生产环境中使用 - CHANGE: 优化代码结构,提升性能 - CHANGE: 优化黑名单功能,提升稳定性 - CHANGE&ADD: 新增auth子模块blacklist.go @@ -38,6 +50,7 @@ v1.3.0 24w08b --- +- PRE-RELEASE: 此版本是v1.3.0的预发布版本,请勿在生产环境中使用 - CHANGE: 优化代码结构,提升性能 - ADD & CHANGE: 新增仓库黑名单功能,改进Auth模块 - ADD: 新增blacklist.yaml文件,用于配置仓库黑名单 @@ -54,6 +67,7 @@ v1.2.0 24w08a --- +- PRE-RELEASE: 此版本是v1.2.0的预发布版本,请勿在生产环境中使用 - CHANGE: 同步更新logger模块,与golang-temp项目定义的开发规范保持一致 - ADD: 新增日志翻转功能 @@ -65,12 +79,14 @@ v1.1.1 24w07b --- +- PRE-RELEASE: 此版本是v1.1.1的预发布版本,请勿在生产环境中使用 - CHANGE: 修改部分代码,与golang-temp项目定义的开发规范保持一致 - CHANGE: 更新Go版本至v1.23.2 - CHANGE: 跟随Caddy更新,修改Caddyfile配置 24w07a --- +- PRE-RELEASE: 此版本是v1.1.1的预发布版本,请勿在生产环境中使用 - CHANGE: 修改部分代码,与golang-temp项目定义的开发规范保持一致 - CHANGE: 更新Go版本至v1.23.2 @@ -85,6 +101,7 @@ v1.1.0 24w06b --- +- PRE-RELEASE: 此版本是v1.1.0的预发布版本,请勿在生产环境中使用 - CHANGE: 优化代码结构,对main函数进行模块化,提升可读性 - CHANGE: Docker代理功能移至DEV版本内,保证稳定性 - ADD&CHANGE: 增加Auth(用户鉴权)模块,并改进其的错误处理与日志记录 @@ -94,6 +111,7 @@ v1.1.0 v1.0.0 --- +- **ANNOUNCE**: 项目正式发布, 并迁移至[WJQSERVER-STUDIO/ghproxy](https://github.com/WJQSERVER-STUDIO/ghproxy),由Apache License Version 2.0转为WJQserver Studio License 请注意相关条例变更 - CHANGE: 项目正式发布, 并迁移至[WJQSERVER-STUDIO/ghproxy](https://github.com/WJQSERVER-STUDIO/ghproxy) - CHANGE: 再次重构代码,优化性能,提升稳定性 - CHANGE: 使用golang-temp项目作为底层构建,标准化日志与配置模块 @@ -101,6 +119,7 @@ v1.0.0 24w06a --- +- PRE-RELEASE: 此版本是v1.0.0的预发布版本,请勿在生产环境中使用 - CHANGE: 与v1.0.0版本同步 v0.2.0 @@ -112,21 +131,25 @@ v0.2.0 24w05b --- +- PRE-RELEASE: 此版本是v0.2.0的预发布版本,请勿在生产环境中使用 - CHANGE: 重命名proxychrome函数 - ADD: 增加多处日志记录,便于审计与排障 24w05a --- +- PRE-RELEASE: 此版本是v0.2.0的预发布版本,请勿在生产环境中使用 - FIX: 修正上一版本的req请求未继承请求方式的问题 - CHANGE: 优化代码结构,进一步模块化,同时提升性能 24w04b --- +- PRE-RELEASE: 此版本是v0.2.0的预发布版本,请勿在生产环境中使用 - CHANGE: 更换Docker基础镜像为daily版本 - ADD: 新增使用req库实现代理请求,使用chrome TLS指纹发起请求 24w04a --- +- PRE-RELEASE: 此版本是v0.2.0的预发布版本,请勿在生产环境中使用 - CHANGE: 调整程序结构,使用init函数初始化配置,并优化代码结构 v0.1.7 @@ -135,6 +158,7 @@ v0.1.7 24w03b --- +- PRE-RELEASE: 此版本是v0.1.7的预发布版本,请勿在生产环境中使用 - CHANGE: 合入上游(wjqserver/caddy:latest)安全更新, 增强镜像安全性 v0.1.6 @@ -144,6 +168,7 @@ v0.1.6 24w03a --- +- PRE-RELEASE: 此版本是v0.1.6的预发布版本,请勿在生产环境中使用 - CHANGE: 改进Docker代理相关Caddy配置 - ADD: 新增跨域配置选项 @@ -154,16 +179,17 @@ v0.1.5 24w02b --- +- PRE-RELEASE: 此版本是v0.1.5的预发布版本,请勿在生产环境中使用 - ADD: 新增Docker代理 (未并入正式版) 24w02a --- +- PRE-RELEASE: 此版本是v0.1.5的预发布版本,请勿在生产环境中使用 - CHANGE: 更新Go版本至v1.23.1 - CHANGE: 优化代码行为 v0.1.4 --- -正式版24w01b内容更新 - ADD: 新增外部文件配置功能 - ADD: 新增日志功能 - CHANGE: 优化代码结构,提升性能 @@ -171,7 +197,7 @@ v0.1.4 24w01b --- -标志着项目正式进入自主开发阶段 +- PRE-RELEASE: 此版本是v0.1.4的预发布版本,请勿在生产环境中使用 - ADD: 新增外部文件配置功能 - ADD: 新增日志功能 - CHANGE: 优化代码结构,提升性能 @@ -179,12 +205,13 @@ v0.1.4 v0.1.3 --- -开始自行维护项目,脱离上游更新 +- **ANNOUNCE**: 开始自行维护项目,脱离上游更新 - CHANGE: 改进已有实现,增强程序稳定性 24w01a --- -首个DEV版本 +- PRE-RELEASE: 此版本是v0.1.3的预发布版本,请勿在生产环境中使用 +- **ANNOUNCE**: 首个DEV版本发布 - CHANGE: 同步更新 v0.1.2 diff --git a/DEV-VERSION b/DEV-VERSION index 77febf4..ded078f 100644 --- a/DEV-VERSION +++ b/DEV-VERSION @@ -1 +1 @@ -24w10a \ No newline at end of file +24w11a \ No newline at end of file diff --git a/auth/blacklist.go b/auth/blacklist.go index edeb9c5..830537f 100644 --- a/auth/blacklist.go +++ b/auth/blacklist.go @@ -6,19 +6,19 @@ import ( "os" ) -type Config struct { +type BlacklistConfig struct { Blacklist []string `json:"blacklist"` } var ( cfg *config.Config blacklistfile = "/data/ghproxy/config/blacklist.json" - blacklist *Config + blacklist *BlacklistConfig ) func LoadBlacklist(cfg *config.Config) { blacklistfile = cfg.Blacklist.BlacklistFile - blacklist = &Config{} + blacklist = &BlacklistConfig{} data, err := os.ReadFile(blacklistfile) if err != nil { @@ -32,10 +32,10 @@ func LoadBlacklist(cfg *config.Config) { } func CheckBlacklist(fullrepo string) bool { - return forRangeCheck(blacklist.Blacklist, fullrepo) + return forRangeCheckBlacklist(blacklist.Blacklist, fullrepo) } -func forRangeCheck(blist []string, fullrepo string) bool { +func forRangeCheckBlacklist(blist []string, fullrepo string) bool { for _, blocked := range blist { if blocked == fullrepo { return true diff --git a/auth/whitelist.go b/auth/whitelist.go new file mode 100644 index 0000000..326b3aa --- /dev/null +++ b/auth/whitelist.go @@ -0,0 +1,44 @@ +package auth + +import ( + "encoding/json" + "ghproxy/config" + "os" +) + +type WhitelistConfig struct { + Whitelist []string `json:"whitelist"` +} + +var ( + whitelistfile = "/data/ghproxy/config/whitelist.json" + whitelist *WhitelistConfig +) + +func LoadWhitelist(cfg *config.Config) { + whitelistfile = cfg.Whitelist.WhitelistFile + whitelist = &WhitelistConfig{} + + data, err := os.ReadFile(whitelistfile) + if err != nil { + logw("Failed to read whitelist file: %v", err) + } + + err = json.Unmarshal(data, whitelist) + if err != nil { + logw("Failed to unmarshal whitelist JSON: %v", err) + } +} + +func CheckWhitelist(fullrepo string) bool { + return forRangeCheckWhitelist(whitelist.Whitelist, fullrepo) +} + +func forRangeCheckWhitelist(blist []string, fullrepo string) bool { + for _, blocked := range blist { + if blocked == fullrepo { + return true + } + } + return false +} diff --git a/config/config.go b/config/config.go index 1a98a98..2acfc51 100644 --- a/config/config.go +++ b/config/config.go @@ -31,6 +31,11 @@ type Config struct { Enabled bool `yaml:"enabled"` BlacklistFile string `yaml:"blacklistfile"` } `yaml:"blacklist"` + + Whitelist struct { + Enabled bool `yaml:"enabled"` + WhitelistFile string `yaml:"whitelistfile"` + } `yaml:"whitelist"` } // LoadConfig 从 YAML 配置文件加载配置 diff --git a/config/config.yaml b/config/config.yaml index f64a3b7..21bc68b 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -20,5 +20,10 @@ auth: # Blacklist Configuration blacklist: - enabled: true + enabled: false blacklistfile: "/data/ghproxy/config/blacklist.json" + +# Whitelist Configuration +whitelist: + enabled: false + whitelistfile: "/data/ghproxy/config/whitelist.json" \ No newline at end of file diff --git a/config/whitelist.json b/config/whitelist.json new file mode 100644 index 0000000..ca3c8bc --- /dev/null +++ b/config/whitelist.json @@ -0,0 +1,8 @@ +{ + "whitelist": [ + "test/test1", + "example/repo2", + "another/repo3" + ] + } + \ No newline at end of file diff --git a/main.go b/main.go index e3f7eb0..f74322d 100644 --- a/main.go +++ b/main.go @@ -53,14 +53,15 @@ func setupLogger() { logw("Init Completed") } -func LoadBlacklist(cfg *config.Config) { +func Loadlist(cfg *config.Config) { auth.LoadBlacklist(cfg) + auth.LoadWhitelist(cfg) } func init() { loadConfig() setupLogger() - LoadBlacklist(cfg) + Loadlist(cfg) // 设置 Gin 模式 gin.SetMode(gin.ReleaseMode) diff --git a/proxy/proxy.go b/proxy/proxy.go index defca01..804f4e6 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -55,6 +55,15 @@ func NoRouteHandler(cfg *config.Config) gin.HandlerFunc { logw("Blacklist Check > Username: %s, Repo: %s", username, repo) fullrepo := fmt.Sprintf("%s/%s", username, repo) + // 白名单检查 + whitelistpass := auth.CheckWhitelist(fullrepo) + if !whitelistpass { + errMsg := fmt.Sprintf("Whitelist Blocked repo: %s", fullrepo) + c.JSON(http.StatusForbidden, gin.H{"error": errMsg}) + logw(errMsg) + return + } + // 黑名单检查 blacklistpass := auth.CheckBlacklist(fullrepo) if blacklistpass {