entari-plugin-permission 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ARCLET
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,319 @@
1
+ Metadata-Version: 2.4
2
+ Name: entari-plugin-permission
3
+ Version: 0.1.0
4
+ Summary: Permission system for Entari based on Cithun
5
+ Author-email: RF-Tar-Railt <rf_tar_railt@qq.com>
6
+ License: MIT
7
+ Requires-Python: >=3.10
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: arclet-entari>=0.18.0rc2
11
+ Requires-Dist: arclet-cithun<1.5.0,>=1.4.0
12
+ Requires-Dist: entari-plugin-user>=0.1.6
13
+ Requires-Dist: entari-plugin-database>=0.3.1
14
+ Dynamic: license-file
15
+
16
+ # entari-plugin-permission
17
+
18
+ 基于 [`arclet-cithun`](https://github.com/ArcletProject/Arclet) 的 Entari 权限插件。
19
+
20
+ 它提供了一套可持久化的权限、角色、继承链与 Track(权限路径)管理能力,并为 Entari 指令系统提供了现成的权限校验与管理命令。
21
+
22
+ ## 功能特性
23
+
24
+ - 用户 / 角色权限管理,数据持久化到数据库
25
+ - 角色继承与用户继承角色
26
+ - Track(权限路径)管理:创建、删除、查看、增删等级、重命名、清空
27
+ - 支持 `chmod` 风格的权限设置快捷写法
28
+ - 支持按资源 ID 注册自定义权限附加策略(`attach`)
29
+ - 提供可直接复用的权限校验工具:`check_permission` / `require_permission`
30
+ - 内置 Entari 管理指令
31
+ - 自动同步用户 `authority` 到内置 `authority` Track
32
+
33
+ ## 依赖环境
34
+
35
+ - Python `>= 3.10`
36
+ - `arclet-entari >= 0.18.0rc2`
37
+ - `arclet-cithun >= 1.4.0, < 1.5.0`
38
+ - `entari-plugin-user >= 0.1.6`
39
+ - `entari-plugin-database >= 0.3.1`
40
+ - 需要启用数据库服务:`database/sqlalchemy`
41
+
42
+ ## 安装
43
+
44
+ ```shell
45
+ pdm add entari-plugin-permission
46
+ ```
47
+
48
+ ## 配置
49
+
50
+ ### 指令前缀
51
+
52
+ 插件默认指令名为 `permission`,可通过配置修改:
53
+
54
+ ```yaml
55
+ # entari.yml
56
+ plugins:
57
+ permission:
58
+ command: permission
59
+ ```
60
+
61
+ 也就是说,默认管理指令前缀为:
62
+
63
+ ```text
64
+ /permission
65
+ ```
66
+
67
+ 如果你把 `command` 改成别的值,那么所有子指令前缀也会随之改变。
68
+
69
+ ## 内置权限模型
70
+
71
+ 插件启动后会创建并使用以下默认角色 / Track:
72
+
73
+ ### 默认角色
74
+
75
+ - `group:default`:默认角色, 所有用户默认继承
76
+
77
+ ### 内置权限角色
78
+
79
+ - `group:authority.1` — `Authority 1`
80
+ - `group:authority.2` — `Authority 2`
81
+ - `group:authority.3` — `Authority 3`
82
+ - `group:authority.4` — `Authority 4`
83
+ - `group:authority.5` — `Authority 5`
84
+
85
+ ### 内置 Track
86
+
87
+ - `authority` — `Authority Track`
88
+
89
+ 其等级名称依次为:
90
+
91
+ 1. `member`
92
+ 2. `advanced-member`
93
+ 3. `admin`
94
+ 4. `senior-admin`
95
+ 5. `superuser`
96
+
97
+ 插件会在启动时建立如下继承关系:
98
+
99
+ ```text
100
+ AUTH_2 -> AUTH_1
101
+ AUTH_3 -> AUTH_2
102
+ AUTH_4 -> AUTH_3
103
+ AUTH_5 -> AUTH_4
104
+ ```
105
+
106
+ 并将 `authority` Track 与这些权限角色关联起来。
107
+
108
+ ## 内置指令
109
+
110
+ 以下指令默认都挂在 `/permission` 下(实际前缀取决于 `Config.command`)。
111
+
112
+ ### 用户权限
113
+
114
+ - `/permission user [@用户] list`
115
+ - 查看用户权限
116
+
117
+ - `/permission user [@用户] set <permission> <state>`
118
+ - 设置权限状态
119
+ - `state` 支持:
120
+ - `true` / `false`
121
+ - `Permission.parse(...)` 支持的权限表达式
122
+ - `chmod` 风格快捷写法
123
+
124
+ - `/permission user [@用户] get <permission>`
125
+ - 查询单个权限状态
126
+
127
+ - `/permission user [@用户] inherit <role> [--cancel]`
128
+ - 继承 / 取消继承某个角色
129
+
130
+ - `/permission user [@用户] promote <track>`
131
+ - 提升指定 Track 的等级
132
+
133
+ - `/permission user [@用户] demote <track>`
134
+ - 降低指定 Track 的等级
135
+
136
+ ### Track 管理
137
+
138
+ - `/permission track <track> info`
139
+ - 查看 Track 信息
140
+
141
+ - `/permission track <track> append <role>`
142
+ - 向 Track 末尾添加等级
143
+
144
+ - `/permission track <track> insert <role> <index>`
145
+ - 在指定位置插入等级
146
+
147
+ - `/permission track <track> remove <role>`
148
+ - 从 Track 移除等级
149
+
150
+ - `/permission track <track> clear`
151
+ - 清空 Track 等级
152
+
153
+ - `/permission track <track> rename <name>`
154
+ - 重命名 Track
155
+
156
+ - `/permission listtrack`
157
+ - 列出所有 Track
158
+
159
+ - `/permission createtrack <track> [name]`
160
+ - 创建 Track
161
+
162
+ - `/permission deletetrack <track>`
163
+ - 删除 Track
164
+
165
+ ### `chmod` 快捷写法
166
+
167
+ 插件内置了一个快捷指令:
168
+
169
+ ```text
170
+ /chmod <expr> <permission>
171
+ ```
172
+
173
+ 它会被自动转换为:
174
+
175
+ ```text
176
+ /permission user set <permission> <expr>
177
+ ```
178
+
179
+ ## 权限点
180
+
181
+ 插件自身的管理指令也有权限控制,主要权限点如下:
182
+
183
+ - `command.permission.list`
184
+ - `command.permission.set`
185
+ - `command.permission.get`
186
+ - `command.permission.inherit`
187
+ - `command.permission.promote`
188
+ - `command.permission.demote`
189
+ - `command.permission.listtrack`
190
+ - `command.permission.createtrack`
191
+ - `command.permission.deletetrack`
192
+ - `command.permission.track.info`
193
+ - `command.permission.track.append`
194
+ - `command.permission.track.insert`
195
+ - `command.permission.track.remove`
196
+ - `command.permission.track.clear`
197
+ - `command.permission.track.rename`
198
+
199
+ 默认预设权限:
200
+
201
+ - `group:default` 对 `command.permission` 拥有 `vma`
202
+ - `AUTH_1` 对 `command.permission.*` 拥有 `VISIT`
203
+ - `AUTH_3` 对 `command.permission.*` 拥有 `VISIT | AVAILABLE`
204
+
205
+ ## 开发者接口
206
+
207
+ 如果你想在自己的插件中复用这套权限系统,可以直接导入下列对象:
208
+
209
+ ```python
210
+ from entari_plugin_permission import (
211
+ system,
212
+ Permission,
213
+ UserOwner,
214
+ check_permission,
215
+ require_permission,
216
+ AUTH_1,
217
+ AUTH_2,
218
+ AUTH_3,
219
+ AUTH_4,
220
+ AUTH_5,
221
+ AUTHORITY,
222
+ )
223
+ ```
224
+
225
+ ### `system`
226
+
227
+ `system` 是权限系统的核心实例,已经集成:
228
+
229
+ - `AsyncPermissionService`
230
+ - `AsyncPermissionExecutor`
231
+ - ORM 持久化存储
232
+
233
+ 常用能力包括:
234
+
235
+ - `system.pre_role(...)`
236
+ - `system.pre_track(...)`
237
+ - `system.pre_assign(...)`
238
+ - `system.attach(...)`
239
+ - `system.get_or_create_user(...)`
240
+ - `system.get_role(...)`
241
+ - `system.get_track(...)`
242
+
243
+ ### `check_permission(...)`
244
+
245
+ 返回一个异步检查函数,可用于 `enter_if`、`Depends` 等场景。
246
+
247
+ ```python
248
+ from entari_plugin_permission import check_permission
249
+
250
+
251
+ checker = check_permission("command.foo", prompt=True)
252
+ ```
253
+
254
+ ### `require_permission(...)`
255
+
256
+ 这是 `Propagator` 封装,适合直接挂到 `propagate(...)` 上:
257
+
258
+ ```python
259
+ from arclet.letoderea import propagate
260
+ from entari_plugin_permission import require_permission
261
+
262
+
263
+ @propagate(require_permission("command.foo", prompt=True))
264
+ async def handler() -> None:
265
+ ...
266
+ ```
267
+
268
+ ### `UserOwner`
269
+
270
+ `UserOwner` 是一个可直接注入的类型别名,会自动从当前会话取出对应的 Cithun `User` 对象。
271
+
272
+ ## 自定义资源权限附加
273
+
274
+ 你可以通过 `system.attach(...)` 为某类资源动态追加权限:
275
+
276
+ - `pattern` 可以是字符串
277
+ - 精确匹配
278
+ - glob 通配:`*`、`?`、`[]`
279
+ - 也可以是自定义谓词函数 `Callable[[str], bool]`
280
+
281
+ 回调返回值支持:
282
+
283
+ - 直接返回 `Permission`:表示追加允许权限
284
+ - 返回 `(Permission, "+")`:追加
285
+ - 返回 `(Permission, "-")`:移除
286
+ - 返回 `(Permission, "=")`:覆盖
287
+
288
+ ## 事件
289
+
290
+ 插件定义了一个事件:
291
+
292
+ - `UserSetTrackLevel`
293
+
294
+ 当用户 Track 等级变化时会发布该事件,适合做外部同步或审计。
295
+
296
+ ## 示例
297
+
298
+ 仓库里的 `example_plugin.py` 展示了一个完整用法:
299
+
300
+ - 定义了一个自定义权限 `command.mask`
301
+ - 创建了 `mask_track`
302
+ - 通过 `system.pre_assign(...)` 给不同权限角色分配该权限
303
+ - 在指令执行前使用 `require_permission(...)` 做校验
304
+
305
+ 如果你需要在自己的插件里增加权限控制,通常可以按下面的模式写:
306
+
307
+ ```python
308
+ from arclet.cithun import Permission
309
+ from entari_plugin_permission import AUTH_1, AUTH_3, require_permission, system
310
+
311
+
312
+ system.pre_assign(system.default_role, "command.xxx", Permission("v-a"))
313
+ system.pre_assign(AUTH_1, "command.xxx", Permission.VISIT)
314
+ system.pre_assign(AUTH_3, "command.xxx", Permission.VISIT | Permission.AVAILABLE)
315
+ ```
316
+
317
+ ## 许可证
318
+
319
+ MIT
@@ -0,0 +1,304 @@
1
+ # entari-plugin-permission
2
+
3
+ 基于 [`arclet-cithun`](https://github.com/ArcletProject/Arclet) 的 Entari 权限插件。
4
+
5
+ 它提供了一套可持久化的权限、角色、继承链与 Track(权限路径)管理能力,并为 Entari 指令系统提供了现成的权限校验与管理命令。
6
+
7
+ ## 功能特性
8
+
9
+ - 用户 / 角色权限管理,数据持久化到数据库
10
+ - 角色继承与用户继承角色
11
+ - Track(权限路径)管理:创建、删除、查看、增删等级、重命名、清空
12
+ - 支持 `chmod` 风格的权限设置快捷写法
13
+ - 支持按资源 ID 注册自定义权限附加策略(`attach`)
14
+ - 提供可直接复用的权限校验工具:`check_permission` / `require_permission`
15
+ - 内置 Entari 管理指令
16
+ - 自动同步用户 `authority` 到内置 `authority` Track
17
+
18
+ ## 依赖环境
19
+
20
+ - Python `>= 3.10`
21
+ - `arclet-entari >= 0.18.0rc2`
22
+ - `arclet-cithun >= 1.4.0, < 1.5.0`
23
+ - `entari-plugin-user >= 0.1.6`
24
+ - `entari-plugin-database >= 0.3.1`
25
+ - 需要启用数据库服务:`database/sqlalchemy`
26
+
27
+ ## 安装
28
+
29
+ ```shell
30
+ pdm add entari-plugin-permission
31
+ ```
32
+
33
+ ## 配置
34
+
35
+ ### 指令前缀
36
+
37
+ 插件默认指令名为 `permission`,可通过配置修改:
38
+
39
+ ```yaml
40
+ # entari.yml
41
+ plugins:
42
+ permission:
43
+ command: permission
44
+ ```
45
+
46
+ 也就是说,默认管理指令前缀为:
47
+
48
+ ```text
49
+ /permission
50
+ ```
51
+
52
+ 如果你把 `command` 改成别的值,那么所有子指令前缀也会随之改变。
53
+
54
+ ## 内置权限模型
55
+
56
+ 插件启动后会创建并使用以下默认角色 / Track:
57
+
58
+ ### 默认角色
59
+
60
+ - `group:default`:默认角色, 所有用户默认继承
61
+
62
+ ### 内置权限角色
63
+
64
+ - `group:authority.1` — `Authority 1`
65
+ - `group:authority.2` — `Authority 2`
66
+ - `group:authority.3` — `Authority 3`
67
+ - `group:authority.4` — `Authority 4`
68
+ - `group:authority.5` — `Authority 5`
69
+
70
+ ### 内置 Track
71
+
72
+ - `authority` — `Authority Track`
73
+
74
+ 其等级名称依次为:
75
+
76
+ 1. `member`
77
+ 2. `advanced-member`
78
+ 3. `admin`
79
+ 4. `senior-admin`
80
+ 5. `superuser`
81
+
82
+ 插件会在启动时建立如下继承关系:
83
+
84
+ ```text
85
+ AUTH_2 -> AUTH_1
86
+ AUTH_3 -> AUTH_2
87
+ AUTH_4 -> AUTH_3
88
+ AUTH_5 -> AUTH_4
89
+ ```
90
+
91
+ 并将 `authority` Track 与这些权限角色关联起来。
92
+
93
+ ## 内置指令
94
+
95
+ 以下指令默认都挂在 `/permission` 下(实际前缀取决于 `Config.command`)。
96
+
97
+ ### 用户权限
98
+
99
+ - `/permission user [@用户] list`
100
+ - 查看用户权限
101
+
102
+ - `/permission user [@用户] set <permission> <state>`
103
+ - 设置权限状态
104
+ - `state` 支持:
105
+ - `true` / `false`
106
+ - `Permission.parse(...)` 支持的权限表达式
107
+ - `chmod` 风格快捷写法
108
+
109
+ - `/permission user [@用户] get <permission>`
110
+ - 查询单个权限状态
111
+
112
+ - `/permission user [@用户] inherit <role> [--cancel]`
113
+ - 继承 / 取消继承某个角色
114
+
115
+ - `/permission user [@用户] promote <track>`
116
+ - 提升指定 Track 的等级
117
+
118
+ - `/permission user [@用户] demote <track>`
119
+ - 降低指定 Track 的等级
120
+
121
+ ### Track 管理
122
+
123
+ - `/permission track <track> info`
124
+ - 查看 Track 信息
125
+
126
+ - `/permission track <track> append <role>`
127
+ - 向 Track 末尾添加等级
128
+
129
+ - `/permission track <track> insert <role> <index>`
130
+ - 在指定位置插入等级
131
+
132
+ - `/permission track <track> remove <role>`
133
+ - 从 Track 移除等级
134
+
135
+ - `/permission track <track> clear`
136
+ - 清空 Track 等级
137
+
138
+ - `/permission track <track> rename <name>`
139
+ - 重命名 Track
140
+
141
+ - `/permission listtrack`
142
+ - 列出所有 Track
143
+
144
+ - `/permission createtrack <track> [name]`
145
+ - 创建 Track
146
+
147
+ - `/permission deletetrack <track>`
148
+ - 删除 Track
149
+
150
+ ### `chmod` 快捷写法
151
+
152
+ 插件内置了一个快捷指令:
153
+
154
+ ```text
155
+ /chmod <expr> <permission>
156
+ ```
157
+
158
+ 它会被自动转换为:
159
+
160
+ ```text
161
+ /permission user set <permission> <expr>
162
+ ```
163
+
164
+ ## 权限点
165
+
166
+ 插件自身的管理指令也有权限控制,主要权限点如下:
167
+
168
+ - `command.permission.list`
169
+ - `command.permission.set`
170
+ - `command.permission.get`
171
+ - `command.permission.inherit`
172
+ - `command.permission.promote`
173
+ - `command.permission.demote`
174
+ - `command.permission.listtrack`
175
+ - `command.permission.createtrack`
176
+ - `command.permission.deletetrack`
177
+ - `command.permission.track.info`
178
+ - `command.permission.track.append`
179
+ - `command.permission.track.insert`
180
+ - `command.permission.track.remove`
181
+ - `command.permission.track.clear`
182
+ - `command.permission.track.rename`
183
+
184
+ 默认预设权限:
185
+
186
+ - `group:default` 对 `command.permission` 拥有 `vma`
187
+ - `AUTH_1` 对 `command.permission.*` 拥有 `VISIT`
188
+ - `AUTH_3` 对 `command.permission.*` 拥有 `VISIT | AVAILABLE`
189
+
190
+ ## 开发者接口
191
+
192
+ 如果你想在自己的插件中复用这套权限系统,可以直接导入下列对象:
193
+
194
+ ```python
195
+ from entari_plugin_permission import (
196
+ system,
197
+ Permission,
198
+ UserOwner,
199
+ check_permission,
200
+ require_permission,
201
+ AUTH_1,
202
+ AUTH_2,
203
+ AUTH_3,
204
+ AUTH_4,
205
+ AUTH_5,
206
+ AUTHORITY,
207
+ )
208
+ ```
209
+
210
+ ### `system`
211
+
212
+ `system` 是权限系统的核心实例,已经集成:
213
+
214
+ - `AsyncPermissionService`
215
+ - `AsyncPermissionExecutor`
216
+ - ORM 持久化存储
217
+
218
+ 常用能力包括:
219
+
220
+ - `system.pre_role(...)`
221
+ - `system.pre_track(...)`
222
+ - `system.pre_assign(...)`
223
+ - `system.attach(...)`
224
+ - `system.get_or_create_user(...)`
225
+ - `system.get_role(...)`
226
+ - `system.get_track(...)`
227
+
228
+ ### `check_permission(...)`
229
+
230
+ 返回一个异步检查函数,可用于 `enter_if`、`Depends` 等场景。
231
+
232
+ ```python
233
+ from entari_plugin_permission import check_permission
234
+
235
+
236
+ checker = check_permission("command.foo", prompt=True)
237
+ ```
238
+
239
+ ### `require_permission(...)`
240
+
241
+ 这是 `Propagator` 封装,适合直接挂到 `propagate(...)` 上:
242
+
243
+ ```python
244
+ from arclet.letoderea import propagate
245
+ from entari_plugin_permission import require_permission
246
+
247
+
248
+ @propagate(require_permission("command.foo", prompt=True))
249
+ async def handler() -> None:
250
+ ...
251
+ ```
252
+
253
+ ### `UserOwner`
254
+
255
+ `UserOwner` 是一个可直接注入的类型别名,会自动从当前会话取出对应的 Cithun `User` 对象。
256
+
257
+ ## 自定义资源权限附加
258
+
259
+ 你可以通过 `system.attach(...)` 为某类资源动态追加权限:
260
+
261
+ - `pattern` 可以是字符串
262
+ - 精确匹配
263
+ - glob 通配:`*`、`?`、`[]`
264
+ - 也可以是自定义谓词函数 `Callable[[str], bool]`
265
+
266
+ 回调返回值支持:
267
+
268
+ - 直接返回 `Permission`:表示追加允许权限
269
+ - 返回 `(Permission, "+")`:追加
270
+ - 返回 `(Permission, "-")`:移除
271
+ - 返回 `(Permission, "=")`:覆盖
272
+
273
+ ## 事件
274
+
275
+ 插件定义了一个事件:
276
+
277
+ - `UserSetTrackLevel`
278
+
279
+ 当用户 Track 等级变化时会发布该事件,适合做外部同步或审计。
280
+
281
+ ## 示例
282
+
283
+ 仓库里的 `example_plugin.py` 展示了一个完整用法:
284
+
285
+ - 定义了一个自定义权限 `command.mask`
286
+ - 创建了 `mask_track`
287
+ - 通过 `system.pre_assign(...)` 给不同权限角色分配该权限
288
+ - 在指令执行前使用 `require_permission(...)` 做校验
289
+
290
+ 如果你需要在自己的插件里增加权限控制,通常可以按下面的模式写:
291
+
292
+ ```python
293
+ from arclet.cithun import Permission
294
+ from entari_plugin_permission import AUTH_1, AUTH_3, require_permission, system
295
+
296
+
297
+ system.pre_assign(system.default_role, "command.xxx", Permission("v-a"))
298
+ system.pre_assign(AUTH_1, "command.xxx", Permission.VISIT)
299
+ system.pre_assign(AUTH_3, "command.xxx", Permission.VISIT | Permission.AVAILABLE)
300
+ ```
301
+
302
+ ## 许可证
303
+
304
+ MIT
@@ -0,0 +1,23 @@
1
+ [project]
2
+ name = "entari-plugin-permission"
3
+ version = "0.1.0"
4
+ description = "Permission system for Entari based on Cithun"
5
+ authors = [
6
+ {"name" = "RF-Tar-Railt", "email" = "rf_tar_railt@qq.com"}
7
+ ]
8
+ dependencies = [
9
+ "arclet-entari>=0.18.0rc2",
10
+ "arclet-cithun<1.5.0,>=1.4.0",
11
+ "entari-plugin-user>=0.1.6",
12
+ "entari-plugin-database>=0.3.1",
13
+ ]
14
+ requires-python = ">=3.10"
15
+ readme = "README.md"
16
+ license = {"text" = "MIT"}
17
+
18
+ [dependency-groups]
19
+ dev = [
20
+ "arclet-entari[yaml,cron,reload,dotenv] >= 0.17.4",
21
+ "satori-python-adapter-onebot11>=0.4.4",
22
+ "entari-plugin-server>=0.7.0",
23
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+