@@ -31,13 +31,10 @@ var GlobalAccessController = &AccessController{}
3131
3232// ParseDockerImage 解析Docker镜像名称
3333func (ac * AccessController ) ParseDockerImage (image string ) DockerImageInfo {
34- // 移除可能的协议前缀
3534 image = strings .TrimPrefix (image , "docker://" )
3635
37- // 分离标签
3836 var tag string
3937 if idx := strings .LastIndex (image , ":" ); idx != - 1 {
40- // 检查是否是端口号而不是标签(包含斜杠)
4138 part := image [idx + 1 :]
4239 if ! strings .Contains (part , "/" ) {
4340 tag = part
@@ -48,15 +45,11 @@ func (ac *AccessController) ParseDockerImage(image string) DockerImageInfo {
4845 tag = "latest"
4946 }
5047
51- // 分离命名空间和仓库名
5248 var namespace , repository string
5349 if strings .Contains (image , "/" ) {
54- // 处理自定义registry的情况,如 registry.com/user/repo
5550 parts := strings .Split (image , "/" )
5651 if len (parts ) >= 2 {
57- // 检查第一部分是否是域名(包含.)
5852 if strings .Contains (parts [0 ], "." ) {
59- // 跳过registry域名,取用户名和仓库名
6053 if len (parts ) >= 3 {
6154 namespace = parts [1 ]
6255 repository = parts [2 ]
@@ -65,13 +58,11 @@ func (ac *AccessController) ParseDockerImage(image string) DockerImageInfo {
6558 repository = parts [1 ]
6659 }
6760 } else {
68- // 标准格式:user/repo
6961 namespace = parts [0 ]
7062 repository = parts [1 ]
7163 }
7264 }
7365 } else {
74- // 官方镜像,如 nginx
7566 namespace = "library"
7667 repository = image
7768 }
@@ -171,7 +162,6 @@ func (ac *AccessController) matchImageInList(imageInfo DockerImageInfo, list []s
171162 }
172163 }
173164
174- // 5. 子仓库匹配(防止 user/repo 匹配到 user/repo-fork)
175165 if strings .HasPrefix (fullName , item + "/" ) {
176166 return true
177167 }
@@ -185,7 +175,6 @@ func (ac *AccessController) checkList(matches, list []string) bool {
185175 return false
186176 }
187177
188- // 组合用户名和仓库名,处理.git后缀
189178 username := strings .ToLower (strings .TrimSpace (matches [0 ]))
190179 repoName := strings .ToLower (strings .TrimSpace (strings .TrimSuffix (matches [1 ], ".git" )))
191180 fullRepo := username + "/" + repoName
@@ -196,10 +185,7 @@ func (ac *AccessController) checkList(matches, list []string) bool {
196185 continue
197186 }
198187
199- // 支持多种匹配模式:
200- // 1. 精确匹配: "vaxilu/x-ui"
201- // 2. 用户级匹配: "vaxilu/*" 或 "vaxilu"
202- // 3. 前缀匹配: "vaxilu/x-ui-*"
188+ // 支持多种匹配模式
203189 if fullRepo == item {
204190 return true
205191 }
@@ -225,15 +211,10 @@ func (ac *AccessController) checkList(matches, list []string) bool {
225211 return false
226212}
227213
228- // 🔥 Reload 热重载访问控制规则
214+ // Reload 热重载访问控制规则
229215func (ac * AccessController ) Reload () {
230216 ac .mu .Lock ()
231217 defer ac .mu .Unlock ()
232218
233- // 访问控制器本身不缓存配置,每次检查时都会调用GetConfig()
234- // 所以这里只需要确保锁的原子性,实际的重载在GetConfig()中完成
235- // 可以在这里添加一些初始化逻辑,比如预编译正则表达式等
236-
237- // 目前访问控制器设计为无状态的,每次检查都读取最新配置
238- // 这样设计的好处是配置更新后无需额外处理,自动生效
219+ // 访问控制器本身不缓存配置
239220}
0 commit comments