1010import hmac
1111import hashlib
1212import logging
13+ import fnmatch
1314from typing import Optional , Dict , Any , List
1415
1516from fastapi import Request , HTTPException , Header
1617
1718logger = logging .getLogger (__name__ )
1819
19- def match_repository ( repo_name : str , pattern : str ) -> bool :
20+ def match_pattern ( value : str , pattern : str ) -> bool :
2021 """
21- 检查仓库名是否匹配配置中的模式
22- 支持大小写不敏感匹配和通配符(用户名/*)形式
22+ 检查字符串是否匹配配置中的模式
23+ 支持大小写不敏感匹配和通配符模式
2324
2425 Args:
25- repo_name: 实际的仓库全名 (例如 'user/repo')
26- pattern: 配置中的仓库模式 (例如 'user/repo' 或 'user/*')
26+ value: 要匹配的字符串 (例如 'user/repo' 或 'main')
27+ pattern: 配置中的模式 (例如 'user/*', 'feature/*')
28+ treat_star_as_all: 是否将单独的 "*" 视为匹配所有内容(用于分支匹配)
2729
2830 Returns:
2931 bool: 是否匹配
3032 """
31- if not repo_name or not pattern :
33+ if not value or not pattern :
3234 return False
3335
34- repo_name = repo_name .lower ()
36+ value = value .lower ()
3537 pattern = pattern .lower ()
3638
37- if pattern .endswith ('/*' ):
38- user = pattern [:- 2 ]
39- return repo_name .startswith (f"{ user } /" )
39+ # 分支匹配特殊情况:单独的 "*" 匹配所有内容
40+ if pattern == "*" :
41+ return True
42+
43+ if '*' in pattern or '?' in pattern or '[' in pattern :
44+ return fnmatch .fnmatch (value , pattern )
4045
41- return repo_name == pattern
46+ return value == pattern
4247
4348async def verify_signature (
4449 request : Request ,
@@ -58,7 +63,7 @@ async def verify_signature(
5863
5964 webhook_secret = None
6065 for webhook in webhooks :
61- if any (match_repository (repo_name , repo_pattern ) for repo_pattern in webhook .REPO ):
66+ if any (match_pattern (repo_name , repo_pattern ) for repo_pattern in webhook .REPO ):
6267 webhook_secret = webhook .SECRET
6368 break
6469
@@ -101,12 +106,16 @@ def find_matching_webhook(
101106 匹配的 webhook 配置或 None
102107 """
103108 for webhook in webhooks :
104- repo_matches = any (match_repository (repo_name , repo_pattern )
105- for repo_pattern in webhook .REPO )
109+ # 检查仓库名是否匹配配置中的任一模式
110+ repo_matches = any (match_pattern (repo_name , repo_pattern )
111+ for repo_pattern in webhook .REPO )
112+
113+ # 检查分支名是否匹配配置中的任一模式
114+ branch_matches = any (match_pattern (branch , branch_pattern )
115+ for branch_pattern in webhook .BRANCH )
106116
107- if (repo_matches and
108- branch in webhook .BRANCH and
109- event_type in webhook .EVENTS ):
117+ # 检查事件类型是否匹配
118+ if (repo_matches and branch_matches and event_type in webhook .EVENTS ):
110119 return webhook
111120
112121 return None
0 commit comments