Skip to content

Commit 2eb8397

Browse files
committed
全新添加 Cloudflare Zero Trust (Cloudflare One) 管理功能
1 parent e222530 commit 2eb8397

77 files changed

Lines changed: 7772 additions & 145 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,5 @@ local.properties
3737

3838
# Backup files
3939
*.zip
40+
# Documentation
41+
ZERO_TRUST_IMPLEMENTATION.md

RELEASE_NOTES_v7.1.md

Lines changed: 0 additions & 46 deletions
This file was deleted.

RELEASE_NOTES_v7.2.md

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
## 🎉 主要更新
2+
3+
### 🆕 新增 Zero Trust 模块
4+
全新添加 Cloudflare Zero Trust (Cloudflare One) 管理功能,支持 Access、Gateway、Devices、Tunnels 四大子模块。
5+
6+
#### 🔐 Access 访问控制
7+
- **应用管理**
8+
- 查看所有 Access 应用列表
9+
- 创建/编辑/删除应用
10+
- 配置应用类型、域名、会话时长等
11+
12+
- **策略管理**
13+
- 为应用配置访问策略
14+
- 支持 Allow/Deny/Bypass 等策略类型
15+
- 配置包含/排除规则
16+
17+
- **访问组管理**
18+
- 创建/编辑/删除访问组
19+
- 配置组成员规则
20+
21+
#### 🛡️ Gateway 网关
22+
- **规则管理**
23+
- 查看所有 Gateway 规则
24+
- 创建/编辑/删除规则
25+
- 支持 DNS/HTTP/Network 规则类型
26+
- 配置规则条件和动作
27+
28+
- **列表管理**
29+
- 创建/编辑/删除 Gateway 列表
30+
- 支持域名、IP、URL 等列表类型
31+
- 添加/删除列表项
32+
33+
- **位置管理**
34+
- 查看所有网络位置
35+
- 创建/编辑/删除位置
36+
- 配置位置网络
37+
38+
#### 🖥️ Devices 设备管理
39+
- **设备列表**
40+
- 查看所有已注册设备
41+
- 设备详情对话框(类型、平台、用户、网络、时间信息)
42+
- 撤销设备访问权限
43+
44+
- **设备策略**
45+
- 创建/编辑/删除设备策略
46+
- 配置策略名称、描述、匹配表达式
47+
- 设置策略优先级
48+
- 启用/禁用策略
49+
50+
#### 🚇 Tunnels 隧道管理
51+
- **隧道列表**
52+
- 查看所有 Cloudflare Tunnel
53+
- 创建/删除隧道
54+
- 显示隧道状态
55+
56+
- **隧道详情**
57+
- 查看隧道 ID、名称、状态、创建时间
58+
- 实时显示连接信息(Colo、客户端版本、Origin IP、连接时间)
59+
60+
- **隧道配置**
61+
- 编辑 Ingress 入口规则(主机名、路径、服务地址)
62+
- 添加/删除入口规则
63+
- 配置 WARP 路由
64+
65+
### 🎨 UI/UX 优化
66+
- **主界面新增 Zero Trust 卡片**
67+
- 位于 D1 数据库卡片下方
68+
- 点击进入 Zero Trust 管理界面
69+
70+
- **Zero Trust 导航界面**
71+
- 四大模块卡片式入口
72+
- TabLayout 分页导航
73+
74+
### 📚 文档更新
75+
- **API 权限说明完善**
76+
- 新增 Zero Trust 相关权限说明
77+
- 账户级别权限:Account Settings、Workers、KV、R2、Pages、D1、Analytics
78+
- Zero Trust 权限:Zero Trust、Access、Gateway、Cloudflare Tunnel
79+
- Zone 级别权限:Zone、DNS
80+
81+
## 📋 技术细节
82+
83+
### 新增文件
84+
**Zero Trust 主模块**
85+
- `ZeroTrustFragment.kt` - Zero Trust 主界面
86+
- `ZeroTrustRepository.kt` - Zero Trust 数据仓库
87+
- `fragment_zero_trust.xml` - 主界面布局
88+
89+
**Access 模块**
90+
- `AccessFragment.kt` - Access 主界面(TabLayout)
91+
- `AccessApplicationsFragment.kt` - 应用列表
92+
- `AccessPoliciesFragment.kt` - 策略列表
93+
- `AccessGroupsFragment.kt` - 访问组列表
94+
- `AccessViewModel.kt` - Access 状态管理
95+
- 相关适配器和布局文件
96+
97+
**Gateway 模块**
98+
- `GatewayFragment.kt` - Gateway 主界面(TabLayout)
99+
- `GatewayRulesFragment.kt` - 规则列表
100+
- `GatewayListsFragment.kt` - 列表管理
101+
- `GatewayLocationsFragment.kt` - 位置管理
102+
- `GatewayViewModel.kt` - Gateway 状态管理
103+
- 相关适配器和布局文件
104+
105+
**Devices 模块**
106+
- `DevicesFragment.kt` - Devices 主界面(TabLayout)
107+
- `DevicesListFragment.kt` - 设备列表
108+
- `DevicePoliciesFragment.kt` - 设备策略
109+
- `DevicesViewModel.kt` - Devices 状态管理
110+
- 相关适配器和布局文件
111+
112+
**Tunnels 模块**
113+
- `TunnelsFragment.kt` - 隧道列表和管理
114+
- `TunnelsViewModel.kt` - Tunnels 状态管理
115+
- `TunnelAdapter.kt` - 隧道列表适配器
116+
- `TunnelConnectionAdapter.kt` - 连接列表适配器
117+
- 相关布局文件
118+
119+
**数据模型**
120+
- `AccessApplication.kt` - Access 应用模型
121+
- `AccessPolicy.kt` - Access 策略模型
122+
- `AccessGroup.kt` - 访问组模型
123+
- `GatewayRule.kt` - Gateway 规则模型
124+
- `GatewayList.kt` - Gateway 列表模型
125+
- `GatewayLocation.kt` - Gateway 位置模型
126+
- `Device.kt` - 设备模型
127+
- `DeviceSettingsPolicy.kt` - 设备策略模型
128+
- `CloudflareTunnel.kt` - 隧道模型
129+
- `TunnelConnection.kt` - 隧道连接模型
130+
- `TunnelConfiguration.kt` - 隧道配置模型
131+
132+
### API 新增
133+
- Access 应用/策略/组 CRUD 接口
134+
- Gateway 规则/列表/位置 CRUD 接口
135+
- Devices 设备/策略 管理接口
136+
- Tunnels 隧道/连接/配置 管理接口
137+
138+
## 🔄 升级建议
139+
- 使用 Zero Trust 功能需要 API Token 具有相应权限
140+
- 建议在关于页面查看完整权限列表并更新 Token
141+
- 不同功能需要不同权限:
142+
- Access: 需要 Access: Apps and Policies 权限
143+
- Gateway: 需要 Gateway 权限
144+
- Devices: 需要 Zero Trust 权限
145+
- Tunnels: 需要 Cloudflare Tunnel 权限
146+
147+
## ⚠️ 已知问题
148+
- 如遇到 403 错误,请检查 API Token 权限配置

ZERO_TRUST_IMPLEMENTATION.md

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -150,16 +150,34 @@ app/src/main/java/com/muort/upworker/
150150
├── access/
151151
│ ├── AccessViewModel.kt # ✨ 新增
152152
│ ├── AccessFragment.kt # ✨ 新增
153+
│ ├── AccessDetailFragment.kt # ✨ 新增:应用详情
153154
│ ├── AccessApplicationAdapter.kt # ✨ 新增
154155
│ ├── fragment_access.xml # ✨ 新增
156+
│ ├── fragment_access_detail.xml # ✨ 新增
155157
│ ├── item_access_application.xml # ✨ 新增
156158
│ └── dialog_create_access_app.xml # ✨ 新增
157159
├── gateway/
158-
│ └── GatewayViewModel.kt # ✨ 新增
160+
│ ├── GatewayViewModel.kt # ✨ 新增
161+
│ ├── GatewayFragment.kt # ✨ 新增:主界面 (TabLayout)
162+
│ ├── GatewayRulesFragment.kt # ✨ 新增:规则管理
163+
│ ├── GatewayListsFragment.kt # ✨ 新增:列表管理
164+
│ ├── GatewayLocationsFragment.kt # ✨ 新增:位置管理
165+
│ ├── GatewayRuleAdapter.kt # ✨ 新增
166+
│ ├── GatewayListAdapter.kt # ✨ 新增
167+
│ ├── GatewayLocationAdapter.kt # ✨ 新增
168+
│ └── GatewayPagerAdapter.kt # ✨ 新增
159169
├── devices/
160-
│ └── DevicesViewModel.kt # ✨ 新增
170+
│ ├── DevicesViewModel.kt # ✨ 新增
171+
│ ├── DevicesFragment.kt # ✨ 新增:主界面 (TabLayout)
172+
│ ├── DevicesListFragment.kt # ✨ 新增:设备列表
173+
│ ├── DevicePoliciesFragment.kt # ✨ 新增:策略管理
174+
│ ├── DeviceAdapter.kt # ✨ 新增
175+
│ ├── DevicePolicyAdapter.kt # ✨ 新增
176+
│ └── DevicesPagerAdapter.kt # ✨ 新增
161177
└── tunnels/
162-
└── TunnelsViewModel.kt # ✨ 新增
178+
├── TunnelsViewModel.kt # ✨ 新增
179+
├── TunnelsFragment.kt # ✨ 新增:隧道管理
180+
└── TunnelAdapter.kt # ✨ 新增
163181
```
164182

165183
---
@@ -214,23 +232,23 @@ Gateway、Devices、Tunnels 模块已创建 ViewModel 基础架构,可继续
214232

215233
## 🔧 下一步扩展建议
216234

217-
### 优先级 1 - 完善 Access 模块
218-
- [ ] 添加应用详情页面
219-
- [ ] 实现策略管理 UI
220-
- [ ] 实现用户组管理 UI
221-
- [ ] 支持更多应用类型(SaaS、SSH 等)
222-
223-
### 优先级 2 - 实现 Gateway UI
224-
- [ ] 创建 Gateway 规则列表界面
225-
- [ ] 实现规则创建表单(支持 DNS/HTTP/L4)
226-
- [ ] 实现自定义列表管理
227-
- [ ] 实现位置管理界面
228-
229-
### 优先级 3 - 完善 Devices 和 Tunnels
230-
- [ ] 设备列表展示
231-
- [ ] 设备策略配置界面
232-
- [ ] Tunnel 列表和状态展示
233-
- [ ] Tunnel 配置编辑器
235+
### ~~优先级 1 - 完善 Access 模块~~ ✅ 已完成
236+
- [x] 添加应用详情页面
237+
- [x] 实现策略管理 UI
238+
- [x] 实现用户组管理 UI
239+
- [x] 支持更多应用类型(SaaS、SSH 等)
240+
241+
### ~~优先级 2 - 实现 Gateway UI~~ ✅ 已完成
242+
- [x] 创建 Gateway 规则列表界面
243+
- [x] 实现规则创建表单(支持 DNS/HTTP/L4)
244+
- [x] 实现自定义列表管理
245+
- [x] 实现位置管理界面
246+
247+
### ~~优先级 3 - 完善 Devices 和 Tunnels~~ ✅ 已完成
248+
- [x] 设备列表展示
249+
- [x] 设备策略配置界面
250+
- [x] Tunnel 列表和状态展示
251+
- [x] Tunnel 创建和删除
234252

235253
### 优先级 4 - 高级功能
236254
- [ ] 支持批量操作

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ android {
3030
applicationId = "com.muort.upworker"
3131
minSdk = 26
3232
targetSdk = 36
33-
versionCode = 2026010701
34-
versionName = "7.1"
33+
versionCode = 2026012201
34+
versionName = "7.2"
3535

3636
vectorDrawables {
3737
useSupportLibrary = true

app/src/main/java/com/muort/upworker/core/model/ZeroTrustModels.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ data class AccessApplicationRequest(
3838
@SerializedName("auto_redirect_to_identity") val autoRedirectToIdentity: Boolean? = null,
3939
@SerializedName("enable_binding_cookie") val enableBindingCookie: Boolean? = null,
4040
@SerializedName("app_launcher_visible") val appLauncherVisible: Boolean? = true,
41-
@SerializedName("cors_headers") val corsHeaders: CorsHeaders? = null
41+
@SerializedName("skip_interstitial") val skipInterstitial: Boolean? = null,
42+
@SerializedName("cors_headers") val corsHeaders: CorsHeaders? = null,
43+
@SerializedName("saas_app") val saasApp: SaasApplication? = null
4244
)
4345

4446
data class CorsHeaders(

app/src/main/java/com/muort/upworker/core/network/CloudFlareApi.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,27 @@ interface CloudFlareApi {
919919
@Body policy: DeviceSettingsPolicyRequest
920920
): Response<CloudFlareResponse<DeviceSettingsPolicy>>
921921

922+
/**
923+
* Update Device Settings Profile
924+
*/
925+
@PATCH("accounts/{account_id}/devices/policy/{policy_id}")
926+
suspend fun updateDevicePolicy(
927+
@Header("Authorization") token: String,
928+
@Path("account_id") accountId: String,
929+
@Path("policy_id") policyId: String,
930+
@Body policy: DeviceSettingsPolicyRequest
931+
): Response<CloudFlareResponse<DeviceSettingsPolicy>>
932+
933+
/**
934+
* Delete Device Settings Profile
935+
*/
936+
@DELETE("accounts/{account_id}/devices/policy/{policy_id}")
937+
suspend fun deleteDevicePolicy(
938+
@Header("Authorization") token: String,
939+
@Path("account_id") accountId: String,
940+
@Path("policy_id") policyId: String
941+
): Response<CloudFlareResponse<List<DeviceSettingsPolicy>>>
942+
922943
// ==================== Zero Trust - Tunnels ====================
923944

924945
/**

app/src/main/java/com/muort/upworker/core/repository/ZeroTrustRepository.kt

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,59 @@ class ZeroTrustRepository @Inject constructor(
938938
}
939939
}
940940

941+
/**
942+
* Update a device policy
943+
*/
944+
suspend fun updateDevicePolicy(
945+
account: Account,
946+
policyId: String,
947+
request: DeviceSettingsPolicyRequest
948+
): Resource<DeviceSettingsPolicy> =
949+
withContext(Dispatchers.IO) {
950+
safeApiCall {
951+
val response = api.updateDevicePolicy(
952+
token = "Bearer ${account.token}",
953+
accountId = account.accountId,
954+
policyId = policyId,
955+
policy = request
956+
)
957+
if (response.isSuccessful && response.body()?.success == true) {
958+
val policy = response.body()!!.result!!
959+
Timber.d("Updated device policy: ${policy.name}")
960+
Resource.Success(policy)
961+
} else {
962+
val errorMsg = response.body()?.errors?.firstOrNull()?.message
963+
?: "Failed to update policy"
964+
Resource.Error(errorMsg)
965+
}
966+
}
967+
}
968+
969+
/**
970+
* Delete a device policy
971+
*/
972+
suspend fun deleteDevicePolicy(
973+
account: Account,
974+
policyId: String
975+
): Resource<Boolean> =
976+
withContext(Dispatchers.IO) {
977+
safeApiCall {
978+
val response = api.deleteDevicePolicy(
979+
token = "Bearer ${account.token}",
980+
accountId = account.accountId,
981+
policyId = policyId
982+
)
983+
if (response.isSuccessful && response.body()?.success == true) {
984+
Timber.d("Deleted device policy: $policyId")
985+
Resource.Success(true)
986+
} else {
987+
val errorMsg = response.body()?.errors?.firstOrNull()?.message
988+
?: "Failed to delete policy"
989+
Resource.Error(errorMsg)
990+
}
991+
}
992+
}
993+
941994
// ==================== Cloudflare Tunnels ====================
942995

943996
/**

0 commit comments

Comments
 (0)