feat(cloudflare): 支持管理员创建临时邮箱
This commit is contained in:
+35
-15
@@ -174,6 +174,8 @@ def cloudflare_build_headers(content_type=False):
|
||||
if key:
|
||||
if mode == "x-api-key":
|
||||
headers["X-API-Key"] = key
|
||||
elif mode == "x-admin-auth":
|
||||
headers["x-admin-auth"] = key
|
||||
elif mode != "none":
|
||||
headers["Authorization"] = f"Bearer {key}"
|
||||
return headers
|
||||
@@ -188,6 +190,22 @@ def cloudflare_apply_auth_params(params=None):
|
||||
return merged
|
||||
|
||||
|
||||
def cloudflare_next_default_domain():
|
||||
"""按配置轮换选择 Cloudflare 临时邮箱域名。"""
|
||||
global _cf_domain_index
|
||||
domains = [x.strip() for x in str(config.get("defaultDomains", "") or "").split(",") if x.strip()]
|
||||
if not domains:
|
||||
return ""
|
||||
domain = domains[_cf_domain_index % len(domains)]
|
||||
_cf_domain_index += 1
|
||||
return domain
|
||||
|
||||
|
||||
def cloudflare_is_admin_create_path(path):
|
||||
"""判断当前创建邮箱路径是否为 cloudflare_temp_email 管理员创建接口。"""
|
||||
return str(path or "").rstrip("/").lower() == "/admin/new_address"
|
||||
|
||||
|
||||
def _pick_list_payload(data):
|
||||
if isinstance(data, list):
|
||||
return data
|
||||
@@ -208,19 +226,22 @@ def _pick_list_payload(data):
|
||||
|
||||
|
||||
def cloudflare_create_temp_address(api_base):
|
||||
"""适配 cloudflare_temp_email v1.8.x: POST /api/new_address -> {address,jwt}"""
|
||||
global _cf_domain_index
|
||||
url = f"{api_base}/api/new_address"
|
||||
payload = {}
|
||||
try:
|
||||
# 在多个域名之间轮换,降低单域偶发不收件导致的失败率
|
||||
domains = [x.strip() for x in str(config.get("defaultDomains", "") or "").split(",") if x.strip()]
|
||||
if domains:
|
||||
payload["domain"] = domains[_cf_domain_index % len(domains)]
|
||||
_cf_domain_index += 1
|
||||
except Exception:
|
||||
pass
|
||||
resp = http_post(url, json=payload, headers={"Content-Type": "application/json"})
|
||||
"""适配 cloudflare_temp_email 新建地址接口并兼容 admin 创建模式。"""
|
||||
path = get_cloudflare_path("cloudflare_path_accounts", "/api/new_address")
|
||||
url = f"{api_base}{path}"
|
||||
domain = cloudflare_next_default_domain()
|
||||
is_admin_create = cloudflare_is_admin_create_path(path)
|
||||
if is_admin_create:
|
||||
payload = {"name": generate_username(10), "enablePrefix": True}
|
||||
if domain:
|
||||
payload["domain"] = domain
|
||||
headers = cloudflare_build_headers(content_type=True)
|
||||
else:
|
||||
payload = {}
|
||||
if domain:
|
||||
payload["domain"] = domain
|
||||
headers = {"Content-Type": "application/json"}
|
||||
resp = http_post(url, json=payload, headers=headers)
|
||||
resp.raise_for_status()
|
||||
try:
|
||||
data = resp.json()
|
||||
@@ -2480,7 +2501,7 @@ class GrokRegisterGUI:
|
||||
add_label(2, 2, "Cloudflare 鉴权模式:")
|
||||
self.cloudflare_auth_mode_var = tk.StringVar(value=config.get("cloudflare_auth_mode", "bearer"))
|
||||
self.cloudflare_auth_mode_combo = tk_option_menu(
|
||||
config_frame, self.cloudflare_auth_mode_var, ["query-key", "bearer", "x-api-key", "none"], width=12
|
||||
config_frame, self.cloudflare_auth_mode_var, ["query-key", "bearer", "x-api-key", "x-admin-auth", "none"], width=12
|
||||
)
|
||||
add_field(self.cloudflare_auth_mode_combo, 2, 3, sticky=tk.W)
|
||||
|
||||
@@ -2989,4 +3010,3 @@ def main():
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user