From 66be3a63b1af4da02daef845630febd1a97ed5bd Mon Sep 17 00:00:00 2001 From: LoveChengke Date: Sat, 31 Oct 2026 09:40:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(authz):=20=E9=87=8D=E5=86=99=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=A8=A1=E6=9D=BF=E5=88=86=E9=85=8D=E4=B8=8E=E7=8F=AD?= =?UTF-8?q?=E7=BA=A7=E6=8E=88=E6=9D=83=E8=BE=B9=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 拆分能力、分配范围和业务关系,固定管理员能力并收紧组织级写入口。 补齐内容、课表、设备会话和实时通道授权,兼容旧库分配及历史快照。 重写权限分配预览,按实际可操作范围展示维护入口,合并学生入口并独立学年升级页。 增加授权攻击矩阵及静态门禁,更新隔离回归与开发契约。 验证:授权矩阵 23 段通过,Node 24 下 Web 63/63,类型检查、lint 与文档严格构建通过。 --- AGENTS.md | 14 +- docs/app/classes.md | 5 +- docs/dev/api.md | 46 +- docs/dev/data-model.md | 12 +- docs/dev/implementation.md | 6 +- docs/dev/permissions.md | 117 +- docs/dev/realtime.md | 25 +- docs/screenshots/plan-editor-list.png | Bin 109952 -> 74699 bytes docs/screenshots/plan-editor-live-api.png | Bin 109926 -> 110728 bytes docs/screenshots/plan-editor-shell.png | Bin 131822 -> 131994 bytes docs/screenshots/plan-editor-timeline.png | Bin 102121 -> 103408 bytes package.json | 10 +- .../src/renderer/stores/realtime.ts | 3 +- .../migration.sql | 7 + packages/server/prisma/schema.prisma | 8 +- packages/server/scripts/verify-authz.ts | 516 +++++++ packages/server/scripts/verify-courseware.ts | 27 +- packages/server/scripts/verify-e2e.mjs | 20 +- packages/server/scripts/verify-lifecycle.ts | 73 +- packages/server/scripts/verify-v14.ts | 13 +- packages/server/src/lib/access.ts | 398 +----- packages/server/src/lib/authz/assert.ts | 104 ++ packages/server/src/lib/authz/index.ts | 4 + packages/server/src/lib/authz/principal.ts | 99 ++ packages/server/src/lib/authz/relations.ts | 24 + packages/server/src/lib/authz/scope.ts | 124 ++ packages/server/src/lib/authz/session.ts | 23 + packages/server/src/lib/permission-scope.ts | 52 - packages/server/src/lib/permissions.ts | 101 +- packages/server/src/lib/snapshot.ts | 23 + packages/server/src/lib/student-lifecycle.ts | 19 +- packages/server/src/middleware/auth.ts | 57 +- packages/server/src/middleware/validate.ts | 16 +- packages/server/src/modules/ai/ai.service.ts | 33 +- .../src/modules/archives/archives.module.ts | 3 +- .../server/src/modules/calls/calls.module.ts | 4 +- .../server/src/modules/calls/calls.service.ts | 8 +- .../modules/class-plans/class-plans.module.ts | 49 +- .../class-plans/class-plans.service.ts | 43 +- .../class-plans/profile-export.service.ts | 2 +- .../src/modules/classes/classes.module.ts | 36 +- .../src/modules/classes/classes.schemas.ts | 9 +- .../src/modules/classes/classes.service.ts | 116 +- .../src/modules/clients/clients.module.ts | 49 +- .../src/modules/clients/clients.service.ts | 34 +- .../src/modules/courses/courses.module.ts | 4 +- .../src/modules/courses/courses.service.ts | 6 +- .../modules/courseware/courseware.module.ts | 14 +- .../modules/courseware/courseware.service.ts | 32 +- .../src/modules/dashboard/dashboard.module.ts | 6 +- .../modules/dashboard/dashboard.service.ts | 65 +- .../src/modules/database/database.module.ts | 57 +- .../src/modules/database/database.service.ts | 22 + .../src/modules/grades/grades.module.ts | 58 +- .../src/modules/grades/grades.service.ts | 54 +- .../src/modules/homeworks/homeworks.module.ts | 18 +- .../modules/homeworks/homeworks.service.ts | 64 +- .../src/modules/imports/imports.module.ts | 10 +- .../modules/imports/table-import.service.ts | 565 ++++---- .../modules/imports/time-layout.service.ts | 4 +- .../notifications/notifications.module.ts | 18 +- .../notifications/notifications.service.ts | 45 +- .../modules/permissions/permissions.module.ts | 51 +- .../permissions/permissions.schemas.ts | 28 +- .../permissions/permissions.service.ts | 672 ++++----- .../src/modules/schedules/schedules.facade.ts | 20 +- .../src/modules/schedules/schedules.module.ts | 14 +- .../src/modules/students/students.service.ts | 12 +- .../src/modules/system/system.module.ts | 5 +- .../src/modules/system/system.service.ts | 10 +- .../src/modules/teachers/teachers.module.ts | 30 +- .../src/modules/teachers/teachers.service.ts | 77 +- .../src/modules/term/promotion.service.ts | 2 + .../server/src/modules/term/term.module.ts | 29 +- .../server/src/modules/term/term.service.ts | 19 +- .../modules/update/client-releases.service.ts | 18 +- .../src/modules/update/update.module.ts | 24 +- .../src/modules/update/update.schemas.ts | 6 +- packages/server/src/realtime/bus.ts | 16 +- packages/server/src/realtime/socket.ts | 194 ++- packages/shared/src/class-plan.ts | 2 +- packages/shared/src/constants.ts | 18 + packages/shared/src/lifecycle.ts | 16 +- packages/shared/src/permissions.ts | 99 +- packages/shared/src/types.ts | 64 +- packages/web-admin/src/api/index.ts | 4 + .../src/components/TimeLayoutEditor.vue | 5 +- packages/web-admin/src/config/navigation.ts | 9 +- .../web-admin/src/layouts/AdminLayout.vue | 24 +- packages/web-admin/src/router/index.ts | 124 +- packages/web-admin/src/stores/auth.ts | 64 +- packages/web-admin/src/stores/realtime.ts | 15 +- packages/web-admin/src/types/router.d.ts | 11 + packages/web-admin/src/views/ClassesView.vue | 78 +- packages/web-admin/src/views/ClientsView.vue | 6 +- .../web-admin/src/views/DashboardView.vue | 42 +- packages/web-admin/src/views/GradesView.vue | 27 +- .../web-admin/src/views/HomeworksView.vue | 26 +- packages/web-admin/src/views/NoAccessView.vue | 15 + .../web-admin/src/views/PermissionsView.vue | 1224 +++++++---------- .../web-admin/src/views/PlanEditorView.vue | 29 +- .../web-admin/src/views/PromotionView.vue | 15 + .../web-admin/src/views/SchedulesView.vue | 7 +- packages/web-admin/src/views/StudentsView.vue | 48 +- .../web-admin/src/views/TermWeeksView.vue | 42 +- scripts/check-authz.mjs | 86 ++ scripts/ui-smoke/class-relations.cjs | 205 +++ scripts/ui-smoke/main.cjs | 107 +- scripts/ui-smoke/run.mjs | 6 +- scripts/verify-authz.mjs | 39 + scripts/verify-client-migrations.mjs | 45 +- scripts/verify-clients-api.mjs | 39 +- scripts/verify-e2e-isolated.mjs | 20 +- scripts/verify-review-api.mjs | 28 +- scripts/verify-review-client.mjs | 20 +- 115 files changed, 4463 insertions(+), 2747 deletions(-) create mode 100644 packages/server/prisma/migrations/20261031000000_authz_assignments/migration.sql create mode 100644 packages/server/scripts/verify-authz.ts create mode 100644 packages/server/src/lib/authz/assert.ts create mode 100644 packages/server/src/lib/authz/index.ts create mode 100644 packages/server/src/lib/authz/principal.ts create mode 100644 packages/server/src/lib/authz/relations.ts create mode 100644 packages/server/src/lib/authz/scope.ts create mode 100644 packages/server/src/lib/authz/session.ts delete mode 100644 packages/server/src/lib/permission-scope.ts create mode 100644 packages/web-admin/src/types/router.d.ts create mode 100644 packages/web-admin/src/views/NoAccessView.vue create mode 100644 packages/web-admin/src/views/PromotionView.vue create mode 100644 scripts/check-authz.mjs create mode 100644 scripts/ui-smoke/class-relations.cjs create mode 100644 scripts/verify-authz.mjs diff --git a/AGENTS.md b/AGENTS.md index b383a9f..6d72f4b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -28,9 +28,9 @@ pnpm monorepo,根 `package.json` 是版本单一来源。文档、注释、界 - 模块由 `packages/server/src/modules/registry.ts` 注册;新增或下线功能改注册表,不另改 `app.ts` 挂载。 - 路由用 `middleware/validate.ts` 与 zod;响应复用 `lib/http.ts`,错误交给统一中间件。 - 学生是 `Student` 名单记录,没有账号、角色或密码。教师/管理员存 `User`;班级登录读取 `Class.code/passwordHash`,会话角色 `CLASS_DEVICE`,主体 id 为班级 id。 -- 任课关系只在 `Course(classId, name, teacherId)`。班主任不自动获得别的科目的作业、成绩写权限,统一走 `assertCanManageSubjectContent`。班级端可录作业,不可写成绩;员工还须对应功能权限。 -- 功能权限取 `lib/permissions.ts` 的 `loadEffectivePermissions()`:已分组取并集;未分组使用数据库对应角色的可编辑默认组;管理员永远保留 `permission:manage/system:manage`;班级端为空集。 -- 岗位组不新增 `User.role`。班主任/教师/级长/部长仍为 TEACHER;范围在 `PermissionGroup.scope/scopeValue`,由 `lib/permission-scope.ts` 收口,空年级/部范围拒绝。设备写权限只合并含对应键的分组范围,范围不替代科目授权。 +- 任课关系只在 `Course(classId, name, teacherId)`。班主任不自动获得别的科目的作业、成绩写权限,统一走 `lib/authz/assert.ts` 的 `assertContentWrite`。班级端可录作业,不可写成绩;员工还须对应功能权限。 +- 功能、范围、关系统一由 `lib/authz/` 判定,所有服务显式传权限键。ADMIN 固定全部能力;TEACHER 永久忽略管理员专用键;CLASS_DEVICE 为空集,接口明确允许并校验本班。权限管理仅 ADMIN。 +- 岗位模板只管能力与建议范围,生效范围存 `UserPermissionGroup.scope/scopeValue`,使用 TEACHING/HEAD/GRADE/DIVISION/ALL。无显式分配的教师使用默认模板与固定 TEACHING;空或未知年级拒绝。按键独立合并范围,无键查询为空集;班级账号/学期设置永远要求本班班主任,科目写检查原/目标科目。具体断言和迁移见 `docs/dev/permissions.md`。 - 只有一份 `prisma/schema.prisma`,切库改 provider;保持 SQLite/MySQL 通用,不加 Prisma enum 或 `@db.*`。模型变动同步迁移、`lib/snapshot.ts` 的 `SNAPSHOT_TABLES` 与旧库兼容逻辑。 - `deleteTeacher` 必须保护班主任、课程任课、发布的作业/通知和所属课件,避免级联删除业务内容。 - 作业和通知按本地 `assignDate` 归类,使用 `dayKeyLocal/isDayKey/shiftDayKey`,不用 UTC 日期切片。 @@ -44,7 +44,7 @@ pnpm monorepo,根 `package.json` 是版本单一来源。文档、注释、界 - `/api/schedules/*` 是新模型兼容门面。启用解析统一走 `lib/class-plan.ts`,在线客户端不得另写启用优先级。 - 时间点有上课、课间、分割线、行动四种;课程显式引用时间点外键。排序不能靠数组下标代替关联。 - 支持 1–9 周轮换、群组、预定及临时层;完整档案导入走 `profile-import.service.ts`,不经过单双周有损格式。 -- 全校时间表写入用 `timetable:manage`;班级日课表写入还须班主任/管理员断言。离线整套课表导入可建立班级自有作息,不把 JSON 的 TeacherName 当授权。 +- 全校时间表写入仅管理员;班级时间表按存储 classId 校验 `schedule:write` 与班主任关系,引用班级也校验。日课表/名单在 TEACHING/HEAD 范围要求班主任,显式年级/部/全校分配可在范围内维护。离线整套课表导入可建立班级自有作息,不把 JSON 的 TeacherName 当授权。 - 周次统一 `loadTermContext/resolveCurrentWeek`:班级逐周区间优先于全校区间,缺省再线性推算。开学日会参考班级设置、第 1 周区间、全校设置与环境兜底,详见 `lib/term.ts`。 - 全校周数上限存 `term.maxWeeks`,默认 30、范围 1–60;服务端 `getMaxTermWeeks()`,shared 做归一化与离线兜底。班级周数不超全校上限。 - 关闭个人成绩查询后,班级端仍可看服务端集体聚合;个人明细、原始全班成绩和排名拒绝读取。稀疏样本及补集抑制,不下发原始成绩后在客户端聚合。 @@ -57,9 +57,9 @@ pnpm monorepo,根 `package.json` 是版本单一来源。文档、注释、界 - preload 仅暴露 contextBridge 白名单,不暴露 ipcRenderer;跨桥接传纯数据,不传 Vue Proxy。契约写在 `src/types/desktop.d.ts`。 - 保留 CSP、导航同源校验与弹窗限制。安装包不能含凭据,保留 `check-bundle-secrets` 构建门禁。 - 离线缓存按服务端与班级隔离,缓存故障不应阻断在线读取。退出、切服务器时清理会话状态,设备 `deviceKey` 保持不变,渲染层不能改写它。 -- 设备维护只走 `/api/clients/*`,管理页 `ClientsView.vue`。心跳约 30 秒,90 秒窗口判在线;未登录不报,401/403 退避,切配置重置计时并隔离迟到响应。 +- 设备维护只走 `/api/clients/*`,管理页 `ClientsView.vue`;心跳、进度、回执仅接受本班 CLASS_DEVICE,deviceKey 不可跨班迁移。心跳约 30 秒,90 秒窗口判在线;未登录不报,401/403 退避,切配置重置计时并隔离迟到响应。 - 远控须 `remote:control`,只允许 shutdown/restart/logoff/lock,客户端立即执行、持久去重并回执。冒烟始终假执行,不得真关机/重启/注销/锁屏。 -- 更新写入口用 `client:update`;服务端缓存包并登记 SHA256,教室机从本服务下载;无哈希拒收,按立即/放学后/空闲策略执行,关闭自动更新不得强装。冒烟不运行安装器。 +- 安装包登记/删除为管理员 `client:update`;班级推送用 `client:update-push`;服务端缓存包并登记 SHA256,教室机从本服务下载;无哈希拒收,按立即/放学后/空闲策略执行,关闭自动更新不得强装。冒烟不运行安装器。 - 灵动岛方案保存在本机 `config.json.islandLayout`,默认 `layout=fixed`;`custom` 当前即常驻模式,旧 `residentEnabled` 是兼容字段。新尺寸上报仅在 custom 模式执行。 - `LayoutIslandApp.vue` 选择经典 `IslandApp.vue` 或 `CustomIslandRuntime.vue`,共用一个原生岛窗口;课件传输状态优先显示 `CoursewareTransfer.vue`。 - 经典模式:普通通知/作业上课暂存;普通叫人保留可点击胶囊;紧急消息立即展开。自定义常驻模式:消息先提示铃铛数量,用户主动展开;上课也可主动查看。不要把两个模式规则混写。 @@ -71,7 +71,7 @@ pnpm monorepo,根 `package.json` 是版本单一来源。文档、注释、界 ## 5. 实时、界面与资源 -- 事件名与房间名取 shared 常量。业务用 `emitToClass/emitToSession`,不直接依赖 Socket.IO 实例。 +- 事件名与房间名取 shared 常量。班级房间为 `class:{id}:{channel}`,教师按每域读键及范围订阅,班级端仅本班全部通道;握手回查数据库身份。业务用 `emitToClass/emitToSession`,由总线选择事件域。 - 会话房间为 `session:{id}`;教师/管理员 id 为账号 id,班级端为班级 id。`students` 是班级端广播房间,不是个人学生账号房间。 - 新实时事件同步服务端、Web 订阅、客户端订阅。成绩实时载荷不可泄漏个人成绩。 - Web 菜单分组在 `config/navigation.ts`,标题/图标/权限取路由;守卫与服务端都检查权限,前端隐藏不能代替鉴权。 diff --git a/docs/app/classes.md b/docs/app/classes.md index c001b49..951539e 100644 --- a/docs/app/classes.md +++ b/docs/app/classes.md @@ -17,6 +17,8 @@ description: 名单、班级会话、任课关系与年度升级。 ## 学生名单 +Web 统一从“学生管理”查看和维护名单;旧 `/roster` 地址转到同一页面,不再提供重复菜单。班级详情中的名单与课程按当前班级的生效范围展示维护入口,任课关系本身不授予跨班名单、课程或班级设置管理权。 + Student 存学号、姓名、班级、性别、家长电话和状态,没有密码或角色字段。 学号为必填唯一标识,格式为 1–32 位字母、数字或 . _ -;不会自动生成登录名。 具有名单管理键的管理员、本班班主任或全校名单范围的授权员工管理学生;只读账号按名单读取键和范围查看历史。 @@ -35,8 +37,9 @@ Student 存学号、姓名、班级、性别、家长电话和状态,没有密 ## 权限、学年与归档 -角色给默认权限模板,实际入口由可编辑权限组决定;岗位组还能配置年级或部范围。 +管理员固定拥有全部能力;教师按岗位模板及每项分配的范围获得能力,未显式分配时使用教师默认模板与固定任教范围。 范围不代替科目写权限,详见[角色与权限](../dev/permissions.md)。 +“学期周次”只维护教学周与日期区间;年度轨道、执行计划与补跑统一在管理员专用的“学年升级”页维护。 学期周数受全校可配置上限约束,默认上限 30、允许 1–60,见[课表](schedules.md)。 学年升级按计划时间运行,执行前保存快照,以年份幂等;启动发现漏跑需管理员预览补跑。 默认高中轨道按高一、高二、高三排列,毕业学段归档,其余升一级;也可配置其他轨道。新班不复制任课关系。归档页查看届别历史与转出记录, diff --git a/docs/dev/api.md b/docs/dev/api.md index 5408042..651238a 100644 --- a/docs/dev/api.md +++ b/docs/dev/api.md @@ -12,18 +12,18 @@ API 前缀 /api,JWT 使用 Authorization: Bearer。成功/失败结构以 `lib ## 身份与班级 -| 方法与路径(省略 /api) | 行为及边界 | -| ----------------------------------------------------------------------- | --------------------------------------------------------------------------------- | -| POST /auth/login、/auth/class-login | 员工/班级登录,共享登录限流;学生无账号 | -| GET /auth/me;POST /auth/logout;PATCH /auth/password | 当前身份、退出、员工本人改密码 | -| GET/POST /classes;GET/PATCH/DELETE /classes/:id | 班级查询/管理,读取 class:read;写入 class:manage 与目标范围,创建/删除需全校范围 | -| PATCH /classes/:id/class-account、/classes/:id/head-teacher | 班级凭据/班主任维护 | -| PUT /classes/:id/subject-teachers | 任课关系设置,Course 为唯一来源 | -| GET/PATCH /classes/:id/student-grade-query | 查看/修改班级个人成绩查询开关,班级端不能修改 | -| GET/POST /classes/:id/students;DELETE /classes/:id/students/:studentId | 本班名单及维护,受名单功能权限和班级关系约束 | -| /students、/teachers | 名单与账号 CRUD;读/写使用不同权限键,具体角色限制读取对应模块 | -| POST /teachers/:id/reset-password | 指定新密码或默认重置;学生无对应接口 | -| /permissions/me、/catalog、/groups、/users | 当前有效权限、目录、组与账号分组 | +| 方法与路径(省略 /api) | 行为及边界 | +| ----------------------------------------------------------------------- | -------------------------------------------------------------- | +| POST /auth/login、/auth/class-login | 员工/班级登录,共享登录限流;学生无账号 | +| GET /auth/me;POST /auth/logout;PATCH /auth/password | 当前身份、退出、员工本人改密码 | +| GET/POST /classes;GET/PATCH/DELETE /classes/:id | 班级查询/管理,读取 class:read;写入 class:manage 且仅管理员 | +| PATCH /classes/:id/class-account、/classes/:id/head-teacher | 班级凭据 class:account + 班主任;班主任分配仅管理员 | +| PUT /classes/:id/subject-teachers | 任课关系设置,Course 为唯一来源 | +| GET/PATCH /classes/:id/student-grade-query | 查看/修改班级个人成绩查询开关,班级端不能修改 | +| GET/POST /classes/:id/students;DELETE /classes/:id/students/:studentId | 本班名单及维护,受名单功能权限和班级关系约束 | +| /students、/teachers | 名单与账号 CRUD;读/写使用不同权限键,具体角色限制读取对应模块 | +| POST /teachers/:id/reset-password | 指定新密码或默认重置;学生无对应接口 | +| /permissions/me、/catalog、/groups、/users | 当前有效权限、目录、组与账号分组 | ## 教学与文件 @@ -58,11 +58,11 @@ API 前缀 /api,JWT 使用 Authorization: Bearer。成功/失败结构以 `lib | POST /clients/update-progress | 设备上传下载、校验、等待、安装和失败状态,校验设备班级归属 | | GET /clients/devices;DELETE /clients/devices/:id | 设备读取/维护,分别检查功能键和范围 | | POST /clients/commands | remote:control + 对应范围,白名单动作 | -| POST /clients/updates | client:update,安装策略 immediate/after-school/idle | +| POST /clients/updates | client:update-push,安装策略 immediate/after-school/idle | | GET /update/check | 员工需 update:check;强制刷新另检查 update:force | | GET /update/client/releases | 缓存版本读取,按路由允许的读取权限 | -| POST /update/client/fetch、/update/client/releases;DELETE /update/client/releases/:version | 安装包写入口统一 client:update | -| GET /update/client/download/:version | 已登录下载,不挂员工权限键,供班级端更新 | +| POST /update/client/fetch、/update/client/releases;DELETE /update/client/releases/:version | 安装包写入口仅管理员 client:update | +| GET /update/client/download/:version | 本班 CLASS_DEVICE 或 client:read + 有效班级范围 | | /term;POST /term/auto;GET /term/holidays | 学期读取/编辑/假日建议,term:read/term:write | | GET/PUT /term/promotion;POST /term/promotion/run | 升级计划与执行,promotion:manage + 全校范围,执行要求确认与计划哈希 | | /archives、/archives/transferred、/archives/transferred/:id/restore | 历史归档需 archive:manage 全校范围;撤回转出需 roster:manage;不提供手动创建归档 | @@ -83,8 +83,8 @@ API 前缀 /api,JWT 使用 Authorization: Bearer。成功/失败结构以 `lib | GET /permissions/scopes | permission:manage;返回可选年级、部建议和计划年级 | | GET /permissions/groups/:id/members | permission:manage;包含显式分组及角色默认回落的生效成员 | | GET /permissions/audit?page=&pageSize= | permission:manage;分页操作人、目标、前后 JSON,pageSize 最大 100 | -| POST/PATCH/DELETE /permissions/groups[/:id] | permission:manage;范围校验与防提权;默认组仅 ADMIN 可改,内置组不可删 | -| PUT /permissions/users/:id/groups | groupIds 整体替换;默认组角色须匹配,空数组恢复角色默认模板;禁止越键越范围 | +| POST/PATCH/DELETE /permissions/groups[/:id] | 仅 ADMIN;仅可分配键,范围校验,教师默认模板固定 TEACHING,内置组不可删 | +| PUT /permissions/users/:id/groups | assignments 整体替换,每项 groupId/scope/scopeValue;兼容 groupIds 按建议范围分配;空数组恢复教师默认模板;ADMIN 不可分配 | | GET /students?status=&includeArchived= | roster:read;默认 active,归档单独筛选;历史状态不会再被在读条件覆盖 | | POST /students | roster:manage;仅 active/inactive,学号重复 409,班级不得归档 | | PATCH /students/:id | roster:manage;仅资料字段;classId/status 明确返回 400 | @@ -105,3 +105,15 @@ API 前缀 /api,JWT 使用 Authorization: Bearer。成功/失败结构以 `lib 生命周期历史以 kind 为事实源,mode 为派生兼容字段;新响应另含 batchId、academicYear、fromGrade/toGrade、fromSchool/toSchool。 归档详情含 inactive 列表、inactiveCount 和按学生去重的 transferInCount;升级记录含 operatorId/operatorName、detailsJson、snapshotSha256、error。 所有学生与历史写入在同一事务,提交后再广播旧班与新班。班级详情只有持 roster:read 且在对应范围内的员工才能获得学生明细。 + +## 分配级范围与班级设置 + +`GET /permissions/catalog` 增加 meta(kind/risk/relation/allowedScopes)。模板 DTO 的 defaultScope/defaultScopeValue/defaultScopeLabel 及兼容 scope 字段都是建议范围;kind、inactiveKeys、warnings 展示模板类别和停用键。成员 DTO 的 assignments 是实际分配,groupIds 为派生值;ADMIN fixed=true。 + +`GET /permissions/users/:id/effective` 仅 ADMIN,返回 permissions、entries(每键 scopes/classes/classCount)、conflicts、headOnlyKeys。可选 query assignments 为 JSON 数组,预览尚未保存的整体分配;预览与实际授权共用求值器。 + +`PATCH /classes/:id/settings` 使用 class:settings + 本班班主任(ADMIN 例外)保存 termWeeks/termStartDate。管理员 `PATCH /classes/:id` 只接收 enrollmentYear/classIndex。`PATCH /classes/:id/class-account` 使用 class:account + 本班班主任。全局周次仅管理员,带 classId 的周次写走 class:settings + 班主任。时间表写入按存储 classId 分流,班级时间表需要 schedule:write + 班主任,全校时间表仅管理员。 + +成绩 overview/collective/exams/ranking 显式检查 grade:read,班级端由服务断言限本班并执行查询开关。设备 heartbeat/update-progress/commands/:id/ack 仅接受绑定本班的 CLASS_DEVICE,不接受教师个人设备。 + +`GET /permissions/me` 同时返回 classScopes、manageScopes、allScopeKeys,供 Web 按钮与班级选择器显示实际能力范围;manageScopes 对名单、日课表、导入和考试配置叠加班主任或显式组织范围规则。界面范围提示不替代服务端断言。 diff --git a/docs/dev/data-model.md b/docs/dev/data-model.md index 17ff418..673774a 100644 --- a/docs/dev/data-model.md +++ b/docs/dev/data-model.md @@ -27,9 +27,9 @@ description: 现行模型职责、迁移与快照边界。 | `TimeLayout` | 共享或班级自有时间表;旧 items JSON 保留迁移审计 | | `Grade` | studentId、课程、考试、分数和等级 | | `PermissionAudit` | 权限与人工升级审计,操作人和前后 JSON,不建账号外键 | -| `PermissionGroup` | 默认/自定义/岗位组及 scope/scopeValue | +| `PermissionGroup` | 岗位模板与建议 scope/scopeValue | | `PermissionGroupItem` | 组内权限键 | -| `UserPermissionGroup` | 账号与组的多对多分配 | +| `UserPermissionGroup` | 账号与模板的分配及实际 scope/scopeValue | | `AppSetting` | 周次、升级、AI 和系统设置 | | `ClientDevice` | deviceKey、心跳、更新目标与状态 | | `ClientCommand` | 白名单远控、有效期与执行回执 | @@ -85,3 +85,11 @@ User.careMode 是预留列;当前 Web 偏好在 localStorage,客户端偏好 SNAPSHOT_TABLES 已加入 PermissionAudit,新增字段随模型导出。旧快照没有审计表可恢复为空,旧历史 mode 在恢复时转为 kind; 没有新增列的旧行使用 schema 默认值。执行记录与升级快照不自动清理。 升级计划存 AppSetting.term.promotionPlan,时间存 term.promotionAt,无需新增学校或学生账号模型。 + +## 授权分配迁移 + +`20261031000000_authz_assignments` 为 UserPermissionGroup 增加 scope(默认 TEACHING)与 scopeValue。先按旧模板范围回填分配,再将模板 SELF_CLASS/空值和 SELF_CLASS/HEAD 规范为 TEACHING/HEAD。教师默认模板建议范围固定 TEACHING;旧 ADMIN 默认模板与旧管理员专用键保留在库中,由运行时忽略。 + +同一成员可将同一模板分配到多个范围,唯一约束为 userId/groupId/scope/scopeValue。PermissionGroup 的范围列仅作建议,不参与已有分配求值。 + +快照表集合和版本 1 保持兼容。恢复旧模板时映射 SELF_CLASS;旧 UserPermissionGroup 没有范围列时按快照内对应模板推导,缺组回落 TEACHING。新快照按实际分配列恢复。真实库升级前先备份快照,隔离回归不替代真实库升级演练。 diff --git a/docs/dev/implementation.md b/docs/dev/implementation.md index 6ccf4a3..814b1cb 100644 --- a/docs/dev/implementation.md +++ b/docs/dev/implementation.md @@ -18,7 +18,7 @@ description: 课表、周次、学年、岛、设备与课件的现行实现入 ## 权限、成绩与年度升级 -默认权限组、岗位范围、科目写权限分别由 permissions/permission-scope/access 维护,范围并集不授予任课权。 +能力、分配范围、业务关系统一由 lib/authz 的 principal/scope/relations/assert 维护;access 只提供带显式键的窄封装。ADMIN 固定全集,TEACHER 过滤管理员专用键。 全校周数上限在 `term.maxWeeks`,默认 30、允许 1–60;开学日和逐周区间支持全校与班级设置。 个人成绩查询关闭后只返回服务端集体聚合,个人明细、原始全班成绩与排名拒绝读取;样本不足或稀疏分段抑制。 年度升级由 `term.promotionPlan`、`term.promotionAt` 和 `PromotionRun.year` 管理,先存快照;运行期到点执行,启动漏跑需管理员预览补跑。 @@ -44,9 +44,11 @@ JSON 快照含课件表,完整恢复还必须带文件实体目录。细节见 学生状态/班级写入口集中在 `lib/student-lifecycle.ts`,班级名单添加/移出、名单导入、转出和转入均复用它。 资料 PATCH 不承担状态或班级迁移。学生与历史在事务内提交,UUID 标识批次,事务后广播两端班级,历史读取不附带在读过滤。 权限、功能对应范围、业务关系依次断言;权限只在当前请求对象上复用,下一请求重新计算。 -范围解析在 shared,默认组或分组均按当前功能键过滤,不能借另一功能的范围扩大当前操作。 +范围解析在 shared,实际范围存分配记录,模板范围仅作新分配建议。各键独立合并,无键为空集;默认教师范围固定 TEACHING。 权限组或成员分配与 PermissionAudit 同事务,成员权限一次预取计算。 年度升级服务由计划推导所有轨道的下一学段。预览哈希覆盖配置、班级、学生和周次,执行事务内重新计算; 先保存全库快照并计算 SHA256,再以年份唯一键提交升级。毕业班所有状态挂届别,非毕业班仅升级及清班级开学日覆盖。 周次是否清空由计划决定,预览公开影响。服务保留 runPromotion(year, dryRun) 内部兼容签名;HTTP 执行必须提供哈希、确认并检查年份。 + +实时班级事件按 core/homework/notification/grade/courseware 分房间,事件总线按 shared 映射选择通道,教师仅订阅对应读键范围。HTTP 与 Socket 握手共用数据库身份加载;敏感权限与账号变更使旧订阅失效。事务路径传递同一数据库连接给授权断言,保留原/目标资源的校验。 diff --git a/docs/dev/permissions.md b/docs/dev/permissions.md index 35f98d3..8086ae4 100644 --- a/docs/dev/permissions.md +++ b/docs/dev/permissions.md @@ -1,89 +1,76 @@ --- title: 角色与权限 -description: 功能权限、岗位范围与班级科目边界。 +description: 能力目录、岗位模板、分配范围与业务关系的授权契约。 --- # 角色与权限 -授权分为功能权限、数据范围和业务关系三层,任何一层拒绝都不能操作。 -shared 的 `permissions.ts` 定义键、标签、默认模板与班级关系规则;服务端 `lib/permissions.ts`、 -`lib/permission-scope.ts`、`lib/access.ts` 分别计算生效键、查询范围和具体业务断言。 +授权依次检查能力、该能力的数据范围、数据行上的业务关系。服务端统一入口为 `lib/authz/`,路由预检不能替代服务断言。共享目录 `PERMISSION_META` 提供分类、风险、关系提示、合法范围、标签和默认角色;完整键目录读取源码,不在文档维护固定数量。 -## 身份与权限组 +## 身份与模板 -账号角色为 ADMIN、TEACHER;班级登录形成 CLASS_DEVICE 会话。学生是 Student 名单,不是账号。 -HEAD/SUBJECT 是班级关系,级长/部长是岗位组,均不新增 User.role。 +| 主体 | 生效能力 | +| -------------------- | -------------------------------------------------- | +| ADMIN | 固定拥有全部目录键及全校范围,忽略权限组 | +| TEACHER | 显式分配模板的可分配能力并集;管理员专用键永久无效 | +| 未显式分配的 TEACHER | 数据库教师默认模板与固定 TEACHING 范围 | +| CLASS_DEVICE | 空集;接口明确允许班级端并校验本班关系 | -| 情况 | 有效功能权限 | -| ------------ | ----------------------------------------------------- | -| 已分配权限组 | 所有分组键的并集,可以比角色默认更少 | -| 没有分组 | 数据库对应角色的可编辑默认组 | -| ADMIN | 同上,始终额外保留 permission:manage 与 system:manage | -| CLASS_DEVICE | 空集;通过明确允许班级会话的接口与业务断言操作 | +学生是 Student 名单记录,没有账号。HEAD/SUBJECT 是班主任和科任关系,级长/部长是岗位模板,不增加 User.role。权限管理只允许 ADMIN;旧 ADMIN 默认模板保留存储但隐藏、忽略。 -每请求读取生效权限,编辑后无需等待令牌过期。内置组可改不可删,默认组不是写死的全权限快捷方式。 -路由使用 requirePermission(AND)、requireAnyPermission(OR),员工与班级端共享读取入口按 requireStaffPermission 等规则检查。 -具体 API 的额外角色限制以模块路由和服务断言为准,不能把“默认只分配给管理员”写成所有接口硬编码 ADMIN。 +`PermissionGroup` 保存能力和新分配的建议范围,`UserPermissionGroup` 保存实际 `scope/scopeValue`。模板改建议范围不会改变已有分配;模板改能力会影响其成员。同一模板可分配不同范围,多条分配按键取并集。空分配恢复默认模板,界面不会将未分组成员自动转换成显式默认组。 -## 数据范围与科目 +## 能力目录与范围 -| 岗位/身份 | 范围 | -| ----------- | --------------------------------------------- | -| 管理员 | 全部班级;仍须功能键 | -| 班主任/教师 | 自己担任班主任或任课的班级,按分组 scope 收敛 | -| 级长 | 配置年级 | -| 部长 | 配置的一组年级,scopeValue 用逗号分隔 | -| 班级端 | 登录绑定班级 | +能力分为管理员专用、班级级、组织只读。管理员专用能力包括组织与账号维护、权限/系统/数据库、全局周次、全校时间表、升级归档、安装包管理等;具体清单以 `PERMISSION_META.kind` 为准。`teacher:read` 和 `update:check` 为组织只读,忽略班级范围。其余班级级能力按分配范围求值。 -空年级/部配置不放行。范围按当前功能键独立合并,不能借其他只读组扩大名单、班级或设备写权限。 -科目编辑再由 `assertCanManageSubjectContent` 检查:管理员可管理,教师仅自己任课科目,无科目内容归班主任。 -班主任不任教某科就不能改该科的作业或成绩;班级端只允许作业写入,不能写成绩。 +| 范围 | 语义 | +| -------- | -------------------------- | +| TEACHING | 本人担任班主任或任课的班级 | +| HEAD | 仅本人担任班主任的班级 | +| GRADE | 指定一个年级 | +| DIVISION | 指定多个年级 | +| ALL | 全校 | -| 业务 | 主要功能键与额外边界 | -| ---------------- | ----------------------------------------------------------------------------------------------------- | -| 名单读取/管理 | roster:read / roster:manage;管理需名单键与目标班范围;关联班级仍须班主任关系,全校名单范围可跨班维护 | -| 教师列表/维护 | teacher:read / teacher:manage;导入教师另检查 import:teachers 与 teacher:manage | -| 日课表写入 | schedule:write + 管理员/本班班主任 | -| 全校时间表写入 | timetable:manage;默认给 ADMIN | -| 作业/成绩 | homework:write / grade:write 或 grade:import,再按班级科目收口 | -| 通知/叫人 | notification:publish / call:create,再检查班级范围 | -| 课件 | courseware:read / courseware:write,上传和推送自己的文件还受本人授课班级约束 | -| 客户端维护/远控 | client:read、client:manage、remote:control,写操作按对应键范围 | -| 版本与安装包写入 | client:update;旧 client:update-push 不再作为写入口要求 | -| 学年升级 | promotion:manage;计划、预览与执行独立授权,全校范围,默认给 ADMIN | -| 数据库/系统/权限 | database:manage / system:manage / permission:manage | +`parsePermissionScope` 统一校验范围。GRADE/DIVISION 必须选择已有年级或升级计划中的年级,范围值按逗号分隔、去重排序;其余范围值必须为空串。旧 SELF_CLASS 仅在迁移和旧快照恢复中映射为 TEACHING/HEAD,不是运行时枚举。 -完整键目录读取 `PERMISSION_KEYS`,不在文档维护固定键数。 +`loadAuthPrincipal` 在请求主体上缓存只读能力和分配快照,没有可变的“当前权限键”。`classIdsFor(user, key)` 和 `classWhere(user, key)` 强制传键,无键或无授权返回空集合;不会合并其他能力的范围。`classWhere` 过滤 Class 表主键,下游子表使用明确的 classId 条件。 -## 前端门控与成绩隐私 +## 关系与写入 -Web 菜单属性来自路由,`meta.roles` 粗筛、`meta.permission` 细筛;先 ensurePermissions 再按生效集合判断。 -服务端仍检查功能、范围与业务关系,直接构造请求不能绕过。 -岗位范围可以扩大读范围,不能自动扩大科目写权限,也不能替代课件的本人任课关系。 -班级成绩查询开关仅员工按业务权限修改;关闭后班级端仍看集体聚合,个人明细、原始全班成绩和排名返回拒绝。 -稀疏分段与补集抑制,服务端不向客户端下发个人原始成绩再聚合。 +| 操作 | 功能与关系 | +| --------------------------------------------- | -------------------------------------------------------------------------------- | +| 建班/删班/届别班号、班主任/任课分配、教师账号 | 管理员专用,记录审计;最后一个管理员不可降级或删除 | +| 班级账号 | class:account + 本班班主任,管理员例外;班级码只给班主任或管理员 | +| 班级学期设置/班级周次 | class:settings + 本班班主任,管理员例外 | +| 名单、日课表与课程写入 | 对应写键;TEACHING/HEAD 要求班主任,显式年级/部/全校范围允许范围内维护 | +| 学生/课表导入 | 导入键与相应写键同时满足;先校验全部班级再写,学生及任课导入使用事务 | +| 班级时间表写入 | schedule:write + 本班班主任;按存储 classId 校验,所有引用班级也要校验 | +| 全校时间表、全局周次 | 管理员;班级设置使用独立接口 | +| 作业/成绩写入 | assertContentWrite;有科目要求该科任教,无科目要求班主任;原科目与目标科目都检查 | +| 作业提交/未交名单 | homework:write + 同样的科目关系;班级端明确允许本班作业 | +| 通知/叫人 | 发布能力和范围,再检查班主任/任课关系;班级端限本班 | +| 通知删除 | notification:delete + 发布者/班主任/管理员 | +| 课件 | 本人文件、对应功能范围与本人授课班级共同约束,不赋予班主任同事文件访问权 | -## 设备维护 +ALL 也不能替代班主任、任课、发布者关系,只有 ADMIN 无条件绕过关系。班级端可代录作业,不能写成绩。跨班调班检查源班与目标班。事务中的断言使用同一事务连接,不能因事务路径省略授权。 -`/api/clients/heartbeat` 和命令回执供已登录设备使用,不依赖班级端的空权限集合;服务端校验 deviceKey 与班级归属。 -远控从管理端确认下发,客户端执行后回传真实结果。更新文件由服务端缓存,教室机验 SHA256, -按立即、放学后、空闲策略安装;关闭自动更新不会强制安装。详见[更新与升级](../management/upgrade.md)。 +成绩列表、考试、排名和集体分析都要求 grade:read 与对应班级范围。学生明细另要求 student:grade-query。关闭班级自助查询后,本班设备仍可获得集体聚合,个人明细、原始成绩、考试列表和排名拒绝。实时载荷同样受隐私开关保护,服务端执行稀疏样本和补集抑制。 -## 范围配置与权限治理 +## 实时与设备 -范围由 shared 的 `parsePermissionScope` 统一解析。关联班级只接受空值(班主任与任课班)或 HEAD(仅班主任班); -GRADE 必选一个年级,DIVISION 必选多个年级组成的集合;全角逗号、顿号和空白统一分隔、去重排序。 -ALL 存空范围值。年级选项来自数据库已有年级和升级计划,空范围或未知年级返回 400;旧库未配置的岗位组不放行。 -`GET /permissions/scopes` 提供选择器选项,组 DTO 的 scopeLabel 供页面展示。 +班级房间为 `class:{id}:{channel}`,事件映射见 `SOCKET_EVENT_CHANNELS`。班级端加入本班全部通道;教师按各域读键及范围加入,core 由 class:read/schedule:read 决定。显式订阅再次校验通道,握手与 HTTP 共用数据库身份加载;权限/账号变更断开旧订阅。 -默认组只能分配给同角色;非 ADMIN 的权限管理员只能管理关联班级范围的自定义组, -组原有键和新键均不得超过自己当前权限。角色默认组只有 ADMIN 可改;删除组可能触发默认回落,仅 ADMIN 可执行。 -分配空数组恢复数据库角色默认组,分配任何组则仅取所选组并集;需要保留默认时显式同时选择同角色默认组。 +心跳、进度和命令回执只接受 CLASS_DEVICE,deviceKey 必须属于会话班级。远控只排队允许的系统指令,自动化始终假执行。安装包登记/删除使用管理员 client:update;班级推送使用 client:update-push。下载要求本班班级端或有范围的 client:read。版本与文件名在请求校验和路径构造两处拒绝不安全路径段。 -权限页保存前展示成员与权限差异,支持复制组、查看生效成员和分页审计。 -PermissionAudit 在组或分配事务中保存操作人、目标、前后 JSON;`GET /permissions/audit` 受 permission:manage 控制。 -成员权限由一次预取组和账号后计算,不逐账号重复加载。 +## 权限页与审计 -新增迁移为旧库已有 ADMIN 默认组补 promotion:manage;新库由默认模板创建。 -自定义组和已分配其他组的管理员不会自动获得该键,需要在权限页显式授予。 -班级端权限仍为空,本班名单、课表、通知、叫人和作业代录走显式员工守卫例外;班级端发布内容归属本班班主任。 +权限页默认展示成员与范围,每条分配独立选择范围,保存前预览新增/移除能力、每键合并范围、班级列表、混合范围提示、班主任专属提示和风险标记。模板页仅提供可分配能力,旧管理员键显示为停用。组织只读能力标注“不限班级”。路由用 `meta.permission` 检查读取能力;维护页面额外用 `meta.menuActions` 声明可执行动作,动作须在至少一个可读班级生效才显示侧栏、搜索及页签,有部分功能可操作就保留入口。`permissions/me.actionScopes` 结合范围和班主任、任课、发布者关系提供动作班级;班级管理动作另用 `manageScopes`。纯查看页面按读取能力展示,服务端始终做最终判定。 + +学期周次维护入口要求全校周次写能力或至少一个可维护的本班设置范围。非全校维护者进入后默认选择可编辑班级,仍可切换查看授权范围内的其他班级。 + +目录、模板、成员、分配预览和审计的公开契约见[API](api.md)。模板/分配和账号敏感操作写入 PermissionAudit;审计不保存密码明文或哈希。迁移与快照兼容见[数据模型](data-model.md)。 + +## 验证 + +`pnpm check:authz` 扫描旧授权符号和缺少显式键的查询,并接入 lint。`pnpm verify:authz` 使用临时 SQLite 验证接管班级、管理员提权、跨键借范围、科目改挂、跨班时间表/周次/导入、成绩隐私、通道订阅、设备冒用和旧快照等攻击场景。其他专项回归保留生命周期、课表、课件、设备与升级覆盖。验证不触及真实班级、不访问外网、不执行系统指令。 diff --git a/docs/dev/realtime.md b/docs/dev/realtime.md index 7767093..3230bff 100644 --- a/docs/dev/realtime.md +++ b/docs/dev/realtime.md @@ -5,22 +5,21 @@ description: 实际事件与房间、断线恢复和客户端提醒分工。 # 实时事件(Socket.IO) -连接使用 `io(url, { auth: { token } })`,服务端在握手校验 JWT。 +连接使用 `io(url, { auth: { token } })`,服务端握手校验 JWT 并与 HTTP 共用数据库身份加载。 事件与房间定义在 shared 的 `constants.ts`,载荷类型在 shared 的 `types.ts`,以这些契约和发送点为准。 ## 房间与定向推送 -| 房间 | 作用 | -| --------------- | -------------------------------------------------- | -| class:{classId} | 某班级的业务广播 | -| session:{id} | 会话定向名;员工 id 为账号 id,班级端 id 为班级 id | -| role:{role} | 角色房间名,定义在共享常量 | -| teacher:{id} | 教师房间名,定义在共享常量 | -| students | 班级端连接的广播房间,代表全班,不是个人学生账号 | -| teachers | 教师和管理员连接的广播房间 | +| 房间 | 作用 | +| ------------------------- | -------------------------------------------------- | +| class:{classId}:{channel} | 某班级对应读域的业务广播 | +| session:{id} | 会话定向名;员工 id 为账号 id,班级端 id 为班级 id | +| role:{role} | 角色房间名,定义在共享常量 | +| teacher:{id} | 教师房间名,定义在共享常量 | +| students | 班级端连接的广播房间,代表全班,不是个人学生账号 | +| teachers | 教师和管理员连接的广播房间 | -`realtime/socket.ts` 当前显式 join 可访问的 class 房间与 students/teachers 广播房间; -同时在 connected 载荷列出 session/role 名。不能把共享常量或该列表当成所有房间均已成功 join 的证明,实际订阅以 join 调用为准。 +`realtime/socket.ts` 按域加入授权班级房间,并加入 session/role 与 students/teachers 房间;connected 载荷列出实际已加入房间。 业务经 `realtime/bus.ts` 的 emitToClass/emitToSession/emitToRooms 推送。 叫人记录属于班级通知,并发送班级广播与班级会话定向事件;学生本身没有连接和个人房间。 @@ -47,3 +46,7 @@ description: 实际事件与房间、断线恢复和客户端提醒分工。 同步修改共享事件名与载荷、服务端发送点、Web `stores/realtime.ts`、客户端 `stores/realtime.ts` 及相关缓存/岛逻辑。 不要手写事件名;只改服务端会导致前端静默不刷新。涉及成绩时另检查隐私载荷和班级范围。 + +## 读域订阅 + +现行班级房间为 `class:{id}:{channel}`。channel 为 core/homework/notification/grade/courseware,事件映射来自 shared 的 SOCKET_EVENT_CHANNELS。旧 `class:{id}` 仅保留兼容名称,生产不订阅。班级端加入本班全部域;教师按对应读键和分配范围加入。`class:join` 接受旧 classId 字符串或 `{classId, channels}`,后者逐通道校验,有任一无权则拒绝整次请求。握手回查账号与角色,权限变更断开旧订阅。 diff --git a/docs/screenshots/plan-editor-list.png b/docs/screenshots/plan-editor-list.png index 27cc515b33e7c1c96e1c390953671a99b28bd080..a0d016cb4917681c81a83425371d9cc8c644a3e5 100644 GIT binary patch literal 74699 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%0A$`7+hzQ|`Tb zyS4Dlt__o;6$zdXiy?ZH7M2(ehy6%Fjm+)Hb+ubTl+Bd+*QX0w6194Gpi1acUihF zjV;Bor7p1l>yPV_V|2QB$!1h$h-I5567#W6U0HrK#frCv||6w4i)cY1hb;~I$ zf3z6|>~?MHC86T)@-;TG%zRxnl9f_}Jw@H@!x&eoH@dr8e;F=->2u`dk5!L35Sjyx zgZ&HfP@?&}W4Z=8R01y3qbx+0A7;nnP40&NsCXjCu~AW>xO^vtA!b!onoW}{1msYq zbzAyRw`Z=6x>i*$vK4LCi`o~`1lD|ZxgDdURr-<``}Zm|iyhl0wDMpaQ=_{-j94~g zJ4wr}J&TT<+YfHfhrFvCs65$U>eQa!LDtGFf(SvniYiTU9>EB7iB4F(2*?ssS}(Ni zdP!eN8W6Acf6*yTfKCC?nQ6z*zM?Ru7%@m~Sd-GHdiW4#<%j`I!UZd*5lO3*fs3eI zDwinaMIbs;({(tfe}?}uXD;Qd&mT|m8+-`~*d^&A$;f9q+YmJGCQCV6v1>kjvNNWE zMd!A0 zU#E?o7@KHVtPf{PXUBJkG)~w24=V2A6X6PbEgm)!w(C}(k~?otq^qi`ui|aET{B<7 zrlP9*W7mJz8}7{R`%8Ijf#&V4Exx-?-tuAI!_Rb`yg9%0l!9_Vz732-Wf%GJ>(`>N zY|52R-iUscs3f~7Kh)LAvA+^MlB8+AWdkM}D|*R=u#!iVv_`Hu8az-np$XelE}hTO zVv90$jg=M+oKS*bmqtOY(oBM-eqEOOl7D~f$G}B6I&_W{og24`-kamGSUebkb*yL4 z2lJwOj7Ly= z1Z{0)hZ2aw+;N}b9=sdA?aP6KhlTN?^Vs_dm(! zgpaVH7!-2(V`P9q-+dpirswJ%gNTX>_Nrv%`@7ro-D#7*cLB*nB|R;h79l%#OR?Zd zw=aRMj%Us}jC;wrSiSdLU#J-u5{7aZK_Qontr^82g^G4X^kP_MwVl!{%1{2wWv?f{ zUFaZ>%@I4_5B87EDp27sL8YZz$>)5d+oxzQJ+;c}(#;j+o{JwX3&?u+cr{wZ;*DxX z_V=DIVwN+2Q@~)Oen9J$3Go5y0x4h#5Bm%l%x3LZ=FquXsJ=0L znwX*$LmXe}=plD35`H>`kJA7#J|v`2XY2QSlgsyfex*VNQO4Qq638oHbXt56G3az5 zajB{FDR@{|qQ@H3n-ewYI%dbJxL~D2Rq8E7;f$5M+vwJ>7Z!eegHHR_rXrIs?aE#6HglS!i^Vgd2Gc6YS3i{yEM00D3)Bee@IDL`%({k!DO!72fajSqX4&<+b5vOoZ zo}BE@H(QLLl4?9VLXJ3Uap5DiBrs6%&a_C(lXpAF<*YDU&6P{dev)1UF|gBwvk0G9 zNZa;IKtn^q)U;C%xe+4m*x}CMuA@a_Eh;EPC@fE$g-R2jYqQ(p(q7J1r^=>q(dr81 zE29vw`Sb`VJm<|~^7r#e;*I_2q>f!!d>$N{;Ib|AC!Av{Eb(zD;&Rte*a4I_*%I@U zX0k$`5C$<`WF7fycf)ap1U36Rp6oX~7YHO6R!UzoI1GQ!pj;PLDAm1gPV@5cKi>lI zU;=x~*E%>OcW$goY_0(WcDKb! zmX!$-M!$HSQaD8lm-aLU?R?xfM!brG5C5*5w~ z_(;BD5e$d-#b@a^d`#^PorjMe={}t>-=?Of=?Kw_%Y*Z`peHzqVXinEaWq@|;w?_8 z^*n-eTc>QX5N<1v?Cn=5!Nhhm3Od{v;M5;jdou(FN1zi~YpFpxxZSBrIHyN;nxd zu~0UR1IMePsMuqN4Uejy_YR!StKfL&sapv7*p4jE@rq^T$JSTO%)Ey?tE6XtN(g&3 z0n=dr7YjJg9-OmYm2!F!_4b?}yUZCN#G+EpBT-a#D4rbq>ogB-@b2!sO{3|7_z5axSifUqk`8TI>W_uQp1C2)%ORbLBI zhfcgA-_b=T`jFQ93}RkWR8?97b&MZDv^KII8g$0hHH0D5`VA021aJzKwEsuOwGt>O zV5As-oM}~`@$b>O9ki%uiNvvypsKAQJVPQLq&?Ja>UNgV)`f59TkD%&QOt$c_^xK5 zuUPgiI_<5IkFP&Aj*-b4#XxY+oU8f_s`wva$JFeH@oBpW!iw`Jda%B4yFzycn>c8O zENQT=Ep(6it?7K^+lZ zH0cCV$6+|DmEy3^)B2ifyn@?-f_jFUE|%&@}I9HI=e`ZZy*2?lC1P z^%Ti2J2-*A2A6m6nQupX0id1Gl4ZdPlpCU%#aru5>X0`(-(^6~W9(L1N$<_mM?+20QgF3f@iP;X`H z>I&Xb`-VX*N_7y6zpF~o(2a-OE!ps{ul;^F!OqmDWLry4VOY@er7+b zgX;|MfAxTxDCgEnKhsrXcfjel5&EUXS?_k8V7V*AVpr5km^Fmd&?4~*P|2yXjLhhX zU5s8(jvJ1T%J?$}_QMwStM^*1`OY%X)9+2)ZB*tHf(Dx>l<@f3)I($Jdi}+MJ;0ww(f9}QO-E#tJkHv$mRRuFt z;XHLwQZ+g=Dv3AVY>Ju+nTpO8)oDZHPRJ)l7VVZle~=kYe{X@cXs}&jvzRN$FIKs@ zSkV$=NO5cP@c@&`10?+o|BB50#2+%_IJ(`?@<07Xj8@g!U*8^CYoz8#W5+H0xP{5K zUT;bFSLC_$fst@z)O>o2YrywWS7B*m`p6~{QlGoJyrsy!2JOqp-s~3v+H_&TJH+_- z)WqV|r$s_YfiJMj#-y0kg=LVKdta6(yA+L=blN>e)0gkdIRVuUr(ps^WmdGlFg&8! zJB`mB`^~9D4z~z=?hfg zv+D1g8uXW63{v~ECO!aJYnmtDDn3}k+emR7+up^yJcR3r>_?;PP}o@Cw}UdqOffi(sYLLE z!E5XYt4r}P{YtFa_#Hdb_ww-)$zkil7flvv6`jT=)UbzHH`WmVshBIrpiXXjIzPq9 z$yu=vX^=|=O#tJGHBgUL1JH4$o4pLXTx$S3S|m-iaKCANE-#N5^3IaRPb@Q@-O5AY zz1Ntd84hpVLcT;Kd4V$ZTBYjVvnfRMd$P~av@iPl`fh0MEOqOHVYrM*RU$M&E$0#v zX8C10(_ib--^jQ>QTriRvPYtcU*X?q% zuJftBn}5|=_&wTwN2SEPF71^N>X7ZX?lu}OSJ;P1HFKIB6rI7ujRqYAv<0Ti#{U7L zV6-2IP8?*U9JxgE^WPvjIa?}LCfS8R$Ex8ZBb=?$akm~Mh#dNEe|;*aL0b((WxI)9 zMb{7Gg(==hJ2@=1@y7yF@~q=@anbETlCNUQ12a%4EtpgR^p}wHJ#JWdv=4LwU7eX> zys}+zGV@HUs!hkfw{rU8seJClZVMjcg5ab7bD6r@UtVoeq=pc3wpwDrRB1Mv9@<5c z%V4i`g`WYV}IK_ z$Q)ZG@x<5R-fO#vh$-f^JBflI^IZeF5G;-!4WRABBgQ8GfTWxP$SyFXI-|My9-02F z&E`1gRC{QuXU6UQxhDj&Rg6VfT(SiB_i;@T>og5_@XWrbaSzl}8(}>I%AI!YoqJvP z5RZ9>^-tp-l#=fxKC8{V_05UT!w!JrK4={WlQ`S713c*r#S$AD(`a)%E8?r*x!`m? zZ)FPOfjH=-E=Nwq;q=1Bkm}q<_~%gfzYoOFkzTLP8y;;S!F>XJX0y=bN3-$#?pIFr z%=-$r5ZwV;mN=izM)!3kAOI!Ga4`eZ7Y;$ungTGK}rg-RF zN}Tn@K{%x#9HW>g)IRCo7(ylPMcw1zdo!N?5 zRyOE+%L(}}MvIYPKBcYxTCASM!Rav(kLfcRe}CT)BKDZjSL`RAq***d6mP3_te}L( z`2lS_1bzX4GzFKbl>Mb7&Q@>i{p`e`98YSP++wx8aM@nw>FZJgvYQ#E)o};}@)SAc z#h|pTN3fnlP3!}CX#lvbk!-`9;inJ^`*;b7M?|pt8B=&sOrK`TYzBCpknO?gnVcJdHE0ICmHEwnytd>*Xi^#S*Tg)g_N?xDkDhPFqBkULMD z^nAwVRe(9LR>ADjv8z#N04dm&X*>S|`DwF{Thht>m59mtAdA2fV$@TN$qs$Qd{nQ% z!kppS-s&sYP-ly}N_9TR?$7s{I)K7nahqp!;mCbbH76R;{S z=Nk5b>S1!%+gqc45f>;I*PYIxsvcKnu8Y}1x-y1cgZ%kpTbFWlZi`lf$M_g-8+cO= zmX_lzW=kT0E0iXi&)kEM$4rs@ktD7D-@yFb9i*(z>wYk`d|X9q@;)=OC`j|B>EHmn{X9wKyYQ5f!LGfOcsjv z=t$>8Ym~j`iw;2-q>lN{ zFx#K(J-LTuyy@-jAORUbC^Z#^hxOzD4@-`Za~|W$!~x|$oPt*(H2b;*_By_ya)Kdm zz_hCzF~pD3MB?6`c?<2CkYJ#k$-Rwb01#HPOqt=%p^zcDW?f$+pfGkjUk2d& z6ZofrILmSt7cNo~68X-klG#fG8Uahb(}AjmGE(<+ppsB#bE$RjqPyb#Jp3eq!}g?h ztW|kIUl@*Y19Gv>_i5uL7n~0#s8BA}WyOPbTe?sG)L{6qwZq|tU7KFd(I^W24Q@69 zw}xi-DqaGp2*AE+ySnAq;)!;%>ddFKj=0^58B3xEkMJbJ^>(l-S^o0 z>v%gB&)Y6Ns8zf)8z@Sgn*=bC9)Pi+W%T+t9PU@2Xa;4>$R6P2Tq5nDBU5h=)7Gsg z2?GUq_KHTUSb7%Hg~emTKMq$Q;*-&JesS95Qqr|D9NL^7-vlCt)fYiHgoCs_`Y(|K(%(YadZrrw zcJJRJJFE#Fn4@Iu4h%bzIAN1x78#uHH^EBU-rh^FTqfB8HL9iQmnUto;XMV^T;bWj zysPl}&$F4JNE2BlxrG{w`IRSDo92#vdEvPp*U19`n;#Ma^-qQ1l5vRq!`{r&4^WAr zkVuBZ!`5orhcuo}@1MHx%G^6%Nds$9?T<{)3p0w_szqe^gz*}yB5!_rh!CE&V+FD9 z(=dn6FY;q`t*p0K0ft3jw5#)f(Kxjanp!W}cX?xjgUgBa1e|uAEQh@8!wpVy^)D7w zg0KQ(P!Ct*B=c`T(J6H3Lr$#>qmQ@vAwiAG1ezaEDoQoI)J09?Z0|HXp+=^wm^*=t zlV@Q6qX$N0L#}5zjIaIPOWs4WxoWDO50rW&BsRj)R!?WXq?-9l2oN%@MhG`os$z&@8GC{8%Gj(UPPqEizP*e>-d9C*CkRQUQ%O@&`D zm!8r7+sn8yKFHi*1Sq;Nkmed5Wuw?vbDfSSwpTIR4z3s9uSlh{b2Pn4zOAT!$)b?{ zaR@9Si|$D=ik8{etvhsY`QmeMm^OAcs44H4$m)->rZ?@M9EmAL*)Vt&w%*Suh%|uL zoIC4?ETg1asF=U;E;CDb1_NGh+=t&@(}JjR1s!8)=-Mxic{Ut+{&c$lvU*g1<-)Gb zK1_ZhmKj##^k3S`%#3jchy`E-Vg+)KmPX_y31yS7bhOmOCt@H8ekz`}Jf^0{17{nL zy)6$}v8+LVr)IZxf~V6M>J((XaiGxCy2i)Q<;cjQ@Q5PdKD7A$0+~z5MZ}SwjxPOm zag#2^&1!nwsq+9;qb~j4xj*aOtZ-+`p%rSOBx4fjbqY0!b#eoc#Q!CdXk)vxEI>m) z_kMI6b;^Zk_L!@Y zwGfY;H9|CTgJ>kuW5bf#n=Z_kC;G zodKrN1<*|O(*=`L>mcb!oNdnb4$g;RVI$8rK}lmz78+eE z&XB1HmKdyweerRQjyB~8D^Nc6+@B0#aS-V&N$OWuz3_1%If+F|4t^oo=HTM~{=JvC z(M7Y2a+X019~y+rcCBgdO}u|Ba9=S8weaM>DFKw{PhS@NesKDya(q4l^M&v@%F;LY zhjC)FbFD!6&<}|=jG5x4>W6;d6xm)W%?R0>{1M4^{u|7kDYgSgD8FUj1~8#O%FBoM)^MHS zdftYvCq?uc9ol62c<_E+&#XosiO#Y{ZnXGl{q1_e)KPyLo6-LGyCo^pMzFI3F<&s_ z{>hJgvWJD+{xJj5-5P4+KzIJQBgf62xQEr5f@ld0F=FKq5P0-mGCzw*U9Ys_cA_gW zHHpjJ?}c4 zxxwOcQ_BITLy(Z?73uRReS=gXW0iJ=wZY@}aLr9~uOkbG)-ECPhNRRpL<7K!v1OM6Y z)k0}GL7Ke{oOjEmFHJ#JG5;2*_0qEY*1zjyswu+^X8n;1Bz^p7{lIYOXs|X+UK|?2 zpX`(1JuByVFXkPs&ZqctQF#c$b;Db;2=n-m& z6%}C}sD%57HQPYku7nhwIs?h(AAk;~5(fv4&}{xwIt>XDeUe7`2RE~&-H~|a2Lr1g z8Q?nQMlQ_&K!_QXikez~6Wvanf%k_)6(sHb?iV{5Sx3$3OIDoB@Au=Y%pk24eYwWc zk$J^~;nd9Sml`pf!|%QuqmYj<44G25QBh7*MhhWI9Hg(G;fKA|IQqJ*iEc8Ok~#l; z_Voo5sE3QO0sbdl>+UDd?L98dkI5cff9Fz2MumsR-{Jv}$NTDa2RiuRF9_iQP4lTg ztr+y&K&=S08{o3$2lvw8xGw?B>yK`)SsUKWw#eREC)+&|KMQ2-+VG^3uwq7fdo++Z z60*pnQ6_?}MmHO0`Q4C8BFaEpfATdI@^T+lcTU?0rNf@xQ%tQsH!>sRk;LX&#t=5f zPjKkmNKEI6nUV1oblProQCQh@QV<3VXY6Z z3t2=&B+IknwRe^oQz$8p-SxwI)V4Y6}VL81eM-O{ntEhgRwjk`5t zCv45AB-SQQ&W{{Y>1HgfwjILx?qamzbF+g&Kxwwvuryo2?<<_&dh*&Y_#8gXMbv$) zr{HgW>%dFN#o3ukH=xeO?hTy2esQoI( zKhlyJOsMd?*b$Xt9*!l?^_P?R*7uIRStQBHdTqu>gDITMf7fbs7>#U9(fzgUK0YhK zoO@|D9bze*0ix0;HDsMxU~u#Kq61cKr75p(EYjvGb+qJ+fv+60GqpZ}W8T=-gMq`~ z)64xWfi&+2e`YCp~ObDqpZ&>m5e zABp61NKPo*%JS|k-TyemH`E_>t)emY{b()vjCdWpI#4@P0f)|qPpik>dvx!nFYB1o zcp#Lwp)V`^_Tz%xTP#Lg3q~iuY_cFuMMNY2G4b&%MG>Z8ouz*L&>{)2B1s z=yeh`b&j_9=P%X^>9zVjPpjA?h+WEp>?x%t?lGm6RaFBU7T>FlFTBsN(cKLsU`{9x z0NReVwYARn_5*=0YTFCNY6ievMOJK!D)>Y5wvSm33kOTfLJd^xPCo=YYPSb|N43tl z&L<6JiZvdz2BGuc$g8VQf`f03C`u8p9UMi%)VNq-NPp)4*1xDHkyQ(BqK*yolS)jJ z5}(pms_B|l`dh$eWp`MIg<@HY47ibz>29dL=I5^XhNU-vgO5n`HKE}(udzp5f^FTj zf>d)>%$tn#X@x*h7oEL=wi{}xx###KBoZTQJVtg?9UR95#hz<_JMImQ(b%h^w^!PRe807e(MnHIfB8*XCa@-fjx#7Ls zTgnElHWgCJyfnK$+uGW~V}5abbR-r^sIMjdn#MJip%wX|&EH@O7KjOqKoI(I{jxl}r1|3S+u>7&XXdLkp8b@GXi0V$`-0<#( zbz!<3J{O}=8%Do^sPar1YgZ_ykz085FB&6tms{Kj9)89YGEIZ$a56u7IGpPjrE@Ei z5%(pc&iA@$#N~euWw6Q@l>vbBL@0&(pa456Ox}ak-a~Mx8+7u;x|5&wv#S4N2~JdR zy4kM`XpE2F+|;^ow5s0}8|N@C9wYa8{s-8tM`#o*J#gH%FrU(H)ZM2Iud({OA^nl@ z5pgb<;hv^1jplZ~(VvcaV~0iJPsXB;EywHJ zOuU0o+CEf^AqO?@L4`H2VTRP63U}k3!N)b&cv*E*gDn!3K8x_!Y~=F{L~Uf=X4K`0axU z^_vXExugYU2&l+vILDHNeLU2~-}SU-Oz%R-sY4&Q&N8~rtt-7GC4`R&PGf(ufMQY2 zHp@XGU{wpj=eAz>NyLBOp7ffIp?Is*(><8n`GfLX+{TcngiKa&S z|J`wt-uhi5{nR#Yy|BqA@u+k?pEHIJo~&{m3~qli{_3+?5L?C5(l=+{_GATn!dZJS zew8AB>N2sYhw~>|BQ?Y*HZgAGb+V)HjVqTcs``KzLroz3B8SOZ3@4ZkW~Q_5TMc)6SPz!(NT1L3d5d`%md1{PO@Rs?L$_?Vw3-HYeAVH z=jrDysG=lAgLE_UE&Q!48dmK+|NZhz0vBpV0hUE{r;>{&#U??KH-AdA2{#laXOs1_}f3JC++bD9OL@t z*47W@$MxFLd(^Fn2(aTGna$n40WS?)wWFZjINcoSD#*Md;&w{mbsezWKZVkbyI0=z z#WUj;9c4|NfzvX~jT>NE`0ty@xiT`a|yWIss3fqCNx z-Js>wvWIz<%XIbrgQc_2(3B;?7ddrcu7>{Q%Y{FUj`hpq_j`W}2Y1{&rpE7WR#E<$W?CW({hdEeEmTn&ZFd(iFM|T8H4E;TK|MQe=Daotdl&iThop@4?^zl>P!Z}USJNZ|yUTwTy#=_ofw31cw{Ui)pR~{Ml$_>vrGB+xS za;@uxY_wzt37t;;CxC7_?sPW|!69-JQ@2^E?^4n$W%GPqCDLBD~otMNivi zGWzQ8ADW7QT6}TNQDF^yFeiCjoJ7hEIGI_XO-mB)^wbl4=-U{gQH8XWmgq>%2(_z% z2S0uagkiLvmsrNf=?Cts)nPdp4~_rB1&!Iz9L>CXTUO9M)Wpg$1<)81q=R$MW{I@I2#O8p0x}D>7#p3`2>b;POI33-t2ODW$Ei&auZSA?`#-cBbg^E?^tsJM zN{w_~v^Wn~_c9I+58(YA>izDPtORvo!A0&fU?$^{_V8$`EyW%<4toXw#1gV6cm_PZ z?_;2gLb`mn2%PU^Li{2$iM8a)J{(FmD*|2-@RIHAc?o5e8rh!7x*dyV2eMr ze*Lh?Tw&5MXtm(!NLvlNO?dsuMyiwTPm@DC(S(KV(mT>fPWmYr+>CNNv0fweMW3(Bx*ASu`N z_Rb~7Bq#-d(;cP}Nzs_;D!>k8Q~5q>xwjSU284wTrmpoFv#|no=OdWfh!#@-C~-B0 zlOyOP3dWK}OJ=#h4y}t6_TW>6Jv&ND3X?sGp7p(rPh7 z;r)*RKVBQNj890oZz}wb7kK@+A0p1kiM4NitYdidLPRxVX3+AY-=p*(bOEAO7WiEi1aRT4`b7ge%y% zdX1>-YH)NC76ZqvgqUqPTyZ7OiPI@v{L<)MOshAL8{c+^81c=iRZyg#J}eyz zr(B3yX!vXK+KQns-bub7&x0C}B6|t#k~TI!0N1%7=&gQzcxrKxWvZu;VY6NAIb+ey zYRccyAuf;(rdOD8k)7So%72`s)L#balEbya{K72g!sM?dZM0uvDQe zQbH`mCv@bThldXn^%)T9X!J)~^yTPCGYe$MnRjHCIp3c+537-`)}gps@N%r&+8qM~ zeh@Z)&6UORZ}jH6lT|eWkkitYSj-1%8aIhT#sh{NP5<{y@#dS6#YwB*RHI>X_5rY&-g5Q{xnz^yVx zS~8ar^dQ8*`hTi=Q;z;s^^O8F!oRBCZ$3F-Bl%21*k`gfWDz(wWu5~Uus z%zAOe{&0qrE9?^ux8q)xoX_4@x5OX5dOr)twn7Nld5`;)_L@`HlY;}dV-yd4v^c&3 z;p47-~Cg4ph~ zi0A{^3t-AX%TeUU_XnC-%6{P!A-1Q^c`4p}LEi9ZLF+{>uBX4kUz_p`@?A*JCHT#A z*i6U6x?^)Y?yP8KDdBKMF2YuciHidmjMxr&Y7dmg2Slx0FK--Rt+8}<3}m*hrZkHg zl=50yK8hX8F;XG{WzAWv9-7jIfPNRycv&R=s7z6@dMQNqJOPB;3!x^gg~LY+ZtQ#a zbi+(xB|9)mmHYrfCK|{?8m)7EeRQ^+uruj3Xt(r(_Eo^L67rg3!lEmcGCRQpc(DJ(vrl>lq!A8qzG0bOu<$Asrt7Bt zu8Q-+XyW&YW-}Foafw|lRpgoBI;@g;%95pVrfim#E9i%~lO03}s2Uu)8WAApZQds> zYH>vFu766)wF9quhZvD)L-#p24%E_r{dBy+OoxN7P!5&9xIh6iuuqY^H;xReDq=%zNtngvdYQEJiolsI}5cgs9awNOk%O#M3 z1O%!SKfv*K9v+^Ty=`**$2$NZ?B=F?8kR9a(74Kh{>Wr#2>d4@y|;G{o}1hi$Lw=p zgiUp~V8NA6m}0{X^lJ^@!gt*9*_1B%qRPFF)((toF$Y923)GG@G92V@kX1_o-RJ+( z0Lgc$U|VCd2};fTy!sl5h8bZ71p+$Z^GO2N5u#b0OZ2ZJK-hq60t+M9YV{ZNQN%JO zLkG}WG;HgXwMy+EC}`9s92FE#^HcH5(eXci>>r7-Zfn;pu_~JI;pk5D(A7_0Q^72h z>5_|gG{TchWp#%PS#JeXZR#r5Kk}*uM>$Md zU(lhWqNAguQ~@eSFi3m)#qnjoV<6jl3Q$$ux&MNaiiZ*!El8liWq!t#f?0guV;jmZMi#Uzcbz+>*UHXxO?soOr^18BxE?Z$-bwcj@&JWqSM<=nBcu^6?e?yS%LXe**K zm@T7ZQ@^}uV%}b?uFvR{pAk!-8m!E7nf*M8`AmMdlbW_ZymD(o^T93Ku~OmtJeGbDQ`)wjS;Yn_MJaVH*> zm7Q3zjhxUbS!Q4E^vH_2iijc6=Xxz02nq@a2&m(_L~g!!>682*(H(RIf^WA2s%+Lc z;|n9sJG0*ge?0T;jjbS)N|D+&igXviQH@TtJNc@r*1v_~A6j74nXm;FjKnf=RHnJP zq3NZ$5K{E@^vbB0)>-Fe*s@IyErb4|QB?^~R8r{XDjsaIG>x|%BZi1?y_{VzeWdwm zc75%RgG==%>0!hMsuVn?QBMDmn1*ZYUoH8cD8z?v*lu_mbeBkl_QC?p zuUo$!A&&wGHk-r3*hzYqAFo}TW= z?Tk}@eRtTE+MXO--YGb7A%C{gO|kBjpT5r(^iPhXz3^I5Z6nA9zJRoK+xgmL`%wUd zKWFob2u~`4sXfe}ci4^NakAR``wPU|-ypG#a>quvIidJEctW-*Ci%YZ>t;cyWpjJ5 zSn?N%$1Yv7Y!TRJh#TZ4*)sNOi@EX)Ca&ch)^~|!dn!>?Li6hMg)vkz=^bFz9wSRv z4xvTa09WS;@Ai1FTH}}hr8J=tsa9gkoa8zbY>7{yJeuTUhwhKhkV z&Mr#pYB3&tK1Fr+D-eSo&eHL0#&>d#cb88^S^EVsc54!JhjC=*@l%ayN8P-N1iWXM z>KY}x%w|0s430LNV+P)xR&vN!W>!2|)HYOs#_P5XE z9pXRJ3rj6emTT!M?UG}13J6ZLJ>T(ZFai20&opH`*27SrhW&5IdRmC&<6Gt ztUj83?7QlH9aevd?k#+Zuk)))DMuP|>4zA3RalAT&@(sTFk|0_SNFM?=((eOGd7qg zMqc;12sVA2JwQY;(`Lkp(&C-L+E~+nAuW2p>9hbO;G@hM*>o<=K!ZMZGsR+unpbID zqeVqUQDgE=gy6_v8l+-ARjFL_;y6ZFtC^sLW{?#Ya%KR4z)=9<0)1};yBCD9NvP<|DR75l4Y5OhNM zFkHR6Ch(63rZLp=8@ub!M*Y7CYB7}`!Gn5pBWcCSS1@($zG+G7X#uWt)`X;6^vz0!2Udy**zC0~i1V6g8hosh6*d$!pN zj$Z~j94)+*f{lR+vd{nGVvHUxtoOU~JU!(I9Lw2T98g_K^Tj(>q|y)CaexgyxUP3V#}$xeuFETkLqiJlx9eRX zZF2g~+0N9I9c}?~kl$O1d&cT2su;7YczCQdS+G(k@%B@JjDIGy1Wd6jR1BCds0}%D zYwF7 zL18~m?#MV)6rCJQ%s=+k%Nv`VafsN)!5-@$x9nbn-cKF~kkqAUpsY!d+5E||Pge43 z-g5H@Pc6;J56&#nRa4NIrJ+u$69tsKFY=|z*jU~AF*s3>=&;OK5`atyf#at{d|`}s z@Ydc+D`0{pIQv>#g@c%5`upWtFQ|yKbuv(8pJRIL{+fGaYqr|W>p%Ie{r~Xx)=^cr zd%G_NA+3NYDI!wR-6bF$(kUS+J?T`sl@96d?vfHI>F(~HbnScMde*bvSnu9v>~ju( zIdF{0oby-reSNR%b5;BBd9bXNGTHGzvwGAweZqw}+8+DYU2kiLPs#g1$2KDb6<-eEP2OESsTL z->hNWQ6=tC`+^!@IhyN*C%xfR*VowQ7o?j??talOClw_uQVP;ZfQ!|g6XXdT{MRlG zMro*U$+kc$frF^sb6X|4IYJr!d=H3U$h_I&4bs}0X$9H&nGjF9dDex66liOfa|d*j zur(PCXmej9uO)O_3V<($$!0DXtE~?fNQ7>bF&Ro?t->}fuhP{;pS8bs-dpGg#O8QW z;ZBoUe{rExf(YI8H}!|d;6z)*kCK$u**l=C5w3ty|V)!t)k%B zg#OH$Pcddu$^$|cZjLy;)bMAYYCbqwVp z%^xh?765@bFod&VR#r75C#PVEw54msT029=qp8cxmQ5{`wmlR`Zdg2NXXWJ0RYI1KSeYzsrT~jhZH7l+^S7#v>T`V^q3b0;ocxFBf>`*xB5>X)(P# zSy=c|T$72sQ4QDP)E55~w{w#$euy#q12n=xP342c&q|PP3|K37{vqIA?)ku_ffLpw z$i}Hhlb3IGWj|Qs*_B-|+Ij7QcXJ;v2q9-VpvkAwh7;HDuW__CG0I$q>3}9Uv0)L*=Fr)GMGR3d;r`s}o`Ffn78Ob86 zZ~8W?E)qEjCa`u}*KTLc#Z68w`|f4I8?DafUoRq~*lFw9XYQ<)tI=dU;?_uxhKY_q zr8VZ2y3!HkZokLO#AM1R{0hyJ(vN`CrCbR@DGP*K;8d+sx9TzB0qf(>pYNd`J|^;O z>j+*vhsOyT4Bp|}i~GhNi5vDZZ2HKtDT$*aPTFu@h715!KwbC>h})itGS_Q|kY?A0cya5a^RHm6ewle}1o>!WW%5 zf!p~03Sl{1`@M+JPiIajy;-r$4W=?rS6*YM?H~6O03JX)B2;Lj4V(pLrY_^9niwhf z`$gu|8hj>(o93H)uia~>>{b+7(h>JEo+NS}*S&qY5Ui2?3aH0_;2z#=aw(YPG}m0C zM1RO=rgD}~2x$&i@kSStt%1y9;fP`)DGMjSciYRnJ7L(6O3^)9!c@oF0Wh7W+A|1D#^g|R%C?OJV?zCy-D5UnBryLNARD2QN+h0>QI3v zuH4dz+7|S_x#}3er>KU0Ew{>#3PvdD&xAwIN2J^oJ_tRk-?x zR!!R(fczYckkOZtuRmT)qJ*XuL#BGR1C0e?I0xKB;NV`Gu{k{RD188S`oroLx>C;= zT-IxBaA|R#a+xCxZab~7Knwd4yDQW%Wcc%cicOR|QYX!`NI6&@jc&3$xX|wA_Kc3k zb)~JCbc!u{q8a?^#rb=YB0U%27+7`os@J{4<4(_uWzlZZ_@4<3r7SJgC#Cz^)+xk zVNS9d)@@HR>21t)f3qwyQQp%5!!I9*lj}!CoTSW0HC6Q>!jqb6eTasZVE^+ZB;|~M zdbaI^44K$sDwa)>z4x*k1{ruA{ z1&=!}Jhlw+`j!5~J9IjB#Y&bXLr117-KgaOTtW=W?GFG<0aZAFEEYF5Id9`YOu+2> z1dYf<_T(Gr@Bk$koFinS3X7&WtFzm57u`0?bQb@GH*-X z$${0055X7Rz}Ry%Tap0&nZL9Ewl@b}PUFKl@Xwz^TXfzquVy%YIxdC2ROkY6Ahvp; zeh^8emmq!YG|uyqo1T9DM>8q6RWkJRAaX{Fs1X#%YRSnjref_pAIz4l=L{KAxF*lJ z{3dh1os+i6GV%cUjXlPICtkelUIs6EVm>`VeOl$vtDfNqhgqNY z+9*Ul)m0Nh!I@yv=TX~B`wU&|A#XGdVhsx?z8Pofpm0QmMZ9^Vrz!+il^&I?Tr>)^9$IpdAF!;cO! zNiOubh(=`fslH~9)L*SF=g_f!GFW}=zJp=kLj4gulk58vL<=f^n_z{P7Jgv?cGkJGSeU8^&~hNx%9wTh`kw(Hc29G5+w z^`|lCO!SQi3GPSrXZ(n8YH!z-1wSaxea2$DD0UTl&txX|Wgp1494a-Qj7agtm-$C+ z!Z@7ID@-p#G=bb;v&U0LF*ASdIXoH{9-TNKw@3lnK?MhbE`2?15j5=w8a_76@}I_5 z9CN09qy6+8qAH*Bmg?KDkMb5Z3NLHALTIdH<&uS*Lr-4ph)m+hKdME7_xKGMh%7eG z7pMTXkOyXJVPz3^2%v>f4ky>^nah_}KbJs3Do|*lk@K$kf>4+0Jn)lBSs0geG9-(DCqV;C5 z6(0->jB+7ya}(#L9*0hsLQ_eY49R}>iI=xwtwK{eM7l^RV*IA!BWi(Ns$SNL^eTXp z5G@Y}o{T4->v=Cf77pS%mi8ZVN1`D?p){b$!+rpaMdydk1`jk1gtRj^`Y~;4Ntl&W zvQ(DVi^VW_zFsVFrbvVsd^E40*371F^MBrsmE#{IAC%Eq6Po@eNDr5-P?}D+mB=`I z$ck6n_2UISV5LMRSov`h+xn0Rm0;(TARtnit2|~z=Y;!e{^yT+Y=MgtnC2t;J1Ls_ zU5}G208qh~Pr@G|DLKaTOXy79DW~JHsXq=VnfVx8!Hi#mj%&~>G2Zl97`OOpJ2GnZ zmFVcJzFu)PuBNs2`%c3RzMiNpT4*7e2b&}pB@`13k0R+*M#Xd{sq!Q2>@u(lW&(JidCzXG&Ozp%(+$}}BRqfp5Zn)Mjj7Ic z;5(eySxwo1-P^*@4W4sFxxFt3s132ZRfj6?(DT?la245-y`_2E($OYbLL`T666DWj zFA&FRk0W7_v-(@0m(V6XhHLc~uniUi=??b1jd*4AiQ$bjwj=WxqNtv4+Nx0+ZUGbJ z`C&HwB7>>==)$xcSUPkfLwM7aEF0=MVz#R1Tml6n>~H(oC`IuJOPgA+R6$`#W-kTP|kM{ z%8);>JyaeL0lg$*@t502bZ4VAHX;?iOvPcolE-BfAUXCmDCwnTx&Z(Y)8Z3 zwd6DH;qvn3rhZ%``i`NE$?>E)%e(FE_ju5@(bd-%YDnAO-X38}zyFTC1m+0!phXAm zgBoPyhTtzT6EYUuQ#?tqI*aSy3-~|x`I;X70S2C=atkGC3@sE zSAh6A+h9uWjSZX+AQ|l!o$^qB**49AN+1P63b3D*-fNmwPz9*{l!-s zrUxSO_1VyPWRdo?9pLt#8|%C1a-9G1nal0QKWc&RN>QN_7<(D+4yeb82RL}NDFa4I zh0MyyF*bcO3=9mAgC_gFSy;16y`G4zRPXjg+4||v;P_z^mZHFBy%1nwQ!B{Iu8z6? z*omXyZH7E7yKIfDHUi2jo<^mN4ThSbq30>G04E(NsY~|ol#xXeltU`>9o@g!vN)t@ zGgCU1KgibQ`N&o@#h*JYVN3r)^7=_C5mo;IpVKda$2r7J6cRe$4U8C-YRSdL z^b04?1!+*#n671~={GO73Zj--*tg9yMD^3pQmQe~c{>EKB7rx>XbZ4oL4D4jzcLLP zCOuGi&VF3i^TL~MTS9dO?(GS*nvXnE2jpR^dVXNk2hKFJwfB{WLnk{faja~BgC0QQ zaE-1t=J{`}`fzYNcb=<>6KLn#WA+#+@OrKnP@UcqLTT?Ws0Tu`-w;jn=b8;Ovn(Fl zn^FXVnyFmY9kwEYFB%w4G=yaHmH2=q zqFuOMX$og-eqQsFECZm1vS!eO#IzxRNz>KuFScUvVLyG!dYa(00zj=udq{1 zkn!#ldDwY_L#pV&mzH1h^WmOnS#GX4%t{~$4xwG~6J!SOycq%C~V*zPE z@Y|if56pmBl`#7b>*1JzW~>6$H}O}DIc@6Fw@nvyR+?AIhljf5r$!iEAD_eq*-`D9 z-sfMtyPtE%sTCyN0_peW#6?mvsDGglr=yjINrIdmItdJ~jR0`r@{V+$!uGhf)~Nx2 zh(QP>%-MM$BNo@Q&|eqnLMDr8cnfOF*$}D$0M=zutpc{~iTPuf4&5&GMFukW;UF*k ztU;qvT7i?Zt+e#-)b>6cT(BVrw|V=$NilyBetytlbQKQ>DRec^_K$bmgIDByuOYiA zL|_pOrh$;-3E{qcu=3WjNG5GF`XsP}LZI;7L1wTp znNY9}zG3ek|C$fD55mn4XkE;G1Q+o{ouP%56$4MtY?Z~8mrsfBZo^)m63YAW1Aqho zUZq}8dG)VmB@l|U2oR{h;Z|t@4Up^Gax~f6n40qEU=nMhHhf1a&UTdIe#4i{5(S#4PIKmw7)=FZTe}z z8hSoUeqInePOt-kki^MTPCd)Uz>z>f%6L57>A}uR1h{@Nl6i25Lr3FIUIWLE1~^v{ zh&t~|KqHVXfWb%);zi-Q42}TEDAd0~r|JN2X ziO&Xc5@e?9>+9R=19IS016jJIb-A=>4lzy%H4om^NOr-+33d3lb?0dr%AT>;a`<}Y zs+QZ7ukz$r82hIEQ$LDRdv7BUPWt50d&&mg)QReWFut}WC2F{G25u1PT$OQqh zb0{D`6alxh-8=06;!LTz*il5~Mx6;gjauS<_+3~uP};)s&KR=Kv#|sbCBQZV`um-R zH}!!64_P$Vbi4#Blc@$lZRa}|rVSjwdW${yZXl=;MlN43QXE2LRXx}6D(Rjx8_k0< zEZ~U7L?HV4fjM`1eH-&TS+qpOaWACxGw{9ukx*bW%V*p3=cL+EIoWh|TqTXGUc>7) zF@)nIWE7U7R24H$x2|&PZikEfjiq3p_lA;Ur>S7mR*nYydOe-&7N&cw`DuNrWb7|JI-jP zkATQ+D9wic%(Nn(1^5=6mb|DpjUX7Osl;*TU}#<2*BhT4`->ee8P_dJ@i-=?C@ive7#8N&*-9iO5q*?Zf()Zv|(GjwKr3)5ljuk*?0>^e%9qrJ|yusG)Ijx<(_91rZ+p z+N@Jotu#OXYK`z#N-{=EUXALvD1e{hV9w7idbHMPLgysYYIa4o27?WWqtOV*mrp2` zkWdaT*0`J|Wt(`ljPmZo6~HRiD!g6@1sOi?dBUjy1}VfOh&ed}*$PzuH@0d*%nbY$ z92U86DT}|CjpE#{TyVVGSD^i7&wZt{B<3!XB%%WVvB7%gmkt=V0Kd0+9Jkf4`Fp?X zxk+?5VKo3C8$d4gy&8BKq4eBu-dxA`GP`z1s2lUvm4*+1vYVD}%K2&)S>O`KeERff z@&mk+cU>*)2>s&R;xX3UQi9I}K%0T<`N->lC%`()!{yNbW1?)g*wqY_&u0RM`qlZ7 z($PkdxUq3ggPAd4LIa!%GbqjI1Ekp4SYZ+*GVHuL$3DA-`T1nWP(Hl*J(&YvaF@gj z#)*t{5p$|$SyHzxak_5eOYw~`=jL!HqUqDvE-S)U%haeq-22A)j*VT--O${G9 zxWN0JKng%(3nn(|aV0UrUr0@es;YV`qJHTHak8-adEdKiKI5*S}W&*K4El8d$5dmNtRB?_QLn6UO$HX@X% zk1f5Ex9(aI6$+C}d7$BcKSGA@mXWi|1+v@QGaYxJDJe-8H@XEGiQ*)@FRnORZ?UVe z4%$hC5HRo<_31Ny6g8f__NKG8I9JAJ?RA~+V=_tw@269dAA9KN2SmPE!SPdrhm<8v2Mc>Om_#iCZ|0^zwEh;~%@;o5 z2}DyCHAk1}Y%n#NRGKR`ab8?nIszW!SSd90ID`HH1tnwPiX%XM_)ccvez{83{OWt3 z(QxsMM?ApB9_1-oVmz~b9M z6kl*tr^;V^_ndpmK`=*wo*dBOrSe8rm%ockRu?$GRZ+XJx6&)jlJztgEO+P(&yvo{ zaHr;8R!4obktt909Ky^}VY`sh3+-E6%cGE2t|p&<0n_R(PRk%?wkYVFz#5dgxOkwq zq(DWWIgc7ZE+2{%8udC$+pWtSkzihxIc^g8fbh7plSW*Sc`4*El9)prD~tR40kQgc zbL42Z&QP64c%wi~vn5YCB3q)qp&=4k7_J;y~EExKL4x!iky zcJ{`_iJ>643D%HP|N0lHyW_j*-ONbqqcgu^Wo>^w;3Y~YEvN771#_pnukZibm%r`@ z;UwHs9KNUKfl;uC0HHA0;o|pA6R(q7BGknyj`=fOS(Qv+FRjq9W`QpfCx3z zdc(}T{P}Wk3IwCJ@>2c56Z@n7mEo?Z`{?lKjon50S%oh;VU0t{{6=x>hryFHy`Ut{U&C6gBvAqhqe_3|6-wCj4bZKis^UCdUDT{uAN!v= zqM--8GvZ{Y_0?gY2i7xeTW`hU1ZBL_Mi2N}Ti zq6F70zT223&CT)Mgi=%4tDH77LTzm^YK_OeFf@SBXZE-t&l4%gikN>|ASR!|Y^WE*`=6nNt#E~c0N}f?Wk2Ok zYrRU{y?8{5e;9IAE-ca42SVjUo{Z=LtQ7OfNg(378uXmyi!DXdjg!m5`@nnyd20rz z;p0UP5F*re@1>+RH4>IrRdw9e*qyQOojth@t?!e2`Axj2&fIJE!&$4BmEO|Q>mW8n z9=;ps(VDi4FqVB!wdryA_#g=<=VsmQ)jPx6s_TQ*epv#&`El>*)LlLNO(X12lP+&Q z4Q~^*grCF1FMd2KQ>N|x@IJbMmHJTE!0urG?LZ8rASteq4ENH$V$P?_CCdl1qojPd zsSdAsP?3=#nN>M%AeuMt>0TLEV?Kk^@M3Ia1hDf_k@jz|x{G{Ji6kF4SMIq71Z@L| z*Vm&px~uYQ!$uX!qC}|8@;bwUH<0!x&*wBrMNzY^bZ_YpFQEQ}{d4t!`i!cUmc;}5 zi&6^fN)K%sVvK;_JqKh5{N231_FX)?kI$@ z>&?=@B>L)0^VHHm*ibE2;OvJO-Mh&>Iu`~`=S;?sS|?56kG4hGma9)8gYFB0Zi==n zggwmy0`SoRfMb)<^70`;KdM}0a3H>NR#{HBp|Dm7zeAB$3j{W4)MMqT`ecq!2H_2O z+lo~oQBLxVXY(R-)Ljs`blt`VTS3>#j5A|LXkgZMT4iOd^ov8fr!EKW2vf0(zPNNx zjhHJ!0nrF!%&pwHZpTkATxT|u!_YH>jnRlf zw7Be?0n`#yh-f<|r)#>b0jL7mI(DKm0knAp!hnC{6oa1$uV2Z;|Gk<>%&GrkhO%KL z(;qnJuM2lt;RqO%C!Vn``4cf8+)ZpcbNqSU%Eadx)8}E6TCWC?Y?y{Ty0-FCrGn7I z1(qCGk<8RK)Et_nETOJ-5I;iNC+36{kMyK2>gvQbGF0iiusQ7i0F5?cVi-j1mg~O6 zRleTd^64$O*<%}CJJuqe2VfVnJ9R5@s2z53(%^##DDkJx&~NE1#4bjRv7mVB6}a$e z-sg=J-5m9T?Goy~{dvFgzjc_=i@f<`o>wkWH*WchYR>)eaT=GPvSwe)iMP^*fALHQ zv8$heFV1|H?kd&Q<_|bNK5ckng$%8%qQU_s1ts8|$F+>#-yb#G-PY@#Nyw(^c7JaZ1C>Ap7v7gw9M_zp`}vZ(^p}#=jUDmC3RQ%vJQqNx2U( zgGsr#jmU9CSe`OxanG;|^+Q5O z57>N6Nu*i{c0HiTFvB10-0W|TwRGeTfWhw>F)^FzDxv%aPV_0Z-PK&T`>Dw%GV6=e zIbSqFr@ilWuC6msd*|PTVWDhzCh82Oowa>vIwV>`h@2)4*32Dm11Td{dl}$7l#WtA z#N2}*XW+04|6Pxy=u$qpfb_t7uX2npu5yhTpu z3I4L8mCj&L#WkP?{iOwj!xK+M4##g$d@v}K)6`trp*cM zYPs1tU20_M%s6`ByE(;p%+@Qh)5M! z&Kw#VGn=}?_bkj8eq^oLFe@xdm|#L3$@}>xcm9R@1z77+e0O)|4Zsf}xIUhBHUPxp zoBe?$vWyH6L77OHh>J#AkGuWxnbc;tR6ddCq(D7`@1MrlizxdhBqG90sF)&>88lhvb|^_aFq%j5!Sy4 zHQTo)M+>AK3RH?7O-YIe6toqrGAVD(W>giM&4=G@<uwpeZxE8bz^(;iyb#P)dfZCSBF`ZK9Cx4{q-I%G19()qluauq5K`#CAz4;RSGDWno?i&_ImJLPxtkOof13I^V|juDms*f6a^|X-Thi^?D#$erq>;GiK_n$Zx`k z>Z517bKW-rDA8=b&+I#wX^Pnf28&cd1}U(s%HIJlDW?RYvDEojoN93mO};<`1XigP zn(FuB_a0tfu?iov+DN)H>6gp z;P$VQCG3uIDWOl%Jxvb&qhh952FNpJNSbc_lH#1`1l)q3;dvzJz^qlR=jRi_4*vmtlao?{yNF^;k8^2zG#vNp2ROJy z7`+c1ib!!|mW~c}bFOd}bZg166Y0iR)R)mOu;Yl0u)Vf zzsD53*X*|-)R$2ALp@EFy(Q097U8ke#|KZ>Ksf#i)*|yFpDG?nJ?ok7HMzEQjU%Jk zH{>fI0)o{3w@!W6BL9M%0hNN_(0+Xu>45&1BGaOj1^WEArm@su;5o1+pH~olPBrit zksZXJ>)!2u>yF#uMna6#1L|@?mZn#u1zd6&$mqhs5lKx~d%j+twe}9J+L6p?$;zOs z(OIlk&zd%>6LxE!8-CWgh~&x9_5j!55hXARyMjf0T_2|%;5$;8sa;gHd>^(=QX``S z0Gj$bv;YGlv07~hT+oFxsYx#U%r0p$#lIQ>5hp$j{pQV{r)LEvu|;gNQU0jWwF0t+ ztR)LXnA0Eo^)JGU_5Z$u};L9Znwnyr6-b#Pu^b8wYpDUd9 zx3>uK@1{088;By<#&D2Y<&N|K)2d_=r?=`8#Mw3PYK#y7y0kDBq=a)CRdu$}C;v~KSwPnXqXgDZzmkC%lj%~NsM>xRUF9ET3~6@#Hwvfr#4Ks)8d`Vv`C|CptxV0i}1ERiu|g)j#)d7Y2QQg zllmhPVIXFJ!S;!C>7UXC$4t^sP|#{sTnWZ|8S)Nev6n6dV@{3($JrXR$GX`9bGEUP zQC5<+KA?Ekh!J=h1Dl?bKY7X6RO(*tipZ5zpx6gBgOlLjlyBf8u$kucBy}Q0`H@*b7R8H60j3> z{u~S_%Zpf1*)doCG$p|C`~Is}0yZwV`{`e}o8-X$?ST#k*nfTt2XXidI0Bd4de`f4 z_aB6?=;WWDe@jUImzVAYMh%DySObA6VRGK))Aeq+oQ zw=)4FqwF)vn_Pg>_`~H)rQKPB)Mknp6F zSZ!AcnQ~1{4Ehp(Frneb3WQUNQ6LC&{<;mY+2sGd4#v@7`s zjS|~({}HkP1#(H9?H!AHp64@k2;K5m1h8!Na#<_6H|!tmGz0P%56ET~@HZZ`A@0cY=oI56p4vzP7Ya z{Bf^;rOQuh=G$@}lq_>!O+gS&!k8v4>F)7I-%&nb$5Jcl3(HBSRY|gk{R@+-%{E0p zKfiak24y=gT}p0~jR`VCtAGS2!0@nWu6fI8zmadda0ur0Sl9eCUG4ug9@uJ7xe*c$ zqoS0ZyFa=$cJ-Uzlh0}E?hdql3Rqf&6{Z!(BP^@?tc~E z&~2U0uL$2EyC`6LM%kEBC5G5K(oT?YsbWoZW5)Twx%0VMMKoM83XE1ESjpqcD93|t z@ZNTDa~wTOP{8L*M_L*k*mkz;_hEpywwbs9M1Ft?9l+Ld)dN%_Ad{hTgYko)dKL-> znmkp#s^MGm0|?IMURF9W=QRywL4Mwlx6i{$BeHRc-^o)g2x3=hvY_e(od&SBOw=hosMT!8>ri4hUJ}F_dN>l2($?tHm_g2@Cbcust6vRlM`iY zZ5WRKq%Zcm#+m=O^hIdM$?k*%7H9(z-oq#Q^4n`7LTiof5E#te8nwEr;2xG!Y1fG!U!Hb7^> zBameNZ7Lz>B-o?}xQM<=H9pBI1#YXcSpk6o1(nnQ3tKmytUC=VEyQ&Ib?P^mfNMD{ zwEGgf0b=PVU`9Ja7q_voX$N4$R^WpG`XQSE^8*Z7#ex)PC(RwTz}Ziy`}0>{o;Y3p z9@hD(Wo`knQ6T4$vOl-nng5J zRE(7M^c;)v1JwX((gjMyz^m5c4Px#RLowcIzODua=2ex zv_cbYJD~-)9y~N-sk@N!f6Bh=X|&Idgt9m`x{bVX%84y*mi#S>Gja2?l?SO z_~{~0w7Zt4ulcOu8ZUVCz#n$iI*VD*zso2fWU3HKtCHbrw)*k;U*2XJ>}?(`>ZRX< z+y@WeT-Mrxlt0Z=a0UM?m5NKFWhL)TkF!s z%62zeIe%#Z=8ghcA|U1wIoQ$6$R73G*FFCC4=vc1Y-2M9#L1Bn;C9~rO9l;fy}YQq zl5&21XGj_tC}8ip)2J;Wbk+WT2-(`gTqaX-^!J4x*u{bl)*bxh3xn#rpdY<~Wr?d! z=6IK|Y(3Un{3Dn0ce}$K`vY2%lIZWB8-^>3`4T>Z3-K!LfrkO?3BR5S=4i?VZl@t_ zUT)WgniUt?X`-5Zth|Nk<4LILoaho_v%iG)PhEfSFbV50@p}t9+lMx z+Rr)PmWbZ!*2&~QO=G(})9XxfIf0+cTQv0MNt35iht3*nH-P%{FJB}urrqa&wTz06 z&cdYg1jyt{s&XS`h8VH=3&VnW1=JK2K|w*X6fRyIxQBFjXd(-WDJe68weVZV7bv*2 z2oEoYn3H5|4pERvTLd>M$_*-NhwTDqt!s)o8iBhC^T`thH6_|vuaU5wJhM=;n<7bm zUo1ir&>lZ-;wHiIj;SU&IeF9~qgSqEqiSc4VlvjE&;?M$LNWnwMB3f^Oq*uPoxR|^ z4){i<63%v}7P;DX-$OI{Nf`%E2yMF>9>OI&f-UJ(xr z+ny|mXhRP*J7sECUU#YHTZh}dH9P`s--?dH?bJn$v%`#6FBg6d=zaS(BP5t#bm8Fe zN+XT)cGi1KG9XIJWx=sF9}O89TU*8HmsVH9*FBnON9XwX-=ia2zgM-^pAx)!i=(9f z#8_VeBY?)?)xa<(We^fND%h%0g2ubi7}2%tSt#*WMjY~0c5ET`lj4B}Ov4qe5Dozpl;_11bG)11|Cat{P!g8*?MuSNw zvNv|_9xtUiu5Nbyt%>_>k?sx+Yvt*cW9URMK85{LBG$;u;-4{*dtSe5!9_N72hx)^ zu0%l8bOnyynAeGpCpGxwbH&bmTD4~H*qqPHpu^MY`Z_$2Z+6Zt$2t-!`O|^GQVM$@?*_jf0zsKYh>!*Ia$?`o5VpLRukXOy25HewVYc{(ZwqKwSXdms3w-vL zE~2KU%Ubu+I=qb4m}+0Q*FQzNNcrmR$cjrSVLm@!TSa)_PPoVc3}O9y^2nfhijwH! zwd>Z=?a_8tl6z;~kN&2jGD913nZ!0+yTiHHu98Z`spMl)fZz3bP-9mxC+e z9i#IOe70su<0`K?tt`4yT1D4So0N+5S6wd)t5uurry8p?8z)W+M@-I->C5zm%GdV3 z^OV)se`z5-aN;IG2J*j;ErC3li;{g zkzZQMNkJj|J=c;O*;u=fD@vm+*Z4t`Uxs`8>5MbR5vriUt3=AH;KgrWi?`gkuAMC{ zzgl*h6%Of~XT5bC8oAbda^p2Q!+Dgxs#k(;YPmlr#iC#=zBcvuCtrt*=3=0`&9u|S zY~#7ipG9?NILBRzd*fO@s>jXE zQ}Oi9Vr`rDvuT!IbJb-gsV$(hQbZYEs5FnbVSSZoYE2zEAFBp+;qonn*eC)io9h?6Ek7v_~XeeJw>hYn* zO+@vR&*8VMJ4%utSZ${ZIW?hnrgv?>C7>vS;HBlvEn;rbg#6qt2Iy`q~>%+09d19vO}-UXD}- zS52X4p46YU9QB6C2z2j1vTAq+4CLf^y^W`79d2mIsM|yn*YVJTKJEsOJ@-5{rbG`$ zZ%(s@PJM2h6TwrzVmztfuZ;VnF9ijg#X$2`LvOE0kjN5P+&aQzYO%Cd-bVt3#svXd zMO6u6%yDW!JBaS=?xs$2f~*N3^ogdX)jGG#Q+}5SB}3e1T`88RR#BwF5oE}hMX0s7 zrR!lbs+i1l`jqiT@yc?%p9EU8(E@)o@a~`&T!-9{Ge6HpVS?MK@{9K(Nhsb(3NcNu zdXLLTpI&8`C0I;V1kguC%|xOSF@NQ?&okue1<&)lL^i*2+g`x{3tS)L_ZmwRaEB~N z-(wkzh>Yao>k<+Z+rXz*^7rM%nNu~Jt9^7oMXhe8E}6Txq}B&}w|1xuxQi!FrK9!B znKqoR<9JKt$<6^T(D61#z;~~l%y0Qs3y^n#SIUS=n~njrFkms8;map$U zv9LS%)rv9D29^lt^yTH2b;^>Kug4cHw2>;+(rvcM;MQI4a16qN#02P3kH@evlRQ~R zC<%KP?Cm8adUiC<{EK!ds20PGYd0|qsTmuu`%dR>-;Et%kn@aRaGscXYcHWa>%Wz6 z&gdYz4z#rGm^y6x`P0wBcyMLTZ=v-}^E8ns&0BoNj^%RJcnIs3K5>pFtDwK*U|oAn z-S%Q!N$QE3=OIb}>(!NOUY^O-wL-JNJ@{zkEnBB4G8|;$SwiCmX=MeKo-N4mF#D#l zAk{bMr|r!0;&+-rcT*Jslg^Z-L2!e)Dc`_DD^u9Y&d=vPo>C3ZA;DbWv458ytvnc_ zVgIIr=3-3B{_woqGM36beV$}}ZxBS*b)&}pT2P!Qp!eS1zSL5^dD5HZ>IPN~UeU6; zXWgGYxkqg2IfKI8qtAFLDXQBLs~22x2DCY9jkM$AS|;O{KI9#HEkkar*c*m2 zI7zafa5WhRNGx)xWPiYIIN8DH`t<9CTFkC*&@)~rD9NsrRo(LjCDsN%zL=BT8D4Bs{l!Iox_5PT8}TL_A|S@z;&bZLHz964VhhMofCxj2 zMyMS_LtXgxA6puSgm>O|AFI@4;&j_9=ZF)It`@X`OBoWCF-=V!820gk3~ku{ek1AL zK}DS_C{#BxHkQ=e&`(-gx3ofuHh_=Hz>`Mt>#JA>qkqKB?uvFj_EWqknDe5hX|bR0 z-Ehx;0KU0;M!zf;IjfD5VIQLv2n`kX&)nH4#MJxl;f;|uBkU?ZCs#~;yrRY*=1dFy zgLkgYyATB%9_T=x9cYsq-q6bN?+;wa5J|Y5)tT`j(WOVr-dwhZPHhn9tSQ)*Z01!L zKuTfXJ_7jm$DVvaWk~!;FR^Y(LYL&`MUb8;k|v+y@JV38cRwsfYhWl#`f-sLEf-Ux zO(m{Kz&lVwlN$K>e+1_y5E2WL0n_ka{gkCL4d1OUeL@8SqWTO%eXS0>87!7VtF&>m zndY8w`{Vj_pq*Ruc;IRD%?^iKQT2>326j^i81C*ztYz)+4eiy|*2?f+*XJaBjcmA$ zRMyTy$?dk^7$JjND5?C2J-u1u>(wC?=rghrMiqbA##B);8J^{aON9KOVigx#Twi|H zRRr)M78jp{54^*Iw&Ly|h9MQ@7L7TI)qi>LK<3(x_0=oCFF{~M-labnqb0{I;4bWZ zvi%r9Cbp37u7TQB1qy8N1Ud4p>}}&V!N!^GNy+hHg5u_j>c3j@Y~gMAK_zICi|omC z%Q`2cDS?H}F0UjUy<0Bxl(!*95Ua6noeiUyJN+8I;UN09Bq(5bd(JG6$g)60?lA_% z?D@$PI0)YV=m1p!bK*+kN({X5K30>*`$Hc&`)leY0dSw{M-m$OcryU?ce7l>?T0#Vb-&jt6yNzUc0)YT{?v* z8l3r4bYW*LFZG$1Jr~um?vhYd|0KmKCMfgn2*j};Cqbp{cIL1xWfc|Wi1PB)t!!{E zU%wxQk=2Dkevp^nHJ7R+S2&(@)u6s3Mm2Ig7K~j>xZ>XYNt-ND?|3ge2*?LhGxnTe-j#aFY=hvu=sl{eh07ESkB(R@~d3 z`auYKuyn9V#W7Vz8ZVdS8xD+H*1K)6;mP0#Ly`~`4l3NF|DQoSj4i4b0vZ9i+c75# z#?4a0oO$~yZT$yp=$2p=$8NAXV}=FR+Q(E6pK}jm{%1;Z;=nL5!9E~5lf^b^k6ov) z?||S8Azdw9ipXDDfM>&Uk5<^bdg!W^Sna-WMDshY=7awz3Os_VWe1}G+F?Li5oe?5 zp0A)UEp-=@tX51ZmL>zlionxm5^0`%_WvV>@xDtVRnlhMWTDHVgvDH6RqQVe=g!!M zSK;Ev2tvx}?5GG2b{=+g&;Kn}{)Rn&7hyTAfUj?m&f&#COIQ+SsDv&!WN8C1Vo0M3 z$PMJ%QplWx>b>$qFnp5VlvC0w;h^!X`~{kgf;GHoxAOn#MReeH=TkIxWSN-X5B%UZHzOSAAD_+Mx65CQo$wGbzHT%5jpq}z$?2fB z9PxG>nw}MF#}6O)KPvw15PVzpqA6^!EBn{i!cpfho%*S4(iU^E-as!=9S6XYp^eBV zj=0kj(4QMSTxFKgJpa^gL;_*=l#j4`innsKN_ef-IzxoNiRFIW<9d740Ktos;Omv> zR%}k$aVucgoHBS*U^s&BCoAUln&L27)-%&_S>Pk)#bvTJ`E9mK%;PYt;sF6bij#RFZr6~Sul{wiT7wDtYU_Ooe~rlSM`s1W;8QkGZlF^ z37Jp+AsV*3He_dNsS>PN3UInT+!XW2m3byo6puEZ_Ty~QkC|+3BoZYY58~V3D8fW#BhSJU(=7B!(97DE;>ahE+w44CA386+UepXH%A68F-!rb=UVO#<;7n`VMtCcZ0# zI0QZviI%9_qNH(=oW;S#Zo@nRJ9K!>s^ ziwLKSy_AqO|NZ|`1@cV{GtBH5Hu7@R=HGY)02-S1<|WE0%Ml(dudWaCe;FPd*WbcE zfR)kz&aM3afsGLc0sbxjNBbeuYrr2$QMDF`fUmAz4us?_k&fxhM;J zkpLSNxK--)P*#h`{l7hj01nZx9~IAJ-32h4F^shuz$zNu1N`%WJ_?kxOXT&Iq>6h4 zUt|8;O27pf=*{aMjf~m z+Fh4$Crzl8K4Cv@7q43a$X8IwN}kbX||XfJmGyGlr&X7O1dYQdhAvTMpe5 zX${d*(LDmt$4R5(_UtXk-$Bs*8@0EL=3hAOUG(>_9o^*&SRa7cnOy*eOKFS%+!4!2 zlvmNk?CeHE8F)r$&-%M%Q;FPeiKjo-BH^<5@OL3robGkW(|yYZwORVJDm+xOZZu(a z(fsYZ^I!O?aX6j#X2uN>NNwS;X}6FJP%wED9!}>YpJW?;C_vjKfzVl04CR?YegMF9 zdg|*NInsIyToyKZ0_r}n;XVj)*7)(`xz3^h z0|PgEYTE03Z%6GSO;A%TxUrKu{g)kad2@;9@RF+*ohNWjTJ}2ea#t(pWZX(f1?#p_T3T3I?~J57_kd!ypWJx>*Xe^&m_Hc12~!%c<1o({1`xnF zH0;Jr5oZf3vHGjYa7-+?FA89)K!lc6cDOeCOO`uU7iEj>FHl7g|mZk6B_Z0 z88wgA(;`EPwNCf(T$eawU9;^y+F9%=GEpvr!anfl%51iHmudm_fM$|z0PuA=S*AI* z{ITKXID1Xek5}|?y5UlM2%DgPRTVg0Ib~<|U-=ex%^8genvLVDsOG*{jyyIr#w5nZ zTXh6(U!;k$E&1=*Ee|a_>i!@ORW7iG<*-)ugYz%u39M-PU2VkbDspxcpux-eA zZ8k2FTHA+ni-3;~buJ-`Agb$0pVR0Th3$BIETWdx)V}vSc|~xR0wv&KX6x+maQp78 zn#H=7lko{diXCw1`y1-Q2OgHR+({S42Y!e&E^ldVcj3@rBxHX89QcY~lU|-yZU(OC zKwZF3qQ&m`AA+ogZioMMRyb8ZJ7(MdOnw0mSdQr@Nr2D}U3le6jDDsbHxXIBoMsR0 zctxY1|Ep)^>}S)-uM3;QPJ8mqH$#e^D=nvcx$Vx4C~}Rb|yH9?MjWf zBGW0Sq-0SLga;5bpEaH=tgOO*1a&%&)-NY7O3z$I7{LZ-+fgFV_k{rW*rdh6J{Ms1 zaUvxAX!mbEq5rLj9bNKg>ft!N?p-15D%6-mbCr%ezVPy#^l&R7fb00b$%ka=K9?kv z$F_yk{W9#4qlTJhcnhXtVS&&4p!SAh{6N|ZAZ&pPdrxLG_p6A-=InxFVy5J{KhM>! z6sL-+rbIm>GS@zu(FET^G|&a%HUD8TyApjNDjHYxDFiX0v3|M;vvk1H5}wYv{Ow)i zClUn8khj#hSc-~R-zl?cUsMUl^f5WE>{N_433+S=Bsq3JO(=c_+rTcO+9 zb9Gh0YaM|=j0v(d&@GXmIN9B&7m|y1SF?;3pk;mDNzLGvJYM|D-9uqp?ciWu_GG55 z!tJ5dgF)k)AHTr&o`Q+0@eTpgF%`LRgL&1!3v*?k(99#;ok#o@wHF!2RiC~0U?nYw5* zKYBrp3AkP2{&-&}&UFN&d!LDtUMD0(;JXETdfy+-0i-^6>W~OdzQ;r6j14j%fXU4w zbH8>p`eDmv?fDky&)USH4<AF^JyiAml;s*1Gkq<}Lua|}54_We;llNpc3Dzng#R(y_JbR6+|$`VdHTx@W> zg(oecM&hjUlw2HbQfJ6WX!Ipr6`ZdttX<9aLPlw!==>1xcCnJ^O2p@xRNMPDA}*|E z8wyW;G;c)Muapy>r2lc8e_Z-+r_o=$QHU%fSxyr)p>Kf0}RR>h;c(H!j{#0O!4b)AQ^?jbSuPR0e9( zn=#nELuqk5UUa)QmOWw@I4fU$E0$<`$$3-*#Au;rfumzmzBmu9Kk6MBl+Z5=$pZ!s zq(HJ4a2W}Z&jd&TkHg8F4DcNlIl1Tx=`_Swn4oGX)w_;=ve3_aHaao!W~XV8Rdywv zRk_W!0s)04qLOIs1eG`2x8x78dK_SPu)5@L;V-sj!Dk9ssjjyI7`&c3Ru?9c7>=Et z9I0Og1NA@J)Qe|_x8!Zbt4`sV4;2ET?cmH7fkkykvhfV?9st+y!vVX3c})C%myDUl zm`jmX*W*P={>wgA+NO*13f+8Pr- znQzgaN;k~5a#iG9t8a^EnES|ijseIHE0O0B_`)Lc~b8AT}e$x@SRXAok&&60aR z6~+CG87-(%X&rAH!lJ>otpJRG0L(%;N!k)qptq!qEiUmpi{wx1t-lDxisxgz{43oR zMT&!&@(i}4t?Q!&{)f{Qa^F6^IxAqNxlTCl534tu$f#n>Zkt7mr%RJEU`)c*AX1)S$shiU_IMz4*@hDzBtO<^)u=IT1+Yrecdq#5bttLcH*#=x@?S911RI zzEJjTho@1hM4_+j3V;9f7463`nL2u#DbcuGek@;_k`_D=1)8tpihSxu#x{Xf9V=bvH!y^nF4Lg#yEsr*C z4btp*KUo#h@7xB;FZeYybajs$qjGaQr5PH&@Y1RJ>z_fS5fMWf2pL&ctLYOhr@1dS z|9Q!Whlj^~+3d*We3%JqY^ERyFe8bWMzedg!fwKWpn98F2AVfibac{ka?_RmMnu!n zT!a(gS?JC@DoJ$bJt9`&sf0+C&7)YbMEcJ=&)>0!EA_5AR)_u_BNJ2sHK1yjmaB-1 zyV12Ix4TbNt3gH|eS(RJS>DPwP_z-nA~It`DT0X;f%V}iJTlaJnYK_= zOiCt9xtpM<@(WVO(RExC^-V&;fU!v~EB~(-6fGYjx|gKaLRGv|#>C_zq@)~-jFQj= zJew_K9;x(Yjq@PCW~;4Jb@HpFv4Kn7Z+$Ufjg*gK;?J*>OFP2{$^l-f{U*(K`CzFk zROjB!)yKQ*;l8;;Q0p4=4H+@3`N2S4RCNH$Tr&8qh%x3xoo51A z<$??v^THG?C@Ctc8ai0<*+O$S&yM9z4*?`{H_>8~rl_#WbFCpR6=D%bRw5~3S7%kI zRmUPF#l!zhyJFbrtPG47J#4%XbpK@S`LmTwlCFM;r)#siilm5%!BG83PsljA(nl{l5k*(`exlmB zSW#irX*?VkMSSqAr)j1ndcd>{0dDp5@7@_ts{!@@cHD*I-oeM-3GpSZQdS|8Z*aJj z;QS^xY$C~v5E`=6eBaufQ??ovBvLmqp>&0d-+wa95aSirY?dU%LPQ4VRLd2Zo_Wh!$@l09sWLzAhdRUCfH5K(5;x|%_V7c*$Atj4GCbF@pdOZ6zsATZF zYc_j(`@%vha*t~#vlTfak&J2~mMHm{jSYj;L#=lXYYxyi4;*R07?4m7K3!TZS(H)F zYs@Thpk1`b#!#*U<4*{Tzt`9n#>lg)m|MfZyt%5~ZvWdBt^g5YU}Mp%wW#$&!Eo8! zw7SmdcG&e)dsP`CVkAt0`i?aYdg9D{9_3gueIIq967)LH7;`9g&xEO%ME1r5kPXTD0%6w?kszDj{t?qJz2hG6TQ;xt(23PT60slYIfF@cj3Pj{g4qs0{pYi!MS!MgmX@%ea|ICq_-Po3jRijYLgdeW0+;#<@o5 zm74BRM6i9)XBnV7#7=nb!FnMjc6SqY4Jw`!=_l`rY=7w>!1>(m{4Ynz=kUY^YG$QW zs@2h7OUI{p*eA{e{kBVy{3jfB%6L;X1QqXh$we7N=U+4x@BctGkmuKBwVncjaa@<( z5X=f-=Zz@X<%`dk`1mFg)`%S6S8ypckbFKbtrNY+`>Ux1>xCK|w?5IeHXe_;^GGcE zyNk4Xa`NP2woU90GLIwG@1N}q^IgZj111`89zN)zy4)iw9U3MkVGqN1XrqoT4oG5D;q^)e&nZcr2(lp~NmoMwRHOy_J+kC5B%paJ}F9Hf`-aqq}#bLju zer{EYetL{!b~EU2qoJl2YTmp%C_95X^A3hpRrO%xfm zm!p3k_6-z!LbrY)(nqDmm$#J_6&;SGa6@F7uMaB;_YKurpeBc>Yr|M{n`WwxJ9lm6 zk8fQX?H5nifZ2E*3CLXviRGaAQFPYo_K>#G>e0lwDVj~VbO&+HT!!~D3B!!IgtTj?mP^5YPi`wdHWKvG*j3#OIL%{3}LN@O1y7Tc|WUf-*HIx zJmp_7kF*q&&+HU_Dd*LA&>zuJdG#^M5@S)Kj&=1C3_!`>R!<^(MdRIWB<784#~us0 zt9vAu$SZEQQ>X3<#fdz0Y%Iw$|=|>6tIW@uW$8+R}^3%C%LIM&BJYZPH~%jIbymbX{)hVlHRWeuu0DE3$2$Qs;Ab%Mcf)p@2_Y7 z{D=o~Wt3~a_fDI;h-YYCHJcj`AvS1qVSSApLn-3o?sDY7dmglWlFY46fg9saX`8ej ztE2Ge1zZr|bPfl1)$R@HyMaLDpjR`c=X-a4c;(fvf!(;FCC><}e#t&@L_$w2%stBd zdGzU7&ts#}vPZM0UaSp^*FABAeHH=5{-QJ0XjVr;~{#Z^q#y%Mu$m*~>ccJR`?u$ae5I-?&ExFNdqZ-IE$ zU*029{q|1r zPgXOt&LaQQ?gjldLd4ftO+YDK2av1G!q~AU&zTJ)9QJ<50V1E)N2_yDG55PoZ(bAL zOU(@d;8F@2N5)BB;HORuWMZ1xkijYM7q%Rn`%1%c2=yf-d(L+>y(fFyG96$gQD*<_ z<&A7lS^S;PBx&ZjI!UynWHl98vm)o!wI#JQCn?-K(cH|9XouW6z z(-n(FvQabrZ?Dr_E%WbS)8iF>_W(#`(|NI~S1_v$Mh=H{y3ddfQv<4X=PJGq(u5`0sP% zt@_vEgOxpZo1fs|SpETo&*!&m;%F>Gob@E+O&OC^;#pRhxmS0xdvi)c!u6?eY)l6s ziPpx{xz`jC_2{STpjap2*CT(@YZFLo{gk=U?&iG$cE?+SgM;Z44*WzQzL;j^CO!6+6(CPRq9TW8>Nsj$a27_k6iDgX8&opjn z9>vE#3NiD-+J&OAQ%$roXYTddnIF3qiaL7c!z2!GqM(jbV z+O8-|%+T68^9${M38fLfQ=I7j-&3Y}!LRy97;a}aA%`@dXHB^#_af-7hV+Ke!{~?J z)^+}fduN?G%NbwjRTvO;%qPoSKJv%b|SlyL^+XyL~L04Doscc(^v(YqdUr`?( z(Tl^{i&o#dhz360n?ny;VjmKJ)Ux;)%cA&h6y#vov})SEDOnv2dw2+;$f()*H2nc{ zE1dICS@H7emZmH!yoh}z?ofEe(El76PT&VDBvC>2sI=UNO>CaaLqw*4n#kGGU`(dw zW?-kkbWw7Msr|BZPvrT_ZY_J-S}U^cdjG4mGaFjWMlagZGg;d`SXN0Xo0Y9jK1~5E zd;{!X<(^cwkYY@-t8W(j6B}hMf)V*M6=ob&iKXARre@;UNjVx!Bbl@{L#DHY?>jp? zQTZMuTBYwYz5Uw@R||^2wq?+?Y31#_*b5ww1@{{g@N-?zv=2z|hQy{Oc-rk_5O^g=PXZeKHntzQ+9MqVOA7uhrB0`4JT{ z6yYjOY8*J;(k3wutr>$rs{^0I1C&|^9{a^=&j(YUJfYF=^wdHth8q5KgDdhG8d7%(5WG92le2VH;iQjwrV$*GywfeO z*W&yC3k$GJEGoIQTEMEd^$jLvW?tJ)CGV}kEOEm7^mWN<#fqpX_vMN_Xa2+LWs^o|`@FhUeD!>t^*wq9=GIx+S)pm7 zM1sDGn$)cRhYx;W)vIjL;o-C+OKVEoE&m+jf&B)@t1t|Cn=&`yxfieciN1ZZ>5WQ? zm5Y%P$;%~MbczKO3Jo-Vu;)~&t<*s7{YheHC!lbAz>*R%h)dX?qp38_prfNP9sHVr z0GFu`U^u`dumjD8NIle zHXVoMTyeuv8mXtW41y%v4qYcl#?Fx_Q!ufjGBY`e?~&1pYR-3bbr6V2ODpdNrZ3wM1Vtk#8}_x*NrcF7dwzB_jV}&c5$Tn z`J_TcmA-B;<(Hh85t9uESKtktW}_efgQcf@Y4F_h8@1jgcc-dq-;*~TNO+?om}3un z1ppLI@=pVD(Y;!*-3Ne|TNj(TZ!vF0u^UeNi!6Yj4Z(iq+kPkyXm{y9@pE!J$HS{6435baUs1U}M4{{ry7o^vUmA$!|oX)J~vQxf#;|A#b(rE==Ig*Iu%5UX)-k_+E zixdeZ$2&g-7@m0pw=^F(UKYTFScp%ute~KONp-f-xG|@1v09)z*`Y7^o&B4KPr5mY z?dB^i9#o#rN3ceVNd|iW$&5E5ZG~>$Ga@w@iHp77!ZRx&Yfplv+60k$JUee5J+JQ)2HuA6FM8{kzlo$q&vqr6?Kmu~iONgDfNP!asW+ z#r#P%Jm&bJn(~U3P^{p0D05FsIQQ~Q4>{I%l8^WBk;U0+)e!`f*6b;1Cbghnori&= zZ}=OUNJZoWGVd!c7+V<yMi5IcYEWVlie6vZH(%GGm*DJ&02c?` zNUY>SH)t1tvjAWRi$4^8t4s>|K^GXPwY9boJp^&(gS=A$9q(?ZgKfR~;TDtdYQvuV zFY2N%2}Tm=Vr-IJqh8>W;-s}Q4QTITnV~I})f#G-o$b?ZbZ!g{lB}YWiQg{aFyXS> zG>xqleL)Bf--vMDBr*e{Ex(Ww>l#p}$}kh~jf4*!RE{>=$hZ9IF5fgw{nhsqsUz>( zn+6h2oagQZmv7|-;m^#h$z2H`OTy2e3;6YRE^P}(WciC75#~tC?@pd^&hr*}%`+y4 z(1*u1-^%mu$0cpVCwG^!Q`1C58}{E2n@;guilN?@>#he(mriyGlcF(tFn?f9ntcd8 zK^2nASC`+|nn5P;+)a{vnQz^&tv$dg?Y^}_JpQ$J4&`9cNy_&JfC9pWhafdxAJQ$v ztA8NEUTD^gL6S8z_!+(@{0+L3yKodOxV=1n-e0s27;W^yAvWRwcs2$DK*uwfCU2~k z_WSx2B_&OCg)NFgB5hUR3795}OD;cPr-l|KByu-7Wx2cxpUob@mlHpl5BHj{wZA+$ z(rK9navjy~I`-sY|HB&;239XsTPbIL^P8#SdEf`DTVLr-QpZEh@pqXN z!CyA1RPTFoxvLG|I4(eh(KKOO%53kbbgPk>mew{k<-GF$0t;W51ixYItr?YGGrMg0 z&>D0JLAo7c6(`@GtsQ8wPF-_gE%N6idz6v^cB)~Qqae1?-BPV1`!~25`%a{v#Z*<2 z&U%Wby7RF8v@R98`_6+OAN=>_-w!D^K1HqYi5f$TUJd4cyCWAa)Ot^1q)%ENwPad7T)bJGmC=tW+I)Xx`|hgZ~}Ar`@_DzRJV(3x=w8Ab(YM? z@Cp!KNA>u*IV6}wXRq|364Wz{0V4Q==GF?=bYP!^>&^72A8ZNXV652+R&(^ zA1`Edz*AzS)~1kclk#4RSf8-8M5lDcY}l^h>H5*MX*Kp$29$lJ5I&SAYlZP2-SPDc z2hQRqTSp0voF)|tY_d&b^+7mNd=0w?!$#&%Xl0aKJwVZ;QZOImwUFgR#Ns-t5o<^?}wcBZW7lyP-5q9AvZW|vmz5yK!OCgur8s~EPVw$fp)Xt;z zJDFCyz8G@_KXYWEMyX@ixmSBOQ3pAeKGy9iIOV3c=RJ;jgtr`1sMN9dAnDvtKG9U& zVv0IEkk&z>I@`c-yQzD2AZ=o0w(UGIRa=UAmwJDEGtQ~!F3AClr|`o!61UMjc$e#_5|Wr!~g z;-&qLL&fY|i?da)|582{>A-~kY0Wp%?$|tgM&Qh5+9|?2fW*9)fPG4Y%o42d?hMF2 z*?jXo>msFbx%Bm)|LVf!{@%l;W5*F&g7;CML?jN+?@GsdcaPQuy(aVxr`vLGbQ$pX zuzF-12W?U#FOL~L-uP#d96mDEUfj&qM?HcSQRKseD4(x?C<4Ojuk75RKm=fYIYrK| z@PX$j16yPa93y9^n<;aQb%>0$mez!t!=+PW5sZnPd;@IQt2)0rCFEHlBfD&OSQPq% zLpyAhTqMz+o#|eFnTP_pwpWjq521o2?QOVS`;t)oG$-Gj>~G_Fjv0~Jpg@G|?jE(;_OiRIRxUF~2s`)m=zN4C`;H! zdU=Pdwjs-3bU6w4X0l%MXmr>f+GP@#Ir)V9hF9)7;{t=qc*}$?pt)SnM|qikhoYx` zB{fueHdPWXnpHs7qjcM9>wYR{2p5@`y)#4?ST~b#7WKK~%P0na02qQmDM%H3#Ao{AWt_0)#I;D6V`38A@iTdy zF-#Ggqrr@p@zZ7R&Y3zL=G%|V7SAuyz~ZNL z)^8n=BVNfV&eaJ&R`lHt{4go)xsd1BB70_>B3*C~q9?s}NQ{m?K3tIAL1DddS-Pp1 zMkrh(8Uo`^QxmSy#@f$HKqM`c)oe;u%pSI|c5V)kIHB)0e#T~8^~y`FhY_1{mY@iB z{%eI5NR#v%JF2%BGX>O0WH0gAzgpzRp`Zz|*zQajR8W^cfBP6RvvT}yR*Zp;_?1Zu z8>AM*FsNU8{HWIZ&l(|A1&KPEC}2~LM*;U%R1SAd_9Ja8|=G2 zzS;Q=^PO>7f7ql60tbstJ@-R*mxu1d^b0t<+vMi}87URGh^Q(D_1tdzt12s6*fhZX zUi;7D_`kI&+hb$G6}Tc|(Q34TTb`fZ%W>%UMiIj}AHRuV)^$Zq%{lA(rL&FzOa(LFVC8^XKzR9C<#d%Kh~bq~+2e6pQY17;p`=p9x!ObS}1n zcH5@LtXfNw#9p7CY+(36S-Yk~GDi?Wa2^gY`fmqPq_X}iw z48Rx&xy1(IOn|`04cKJ4zjn%9rDuudy)LfQV{CS>F-UsB&l^7-`ujk%k1|^H4`$zM zq7xZFmE+3-?a|6|N2SW|-mx0p2jG2c-8<%h{)G+tQ$UVZs*}^KEN_JVOHSF%LxkqTjs5gXW*{CRbbN9P}`bw`C7TpZp{Q zTukI z@PFF?7}VT}g&zUtmYC9OUQW?!rk9rIy}UPzJ49UnR0Ba6iP)^7!T}S8CO5!<;e7B# zSKB8RPhbefbHCZ&x^U3_gMQi@lR8T@KeIaOAta-i%>L}sC8HXF)4?pV4XI;~AG)k?Qp z*?ZbrjA$}w^-Aiuj^sGEjDm@syaLOBtGM?+o(#_j5oo4Y|C6#5b-dJcGG8n0TLjRI z`s-i>4m3_!W#^zh<+**1IMANRm+AA27m(!J6**B~r2CGmgP8*@B;A!PSD=F}M#sVy%HOlh`L< z%%m)7{!NzU{|8o5H6842_<(9G;1zxLJiM4jPELMp%%O4wm@~1pZ%3uS70qK}rQ}ld z*AWKFm+8-?CA#jU)t@ZaF6?+60cO=;WX^EK#E7^L+c)ZAe5I}@_s31%54V;Pe0RIR zf}V*d)vmLuEdP@=^H20{u5HG|hrcx{{kH(Dd27U$mcmbrDZ0X;Rv!*%^RIUcFFUiOWj#t*}7 z?P|3WmJ>mM@o^2X$~88ip;Jd{6$AAUv zZ%D=;176}X1a_=B6(oIx9s{TaoWLu9-XtQUTHA9(JR=bM2|ay5;T(}@!>O}N3F$4+ z9MVYd_?OX&l8xU#OM;KK5zmXX(N{Xhk+~aAzwve37I{8>0=|U{#1TecRhTPgUpGh_&QGy1lS}w%Rixny zBS(v4ZJ@0xXuA42yF<(iKFf1`FGP?l`yCA+<03LLNI7@7PO#PO(-G$LD(GWB z7Oj(L+UCv+-H7FlPPQv%kzI9vUu$>i66| zXR?F?i@MFuH>nJ}Blg@E?eDTKyTkUF3Eg*3VDlp|3+x>oMvtF`y^;H!B*xF6Rhjk5 zUhCgy^U-`~B^#sXvb*eioTHC$nDua&w~JC9FIG-g+CXAr-TAVdcbn#vm14_r1t^6E|0FEfI#TB(J|mZJW6g27-DlYFb)Gz`1TgBkhjUKg;QUJ#Hk zDpB6;ybo0OfN?tK=jRvfeJh-}(KwiVVY5(YeRsL1te|lk*+a-cPhT~UKXI0%ZQEeH zFm0{;e320n5;EGO82w3|#cEce;Wv;C0g1pJJX5A?d5!%+V)<-T*n8!d{YKTHaTY4Z zVY{;O#FOVt8qOY0)ly~|jK44LH?Wm*HQWr?R0jIy9uB6hr=MnLXR~(FCJGG$xd2 zKV>;Hyepj+r_>K1`7IAs%N!eng3K#F-Nq#;`dlD#Jz)eMAf*_$Ii~Z($41$aSdV^0 zXFI!VO;btw%$tF9(+n>;Q57+9@q4{z{hr0&Z)f#h&C$Tyee=<{Z!MH zLH`JF#j2v?;=b*XW9LKi`maZ{!D-Kb+JPK5_rw38*i`@~IT8=3`q6wHj9lkAl+N5H zoj6>jsG&m3V7s($_SiZ-=Bb35;R@pjxrJ`gsOfTe2I0E^x$FQ=P7VWJOp_zPP)|xK zi1_Cv%BQ;$y@Ngp)Vq>SG&PK@m#TIWJoeB0MeNT8%aa$C-gp}~UGx~CNQApq(Q6*R zcR=>ihHh#*p8=W8w`Zgtuc}To_5f^7OG!L#Al?by>kpn zE+;}_hQYo$&yHKha|J!hH)FxUR?_p?H^l+rKCd`rNNRfvI^SD*e<8CU6~$2_2yFRd z_*~Y_Cq#^oX%Ni{7PfzO~yAB5g>$iYkD@o z3$AV5Zn;@@U9he<0ZJ;gr|K0U85QH+aod9^RMoE6#naOlY%%=P)zQ(FjQq{xLPPu3 zxMEOxD0HubW1}Av&@_K%x`3Pa+1YZ>`)Tz; z+Y{N5Bk+ELs!Otimm29fIU6h!S9*tIJ<`dz$*X4{E)uYklN&1!<0gfL5Im%zt>8y7 zbLbWOO5am_aqH1&>(VOoo8fe3&=cmqLj&OXPreZqCt`{d6S;d6ZvrSa^z`(SQZiAb zNIWgJ9rElSUc9lJ^=s?hU8?Wg&*OS|=MqlAJCyZ4#1zuR%#06(udPA~CcdoJs$k`4 z)!EZ*Ty%U+%X-3)kSXAt3?K^EJ}Hf9-k2mD)-GqKC}oiWm1-Fi?U!q`3b`dFOUO$X z&s7_ART&RF1KSEQN=#IeSst0|%Hs^MF{Sf*EPmSv-`a|9I|M)8Ya&M6A~H{N0@T3( zm%kztEAr9)%sz%mf^e+N+A@u)S9s2x?wfvLQAvzMyQ`^lZB5*!kUTY~cki70GaIx( zxsXOYazGeDnVDaAN3$+=M$}ChLmTWDTUo_X6@Ro?01M0SdMU;EVA>YneVH@H639Ub zfk5t9dItxiUdQM-?avBg1Tvk7D^rORkTdpl|IBcAI{AF&7r{f;rE$0A;6<4@pb8W< zwfqIoraKSLsulrZlw0VyF|aJ9<)!00wvQKCIV@L=6CilnsDqck*8vuH4-cQ`l3W>D-)s z(baRKmO=d;wfsp7%qEQtA2F((o5pfdH%e~?4Y#pz57^vY4j0?V0_WBLWbHIB-a@G7 zViSr!Kl8FtjiH~3iZN@~M73pZSuQt2&%K_(CoV}Z0?*ZGcCScTc-Mq%y`Q?qFGl!n z7p{*eTn?^}n@*@4jVIcX`K< zx)BFV7emQFUc>$`81FG&5tN!-A#AlQ1chCwdNIAnKcOyiC_LxwY{n$oqGyIAk_oM# z*O@@9L!^XTVIp}uaiecNQ&(F{67X5lZ<*3nRYg@T58pY?3YE_>vn+m;9Pj69P664?g(05L9pU$h$%(Gf-NeH#04E$= zZ=ySpK!@8-Lhuj%Z~gV^-U1$^X{Jup2924U9I#1EVnZg zQ|5&cd=QS(*9>iI$8H8bbCei~I?ja`-+PKj2=GZ?gz#KW52BL-8AA~tVLk#rlTjkV z>D1>>xj`htT4AnzQp=gGu{R80pZRhUudRUgglrJc-YF?BT@Aq_W+^BJ z^kxA8JV$WM$>aTX-3brCws&0i0*#14U9N5b8tyd{LZ3(i5WhVeAtO%zEG7>lZq}BP zh6v#^1;xP@PovWwOe<5ns=;sm^~Ej(ce&m$V z!iBE^*G>+Zc979!@EZeRBfvq!(fgrr=dTXSW|vAe(u5cqMuplnq`fybr3+-_$u9y`|DgMBzJ%$fK=`|5$W=mC>p9AaX)CAWXr^Fs zn{KH(#Z-w$KJ|&UvMO%{wOUE|mp;z6=chO7diMS!;9w7cGySl@{-1G!LgCM^7DJgY zJ7#A!c=dDD%hTQ2LPRhC^&-C+9``?P3w3WyktbPk8{tG&ibk{$Vg3!qTU+d5M5KFt zt}ErSmm>1taTp((QTg>~-*t771|%HLk%E9VJi+zeOUBLB4cje#nKZhmxO`;1Co%Tn z=&T3WGxs=Y#ea5uL4s#NfbYud3qGU9=+}t{E|Tq5heeC*+mWcO`eY0%-*#S&i0*Kr zZn0Hjh&5lP+>g8;(xkpli&6MR9p}ufE?drK5wCkoWO1e>A88Z8zWwW@jad!FtgWp? zFGvOVb|pZ~jfNxLGwW_Wi}8;TmhnM?ou6Y8C3m)TcS~EaDPoeDyCz0l+3)dgv$S*FeT@PvY;CHL<+2O zA5!V6NY@>DfS7axs2+b8JW4@&@;Wo==Z9C`7-^bHs0qH;mNaRa#P4+6JB;jLMAhAzX8 zHmI*W$kPPi#oup!^#!uH!$nZOL|IkfwC-puvWSG3o8mh_$KN5yM#g%=j7{P&b*R9= zzykS@x|mnCE<%{TImRic@ErOB_G)~SMN#;-zxSNJA$8#B^|i2s+H)OdiNzb?S21@J z%d`4dd3Bu1jo33Y=k3Mtzm&@_0DhDiF{rP;N&WpDhYuWCf}Og@PkToFy2wyx+*%4q zFOiBoYmOJoyYpwsb8!LKb>Eq+qwFpC^B}+EcQ^z52*3>@O%H?UAWR?qB@6GlC6Rn1 z@RZLFl8!PUS9_*jS7)b+ifSQO3~J@Z#$eKq1i{v?K= z0gZVfApn?Z5}K%EF*Xh^h2F9MtjvWy17`=vv>KzY{trLFb}aj+ieIy{=ONVfsUE(t zF9rPi6r^A4FdZsI1JM)y`OInHsdKn|j&O_wL%873$$rq{SoHbORK?x{eatj4{K<&Y zldgpA{5NJh8ah*Rj9>y%t?)ai11sCp@>kKSw7}Nkadig~ZhG+ozF7Lm#3plhZm|r(g z1OR`Rzkk3f!WiMO^8f!s5gjHwF?$zkCmt2 zkGioe9+6#M@1dUoEqXnh%M5T2@qn$1cbfHPZJpE(ydoXjlGut*Cr``i5&q>A{f$r{ zFfq~jDk4ofzpcq#{&Xjj%YJf}9`CxIvuH;`+vqDIM`r|i`3UX4J|9btUv1HSaG~Y& z(>&N`N&p&wa(+xR(G!r&QIf{%d{N1I=I6D*aB}L#a3z|_lV`1FD8u#d;Ai$()V%1q zOg?5%OG;$Rj5ItfNcvPNB#vZhD$lTQ`x?J7oaHI^lj>vR6g&D}R4qT~iy=xIMpz00 zN~k7v74NAa89r128HYPF{G1y{yI`$!UV{DAhplq!>E6roQiTo~jkp`3OGZl~h&}Nt zY&?BF)2OkE#n{l^4d&Eidzp0O|6xXnW&I;UAR*Q^hW(~+wPKe;I3@yqpO%-|SSvl9 zm?TSBcF#|KlQ_IuRo97#O|I1xdG?vU_Ub3cZ#_B(`*Js6y6_Y85@ep~4L5hic%=VI z+9(U_u#fPJ%`8y_0cM4MaY<#z;B&;UR!ACDOnKLZz(w8rp`(uBn;jlnd{i9F+fc`Bc z1PantsM-hwNdc}E<58fi?x(~PP2Pj6bkg#+yjpOBW>cm23-rI0;YN4k*dgt1j4~^i z1pZm5>&Nx*Qj>*tSEM(HcI^vjp>n9Uw36L)mV6p{Q?~kcK3^>GYhbbcde?ieo%WhO zTrcUNVheS$+4ouUsN9nh}1(X@8jiP5sOn-m@EH&?DtOq#-J4fUCB z@$KM=ZD0RNLF9ytQpsg2-#^VTh=F-=OzjVm!_WNtIx`)OA03weWB*Uht=f7~Kg<8o zhV=&pCzLDp+j^aitUldw@$sJBw^FX=M3m|LO!+#`HtUzT?(tV&?U*v>PFvO0G$-X; zTIrby*RsCOnf3jZWSpYg`85}9H=i+%F*?1+{Oxt`vTt9wW55=5Wbqv~2$>u@Ih!Ts z`sLY?D-vGUUOU6Pa;NyoeU;Ck9T#pE!bgVX&48p)fi^YTP9nu0G@|V z1JCIOfknVJ0hmGd9#-n@hW-8@=#u~c`|rL69WTKK>Ig71{E+(}+~lX00CJ?KtDnm{ Hr-UW|U{3`4 diff --git a/docs/screenshots/plan-editor-live-api.png b/docs/screenshots/plan-editor-live-api.png index 2ed3b5492bc74cabd29b03d29aa8693b32e4929d..b23159d2f299ce688642cbf35e08bf66b2a15383 100644 GIT binary patch literal 110728 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
t*q0AvN3TYiQeiJGl5xUvQ{0yTg%<`a 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 literal 109926 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%0DOL!0qSnW-FU{&&<^%16P40j;^l zkYJKcwJ99gPW65SI26$Ip6uW%Ol^nxj;_{LtpsP<7MV0?HK6;YD(h_DRR+6&CzzQm zC1SAsvqfmkKe?cwO4PC^zv==Y>Vz4i+0tne!~qUdui0|DOT?n-Y!UH-Kekm~?tC!Wy>2~v0z2pS^peg`ole(&eQjt(@$!{DzA zV++{eO3enn`mKoxruoRxy8-U6M;sxR!KzKgnt7AO-c#I2LgLJ9$OLz`DvLH<2)DTZM6PUR9|b1Ta#NUb4MBa zI73}Z+~!5Y`h4m#o%?xnZ#Ete)S@wrBxN~RQ%ZtB-)!e7L{DB}dV6w1))x&T(0ry2( z(Wd>WCWLz%G5Z142UV^D3el!RXu_GzjfkpYuEEnplxs<$axn0{Qdj)$(uZf%#Ll`>-QLwgMpL;gGptr_66=C8f&?<`s6GiK^YC5lU zMx4Dt!nne1!SK@a-sgUw6W>E&`saBILjglJi?7fJ2EE#G3QSPC&sa@xc(f+V&HQ>c z6z7g?zYynMmZqTNt959r6u{xt4{adZJRk`CT+3hd!V+RQ8{y8rzC8750*cb!ywQVPq~t0 z`SzdW@k@qsQPP>$gv6V4M`s7KiOu5m2~3qObFSizo5}2VKw<0YQ;Q6=-D>+M1AgY^ z7yVBf2yoQqoZ4+qqPfo5Npf&aa>md9{=>5|vbpuQF)g<{k36K!d#my*xpe^#@F(Z) zV9H#{a{cc<4FCBG0e?*cSyxjmMJN!30QLnG4e9Y&>zQB(!@UQEsoo`uy3FN7j{=!$ z^@6vx`5IERIZ>_tw&Q6X&agX%ob5%&4fQTy9)XJ2CgE!BX$rmHz1LC}2@?SF7tmy!T`KGl825iRs{}2npuBdk}r# zf3N|-tR~bz;dr>yP_mPYGSAj#nO+dU@9Gq-RLw4Ow@7|#EL+^(72LI8hGvZ(SE+ca zuhgh9KxEpAAlhXl>gOheD4Q#ehT#**yEH9>`|03{tqHKm$XaCgg_80!|C?Bb0cE%_ z2#J|>c&-v!g%_ajuW%Ix6EFi7soXt6anjbvgi0(HWI~@UcHB0OY6_EISRRHuIEJzB za;eTno*=8s9oav5V1yq08l;rfUHvDkeI{6oYs14aIbvfFlo6E&A+oG9`8iN$4LP91 z!t&M3stENVa#CHe88kpcou`StZ2o0t^Ygj*4T7HMukW|BVu`d((sruc1-eJUEX~3T zws74X{~ma#V#=#)hm3daZ87(o-;lSM`it!G5vbS#`5mnfYE1!X5C!^t7yr(EHH{`w z&0kdJ7|AL;gvLusKRH=IwhCJ$i~oD`-deb@$lx8rvMH$sElxx4#k*N`dYSIZtv&vE z?X;UDGw9kytiv$_-K<9mnH&QX0+Knbwd2;RycAlTuDas{2=YV07wP4aa(%k3x}Js@ z3Ir+3<;v{&V@1W|tnrqiQ+&TQ-T@s9RE{YrkorYk3ny#NUuu-%&Iz{Qk(d$d{1BCe#Zy3YJBD-dNx<*l^mvKP zdZ3}AP3P5(75rFzGr(=qu^^~Ax95Scuoax)U;7e1oc#AQ@63Rk>x4pAt|H{$7+K32 z85sE-bw%|k-9%bSr+yyzW+V~5Y*>t9^Iv8gI3U6yY_kY8%|roK*iZIJPal)-r>q>g zl4A~Wh&Z_{nscAGkbQsY$*Yi}4`_d=Ov=&nEOM) zlw%VTR!uk7DZ=?N!C;D<7O6b@-EyC>#a&=mzDSK%4q1`vZ`AP2tA`>6Nl)}~4~A^c ziDXvDy8S#SZkDyzSh^xRyeG}GNIpD2jyGV=#xhbgkIZsJoKDNu(aC_;%R}637jSH% zA_qVtpy#OT3VHP3BjJm_qM4(6N?~njYh&%SbOF$r)jDG{TB`O=(4Xq!AsrwXY|3CE zf6V-zm0LT~-QTe|=lAbF6~;Dnb9_>Kd{T;n^$nGz3>`yB{P3No)4p_(x!Qc;w&gur z&M!jm$#!tCt*q+0WBof%Dn+f@jt!Ob(i!Q$eAF=KEuN80O%+ir+UzceIQ$nJJ!_}R zcM%SyF*B3%30A{Qw0zc6FjWkgG-U;&4_N*kMfDwPWqyG$3SEs7xix@=f7i53kp;oI z|I^7Ahb5{*mNSj8t5V6>q0uG>U!Q`FLO+r|r7SLO?b9~*a zYy4f7VtV&D=ccoiXaFFZ2l{Bi{(cYb&qS>q^A9#}jmhE1GE1*HbL9&dUH(JGpM41i zo|3gSK8A&SIbC8mEWZVj7M}c{*91!puQ`?q_KLX_3S2o|5Zl$sFx^kJo#Pi{=4gM+e@yxHr|7y0M zu`DRP!pEl~`!^NsHGY8%|Ni^`ri-vL1ryRUFcsBYF4_*!L%_s>!tw6csRfN)l)CLH ztqSMVmZIQ?8_Oo&(8Cm?-qIR4%7P`2I_q(JWGzi!6_?fD{h`)v%v=5B0EM>6>E542 zbmF`gWM>C9>fmWqvA)M%Xv;3U9BNJiI!#WLMYbNyRRx^gpy-I%iuHT0D#ymg;x76? z^-IFSGTPFJT0U@%Bthpa>YwwcE;hbujVj;hKzJBk7#xJe(%#Ge_g)q+fb!{X)~w#Z z%ZT)}+#gw%e_Hae{o#Wx~&gOyK)o|XWouS6NbsBCkMipBN{Hd01 z)bQ`O(VBn~{LyXyoHe3~5Flcz96|x(p_*NG+yeyxTc5klJ#s=k0^H8x&@J3*1_zU) zSYKzd+z&wj|#7DD5X=B_^;h) zb!2SeWmqWA)5|b4V5Hb3e|!W1W~;=)kP!xYvFEO3&}-%2wCqj%B2rc@>zS;sHe*#s zeD4s@2sX_rX3{@?yjU7cRbvR(GIo|0DpOY1KU0-^V4}S%CGx!E{Mh~o&_3<;v5w9$ zJ|EKrwg&zeUZpQS+2Y7M+W|j(4B(|{Fr0g{#H0ugkGWiCV2$tI5vSAEyxP-iA;yCw z=U$uw_1=@D7=S9RtsymRVG0LOs62b=oMO)T7`VKIp*~qL0g6ZM8@twRrj*Y?E@AC(pNM<2?cx3H-x~lPS=9+Kv5?gDv@o+5V;rZIPaU8tJPuImSa+ zwk90!-zY*7V3K@yk5)5y%=vR1lUwf(OovF5HG>Z>ewRN*H~#ONbrd5{etxs>TN_(= zv9rH`my5gv9~~Y2S~9P`g=fz1V017kzcw}{Y?a~r<4>=kc-)idSVibkPAcx9icB!E z@u+6|;P$*ttT#xMS<(&rr25tW@4Lq;fv#1UF(S%4j!WsyU2}m-N>y`c3k|gc&rpF* zVjw@M+*szCgyG-MH(hOD-B{Hc^QpK;GD5<&Bk>quvEFcFB^4EZP7q((lwYg-7aN76 zw_TxS{ckY^Jv>^$y;4+6ROD0a8LlWQ|3$0S_D{=D_E`9w|4~5&T%a4uBIGBTk{yjE zyyByfnrtYFoWz%(x92ljF=4mJ{zeY|9kBj)m%s})5E161=h#(5o*`IJu~`92XTDx> zWXGlD)`yFxA8@ymoxu91baOeFdv&Ib#s3&G9$L0SL-prJboG#aZ~Va?Ga(`2C|z<{ zouRF5KTsSUpw0$tzg6{_m;YM?)d){d_Nxfl^_bJuS|;O9PwJuK(u3;ZR#E(YIe`vI zK|Y2^**bQ9S_<{uH~F0kBZYes#u^OE<~Hb$8aiwGGHjizxCE3TG`SULf?=T1kK4g} zGuJY$Hex0!^~9DMKUql|pehV_9mtw}sqkaj3g+RvqS`ihaU3;=0lOqMl~8_L;h~U< zikk8})1TSysg0$I;A?|AG1s>1gC_S@kJfNeUNeUqji=}JazX@ne8`!yYkCC?sD3Yy zWzaUaGwN-<>;M@|FJU=y4XAndNs5l0-ioE@ol8Ci4;)Y z$cNz;I=c%lR@v|SSjm197SYn0l?dLe+b_&J@@7KSmORr;O?(k?=M6Uf7FhMSH`O>B9|1AKVB$wh zM@7Bx4S=KZK|%{V0k;z9F>RkT$;RE(Tk`YB_?kPGhMSq!BLivy|D-EQO^INjkFEen za^|W-g$W+31E1UG;PK4IV=Efoh4Qd|plERDo|=nL6BJeoRmnsBmzJwXVlLQ<8~Fet z9H45q$mPT$$zG~#W+oCRml16x`@MqM{#)Oa$Qu_*Q<}Y0S=(z1s|cNR)wPcw0fy-v z3DZhi=gp9L* zLC_!u3Z~Q5^F%@3$ivsmU~IP0_t0*Y32*nm71-(xFpKk}!xIzcLSuC^dynsDMesCz zz{lT$X&G>9Da|h);@4>}rgqeNG9i=Xm%0p{J4Q}mc_A$F;d><3KtRO@@=$wDP;NPe zzNtf(EWnl!`boQ5I|Om1`5V|idxkt`&>nHO`vW*xNU`am9L}$=!icONPIU!5 zgU$iwR;{n>x~@f+*H4@dF>d)2;~^Htyj+fv4L;(G4>b&57gjzwE@mdXDi2#2;En+O zqAi^6-tdVS^@Fi|vj2Tgx-A=yjgVwgVoVIL(U8e*4xV1V9Bi@y8ND~=N~CNI9^Fr@ zLQZVLNbvVSdIqu28oPT0lf8C+1n=vwfkw%}2Ls4{2@zsoyj$NvZgWJfZyzM$P^2Ty zuYg7>#p7--|4vN0d*zg=Ude$49kLE#*K`@cb?OOnK>>ZBZG2}Zb2Va!AfFK7MZ!*- zV^i+2g{r=djdjo~ur=sJI@120DhCf(LQbiNL-41RDraDu?BY;p$KQdUwR0pT3zOQ; zq_#cqozHD8T#`Qy6n}Q`h=TXI@(VlapEWf=js8zEA}DaKlIu4T693N5Y52lzzp;8M zi77xb?j)>wN@7w#|I?V@|Ku6x270A1!HfJ}0{dmNKXiJFkN zb8}=H5&IKyfZnPJ%8Y_I9@FR{=a4@?#ajO@QW`qT)V2^t`ue)M=~)rWEKRT^ zE`ACFJ;a;W01?^kLH*wV44q_fVS9V%H8qYKar6p9<2TPm2j)$5OQYZuQ1n&V`pLd* zzjrFri3Bd15}-bVK`t4%lu3Kas4sl?hPe4>SRP)7oW|xU9bu)ZA?ur&f5Uq5`Kgx} zv6%o4Z?~6dNK9-}K&gf^p^XR`xhcx-S8?%PcW|oV7+>@g5p1uoI3u&Lr$_Ylou)vy-+`UiWp*BBK6fy|o>gue)bmt}<>w{-u%FMno{ zT!Je1ygrrpy~1Ge{{8v?P7uj2|DrwsM0LsUcy1ZsXm0brq|IgD9ShSd*8fx1-(hG& z=@gl%JKkdc8}nZFO&%aItj*(&-OXS$Z@~`)RcO0UJ0Ke*<0T@3WPjB%v>1#SzxcO|qJM@3HDW zb*5q2p<~lZHGaR~%w`vM4U=JSNpTqSb^m)~(3cq_D+@6!uKfWBn1y33Br>!u4Ad*z z@T9o&URll?MP(WfM?hW`g3svYkbm?5Fi})mYQYn~U*C~k>)pnkodb;W(#Gw?CJtApS2tvYoJj7|3q>sU<+-JR)?t6pRMBTDB~kKuI^In#R0eHyMyY;Eqy>t zbT#Dd0+takn_e2VzPnn0-2*x01n%FgB$s{U4K(pjAUb)QdspBMfQo>c~7T@)6|GK3W1l2>K@FU0CRrD1SdC<33=9tnn}Omr`3i@d03={U z{|EH96;#9mwP=hyiB`i7K7g`;nfFt29^UWX-X>4kw<&mMG14I-y@isgED`gW)n6>- z%s%%5!AQ;<$j3bRHr>z1YvKHWkj$qx8_S|ho3{W*hB^nH)B5a$wjje}?}`YBizDR5 zPx7Lc*7tS65EU^U32K#MH>uVZ9>xkTvmWxtM1g&q0@hM&*qE*A{f&68lyOjSkp5$f zWRT;PYsAT`)WA0lwhV1?VeRB;?tE^uvMmliq8|Xl$qM^MLm;KR&G$1}x7$U&=@&3} zVc`++*-9n1h!mKx$Jue7WRgq&A|_ix8%WAjnG)a^aZ|l8CS*m9YPMLiG_$goTK#!y;1R{?il>r5Kvz}9t`Xj89)3l#K*<@CBC(m{Gb(ouShP)?GkgHxR zQ2Ia3ZV-I_tC6l(T!_GCNk~dEc8~!7AL8CJEXuZR8^r?Y?h=vi?m<96y1PNTm2Rb^ zr3IwBr5mI{atP_Jp^57uTG1?8hF2z)0*EXKf$VI;rI0 zOOn@$g$H~t!Knh-(l<$Sp|0wr7l*6uL{;0VL(Rg0N^$RgT1PB?O;2Ybm00XG9~{cW z!GbDjKm3_fKh%3%$VWv%@mCQGC0^5&!Q zS`q=?dZjh3sb|d6o*PAoW?Gwtw{gKJGUa}iSoT56_7*wTVH>xHbJ4`yYvBz==(p`` z*+W@wk3eM*S|~b&&(;K;EBi}ELX?Cm#M>BP`6rj=odnfU_we--=~;6raWONUsv8MV zjtF48j$3|cD%0bE!<5AZ zLHDsPqzdbvmW$!r4d4Dem-j;pkEK&@z+c(Hr>EMNBzotG{L&nEp0 zFumsEbkpX2Is4d{$SHjTF{NR^$L_Doc?qV1IzLm}=`n-y2r~6<1Urw}lNWf$l2FXY z8cnc!boZqSV8M@%JjB{Jd-o1MLvZqW<(@_1JYP>O#LFlNB}heal?*tEraSfCTGF~E z!dPxQn&}Rr^aBqZu1xH)&{cPI42g=0NLV9oB}p40}s)IDO2wuf!nba4OyDb~_fnxF!4q z!8(o)hkDlt2HvTsLkJ(hir`dAzI9f`59|x^I@B(E+P~dbU zk?6-a5SvrHW&5*bmMsu1&D6IBpIxwjJ!dcJF7RV^&a8*@D3dUaj0|)g|Jz#fxcl-cMd_f4>uIt*NWhQwtdlMQl(TYm}AkqA0zdKmT`_U0hr0L-FH zuPr)lLY2~YGkhDAezG1C0OHt`TAAQd)l$>a*1p~{@I9Qpn*=kQZX`xhJ6kf?CfxU8 z(Rc8z&?8h-KU@Ro&1Geg7rpwGmwcX{IouAUboBISNbF;@S@29X_E(jvUhO5HP_JH; z>x)F}6I{V7-x$;d(9|r(b|o}7mzY^2VO9~8{!{jZ*Ybp7{I)2|-%=K+r!}DollgkF z)xyNxeelxeJ=^e(I^5*>GRA8}_mL+Q%53-ijJxedF=qf9GWs5aewZwRDKTLZCB56y z(gIF?xweCQpLwF(@t>I~jvO~^B_6#X^L?y)YqkIZ>vB32IB&{4`OF#gB`XwEjDVQl zA}ADbpz;yb(?N0cZS?bvm&aM(C4xg0ZT_wzKN!z4Gc_9o0SK%UVUgogBPX*z-Xo~8 z2tS6IJ)e_P|97WI8OO9w_91dJI&C))KXH6Y}~Q`SK|9cz@f|du>?+ z=d{Gfo62`eF2eGk@rPhbft&%q?z(h%b91OteS6nRE`dV6XdwsjQx`KgaXFXjdqUvUnF|swjMT-&F4dTJ0d`Jqn#Q_J_Ll*gi$S%Cv3^Wh~!W|KYXpvt`yRW@Qcw zPwTp~&`{1L7IJ%j1^M@4Nw6Q=Z zsRF&Yr4(VLwX(k$`U})D_}teyA$k_T5%dax1KB*VK?-BDV2M~#k9;ud*cXUM^cVGk zKIMA7YUJuI0iQGyvp!B9i{(%n(QOFr&t-9mN0or^y%TXN3c2^~HYms=)af%1FUuAT zO7+^57Bgj$9JP(p@E@OFan+Tdf0Q9P*T=4(nLN&W(<>8&95+6fQajrVIH;%;Ybqbv zTcjB7FNXe$1pq-h7V})?N=FT^zkm96A%FMoAm%LL+xFUs26v~}yj#wl$1?dnk4r)H z&}|K-pFVmd>7KT<)KDBg#-jz=yC5y8PThvte4Uh6C?nBP%F)*zUr&pZU~EeM{);b! z5}gIw6az%s+F|5(twbDVoJ^zAh48)LXi}zo=Aq=sb|+d@5~VD z_q(O;dUeFRP%ubInHaHo$y7wpa~F4o&}>sg3q&M{E(@(h+f`$Nvdzg60%Tv=cU*33 zwH4m$TN^h(y@!V}JbC-mwBv33JPRJvcB`NK&mUFzx1!qlt3hn1tIp;DxUdBrPvz&~ zNc%BP)WJS)QO+rRkt@^R`BTtzBwybCtbe}UE1i!Z`OH=^i$~6;-XI#s7Y5Re1-=cJ z+^a}!^{j5CZ(QNOFtSMoxSmFCZdIU9Y3U%Of{J4Cn3RYba|{EQnmhB#5cQxdB(}|* z%p?KIaMZ5Tc8pr4h93F*H+`WUZHq{@9*RUHL96wJM)ljI$ccy!5H%^+jgCo5a`pSu z7VL)^zyXh@dOW=ZL0dsue|Tfv3Aq}E(3JZ(ix?sw&R*ru={ziaWweS>f+6V^?xJR8zi0@hMDZIU-4gheUkdMkvln18q{hZ| zL8TiZEC!Yx4IF{3*>o%%&5|z%zK`DG*^P$KazekOYiK&DlR1`{yK|DK0+`7pBqi+>1!1?zikDVOK z>T_!g&RJ3lv!bL=baj8^P6So@$CtNKh$CWo?11&h0LXt!om8p{j_?PQMFA&r(2TIn zd@O98C8U)u-RqoBfrl1h=H{&K>S{~J0w!r^x0vzynXYc25Qx)exu%a;S`i87d>+#O zl<_K@V;;y`bG1w!afn}MLqX5b8i%FQ?<0m=r5LucXt_vJw8J}n&F1ONrcw2ELKK^w zywvwvD@=WOGI>{>hFGyPg)E=f$b_-4M=&gu9TRmd=Bz%w9v6E{{7bBE-2nYaf>GRF zTwELg6R_ub0cC%CRd)G#1BggaNs-V>qjKIcYL*)WF-kAf-hXeEhtWC>-Fy%0tYjWl zP!uJ>1}rAIURob}hq&4U30;z~_!nWx%&G`urVai{bcURc=*V(kN6Xlu{{H!)!4lo2 z7+9TZ1K9ZDr31(U>6j!Hqtj9P`or#jOjVI5*)SENv;e+5wjG_z)Y;yY-#-w^9omZ& zv_|>H3w{*z4o>tbZu6k8vn5>ZoZ^sbg4>oZ);N$i{{{gq??+SM;&SifQ+{hscz6IE z^Cw+b`a;q&zSdh+R9u|y=@Wtjr#0;_cHeXL#mQ@(i&s|YhjKUopPXIa@d6JvX{1M^ zxdp4fw)+;@b?(E2ORjYF+&;#`eyb*>JUOxg) z4yiv^{3r!(a*{j&eiEaxXC3Df9#SipYY9>`atLPG17_3kuO?V6Z6cxfb|UoB?)pk8=(Nb|9}XUXg1Rg*(94$2o7&EqEez* zf^MS0V^>-k`R)v%G`D0+3!;sgsL}x+0?1N`n3~^M*6Izhao!h|L=0mf zHDh7B(u9H3VktGoThyKbO>XV3&)WI+_M`pAo+08A8~geyl+v=OO40bkr>Cc*){UNS zZi1J;9;8mbYvS)G5bY~7cUI?e<~Z^@eLBtwnP6N3YQ^R*_z@=*YX=7>IQK=76gF)8 zA5+WU+9+rDLwSwzuzY0QE-*aS1d(}NnS;@gnZ{clyGbzF;_49~9Gz(NH@y_(l_kku zhZe?Gg?)PK_YnIjkQ|GjdW>Q$tdn*i<3gMz{^C>gVjxuNAL?D17*dV)kc|q!LYko# zr;9*v3$T_HUYWqr4nhz#94$rut{EZNrvcT-yWT)q+V21ZH`V5Ko6#2q(qv^)qP#SX ziT9@O4F92{nM<0X;;M1!r}DG1zC|FE%nKYXXZ+1|`7u^<`k%h-G&Mu*+AI)BF?D<) zBWV;u;PqFA?hDx@!8?2d(VmcVm=D2;!OpZ0P^%9+GA%i(&O53x%L5ix} zif5L^iFtv{QM^^0@&DWiU@&9T5fV@(piIa7WNbzzW>3Letz$&rWo#0*_XMm+Ro&^U z%NomwJ$h$7!7vPdm=YG>HlTuW4PJg`qUdNzx+XPe@8wss zwLPe;C0IvqGLLf z|J+kXAwbysenX;Dy;t`dK55O&RNFYEWM#e9(3k>WOmj<1Ph^FmW|QLb$?Z2oJo1`I zs`ngRFHh`{9#RP@=2X8Iiokp^U)f;*J0S?uNR%D`LuM4ecGBoJQKc*>R*4mG(4V3b z##aV#Cz!Q!iY4P_8HpnJS--@U_~#CmuRp|s^_Wl@2?=?CIX-D-uqD=WidpZ=muqdT zM_hU+g$@miO&}f-IWp7?QQ+w*4JT%(AJJgeYMY)e;bmaG*aD);^Vy@c>lp0=Zw2uexNE~7YDm;z{n?}L_C4e;-3fjt5&mubjl?(+{`@vJ&-W}^PeD$ z?aopFV4|b`|9w}+f51`j?LGUyAj1Fh9pU_j{v!+o7vKh{(tob=zwpHW>&;c>aE7w| zxeWj5#@IXuya-^W>umV=d!v7#rc5A85gu;py|^iE71sZs;R+zApyXYy^5mb%sXv7~ zJG*N1T>iT$%7s7csy_YH;GdqOi+}H#Qqq`L7BuX}e`xz)lMf`7PbCpNX(Vs80&1W6 z#?O-7Zajr!MNeOcD|uV0e$taBnwh~JQyiB41^U{5H$i&{=37&9cB+?sNNPW`>S;#7 zZyZ0#C5Y+Z@U!ZyO3#OV^yZ`E$9IEIYSF;e-aKB-0teFhL{r4n*;Y@lC5*#+8W2X2 zVb3V;q98v7eb;$B93{aU=hqOI_DK z(Zy|)R##FJ+ZU=sW4sG2#(@{>zwo}>Rhy&WB z_n+T?d;&)RhSGA8>eK{OtrA$}!d_dA!{#KH-d(GY@x*;boD>~_S4$C|yXt>?h(q&i z`t_}vmGDs_GTbi=kQ}wCQmD#R;|$EJFG*(LM|q-K<4;j@?HQh#1YG0nui0$TJZmw4 zH&i*&C~Rpr0PRsBfH@?W*OuvLDrTTNq=+m@Uk8oV#eaU%C~A?fTAN;#x=7bzpo{-v z?hCj@7qgaNsfHZzsh51Rh*dlq0ZO{Gw1*b=0V{b0dV&E}_^2=qpT=^!TO&1Oh zE9I798Mxx{Tq2_VmL#TUZ_4h_*0Ha3B{gcFV zG&TPoxF7y9>t#WSKFH%L%*O5#dV7eHVX?0t0TVI_0@hp&xeZIX_Tqz78VG4Z|a(p9|A9y+%u3cVNh5Ao5?0-a@`KU zmz+XY-Q>t_Atm{NVi?9KU>_L8Oh=hen!HU@Dy>D_LiyG_!fOp!BxO0}((pJ!$8wO( z(oMdezsA_-gDjl7JT`NpjFSQ4-Yy&jJ@%+I6n_r-PARHyZ0G)qx|e=JELyM(F;E8x zB-gDjDxAZeHRUrdO5lume*SwHLT8|*su~v`-vXkJ5)PAE(#HKjv@<0-n_E_lBU|L!=b1k-?^`YnEEyE8wzNy}Z7D3NZS+>$6E61vBBl z(=f#$Egdbb2A8{@CXjcN;Ph$Ix)_|oUfCM%g!BQk0#F7q+q%D^I-5H@XY#Pi3=0dZ zZjYwyK$uGt^6ZF)9pA7uV0n%wHSoG7-6?1=(s+AM z)T5Kg_8=ofw3Yy#+>GM|64$y(Nbn%H4=HWbahR^7RLb`*N%3Cm!w9{OEJ@BcuSB1B zb}3jRVpe*86|%~&TXM<{d}FgX8}8@tYgm6l&XI!-k98gJ6JW5Xf7kMsqiesD{TB7l`-|)A=?Ejf#CaoNvT#f@da{K3ZtdcEiSIJSV=UoQ|R9q4L5O$$jr9 z2gxqY1KD_j$I?HM35^=Kwl?3F)?InD%Dwdy_D;+2jP;ds-=D<2{nQDZ5*|pKzO(qY z9rjX%rDx-;fufao$tPI-_}$vSmRQ6uJd>T)08M5Lnf2`5Z4C%>p?^VpYl7qr5)ov! zdkR&|bMVDH?Su&t?lz^SZ}lJUMR3|GtwYN?s19a7P5NIZ8_sPRm&Y-eSxKA*adRzMy>OmXqw<)~FGc(|e1lzM7# zI*H=1;{3O})xnQM1W9RO^vd_CL!&_Y8^#`E2g{DjG_nt3&#@K{`hP?AR-O|bHE*Km zEk577ySXWjRh->Lff6FgEznHn3w3j{pyjG{dHExONjAlF^ox^YpaCOvF8_y9O;D^s z)e|^S4VZvlD&4ZhDWyOS8{>9Y=C&}MUL@<3Kc#Q)u&lIdK=*tXX`GYAeO5L+0)Ysf z#B64E-hmKUDOLiFIneW2zqCe@`x1NSTKL_cj~m=Ibx@PbjnFc+bWN#vy?xTvE*899 z)CbriqwJ-bXHK!)c|u2l0@UGKM$f(V?t19A=>TJ-In$M8mhW&?gq#Z|7UEP6rCCjX zV=)5SG}SQ(pF32kT#cPh|H>fE7usfGhQm^X@lQRaLKBC=G}C@aRAxA5zhl zaEsz>N=;XZ7Dyn?^Vjk%t-)3qTyw@hS zKec$caCqQ*i~fukDLL&;g^;~Z<=;jM23%5axQr1*oDW9|PqD5^{=>; zzVt{7XJtEEzL~fg^dlpI8>Iz`ihvcG8Je6o(>O>X1>N0@82rKz)n?rcBcLUAOM?Z3%*&{*7&R)Y-ddvPF9iZvG zJ!nb+?r2m}hn^3PBXM-GiLLc}TLwOCB-$TAj7IaVSK$qOZ*U`+czyPeqvg(1 zE>>2Dflb#LwQQ%g{Y$wfmqT~+@j1b@45zhjQx>IPA_INA8K~HhqfyCZS~)gnEqv8| z=hRc!WcU{5)-cZXsbNT17AF@A%15L&LWWiIm&n&byvk1L)sNjBQC=XJ8@0<2cqg7` z>$LR0?fyhGL>lMKI09MIzJ}_a&06K%=_s&0Z+mZo^I!uyu#vee@$V!NrjZcY~QQjA@nbLSA4 zJ2UuMc{;p|epkIW6Y#$Ka`z`N@|UvByn)9q`|>;u5}Tdqm_y1hJtf>T_r8&We2E^F zJ|sM})%&&{2(2Fhl4`0AOrWnLBur8+Gs;6ih~9~G1gWlY5tWl53zDG;IwskC9mF{k z+8tn}MtF={Ie;d5b#QeOApEc@*V(a5SSdWH1DgJDN-Ke@CcRaX5%nREE^r3Q2o&{o9Qzc}zbyE%^{|j*O=(}E)ysiq`5h5RA2-lc zF1tzY+f8AkhS$BbjR38BS@XG4VNZcuOFOVK3Xfh+K_U64d-0VmI2l@Q9|d-VQMQrB z*tOQ3d0+pQ%sY}N^q3>wZxyMvaX(xL2!c*EBOqW`A-YV`_GRe$kD;bHUf$gNby_PH zY9e@>lK9Wr@qk{-U8yIClkqyB*8=PLLlWCca6)d*`p9U)It;>LHz2z<@~x6v#6_m$ zS<&{L$dlh5c-c}?Fi|L8YA+$^{T%D%n2ny-3hzWi5MibyULUNj^N1xLyx#4stJ-+H zt1om+JcWwxy#0-ke}wV{VnXt;7PXb8r>LviY`TjurirWlV46jZ3iMQ+78j^yivD8y zzNB!!%mDWXJ0emjGa)F-m4jK;rODp?R#a}N)Y%#hO5^vFkl}T>zSn3A?PnqqL*>Nb z#pc99CvUTzIK%{DU1^?m-wwK}3~Oq^whUBY#FE>T<0MuDCru|YsG@Kj5%`h7=LT#V zIi4Gxva(=oD{r82pvU>Ht|Yn=c{A(qY;HomtXiy3uvsH6i$zETDv30ydMf1Qv)wNv{!w1CqzkW~At|c`@EKv1c z8kP1PjUeO_M?^kPj2)SfD16Rz@;du;apd`Oje!M`eY*hEC3zdOb@-8O~G z8ZY&6U-LN`;t862j)3ld+)sl#)pmD2*9jsAxPH5(W(zCaU#&=z5BYkeCFWxw=jG<^ zPgi_`u5Mk*Wm^Qdw)%|c*Imf$aqE7lhMtS5tJem;;9VcKGayeV7V%B#MqJrOH{VR! z_Cd%pK9QY*N3fUx`$Zsr=#^K6*9zFX;yg6R{Qa4onk&o}NU?hcZazqh^IR@n&d&>m z3SS0dLR_WheG{ba*e_q=H2P#ssfgJV;bezHFugUS>0LFyPCc=d(7>EqU0Z9pyfW8l zz2>i4c2%`r-R>!7Ffd|@dWsC0V`!s0Y&QZ+FRU**8~90wLp@QeupoCxRakUu8KybJ zqjsQAvOD~eVYG?vJm)0=?kv@|EZQ9v>$K$X46+YJas@@@l`(42kC)b~C!MQUIiKI~ z3-J=3I)^!As75cH;g}oAk7xHrSkmR96pm*HQNYMv3$gmo){TaWP=T zs&CMepddOT1?(H!t53Zge(&{?X9v1s)heF1Z)u8Lpk}+3iQwn(H&mI1;p&qi0mVh9 zzgC|^AT(GuE#tdm;=LYjyv-UO?z3@PyNqwfLn-#mZr7GTUqO4Od9&FVOy>1dVF?oF z@k2OW!IdyVcx;>lEC~vY+w1E%Ai(65R(lxa5cJPjPW}dJ*Gr*LE1#9-z^Rz{+Aq%v8Q zNey&MPX>z%Fv{eQ_*C4CpbWV25%45&BA`>P!LndDD<$P~`_~-e$xuGj-lYH+X9u?S z+z3ne%b%IY9|=Hf;IIvF1l>owF*K?YMZzJ`%^!maPw9d~Gz?+CQG`6p7lnp`>1;cl zzdKf&H7bFZL+e`zB_mB+KXTwPGcgEwH1FuW{(KyP%%Te$t$3DB=`zt5U98bIoJhxT zb#vI3r1m#l43dcSR)e}0@t2RY-fnmjAr;b#XhdfK(bt6+F7k>*R z&&mRi$TChFHj-X+>=a9v#z#X+)dvZfy;3)Q};!$iWjiN4&e&cxnbeH{!4YQUIt2o(w; z0_U?sZ)xN)RfiVF;#QIVr+V{`5`n@knmfET@|VVG9x)Kvqcf*W6DNz8=&vk1-9=b@ zPy@Con@NIHKg5k;$OI)3Krr>VD{?*}l()Ad{5{{B@wclyUupdPh;mrgIQjR}`?EX# zo)!aC z1G?7H>{-Xs7ae;-lN}`~sU=;;miHPWFp4y?jt4suL0HYy)VpC1%|;T@be`JQ2j~x2 zZ`=L3=l17Q3<%Bzs2=xMIznpP+-VaS4RPF`UlKK3?0Q>Wo7XR91PBqd$A+Z}U=N)x zXOPEo*|)l%4{BXKJM(Zj3LZ~Lw}0s9p9xtNX+a~30f`|jV8Y)Mra`U-JYD*nch=iy z$scL0wGx-jY4Hm%GvLl|mnrSz;7$L(3F{Gd5+fEqRSX*RKDQfh5i~v_ih|QiArO4) z+u~?zXD_J_{8jGVORoH5Z82t)iL=(vr*MXjq}_6TW}EISVx6~$i+44>#>XdWs|}7V z<$U}Aa5#R#c+98bbH9-oC4BvEr=3FUdbJV}+m7dl-JhKjH+Hz{r!vEua^6l0j#P5R z?d>;OgFGK6*~*RdanphbaO`-7OL6o52MhS8U(@C^g({shX4cWg+=QHzSB}twOl)#y zpe|S1P7xhcaHO5tyh}@k=^-uwGy--m2QyXFvH@vV*9}0&#>IEA)jp{T0LiEFbOv z2JN0CZbB~J@K|0$JW|X?BvnQHsb#N@Qm~RlNGO} zb?jF2RH~`Ey+-3nQMmSZL(8OaLX}hX_fhc?g-=YhR}$A20|wlH1tpkjBY8o$HfwCmUGR zDMY%K>J-)4=~wSNN)pn&xw#qUG?dG2c%4T?8T8*GmWK+CTjZD2l4%#tVq3r zxIg8Z*{!P7j4WT(GF^jkUp$9r^#1!|QDb#nL0G_J-C{&v$ZRM%cj`s}Cpo$b(@}U2Tj^6G@d1Ed^MF)j34ZKmOuu?QNn zsGaqd;i)5fvi5c{Wo6|J9qq5L!(D-!Hmn_?&bt`hIfixgEx%0g6dVBOz|LZdA2m1+lpfx?JhCp%6{s4Nv}v`B=i!Eh$sVR|vRTcLoE|sb6xqXCQR;Yk6fJ!JH%iFk9pqyEDWfIV|w%>6q5HuMdZI)3nm|0qaE)8;LGLHIM>_DaRuZwuVdkdne#=@ z!x_?^+$vGPtfzPKpR!{a`#cxeaL zw~_(&xn<9mbVq|m5qi}G9G2m7u{bL%$ITX{#S6kj#^Wp$TaTcUHRg11{M_e!c=1G{JN zxgEsL?*v|_E*iG3(8bnH{vB_aocKeC(lhK)ed7Ol4Ap?jPFn;a$UavdeM#50_#`6h z>1c%^4ldkC)@k&VyF0Wn=+8iyJk7?(Lj04CQVsJPr!9>AFo5w znMCq7B~t~J+#d0oDuDS*F9`~qAZ}|sXnhuooc`kx1UiwVWdGV-gMY$~{-=HUHaPe{ z-BUO?{{JJG7+nF4rhi|4X#b}L>f{DmR{y>-I%EG6dhIYvsX$2R7S3hAS}Vl)EAu~Z z03T@e$TR-P%&QJt{@)ABvD$(JVq`q1POb%TC_T}3S+{szH&#jNWQ$c+J{kA85 z&n&Y3BWC&kbjwaaH@^%42|OwyA|f9?tb^FYzQ@mm%h>MF$RJ2l`VbaZwG zqY!rd`{M|wJ-@ZCew9MC&?C$1bYhy!e zD2I>JccMV)-$t}{sTe#701{_@BtR(HC{#&T4cVl5Ec!u|zzp>(CPk-vL75*{($cp* zRAJobHhrYWpOqXeKH+Je`P8$-${JV ze2ytY*44n14356RK^rT`zhldf8%pskQn4zih|tP8WWf~pRVg4V{%Zdr8Pb_-Qd^}G z6Qe>zoj5eaGu6;H{~hz{y>xS~3%utWQ(N7&f&Gc)pVDv3IOpwx*vwXBUW6sIrV?Jf z6MW`3oB<4h`S|!;w*K|Su|Ou}Sbm9EQLVtY;r94fRV1h_{j}o{#gzCnJ;C4~R8q$y z&g97ysW<=KB_JV6UMDV2Y5qvp1U2%gFhWXleNaQ$Y<3~xj)(+LDLR^w(p1gm_Lkbp z*H4n2D1yI5B%fyo6+Ro3E$ftA(QZ-fVAv%dOk;0 ziRiTr!|r=Gi|LhWxhoSh3AQ6I>e#|EeS`9GPXI^{n9}Fg;b%+1lP33f!Gu$X-=;Hq zx1RQ2yA2#Q{4+n?@*-#ZEyl#q^L*;-kLD^r}mSs}NpB7K2uoKe)v_l4MsQ)+vRF z?R7OaPjp&7n4HV1uEJhg?K*k1h!keX7}EItFP>{5;EKBcHfR>=Dnd2>#pA)W>t<)qUcohl$k40n2v z)iGd+e&4)tY?kP%Bqf+bkfwsQ_e~wIbCTccSG!UGo6&9k1o{+{&$%U;IiT&MTW+f5 z5aXXP2a2CHf7JgF^*$jfvG(=a^iRn&i|@k(m5$aJ&lb;tFZ8I6s8?Z-8OU2U>uLfYr0Q`_-K z_Bq6Q&%H-a9jB~zTQ*8}KH-3Gg`dBXTwWu*m7aXlxEit1DQAew*>hfq>hCvWH+iX_ zV%pj$7qBB5m{+srC;vE%Pw^2og>)K;cB~047Y-I)USg4kXabDvRfErZB_wnRn@ z%Iyz3PRJw+&WCPCEFQ}rN4@+ZNzVU*1j1C}d$Eydu(`#fdQenSGGAxE)E$O@*tpC5 zsFfs*Sj^CHYdYiRvMtjuzewntt9wJHj50!p=<+qT+ksd&g{yCV1Zy*?Se{XK1D9b? zC?rpk+bOpqp+$&?ZU)Qh-TBu>LGIrhpA9?nnHA)=p+_C-4dR=4wEc|EDmYQxv^-j7 z{c>QsTwYU}x5luKE2F-l^4ighCN#hsB}#@_Q_}yfnRu_=Ie(i|L!jCn3qysE$1<^U z;``W84J?<$S!Qai6TjKLv_Kn5XEk~XrnVniw*_lIj$LUdL#$Mdvj?^P*8j`^dAv^B zX4$;+lDA{jVBCwhfjwO;nmFv|e|Z67V!cs3uKm!7>59>Yc=d_uNsKfiTkpEJOJ?}l zOz;So+;dNQ`}LM^CFc46&ISd;+ot~Q$RsZ+Z?OGP;IDy8Ht*wyTGJ-GeZ|oOgJfb2 z%oZ`!{28LkL3)4-%rV`4o)0w`s{Bo49*Nf;mc8mW+hr!&8_In+3_tH{LffQGUk;Cv?<=LM>FvEM^71J1@7ys>r%-W@M=#S zxXc^zxh8gZn5G)w&kk=QZ__mBB2Z$d28tBS(&{rzWij2oZ@Jn_mO&&L3wFzI&Fn&> zUf%+YEu7EK>FD^I&9}r;bzhrOrw+f#M9fyAImApPz?WyC z6=--!d|I0A46pa;V02#EzQ@&_!!I%ecCo}DM*U{7 zASQh}UOh9Eke9Rhv}@Rafe|r)o|94ahmIBM360S~8*W7Mg2qRf>W*p1th96GyWcSkuyY73j7@wvRh zDK7rAJ%rsuM7q}Um1u{)xO%gc(=Mar_EsE^gp{hNMyU+?qHwl6-Nb?eWR_n~uW|mp zPma4-dhlb9jAvLvK}XI`0^UXdTJGH(vgC{v4FKuY2DhR$+DyYZC3qNQ$K4icqM}AT zPz(Af4EX~^F9k=CR(Qdzkg*PuGed$a}@qZ#KR)M0~fmD9BA*IkHA5 zYW@^;?{KOcLdTlt8jyK8wLb@3(A`gupd!kxeqAY9h#R9R*-46Wl=V|wcXxv=HWn;u zi3HxSJDzH37P#`r1SrM3o+^r%WaH%((-(8T&$(Vp;uluRf{r@UIav@zm~H%4!y#8B zW3!q#Yi*?ug@@d&bA%$&MqMuZqtnPG^Lm`ph7t__;G^`(A2v zh0klu|SDJUAygti(h%1W)r)bm!n<6r`#Haqn5{3^za!!AvUb=+6teWU4(0It>W>+sgY2cpy7$xY3UT<8$(8qT=u$@Je zuFs=DO7_|`$Xd)-p#IRUi;L?9Z9O?_t^CAfRBKc&${&Hb7rQn>x};T7_~sVbLw%kc zA@D`rf=ltFm3zHmT}Y@cA$UgZ(Ah3I)gQWuGnHJRanHX6`?>@ysYjhh@pm~!1jR$( zy^a2cO}ZfB+?)S>-AGJMJeMMjGltqIqkunlvB(qL5NMlc=EB zW`iY*C~a;rD46Zv-ou9K&`=wiUBng%Yc4WY?pngw+XN2r_f+yU`ei~pqycXeaqhCukP z*nFg+$%pblTaW#M-*LtK&24eA>x;1o#L&^L0yP=JIS6l8K&$GuAY5tk6S!ZU(8O1F zM`e`($>FQJUOc*HC&_7pSmmq(&RppV1~oMDX*j+wnyM?p>mhmhTuPas%ud(6>{v?M za&?@=6du8pPoMv3e#r-H*%!H;udz?a$_vY8TCBGc4Qw;^OzyEyEVcw|9NKRVeSZl) zVm+?PsL4)x`{*}gKCNaJ4$zgVpy_%kf1+YVT6l%;e3}|=7WR4kP9NqozG3I~?lzts z>L*@}-&flC_e3QNj??0AVa_(+C4HW{ZCCu(uN+LKhr7$eN$G^x*5LQOr_7ydSwc6|k`l&5-d$QE`RZr-FV2OO%a~Er=(ZreV zFHe)*eEOFHlHw$f@;W+xbaZqC%$a`;=324Nw&^H3f1XN6BIx#2OFm84!=-~EP4OkW z#{?}nfsSH+AHPlat!&ZUh^PC`Fq1}hB%_6-4!g*a!VU~7_I>CbC|=ZFNvlow%3dYy zp!|NW48nq)Yfvq9{1JpY_;6F@n6z(6yfr&!aQ3r`c6N?_vTm|hBVOO#)gIQ`3@v** zjLt0Yhakp<{Y@sV{$%l)Rff>m#FJwLWJ>-@4WG60XYWhbyWD?^s1k6F#A@YSVuXRM zH`8EnewS<>8rkMJx?x2GQTnU$bYyR-j_K|KwvsK`d!4jvL=gHhY!_!CxL2|e{no*+ zJ3Nh@y_t5Pxt{a5F(r8KZY0fq0A8-uJ>&OOOxnc6wx-_7f$bJ@5hvEtsC9W1k;mEx zarHl+59`ukc+UIFnf|X8W3xGE>6!6(_$q8wU#r__eGjp+JqpbhaM{aIAu+o8`t|Fn zJ@?$g4>fGuMVkPvqLfhUAKK2w^kr|xRIzap3T#wGgLZ%)@bXN+K~|UZYp{lG8#^Cm zhzv%!)rw*hbKA@}@toxE&vkQA0q{y;s_ryi+8h(ezRK?HaOvGb&9#M`%qd?M|7lXs zr#i6j6z%Qbsnf81xH6|WzdpPC3z#pg8t^35Azu$LMSnWqy2;Bqqb^8fnOvT3FKx|# z;t}Td@)qcE$A6sh>_2Xj}^_YwUG)}-u=>d zce-8wYlJI_c3-xSnaKM_H6|tAMX_{}ctfdWkRkf|EF@)~axY%5M^cPb#bl z3v;1Q?T!*oRxl_@R^*m>j|4*wuY86?3bU3a`8rK%X}a;7ryG5n!C|dOPBa#qn&012 z2^*KJ>GW&(2f5`*9@q!yka;jT95RU}hB*cMX@nVSxCk3f);+CKEp*tf;VkcBb3O1E z3r0OVJIMvslaXZHHWq$u!Y`NwmmSQvUZKqzj7A#Uy*d42r1QBOHQu`9=o7_alt8LF zv>z8Y2$C30DOq2wjcU7^mtu!QhDOAB6v1;Zg?)2=n6FDoO-;?$0BCBRyy+C@8dX=ZM(x#CA$%pHn=Vz9Tpi)qGU+G}H4{rUGg)63(DL zHZFffhM(W@3rEuTP1a!%`$JnVY4lw@Z}rd4t+Xe_K9T3xi~O;Yb7rTn{^EGXBLqY^ zbCpDBgQ=JGOiN}qnaHZwSmp`E9*s`q>`r|Pu1j1OnZeuekcG0PCi6pZAkos;NJC?#FW&72^|0GMeS+|75@2|;gX`VR zKR|AltEC)bVFycnVSWzGBAW>sEKe?U!YcY;RKn)}H8QlQgx$5(Sf}`l)&ZlE?6<^3 z$-0+$3Mta)-SLzGWc)vrbaVtBLfqr-RMd@$Wi==7Gg$1eYwhsS(ppvM9gmhNuGz7t;=MPM@?km=9WN;MGBiJH zS&eXW={74D=C}o>3u`$CFM{>pw{h1(JTgz5#p|uEki11Adw>6Py2mA#YZAY{{&PNq zCKuPn(q@Omc3L~gm`%D~(Ox9@+z@`r9JU7G{l1YFEaSPl%%v81`vpBwz-3-@#4=EX z#xjmqux;JGnp{`UI-Z=usY8MeeIH>Kk<%R5Avgt$axTE_&Rr1E`#0!IN%|pk_!ZM6 zN`XGga}qsNZ`k5TbX49;4IG6f+w_{EM3E)6Y6A4VnRpsat(hAbip|@H`wpHK+d0F< ze%NG9e@+ae*74KSol@NftDf+8ij3n1q9x!e6qqP=`K zQGGmu)TEb}cP$ z*<7}5EgQ?W?Vh9kaNXB)KhO97dY$Ka=<|8&@Zvu8uSj!Pba^ZldTb+@5g^Yl&bvN+ z=w-_Q!mkjVCN$0BlbV!TlzIKDvj`8_s*_RCzAH-T1w-F%tPG)$bn3|=?#Hi17V0$d`L$CN6N3nt}6TUfk=~v<}=#YpXsbaNFC8Ix3{yKF3b}Lb?JTpg>Xwg>G{fhacq!|x4N=k_zB=ySRRzw*cRVcS7mqk07x(ZI^X4yVoS*a+ zOKs5E?U-FITpB>%SJv|?DUlFr_seV=Zjb6k2H6#a4uOhZjWd9Mg)(Nscvr7UggR_D z;@M0x0OnV-kdnBZH?$l(zFd;ia8MNFrfKY_7nf3VJw`T}>@W1bp0drP@eP|>7;PH6 z`nG$T65HKON8q~j0E(Vj)GXOI?KTmh_&MT-YHxiGQPZj!z9G|6%1nRTTyLMk9@A$4 zO9~nGF-yGB?xKLb%3{&VrLE%o@b}GViit^Mp|HB9Tss-G6Y(2`v>QK2G)odRt|3bI zE_-1OXdgS>>+5U!gIHnB;WN9tiya43f2mh6Fkh&;x?$6HCuXxGvVZc`Oti{E#XCA( zb8pE^W>V_C;3ZIP+t^~x#IYf8t`XAxNfX_$J6xYtU;x@BTa?l9ZPd#_Cys% zimV4wb4a2xOC*2npDQ^wxe-tEquCtKT@>l-HALjJySMv*=OA?7lbvExX$SlkpS9$9 zyy0MBZ)U?g8_Z!SNsE5J+gM#~XQQYi!X0krZZ^y&@3J>aZ{wdDZHOnHZ%-w^+f4B= zUqC(e6-z70`IQ;~cgl!}t|8=m=j&1pJGW%xf zJ}g0Otu-_>$iZ5KR5j&gDdZjrszwcpWHZO+@BI3CW(7DE&%yMnstd4|64_(OLvi9y z=Bo~o@HrYBEZ$hCoVf4IWJS*<#Mxc+v--;Lj8zPxTQv0I?i7HWpNUso;xPpc8_k&N zDzk&8str4Y>P2vu#8*;!m)u87bG1mYof!es(+frU-OFOKvNqXB+>ae?t-j}JdvE|L^zx1Y5BDY9Z<%My1AbgKGZq?hp;1cE3=LphrE5dOu|t0{zm878{n^+Oofhh^SM`I}HO_HY);Lh$RUyU1#9cA#NSVke#-r0aOFzF#Y` zix;h?lIX*5IR&{Rh$UCv!CBn##{D{<3c1@0D)y-ZQZ+;{98bTk9T1qV`OxekQ?T?_ zNU8EhvpX!s(YO`0A@3!pX~H>R%jzjy zr)OVta_}Sb9Ob&+9fxlr2*!=O-P??87-keSimtrtJW34z;?JTCU;X#p?!%c;ko>6*NIwu{tdM!W@!TO%w{`5ne|}6CM>7d&i;{`XNG33Qc9c6Z=>T`82T`a)gL%~vh)y1_qQBhc z>zbaf5|jZlr&{j&H^28rGgi}Li=Wrsy!Al0i8&z)sh(4Pe{8(?KkY?@K* zP)=zG!u<_1|DjV(0iE(>O;7TFt^4hm!dscwAI|Ce?8DkyMn-I)Nht0iy?w2LGDhxv zGfuh^CFT14cs{J36^#>jh*bc&M>T(HnsRNrM%p@#f_9k+UvT)O+kF7Js)kS}fnJr> z^60ak{KQRI^AZyDS+jz=OnmeMrN=ZqTQ8XgayFU0L*%D#fqPJI+VFKkZljCy{(53I zi`s^wrUitlkcwB0BU`Kc^G*Ln#XVi2JnV$a>YV6qx;b{vai6t&R8|I?kBzI^e4kvI zTXqs?#%)T#P?F;P!mAA8MqN?y^4I{!#~C-$@2C!^|CO9OCA`)1i zj34qQA?8y8*W9hwf=jtcmRs!I(LJIdbWTAI+SF?5Iw@?e+f5-*Jk+7oMdwd#_vSOe zTJ-K`n#~S)Eqoc@MVN8Mn}2O_kv?MgpNEx&XSQ@|Io?~@OiDk*W zQh%zPV6EouJ^OG`zQPoeMw113fmAS$q>wY8X=>-N$p&a9sz`e4Go;rCL8db6J1^1sPvH5|)C z7AKKHDrLZ+L-#e@%-~dr85+VsLTvrKxjbyPSmgTWEmrZ&U~>KEiO6a1sk&DBl*u;DUIqu60swkxwu`z9&s9!}FnmQvaNum^>ym!dw&-60Gn z`#ZST#3&&1kw{rXz<3{Nk&+$dmY>lR*N~@OhAZN?{Jv8-7%Xz)?Z;! zC6z<#ey8M|Cty-vW7QK5Z`ba9l-s8%yw_T$_%Rdz6%qou3BTP(r!K>)#j4b^%?NN6RF^xDst>0H^4HNB3XBVmWQ>eWwu!e}U5xyPXAF_1 z_aQ3F@^)mjko7(}EV6oEELRa!bzg**?pNC0)v)B>w-5hGqWI)uBTIm5TL0YPyTyrTy3&h^@H;po>!nx;PG}va&L|w{KHD z9v{pS%wc-Ie%JgSi8Oio%4+sCSgdBV{JtyR+yimqwVV zv$d2;9gc4|Uc-PT)nBBY?=h3k(UMmeP>P!0^V2`6*{u7~ZrF2Jb#HqzZgl)yBvX63 zMK($a%nv_fi8tTQI$D(?J2BZmV{rOuGwpWNu%n)f5 z-Y5uMvH3Dq0^Rf0wH!1wsbzU0m`If)SmXgQ$hEj=7oHNzx5|6*--HSM_?TY%KABiQ)+wtRMgX{NYmJLiguk>SGp#) z1tLZIgN9U-2K_z`h0P||2A7Iroc`|Y-_wSr5DeMYI?el|wX(5Cr8sP;m4-(Wk5}7L z5|Ocng@mxA)KJ$J-*MJ5L?X&-Z8Z@*TA(F?-JWH>h|xrp-TI^jtscjIAa%Nxp`CS`7Ba5la@6_tVxXP3&QF>!dYM~y(bCc<4W=|Gp&%HG3t-ZIoR7l79yMEPac_X~ zpKqes$_)>fNiJtGgy9p22d6VQ-dB5GTBv={@N7d)dlx2;@e@`2_5 zSZ#a@sNJ5?NCcL(5z>LgC;r1`mA?!jBO(A+`Wix*pGR)N^kaUhkfcpWKqH!Jzhr>L z-V58TTBDwqO@1r)zZ*4#mHU){hA*-`jdnz_;PF@dTCK^RnWN+A%=M&^fKD~u#;|Ud z_|#9uGymR1b%Sgk`JirXh=uLi=Q|UMPFv$y+oZ@`U1c(Ul212aTl0m z@XU5V66xB6v^jOxsj1{NDVWWhIYcX(-*YM6pP?deTK}X)^VIIS-1q^q z7NP>lL2u;Ak8T3DZwt>+&$oC?N{o@)7Ypqx<}C032s;jl$`_LBH)0!!udqpUS?zT_E;^M1 z>{WB8El$HN+~GP4BFcMN9P36#t!yA#ge5c@gI@J~oiHIiDcM($O_Nd+;Dj5z@U7ze zezY$m*P7T;PlrB)+`A~pjBA#joAfpmq-v&$=1y$~3ud&bQptYSlX+#r?(8jH%xt*3 zONbIsjoSXbKIb3#%4hPRWn;72poFN4fj4z?nQ-b{fv_f-IUQ3nvTp=c!-Gf?s18oY z6jaEhV#)PBHYOQ?SF;vep~;e1j2$Q|3uPEV@Q`pODU9?4=u8I+=)4A(ZOxPY|dTKWyBxMve zsn1VfPZUXA*UVh@MGSo_R8&~azA|;psm;*Lhw{UkQt$nl{8_+vVbJ3rcuf?!E*m&6qvRilVN z76GHvI3fFK`2th3u48zneb=7PK=mm-b`{0=g;)T&S>adP_R?OeS)%O3mTCa z7@EV=Z!^>Mp$oOnv#zps)fiSd1DNdfW|Zc^cA&_gWX@06bb+E;!H|*WAuC#86K+IBu$i*#R)*Kml=c4wi*<=All5t%b_?0^Al5#F%*tk)-zQ!(Srt(n4fDBt?5 zu~kW3HoJs%%FgB=k>_jTpyk*sg;|9uD=K&v4Yz%SBnd^SF9+>ktv}oh89$3tql)^x zX6>Y_dpSHTb<9#$Xn-yw6zn(HsfDluQuqXok0?UCe*aDW4YsRck4-H`S(%5h zSWT1=`pU6_BgRic!p!-g}~ zl7XIsW87RI7#Orb?g$alT$hkEtJTgK=pJ7uBfQ%FOaBDX0*Dq*Q5d&xgP_0AMzpZF zPTA;RsBkjTpLFN)fz=Gw4oXavwbCiV(D>~2d9kU~HD2*JRgdezluyYJMo{{X8VSM> z7UXDEb=Sj)J0EG}J7b~QA0g}V@$vd>o7`R?#}`RO^H5i)$hT&;8CB1Za=xcntta?P zZx1o;?FpH>A8@-=@;>;j%i8qu<3aBlo{dz|yWsCAD5Hg%i(IbD`|S2Fp`k}-2G=z{ zt6%176k{+;zdIv?|M^Ez4e{w`Uo@o-L=vxAk_1&mSyk#7PNdoR59)yZ`5^ZKeL)}p z5G+QzU!x2BL=gx$Y$Wde=VyGVXTv+b6_}L$7_T3{VL%~`r)vRb`P|HL9K4ff1VAcI zqLZYy&nT}Z2YY(r+&1UkZaOYP1Je9~daUYxGlf{P$*c1FymeL1$LEzQZkL>wf&%AD z0@kXuK$6_xbPD+#vY<+|eyiuDqoW=|>g&*lda zlX`pVa=C}cZf+`The~2~b=;kzakHq`-?`=NzV-__f=EI)+3TXe%~x{KWiip76y;G( zzyI@3I^DxrV)vbe+Xo6Up}*Bx!vKVj^f=!d`H;0PZ=`0h9n?2ER{d?W;e3*ei&p<^ z3!QwyP+9f1O}rOkoHWcn66y_7^#CfXx~1$nX@^6e0M;{&Al-=y1{NJdU2mc ze!;Bqn0;ibaKTmApOtSC?*WV^{he2vqaWzPc?p}yPfkuuF>H(qTBHYowzCJQ7T(FG zo&d6|4XAVP@9#AowE{$|2SY)9AZ z%ih(+7nME&<<5roRY*)5&v|S&=sea zlmJ;QQge5I@5_pIgUe}scG2O}?jHt^#kMvk$(6ummdBni2j2f{N(#X~R=&G10Fjdy zpF#gKIfgg36gbqI7H+ypeFX#*B-htB>(dfmg%%BQ->)t9w+{>4Vx)M~SuT%NNhYz{ zWC0~yzn(j%yK8Txs-ZRzz!j8wLD|&%!BW7bfIBK<;OLw0jJ=Cf4wrbm4cRy-O!sO^ zZP9Ae9^u}tBeQ9h?mK&L(1?oTZv3VZqxfq^sHXQR)=6nL-5oZ$yRTfky24gx;(WCu zC?s&2Ct2PElWAjpol@y2(ox^~MCUHAzVV5?LjTvn+@z@=T)M|G^rXGcrk%kn0i8IfCPIwavO*Y#K3Eio8 zsswKG`D^f_uh#P&L%p+Jn}3QqTgi96bfDXT@AaNrY|r$T5S*tGEbw%A!ESOvA%f+@ z@6E&s=-Xa5wHX?p&}R!GpE+#Ka->t-PkuisjoJm(m^O}|0M(~oi|?dc#RFK$96-we zjkH(2V-s0~9}z*Ydj1G@@sMlEV)go>+?R$9wY6+LKngZ0^x@$eke@*=-Ik0C$a~*g zy@}^7S1D!9Gi$sMV}DGAq{jip-5V;`nSm%163N=jCe|}70Dz@MsBES|{k7aY;gsc5 zOV&p9l)x%TyP^MBI+_H!0jJJ=mtUo&gOdms*^FvSvYF+6Ju<4_XpuZ zg&_~?WjGI)-(D&bxQ%Afy{^bTkrCrHVPCBpa8n_*gq)bgMCiUhVSJxsV9TG%dU%}Ly zOEAZ-djlsds<;$UC%Kg^%s->CM8rIAyZZH|WJro-?I~Ox9~anzH?R?J9#XZH2CU{= za_-3HjR(KJJk2$Ag^?-s@!2*%!0oVCq!A^+Ef8I?6Lb{7VZ*#?2OrD%q~|($m^)wR zZ%zSX&WCCq34eNMF0;{($4-zvTHKIshfgkVbulRBEwPnKf? zJYd8un?@s>22n)7Gh5gv2;P_31n!T_T@z}U4a&Rq+Lt`9lI5vks1p>n%)+kOth=w%UO&0EAPlPuCV` zIgM_ni&>c$S!ltLPP|C-j)g?30n@{{eM(hCM5NP1iVWRhPy~&7PN71@Oy$M_R1(=` zBkkZoA35xaAR6xYk`~_aXp3!TersyRGrL4 z$bSPknQMPZB~l0nR16Bl!?p?osS#x4#aG5UDrSYzp&`VZoNYz@j2&xq%GzyaZOgsK ze38!>LPAUT+@NjQ=D)YbbT^V%e7|15T|0bs(KN3J8fL}0iRZAV^rBFj;$EiL5E18+;A*xueBN)N~LLqG>#E8e_ z;PWx)wi>orTt9BRTS?GrUr7aWfE$$4P4)^G-HWGojc%&P41l$$D+KSpU6LJKiKXc| zTG8aDgLmh&jNa>6o^XCd=2*}d@wxHL*;|!b^Bii1#N_aQ(l};MepOpu-a>bG{KfJ4 zUvczV0f)6e78+efqacb^3ZyDbzfpI~iL8U7^GzTzgLK++m_8Wdu?7)VZwYZ%N|E1h zxD~crGU|7MwE8%ltx==q6M9CFJk(oW4;g%qvv&{BJ}0s_g%gwK+w(yWSKn~*BBK&@H%NG7p1s7hm#^3weB|M94i;xNQ#yo?B; zfDKfv!a|0AFFEMKKWCpB<%SEh*;GLWO}U%~w=$J(+YWTiUk%JmxNl4aSLEWW>ViUv z$d*3lb353EsLN(7JH@fkqZ=dX>F;me^Q)0jq+ic}Xv6v@HDfrD=%4ZNbL>H#xZFn# zlz^XtvYYuQT17%Q;jvDY7XS7#n?cJ@GIt0z)?}%p1q2ek)bfek>V=O*Nk3e;EbfUl zVH;bI3AguBDqp4rz^Vr!;?Nn2b}_NNI>1NPchEZSVQBo$V*pa2t}&=bqKM}uvOj!h z4o?sE20^^-Lje0mYCchK z!&Z#|D!L^~Gts6F@2mFsQ9?HEXrFkK1}C(XH-5SL(K==6>ET|P_E8eqa7UMy7tyNs zyQs|EX?RpG#?%V~0zD5xa6+=28#P27ip2#d?fVhnerhaOTM(1q{a-lOpSeJ(@#?F@ z;wiO8I=#EQwWP36FZ8aHrgK|()hf}6|D8-4V`E6*?UJFr7K8M*%$7)*|jMsdRk@Q%J)l-sv$PO!N+1^4?ge@)4ojU`W<;c)Ai9OKGY(bS(Q9H!-_|+oG1stJPI)dE5 zgaRBV_RQTa^iuj(9Gj79R6$`lglD@w>;#qSu|*$!RkzGkz4_*#h05V(tG=Zr_}jw$ z;4$dPKRwb4cFGPDrwn*nxEiS9Ti|}#e9(B4Fs)~tN)@%TZ@<1wq9|&8_8itzPK0p3 z<;FQ_znN>{ZVjMjk+J0H2V0+z0X6|fM$HiDyMEtZjC24yOPumbK#YcpJ&^ImzbOj< zg#h*aA>F&S5<>StI$zLYpmr0WF>_pbUgvolptkWPM}3?6@Dp<-j^lP|j92^pptwSj z+WO{ZH+{^?igqs}rtNFMQ;uA_U4AP;(6lI>Mc`^?`B|d?rrJLTTEOeIK)LF{}MK_uR=orU9cMsw|llkDOy?CuU!?f4!p=j>-_0ywT(BD5q| zj!O^R)E?L9RtShqDDh7&Cv9zQFk#|RP?NP`0=nYp4GP+jd+9)U+zro;znQ$ZcQ4Tk zT$@d@$ySl+v8@3p@r?Stic8yK|Aq*z2D_qmt7$V zTLdsjbdIAu!d?^3;1()y+v4_m1xhbsS169?Gw8ydB6jL(y40!BFf#w2- zJO3C!iBU{=GMs*1{Nx!pjoMwMijQoz~tUC#6qV zxa$ltstC}ccbt~~Ub~2!)Sqa#yke79Kw>x2m0Ua!s0$H-@4Dok#t40Ad8WtzUG$Ua6vNI7F)7ttf0AL375yVKz_i zd>Z{f!XW2h!H9)aW^Az{%olP*QLNlIS>z)BsAejfFsUY%*|6}+Y3!a79U865UDnI{ zDQu>Z-{^TTP}?*Hx4Y6YEN8CMRKE`>Cte?BfGtxu*U~AP?R*MCkzH}Y9Ex#|$dic*-V#Oz3sk+^qX$_R(N%($+ zKWSi{z`wO4fRz+?zh~rh3`qu5j}MltVesiQ{d}do+LMV2j_>& zRL<|C0~bm=VMoT-qOscbDqA~G1~>RUV|nikfnCxDxzE&!xpFIS$X!)hWM9pe@D(ah z0|N)T&Z-~vwS7Wf>$?ux6~?=J0_t+2o2AtE`}5^7L|~Z(Ej+E7)coB1;_TVUXAe}Y zaOt8_H_}(XOc?Ac-Vs1GOtuJvR_$Dlx+f z$4xk!GWvaA3|;{w8*FW5$P}I2Z>@$wwe%E}%Kbk?NZ1Rw%7~)ghimPjSRmTyil59e zx{4dy1i!Cv-JTiW30DO2RBlbT-^LI5#f?AChP~B)@+sFnWPeF7E0dW+fUYltf<_HF zHCCL99f=eN+73EqW@aKHKWNwn6=;h_6yUC+Hi|NV37pt5NOsDr$(c5;2Niom5CU13 zy2D@=+Q!1|Mle3(jxUCW>(#P9kd|(6ozWboM)tlv@b<=+Y0Ytz`~2kK9*!Emx2)4X zldpAUP@8$7&NjLcU&ncn{BHqEN$KZeTj2S@8my>e-fHaY-*Ey3SJq9#pSNC*&*5#; zp0?oztBISFy6ecY|J^(%n4ntUsw)VEbzyY_BZ?my9BP3)%c%MoTAIq6w z;NH(efUD_V=~X3w8jn2yd}WG?ibJtKVq;>Mt=C{?*{}ib>4U5Rm`;dKFQ&P(Sh5h#%q`=3M>5{GHF6MXgd<!^nvElw$OWSf3$Q7naoKL!4M% z;TXLW`+v}fGRy;V2pht>No@(Wv1AUXKy`$)&fYTgkv?rE1GI$Okyt#7%JJp#TH)Lf zr1-pnk+<%XjrDj4M zhHuOU4~CP?ss3pjR&;6S6d^X~P`koJ?~gJ-R2dWdmyV)&7yXY!C2x8}RV(5s9SKW? zY#m@_LJO3;gxuA?uydJ=F|zE@AYmmKa?6r3qvtjY0c^yiDAYhI}@<)WFZzGu8b5S%HQt3{?sX!7T`o?!`%0wW%XdGP;`ynw z%!-+QM)yA#CfRS!VB>y84LN5S1<4IhX$=H@1b%)#srSz-(19{n()$mbmyE>7!lwOK z>d7EldnuwU(D#AzV}>~f+C(ZQ670C)lBWm6e}SbfnbA!(1ppCNz?(Rnt~~`7V0)Kh zfBVvdjB|s*#MUpqirsk6z%90`TmFCjg{?e@CJN)axB@oB+1(ktK~4wRXB`+rwv>%P z3J%O0-|U?1#|SQE^CxDj+#Z3Y(*U0@V}wHO%J!nk4YVzPH9C-S&^AK*3oHWq~*9IudGZ;)s(S=l{S=DlqR|Z{uGfo3p+^+zGNTrk;}}o2l>E=@0KtYGGjEF4kIr8Q z5bBIuU|_FWFq0dwqQD}PY$=~l!XEphAS3e-U=^2G9=h4Ylj-8X9$ju4wWSL@wo@#N zE@!sQ*W2gGkv&)fs|7%}6Ke4vx3-m%9@lueh{?!|!71N)o6YwRhp|Lv8-O{&`SqY5 z?)NkGn!0i=7_%v|s->w?>brd>Bn$H;{01vn6N}~t=evxs$>xih$768A0;UMFhO-eC zSH_#aMa&Sx(LUyI9rT5H(og23v-a#1SL-HG6Psy;l`o2u^KW$o!!$})5ZvwdWmew2 zuL2*w9H5PP#@BttGzmz)hve063`r1wh+0t1R`E}z<4+iP$rFZNfGV*`T#iH5v-uIH z`0@1ql6y&92aL=0HgU?aln$VuE)Rb9wXi;QdRsuRH0!aTcbN;YO7Ua{FCr$hg_&xL zy^?p{hRfmMqsZ<4?v=EKRSJC=39jugoOb|V`WK{DsE{s4c90l_iHr6tu>{DV%E|%( zCidG+A%DXB${7y5<)EA{&UD7C`Yd$2=V?S+SO?E?w|DAr5PQGKD|`MOihww^&l~iu z{-Qyzw~%86tb60U{6FBm`IUvDgNTf>d?&XrFq3U)ot&O_x>Z^xd-wnV(US7ruh*-} zP~|>|7$+y&Lce%G>Okc9$@JGUq-8?d#`J8-r1u)H1W>RR?|&uoA@>|7%A)-M*kZ^$ zZ)gY(VN4GSs`)A@6s5=B6s}f~DqYoIDumjL!jiXVb~~&y)d8@Ce-L{B9!NA`P`R=( zRb7JC&h`FIMrOgRTSD-q!BDc!zW7{Ej(>34E<8XEitN_5tZqt^B;%gnXYFMa6tv|* zbpsugfmvQbgZ3=aEHuKN0Zt_h302ynot+(lM-@*_H;)laaeXU5wtwkrYiPiyBG|Qh z!#;+#JR34f*S1@q(-4q6ZX+t=ivKDmYq@Mqb_R&R+tra`{EqSPB407HhOJJU+F6Tm#eJ@m^dk zi6G~%r4n~)X~|Ithj&M-IzZ&$nq$_HH&>2^xId9rJbz+iEm1_QrqG37>2H8t%3FW5 z!m%eJTOvEtgPdbc75>$BmJAuzCwAlmy3URc2D`vXQ%HSx=fC+E==MUV)H-K%^~Qz1 zzCIwk>S=7;8ijXAt|tq8_Y`6#RXjGeea2-S*CsTmf(SiSFdkl}Y z%;(ig5>c91D(SoCVsWH+Z%agWz$phq-9ZW^F6%>kUzK1~=h58c(V$nh&o%-LU6CPg zQ49!t<%+A?35$dw_p5gJgekkhhYdJbxuO;ME)FMrwzwigjSa-xc*&fYRSQ)x0# z>iC_n&r;Tn)w0HLwvK4x#cXXqe;nLEWyxXL<;*Q)#uOJJU|r!$rJlt9@dNn7s&#wd zN=qB(hsR!+I4i}0&BMzfy~kyszjtAZYU2Fccs=NyN+a%$C)fy8rd z$cd~rU77dZN_Y@$h+25y1~v%Aw7pN6at}reAMVoTv2hcaEGn@DGIKuTVZOF}baNQd zULhhIEN6dBAwb;Px-p_l+LsF0PUa6*c{0l%Gz6()prN3ozR%IK1s40n#67EEzFEj5 z=zWN7$HrCIQV0g5=hNP<-k5A&zRHV+o2t_;nVFLwoFTC(rizX$CvG$y!C2W)3k%6? zyhud$MD{+xl(rcfTQ9w*@>1!78_Xl~yZO#>&y;aFN;EkPCT8=6LUDOcoi17pP9_=d zx&megakt8+OLd4B-zU`#$H5ciFtV{Z0~jn;b=V%1#$Jc7C!Z}B<9OyD?Vy;*OifK1 z`^NDiAZpNmy$t1%ep1#n-&x1hA@sCcwP?z zISHuYqOF1;W$O?SWHPAoZ4l)`U*G-*eHCK2F5Se$ZX~RQ+PAMdwmu|oYk&+acMDxf zweD{qMqj9m<_z#7J6L|@W_*Ir473T!;PjmEZIpt#NxSlHvUGAm;G#3c_z@9db8~hG z0vTHO^a!W~NClmpu~Rl2v<-Q46i4MU@D*1Pbf5A=CTZV+BPDGqwM8f#+t~GYVQXvs z^_sf-XuH{>MfT#^u)TcYwr-?yS4JgXzrY;7-fgIQYpYj-DR^xN$s-Wmu+=Z-xK$G% zqNkThGq$++xJcl^OHB2|vTjLdU^)VnqZab>S^cxY)K&hKb@^g?5?9=pxGXvG0_;L2 z3lTTb_AEDxVynq+U2_~+xr|sLdwJ5lnKI6u{N+{|gdX3zTc{3(O@Fl=_kxQ?XYPq! zWWobF++uQJhJ3I@@AC83r^~>n;{a9ws%kYGhLI&U)7q!4+W^RrIp#5$I_BC9g@s8u z*NQXmzK%lw58bZ0IJkr+0Q9NfTOplj9fe~FBY)rQUphA?2hMQ54}Mlbe(b7OvdjlFMlKb|?$U z%+;PrM(dZ+@v2rS2DDJQsS+JxF#~IaiWydiw;P~x@i~NmP%Kq7YNLIpT;fbAfY0#) zS(XG%QGKZG!dGECpk)3@H2lmFN`!&y^Su;@P)^;JT`;n=+6MK)xtm`>Cj-y zTie>h42Jh*g5|!dXDP+n9>+=g`F{Mn+pv*kVTbj1?%M;z`hRo{192K*GM2GwP`R1GL)XP_=mn>)5oP= zJ>xmQ9b~ZM*H-gz4q)S!#KxC(Sn*$!p9*Uxs_BUt$9r^gk-qFKEgvx-51r1U0>d&((>s1P>%OGPeVc=u` zGBF26>j}o0(`$jWcMP+I?PKoXv$iluB<|X2x$5gjILSX5NikS<0vz;64NdL;`c zi)us=O0874m74oegUDSkByDdknSd&wz6b`_vVGWavX!Nl_%XqVVQSt`z3zB#wJZ%X zVGdspSL>a|qpOf4&dyXfoS8gC>iHi^RwdFrQgNJLz%P(JBE#tB_*5S4P0ScywH_{8 z5|!Jo2bDS*Hm&O~yAS?m5`8%Zd38o79q+uMSx!#?nQ@jdioi9!P#4xe|J%pkH`Aj$ zF3Td$ntZ@O(VlMR1D%W`>q}e=IN0aUpSQIQCx}6h=_tGx714;S2En(I1tIi9J!(-6 z%v5?>YUR{wO^KAsCu%Cx344%rC3$m+85k9H#tH^3wsMs8lXCuu@dYg987j-0n#vlj z7~y1hkZ2QnJ8Xwu(lNWXKE8q)rFnsKiGd=MMs62&e0`Dm7fYNn(A!W#aKqZWT+El< zBc;y~17i3sXnKDhkkgxmGWE{X|D(qK6My&uw~&f-?;k7xc=sYSETm%OlrnLi$73PC ziPTJ0Aa$J^QxJInBPWt9mmdWeZEbabe>Zz{a^mHSE9ToaK+<@4JYGxo!yzD4&bHPM z&tHP;;65JcMlvGSb@`VOOLDO`iz2v9DF^?RDm`!nd0s2jsvvQ@F5iDgDd0(vNm-G<( z)L_2%=jn&a)f!DZ2>(lI;20-Xc(eL)iB*K$ST3+?TSY9R@bC$gQ0e|c!_sUiP+4Ub zRySHkc5{o5vPZ&0LYkjmoNC@WkPQ!E7W!bQIY65N;zSu$hm}a%=MV|GM{q3}dcla3 z8Uy!NQNxtPv5-QdBduk5`6gAz#evafZaRR=OI~mI=!eDWW03rssXFCNn&|gTZRxc( zOA(e8^e>Iz&VGEuVs-QD(}Udap8IArL#(lhNV#1(FCLLT^shgPFfrlkHa3ud6zCY+ z3pL(UJxsrnHSrSz60dfz6nm^GcYRE{7L#MteVfyXzr`?u8MzvY1Z#&)(aG!b*cP?b z{3{dxu|@*Xg-*PRnW}nsS}qR6r%gFo)y>V>{%vf^PeHT}*ZXI27LTVoMsc-9{mUPk z-5*znu*G-DKJjG>weri*-52~aPKkWwKI9+B2?jbXKa{?Sb&bbMxl~nPPjYXkLn@h_nP$F%; zA)z3c^B5oSz{Jg)+TtxrqSIR$U>1uV*UT);k-catTFt^4{54>*|Ef(c1S`KpAjDleenh5zmS$I?HrW291s~0CrNa>pxb%AS>nsD@lwbim~lw` z`BN_KsMfrrWbYoD5nG&}zlMg5&J)jS!=1T5$(+F!JFlvrlZlyBzCwzOvtjP&qq%+C z#zfq80DT5_%8=x&9F5(x_{@s@1=^8K>r;|dOpcrs8hV$gak{WZdYK>}7Ov zVe!bre!cO`d_Vhl5<_KS;mUxJk6BM!7GjK}OW(TP`MIsYX1?|QG~55*^$Ky2Dn%j) zk7Io{ecb8|^#TeC9((#wMoYRl8PELgnIZF2G%kBz+{+IJgIin(jf*iku0UAV2Ai^1YPNflDdL^aULjlz~Q8TLYtmaW0aEqm_vGxlLc2c zs96vJ4Xun_;)7UsEjSsF8>unDc=niI+$~+eWQXKXg#u049~&dm!}h+8+5BMjQ}NX3 zyh+55N<5qP=eaSb^H??iZS46Ycp%oyl(Y+(v})l28+yOG{lSdO&Dn1pV##lzp*IKI z+|f}{ix=Gqe0=q^5SzY|>h7H-#lOkJ%S>YeQ&QR#2#3VAwPelMaDDAN=@B)fMCKGa z%_=tGs1g+)on;L0DLYHJ3qMo+=;bTMV=VRfVw*E$ROnHxbgVv*-cPAqt8xrm)>QLW z3>qnkGp(GdG$=s7a8LK_Di?I86*K_>7vJ(T@<07?%i1j7Ki^melDgx5Z5m0kfZacm zt;FYd@|&kYcdqE-dboDyb%DJ*8q&-Cl%N=*Qu|e$S2W0(f`N-BXPNssV+6>Az}*WH zy=s+f+HwxW7)>=+!o6B=-r%bMd!D&FN|)p@$v%piWnk)&iO>b&cTsZ51J(|~k6ny+ z&k9&$qT)>C9P`5tr~?DwEKGl*;B#~G27(w@IYNyF*m_5BM(OE59=6)`+V|3!?D8kyuhvE&j)^P|nYnI!zV*+U z|HIo`$3@xo|Gp>!(nv~+NT)PNNGshPk`mG=9SVrFlF~84&>`Id(ltm)Hw@hkve)SS zJooeaoqg|f&TF52=1<@?%v{%6>sssk{e0dZYY+jY;%FYea+6Rpjs3bd_+;yeHi?k; zBKFLo-xC^coCkkzea5Yk#K#Fa#)r{m9+nmc2dC3Nb)EzaAirf#}y zoX$Or;N^$02v^t|zsU0o$`*8cCOT`CYuDaI4>mA?LGIX;@Z5#&AqoPv9E~LYP9!9~{$6vNZAKL&D&YN) z$+k*P^WvSnK*TX*yv9NeIK%`5Vnf%F_2c(F%!(jQhWefsd%`8N4;YH}1@%Lou1vn5 z6%`WufR?_CPSgU6nS zBGcXc3Z==Idn86v)wsAMf&ILi&pJ`?#%O0NYMyCvfan5o6bSVDaO-VQBg7^ZRuP8I zAmdy>C@JPQM^!%m!E47E;FW*mH4h@qWBm1`214Vf46@=f z)i3-mOelvxnRWU-@mc*PHdCZ=_6ihO4daI`#IDCi#^}Yo#n_&5pIUB{XzP?-;@5NA z@k2*#m=xz1Za12PqT_B#+_OXLMO=bKCY+4KMBPiKht~HM#Ft?UkjgCix1ewfs=pI6 zp=Mf}d4>5HSXho9qxPOY6168B~d=h_FDhQ#sLUb-kQEJ34}NVqhH=$(0_lNPdH)iu%MaqWWekd9(mQEmJ_odM?$> zIf|H~N-S(kerup20*jr9cyr@5?R(tpbzh%Lm?@|LGYzQZX&fc%+W1`^^e%*k$`$wr zNCaj*e0}Y=#gl{Fw*Nj()^ zJ{G^*Se2(oQ%oQC%vC5LieE|k8B>Mv6rNwS}T-9?9%l&B>~Ct8FaXv z@6GtV`Ca98$)c*r+aEw#-B`;gQ{zm90*`;y)3SDCuy4}u@<`v#Sj|Y)+D)V??^X$W zOB<$Vd~^`76!+X^lo512gD*cPVBF0>VZ_PsHV0B=E7ATh>%cq3$e(#Xs3dsR%Ep#S zG=o}>0o3ZP^q1P=w>|F?`SV?jZSeNx{6fLC-?tF-{NtrKXmQ+DBp$u`DrWC)-@Q0@$Z;AJ zHM6IJd~UNc*N(^{3gt7+YV3%Rsknt?H|S%G1j0Zv=YYxj83J^!oFXhp<4OT^ERN40 zd3L5vmI$@v9m5Ls#Rq*Q1>+M<-**)185ONI@@QqF4n=tx{YyQWfjFCKJp(R&m!6U0 zd^lyoJ1Of<4@u$V=RJWA=Ce{m+;UeEX4j6g?cnX$fxDG#Rzch^6$so;Xk@HEsGtJf zw;uW-)~vIxVWSb0zw3#T8z;;NF7P->q2DNeDZ_?%nS>aaqko+2(oxI@?%Nam$0Jrx?ei>9+&%gWAJKQ3-^ zaHN-=)^Z%jDx`<^%@2Dgr=@5*Qk(r&Z>1&q_gLhm%v9|1F5{oa+0 z8QE@HOeb0_CAi(tSx*An)(;DkgQ@k7d8I#{xIbEsOL9Qnd`=9CM?KwdoAN640IB); zof7NTfaGee5>nWW-YO{|LBU<}M#p-+@hs!rMJ=I%vM3A7;3m2 z)QF6f8f%M;Blq~t_N?SfGeC_^`txD?+@e~u1_BmR6}hBsLX^3Qk_yBb$O zSA~cuF2=zM-oRbuhSiR?ctT&rp?c;%HPB$PSfdY}wyG3N~-`|S}FQCM(^bT)~JAdCTuS?dT9bGB=~oOGc=_l zcJMrDavvIQ7(-2OyPVGujJ4WR3HTZXGCU%v`N#6u1+(yt<#|sn{RG$Xg2(`9M7N?0 zn%gQpdC!IOu>-xle(a-A=}@pc;a$c9#{WKt+PtBAh=Tr zcTi9!1}exY_9CT~Q$;1$k*`->*v~I--grKdMh5r|p9Iy|2S+V5Jjf>To&<;*s5XvX zG!Oyfy_NeZ^02REijd#>UP*8cs5foQ&P=Z{HnzNz4+4Tr%S-1;;%u4*2Mx;*c~>Dr z|K{sV7vV3sI7;iZ(Bwl+-b%S3{v;xQqSRU7+7O)Cd&4|4|EFeeCz4GrmrlI(9AqhU z2HldKwW!IzeP zCiY5P=9bYUZ4jbb(F_;F8 zJ`y3cY{6LD@0}5H@;C7uZC)440kr~8Sr&*yUdjJ_D9E7fQ)a@=9d%~wS3_XLv;>~X zK|8`gvHj+fVj{ZCu512ntUc$@C6FDH7GAr1c;pezzFrkI-mEk-aus1tkZ-(i19LN^ zkMW>T|J}U{sFhcUXq9@KSon#R}(W} z7+K9oJlaFhhFDwBu7U7LpnkTnTAj?Zsb)Is`=awW`Ihr>#KgV_x!TXN#sauz!Z3D0 zli>aGsmH;k%ueIvT0nRs`X@1`Ma=XuMlIu1E0Pcr?4d+6{_TPboRpfO;BEP&BozJs;McYdGb$bpgr^Ub~6X>!`cbU#iAZ8jivv@nvbe8HqzJ zr^P4=x#4wTJ8U2%t!}WeXq+^{)ucD0H(HKPEkuev#G{ zKZ-xf!K4|HTzywfaua*+YS)5?%yS@W0ZA;a>aLmcnW!t2E-}&V{W^M2t+Mg$Lzw%B zczzPifXFE%GQQU~U$RF-uxSYH)h(13n3S5Dh~KO zvM`|l?4#G7_sCD4Nv1{~o^P-W2Lo10$yT`J$ayX|D`{xlMq3jrJ!O?g~HPNY#CY!k3=`O@R;MxTc(XWK50(uFYc@K z`8XPI1!I;7n|Qc4eJ(SJ&!@Q3b-DjocpxRjz-aL6G-(7Tr!0^-xr!$ZE*d{iv`z%H zyiPp3Ki|&30BD9Ydi7?n9`QU1R0}5!K_~RMJ0t^EqrgduquAl`Z`jB5>jug8kfS@zr*<4 zMS(2J%GgdPK(h7E-++>x0HTZW`vqI5Ey2a{X9pz&piVjpiD8)YI!y(7w*y4fNqkxp zf_lxMm||6VRR;t%$7A_$IJ}bD7mtjLxo?dlGX!WwOf-Ry+@N%xsS{;hU$tNqa6|<- zI7;%`K?*~oX*)S{Txdy5b0}XO$R(MaewpsqQavDYzI;{l7((r{wU1!1C7Z#hK+zaz zG@oh*S*9UU``+72U9(vl;bq+rcM*wDnzZh6Tv4`1^o!HxAZ^3f*H_quiJd*iAmFWR zYX~Lc3b;Cf^uc*%py!fLV250pg0GuM7ou}BR2Lh2%JfC&;L3&Y4NM(4U7@Z49LhAe z`>PGRBPpL)F97%V>5kzOrY~K+y;EO#B^$8l9?+JMx2vOL@LCB8o|h$U*c520j&S+5 zN_lEsx%9^B2PIJgi~O>5_M8SMGnJhiQ2RIej%g1dqv1^NA1YU1-7J)3eT|^v4gE7T zE6~8rb3~7jDR<7Uz1^PTwG$Z=yjq5l3i9Qx$|vpEC$Rq1jEf$1F0vr<%Ktgu$gbQHTR_pmj4t11}dB8)Z`*j&*3MReSLcBp(*(qiJq0yxa=xa~fUdxAJgxj>sD zuCM&;GrKF-A1=YX?{8^T3);@wF_Vs2Fa-2}+;Pd?6e#@^a#;;uLIFB`piF!9B>ih# zdX>Z4a78WPpsQfDY`X2$QT?M-A8hi)5O3U71y!cc?`(OMuk>?c7>a8fx$VeIX#Rov zAW~Sz>>5XuTf`@qKyU6u=qw`ino){cN zKYBHp<7(P5(uwypTKTqA3P!_-lP`H@Y8K?1Wc~3%qhYi%MtrKE;v1&VxrK#8GazMlSXf`B3^=>Lce8Z3R0h&7|<|4(@` zkOC(Er@v{okj<*%c;>bb>C?^oSg30x#kpgPxrhU|7$VNA1t}xd%BB*iVi`;j7bNWt zzi~$YANd(l2Bri7g3e;)hYA7AD)^C1(t{el&7Lo6AsP=qJ*S&>zPK5ki`ZO5i%TGZ zG|GCZu*Yxtx3YN!<3R1v2+p4?TyfJ=VeI`4_gxhUC1HL-shLL5lHqlqWiDWLt)#%oXE`x% zobA+KUGm}e!bi$L7LP?FD%k-Qi;J@}F`I93jgBI2Cs^ja#+BrFK-(5%7|j8{vv+qk z2Rk`}d%yr7_?a%odph(n&ml$70*>s~sX1-&@fY|UAOSF`cJ^%o2_?F#a4zBOu_rPm zjf@$ljq!ZO;&-p;Hz?b9lWcGwTqGfWunr<2MVkB4{}qvs%S0#G`S`e*go~ zZTklCY2K~}^P5%Jby_ML*hxOG@9y60Mu~NIch>?hoop0Y`?t1{%|6PfJr-)HFbW~1 zM@B}+LIJIvL;Zpj8vR+R5Z>MAKJrf}uK!g(8XieX!c3z0^z5_TIuSvCM@0M;4OO+? zt&9ku(?Rl&6wg-6{?gD39rvm51r+}($tAVTtx1pM1jb@%zNYB+X z;I}X&VD~vS^vPm|)zV)zyeU-4Ar%2N!?ws&&eU#Rn9bVs+t0{IllVm@^6+K%d~LB9_fRuE7f?x@UfU#u?XS$Ul9p5iY|F2qrEQqd+OmLbJ*EBX(_6wq5o!?zs z+n)JYL?Pe~pU-T2?m}I9$sCgKh?Dc_!^hhC&kQezy6&}=kPE)!U0b7k0%Y#NSX7VF z&eQG042Bs165duv9u&C+UFw{^=@eKL?azz+AZIX8m4$fKkX*z15KU_z``J7FQXQZU z2#7WQn3RHVye|jqw?uhg!83l-6F^1k@+5+i&m51aqgL`%!nZt%O zv}{M{h~D1vUC4afu==J^$=DDgl5R{$CQ+{07r|3mnZQnTvN5Vo9~U2|9UC9tezMa( zc#sU-F5DJ9Y{18}0Q8?=cj#@I2ipf}3BVTF4{-T~*L%o9$JLjuU~B4o(cR2M445K= z_ucQW+0>K#u{SPRNDvt5iE{VYSe}G_DJ;uV{>}}@N_j=TkhLT22N1{w*v6-gIZ@l{ zsF3}UJoVFoTCZ2$6zS@~FQl&CW?Z=g@hgZ;xcLDHZx?btziOpvX6l9{^}>mZi;8@< zkBQa>R`iMl85!XY^2Ec@78WaFyJrrjtw+&6)SN^Cxj4@s>4q4MVqiP##*(c6HNReh zz3^qtEBH71YFScQoe$$;b3?=LFOK&m^ofwHL=aD6x;vz%!o4rzVGE#N6#!MBi?JJnIt?DvvyYoHI8!O{ zs=Au5hnGVnQE?qtSHPxv9mD_tZ-Ain;&-5Bga$8|n5@se%30UXnU*`8h)WGW`4CQM zq;#vZ{oOl&PcALxM5Tn4%Bm4}JoeXGRBesbx5sb2`<0)2v$up#H8w+yd3^%(#|P40 z2XEVYo$m13P1>yurdKB^`)SI_%WvDs>uYNRoJs}=&G1~^s_pAz#SmxA)VUt;s=`D= zL+kgt8bb2(3l&qKj~TKm%q?7&|It=NI+q_dx_NVrF7m~7sr&rU%45|u-Dd{IwURI5 z9yKCf*D`dw;%D7p|FsjC;QnI(5;U)eC^k}0oyRi49C}21dYB7s9A90Zc#Y-2wax*h z7nkhkAfL@W6@yk*{!{=d3s8v)_>L`x$<(R|d zeE2O&Sx}46D)*>5=KVZVMN!+l z1TClR znC7zBPLdEqp_-s_nK1#)YR!fW8D7=kfeD6B6GgV5!|0& zd-33@XDD$-dmRdYI#)%S2D9SlH?_n+49oFTy=ffGOnKGs@_zrG>huK&z?APImpmPR zU|(Q5D%F1VQT&OZ*N((1hs$k>uu%EdHVGZsjDiv|&m--E!~is7s@~`7`ughXvq_;)XlLp)=`lps=XjL?D+Ac zIgH#zB#4YBCZ}CKP58AC+qM1z&7A48XZ&$$-5HR)ydq3oyBt4aF=OdZb*&<|&=As~ z;pX)0wi10u7?1`L6OlwwlS9=O;J06@2!HaFaMIWldVjJzUZP!+<~AoXwZSCkFuH+n)R-k@xVXJtq`?T%14`D18H9v3 zwrZzSQeprsYh`7HF!Bz{gtcB)QGu7&as9n}3*7k7^yU{k;)3>l@C(lwXu8k&cqi5R z7~5Hty8S@2PO0xT!|9w~I*`0B42N0UT_F;3R(Zv#&U+;n-|!d3CU?pPHeSe404>o2 z%FLkW_EgA!F5myQE?-vm%ka8;Nfr+5wzm}#e}?2^+qqjpghUwWn=)9vvwkX&AsD*I z_2vttesW;M4!3w09a-_2CExnX<30CAv#i0DRb2~;iA&tk5i5Ex@4A*gBIXj%h}F9i z^DDpHO26^u*j+D|fshJhh#i_{X42pSjPz_DtFbYWB6wmm(k_X)P+yhjRGm~0L)%M4 zT;W~qVJOOC$6plaAz@cOmnYnZ3BH5qOP!I_B!f=~z-h6iMO-a0);HL7vuZIy``k7N z<3VAOwT=F$Xiy?;CeVY#2Pr0vy*>w-frv9qE$Z~MD@E+~^eL>*Nx%52b z7X-z!^p;FXG!QO+4w}Ly=S8He7jdGZqRMQ*9gtAsAyzpyeI|YQW6l^9GR`+4er1ii zpbUToR-8?hH{fw`!?Szu7t9_z5(G8qMP#XIe8IuGTXWM?Z}r%TfM{)k@@{-q%=`-% zTa+Fy#-WV<{%0xq8fPC8KJ~7+PCR$Z^^}p_kK5zohJS`5gPd{7qm~v{$&MdD{{yh0 z55g0C_V+-Ik$jdY-<(RK9mV)=8y8{1)2vh!qdd z%f8%ug_7sT<4c(7dgi<_(P2Z7Vv<4CgxISKTP0mxNtS3Zr(D*YcbjZas&@UBeIoHg zG(2Zs(;lI=QPYQ$lT-7XGzh}a_o3-xH;XJuHD(>#>JFE*#%d+w9KI)c(LcCmrRZ3B zV&CDenlfi=SJtYJ{5Rzj2^s6{r<(}PJkf6|_=VokgM)vx0BnXn;nr$=dpAzX>fJ+J zP>V{ErP4snY{q3~2#D;~URO7Syryu3-LAOrl8{<|@?*hgX&HTJNOkUdO;+f#c{_?f z`2FI2*HX=<48_#bhbuKt^<e%=J~eV}&--hsbmR`%^DNJy-RX@!>>EF3+; z2@3#5k^jVu@91rLP66d~jH)GR)YuzN5+{PVKiJTNujsr28IqWL+Npya2Zx$GaZV$n zo6O7wUeZC_)fq9rFi8#y@(b2q;NV~|*JykhvI0^Gnt6ZA5BaYQrfY;!6%9pM4nk2{ zy^is7AfVGoSq_wQF5I894^!aefj4cQbr{vdj zrXPP$Cq8Ui|213*hoF~4i>d!#ny7D@j9jIZV$#5%&l*QdC@PAKcCrLINj7C)zQj@; zjH~&IuOl1(JXexQZAtFnl&{VKHa0262+I!^8Bdts!`5koxIh$$QOUTvYQ1dWW4Ovc zDaGJv%WV8Jj(n$AFdF1_rFAxbMOKy)xSJg{>imb=o{myd<)e&{-yNIhN{U-Fo|6WO z0lL}uKXJdrdT#8Z0FR>WQ_Bpvr4t?zg}FYq-5=+GN%>Mh?AJ3e$Y7ZPMV8=UiaC4~ zQA@W}-x7cZ5^a>_Jomo6l@zwv{8xSRRT9zI5>qk&HXZtzKI^G-sKfW zP~ztxQICqw=OtshT|w}awUVxNqF#~jak_(2lZmN+b8m3dKPt?E9-H3!EuOCloslDm z{EKQnPxIma%)Pn|PvR<$3OVJ#ZP8zFNi3m4Brzgx?FDT#)U)$*=CcguV$$x-zB_sPtFq@! zlUklPNc7QVp%C(xf(%W+DL7}T^pcWtbX3uZdbZ#76`XoNkRg*IIJq?*mYjk#IEUKx zjGc%ycpM^cAyp)iptNCSs52Jjsxmd`>cgxy>rpPa{Kp>u#qW7N zqzWA;2Wi^8m9M>}bpGWMsV&-(*+f6i{Jss{8hF(&f2UPPVsR)EAeWmaKWph1X#PIJ zE^DU0;_oE$`k8rGEf<;2NV)v%eew2GCm+pBg-1b7ReVWGNWSU*r_Vp*+9Ytvg}UrJ zm_hEeFdJ(ro!Jx+#kRW`5IVxBx95?JIe6;O)?ojVqHX)CB(k3UEdDa9AbX43C1PWP z%mJvv-FlULQzp==V*jlRh%wlJzTZOb7~|2P!JVbG%cts8t`A>zm2BxSV0d0vEz%qf z@WFCe3dk^fp32Fpy2u!I{i<+)X>>iOcYt8>rKUC6Pp!_~ceP-X`?$Gr%r3M6*U-;9 zLO;?*K|3GDRfI_{TumLSPCG8cOHOCGSpcy(IEspci7f(HPS0ocJ-UfKJIlrKh+>|CfP1LA zymh}zW!p!^L-#Ijwwks4a4>OZ+%UZkrXbJ+ZoZcb9VvWf_hWNH^NDMpD^I66=MQR% z9E~51npzsKdPJ=*PPI`n1Y&zml=<(A1;;{6pFFJ}T0aH_+h9N7sh%GK20JgiInjoW zI~Hh&^W=kXI|`X-a|P}p{=|69ZlJY(v69dR6frI0B0-5hmmQNnMWY`j5rR1=e0+Sm z`|kBXx8Q4pN{9|eZy|m4bHUdsoO_DNknfqhyk+eh_@c78sWgPqIqUqpHNmseyR#yL zX}v@apT-sL<$F0+AoZUg9Yz4Yp7LSTbrP)xUuNkN(9w zM{rM2i^FRI<<@VIb=SI|9XmqcW&-{3L8#nRV&!BV;P07RZa0Gvrh(?~`ycxV)!;`$ z1>&Skj3FCCsYYE>0k9(wM3pqD2Z%S+_1HR}SH`3)G>PiWkQrr?BrAM+vu;226=0x_<{OWUlu|DYAAZ`i&<_)%U3ArC3C97?Iqy{ z0hVe%oaX26VX(q=JwxR32uYj~xnZ(yrtwC?fz=OOx#S!YYon_Tw6sgc*Rc;Ghbgft zNQ9Ka>D9{pYcM==9O7uFCCzPIsa? zMfkNI@aXx8i+=--`^DA!tr-$WBOqvEKJgtM#$6dKYR{c%lv%Q%)_X=p0bCzoEaasE zC4~)(h!h#nxSf#tDb$X)DR%DM(;s6UrZEqSfQ`VluRy=)rT9uQqQl0{JCMG>NiC50 z@uH}lH68MWaj!vlZ*Q1rf}UMtpLR&3z_(j5-P6+Vq724ft%(cdQgH7+w-ecZc;o|= zYeWcS!k*P)2PF^9X*`Q}gWXGJB2hMwI#dG&wEE%&(nN6tL{5#C8EL&$G31GHwg`O)tCdJ9m;oW+kNT}$J zltIu&4MebeRt=IWv-%8*u(phh2UCfzPV77vj=$)tk|6~bfN?<@qF!W4b;F z3+#ztek_)eIf5J`SW&D-t0XBhEss`Wd z=iR^#7h)_eZ)0P7o?IzmEf0na;qYGY5&LgtR`X0zeZ~JR)UEnDk#SAtpptR z;lJ6_!+rCzYL)I?Pd@X7E-2ZwQiyJKO}NxHup>Kkv_2svibuFj8!UohwC`(bgYBv* zi=;N8QcJ^w{0B5jxq%H5!LauCHD)-EjhH0iI)N%YX4P)de?k|!xG7B_h*YaeUJee9 zxYqiC={4KNvEHy^*%jwJ5=rcfVnDM| zv-+tqDv}}M-TViT7~UY>2i6XNr+?n?|NDRcfB((W!f*Na0x}{fWQsZ+EPL%XaXZdG z6?OT8@GmqtU;Pq7P!w-`I&@Jzt4Bmh*?7{1D_ddCiF?)toko z4ex@w^#2v1nP&X6_^s?CZ@M?C(|ZV#e@BC)dsjLBe)OWF)VF^SiTvrAyHoL~-g1ls z*4=FR1XbTM=auBXXsN;*D?_=SO8^j+PxFgx#qr#je|sHkzqi69m2v(?TYBPq+jCsr zN*WAV86*BsC_ZrFy8`Sx@93yjn5x`AYC?z*1jr`eCanT80mu2sbiXW%Gh9C+B4+?( z|4Wr1l7R|>H~s@m>87B7Wq7qaQ|@+Ak;lFJS=CUT+v|k&qS0xIzEZD0Icx8;S?55i z)~0Hn29R=a$w!3eR7sa)Q%?cPLD*k3$_)PiWtF=Usvl;GhJUjtse*Kh{*3%@2pDtC z9b9@wi}?t30UBC7vM2Za&x_?xCP-W%osYCL>!*~4{b*#3_T#eeHwxp+X zuB0-N>?E4oY7LH!3K^0TD|GqvtN|`dANOO&v}iaaif(OTE{D4`A!X>j7dlcMA()u# zN8nx_UJw?R@kfNApfn(>)@w2pOGrsc0sgt&8VKATKH2t8;zN+<TKuag4?TPOnYe zQW07YiCxpB4#kR}KvrWp{}>)yUC}V9&kmeF@84j4l%oR}*}`(pLUgX=pkXr#LvVi`3D3HZUYR?oRTJl8S# zaVynNG=|HlT&dH;$&DHsG7i({F2-AQFIDQq`BmdY57@sZFn(8+TRtjY?>rBO6j1*A z<1B3;K925R;urw%*8*7{^$UQ`H2)&Y$w)u+2f+m;;3A4u^zhzkw>jn>6xKA*cvWc# zu&}f3s61yHACqR5V0F*!u9_9Oul3y9G^yQw54C$k{Hh(HGsofQLwXQb}_ z`8L=y!<#nadPkP^!DwqFv9Kw(92{;i0==F)>^MU(v&ktMbwl}VHv48s1%|b^=7J3n< zFJ<6H0-VgpMh9v|D;pj$yE!96LlH9>04193`b7I`)5_dp7jlNWtu8EU?eW^(N`<6h zEUTL02V2H7!=1hm4#Wq|GlD|puZwFFyqCY$d8TsTl1&haPYL!*9{6VDEE9&fq!x%v z`r-6ZkJssP94+Jg3p?@Ya};R?M0SIo|M;%eC$O@C>=bEPSq|f0ZlNy#6(k4hu;9^& zNSA14dY&oOW>ocsUa^Df) zcC}J-$zKu{IEsJJ2#iyIwGTIo3JX9V0MW*?auxtV5o@uBK@X@o<020ii|cm`zAgvN zK5hgID@dv2^n;b`8^f^?0oHk65VR|1Ot;wz-yXNBh*b6lvle{P0C8r!?az6XWQ{(P z=#j`c6#u@ZZHb7FnLw{8y;d7{%*a4{6mI$zuDDy#sIU zYuAjKLqc%eO0j;A8+CnIH@SM}UQ8k0{L!(3SW%q#ma=8xt0`Ah@cWdBsCIGIf9V3` zwL1}Za!w>GhX3%Oy?hGwF|1O&CF_v>=G~IT@9Qf=yW`E%OyI~Whm}mO zIwAHQLg)#z&U2;vo1iN?;gj#S`&oLBRfBn|cCjMHp*hSAJp}yuR(4g;^*R=qi1XBx zNIaMb*Dr~tzJ9&UalP9kkeubVoj-a*CbDr+w(mrjon6vg<_vm=If+`m%E_LaTe@yK z{UCQ75zrkJd~`6n+rYoOFDqI18WIdux~@8b_=$mB>Fp^u16D>vN_1<^oU)J^1qhLInIoT#8|dSRr&p@HZ8uS*~;QwMtjb@{52=pSEuLi5u^yt>S>p~QN2hT`HT=H`JC3$%T;AN_`` zI5A2vu(yeSu<4YH8`n5KegI3)IrmPAF;=;Mk65lGo3~&zyGs8kzBj0UpBH}g{^Q4t zA77pK!Di!?v7Hy|zMsWyp%nPtbC4ddb*SGXp45$kf>POS&F*}6m?NH}d6S;S5d@e{RlB+BJ9J2J1;n<`Umc#* zxnqHw+WVC_i(n2|VkDkpSWp-4zxqrMm-Fpm<5wLpjZ3be6-vI@3M=VhVK(wOKF*0> zAVCKuhOqE0DtuF)(atv71+vleQ+9)wY86L|n1jO>cA&I=*7`&8L~SR?+o85^YHHfG zs@TYl?^L3C{sB#X>BE?3v=C2~S1q(5Ib+XFq#R$o0Ot;ncvs#L_>Ml1B5;j~2Rg52 zVqw9nc<0Vp`D5P$t zMbD31>P$(ByKjUX-nu{bY#z9odbQCyYqJ@3wL;@bWa|KcR%?S^efHB&Ys>da^QMD& zI|{uST*ts9OGQQOj2-35c?IAboAWJgJo|m+gEIo>??F-fhn-~IL~nXFbd{bCb2Brn zVu~QgZmx-zIlr^krM9&lH5KpBWwD@3agsu;2)Z~Sf-U#Fj!qZ4Rt*Pr5TQ*=LVN2*=3q(>t$iML9Bh{wQwD0WVG?d?GHDb zc!NL?7T}wp2Gi71+K2J4>!;tOzZAQ^k~czm|H~&;B>9QQ!K0?qm>a%zv#%F;BDMCd zfZz4qI`Te>P2q~riqUOLr?QDn04AK{8HzKStBkN#piG zf0J90R&PmgA{}{_h~L^);>rpUAyvru68hth3iM$S+ZG`BH)O+hFIdkmHQ;z}m3dL{ zil(SGkBkDW=+Q;+K9&-TxVTYq@wbZ_K})L7E}dt}mLF;)koy99tycvEI#lcel&h8NRy`9lh48b39SF70j)__Oh`x zv8;1!e%>oYX_|8S_1ZA-r9x(&J;|)96`5c5(q<%V(Crb6Zx#YQl(|DhqwSEhAsapF ze%J0x=f;Ldpfi8__LUCHvQZa;q-6jB-Hv5F_ISE6>6eP=YdCj;&KcGY04c-1*fdi-fBa;#G$$XB%&uOaQPG(zR zi{uM|umaH8lnMA0&(Cj}SF&d4tdsdIsFQlT7(0qi-){8!CCI0FsO0oGFzn}(mxJb% zFwmqr{A_7w6Z&!O0Qx=dZpu})b+zg3^1P)tqw8wq8x!0~IOGLC<-=#`Eo}O7q(cNo zh|wGeZcsL#f_;(@0pbX4NH{ZG@0zz4r)>;nG2izNYVF)nR9%pmtU?Vg?PEyyW#6&* z270_o0tLi#B~^9}Ge+>QYwaXy4sX0M^xi9f*lY&^a-kuslSXQh6I+!RFHXC5=Ds-i ztgfSY-{_Af?ca%I8nNC~q+d!bCjr^UqgFP7v2Ux1@8M%8Ev~F=+u8G(@{kRti43y% z@8y$L5j_Qg#&()Vo{ifIKuiH@2ek@d&rdoEc>-YmqWF}fGX$v03kII7f-kC>f(={S z^VRb3LQR6WU_O_ACTZdYqkN-gEEai-!ENtxGW`@u*gr?fggX4H^jyholchLfTRfY~ z8BOQ9FkqC*XuYDdE{0ZC&C8~4druW>29{N96`Sv6ygjPb7n!m~JkNhSvg;oDIz$xT za*to=3sMIwq!pb{No`JH;qxjl=rVjVfk`^9lQ zHOcUQALx6TB-|>J-!WW@fLAVX2#$kl#^B%Wc*dQ z2tV|ZdsgP?*otw(Bj0%3-iK5tnpRn@tjAp5noXzypMGFdQ`c5kJLr1U29J!C z_DXj~n<*MD^7WqJ2*~|?qI{GlxjN{hRwcj`f7W|8O z$I|ec9RD+liae!tE1c$feLYkAwN_qR z`w;9J9ySExw;2OMW?pf?kV(o_{rA)7;w^Nd->`QJKK$w#lD?cAAsm~fK+`XxrhvL^ zf&GU!;@l1cD1+*ohTa`@FiMkzt#2#7nrx_anEMGTheNHdV&>oXGC@doLDA?zJN+Ez z+ccpBFO$vcxv+wlF0OKJYlYwEGoG#nf{u7xoF>4A_V1MI6}2clW!}j&r zZVJk%sY#k%1a&(<^nNyCGmZeVBr>rp<~l;~l1QMa!Nv7UUCT)3a6Oh^pzCT5MiX!@ zqN7}+s*s(1ik&nvelVX9|s%CO(9ajnC5uGI;6&;myv~X3d zrF)zR${}AGxhTGRwd|7t;3OMo93`E#&sQs4>3-orAVHyGwC*n#RC`Icnc& zrJH9W(EKn><9563m~C+Nc@S4W9?$&4K5KxkL@=hu`4R2%172RTIJtH+%pTFegzrb8 zX`-(~-RWE>68BTf8#&daoQ2m24YB^0;9U6D86Gnb4ZE++ysx(bGK+xqLSBKN8+`Ml z*eq6?z?S1$CU>e$eZ6^ww$mKNzPg?tRaJB3Fu3p4zAfsVaVA0~I1AVbAm{Z@oRxa4L3Vjk9^zQzn_kR0W?VEw5-aP58Ke zPvw3tZ*zvq!7AxZcgE|Zi&-Q=H;Amy&<(>Nf%NJMepeWSXZhDMyw+@Qu$ zl|H89C^QTGf@QM&WfXu+=*rIjo&&s4iA*?nf{0bv(XXmPa`!B86nRrJn_qwm5-By| z$vTSGJvDXB`zhzu=e`?yNg3ZhePyn5h5CHmTW=>!+MAJX_V8b!+2(*pG+#woXne7} zvDZKLx8)5Db$_})P@MqCE&wR~zfgdJK5^A`sSoU%Z(fH#|dbm;B7dmkhN~w zbHeWe^=U#vLJa01CUTt(20He_>8qefX9s9;nR=n7F=vBJ7x+B4Gd-3su6pu?K_SGw+ue~7kP`Dj$ zRTga8M|e4IqGv<}Y(sQGqq!WFM;N8>qWyS#!p9$O>;*)hxfl0CMf|`r zuDu%6ObE079sTofYm9EeeqR>Yb4d`yff?Z~noXt1t9ox7I`58+qn9y3&)h)N2Qu`6 zu+amn7%HkNj&>J24CXYjBLPG(D@0D7^e~pau6Fh~`2k1Vcd6hf zI;dXViH%?Kiqx4K^hq6Etz2z13W~IuD32%Jnss}eRsTK)3zR1mN1jut<-I_HDg9}* zO9Hm&xHF&)EHS-@*|*yh#7!T1R29j`4)~A`f{5b-M4WL5di79*3QgC1=KKFnNj?bA z`8Dq!Rh`1#eRW;8!yxT2*QvkbP6`g)C(%-i+5A!RKY}>2uw+2pApuboFyVg*q)C5x z0sk%#fIVS5XazWC0@4a7n(3mJ1bvFTmN#uJ!U%fJj38D3rJvJ=N&EjJhH>!Pq2{^9 z_{f_T0%Olh-==;kUr>Oj5$fN?N=Hj@<46$XXw5)#@h*;M zASLWP(A@wZR0hc+5X6wZ_KTAUiy}#n9uU2k6PFJ7F=|m?4?_E`Nh_p{0wk@LAG+$k z-euQQn3ihy zc!TyX8~#Y(=d>o81!=4mY}N9Sk|uMpl?i)7FNh-p5!e4#2tKGoIgg9gl97JzS~*Jq z^3EHbJTC`W!yA|TS^=;mRjDMltA5@ni(koME-|Qn>+d>_UIkcFSP-gm=7zfONh8M+ zQJD%F0RiLT^NnUIgg*e$ouio|2llo#638_t`OK_E3TB@M%01)}|AYnv!Tq$j%mJ`D zw73{?H1X5QjSbg?(4M+rG`Cb2W1-FL>cYKGPdxN-!9ZTI;L2;UDl8a3cX!JSZ%eTs z+5Cdf!SKXsE9vihX0;9uQ^g1kB_;|QifFW}SbCLyK%320G{EV;Tou1nQf;VdD@1A$ zzi(xS=5mi;bprS}933BUBm;8?d@E~a-*4~9vBt>GJrgXU+d?RX z`D286y^SkeV#Y!r8rC-|xM$!HeGgYQIcUQuZzT{(RX=DhsDTE9VprYB_$D@?%dgyRYD0+8!*% z)x~B03pyaFt@tN3Yzh*oS7%LP z0{gm)vB~;4_i^gkfBcJ@gcK9db~N=S_J0HU%_{)aP`EIjqd(Mo4v@!?kWxSo@^|BL zh)DML55Uj-|DCP;f1txc0X)?BAJIZs;`zzF z2V(MJoZor02~vrguJ9~M*H!-4ORoPQT4(wL0DOghbrc!_D1ha1Fl}d7;nh+x>J$8l zL>ws_08KYJ>+9<)+u98Qqp;R&85QMk5Y(C!A zIe#p_(y{>g#9*fJv+8wc&0Ws?KJ+_}JftT-{q_GM@A5ky6huP@dk$ z@-O-mM3=hk$7VEuHP=(mPuHWe1ieRaRcPqM`U z9u3p{8amy&>SaJS_Qyt5;l!A6l=6m?czOQDv{QsZCaGyMwe#*kcz3V~*y*Hw%5noR zlP*p?Pp4{y$f774m#-!u@)fpI&}WVB=MH%Ty)A8R)lt^A;`Y5M<9?1~xt-erLZ@}@ zu7P;44#xQXqg1Dz(4^0dUK#)w8PM8nt~=uDO(ZeF{`WSwOH#3xJvfb!w!i0CPcaSx~Gt zK??lK472?P5~i-_t-Gvi?(;1AzOu%{b#Ypo(iKP!Elaz|0`0UjEL41&DF(3urS5kaNMAE34ok2{)d$8+zXGRViuqE}FRTQ}_4Wz}E&`9h&KGf_0`)ngmJJ&KqsKazc+ zUj3dJM#Qt!;)Z}REVzZWsu0Nb_rKS)0?Naiy-(1r$8dJDm@NP2jEdS$(@#DXIr1`Y z0CC2({`*>Xt6Xbp=kGBUywAPem%Oa*IejE3QSKG zL$)v#1_I1tXrbDY+8p5Z$+2C5*e=35r? zYtdJtq6sBm!r+sd8)r)}%7?71U};?{KR}wl5W`V~eW1d@R8++LLGg>`RgG}m0F%?& z?&!zl^o5i^ZoZizk08%;^$F!QCg{1rbCI_ z(XmN&pA{E(vHml@{eDM#p`j*pqbr#A?hk3E{vDy9I4R`IE6HX1>v={?{Z#|rY0c2K z0$#l8y(3{e?a)wO_EaWt@yY(Z`K8Ws#`46|>G4*&;bLI3$3uJdBtcm&>9f$B+nyG3+l}}iBZ#{FTN3s2 zo2A-{+oKBYAZ%ky5*#*uk*FT6Q+g))U*8%xss90cVnUpUt z!hr*FY*@meBCG(IIDG};{h+I8AS6nFMD)+A>AY+o2qhVr=o-l^$X^)0W+dIWfq%L< zz;`}2Ir($Sri8`v9aN`u2_m_X!Un2E{CzA&2EB-eAQactrrl7Uj zMr(CFMK2xeOH)ZSr|xc!^lyT}2A^#k#eYS%6@U{}XRs|sidO)!F<%BY6@+-}C9{be zP}q-#?28sL@CIG8=bGcLMB3d>mL>VG23ToYE-y}6FK>Xd3=gf9ZT`aa)kGl1gUQ&q z&d2Al2|y;j*Sv3|34KQ<#0hy%(#}18OwwvM%+IaI1oKY6;{#E$kTS(3(}!|O z4e7v&dX|)~lt_j}MoNZ6TdmT>nggd_4kh3sIS6-o^GTO6cW!+dz>ZY^=2Cy z9P4zY#jQI8zR`BYV~~>kVa}XJzglS%cL&6x!L_3R%zywCFPbK4i!0JwQN|LN_>)Wg zxBV_qgnZ5GDN+87?wTU`;ap`l+cEg&c!~emu+K(E0XSZS_Pj)$Y#?G{qXIP<$! z(bC!Slx%34oAnS9U=%}ZC)uR0ez3kNC@YgW)vwu}3MO<{u|p>0n;xR6{a;wXu%0W? z(z9ZqX$MibPf_covR5Z8wNf<_U3E_+`tvvBuPoW3V%Ic@00Tz220{0m<0T<^gYAsv zbdmIF({8&QKKF`!*V~WWN9alfUf-0e9;$#2!2B`TVL%Xm6)7a>VBr{Gi>tU(GAv&@i^=&{FRIfMqEO(iCSrk0|f0o3`~e4R22i-mjgiLq0O)8 ze^svgMF6O@&=%tH|M5#$r7+X!r?X|+t;QCAKpq*>HfO1COpIdICn4 z^;)`Qt6A>L?YFP_aB*?DuUehBT#j;}oy`#>238~)!+3t5M%Z0ASijLWo}T(WB`vMA zoZM`6pfTaBG#9~?&;0%FA~JDo_X9j;@tK53jqQ_Is6=__MUD* z+`yn(9=7ih8M7pWiiYZWZ>wiTZtsAwUW1e__7npHqq3cEsAMaKMP$yFLIeXl3iH!( zWOTUADowGdn3PO}axZ>KH3LG|@l8St)ooJJkcnwNEC26Tivca+GQ;USQJ{qcvst#dVNQR!5 zFvh)V@JjMgxg@=hdu0Z|5Tc^0;lov5Ej9NF>{%dsaQY&UsW#h8MTK>q8x3)(Fv|qe zGD!*h2J2$21{NtP9{v}aHKS%1WnjMOpz{T%`!{z#kgaT*Wc^bjZHM)BG){uW4V6EdFRG%y{*etixbw>@szX>;sWK;O%g8KPAm8Ao5Nh6zTx4B?R?Te^DiWm zC6;b2Y^k!_My}Z3hkABSs1o3jed{EFH7veXxaGF)UFlzoJp#sF|Yjz`hJ!-Lz^h>?6`RiG57-)wcxb#uqcC8RgjC|bImSOsl)9GSoz5K|04 zUseX?s=)bsSXn{7A8ji$eM6}>cV^x<5V^K5Ob*#@~*%HVsF zL&XiYE_Fh0)O3%dLLExJ$^gS5a>n%t)e9@LhfLWwsd!CgouU)k{nmkl@q_ICAFh(G zk;zR|%u4B$>*K#yPR?+#PF?T^?N*}sPdOTtacAoAtI+qzMCnBrU$vAT{6sdC=htPm znbG&bc3X9aGcSVPH=;hS41NrWi7mveQF;DvVAAS9g?!#xr+QBh*E35tOLf@p1EL!p zJe~^|(U^3Q%gjbHveZ(xZLCi+Ph+*{FZM=-ZWBL%x@5jQeD}*vqqBXD{m)p>+{a;S z`g9}PAI3V);$C98T@K9gZzNK$Z@4el^mD91Dk>^EDk|Gk!!Ih}*V$>1VNook)5U9! z?A~Cz#5be{dGRh<-@x z!MU$2Hv0|LOS@9+^HTz|yWwC5H5HXm>o(-D;{4u)cQ~S^W)MsN>S&Q{soHylxmd4V zr=1&!?IYx0jm7^$`0n;xBQjAGJm zo2xqQLOLp+KDahJET3%vtMM)xkh?Tut6_`d*xdD<5pCo3MPWu{H)o6t3_%2>n@?*>xx}h!OaEW{Nk6 z>%ucX{)Z$^9||PSV31s#d$aTq~SDq z!)-S8XPN(N?ARcV5LUg!pZyG~?`~iN1E-!JG8WmLd8(H_&YJ80`T-w=oEUwzRBuI1 z)Gv!}6;z{!Lu^-q1LLju@#DwFHHbL%Xv~J2p`l?g(t~=`bPxP<5B|+_-9;utrEc#% z-+<`P^7Sg8cF6KJ&x^-te!6YzXh(r_!Zu%?m@aYVdOW72@4F!^;){o3n^hnpej`%E zy~*t1X8!NbL?8mXQWM=bbKx?PzIEMvVKR)!u-TRM9bz1Xh^vR|u_NzA$m(e-w>mja zoCk$n%4WQd0sxeT5JMHO>rP+Lz%2+Q2P7*fzu1Qa;8xbY15V?nwgO|!#ubO;F$q1f z2#*+xm+|KpJ#PFFhyxz(RB# z1ncu`zJ7owxqc}A1zb5^S%g0J-F?zNikvoS^P=)>-C%-n*o`fs6VUuL&rnn*a=!Qyf3h;x)HrjLkj>I)vxb`fPn6D&_&% z_T@F@z0%wg0E|-oNkr__C4Q>pU?!%yEg9^}L1C-mg>TdxNB8~&q%Va|W)Gwv+Gc~S zB`O?VynPWJC`y0unWoI0)TW4bm958Qy8zp~Jbo@enRK_tjB9ggW=&H$DgQ^s$$9bm zIOQ0y_si5p&u*DnEYKmr^9=hlT*Jj)rL+(op}ii-B!E^}LSB5s-J zl)NvUty(UTjhP$#aFgj~RS1DDk9Q>G5s=E3i&9m|hoptMaQ&?1+F+l(T09E|rV`|r z#WzWI6dkM_a-0QbRoOioM5lDSH2k*I;vd*lyCE}^x;XZTNWQU8Pb#aQLm9mE&^&vwRZm;dryA`Z+l$GX@w!0$ooxMj_)dJdx(~Ab1qO!YEg*b;f83JCI&V=LR zx(JB1wq`E8X9%grzubhxI}5)X`2`C|a_w~{dN$4~<2lW(+4R9D1#4!ha(nn9;lad8=$ z+|oRXPXpv)7RB{TB@<_wDAQUd!kwR9GWn_lxACd?^iG2?4w14{3J% zVY=F$C`;VP#wPPC?Li5pF}^eG*ug(DW(A>d2FK{{=C(mc)L-Y#xTg1`Xs<`~Mo=T@ zMm{uj|BU9+ZSh$s(G$_`-lPzvoJAa~KfzGhEn10T)DQg?hq zetbeLjp!^{|KKVb{QO{Xf7llPnEbPzCBQ@$$$zUT56!k+)9!uQ`gp|SV;FgM-R_s! zPZ;1x&Ld^TtLHoFikQd}_O*l~;WeYc3q%-!p8!ArQ&c-HE%#{~i|6VHo++pL@IO(rkl^o;h8Fn8Cy?)zo{F=4Vite~M_$KYbh7z~ckFxSY+VS8ctEBXcm90TO zQ^8007C65uy(sNKr5L2w-z^WOwkp~LqYCG$%sFb3%fEwX<`URRIGW6&nY1;-W^;uf zy1ToP`5q46X;kz$~pv#|e1 zc|ASw5PhGnLM>k@H+dgWFB?sM+Cxw&t{%?fx-)P_-y7WDAJVdo)@Jr%a4nPC*?BjS zcm0(?*4P*VoRhS;r@c>L|aeP_)-AAw8%lG98 z89p5DI#X&AxZX3TpSnYk-AE+VRr?oqc22x@ny|=ne;>*>9)gTx9($69CMT81;>Oi+ znlZm*SdHm5ctIjw((SwMUn~>2pqJ*o_h;^%FgtZ$tTQ?)p*16oK-%Fo`D_g-hyn-~f^d4Cr7E2Axxg%nBbs-% z%__O1?83~Ihl^`2W|rGOU-5fLi*DjFKln{jr@g9M=H@B>Ha7q3a5%N<%|eiq4hF}`iP zJ`XFrJv$@(oVOXccFmf-Nf)Uv`~=w4 z8U7WA2XrOU#Tb36ec}82cV+8UYoemuS8MW|g^%l3EgIpSi|W>iwTlfl52)D~;PZ;} zVzXq4Bm)&Ssdp8|YTuYZY-j%FTP*-+Sl1M^IV4w{^1?IAfI&EIUZ0bG*I|`yk^qvq=xbzPLqLrWSKUfFr`Ec6Os-VsH@GgX=$m= zhQB4j!Q>bKSb?8dCj&xo7pkcd_6{%P?B@-yN8}qT1Ys@UXz@81Zh4$^} zIJ>|KsoaHq|`-(K_XDAaCT8w`Go!;--JvTH9Sa;^y}BCV5HJ%ll?#NBEAY4HrR0Mc%b42Oh^A&&{f@ zW0#jRXA>}8s%}}zqxFu{%uLSW`>CuoHg*GH}yM6gP z^lR17$exZCT@GDZ4SnIghq-2Y0%o!&<0om3p0BpIyNyluJ&QReCk>Q0e>f`dsa$ROptA ziWQi2j<65GgJsJTxp}l3rM?(?U4*v5h%~CWs3s4+hgnzP=zMHM8b8DMl>C*vw^V|{ zN!2u;P5Do*L(9qrJKgFbSHfB|t+rdeRVFqrZeCi+f#q$(@?+Goc96L+V0*@5$oZ<# zYobk+r!T78O@2~U`8`)2J~F5zAZ+rC>$s--=M|oh3AjQcaw`K42IUEDb8ApHvE*a? zP_o>Il_03$NS*NvL_}t78qNfyCTGX}f`KXW1#YwP&;Ns^r!h2n?FWq8?2&m;)^zU6 zn++ws*AdKffIb2M3a9yJ0lDa1FWMOZz)SGucK!#9J5j8rv%wNe;AbPypZRwl$phM5 zRt8>Pe)j}v>F4cERre-m|JOLh{z66*yHTp8yn(Aq+6#AMyawdSBvwx^}?^TZ@xG|I=^+=fk%!d zW4rNNdtEdsD&!+X-;?29oSg(m6b#)_f8uyu1QlW-KFNxrqQMo_`DT;myn*Fff!e&^PvK4J7bc@c2&}1ww_703|UPjuPa-W3_ z+rryGBTUeY2v)FbHw#Mp34whg(N{3$VIE0g7|pff&GH%8n^88&=U&xbPh}WQ#oK;o zSi6hc#62TB_m;N|Z+D5cw_cqCa#Lba>y=n-dHtN+|G>x9LqYfP4B)c5+?FF{FUHq6 zUJtX3!3t;eJ&6U9Xm~F0-)qV%R^MZWeneV$Ucr8lXL`)Dfk-|*z($w;Qmc)^pSEF7 z%QUUm|J{8QJpP`)sf9#DJ}Bp*>XNaYKKaRRSWP|JwLf)_FklS6{IU)yE~(_*l|$=I z18N!eK^R~-;6!7l7Q5f~05}T(cCZBA!-6ZM?my`Q6Sc9?5vB(xu6$T>wLJQ z*Erf{8d+=9SID3)`Wk;Mi8jtQ#VzI)4heQ1dVoSlj~D%NQ5mdI>|=SmFup;C7L@^zt2(~kBKr?dxnjcD>){{qtCva^)`PXGmk zi3~$%zB!^@N>u+uh_%$J8HXTiWS9}TFZ}&}H-G6kR&Zx^@?x;$0C3tE_=MSt1K`;N z6abyfW}3dWUO5;TP?VH3)fKiZ35&K9J1R?Bx_@{hm`_0oGgIkO&|3a<#Qe=J$V?s$PbEvbqnH-==hZo5xKh(Se(z-&iEzLNSUL~lgcBDh#zUP zvQJ`RhMrF*X{~%1wkcH~`trGJjov#gfrL>sp-0Mm|G0F!vALGk4i&|s^8W!AzBCPe z&)8o#F1=xX)%K}9}AQC^kRGtnrDO+?Tu=&i@V}6E4<5 zCpK0nr+$6XK2yfJH#2oxpYF?O+eZFJpRc%nXz0iU*7fFd&x`Su#iLUR`MTitYp|i+ z=PfViFp!J1@EFTSHhhx#iK~x$lOHA7oui8(yUfg@K6-P}E>gWjYsc8Z`TTK+QOZNnz!{7y#KFmyRtkLW2F0mU=65jwGSo z=zKKFzPx%jC&gZ)?%}gwI?Vzv6uo+F36K0NicgH~n4Ea3KQHud#?foReavR3L4J!% zR*^Ggs!DBSTrz+cG(O}du~u(e%(hMOphaXrP+q1}zGgmZ-}HR*WY)4C|0esMeXSTa zoF{jU@vZLU=A|QNX^WkcghpPA3OSZqA$pZR3FQQhO6+RZMOm|@itKeTYb^lK0w)5{ z4rC?~C0R(<`=1B%8jttI%vU*)cH(|H@i8RPl+UcDA^);skK&%anv~eM;H$*m*O%>{nCVF5h=XR_f4zI6Qm&oKo$O_BGs6!`b25A89Iz;t zJ3t2qxU-D#WrDo5KXRy;Uubc*>kVGX$0Hn?(mikZN86uR{F)Oux1Dv4@(m)k=*MTD z5h1nmQTTWcB;#(q{gHc_*1TH&?(hE^!qvh4J zX9bPzu|Y7&4G2bd*{ZpSW4*ewyaRIJ1@i5#pR69k1&KR5aC#0T?+r4Y{qufxBIwY4 zR+=ITz(ExO4oslA*x!7qRSzo6k(jX(iwm_16OL|u&Z;-;frZe-)h1w~)?NM;-J?h+=ZGc|cv_408 zgzZwU&y-}n9e_CPB~*K?>6sEq?nc$q84q9`H0sVo>D0mr$D#7BbaA0SDRd}uh)*?! zst&pd&Z0EJeZ4yHf@51_boz8!F;r%f5E!-F3h2) zKaHpw?><CsTzNiS5+;^aK-RN-#~S=FlQ)8c$jjaxrVDHv1}@@{uG$M-)_=)+ zt22i$-AxL)+M=284o2K=X~UUo znIO;9G_)%tb(1kd5sTy94LmDTa_)0klbBYCR&!Y)sbDSDrz7Lx?6%3XRp0Kp1|8(r=t(t`^-XI+D!I`BZ*r17bn3n)aS}LpAmaUmTf-!e*4-q);KW=5jXJ7Zr zOKnCFnQ@jO33mVIg%!w@4461>w45*l)JQ~c@%evR;JuT52(>69xy*~Z0LHWhE@(|QQhPic)^-mbtqy@TGmjTzuLe3vUw~>w)r#;H` zGCIi@i>4;Zz_eaSXq&RgAl1?lpZLh-%=(j?Uvtkf6`tQ~#A`lVb&Of!dxV8qev6fL zcKG~m0u?9Je{*uX`#Z)*lZwHJX;U~37TZSd$KD=K-N)HiF!pz;FF`U=DlkzoHIC}} zy$;tk)-=#%fcdlWKbr&Q|IVlEfQ125h~{2_vR*A+E2 z7i=0=&Vh=JV|!l4wkyMMOxmka zpbmz^T*O+lOQ|&|KVKsla#cHK+jf03PM)*Y;}hTq$#7lV9(a)gyuy9cm2sDkS5sr# z$9le7vYZB`=d_K>%Z+0e>~eR)l9G~t8kNuDf1s{V zTK&HH_dU7y_4@s`;Gk$-0HlkF2Quv$SBAY>_eNl=J7f6S>qYtaK zWB&^akU9#kQ9^jxI<%o?tls^qT*x!i>h6@;1l0M`Ue(P#fm|Qn-tT6=U#^6{T;#PC z;D|DLf?WGPERhb-19Kqc9v^}|rSEgnghiVFd$-a}dY(w$`|?^n&UWtxjkq7EM4#a} zIG|7SB%?+5X#S%vHkn?(dU92uGgevdxLo<;M^@v9Al$DBCo6|ec%fSF5O{>M>U}ev zPEe?MIWHrauZjoV+_^bTDXlvPST+94FW~l*rjTxB@W6ecyV~zraPIm|g$xl%<%H zm6p@RdTIX>fMzt<03~psa6(^pp}()ZaKMqEzc0ctdy)MLlzO)&C+d&z&~<${cc_J+ zyO!$)3~;QytoZ32#WM!p-@OY&PHOCG>VS>1+ED;91!VdalwRcn*(X2jtpI%38-(41 z^kvtqbx>v!`xKO!lq=1@&9eIcz)Gs6g+2`rP>lt=W6xhkmov%8$ZkwHRE`06CYJWy zxb*juMGVZeeDc8tf?)XygN4jwx82Of)7AQ=UGHPSts08R8L5~YmGEijRy~5R-0k$? zq{a8~&MJxzvIlJFxkM7}2J7ldp!m((*u8wa?5R)x-l+J`Cwv%D;*EjsfjG+Rd82`W z*KGL9X;+R2sm67MtIe;7x8pOP*ZhcY#@z_}n$+*{i@iLzw*eYIjdrwa)yh~-1p&s#4Ztb`iX7lGZVGY!P?qCd=nyly4@>lrMcDyCU(T_K z7i2(@qewwPCo31B9;>iZ0+e)t0UWAW#SVA?S??Qm@yNe!=I{-?pP>>0a0_VrGWh?F zbkk>J_(S62bI_8_cLbBqL9cP>gS$4Ii&8${p8%)@jKCX!-XtQUTHkj}G$#=M1vP6) z;R2p;%elKp3E>0K9g=9@#MiNklFdK9O8Ojwll7q*i#QI@!M7@^o;>wah@h_A(%W>Q zr*;DkC#R6_X~g&7Wd7IF4#4-;`vI^FDUq|GGSjwSg1&bl0P|}M3c1*8d{Eah{vH(z z?~V=zV46X1UOYjs^>=twjV)@;sB7Jmh}=zQ-}!p&O1z%G0H4AHV+*6MD=d_yAeU<0>Q4A-G(kKRe_9qrV#zlanSa}c} zXXx(s>x%Gu6Y_Zwlg3#zb9;A}&>k83zvI8d;ZPWJ-(S1m_rg~;SGF(}ikfZ_KF+bO z&HuKTdThEBYTWnmn#&aqF6lMD*rqhMLf1!N9ymL?jGw*= z`yviHOH7{M*W@%RdvE@jFGTU5mu!w*_|@ak=MsC2&8&ybyi=0)bh&oA)}b#Z)>|mc ziOX(nZTu=&$HLXMVKwWq+c?{dT;{iA`|au4+QGk)VMKu18$9r_kMrHN)1ccz`^jKR z_$WM=AdN^f<0bEHYqTX9N$AIesC2_<{#iw}iY(tA@0o(pVdvm6;K(e3H+)2%X^-5x zn##Bj?0plhj)igRTXM-5)$;uL;m~zUUtYb1>UDPLbvu<1=}OFBFQ7^ukO9bgFB8rF z>Tpi}rr*^^PcH|1Ia7G!otS;6l1@rvslk7H2nc;RwCeg_{>%4THRoMl2|<- z7xrEI?XXpIWRi=FcGRh?JoW4~mx;ZPU9*x?0gVL^4;TWcU5~Z`K9!+?g~!8Lo7w02 z`T5-4%&B6dU@m-efbhVNm%&;k{NPGRtD~c)rdMMYy$U2dyBq#-Pz9(5Na&%oq;pmL zDlX)lfnGLu6B@14PFwS7dEQNv%ueNI^PCTaeB3L?mqMO2#PkU|fD$#TzIu_dys~_m z9yNMc873*m)JS$3^VAG3=FOPY_!Zyxtoy|OGxLI~P5*}HUZ_5-$lw1pz_75cw5$}! zy$v8?Bsz~;vYXpF%aG;F_N{hao>4yp6}COrta5A(3o@@|xKB!w54eKl`XcZ>^_Ak> z7nm-RpPFUI;ynl9UF_{|G|eRGa&CvR%(A`ZL{-GZg1Xsn?kUsqak*wc20wMOa?b2e zfwYlv7gYfp^-En(Hr*4z6|0F&Ncg@_hE)hE7`z$N_Q`zt+j($c`7ruF6uTcv3MWs~wOBQu^2@fb(>JwZ62dVIeqA>HBt{CozlrYxcE)=fu+X{b@SiOrAE7udvdCTymaY8tzl1%$f4!kWy;-`&J|v9NTf^ z^YowzA9V-MJj)4C2ZLPyiA=o6XNPl#I3@{#i3%I5Os0O}1q<5m2E`?1aT1+wW-j%0 z3EM*QRGhy33mz|Q_eILZ)Z)?8wJO^wH|ml&N~*evX=%h8Av_6K?Et;7-p&DWK>Uh| z;KlpC9y1jif3Z;&5s0C(Pr0LEveb_z@rtAIN;~GP?NDYL)D0pG& zaDo+{*|hbS+s-afcsOqMQ%i#C^%j$@#W7o_o1Frf$j@-sG^{&MJMz)9Z>DTjs zC?3)t4G7rLn<9A#C`GBNrdGJ*)dKP4tZ5SvM!LJ7Gy%4yw7hg;*Urf@D~Hv(Npe)o z6QOtOZzoWcnvUbf8PO?yQSptp+sSJSO5CwFj-R4pKg34OVkdrH9^){B?(7{#n0^7^ z8AP6;>Dt3RIgLH-K8u@kAhs4rm>n|MRnMQY#BAD3{~4{;rDY;7eXIO-*k}g}=a9|A z^=P?+GkBU%1^Ztmn3lGtckSs^XEsaYx8Z`S1pR~(6x*Z#3wr6t+ zVc5s;e!g8%M-)kR72Yaa^z_U&pcFt_lW$GA9Xj=!=Qnb*5>isb=CO(j8acaa6n5vG z%kGzD@3t!1wQl+qI^?tYbfXTLE=N*<%DjUNXy|Bf@XJlF;lOQ6ArY6V-c0Ctr&J}5 z#TUHYtr&!0I%ZHZsn8l~gDJ=+OiH*NDw20ow+1$I4fXZJL0=^URw>+6RaDgq@LUqC zk@=i*DiX)ZFd#k@5H-p{?caZ_Z*gx8pR+UbH=?&hXuEQ+J}Kpf@o=sPw}+ztH}DA1C1T#7G$^p%d`B>~jpKiP{P% z&xnSJ?A?;`(zPI5B9@|3KyMZhz;*J8JAHZp>e%oAY?Zgn5Wr!AF7q9UDx5Y{{C&;9k{y`{UuaV)y3uJ zqLNfB_8lO(psdNR-2gI*SmEM#e$bn-Q{VV1^u3|5F%Y2P`%i~uvrnfSYk?1s zphWH&(cYUyp0i?7bbwjV+AoK18vVg+(aCJFbzC=ov`YKrUFRK6cYp8BoR#vtO zx=zY%zd$-QYv*(t&k-!`&@ERdpDFV!q&l@xR^_dtQY(vO7~t%9d48|1=MXsN6Y2?Y zrXQEs|7YIr?_n>lm&2K_y5{FKcn$J_@>?EkVIpXNdQsR4i}OEW3k~nh5T{vjnqfrN zO2)L{q45nSU@&_GA<6!L+gfG(m5BTgY{th{WPUxGk3BskK}kmoB>KP}p5j9HmT`A; z$8t|xC5i1TtsI-|OOAg$KJNq0%zaK8@r*781Xvb0*q(xc&~qxZL7havknFTRDp_XV ziAH8MAf;dXzWZiObe9tu%vOyi)_RrpFor&&Np+JMr|_F9!G&2}wvx>0WE_TZA9B=sJ05*SMS~TH${OEIx9tj0p!#yRSq`Bj=8^q#FE80_<`>66u;~w_Q4bm~;!M9{)BxQc+gwCNs&`$2T{}Q`D@iJz-i2 z?EZi<+s}ZE_SXUL)q9-icLeq&1c4bGaof6r|WTjz+P zq!Q?s(Aq0XzGlxu{%gTO+VsJfQ4x48OfDye--mOCvbEp}=s)dK023W`%aysLQVuzWvP~6ZkX=C?~hBz-iOfTw)mwvM|GQyr29C zCmS8_1$8!wL)D=oLqki%BdStf*@h@#y4E=7yyA=dpU_9+nJ$aMe)zNR{2ieSTW_F^ zCES7QC|4}e7_Wx8mq?y9u*SRVOm579nYmy;j{mh>VG;17oTy;~^=+yjA36MBNR#Z< zJu@5_4H}}uU2y8jLH&d(@~nB@EFUjkBrn7Tpys{{X;;MupRdFGl0RS!@uGk*h)g{+ z!ovsy)YmM$7gmJw&A_+(eiC<8e146Tqu0~jt)ik@%oT@Ry|p!*@^eWtXTs^bndtyM zPdzU1I1Y2Bqqx7xVJJXnUP%Z5ZknVPs(7@m!z-bW>>1TSVtAn0!!WJK8K}SI$KQ!( z|5EjPe*PkisxjTuANrv{z<`4EI~}GYrC1=4`R!LuLoc19)eE>21SrAb z!e8D{1Jn6MI!KFZQp5NY2TW~L7q&hS!b3$V8xkHK-%rB!i+bZK)wsGt)Wl@%=i_9C=}5E z@Lk^jd>1e%*U%twpa}r+F8}_3QG_zWq3!?wFGY2k?#At3s-1dPd5m68B^_O@LD3o* znD>7TJ_q?X00oVuRc5;lc)I{Z?mh{XoXSq3S_Co1#>uGEt}EdLD{9D6b*f!|qE6FF z`Za!~@a*-|rCxTEseH_>Rq2@Q>SiC^oc^-+i-pV(_Xv-VP3dl{-n^Z&+M#!}Q%4G0 z>DlyIB^}&ijgE>^zLX1zBUqWq(;wKq!)uOYdCvc$`qVtb zj=CRH&#%v5gw%l+kp_npu1QtHdnQPVcdvkm&7Bi@!Hun5v{Ak&!T#nGxYA~}|EjWF zp-V<1;a2F1(TWh{K(r1Wmfu%uHCC}WTN=o4UL%&bX)oSiW~6x5zasb&VjUA$?~B)~ z_Be#&qF@hbc$rPKva*PXbA@I11LU`fB5PH3oeA0G+RYH>U+C(uGdTX}(KmuesSOEG5e%z7w!NI!%1lldch7o>pw#j`S(84^yyI|8b@>fO`rVv2#ZuarhgFB!%Tg=#Oz5a# zP>ylT{wQLtns6w+UuH6#r`_@MJ&qPHXuPt?8=@Pgq%!?_!M{JXQ+8}Yzr06RxndEB z^@Ezj5?=MM0o^0&_pq>geQkxBtzdmAAhcpKM*q6^Ir&tR_wYK4q_U%+-ls{krP}uu z>c5xa#P(v_BkXOBGb@(`|6OVr#PRf2lfCb)%4!nrIS|l7=1^^GC%x@1`!e>vV*SHn zp;+*@;8KUp9(3>B&bk2{Z|RXzOLhBcl?1#Qr)|xHuHEeAM$-Pu)kVb0#nOU*=N1YW z7*MYI@&}{XiTYZQk3soVlN~`=%?Qf5>02L^E4$-hpE#ENl?iV8)3IkcUhp$i`$(yqJJv~k{z)3UOk z7M&QhP;N|4nZa%k_nU3=@8XH?-26sP=!}R|&1EM)I7>f_hH-g96$p~U%lY>>a~+MJ zT~;rHnI82M^p^6QRh55HW88?Md8I})J%>Ujwpv>jjc2SiTxsr&ud{e9Ay~A12iJVB zEi#iz!u&IgM@?OZV`eR{GtzDku=R+<#>ysmYloS2n1))}kLRRaZ?52V{=F!~5~+(p zC0;e&>aEV)RJvx-w?psQVZ`DltbulS!vAg7)AraEpPlFMz9i)Q!Q(miN*0*i^Eg^| zUpW5R?X5S=k1t7E*sJh;Ck9T#pE!bgVX$U^9gkjda zWwHee;CbluO0eAwi-2tch%3n5!%Dr~u;2d!UGo3G&#&4GKn5GAxzEhNY4*$gZF<5X PkRv@^{an^LB{Ts5xRI+p diff --git a/docs/screenshots/plan-editor-shell.png b/docs/screenshots/plan-editor-shell.png index 0d83a7acae36c0aef94c0c9c12b6c3638f398717..89e078f378517bdbf4d4216f5928b87aaa781336 100644 GIT binary patch delta 125207 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

emgX=czZ1b2R|$HB90l(B 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 Dm6c5; delta 125208 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 PC|gxU4TTaplh6MPZ)dd8 diff --git a/package.json b/package.json index 95f170b..d669922 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "build:desktop": "pnpm build:shared && pnpm --filter @classhelper/desktop-client build", "check:icons": "node scripts/check-icons.mjs", "typecheck": "pnpm build:shared && pnpm -r --no-bail typecheck", - "lint": "eslint .", + "lint": "node scripts/check-authz.mjs && eslint .", "lint:fix": "eslint . --fix", "format": "prettier --write \"**/*.{ts,js,mjs,cjs,vue,json,md,yaml,yml,css,scss,html}\"", "format:check": "prettier --check \"**/*.{ts,js,mjs,cjs,vue,json,md,yaml,yml,css,scss,html}\"", @@ -34,8 +34,8 @@ "verify:lifecycle": "node scripts/verify-lifecycle.mjs", "verify:client-agent": "node scripts/verify-client-agent.mjs", "verify:review-client": "node scripts/verify-review-client.mjs", - "verify:review-api": "node scripts/verify-review-api.mjs", - "verify:clients-api": "node scripts/verify-clients-api.mjs", + "verify:review-api": "node scripts/verify-e2e-isolated.mjs --review-api", + "verify:clients-api": "node scripts/verify-e2e-isolated.mjs --clients-api", "verify:client-migrations": "node scripts/verify-client-migrations.mjs", "verify:desktop": "pnpm --filter @classhelper/desktop-client smoke", "verify:web": "node scripts/ui-smoke/run.mjs", @@ -54,7 +54,9 @@ "dist:server:linux": "pnpm build:shared && pnpm --filter @classhelper/server build && pnpm --filter @classhelper/web-admin build && node scripts/dist-server.mjs --platform linux", "dist:all": "pnpm dist:server && pnpm dist:win", "verify:desktop:visual": "node packages/desktop-client/scripts/smoke.mjs --visual", - "verify:desktop:online": "node packages/desktop-client/scripts/smoke.mjs --online" + "verify:desktop:online": "node packages/desktop-client/scripts/smoke.mjs --online", + "verify:authz": "node scripts/verify-authz.mjs", + "check:authz": "node scripts/check-authz.mjs" }, "devDependencies": { "concurrently": "^10.0.5", diff --git a/packages/desktop-client/src/renderer/stores/realtime.ts b/packages/desktop-client/src/renderer/stores/realtime.ts index fb51a5e..937a183 100644 --- a/packages/desktop-client/src/renderer/stores/realtime.ts +++ b/packages/desktop-client/src/renderer/stores/realtime.ts @@ -60,9 +60,10 @@ export const useRealtimeStore = defineStore('realtime', () => { connecting.value = false; dispatch('__connected__', null); }); - instance.on('disconnect', () => { + instance.on('disconnect', (reason: string) => { connected.value = false; dispatch('__disconnected__', null); + if (reason === 'io server disconnect' && socket === instance) instance.connect(); }); instance.on('connect_error', (error: Error) => { connected.value = false; diff --git a/packages/server/prisma/migrations/20261031000000_authz_assignments/migration.sql b/packages/server/prisma/migrations/20261031000000_authz_assignments/migration.sql new file mode 100644 index 0000000..ef23830 --- /dev/null +++ b/packages/server/prisma/migrations/20261031000000_authz_assignments/migration.sql @@ -0,0 +1,7 @@ +ALTER TABLE "UserPermissionGroup" ADD COLUMN "scope" TEXT NOT NULL DEFAULT 'TEACHING'; +ALTER TABLE "UserPermissionGroup" ADD COLUMN "scopeValue" TEXT NOT NULL DEFAULT ''; +UPDATE "UserPermissionGroup" SET "scope" = COALESCE((SELECT CASE WHEN g."scope" = 'SELF_CLASS' THEN CASE WHEN g."scopeValue" = 'HEAD' THEN 'HEAD' ELSE 'TEACHING' END ELSE g."scope" END FROM "PermissionGroup" g WHERE g."id" = "groupId"), 'TEACHING'), "scopeValue" = COALESCE((SELECT CASE WHEN g."scope" IN ('GRADE', 'DIVISION') THEN g."scopeValue" ELSE '' END FROM "PermissionGroup" g WHERE g."id" = "groupId"), ''); +UPDATE "PermissionGroup" SET "scope" = CASE WHEN "scopeValue" = 'HEAD' THEN 'HEAD' ELSE 'TEACHING' END, "scopeValue" = '' WHERE "scope" = 'SELF_CLASS'; +UPDATE "PermissionGroup" SET "scope" = 'TEACHING', "scopeValue" = '' WHERE "defaultRole" = 'TEACHER'; +DROP INDEX "UserPermissionGroup_userId_groupId_key"; +CREATE UNIQUE INDEX "UserPermissionGroup_userId_groupId_scope_scopeValue_key" ON "UserPermissionGroup"("userId", "groupId", "scope", "scopeValue"); diff --git a/packages/server/prisma/schema.prisma b/packages/server/prisma/schema.prisma index 2a763b1..4fe0c16 100644 --- a/packages/server/prisma/schema.prisma +++ b/packages/server/prisma/schema.prisma @@ -451,7 +451,8 @@ model Grade { } model PermissionGroup { - scope String @default("SELF_CLASS") + /// 新分配的建议范围,不参与已有分配求值。 + scope String @default("TEACHING") scopeValue String @default("") /// 角色默认组;自定义组为空,改名不影响对应角色。 defaultRole String? @unique @@ -483,6 +484,9 @@ model PermissionGroupItem { /// 账号 ←→ 权限组 的分配关系(一个账号可属多个组) model UserPermissionGroup { + /// 此条分配的生效范围。 + scope String @default("TEACHING") + scopeValue String @default("") id String @id @default(cuid()) userId String groupId String @@ -491,7 +495,7 @@ model UserPermissionGroup { user User @relation(fields: [userId], references: [id], onDelete: Cascade) group PermissionGroup @relation(fields: [groupId], references: [id], onDelete: Cascade) - @@unique([userId, groupId]) + @@unique([userId, groupId, scope, scopeValue]) @@index([userId]) @@index([groupId]) } diff --git a/packages/server/scripts/verify-authz.ts b/packages/server/scripts/verify-authz.ts new file mode 100644 index 0000000..9e3775f --- /dev/null +++ b/packages/server/scripts/verify-authz.ts @@ -0,0 +1,516 @@ +import assert from 'node:assert/strict'; +import { createServer } from 'node:http'; +import { io as connect, type Socket } from 'socket.io-client'; +import { + PERMISSION_KEYS, + PERMISSION_META, + SOCKET_CHANNELS, + SOCKET_ROOMS, + SOCKET_EVENTS, + parsePermissionScope, +} from '@classhelper/shared'; +import { prisma } from '../src/lib/db.js'; +import { createApp } from '../src/app.js'; +import { signToken, type TokenPayload } from '../src/lib/jwt.js'; +import { ensureDefaultGroups } from '../src/lib/permissions.js'; +import { classIdsFor } from '../src/lib/authz/index.js'; +import { initRealtime } from '../src/realtime/socket.js'; +import { emitToClass } from '../src/realtime/bus.js'; +import { exportSnapshot, restoreSnapshot } from '../src/lib/snapshot.js'; + +if (!process.env.DATABASE_URL?.includes('authz-verification')) + throw new Error('只能在授权验收临时数据库运行'); +let count = 0; +const check = (name: string) => console.log(`通过 ${++count}:${name}`); +async function account(name: string, role: TokenPayload['role'] = 'TEACHER'): Promise { + const row = await prisma.user.create({ + data: { username: name, name, role, passwordHash: '隔离夹具,不使用真实账号' }, + }); + return { sub: row.id, username: name, name, role, classId: null }; +} +const admin = await account('authz-admin', 'ADMIN'), + aTeacher = await account('authz-A'), + bTeacher = await account('authz-B'), + unrelated = await account('authz-C'), + lead = await account('authz-grade'), + division = await account('authz-division'); +await ensureDefaultGroups(); +const cls = async (name: string, grade: string, teacherId: string, index: number) => + prisma.class.create({ + data: { + name, + grade, + teacherId, + classIndex: index, + enrollmentYear: 2026, + code: `AUTHZ${index}`, + passwordHash: '隔离', + }, + }); +const A = await cls('授权A', '高一', aTeacher.sub, 1), + B = await cls('授权B', '高一', bTeacher.sub, 2), + _C = await cls('授权C', '高二', bTeacher.sub, 3); +const course = async (classId: string, name: string, teacherId: string) => + prisma.course.create({ data: { classId, name, teacherId } }); +const mathB = await course(B.id, '数学', aTeacher.sub), + chineseB = await course(B.id, '语文', bTeacher.sub), + mathA = await course(A.id, '数学', aTeacher.sub); +const studentA = await prisma.student.create({ data: { studentNo: 'AUTHZA', name: '临时A', classId: A.id } }), + studentB = await prisma.student.create({ data: { studentNo: 'AUTHZB', name: '临时B', classId: B.id } }); +const device = (c: typeof A): TokenPayload => ({ + sub: c.id, + username: c.code, + name: c.name, + role: 'CLASS_DEVICE', + classId: c.id, + classSession: true, + classCode: c.code, +}); +const aDevice = device(A), + bDevice = device(B); +const server = createServer(createApp()), + realtime = initRealtime(server); +await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); +const origin = `http://127.0.0.1:${(server.address() as { port: number }).port}`, + base = origin + '/api'; +async function request(url: string, actor: TokenPayload, method = 'GET', body?: unknown, expected = 200) { + const res = await fetch(base + url, { + method, + headers: { authorization: `Bearer ${signToken(actor)}`, 'content-type': 'application/json' }, + ...(body === undefined ? {} : { body: JSON.stringify(body) }), + }); + const json = await res.json(); + assert.equal(res.status, expected, `${method} ${url} ${JSON.stringify(json)}`); + return json.data; +} +async function group(name: string, keys: string[], scope = 'TEACHING', scopeValue = '') { + return prisma.permissionGroup.create({ + data: { name, scope, scopeValue, items: { create: keys.map((key) => ({ key })) } }, + }); +} +async function assign(actor: TokenPayload, rows: { groupId: string; scope: string; scopeValue?: string }[]) { + await prisma.userPermissionGroup.deleteMany({ where: { userId: actor.sub } }); + if (rows.length) + await prisma.userPermissionGroup.createMany({ + data: rows.map((r) => ({ userId: actor.sub, ...r, scopeValue: r.scopeValue ?? '' })), + }); +} +const sockets: Socket[] = []; +async function socket(actor: TokenPayload) { + const s = connect(origin, { + auth: { token: signToken(actor) }, + transports: ['websocket'], + reconnection: false, + }); + sockets.push(s); + const info = await new Promise<{ rooms: string[] }>((resolve, reject) => { + const timer = setTimeout(() => reject(new Error('实时连接超时')), 5000); + s.once('connected', (data) => { + clearTimeout(timer); + resolve(data); + }); + s.once('connect_error', reject); + }); + return { s, rooms: info.rooms }; +} +try { + // 旧残留管理员键全部装备给科任,管理员能力仍永久无效。 + const old = await group('旧残留全能力', [...PERMISSION_KEYS], 'ALL'); + await assign(aTeacher, [{ groupId: old.id, scope: 'ALL' }]); + const mine = await request('/permissions/me', aTeacher); + assert( + !mine.permissions.some((key: keyof typeof PERMISSION_META) => PERMISSION_META[key].kind === 'admin'), + ); + assert.equal((await request('/permissions/me', admin)).permissions.length, PERMISSION_KEYS.length); + check('管理员全集;旧组残留管理员键对教师无效'); + for (const [url, method, body] of [ + [`/classes/${B.id}/class-account`, 'PATCH', { password: 'authz-test' }], + [`/classes/${B.id}/settings`, 'PATCH', { termWeeks: 12 }], + [`/classes/${B.id}/head-teacher`, 'PATCH', { teacherId: aTeacher.sub }], + [ + `/classes/${B.id}/subject-teachers`, + 'PUT', + { assignments: [{ subjectName: '语文', teacherId: aTeacher.sub }] }, + ], + ['/classes', 'POST', { grade: '高一', enrollmentYear: 2029, classIndex: 99 }], + ['/teachers', 'POST', { username: 'intruder', name: '攻击', role: 'ADMIN' }], + [`/teachers/${admin.sub}`, 'PATCH', { role: 'TEACHER' }], + [`/teachers/${admin.sub}/reset-password`, 'POST', {}], + [`/teachers/${admin.sub}`, 'DELETE', undefined], + ['/permissions/groups', 'POST', { name: '越权', keys: [] }], + ['/system/settings', 'PUT', {}], + ['/database/status', 'GET', undefined], + ['/term', 'PUT', { weeks: [] }], + ['/term/promotion', 'GET', undefined], + [ + '/imports/table/commit', + 'POST', + { kind: 'classTeachers', fileName: 'authz.csv', contentBase64: '', mapping: {}, mode: 'append' }, + ], + ] as const) + await request(url, aTeacher, method, body, 403); + assert.equal((await request(`/classes/${B.id}`, aTeacher)).code, undefined); + check('科任不能接管班级账号、学期设置、人员关系或组织写入口,班级码不泄漏'); + await request(`/classes/${A.id}/class-account`, aTeacher, 'PATCH', { code: 'AUTHZA1' }); + await request(`/classes/${A.id}/settings`, aTeacher, 'PATCH', { termWeeks: 12 }); + await request(`/classes/${B.id}/class-account`, admin, 'PATCH', { code: 'AUTHZB1' }); + check('本班班主任可改账号与学期设置;管理员可改其他班'); + await request(`/teachers/${admin.sub}`, admin, 'PATCH', { role: 'TEACHER' }, 409); + await request(`/teachers/${admin.sub}`, admin, 'DELETE', undefined, 409); + check('最后一个管理员不可降级或删除'); + const helper = await request( + '/teachers', + admin, + 'POST', + { username: 'authz-new', name: '新增教师', password: 'authz-pass' }, + 201, + ); + await request(`/teachers/${helper.id}/reset-password`, admin, 'POST', { newPassword: 'authz-pass-2' }); + await request(`/teachers/${helper.id}`, admin, 'DELETE'); + check('管理员账号写入口正常且产生审计'); + const readA = await group( + 'A的关联读取', + [ + 'class:read', + 'homework:read', + 'notification:read', + 'grade:read', + 'dashboard:read', + 'schedule:read', + 'roster:read', + ], + 'HEAD', + ); + const otherAll = await group('无关全校键', ['client:read'], 'ALL'); + await assign(aTeacher, [ + { groupId: readA.id, scope: 'HEAD' }, + { groupId: otherAll.id, scope: 'ALL' }, + ]); + for (const url of [ + `/grades/ranking?classId=${B.id}&examName=测试`, + `/grades/exams?classId=${B.id}`, + `/grades/collective?classId=${B.id}`, + `/homeworks?classId=${B.id}`, + `/notifications?classId=${B.id}`, + ]) + await request(url, aTeacher, 'GET', undefined, 403); + assert.deepEqual( + (await request('/classes', aTeacher)).map((c: { id: string }) => c.id), + [A.id], + ); + const dashboard = await request('/dashboard/summary', aTeacher); + assert.equal(dashboard.classCount, 1); + assert.equal((await classIdsFor({ ...aTeacher }, undefined as never)).length, 0); + check('按键独立计算,设备全校读不能扩大内容读取;无键范围为空'); + await assign(unrelated, [{ groupId: otherAll.id, scope: 'ALL' }]); + for (const url of ['/homeworks', '/notifications', '/dashboard/summary', `/grades/exams?classId=${B.id}`]) + await request(url, unrelated, 'GET', undefined, 403); + const onlyDashboard = await group('仅看板', ['dashboard:read'], 'ALL'); + await assign(unrelated, [{ groupId: onlyDashboard.id, scope: 'ALL' }]); + const hidden = await request('/dashboard/summary', unrelated); + assert.equal(hidden.gradeCount, 0); + assert.equal(hidden.studentCount, 0); + assert.equal(hidden.sections.grades, false); + check('宽范围无关能力不授予读权限,看板各段独立受控'); + await assign(aTeacher, [{ groupId: old.id, scope: 'ALL' }]); + const hw = await prisma.homework.create({ + data: { + classId: B.id, + courseId: chineseB.id, + title: '同事语文', + content: '隔离测试', + createdBy: bTeacher.sub, + }, + }); + const grade = await prisma.grade.create({ + data: { classId: B.id, courseId: chineseB.id, studentId: studentB.id, examName: '授权考试', score: 80 }, + }); + await request(`/homeworks/${hw.id}`, aTeacher, 'PATCH', { courseId: mathB.id }, 403); + await request(`/grades/${grade.id}`, aTeacher, 'PATCH', { courseId: mathB.id }, 403); + await request( + `/homeworks/${hw.id}/status`, + aTeacher, + 'PATCH', + { completed: true, studentId: studentB.id }, + 403, + ); + await request(`/homeworks/${hw.id}/submissions`, aTeacher, 'GET', undefined, 403); + await request(`/homeworks/${hw.id}/submissions`, aTeacher, 'PATCH', { notSubmittedStudentIds: [] }, 403); + await request(`/grades/exams`, aTeacher, 'PUT', { classId: B.id, name: '授权考试', countInTotal: true }); + // 年级/全校授权可配置考试口径;仅任教范围的科任不能。 + await assign(aTeacher, [{ groupId: old.id, scope: 'TEACHING' }]); + await request( + `/grades/exams`, + aTeacher, + 'PUT', + { classId: B.id, name: '授权考试', countInTotal: false }, + 403, + ); + await request(`/classes/${B.id}/student-grade-query`, aTeacher, 'PATCH', { enabled: false }, 403); + check('原/目标科目双校验;未交名单与完成状态需要科目关系;科任不能改考试配置'); + const ownHw = await request( + '/homeworks', + aTeacher, + 'POST', + { classId: B.id, courseId: mathB.id, title: '本人数学', content: '隔离测试' }, + 201, + ); + await request(`/homeworks/${ownHw.id}/status`, bDevice, 'PATCH', { completed: true }); + check('科任可发布本科作业,班级端可维护本班作业'); + const layoutBody = { + classId: A.id, + name: '本班时间表', + points: [{ name: '第一节', startTime: '08:00', endTime: '08:40', timeType: 'LESSON' }], + }; + const layout = await request('/time-layouts', aTeacher, 'POST', layoutBody, 201); + const foreign = await request( + '/time-layouts', + admin, + 'POST', + { ...layoutBody, classId: B.id, name: '别班时间表' }, + 201, + ); + for (const method of ['PUT', 'DELETE']) + await request( + `/time-layouts/${foreign.id}`, + aTeacher, + method, + method === 'PUT' ? { ...layoutBody, classId: A.id } : undefined, + 403, + ); + await request(`/time-layouts/${foreign.id}/clone`, aTeacher, 'POST', { name: '偷复制' }, 403); + await request('/time-layouts', aTeacher, 'POST', { ...layoutBody, classId: null }, 403); + await request('/term', aTeacher, 'PUT', { classId: B.id, weeks: [] }, 403); + await request('/term', aTeacher, 'PUT', { classId: A.id, weeks: [] }); + await request(`/time-layouts/${layout.id}`, aTeacher, 'DELETE'); + check('时间表按存储班级校验;本班可写、跨班与全局拒绝;班级周次要求班主任'); + const csv = `学号,姓名,班级\nAUTHZSAFE,首行,${A.name}\nAUTHZBAD,末行,${B.name}`; + await request( + '/imports/table/commit', + aTeacher, + 'POST', + { + kind: 'students', + fileName: 'authz.csv', + contentBase64: Buffer.from('\ufeff' + csv).toString('base64'), + mapping: { studentNo: '学号', name: '姓名', className: '班级' }, + mode: 'append', + }, + 403, + ); + assert.equal(await prisma.student.count({ where: { studentNo: 'AUTHZSAFE' } }), 0); + check('跨班学生导入预检全部范围,403 不留下首行数据'); + const defaults = await prisma.permissionGroup.findUniqueOrThrow({ where: { defaultRole: 'TEACHER' } }); + await request(`/permissions/groups/${defaults.id}`, admin, 'PATCH', { scope: 'ALL' }, 400); + await request(`/permissions/groups/${defaults.id}`, admin, 'PATCH', { keys: ['teacher:manage'] }, 400); + await request( + '/permissions/groups', + admin, + 'POST', + { name: '非法年级', scope: 'GRADE', scopeValue: '不存在', keys: ['class:read'] }, + 400, + ); + await request('/permissions/groups', admin, 'POST', { name: '非法能力', keys: ['permission:manage'] }, 400); + const legacyTemplate = await group('保留旧停用键', ['class:read', 'class:manage']); + const updatedLegacyTemplate = await request(`/permissions/groups/${legacyTemplate.id}`, admin, 'PATCH', { + keys: ['class:read', 'grade:read'], + }); + assert(updatedLegacyTemplate.inactiveKeys.includes('class:manage')); + assert.equal( + await prisma.permissionGroupItem.count({ where: { groupId: legacyTemplate.id, key: 'class:manage' } }), + 1, + ); + await assign(unrelated, [{ groupId: legacyTemplate.id, scope: 'ALL' }]); + assert(!(await request('/permissions/me', unrelated)).permissions.includes('class:manage')); + check('默认模板固定 TEACHING;不可保存管理员能力或未知年级'); + const scoped = await request( + '/permissions/groups', + admin, + 'POST', + { name: '分配级范围', scope: 'HEAD', keys: ['class:read', 'grade:read', 'class:account'] }, + 201, + ); + await request(`/permissions/users/${lead.sub}/groups`, admin, 'PUT', { + assignments: [{ groupId: scoped.id, scope: 'GRADE', scopeValue: '高一' }], + }); + await request(`/permissions/users/${division.sub}/groups`, admin, 'PUT', { + assignments: [{ groupId: scoped.id, scope: 'DIVISION', scopeValue: '高二,高一' }], + }); + assert.equal((await request('/classes', lead)).length, 2); + assert.equal((await request('/classes', division)).length, 3); + const effective = await request(`/permissions/users/${lead.sub}/effective`, admin); + assert.equal(effective.entries.find((e: { key: string }) => e.key === 'class:account').classCount, 0); + const leadPermissions = await request('/permissions/me', lead); + assert.deepEqual(leadPermissions.classScopes['grade:read'].sort(), [A.id, B.id].sort()); + await request(`/grades/ranking?classId=${B.id}&examName=授权考试`, lead); + await request(`/permissions/groups/${scoped.id}`, admin, 'PATCH', { scope: 'ALL' }); + assert.equal((await request('/classes', lead)).length, 2); + check('模板建议范围变更不影响已有分配;级长/部长范围与班主任关系独立'); + const query = encodeURIComponent( + JSON.stringify([ + { groupId: scoped.id, scope: 'HEAD', scopeValue: '' }, + { groupId: scoped.id, scope: 'GRADE', scopeValue: '高二' }, + ]), + ); + const merged = await request(`/permissions/users/${aTeacher.sub}/effective?assignments=${query}`, admin); + assert.equal(merged.entries.find((e: { key: string }) => e.key === 'class:read').classCount, 2); + assert(merged.conflicts.length > 0); + await request(`/permissions/users/${admin.sub}/groups`, admin, 'PUT', { assignments: [] }, 400); + check('同模板多范围正确合并并预览冲突,管理员不可分配'); + const beforeDefault = await request('/permissions/me', bTeacher); + await request(`/permissions/users/${bTeacher.sub}/groups`, admin, 'PUT', { assignments: [] }); + assert.equal((await request('/permissions/me', bTeacher)).fromGroups, false); + assert(beforeDefault.permissions.length > 0); + check('空分配恢复默认,无隐式自动预选转换'); + await request(`/classes/${B.id}/student-grade-query`, admin, 'PATCH', { enabled: false }); + for (const url of [ + `/grades/ranking?classId=${B.id}&examName=授权考试`, + `/grades/exams?classId=${B.id}`, + `/grades/student/${studentB.studentNo}`, + '/grades/my', + ]) + await request(url, bDevice, 'GET', undefined, 403); + assert.equal((await request(`/grades/collective?classId=${B.id}`, bDevice)).mode, 'collective'); + await request(`/grades/collective?classId=${B.id}`, aDevice, 'GET', undefined, 403); + check('班级端关闭查询后拒绝个人/排名/原始列表,保留本班集体聚合'); + const hb = { + deviceKey: 'authz-device-b', + name: '临时设备', + clientVersion: '1.0.0', + platform: 'win32', + agentProtocol: 2, + }; + const d = await request('/clients/heartbeat', bDevice, 'POST', hb); + await request('/clients/heartbeat', aTeacher, 'POST', hb, 403); + await request('/clients/heartbeat', aDevice, 'POST', hb, 403); + const command = await prisma.clientCommand.create({ + data: { deviceId: d.deviceId, kind: 'lock', createdBy: admin.sub, payload: '隔离假执行' }, + }); + for (const actor of [aTeacher, aDevice]) + await request( + `/clients/commands/${command.id}/ack`, + actor, + 'POST', + { deviceKey: hb.deviceKey, ok: true }, + 403, + ); + await request(`/clients/commands/${command.id}/ack`, bDevice, 'POST', { + deviceKey: hb.deviceKey, + ok: true, + result: '未执行任何系统操作', + }); + await request( + '/clients/update-progress', + aTeacher, + 'POST', + { + deviceKey: hb.deviceKey, + progress: { + version: '1.1.0', + stage: 'downloading', + downloadedBytes: 0, + totalBytes: 1, + percent: 0, + error: '', + }, + }, + 403, + ); + check('心跳/进度/回执只接受本班班级端,教师知道 deviceKey 仍不能冒用'); + await request('/update/client/releases', admin, 'POST', { version: '..' }, 400); + await request('/update/client/download/1.0.0', unrelated, 'GET', undefined, 403); + check('更新路径拒绝 ..,下载要求班级端或设备读能力及范围'); + const readOnly = await group('只读作业实时', ['homework:read'], 'HEAD'); + await assign(aTeacher, [{ groupId: readOnly.id, scope: 'TEACHING' }]); + const previousSubjectSocket = await socket(aTeacher); + assert(previousSubjectSocket.rooms.includes(SOCKET_ROOMS.classChannel(B.id, 'homework'))); + const disconnected = new Promise((resolve, reject) => { + const timer = setTimeout(() => reject(new Error('任课导入后旧订阅未断开')), 5000); + previousSubjectSocket.s.once('disconnect', () => { + clearTimeout(timer); + resolve(); + }); + }); + await request('/imports/table/commit', admin, 'POST', { + kind: 'classTeachers', + fileName: 'relations.csv', + mapping: { className: '班级', subjectName: '科目', teacherNo: '工号', teacherName: '姓名', role: '角色' }, + contentBase64: Buffer.from( + `\ufeff班级,科目,工号,姓名,角色\n${B.name},数学,${bTeacher.username},临时教师,科任`, + ).toString('base64'), + mode: 'upsert', + }); + await disconnected; + const updatedSubjectSocket = await socket(aTeacher); + assert(!updatedSubjectSocket.rooms.includes(SOCKET_ROOMS.classChannel(B.id, 'homework'))); + check('任课导入变更后旧房间立即失效,重连按现行关系订阅'); + + await assign(aTeacher, [ + { groupId: readOnly.id, scope: 'HEAD' }, + { groupId: otherAll.id, scope: 'ALL' }, + ]); + const { s, rooms } = await socket(aTeacher), + deviceSocket = await socket(aDevice); + assert(rooms.includes(SOCKET_ROOMS.classChannel(A.id, 'homework'))); + assert(!rooms.includes(SOCKET_ROOMS.classChannel(B.id, 'homework'))); + assert(!rooms.includes(SOCKET_ROOMS.classChannel(A.id, 'grade'))); + assert(SOCKET_CHANNELS.every((ch) => deviceSocket.rooms.includes(SOCKET_ROOMS.classChannel(A.id, ch)))); + const join = await new Promise<{ ok: boolean }>((resolve) => + s.emit('class:join', { classId: B.id, channels: ['homework'] }, resolve), + ); + assert.equal(join.ok, false); + const seen: string[] = []; + s.on(SOCKET_EVENTS.gradeUpdated, () => seen.push('grade')); + s.on(SOCKET_EVENTS.homeworkNew, () => seen.push('homework')); + emitToClass(A.id, SOCKET_EVENTS.gradeUpdated, { classId: A.id }); + emitToClass(B.id, SOCKET_EVENTS.homeworkNew, { id: 'foreign' }); + emitToClass(A.id, SOCKET_EVENTS.homeworkNew, { id: 'own' }); + await new Promise((resolve) => setTimeout(resolve, 100)); + assert.deepEqual(seen, ['homework']); + check('实时按读域与范围订阅,跨班 join 和跨域事件均拒绝'); + const stale = signToken(admin); + await prisma.user.update({ where: { id: admin.sub }, data: { role: 'TEACHER' } }); + const staleSocket = connect(origin, { + auth: { token: stale }, + transports: ['websocket'], + reconnection: false, + }); + sockets.push(staleSocket); + const staleInfo = await new Promise<{ role: string }>((resolve) => staleSocket.once('connected', resolve)); + assert.equal(staleInfo.role, 'TEACHER'); + await prisma.user.update({ where: { id: admin.sub }, data: { role: 'ADMIN' } }); + check('Socket 与 HTTP 共用数据库身份加载,旧管理员 JWT 不保留角色'); + const snapshot = await exportSnapshot(prisma, 'sqlite'); + const legacy = structuredClone(snapshot); + for (const g of legacy.data.PermissionGroup) + if (g.id === readOnly.id) { + g.scope = 'SELF_CLASS'; + g.scopeValue = 'HEAD'; + } + for (const a of legacy.data.UserPermissionGroup) { + delete a.scope; + delete a.scopeValue; + } + await restoreSnapshot(prisma, 'sqlite', legacy); + assert.equal( + ( + await prisma.userPermissionGroup.findFirstOrThrow({ + where: { userId: aTeacher.sub, groupId: readOnly.id }, + }) + ).scope, + 'HEAD', + ); + assert.equal( + (await prisma.permissionGroup.findUniqueOrThrow({ where: { defaultRole: 'TEACHER' } })).scope, + 'TEACHING', + ); + assert.throws(() => parsePermissionScope('SELF_CLASS' as never, '')); + check('旧快照按模板回填分配、默认模板归一化、运行时拒绝旧范围枚举'); + check(`授权攻击矩阵完成,夹具 ${studentA.id} / ${mathA.id} 均位于临时库`); +} finally { + for (const s of sockets) s.disconnect(); + await new Promise((resolve) => realtime.close(() => resolve())); + server.closeAllConnections(); + if (server.listening) await new Promise((resolve) => server.close(() => resolve())); + await prisma.$disconnect(); +} diff --git a/packages/server/scripts/verify-courseware.ts b/packages/server/scripts/verify-courseware.ts index 5c60a18..cf57a47 100644 --- a/packages/server/scripts/verify-courseware.ts +++ b/packages/server/scripts/verify-courseware.ts @@ -255,7 +255,9 @@ try { emitted .filter((e) => e.event === SOCKET_EVENTS.coursewareChanged) .every((e) => - e.rooms.every((room) => [classes[0]!.id, classes[1]!.id].some((id) => room === `class:${id}`)), + e.rooms.every((room) => + [classes[0]!.id, classes[1]!.id].some((id) => room === `class:${id}:courseware`), + ), ), ); await new Promise((resolve) => server.close(() => resolve())); @@ -357,24 +359,27 @@ try { state = await prisma.clientDevice.findUniqueOrThrow({ where: { id: device.id } }); check('取消目标后忽略旧任务进度', state.updateProgress === ''); const teacherDeviceKey = 'courseware-teacher-device'; - await request('/clients/heartbeat', tokens[0], { deviceKey: teacherDeviceKey, clientVersion: '1.0.0' }); - let teacherDevice = await prisma.clientDevice.findUniqueOrThrow({ where: { deviceKey: teacherDeviceKey } }); - check('教师电脑设备不绑定班级', teacherDevice.classId === null); - await prisma.clientDevice.update({ - where: { id: teacherDevice.id }, - data: { updateTargetVersion: '2.0.0' }, + check( + '教师会话不能注册设备心跳', + (await request('/clients/heartbeat', tokens[0], { deviceKey: teacherDeviceKey, clientVersion: '1.0.0' })) + .status === 403, + ); + const teacherDevice = await prisma.clientDevice.create({ + data: { deviceKey: teacherDeviceKey, updateTargetVersion: '2.0.0' }, }); check( - '教师电脑可上报自己的更新进度', + '旧未绑定设备也不能由教师冒报进度', ( await request('/clients/update-progress', tokens[0], { deviceKey: teacherDeviceKey, progress: { ...updateProgress, version: '2.0.0' }, }) - ).status === 200, + ).status === 403, + ); + check( + '拒绝请求不改变旧设备进度', + (await prisma.clientDevice.findUniqueOrThrow({ where: { id: teacherDevice.id } })).updateProgress === '', ); - teacherDevice = await prisma.clientDevice.findUniqueOrThrow({ where: { deviceKey: teacherDeviceKey } }); - check('教师电脑更新进度已记录', JSON.parse(teacherDevice.updateProgress).stage === 'downloading'); const snapshot = await exportSnapshot(prisma, 'sqlite'); check( '备份包含课件、可见范围、推送和回执', diff --git a/packages/server/scripts/verify-e2e.mjs b/packages/server/scripts/verify-e2e.mjs index f92faf7..d5a85ee 100644 --- a/packages/server/scripts/verify-e2e.mjs +++ b/packages/server/scripts/verify-e2e.mjs @@ -1563,28 +1563,18 @@ async function main() { `含 homework:write=${teacher2ResetPermissions.includes('homework:write')}`, ); - // 管理员可以分配权限组,但始终保留两个管理入口 const assignAdmin = await api(`/permissions/users/${adminMember?.id}/groups`, { method: 'PUT', token: adminToken, - body: { groupIds: permissionGroupId ? [permissionGroupId] : [] }, + body: { assignments: [] }, }); + const fixedAdmin = await api('/permissions/me', { token: adminToken }); record( - '管理员可以分配权限组(PUT /users/:id/groups → 200)', - Boolean(adminMember) && - assignAdmin.status === 200 && - Array.isArray(assignAdmin.payload?.data?.permissions) && - assignAdmin.payload.data.permissions.includes('permission:manage') && - assignAdmin.payload.data.permissions.includes('system:manage'), - `status=${assignAdmin.status} 响应=${assignAdmin.payload?.message ?? ''}`, + '管理员固定全集并拒绝分配模板', + assignAdmin.status === 400 && fixedAdmin.payload?.data?.permissions.includes('teacher:manage'), + `status=${assignAdmin.status}`, ); - await api(`/permissions/users/${adminMember?.id}/groups`, { - method: 'PUT', - token: adminToken, - body: { groupIds: [] }, - }); - // 内置权限组不可删除:先找一个 builtin 的(**演示库当前没有内置组**,此时只报事实、不算失败) const groupsList = await api('/permissions/groups', { token: adminToken }); const builtinGroup = (groupsList.payload?.data ?? []).find((item) => item.builtin === true) ?? null; diff --git a/packages/server/scripts/verify-lifecycle.ts b/packages/server/scripts/verify-lifecycle.ts index b421fcc..66d1676 100644 --- a/packages/server/scripts/verify-lifecycle.ts +++ b/packages/server/scripts/verify-lifecycle.ts @@ -6,7 +6,7 @@ import { PERMISSION_KEYS, defaultPromotionPlan, parsePermissionScope } from '@cl import { prisma } from '../src/lib/db.js'; import { createApp } from '../src/app.js'; import { signToken, type TokenPayload } from '../src/lib/jwt.js'; -import { ensureDefaultGroups, loadEffectivePermissions } from '../src/lib/permissions.js'; +import { ensureDefaultGroups, loadAuthPrincipal } from '../src/lib/permissions.js'; import { registerEmitter } from '../src/realtime/bus.js'; import * as students from '../src/modules/students/students.service.js'; import * as classes from '../src/modules/classes/classes.service.js'; @@ -53,7 +53,7 @@ const a = await cls('TESTA', '高一', 2025, 1), c = await cls('TESTC', '高二', 2024, 1, admin.sub); const events: { classId: string; event: string }[] = []; registerEmitter((rooms, event) => { - for (const room of rooms) events.push({ classId: room.replace('class:', ''), event }); + for (const room of rooms) events.push({ classId: room.split(':')[1], event }); }); const server = createServer(createApp()); await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); @@ -91,24 +91,22 @@ try { assert.equal((PERMISSION_KEYS as readonly string[]).includes('promotion:manage'), true), ); const delegate = await account('临时教务授权', 'TEACHER'); - const governance = await permissions.createGroup(admin, { - name: '教务授权', - scope: 'ALL', - keys: ['class:read', 'class:manage', 'archive:manage', 'promotion:manage'], - }); - await permissions.assignUserGroups(admin, delegate.sub, { groupIds: [governance.id] }); - const delegatedClass = await request( - '/classes', - delegate, - 'POST', - { grade: '高一', enrollmentYear: 2028, classIndex: 99 }, - 201, + await denied( + permissions.createGroup(admin, { + name: '不可下放组织能力', + keys: ['class:manage', 'archive:manage', 'promotion:manage'], + }), + 400, ); - await request(`/classes/${delegatedClass.id}`, delegate, 'PATCH', { termWeeks: 10 }); - await request(`/classes/${delegatedClass.id}`, delegate, 'DELETE'); - await request('/archives', delegate); - await request('/term/promotion', delegate); - check('教师持对应全校功能键可管理班级、读取归档与升级配置', () => {}); + for (const url of ['/classes', '/archives', '/term/promotion']) + await request( + url, + delegate, + url === '/classes' ? 'POST' : 'GET', + url === '/classes' ? {} : undefined, + 403, + ); + check('组织管理能力不能下放给教师,路由永久拒绝', () => {}); const allRoster = await permissions.createGroup(admin, { name: '全校名单', scope: 'ALL', @@ -132,50 +130,41 @@ try { scope: 'ALL', keys: ['class:read'], }); - const ownWrite = await permissions.createGroup(admin, { name: '关联班级维护', keys: ['class:manage'] }); + const ownWrite = await permissions.createGroup(admin, { name: '关联班级维护', keys: ['class:settings'] }); await permissions.assignUserGroups(admin, delegate.sub, { groupIds: [readAll.id, ownWrite.id] }); const foreignDetail = await request(`/classes/${a.id}`, delegate); assert.equal(foreignDetail.students.length, 0, '班级读取键不能代替名单读取键'); - await request(`/classes/${a.id}`, delegate, 'PATCH', { termWeeks: 11 }, 403); + await request(`/classes/${a.id}/settings`, delegate, 'PATCH', { termWeeks: 11 }, 403); check('全校读取组不能借给写操作范围,班级详情不泄漏未授权名单', () => {}); const defaults = await prisma.permissionGroup.findUniqueOrThrow({ where: { defaultRole: 'TEACHER' } }); await permissions.assignUserGroups(admin, teacher.sub, { groupIds: [] }); - assert((await loadEffectivePermissions(teacher)).has('roster:manage')); + assert((await loadAuthPrincipal(teacher)).permissions.has('roster:manage')); const additional = await permissions.createGroup(admin, { - name: '追加升级权限', + name: '追加设备读权限', scope: 'ALL', - keys: ['promotion:manage'], + keys: ['client:read'], }); await permissions.assignUserGroups(admin, teacher.sub, { groupIds: [defaults.id, additional.id] }); - check('无组回落、显式默认组与多组并集', () => {}); - assert((await loadEffectivePermissions(teacher)).has('promotion:manage')); + assert((await loadAuthPrincipal(teacher)).permissions.has('client:read')); + assert(!(await loadAuthPrincipal(teacher)).permissions.has('promotion:manage')); await denied( permissions.assignUserGroups(admin, teacher.sub, { groupIds: ['default-permission-admin'] }), - 403, + 400, ); - const assistant = await permissions.createGroup(admin, { - name: '权限协助', - keys: ['permission:manage', 'roster:read'], - }); - await permissions.assignUserGroups(admin, manager.sub, { groupIds: [assistant.id] }); await denied(permissions.createGroup(manager, { name: '越权', keys: ['system:manage'] }), 403); - await denied( - permissions.createGroup(manager, { name: '越范围', scope: 'ALL', keys: ['roster:read'] }), - 403, - ); await denied(permissions.updateGroup(manager, defaults.id, { keys: [] }), 403); await denied(permissions.assignUserGroups(manager, manager.sub, { groupIds: [additional.id] }), 403); - check('跨角色默认组、越键、越范围和默认组编辑均拒绝', () => {}); + check('分配并集、管理员默认组忽略、非管理员权限管理均拒绝', () => {}); await denied(permissions.createGroup(admin, { name: '空范围', scope: 'GRADE' }), 400); await denied(permissions.createGroup(admin, { name: '未知范围', scope: 'GRADE', scopeValue: '未知' }), 400); check('范围统一归一化并拒绝空值和未知年级', () => assert.equal(parsePermissionScope('DIVISION', '高二,高一、 高一').scopeValue, '高一,高二'), ); - const memberList = await permissions.listMembers(); + const memberList = await permissions.listMembers(admin); check('成员含真实权限与范围,组成员包含默认回落账号', () => - assert(memberList.find((m) => m.id === teacher.sub)?.permissions.includes('promotion:manage')), + assert(memberList.find((m) => m.id === teacher.sub)?.permissions.includes('client:read')), ); - const audits = await permissions.listAudits(); + const audits = await permissions.listAudits(admin); check('审计记录操作人与变更前后快照', () => assert(audits.items.every((audit) => audit.actorId && audit.actorName && audit.afterJson)), ); @@ -197,7 +186,7 @@ try { } } try { - await permissions.listMembers(); + await permissions.listMembers(admin); const small = queryCount; queryCount = 0; await prisma.user.createMany({ @@ -208,7 +197,7 @@ try { passwordHash: '临时', })), }); - await permissions.listMembers(); + await permissions.listMembers(admin); check('成员增加后权限查询次数保持不变', () => assert.equal(queryCount, small)); } finally { restoreMethods.forEach((restore) => restore()); diff --git a/packages/server/scripts/verify-v14.ts b/packages/server/scripts/verify-v14.ts index ac4a0e1..6449aca 100644 --- a/packages/server/scripts/verify-v14.ts +++ b/packages/server/scripts/verify-v14.ts @@ -114,8 +114,17 @@ for (const [userId, id, scopeValue] of [ [head.id, 'builtin-head', 'HEAD'], [teacher.id, 'builtin-teacher', ''], ] as const) { - await prisma.permissionGroup.update({ where: { id }, data: { scopeValue } }); - await prisma.userPermissionGroup.create({ data: { userId, groupId: id } }); + const scope = + id === 'builtin-grade' + ? 'GRADE' + : id === 'builtin-division' + ? 'DIVISION' + : id === 'builtin-head' + ? 'HEAD' + : 'TEACHING'; + await prisma.userPermissionGroup.create({ + data: { userId, groupId: id, scope, scopeValue: ['GRADE', 'DIVISION'].includes(scope) ? scopeValue : '' }, + }); } const server = createServer(createApp()); await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); diff --git a/packages/server/src/lib/access.ts b/packages/server/src/lib/access.ts index f03c995..9a37412 100644 --- a/packages/server/src/lib/access.ts +++ b/packages/server/src/lib/access.ts @@ -1,379 +1,129 @@ -import type { PermissionKey as ContractPermissionKey } from '@classhelper/shared'; -import { - canManageGrades, - canManageRoster, - canManageSchedule, - canManageSubjectContent, - canPublishNotification, - resolveClassRole, - type ClassRole, -} from '@classhelper/shared'; -import { teacherScopeWhere } from './permission-scope.js'; +import type { Prisma } from '../generated/prisma/client.js'; +import type { PermissionKey, ClassRole } from '@classhelper/shared'; +import { resolveClassRole } from '@classhelper/shared'; import { prisma } from './db.js'; import { ApiError } from './http.js'; -import { assertPermission, currentRequestPermission } from './permissions.js'; -import { hasAllScope } from './permission-scope.js'; import type { TokenPayload } from './jwt.js'; - -/** - * 权限(RBAC)规则。 - * - * | 角色 | 范围 | 能做什么 | - * | ---- | ---- | -------- | - * | ADMIN | 全局 | 班级/教师/学生名单/调班/归档/全部科目的作业与成绩 | - * | HEAD 班主任 | 本班 | 本班学生名单、课表、本班汇总;**作业与成绩仍按科目收口** | - * | SUBJECT 科任 | 班级 + 科目 | 只能发布/修改/删除**自己任教科目**的作业与成绩 | - * | CLASS_DEVICE | 绑定班级 | ClassHelper 班级端:代本班读写个人数据、按开关查成绩明细 | - * | 学生 | 无账号 | 仅作为 `Student` 名单记录,不登录、无权限 | - * - * 三条铁律(都是这次重构的落点): - * 1. **任课关系的唯一来源是 `Course`**(班级 + 科目 + 教师),没有第二张关系表; - * 2. **班主任不自动拥有本班所有科目的作业成绩编辑权** —— 只有同时是该科科任老师时才有; - * 3. **所有权限都在后端判**,前端只做展示控制。 - * - * 判定逻辑与前端共用 `@classhelper/shared/permissions`,避免前后端口径漂移。 - */ - -export function isAdmin(user: TokenPayload): boolean { - return user.role === 'ADMIN'; -} - -export function isTeacher(user: TokenPayload): boolean { - return user.role === 'TEACHER'; -} - -/** 教师与管理员(staff):能以自己的身份操作班级内容 */ -export function isStaff(user: TokenPayload): boolean { - return user.role === 'ADMIN' || user.role === 'TEACHER'; -} - -/** - * 是否是 ClassHelper 班级端(教室机器上那台绑定到某个班的客户端)。 - * 它代全班读写个人数据(作业完成、通知已读),也能按开关查本班学生成绩明细。 - */ -export function isClassDevice(user: TokenPayload): boolean { - return user.role === 'CLASS_DEVICE'; -} - -/** 班级端代录内容归属班主任账号,班级主体不能写入 User 外键。 */ +import { + assertAdmin, + assertPermission, + assertClassRead, + assertManage, + classIdsFor, + classWhere, + classDeviceClassId, + isHead, + hasOrganizationalGrant, +} from './authz/index.js'; +export { classDeviceClassId } from './authz/relations.js'; +export const isAdmin = (user: TokenPayload) => user.role === 'ADMIN'; +export const isTeacher = (user: TokenPayload) => user.role === 'TEACHER'; +export const isStaff = (user: TokenPayload) => user.role === 'ADMIN' || user.role === 'TEACHER'; +export const isClassDevice = (user: TokenPayload) => user.role === 'CLASS_DEVICE'; export async function resolveContentCreator(user: TokenPayload, classId: string) { if (!isClassDevice(user)) return user.sub; const record = await prisma.class.findUnique({ where: { id: classId }, select: { teacherId: true } }); - if (!record?.teacherId) throw ApiError.conflict('请先为班级配置班主任,再在班级端发布内容'); + if (!record?.teacherId) throw ApiError.conflict('请先为班级配置班主任'); return record.teacherId; } - -/** ClassHelper 班级端绑定的班级 id;不是班级端会话时返回 null */ -export function classDeviceClassId(user: TokenPayload): string | null { - return isClassDevice(user) ? (user.classId ?? user.sub) : null; +export function requireClassDeviceClassId(user: TokenPayload): string { + const id = classDeviceClassId(user); + if (!id) throw ApiError.forbidden('当前会话未绑定班级'); + return id; } - -/** - * 班级访问的判定条件:班主任,**或在该班有任课关系**(`Course.teacherId`)。 - * - * 这里就是「科任老师」的判定源 —— 以前查的是没有科目的 `ClassTeacher` 协作表, - * 现在查 `Course`,于是"能不能进这个班"与"能不能改这一科的作业成绩"用的是同一份事实。 - */ -/** 当前用户可访问的全部班级 id */ -export async function getAccessibleClassIds( - user: TokenPayload, - permission?: ContractPermissionKey, -): Promise { - if (isAdmin(user)) { - const classes = await prisma.class.findMany({ select: { id: true } }); - return classes.map((item) => item.id); - } - - if (isTeacher(user)) { - const classes = await prisma.class.findMany({ - where: await teacherScopeWhere(user, permission), - select: { id: true }, - }); - return classes.map((item) => item.id); - } - - const classId = classDeviceClassId(user); - return classId ? [classId] : []; -} - +export const getAccessibleClassIds = classIdsFor; export async function canAccessClass( user: TokenPayload, classId: string, - permission?: ContractPermissionKey, + key: PermissionKey, ): Promise { - if (isAdmin(user)) return true; - if (isTeacher(user)) { - const count = await prisma.class.count({ - where: { AND: [{ id: classId }, await teacherScopeWhere(user, permission)] }, - }); - return count > 0; - } - return classDeviceClassId(user) === classId; + if (isClassDevice(user)) return classDeviceClassId(user) === classId; + return !!(await prisma.class.count({ where: { AND: [{ id: classId }, await classWhere(user, key)] } })); } - -/** 读权限断言 */ +/** 兼容窄封装,键必须由调用点显式提供。 */ export async function assertClassAccess( user: TokenPayload, classId: string, - permission?: ContractPermissionKey, + key: PermissionKey, ): Promise { - const exists = await prisma.class.findUnique({ where: { id: classId }, select: { id: true } }); - if (!exists) throw ApiError.notFound('班级不存在'); - if (!(await canAccessClass(user, classId, permission))) throw ApiError.forbidden('无权访问该班级的数据'); + await assertClassRead(user, key, classId, { allowClassDevice: true }); } - -/** 写权限断言:无账号的学生不在会话里,因此这里只放行 staff 与 ClassHelper 班级端 */ -export async function assertClassWritable(user: TokenPayload, classId: string): Promise { - if (!isStaff(user) && !isClassDevice(user)) throw ApiError.forbidden('当前身份没有管理权限'); - await assertClassAccess(user, classId); -} - -/* ---------------------------------------------------------------- 班级内角色 */ - -/** 解析当前用户在某班级里的角色(ADMIN / HEAD / SUBJECT / CLASS_DEVICE / NONE) */ export async function resolveUserClassRole(user: TokenPayload, classId: string): Promise { - if (user.role === 'ADMIN') return 'ADMIN'; - if (user.role === 'CLASS_DEVICE') return (await canAccessClass(user, classId)) ? 'CLASS_DEVICE' : 'NONE'; - - const record = await prisma.class.findUnique({ - where: { id: classId }, - select: { - teacherId: true, - courses: { where: { teacherId: user.sub }, select: { id: true } }, - }, - }); - if (!record) return 'NONE'; + if (isAdmin(user)) return 'ADMIN'; + if (isClassDevice(user)) return classDeviceClassId(user) === classId ? 'CLASS_DEVICE' : 'NONE'; return resolveClassRole({ role: user.role, - isHeadTeacher: record.teacherId === user.sub, - teachesSubjects: record.courses.length > 0, + isHeadTeacher: await isHead(user, classId), + teachesSubjects: !!(await prisma.course.count({ where: { classId, teacherId: user.sub } })), }); } - -/** 班级本身(增删改)与人员分配:仅管理员 */ -export async function assertCanManageClasses(user: TokenPayload, classId?: string): Promise { - await assertPermission(user, 'class:manage'); - if (classId) await assertClassInScope(user, classId, 'class:manage'); - else if (!(await hasAllScope(user, 'class:manage'))) throw ApiError.forbidden('创建或删除班级需要全校范围'); - if ( - classId && - (await prisma.class.findUnique({ where: { id: classId }, select: { archivedYearId: true } })) - ?.archivedYearId - ) - throw ApiError.conflict('该班级已归档,请先撤销归档'); +export async function assertCanManageClasses(user: TokenPayload, classId?: string) { + assertAdmin(user); + if (classId && (await prisma.class.findUnique({ where: { id: classId } }))?.archivedYearId) + throw ApiError.conflict('该班级已归档'); } - -export async function assertGlobalPermission(user: TokenPayload, key: ContractPermissionKey) { +export const assertCanAssignTeachers = assertCanManageClasses; +export async function assertGlobalPermission(user: TokenPayload, key: PermissionKey) { + assertAdmin(user); await assertPermission(user, key); - if (!(await hasAllScope(user, key))) throw ApiError.forbidden('此操作影响全校,需要对应功能的全校范围'); } - -/** 班主任 / 各科科任老师的分配:仅管理员 */ -export async function assertCanAssignTeachers(user: TokenPayload, classId?: string): Promise { - await assertCanManageClasses(user, classId); +export async function assertClassInScope(user: TokenPayload, classId: string, key: PermissionKey) { + await assertClassRead(user, key, classId); } - -export async function assertClassInScope(user: TokenPayload, classId: string, key: ContractPermissionKey) { - await assertPermission(user, key); - if (isAdmin(user)) return; - const count = await prisma.class.count({ - where: { AND: [{ id: classId }, await teacherScopeWhere(user, key)] }, - }); - if (!count) throw ApiError.forbidden('目标班级不在此功能的授权范围内'); -} -export async function assertClassesInScope(user: TokenPayload, ids: string[], key: ContractPermissionKey) { +export async function assertClassesInScope(user: TokenPayload, ids: string[], key: PermissionKey) { for (const id of new Set(ids)) await assertClassInScope(user, id, key); } - -/** - * 学生名单(增删学生 / 导入名单 / 调班):管理员,或**本班班主任**。 - * - * @param classId 目标班级;不传表示"全局名单操作"(例如未分班的学生),此时仅管理员 - */ -export async function assertCanManageRoster(user: TokenPayload, classId?: string): Promise { - await assertPermission(user, 'roster:manage'); +export async function assertCanManageRoster( + user: TokenPayload, + classId?: string, + db: Prisma.TransactionClient = prisma, +) { if (!classId) { - if (!(await hasAllScope(user, 'roster:manage'))) - throw ApiError.forbidden('未分班学生操作需要全校名单范围'); + await assertPermission(user, 'roster:manage'); + if (!(await hasOrganizationalGrant(user, 'roster:manage'))) + throw ApiError.forbidden('未分班学生需要全校名单范围'); return; } - await assertClassInScope(user, classId, 'roster:manage'); - if (await hasAllScope(user, 'roster:manage')) return; - const classRole = await resolveUserClassRole(user, classId); - if (!canManageRoster(classRole)) { - throw ApiError.forbidden( - classRole === 'SUBJECT' - ? '科任老师不能管理学生名单,请联系班主任或管理员' - : '只能管理自己担任班主任的班级的学生名单', - ); - } + await assertManage(user, 'roster:manage', classId, db); } - -/** 课表管理(含时间配置导入):管理员或本班班主任 */ -export async function assertCanManageSchedule(user: TokenPayload, classId: string): Promise { - await assertClassAccess(user, classId); - const classRole = await resolveUserClassRole(user, classId); - if (!canManageSchedule(classRole)) { - throw ApiError.forbidden( - classRole === 'SUBJECT' || classRole === 'CLASS_DEVICE' - ? '科任老师与班级端不能管理课表,请联系班主任或管理员' - : '无权管理该班级的课表', - ); - } -} - -/** 导入需同时覆盖导入能力和对应写能力,范围不能从另一项能力借用。 */ -export async function assertCanImportSchedule( +export async function assertCanManageSchedule( user: TokenPayload, classId: string, - writeKey: ContractPermissionKey = 'schedule:write', -): Promise { - await assertClassInScope(user, classId, 'import:schedule'); - await assertClassInScope(user, classId, writeKey); + db: Prisma.TransactionClient = prisma, +) { + await assertManage(user, 'schedule:write', classId, db); +} +export async function assertCanImportSchedule(user: TokenPayload, classId: string) { + await assertManage(user, 'import:schedule', classId); await assertCanManageSchedule(user, classId); } - -/** 通知 / 叫人:管理员、班主任、科任老师、ClassHelper 班级端(面向全班,不分科目) */ -export async function assertCanPublishNotification(user: TokenPayload, classId: string): Promise { - await assertClassAccess(user, classId); - const classRole = await resolveUserClassRole(user, classId); - if (!canPublishNotification(classRole)) { - throw ApiError.forbidden('当前账号没有发布通知或叫人的权限'); - } -} - -/** - * 成绩录入 / 修改 / 导入的**班级维度**准入:管理员,或本班班主任。 - * - * @param classId 目标成绩所属班级;不传时按"全局"判定(仅管理员可用,例如空白模板下载) - * - * 这只是第一道门:具体某一条成绩能不能动,还要过 `assertCanManageSubjectContent` 的**科目**那道门。 - */ -export async function assertCanManageGrades(user: TokenPayload, classId?: string): Promise { - if (!classId) { - if (!isAdmin(user)) throw ApiError.forbidden('该操作需要指定班级,只有管理员可以全局执行'); - return; - } - - await assertClassAccess(user, classId); - const classRole = await resolveUserClassRole(user, classId); - if (canManageGrades(classRole)) return; - - throw ApiError.forbidden( - classRole === 'SUBJECT' || classRole === 'CLASS_DEVICE' - ? '科任老师与班级端不能代录全班成绩,请在自己的科目里录入' - : '只能录入自己担任班主任的班级的成绩', - ); -} - -/** - * **科目维度的写权限**(作业与成绩共用的那道细门)—— 本次重构的核心规则。 - * - * | 情形 | 谁可以写 | - * | ---- | -------- | - * | 管理员 | 全部 | - * | ClassHelper 班级端 | 仅当 `allowClassDevice`(作业允许、成绩不允许) | - * | 挂了科目(courseId 有值) | **该科的任课老师**(`Course.teacherId`) | - * | 没挂科目(courseId 为空) | 本班**班主任** | - * - * 于是:班主任若不教这一科,就改不了这一科的作业与成绩 —— 这正是需求 - * 「班主任不自动拥有所有科目作业成绩编辑权,只有同时是该科科任老师时才有该科权限」。 - * - * @param courseId 目标内容挂在哪门课(科目)上;null/undefined 表示"不指定科目" - * @param action 给用户看的动作名,例如「布置作业」「录入成绩」 - * @param options.allowClassDevice 是否允许教室机器代写(作业为 true,成绩为 false) - */ -export async function assertCanManageSubjectContent( - user: TokenPayload, - classId: string, - courseId: string | null | undefined, - action: string, - options: { allowClassDevice?: boolean } = {}, -): Promise { - await assertClassAccess(user, classId); - const classRole = await resolveUserClassRole(user, classId); - const allowClassDevice = options.allowClassDevice === true; - - // 管理员不受科目限制,提前返回省掉一次课程查询 - if (classRole === 'ADMIN') return; - if (classRole === 'CLASS_DEVICE') { - if (allowClassDevice) return; - throw ApiError.forbidden(`ClassHelper 班级端不能${action},请由任课老师在 Web 端操作`); - } - - let isSubjectTeacherOfCourse = false; - let courseName = ''; - if (courseId) { - const course = await prisma.course.findUnique({ - where: { id: courseId }, - select: { classId: true, teacherId: true, name: true }, - }); - if (!course) throw ApiError.badRequest('课程不存在'); - if (course.classId !== classId) throw ApiError.badRequest('该课程不属于所选班级'); - courseName = course.name; - isSubjectTeacherOfCourse = course.teacherId === user.sub; - } - - const allowed = canManageSubjectContent({ - classRole, - hasSubject: Boolean(courseId), - isSubjectTeacherOfCourse, - allowClassDevice, - }); - if (allowed) return; - - throw ApiError.forbidden( - courseId - ? `「${courseName}」不是你任教的科目,不能${action}该科目的内容` - : `未指定科目的内容只有班主任或管理员可以${action}`, - ); -} - -/** 学生的主班级(ClassHelper 班级端会话);未绑定班级时抛 403 */ -export function requireClassDeviceClassId(user: TokenPayload): string { - const classId = classDeviceClassId(user); - if (!classId) throw ApiError.forbidden('当前会话未绑定班级,请联系管理员'); - return classId; -} - -/** - * 查询范围解析: - * - 传入 classId:校验后只查该班级 - * - 未传:教师只能查自己可访问的班级;管理员不加限制 - */ export type ClassScope = { mode: 'all' } | { mode: 'in'; classIds: string[] }; - export async function resolveClassScope( user: TokenPayload, - requestedClassId?: string, - permission?: ContractPermissionKey, + requestedClassId: string | undefined, + key: PermissionKey, ): Promise { if (requestedClassId) { - await assertClassAccess(user, requestedClassId, permission); + await assertClassAccess(user, requestedClassId, key); return { mode: 'in', classIds: [requestedClassId] }; } - if (isAdmin(user)) return { mode: 'all' }; - const scopePermission = permission ?? currentRequestPermission(user); - if (isTeacher(user) && scopePermission && (await hasAllScope(user, scopePermission))) - return { mode: 'all' }; - - const classIds = await getAccessibleClassIds(user, permission); - // 没有任何班级时不抛错,返回空集合让列表接口给出空数组,避免新教师首次登录报错 - return { mode: 'in', classIds }; + if (isClassDevice(user)) return { mode: 'in', classIds: [requireClassDeviceClassId(user)] }; + await assertPermission(user, key); + if (Object.keys(await classWhere(user, key)).length === 0) return { mode: 'all' }; + // 其余范围显式枚举班级,避免空集合被下游当成全量。 + return { mode: 'in', classIds: await classIdsFor(user, key) }; } - -/** 把 ClassScope 转换成 Prisma 的 where 片段(子表:classId 字段) */ export function classScopeWhere(scope: ClassScope): { classId?: { in: string[] } } { return scope.mode === 'all' ? {} : { classId: { in: scope.classIds } }; } - -/** Class 表自身的范围过滤:注意这里过滤的是主键 id,而不是子表的 classId */ export function classScopeIdFilter(scope: ClassScope): { id?: { in: string[] } } { return scope.mode === 'all' ? {} : { id: { in: scope.classIds } }; } - -/** 单班级场景:班级端强制取自己绑定的班级,其他角色沿用请求参数 */ export function resolveEffectiveClassId(user: TokenPayload, requestedClassId?: string): string | undefined { - if (isClassDevice(user)) return requireClassDeviceClassId(user); + if (isClassDevice(user)) { + const id = requireClassDeviceClassId(user); + if (requestedClassId && requestedClassId !== id) throw ApiError.forbidden('不能访问其他班级'); + return id; + } return requestedClassId; } diff --git a/packages/server/src/lib/authz/assert.ts b/packages/server/src/lib/authz/assert.ts new file mode 100644 index 0000000..b6850cc --- /dev/null +++ b/packages/server/src/lib/authz/assert.ts @@ -0,0 +1,104 @@ +import type { Prisma } from '../../generated/prisma/client.js'; +import { PERMISSION_LABELS, type PermissionKey } from '@classhelper/shared'; +import { prisma } from '../db.js'; +import { ApiError } from '../http.js'; +import type { TokenPayload } from '../jwt.js'; +import { loadAuthPrincipal } from './principal.js'; +import { assertClassInScope, hasOrganizationalGrant } from './scope.js'; +import { classDeviceClassId, isHead, isTeaching } from './relations.js'; + +export function assertAdmin(user: TokenPayload): void { + if (user.role !== 'ADMIN' || user.classSession) throw ApiError.forbidden('此操作仅限管理员'); +} +export async function assertPermission(user: TokenPayload, key: PermissionKey): Promise { + if (!(await loadAuthPrincipal(user)).permissions.has(key)) + throw ApiError.forbidden(`缺少「${PERMISSION_LABELS[key]}」权限`); +} +export async function assertAnyPermission(user: TokenPayload, keys: PermissionKey[]): Promise { + const auth = await loadAuthPrincipal(user); + if (!keys.some((key) => auth.permissions.has(key))) throw ApiError.forbidden('缺少此操作所需权限'); +} +export function assertClassDevice(user: TokenPayload, classId: string): void { + if (classDeviceClassId(user) !== classId) throw ApiError.forbidden('仅限绑定本班的班级端会话'); +} +export async function assertPermissionOrClassDevice(user: TokenPayload, key: PermissionKey): Promise { + if (user.role !== 'CLASS_DEVICE') await assertPermission(user, key); +} +export async function assertClassRead( + user: TokenPayload, + key: PermissionKey, + classId: string, + options: { allowClassDevice?: boolean; db?: Prisma.TransactionClient } = {}, +): Promise { + if (user.role === 'CLASS_DEVICE' && options.allowClassDevice) { + assertClassDevice(user, classId); + return; + } + await assertPermission(user, key); + await assertClassInScope(user, key, classId, options.db); +} +export async function assertHeadOnly( + user: TokenPayload, + key: PermissionKey, + classId: string, + db: Prisma.TransactionClient = prisma, +): Promise { + await assertClassRead(user, key, classId, { db }); + if (user.role !== 'ADMIN' && !(await isHead(user, classId, db))) + throw ApiError.forbidden('此操作仅限本班班主任或管理员'); +} +export async function assertManage( + user: TokenPayload, + key: PermissionKey, + classId: string, + db: Prisma.TransactionClient = prisma, +): Promise { + await assertClassRead(user, key, classId, { db }); + if ( + user.role !== 'ADMIN' && + !(await isHead(user, classId, db)) && + !(await hasOrganizationalGrant(user, key, classId, db)) + ) + throw ApiError.forbidden('此操作需要班主任关系或该功能的年级、部、全校范围'); +} +export async function assertContentWrite( + user: TokenPayload, + key: PermissionKey, + classId: string, + courseId: string | null | undefined, + action: string, + options: { allowClassDevice?: boolean; db?: Prisma.TransactionClient } = {}, +): Promise { + await assertClassRead(user, key, classId, options); + if (courseId) { + const course = await (options.db ?? prisma).course.findUnique({ where: { id: courseId } }); + if (!course || course.classId !== classId) throw ApiError.badRequest('课程不属于目标班级'); + if ( + user.role === 'ADMIN' || + (user.role === 'CLASS_DEVICE' && options.allowClassDevice) || + course.teacherId === user.sub + ) + return; + } else if ( + user.role === 'ADMIN' || + (user.role === 'CLASS_DEVICE' && options.allowClassDevice) || + (await isHead(user, classId, options.db)) + ) + return; + throw ApiError.forbidden(`只能${action}本人任教科目或班主任班未指定科目的内容`); +} +export async function assertPublish( + user: TokenPayload, + key: PermissionKey, + classId: string, + options: { allowClassDevice?: boolean; db?: Prisma.TransactionClient } = {}, +): Promise { + await assertClassRead(user, key, classId, options); + if ( + user.role === 'ADMIN' || + (user.role === 'CLASS_DEVICE' && options.allowClassDevice) || + (await isTeaching(user, classId, options.db)) + ) + return; + throw ApiError.forbidden('只有班主任或本班任课老师可以发布'); +} diff --git a/packages/server/src/lib/authz/index.ts b/packages/server/src/lib/authz/index.ts new file mode 100644 index 0000000..4857d2a --- /dev/null +++ b/packages/server/src/lib/authz/index.ts @@ -0,0 +1,4 @@ +export * from './principal.js'; +export * from './scope.js'; +export * from './relations.js'; +export * from './assert.js'; diff --git a/packages/server/src/lib/authz/principal.ts b/packages/server/src/lib/authz/principal.ts new file mode 100644 index 0000000..5b3f785 --- /dev/null +++ b/packages/server/src/lib/authz/principal.ts @@ -0,0 +1,99 @@ +import { + PERMISSION_KEYS, + PERMISSION_META, + parsePermissionScope, + type PermissionKey, + type PermissionScope, +} from '@classhelper/shared'; +import { prisma } from '../db.js'; +import type { TokenPayload } from '../jwt.js'; +import { ensureDefaultGroups } from '../permissions.js'; + +export interface Grant { + scope: PermissionScope; + scopeValue: string; + groupId: string; +} +export interface AuthPrincipal { + permissions: ReadonlySet; + grants: ReadonlyMap; + fromGroups: boolean; +} +export interface AssignmentRow { + groupId: string; + scope: string; + scopeValue: string; + group: { defaultRole: string | null; items: { key: string }[] }; +} +let requests = new WeakMap>(); + +export function invalidateAuthPrincipals() { + requests = new WeakMap(); +} + +/** 缓存仅附着于一个请求的主体;没有可变的“当前权限键”。 */ +export function loadAuthPrincipal(user: TokenPayload): Promise { + let principal = requests.get(user); + if (!principal) { + principal = load(user); + requests.set(user, principal); + } + return principal; +} + +async function load(user: TokenPayload): Promise { + if (user.role !== 'TEACHER') return principalForAssignments(user, []); + await ensureDefaultGroups(); + const assignments = await prisma.userPermissionGroup.findMany({ + where: { userId: user.sub }, + include: { group: { include: { items: true } } }, + }); + return principalForAssignments(user, assignments); +} + +/** 分配预览与运行时共用求值,不写数据库。 */ +export async function principalForAssignments( + user: TokenPayload, + assignments: AssignmentRow[], + defaultGroup?: AssignmentRow['group'] & { id: string }, +): Promise { + const permissions = new Set(); + const grants = new Map(); + if (user.role === 'CLASS_DEVICE' || user.classSession) return { permissions, grants, fromGroups: false }; + if (user.role === 'ADMIN') { + for (const key of PERMISSION_KEYS) { + permissions.add(key); + grants.set(key, [{ scope: 'ALL', scopeValue: '', groupId: '' }]); + } + return { permissions, grants, fromGroups: false }; + } + const fromGroups = assignments.length > 0; + if (!fromGroups) { + const group = + defaultGroup ?? + (await prisma.permissionGroup.findUnique({ + where: { defaultRole: 'TEACHER' }, + include: { items: true }, + })); + assignments = group ? [{ groupId: group.id, scope: 'TEACHING', scopeValue: '', group }] : []; + } + for (const assignment of assignments) { + if (assignment.group.defaultRole === 'ADMIN') continue; + for (const { key: raw } of assignment.group.items) { + if (!(PERMISSION_KEYS as readonly string[]).includes(raw)) continue; + const key = raw as PermissionKey; + if (PERMISSION_META[key].kind === 'admin') continue; + permissions.add(key); + try { + const parsed = parsePermissionScope(assignment.scope as PermissionScope, assignment.scopeValue); + grants.set(key, [ + ...(grants.get(key) ?? []), + { scope: parsed.scope, scopeValue: parsed.scopeValue, groupId: assignment.groupId }, + ]); + } catch { + /* 非法旧分配不授予班级。 */ + } + } + } + return { permissions, grants, fromGroups }; +} diff --git a/packages/server/src/lib/authz/relations.ts b/packages/server/src/lib/authz/relations.ts new file mode 100644 index 0000000..2fab91c --- /dev/null +++ b/packages/server/src/lib/authz/relations.ts @@ -0,0 +1,24 @@ +import type { Prisma } from '../../generated/prisma/client.js'; +import { prisma } from '../db.js'; +import type { TokenPayload } from '../jwt.js'; + +export function classDeviceClassId(user: TokenPayload): string | null { + return user.role === 'CLASS_DEVICE' && user.classSession ? (user.classId ?? user.sub) : null; +} +export async function isHead( + user: TokenPayload, + classId: string, + db: Prisma.TransactionClient = prisma, +): Promise { + return !!(await db.class.count({ where: { id: classId, teacherId: user.sub } })); +} +export async function isTeaching( + user: TokenPayload, + classId: string, + db: Prisma.TransactionClient = prisma, +): Promise { + return ( + (await isHead(user, classId, db)) || + !!(await db.course.count({ where: { classId, teacherId: user.sub } })) + ); +} diff --git a/packages/server/src/lib/authz/scope.ts b/packages/server/src/lib/authz/scope.ts new file mode 100644 index 0000000..a268cf3 --- /dev/null +++ b/packages/server/src/lib/authz/scope.ts @@ -0,0 +1,124 @@ +import { PERMISSION_META, parsePermissionScope, type PermissionKey } from '@classhelper/shared'; +import type { Prisma } from '../../generated/prisma/client.js'; +import { prisma } from '../db.js'; +import { ApiError } from '../http.js'; +import type { TokenPayload } from '../jwt.js'; +import { loadAuthPrincipal, type AuthPrincipal } from './principal.js'; + +/** 返回 Class 表过滤条件;无键、无授权、组织只读键均不产生班级集合。 */ +export async function classWhere( + user: TokenPayload, + key: PermissionKey, + principal?: AuthPrincipal, +): Promise { + if (!key) return { id: { in: [] } }; + const auth = principal ?? (await loadAuthPrincipal(user)); + if (!auth.permissions.has(key)) return { id: { in: [] } }; + if (user.role === 'ADMIN') return {}; + if (PERMISSION_META[key].kind !== 'class') return { id: { in: [] } }; + const alternatives: Prisma.ClassWhereInput[] = []; + for (const grant of auth.grants.get(key) ?? []) { + if (grant.scope === 'ALL') return PERMISSION_META[key].relation === 'head' ? { teacherId: user.sub } : {}; + if (grant.scope === 'HEAD') alternatives.push({ teacherId: user.sub }); + else if (grant.scope === 'TEACHING') + alternatives.push({ OR: [{ teacherId: user.sub }, { courses: { some: { teacherId: user.sub } } }] }); + else alternatives.push({ grade: { in: parsePermissionScope(grant.scope, grant.scopeValue).grades } }); + } + // 班主任专属键仍须满足分配范围与关系的交集。 + if (PERMISSION_META[key].relation === 'head') { + return { AND: [{ OR: alternatives }, { teacherId: user.sub }] }; + } + return { OR: alternatives }; +} + +export async function classIdsFor( + user: TokenPayload, + key: PermissionKey, + principal?: AuthPrincipal, + db: Prisma.TransactionClient = prisma, +): Promise { + const rows = await db.class.findMany({ + where: await classWhere(user, key, principal), + select: { id: true }, + }); + return rows.map((row) => row.id); +} +/** 名单、日课表、导入及考试配置的班级管理范围,供界面准确显示操作入口。 */ +export async function manageClassIdsFor( + user: TokenPayload, + key: PermissionKey, + principal: AuthPrincipal, +): Promise { + if (user.role === 'ADMIN') return classIdsFor(user, key, principal); + const grants = (principal.grants.get(key) ?? []).filter((g) => + ['GRADE', 'DIVISION', 'ALL'].includes(g.scope), + ); + const broad = await classWhere(user, key, { ...principal, grants: new Map([[key, grants]]) }); + const rows = await prisma.class.findMany({ + where: { AND: [await classWhere(user, key, principal), { OR: [{ teacherId: user.sub }, broad] }] }, + select: { id: true }, + }); + return rows.map((row) => row.id); +} +/** 每项输入都携带权限键;关系一次读取,输出仍逐键与各自授权范围求交。 */ +export async function actionScopesFor( + user: TokenPayload, + scopes: ReadonlyArray, + management: ReadonlyArray, +): Promise>> { + const result = { ...Object.fromEntries(scopes), ...Object.fromEntries(management) }; + const related = scopes.filter(([key]) => + ['subject', 'publish', 'creator'].includes(PERMISSION_META[key].relation), + ); + if (user.role === 'ADMIN' || !related.length) return result; + const rows = await prisma.class.findMany({ + where: { id: { in: [...new Set(related.flatMap(([, ids]) => [...ids]))] } }, + select: { + id: true, + teacherId: true, + courses: { where: { teacherId: user.sub }, select: { id: true }, take: 1 }, + notifications: { where: { createdBy: user.sub }, select: { id: true }, take: 1 }, + }, + }); + const relations = new Map(rows.map((row) => [row.id, row])); + for (const [key, ids] of related) { + const allowed = ids.filter((id) => { + const row = relations.get(id); + return ( + row && + (row.teacherId === user.sub || + (PERMISSION_META[key].relation === 'creator' + ? row.notifications.length > 0 + : row.courses.length > 0)) + ); + }); + // 成绩页还包含考试口径/查询开关,显式组织范围可维护这些配置。 + result[key] = + key === 'grade:write' + ? [...new Set([...allowed, ...(management.find(([k]) => k === key)?.[1] ?? [])])] + : allowed; + } + return result; +} +export async function assertClassInScope( + user: TokenPayload, + key: PermissionKey, + classId: string, + db: Prisma.TransactionClient = prisma, +): Promise { + if (!(await db.class.count({ where: { AND: [{ id: classId }, await classWhere(user, key)] } }))) + throw ApiError.forbidden('目标班级不在此功能的授权范围内'); +} +/** 管理动作只有显式年级/部/全校分配可越过班主任关系。 */ +export async function hasOrganizationalGrant( + user: TokenPayload, + key: PermissionKey, + classId?: string, + db: Prisma.TransactionClient = prisma, +): Promise { + if (user.role === 'ADMIN') return true; + const auth = await loadAuthPrincipal(user); + const grants = (auth.grants.get(key) ?? []).filter((g) => ['GRADE', 'DIVISION', 'ALL'].includes(g.scope)); + if (!classId) return grants.some((g) => g.scope === 'ALL'); + return (await classIdsFor(user, key, { ...auth, grants: new Map([[key, grants]]) }, db)).includes(classId); +} diff --git a/packages/server/src/lib/authz/session.ts b/packages/server/src/lib/authz/session.ts new file mode 100644 index 0000000..5ffa62b --- /dev/null +++ b/packages/server/src/lib/authz/session.ts @@ -0,0 +1,23 @@ +import type { UserRole } from '@classhelper/shared'; +import { prisma } from '../db.js'; +import { ApiError } from '../http.js'; +import type { TokenPayload } from '../jwt.js'; +export async function loadSessionUser(payload: TokenPayload): Promise { + if (payload.classSession && payload.role === 'CLASS_DEVICE') { + const cls = await prisma.class.findUnique({ where: { id: payload.classId ?? payload.sub } }); + if (!cls || cls.archivedYearId) throw ApiError.unauthorized('班级不存在或已归档'); + return { + sub: cls.id, + username: cls.code, + name: cls.name, + role: 'CLASS_DEVICE', + classId: cls.id, + classSession: true, + classCode: cls.code, + }; + } + if (payload.role === 'CLASS_DEVICE') throw ApiError.unauthorized('无效班级会话'); + const row = await prisma.user.findUnique({ where: { id: payload.sub } }); + if (!row || !['ADMIN', 'TEACHER'].includes(row.role)) throw ApiError.unauthorized('账号不存在'); + return { sub: row.id, username: row.username, name: row.name, role: row.role as UserRole, classId: null }; +} diff --git a/packages/server/src/lib/permission-scope.ts b/packages/server/src/lib/permission-scope.ts deleted file mode 100644 index f3c7845..0000000 --- a/packages/server/src/lib/permission-scope.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { prisma } from './db.js'; -import type { TokenPayload } from './jwt.js'; -import type { Prisma } from '../generated/prisma/client.js'; -import { parsePermissionScope, type PermissionScope, type PermissionKey } from '@classhelper/shared'; -import { currentRequestPermission } from './permissions.js'; - -/** 范围与功能键正交;显式分组覆盖角色默认,不在范围内一律不放行。 */ -export async function teacherScopeWhere( - user: TokenPayload, - permission?: PermissionKey, -): Promise { - permission ??= currentRequestPermission(user); - const assignments = await prisma.userPermissionGroup.findMany({ - where: { userId: user.sub }, - include: { group: { include: { items: true } } }, - }); - const own = { OR: [{ teacherId: user.sub }, { courses: { some: { teacherId: user.sub } } }] }; - const groups = assignments.length - ? assignments.map(({ group }) => group) - : await prisma.permissionGroup.findMany({ where: { defaultRole: user.role }, include: { items: true } }); - const alternatives: Prisma.ClassWhereInput[] = []; - for (const group of groups) { - if (permission && !group.items.some((item) => item.key === permission)) continue; - try { - const parsed = parsePermissionScope(group.scope as PermissionScope, group.scopeValue); - if (parsed.scope === 'ALL') return {}; - if (parsed.scope === 'SELF_CLASS') - alternatives.push(parsed.scopeValue === 'HEAD' ? { teacherId: user.sub } : own); - else alternatives.push({ grade: { in: parsed.grades } }); - } catch { - /* 旧岗位组未配置或范围非法时不授予任何班级。 */ - } - } - return { OR: alternatives }; -} - -export async function hasAllScope(user: TokenPayload, permission: PermissionKey) { - if (user.role === 'ADMIN') return true; - const links = await prisma.userPermissionGroup.findMany({ - where: { userId: user.sub }, - select: { groupId: true }, - }); - return ( - (await prisma.permissionGroup.count({ - where: { - ...(links.length ? { id: { in: links.map((link) => link.groupId) } } : { defaultRole: user.role }), - scope: 'ALL', - items: { some: { key: permission } }, - }, - })) > 0 - ); -} diff --git a/packages/server/src/lib/permissions.ts b/packages/server/src/lib/permissions.ts index 5ac2406..4bf80d4 100644 --- a/packages/server/src/lib/permissions.ts +++ b/packages/server/src/lib/permissions.ts @@ -1,94 +1,11 @@ import { BUILTIN_TEACHER_GROUPS, - PERMISSION_KEYS, PERMISSION_LABELS, ROLE_DEFAULT_PERMISSIONS, - defaultPermissionsForRole, type PermissionKey, } from '@classhelper/shared'; import { prisma } from './db.js'; import type { TokenPayload } from './jwt.js'; -import { ApiError } from './http.js'; - -// 仅复用当前请求对象上的权限,绝不跨请求缓存。 -const requestPermissions = new WeakMap>(); -const requestPermission = new WeakMap(); -export function bindRequestPermission(user: TokenPayload, key: PermissionKey) { - requestPermission.set(user, key); -} -export function currentRequestPermission(user: TokenPayload) { - return requestPermission.get(user); -} -export function bindRequestPermissions(user: TokenPayload, permissions: ReadonlySet) { - requestPermissions.set(user, permissions); -} -export async function hasEffectivePermission(user: TokenPayload, key: PermissionKey) { - return (requestPermissions.get(user) ?? (await loadEffectivePermissions(user))).has(key); -} -export async function assertPermission(user: TokenPayload, key: PermissionKey): Promise { - if (!(await hasEffectivePermission(user, key))) - throw ApiError.forbidden(`缺少「${PERMISSION_LABELS[key]}」权限`); - bindRequestPermission(user, key); -} -export async function assertAnyPermission(user: TokenPayload, keys: PermissionKey[]): Promise { - const permissions = requestPermissions.get(user) ?? (await loadEffectivePermissions(user)); - if (!keys.some((key) => permissions.has(key))) throw ApiError.forbidden('缺少该操作所需权限'); - const matched = keys.find((key) => permissions.has(key)); - if (matched) bindRequestPermission(user, matched); -} -export async function assertStaffPermission(user: TokenPayload, key: PermissionKey): Promise { - if (user.role !== 'CLASS_DEVICE') await assertPermission(user, key); -} - -/** - * 生效权限集合的**唯一加载入口**(权限组功能的全部运行时逻辑都收在这里)。 - * - * 语义(与 shared 的 `PERMISSION_DEFAULT_ROLES` 一一对应): - * - `ADMIN`:按权限组计算,另外**永远**保留 {@link ADMIN_UNREMOVABLE_PERMISSIONS},避免管理员 - * 把自己(或最后一个管理员)锁在权限页之外; - * - `CLASS_DEVICE`(ClassHelper 班级端):**空集,且不受权限组影响** —— 班级端的会话主体是 - * 班级而非账号,它的能力由班级维度断言(`canManageSubjectContent(..., { allowClassDevice })` - * 等)决定,给某个班级端"分配权限组"没有意义; - * - 其他账号:**有分组**时取这些组的键并集(因此可以比默认更少 ⇒ 也能用来收回权限); - * **没有任何分组**时使用数据库中可编辑的角色默认组(逐条镜像权限组上线前各路由的 `requireRole`)。 - * - * 每次请求实时查询(不缓存):权限改动**立即生效**,代价是每请求多一条 `findMany` - * (账号规模很小,这个代价换"改了立刻生效"是值的)。 - */ -export async function loadEffectivePermissions(user: TokenPayload): Promise> { - const permissions = new Set(); - - if (user.classSession || user.role === 'CLASS_DEVICE') return permissions; - - await ensureDefaultGroups(); - - const assignments = await prisma.userPermissionGroup.findMany({ - where: { userId: user.sub }, - select: { group: { select: { items: { select: { key: true } } } } }, - }); - - if (assignments.length === 0) { - const group = await prisma.permissionGroup.findUnique({ - where: { defaultRole: user.role }, - include: { items: true }, - }); - for (const key of group ? group.items.map((item) => item.key) : defaultPermissionsForRole(user.role)) { - if ((PERMISSION_KEYS as readonly string[]).includes(key)) permissions.add(key as PermissionKey); - } - if (user.role === 'ADMIN') for (const key of ADMIN_UNREMOVABLE_PERMISSIONS) permissions.add(key); - return permissions; - } - - const known = new Set(PERMISSION_KEYS); - for (const assignment of assignments) { - for (const item of assignment.group.items) { - // 库里可能留着已下线的键(旧版本写入的),这里静默忽略,避免整账号权限异常 - if (known.has(item.key)) permissions.add(item.key as PermissionKey); - } - } - if (user.role === 'ADMIN') for (const key of ADMIN_UNREMOVABLE_PERMISSIONS) permissions.add(key); - return permissions; -} /** 首次升级创建默认组;后续启动保留管理员的编辑结果(包括空权限组)。 */ let defaultGroupsReady: Promise | null = null; @@ -114,10 +31,10 @@ async function createDefaultGroups(): Promise { }, }); } - for (const role of ['ADMIN', 'TEACHER'] as const) { + for (const role of ['TEACHER'] as const) { if (await prisma.permissionGroup.findUnique({ where: { defaultRole: role }, select: { id: true } })) continue; - const baseName = `${role === 'ADMIN' ? '管理员' : '教师'}默认权限`; + const baseName = '教师默认权限'; let name = baseName; let suffix = 1; // 旧库可能已有同名自定义组,保留它并为角色默认组选一个不冲突的名称。 @@ -132,18 +49,22 @@ async function createDefaultGroups(): Promise { defaultRole: role, name, builtin: true, - scope: role === 'ADMIN' ? 'ALL' : 'SELF_CLASS', - description: '未分配其他权限组时自动生效;可调整权限。管理员始终保留权限与系统管理入口。', + scope: 'TEACHING', + description: '未显式分配时使用此模板与固定任教班级范围。', items: { create: ROLE_DEFAULT_PERMISSIONS[role].map((key) => ({ key })) }, }, }); } } -/** 管理员不可被剥夺的权限键(防锁死) */ -export const ADMIN_UNREMOVABLE_PERMISSIONS: readonly PermissionKey[] = ['permission:manage', 'system:manage']; - /** 把权限键翻译成中文提示(403 文案与权限页共用) */ export function permissionLabel(key: PermissionKey): string { return PERMISSION_LABELS[key]; } + +export { loadAuthPrincipal } from './authz/principal.js'; +export { assertPermission, assertAnyPermission, assertPermissionOrClassDevice } from './authz/assert.js'; +import { loadAuthPrincipal } from './authz/principal.js'; +export async function hasEffectivePermission(user: TokenPayload, key: PermissionKey) { + return (await loadAuthPrincipal(user)).permissions.has(key); +} diff --git a/packages/server/src/lib/snapshot.ts b/packages/server/src/lib/snapshot.ts index 4c5adf1..c9efabe 100644 --- a/packages/server/src/lib/snapshot.ts +++ b/packages/server/src/lib/snapshot.ts @@ -1,3 +1,6 @@ +import { refreshClassSubscriptions } from '../realtime/bus.js'; +import { invalidateAuthPrincipals } from './authz/principal.js'; +import { migratePermissionScope } from '@classhelper/shared'; import type { PrismaClient } from '../generated/prisma/client.js'; import type { DatabaseProvider } from './db.js'; @@ -183,6 +186,24 @@ export async function restoreSnapshot( } for (const table of SNAPSHOT_TABLES) { const rows = (snapshot.data[table] ?? []).map((row) => { + if (table === 'PermissionGroup') { + const mapped = migratePermissionScope( + String(row.scope ?? 'TEACHING'), + String(row.scopeValue ?? ''), + ); + return { + ...row, + ...mapped, + ...(row.defaultRole === 'TEACHER' ? { scope: 'TEACHING', scopeValue: '' } : {}), + }; + } + if (table === 'UserPermissionGroup' && row.scope === undefined) { + const group = snapshot.data.PermissionGroup.find((g) => g.id === row.groupId); + return { + ...row, + ...migratePermissionScope(String(group?.scope ?? 'TEACHING'), String(group?.scopeValue ?? '')), + }; + } if (table === 'StudentClassTransfer') { const { mode, ...rest } = row; return { @@ -209,6 +230,8 @@ export async function restoreSnapshot( } finally { await setForeignKeys(prisma, provider, true).catch(() => undefined); } + invalidateAuthPrincipals(); + refreshClassSubscriptions(); return { counts }; } diff --git a/packages/server/src/lib/student-lifecycle.ts b/packages/server/src/lib/student-lifecycle.ts index 1466515..c76cf19 100644 --- a/packages/server/src/lib/student-lifecycle.ts +++ b/packages/server/src/lib/student-lifecycle.ts @@ -1,3 +1,4 @@ +import type { Prisma } from '../generated/prisma/client.js'; import { randomUUID } from 'node:crypto'; import { currentAcademicYearStart, SOCKET_EVENTS, type StudentLifecycleKind } from '@classhelper/shared'; import { prisma } from './db.js'; @@ -31,17 +32,20 @@ export async function changeStudentLifecycle( status?: 'active' | 'inactive'; }; }, + transaction?: Prisma.TransactionClient, ) { const batchId = randomUUID(); const ids = [...new Set(input.studentIds)]; - const existing = ids.length ? await prisma.student.findMany({ where: { id: { in: ids } } }) : []; + const existing = ids.length + ? await (transaction ?? prisma).student.findMany({ where: { id: { in: ids } } }) + : []; if (existing.length !== ids.length) throw ApiError.notFound('部分学生不存在,请刷新后重试'); for (const cls of new Set(existing.map((student) => student.classId))) - await assertCanManageRoster(user, cls ?? undefined); - if (input.toClassId) await assertCanManageRoster(user, input.toClassId); - else if (!existing.length) await assertCanManageRoster(user); + await assertCanManageRoster(user, cls ?? undefined, transaction); + if (input.toClassId) await assertCanManageRoster(user, input.toClassId, transaction); + else if (!existing.length) await assertCanManageRoster(user, undefined, transaction); const changedClasses: (string | null)[] = []; - const result = await prisma.$transaction(async (tx) => { + const work = async (tx: Prisma.TransactionClient) => { const target = input.toClassId ? await tx.class.findUnique({ where: { id: input.toClassId } }) : null; if (input.toClassId && !target) throw ApiError.badRequest('目标班级不存在'); if (target?.archivedYearId) throw ApiError.conflict('目标班级已归档,不能调入'); @@ -160,7 +164,8 @@ export async function changeStudentLifecycle( transfers: records.map(toStudentTransferDto), studentId: students[0].id, }; - }); - notifyStudentClasses(changedClasses); + }; + const result = transaction ? await work(transaction) : await prisma.$transaction(work); + if (!transaction) notifyStudentClasses(changedClasses); return result; } diff --git a/packages/server/src/middleware/auth.ts b/packages/server/src/middleware/auth.ts index 3af5fd1..fccd978 100644 --- a/packages/server/src/middleware/auth.ts +++ b/packages/server/src/middleware/auth.ts @@ -1,13 +1,9 @@ import type { Request, RequestHandler } from 'express'; import type { PermissionKey, UserRole } from '@classhelper/shared'; import { PERMISSION_LABELS } from '@classhelper/shared'; -import { prisma } from '../lib/db.js'; import { ApiError } from '../lib/http.js'; -import { - bindRequestPermission, - bindRequestPermissions, - loadEffectivePermissions, -} from '../lib/permissions.js'; +import { loadAuthPrincipal } from '../lib/authz/index.js'; +import { loadSessionUser } from '../lib/authz/session.js'; import { extractBearerToken, verifyToken, type TokenPayload } from '../lib/jwt.js'; /** @@ -25,44 +21,8 @@ export function authenticate(): RequestHandler { const payload = verifyToken(token); - // ClassHelper 班级端:主体是**班级**而不是某个账号,回查 Class 表 - if (payload.classSession) { - const record = await prisma.class.findUnique({ - where: { id: payload.classId ?? payload.sub }, - select: { id: true, name: true, code: true }, - }); - if (!record) throw ApiError.unauthorized('班级不存在或已被删除'); - - const user: TokenPayload = { - sub: record.id, - username: record.code, - name: record.name, - role: 'CLASS_DEVICE', - classId: record.id, - classSession: true, - classCode: record.code, - }; - req.auth = { token, user, permissions: await loadEffectivePermissions(user) }; - next(); - return; - } - - // 账号(教师 / 管理员):`User` 是纯账号表,学生不在里面 - const user = await prisma.user.findUnique({ - where: { id: payload.sub }, - select: { id: true, username: true, name: true, role: true }, - }); - if (!user) throw ApiError.unauthorized('账号不存在或已被删除'); - - const authUser: TokenPayload = { - sub: user.id, - username: user.username, - name: user.name, - role: user.role as UserRole, - classId: null, - }; - req.auth = { token, user: authUser, permissions: await loadEffectivePermissions(authUser) }; - bindRequestPermissions(authUser, req.auth.permissions!); + const user = await loadSessionUser(payload); + req.auth = { token, user, permissions: (await loadAuthPrincipal(user)).permissions }; next(); } catch (error) { next(error); @@ -89,7 +49,7 @@ export function requireRole(...roles: UserRole[]): RequestHandler { /** * 权限守卫:要求当前登录主体拥有**全部**列出的权限键。 * - * 权限集合来自 {@link loadEffectivePermissions}(权限组并集,或角色默认模板)。 + * 权限集合来自 {@link loadAuthPrincipal}(管理员全集,或教师模板与分配)。 * 提示文案用中文权限名,用户看到的是"缺少「导入成绩」权限"而不是一堆键名。 */ export function requirePermission(...keys: PermissionKey[]): RequestHandler { @@ -105,13 +65,12 @@ export function requirePermission(...keys: PermissionKey[]): RequestHandler { next(ApiError.forbidden(`当前账号缺少${labels}权限,请联系管理员在「权限组」里分配`)); return; } - if (keys[0]) bindRequestPermission(req.auth.user, keys[0]); next(); }; } /** 班级端按班级范围开放读取;教师/管理员仍按可编辑的功能权限校验。 */ -export function requireStaffPermission(...keys: PermissionKey[]): RequestHandler { +export function requirePermissionOrClassDevice(...keys: PermissionKey[]): RequestHandler { const guard = requirePermission(...keys); return (req, res, next) => { if (req.auth?.user.role === 'CLASS_DEVICE') return next(); @@ -139,8 +98,6 @@ export function requireAnyPermission(...keys: PermissionKey[]): RequestHandler { ); return; } - const matched = keys.find((key) => permissions.has(key)); - if (matched) bindRequestPermission(req.auth.user, matched); next(); }; } @@ -161,3 +118,5 @@ export function getAuthPermissions(req: Request): ReadonlySet { export function hasAuthPermission(req: Request, key: PermissionKey): boolean { return (req.auth?.permissions ?? new Set()).has(key); } + +export const requireAdmin = (): RequestHandler => requireRole('ADMIN'); diff --git a/packages/server/src/middleware/validate.ts b/packages/server/src/middleware/validate.ts index e25e37d..99c2718 100644 --- a/packages/server/src/middleware/validate.ts +++ b/packages/server/src/middleware/validate.ts @@ -1,5 +1,6 @@ import type { Request, RequestHandler } from 'express'; -import type { ZodType } from 'zod'; +import { ZodError, type ZodType } from 'zod'; +import { ApiError } from '../lib/http.js'; interface ValidationTargets { body?: ZodType; @@ -14,6 +15,7 @@ interface ValidationTargets { */ export function validate( targets: ValidationTargets, + errorStatus: 400 | 422 = 422, ): RequestHandler { return (req, _res, next) => { try { @@ -22,11 +24,21 @@ export function validate( if (targets.params) req.validatedParams = targets.params.parse(req.params) as unknown; next(); } catch (error) { - next(error); + next( + errorStatus === 400 && error instanceof ZodError + ? ApiError.badRequest('请求参数不合法', error.issues) + : error, + ); } }; } +export function validateBadRequest( + targets: ValidationTargets, +): RequestHandler { + return validate(targets, 400); +} + /** 读取已校验的 query(类型由调用方用 zod schema 保证) */ /** 取出校验后的请求体(与 validatedQuery/validatedParams 同一套约定) */ export function validatedBody(req: Request): T { diff --git a/packages/server/src/modules/ai/ai.service.ts b/packages/server/src/modules/ai/ai.service.ts index 6a46f59..16a8f51 100644 --- a/packages/server/src/modules/ai/ai.service.ts +++ b/packages/server/src/modules/ai/ai.service.ts @@ -1,3 +1,5 @@ +import type { PermissionKey } from '@classhelper/shared'; +import { assertAdmin, assertPermission, classIdsFor } from '../../lib/authz/index.js'; import { activeStudentWhere } from '../../lib/students.js'; import { dayKeyLocal, @@ -84,6 +86,7 @@ export async function updateAiSettings( user: TokenPayload, input: UpdateAiSettingsInput, ): Promise { + assertAdmin(user); if (input.enabled !== undefined) await setSetting(SETTING_KEYS.aiEnabled, input.enabled ? 'true' : 'false'); if (input.provider !== undefined) await setSetting(SETTING_KEYS.aiProvider, input.provider); if (input.baseUrl !== undefined) await setSetting(SETTING_KEYS.aiBaseUrl, input.baseUrl.trim()); @@ -105,17 +108,33 @@ interface AssistantContext { } async function resolveContext(user: TokenPayload, classId?: string): Promise { - if (classId) await assertClassAccess(user, classId); - const classIds = await getAccessibleClassIds(user); + if (classId) await assertClassAccess(user, classId, 'ai:use'); + await assertPermission(user, 'ai:use'); + const candidates = new Set( + ( + await Promise.all( + ['notification:publish', 'homework:write', 'call:create'].map((key) => + classIdsFor(user, key as PermissionKey), + ), + ) + ).flat(), + ); + const classIds = (await getAccessibleClassIds(user, 'ai:use')).filter((id) => candidates.has(id)); const classes = await prisma.class.findMany({ - where: { id: { in: classIds } }, + where: { + id: { in: classIds }, + ...(user.role !== 'ADMIN' + ? { OR: [{ teacherId: user.sub }, { courses: { some: { teacherId: user.sub } } }] } + : {}), + }, select: { id: true, name: true }, orderBy: { name: 'asc' }, take: 80, }); - const courses = classId - ? await prisma.course.findMany({ where: { classId }, select: { id: true, name: true } }) - : []; + const courses = + classId && classIds.includes(classId) + ? await prisma.course.findMany({ where: { classId }, select: { id: true, name: true } }) + : []; return { classes, courses }; } @@ -345,7 +364,7 @@ export async function interpret(user: TokenPayload, input: AiInterpretInput): Pr } if (typeof params.classId === 'string') { - await assertClassAccess(user, params.classId); + await assertClassAccess(user, params.classId, 'ai:use'); if (typeof params.courseId === 'string') { const course = await prisma.course.findFirst({ where: { id: params.courseId, classId: params.classId }, diff --git a/packages/server/src/modules/archives/archives.module.ts b/packages/server/src/modules/archives/archives.module.ts index 6f691e3..5c96cfb 100644 --- a/packages/server/src/modules/archives/archives.module.ts +++ b/packages/server/src/modules/archives/archives.module.ts @@ -1,3 +1,4 @@ +import { requireAdmin } from '../../middleware/auth.js'; import { restoreStudentSchema } from '../students/students.schemas.js'; import { listTransferred, restoreTransferred } from './transferred.service.js'; import { Router } from 'express'; @@ -15,7 +16,7 @@ import { import * as archiveService from './archives.service.js'; const router = Router(); -router.use(authenticate()); +router.use(authenticate(), requireAdmin()); router.get('/transferred', requirePermission('archive:manage'), async (req, res) => sendOk(res, await listTransferred(getAuthUser(req))), ); diff --git a/packages/server/src/modules/calls/calls.module.ts b/packages/server/src/modules/calls/calls.module.ts index 9cb57f5..0f19668 100644 --- a/packages/server/src/modules/calls/calls.module.ts +++ b/packages/server/src/modules/calls/calls.module.ts @@ -1,6 +1,6 @@ import { Router } from 'express'; import { sendCreated } from '../../lib/http.js'; -import { authenticate, getAuthUser, requireStaffPermission } from '../../middleware/auth.js'; +import { authenticate, getAuthUser, requirePermissionOrClassDevice } from '../../middleware/auth.js'; import { validate } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; import { createCallSchema, type CreateCallInput } from './calls.schemas.js'; @@ -15,7 +15,7 @@ router.use(authenticate()); */ router.post( '/', - requireStaffPermission('call:create'), + requirePermissionOrClassDevice('call:create'), validate({ body: createCallSchema }), async (req, res) => { const user = getAuthUser(req); diff --git a/packages/server/src/modules/calls/calls.service.ts b/packages/server/src/modules/calls/calls.service.ts index 3135346..13c3a24 100644 --- a/packages/server/src/modules/calls/calls.service.ts +++ b/packages/server/src/modules/calls/calls.service.ts @@ -1,7 +1,7 @@ -import { assertStaffPermission } from '../../lib/permissions.js'; +import { assertPublish } from '../../lib/authz/index.js'; +import { assertPermissionOrClassDevice } from '../../lib/permissions.js'; import { resolveContentCreator } from '../../lib/access.js'; import { SOCKET_EVENTS, buildCallTitle, dayKeyLocal, type NotificationDto } from '@classhelper/shared'; -import { assertCanPublishNotification } from '../../lib/access.js'; import { isActiveStudent } from '../../lib/students.js'; import { prisma } from '../../lib/db.js'; import { ApiError } from '../../lib/http.js'; @@ -29,8 +29,8 @@ const creatorSelect = { select: { id: true, name: true, username: true } } as co * 全班都看得到在叫谁,这与需求「教室机器代全班」一致。 */ export async function createCall(user: TokenPayload, input: CreateCallInput): Promise { - await assertStaffPermission(user, 'call:create'); - await assertCanPublishNotification(user, input.classId); + await assertPermissionOrClassDevice(user, 'call:create'); + await assertPublish(user, 'call:create', input.classId, { allowClassDevice: true }); const student = await prisma.student.findUnique({ where: { id: input.studentId }, diff --git a/packages/server/src/modules/class-plans/class-plans.module.ts b/packages/server/src/modules/class-plans/class-plans.module.ts index cc9a772..638c7c2 100644 --- a/packages/server/src/modules/class-plans/class-plans.module.ts +++ b/packages/server/src/modules/class-plans/class-plans.module.ts @@ -9,8 +9,9 @@ import { idParamSchema } from '../../lib/schemas.js'; import { authenticate, getAuthUser, - requireStaffPermission, + requirePermissionOrClassDevice, requirePermission, + requireAnyPermission, } from '../../middleware/auth.js'; import { validate, validatedQuery } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; @@ -21,7 +22,7 @@ const layouts = Router(); layouts.use(authenticate()); layouts.get( '/', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: schemas.scopeQuery }), async (req, res) => sendOk( @@ -31,26 +32,27 @@ layouts.get( ); layouts.post( '/', - requirePermission('timetable:manage'), + requireAnyPermission('timetable:manage', 'schedule:write'), validate({ body: schemas.layoutSchema }), - async (req, res) => sendCreated(res, await service.saveLayout(req.body)), + async (req, res) => sendCreated(res, await service.saveLayout(getAuthUser(req), req.body)), ); layouts.put( '/:id', - requirePermission('timetable:manage'), + requireAnyPermission('timetable:manage', 'schedule:write'), validate({ params: idParamSchema, body: schemas.layoutSchema }), - async (req, res) => sendOk(res, await service.saveLayout(req.body, String(req.params.id))), + async (req, res) => + sendOk(res, await service.saveLayout(getAuthUser(req), req.body, String(req.params.id))), ); layouts.post( '/:id/clone', - requirePermission('timetable:manage'), + requireAnyPermission('timetable:manage', 'schedule:write'), validate({ params: idParamSchema, body: schemas.cloneSchema }), async (req, res) => { const current = (await service.listLayouts(getAuthUser(req))).find((p) => p.id === req.params.id); if (!current) throw ApiError.notFound('时间表不存在'); sendCreated( res, - await service.saveLayout({ + await service.saveLayout(getAuthUser(req), { ...current, name: req.body.name || `${current.name} 副本`, points: current.points.map((p) => ({ ...p, id: undefined, timeType: p.timeType as 'LESSON' })), @@ -60,7 +62,7 @@ layouts.post( ); layouts.post( '/:id/import', - requirePermission('timetable:manage'), + requireAnyPermission('timetable:manage', 'schedule:write'), validate({ params: idParamSchema, body: schemas.importLayoutSchema }), async (req, res) => { const all = await service.listLayouts(getAuthUser(req)); @@ -70,6 +72,7 @@ layouts.post( sendOk( res, await service.saveLayout( + getAuthUser(req), { ...target, points: source.points.map((p) => ({ ...p, id: undefined, timeType: p.timeType as 'LESSON' })), @@ -81,21 +84,21 @@ layouts.post( ); layouts.post( '/:id/points/:pointId/apply-default', - requirePermission('timetable:manage'), + requireAnyPermission('timetable:manage', 'schedule:write'), validate({ params: z.object({ id: z.string().min(1), pointId: z.string().min(1) }) }), async (req, res) => - sendOk(res, await service.applyDefaultCourse(String(req.params.id), String(req.params.pointId))), + sendOk( + res, + await service.applyDefaultCourse(getAuthUser(req), String(req.params.id), String(req.params.pointId)), + ), ); layouts.delete( '/:id', - requirePermission('timetable:manage'), + requireAnyPermission('timetable:manage', 'schedule:write'), validate({ params: idParamSchema }), async (req, res) => { const id = String(req.params.id); - if (await prisma.classPlan.count({ where: { timeLayoutId: id } })) - throw ApiError.conflict('仍有课表使用该时间表'); - await prisma.timeLayout.delete({ where: { id } }); - await service.notifyScheduleChanged(); + await service.deleteLayout(getAuthUser(req), id); sendOk(res, { id }); }, ); @@ -104,7 +107,7 @@ const plans = Router(); plans.use(authenticate()); plans.get( '/profile', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: z.object({ classId: z.string().min(1) }) }), async (req, res) => sendOk(res, await exportProfile(getAuthUser(req), validatedQuery<{ classId: string }>(req).classId)), @@ -127,7 +130,7 @@ plans.post( ); plans.get( '/', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: schemas.scopeQuery }), async (req, res) => { const q = validatedQuery<{ classId?: string; week?: number }>(req); @@ -175,7 +178,7 @@ plans.post( ); plans.get( '/:id/export', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ params: idParamSchema }), async (req, res) => { const p = await service.requirePlan(getAuthUser(req), String(req.params.id), false); @@ -207,22 +210,22 @@ const groups = Router(); groups.use(authenticate()); groups.get( '/selection', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: z.object({ classId: z.string().min(1) }) }), async (req, res) => { const { classId } = validatedQuery<{ classId: string }>(req); - await assertClassAccess(getAuthUser(req), classId); + await assertClassAccess(getAuthUser(req), classId, 'schedule:read'); const value = await prisma.appSetting.findUnique({ where: { key: `schedule.group.${classId}` } }); sendOk(res, value ? JSON.parse(value.value) : {}); }, ); groups.get( '/', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: z.object({ classId: z.string().min(1) }) }), async (req, res) => { const { classId } = validatedQuery<{ classId: string }>(req); - await assertClassAccess(getAuthUser(req), classId); + await assertClassAccess(getAuthUser(req), classId, 'schedule:read'); sendOk(res, await prisma.classPlanGroup.findMany({ where: { classId } })); }, ); diff --git a/packages/server/src/modules/class-plans/class-plans.service.ts b/packages/server/src/modules/class-plans/class-plans.service.ts index 39b5ebf..bda25b5 100644 --- a/packages/server/src/modules/class-plans/class-plans.service.ts +++ b/packages/server/src/modules/class-plans/class-plans.service.ts @@ -1,3 +1,4 @@ +import { assertAdmin, assertHeadOnly, assertPermissionOrClassDevice } from '../../lib/authz/index.js'; import { SOCKET_EVENTS } from '@classhelper/shared'; import { prisma } from '../../lib/db.js'; import { assertCanManageSchedule, assertClassAccess, getAccessibleClassIds } from '../../lib/access.js'; @@ -24,20 +25,24 @@ export async function notifyScheduleChanged(classId?: string | null) { for (const id of ids) emitToClass(id, SOCKET_EVENTS.scheduleUpdated, { classId: id, action: 'updated' }); } export async function listLayouts(user: TokenPayload, classId?: string) { - if (classId) await assertClassAccess(user, classId); - const ids = classId ? [classId] : await getAccessibleClassIds(user); + await assertPermissionOrClassDevice(user, 'schedule:read'); + if (classId) await assertClassAccess(user, classId, 'schedule:read'); + const ids = classId ? [classId] : await getAccessibleClassIds(user, 'schedule:read'); const rows = await prisma.timeLayout.findMany({ where: { OR: [{ classId: null }, { classId: { in: ids } }] }, include: { points: { orderBy: { position: 'asc' } } }, }); return Promise.all(rows.map((row) => decorateLayout(row))); } -export async function saveLayout(input: z.infer, id?: string) { +export async function saveLayout(user: TokenPayload, input: z.infer, id?: string) { const existing = id ? await prisma.timeLayout.findUnique({ where: { id }, select: { classId: true } }) : null; if (id && !existing) throw ApiError.notFound('时间表不存在'); const layoutClassId = existing ? existing.classId : (input.classId ?? null); + await assertLayoutWrite(user, layoutClassId, id); + if (existing && input.classId !== undefined && input.classId !== existing.classId) + throw ApiError.forbidden('不能移动时间表到其他班级'); // 默认课程属于具体班级:全校时间表不保留默认课程,非上课时间点也不保留。 const points = input.points.map((point) => ({ ...point, @@ -83,12 +88,13 @@ export async function saveLayout(input: z.infer, id?: strin * 把时间点的默认课程写入所有引用该时间表的日课表(ClassIsland 的「覆盖现有课程」)。 * 只处理班级时间表:全校时间表的默认课程没有归属班级。 */ -export async function applyDefaultCourse(layoutId: string, pointId: string) { +export async function applyDefaultCourse(user: TokenPayload, layoutId: string, pointId: string) { const layout = await prisma.timeLayout.findUnique({ where: { id: layoutId }, include: { points: true }, }); if (!layout) throw ApiError.notFound('时间表不存在'); + await assertLayoutWrite(user, layout.classId, layout.id); if (!layout.classId) throw ApiError.badRequest('全校时间表不能覆盖默认课程'); const point = layout.points.find((p) => p.id === pointId); if (!point || point.timeType !== 'LESSON') throw ApiError.badRequest('时间点不是上课时间点'); @@ -121,10 +127,11 @@ export async function applyDefaultCourse(layoutId: string, pointId: string) { return { plans: plans.length }; } export async function listPlans(user: TokenPayload, classId?: string, week?: number) { - if (classId) await assertClassAccess(user, classId); + await assertPermissionOrClassDevice(user, 'schedule:read'); + if (classId) await assertClassAccess(user, classId, 'schedule:read'); return prisma.classPlan.findMany({ where: { - classId: { in: classId ? [classId] : await getAccessibleClassIds(user) }, + classId: { in: classId ? [classId] : await getAccessibleClassIds(user, 'schedule:read') }, ...(week ? { weekStart: { lte: week }, weekEnd: { gte: week } } : {}), }, include: planInclude, @@ -134,7 +141,8 @@ export async function listPlans(user: TokenPayload, classId?: string, week?: num export async function requirePlan(user: TokenPayload, id: string, write = true) { const p = await prisma.classPlan.findUnique({ where: { id }, include: planInclude }); if (!p) throw ApiError.notFound('课表不存在'); - await (write ? assertCanManageSchedule : assertClassAccess)(user, p.classId); + if (write) await assertCanManageSchedule(user, p.classId); + else await assertClassAccess(user, p.classId, 'schedule:read'); return p; } export async function savePlan(user: TokenPayload, input: z.infer, id?: string) { @@ -285,3 +293,24 @@ export async function createOverlay( await notifyScheduleChanged(source.classId); return result; } + +export async function assertLayoutWrite(user: TokenPayload, classId: string | null, layoutId?: string) { + if (classId) await assertHeadOnly(user, 'schedule:write', classId); + else assertAdmin(user); + if (layoutId) { + const refs = await prisma.classPlan.findMany({ + where: { timeLayoutId: layoutId }, + select: { classId: true }, + }); + for (const id of new Set(refs.map((p) => p.classId))) await assertHeadOnly(user, 'schedule:write', id); + } +} +export async function deleteLayout(user: TokenPayload, id: string) { + const layout = await prisma.timeLayout.findUnique({ where: { id } }); + if (!layout) throw ApiError.notFound('时间表不存在'); + await assertLayoutWrite(user, layout.classId, id); + if (await prisma.classPlan.count({ where: { timeLayoutId: id } })) + throw ApiError.conflict('仍有课表使用该时间表'); + await prisma.timeLayout.delete({ where: { id } }); + await notifyScheduleChanged(layout.classId); +} diff --git a/packages/server/src/modules/class-plans/profile-export.service.ts b/packages/server/src/modules/class-plans/profile-export.service.ts index 4497d5b..b6bfd16 100644 --- a/packages/server/src/modules/class-plans/profile-export.service.ts +++ b/packages/server/src/modules/class-plans/profile-export.service.ts @@ -4,7 +4,7 @@ import type { TokenPayload } from '../../lib/jwt.js'; /** 按时间点外键生成完整档案,空课、停用课程与非上课时间点均保留。 */ export async function exportProfile(user: TokenPayload, classId: string) { - await assertClassAccess(user, classId); + await assertClassAccess(user, classId, 'schedule:read'); const [cls, layouts, plans, subjects, groups, scheduled, setting] = await Promise.all([ prisma.class.findUniqueOrThrow({ where: { id: classId } }), prisma.timeLayout.findMany({ diff --git a/packages/server/src/modules/classes/classes.module.ts b/packages/server/src/modules/classes/classes.module.ts index c774914..32ebfc0 100644 --- a/packages/server/src/modules/classes/classes.module.ts +++ b/packages/server/src/modules/classes/classes.module.ts @@ -4,8 +4,9 @@ import { idParamSchema } from '../../lib/schemas.js'; import { authenticate, getAuthUser, - requireStaffPermission, + requirePermissionOrClassDevice, requirePermission, + requireAdmin, } from '../../middleware/auth.js'; import { validate, validatedBody, validatedParams, validatedQuery } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; @@ -19,6 +20,8 @@ import { promoteClassesSchema, updateClassAccountSchema, updateClassSchema, + updateClassSettingsSchema, + type UpdateClassSettingsInput, updateStudentGradeQuerySchema, type AddStudentInput, type AssignSubjectTeachersInput, @@ -42,7 +45,7 @@ router.use(authenticate()); */ router.get( '/', - requireStaffPermission('class:read'), + requirePermissionOrClassDevice('class:read'), validate({ query: listClassesQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -59,6 +62,7 @@ router.get( */ router.post( '/promote', + requireAdmin(), requirePermission('promotion:manage'), validate({ body: promoteClassesSchema }), async (req, res) => { @@ -71,7 +75,7 @@ router.post( /** GET /api/classes/:id - 班级详情(学生名单 + 课程 + 班主任 + 各科任课老师) */ router.get( '/:id', - requireStaffPermission('class:read'), + requirePermissionOrClassDevice('class:read'), validate({ params: idParamSchema }), async (req, res) => { const user = getAuthUser(req); @@ -83,6 +87,7 @@ router.get( /** POST /api/classes - 创建班级(称呼由入学年份 + 班号生成,如「2026级1班」) */ router.post( '/', + requireAdmin(), requirePermission('class:manage'), validate({ body: createClassSchema }), async (req, res) => { @@ -94,6 +99,7 @@ router.post( /** PATCH /api/classes/:id - 编辑班级(年级 / 届别 / 教学周数),按功能权限及范围校验 */ router.patch( '/:id', + requireAdmin(), requirePermission('class:manage'), (req, _res, next) => { if (req.body && 'grade' in req.body) return next(ApiError.badRequest('年级请通过学年升级入口修改')); @@ -107,9 +113,25 @@ router.patch( }, ); +router.patch( + '/:id/settings', + requirePermission('class:settings'), + validate({ params: idParamSchema, body: updateClassSettingsSchema }), + async (req, res) => { + sendOk( + res, + await classService.updateClassSettings( + getAuthUser(req), + String(req.params.id), + validatedBody(req), + ), + ); + }, +); /** DELETE /api/classes/:id - 删除班级 */ router.delete( '/:id', + requireAdmin(), requirePermission('class:manage'), validate({ params: idParamSchema }), async (req, res) => { @@ -126,7 +148,7 @@ router.delete( */ router.patch( '/:id/class-account', - requirePermission('class:manage'), + requirePermission('class:account'), validate({ params: idParamSchema, body: updateClassAccountSchema }), async (req, res) => { const user = getAuthUser(req); @@ -145,6 +167,7 @@ router.patch( */ router.patch( '/:id/head-teacher', + requireAdmin(), requirePermission('class:manage'), validate({ params: idParamSchema, body: assignHeadTeacherSchema }), async (req, res) => { @@ -164,6 +187,7 @@ router.patch( */ router.put( '/:id/subject-teachers', + requireAdmin(), requirePermission('class:manage'), validate({ params: idParamSchema, body: assignSubjectTeachersSchema }), async (req, res) => { @@ -183,7 +207,7 @@ router.put( */ router.get( '/:id/student-grade-query', - requireStaffPermission('class:read'), + requirePermissionOrClassDevice('class:read'), validate({ params: idParamSchema }), async (req, res) => { const user = getAuthUser(req); @@ -210,7 +234,7 @@ router.patch( /** GET /api/classes/:id/students - 班级学生名单 */ router.get( '/:id/students', - requireStaffPermission('roster:read'), + requirePermissionOrClassDevice('roster:read'), validate({ params: idParamSchema }), async (req, res) => { const user = getAuthUser(req); diff --git a/packages/server/src/modules/classes/classes.schemas.ts b/packages/server/src/modules/classes/classes.schemas.ts index f5a1920..55ff924 100644 --- a/packages/server/src/modules/classes/classes.schemas.ts +++ b/packages/server/src/modules/classes/classes.schemas.ts @@ -41,12 +41,15 @@ export const createClassSchema = z.object({ * `enrollmentYear` / `classIndex` 是给"有名无实的旧数据"补届别用的,改了会重算班级称呼。 */ export const updateClassSchema = z.strictObject({ + enrollmentYear: enrollmentYearSchema.optional(), + classIndex: classIndexSchema.optional(), +}); + +export const updateClassSettingsSchema = z.strictObject({ /** 本班学期开始日期(第 1 教学周的周一);空串 = 回落到全局配置 */ termStartDate: z .union([z.string().trim().refine(isDayKey, { message: '日期格式应为 YYYY-MM-DD' }), z.literal('')]) .nullish(), - enrollmentYear: enrollmentYearSchema.optional(), - classIndex: classIndexSchema.optional(), termWeeks: z.coerce.number().int().min(1).max(60).optional(), }); @@ -125,3 +128,5 @@ export type UpdateClassAccountInput = z.infer; export type UpdateStudentGradeQueryInput = z.infer; export type AddStudentInput = z.infer; export type AssignSubjectTeachersInput = z.infer; + +export type UpdateClassSettingsInput = z.infer; diff --git a/packages/server/src/modules/classes/classes.service.ts b/packages/server/src/modules/classes/classes.service.ts index 55174e7..0463701 100644 --- a/packages/server/src/modules/classes/classes.service.ts +++ b/packages/server/src/modules/classes/classes.service.ts @@ -1,3 +1,6 @@ +import { disconnectUserSessions, refreshClassSubscriptions } from '../../realtime/bus.js'; +import { assertHeadOnly, assertManage } from '../../lib/authz/index.js'; +import { auditData } from '../permissions/permissions.service.js'; import type { ClassDetailDto, ClassDto, StudentDto, SubjectTeacherDto } from '@classhelper/shared'; import { SOCKET_EVENTS, formatClassName } from '@classhelper/shared'; import { env } from '../../config/env.js'; @@ -23,12 +26,17 @@ import type { AssignSubjectTeachersInput, CreateClassInput, UpdateClassInput, + UpdateClassSettingsInput, UpdateStudentGradeQueryInput, } from './classes.schemas.js'; import { loadPromotionPlan } from '../term/promotion.service.js'; import { assertClassInScope, canAccessClass } from '../../lib/access.js'; import { changeStudentLifecycle } from '../../lib/student-lifecycle.js'; -import { assertStaffPermission, assertPermission, hasEffectivePermission } from '../../lib/permissions.js'; +import { + assertPermissionOrClassDevice, + assertPermission, + hasEffectivePermission, +} from '../../lib/permissions.js'; import { activeStudentWhere } from '../../lib/students.js'; import { getMaxTermWeeks } from '../../lib/term.js'; import { logger } from '../../lib/logger.js'; @@ -79,7 +87,7 @@ function toClassDtoWithAccount( * 混在常规列表里会让老师误以为那届还在上课。需要看归档班级请用 `/api/archives`。 */ export async function listClasses(user: TokenPayload, keyword?: string): Promise { - await assertStaffPermission(user, 'class:read'); + await assertPermissionOrClassDevice(user, 'class:read'); const scope = await resolveClassScope(user, undefined, 'class:read'); // Class 表按主键 id 过滤(classScopeWhere 针对的是带 classId 字段的子表) const where = { @@ -102,8 +110,8 @@ export async function listClasses(user: TokenPayload, keyword?: string): Promise /** 班级详情:学生名单 + 课程 + 班主任 + 各科任课老师 */ export async function getClassDetail(user: TokenPayload, classId: string): Promise { - await assertStaffPermission(user, 'class:read'); - await assertClassAccess(user, classId); + await assertPermissionOrClassDevice(user, 'class:read'); + await assertClassAccess(user, classId, 'class:read'); const item = await prisma.class.findUnique({ where: { id: classId }, @@ -147,7 +155,7 @@ export async function listSubjectTeachers( user: TokenPayload, classId: string, ): Promise<{ headTeacher: SubjectTeacherDto | null; subjectTeachers: SubjectTeacherDto[] }> { - await assertClassAccess(user, classId); + await assertClassAccess(user, classId, 'class:read'); const item = await prisma.class.findUnique({ where: { id: classId }, include: { @@ -206,6 +214,13 @@ export async function createClass(user: TokenPayload, input: CreateClassInput): }, }); + await prisma.permissionAudit.create({ + data: auditData(user, 'class-create', 'class', created.id, null, { + name: created.name, + teacherId: created.teacherId, + }), + }); + refreshClassSubscriptions(); return toClassDtoWithAccount(user, created); } @@ -222,6 +237,10 @@ export async function updateHeadTeacher( teacherId: string, ): Promise { await assertCanAssignTeachers(user, classId); + const before = await prisma.class.findUniqueOrThrow({ + where: { id: classId }, + select: { teacherId: true }, + }); const targetId = await requireTeacher(teacherId, '指定的班主任不存在或角色不是教师'); const updated = await prisma.class.update({ @@ -233,6 +252,10 @@ export async function updateHeadTeacher( }, }); + await prisma.permissionAudit.create({ + data: auditData(user, 'class-head', 'class', classId, before, { teacherId: targetId }), + }); + disconnectUserSessions([before.teacherId, targetId].filter((id): id is string => !!id)); emitToClass(classId, SOCKET_EVENTS.classUpdated, { classId, action: 'head-teacher-changed' }); return toClassDtoWithAccount(user, updated); } @@ -256,6 +279,10 @@ export async function assignSubjectTeachers( const targetClass = await prisma.class.findUnique({ where: { id: classId }, select: { id: true } }); if (!targetClass) throw ApiError.notFound('班级不存在'); + const before = await prisma.course.findMany({ + where: { classId }, + select: { id: true, name: true, teacherId: true }, + }); for (const assignment of input.assignments) { const teacherId = assignment.teacherId ? await requireTeacher(assignment.teacherId, `「${assignment.subjectName}」的任课老师不存在或不是教师`) @@ -290,6 +317,17 @@ export async function assignSubjectTeachers( where: { id: classId }, include: { courses: { orderBy: { name: 'asc' }, include: { teacher: teacherBriefSelect } } }, }); + await prisma.permissionAudit.create({ + data: auditData( + user, + 'class-subjects', + 'class', + classId, + before, + refreshed.courses.map((c) => ({ id: c.id, name: c.name, teacherId: c.teacherId })), + ), + }); + disconnectUserSessions([...new Set([...before, ...refreshed.courses].map((c) => c.teacherId))]); return refreshed.courses.map((course) => ({ courseId: course.id, subjectName: course.name, @@ -304,7 +342,8 @@ export async function updateClassAccount( classId: string, input: { code?: string; password?: string }, ): Promise { - await assertCanManageClasses(user, classId); + await assertHeadOnly(user, 'class:account', classId); + const before = await prisma.class.findUniqueOrThrow({ where: { id: classId }, select: { code: true } }); if ( 'termWeeks' in input && typeof input.termWeeks === 'number' && @@ -322,6 +361,12 @@ export async function updateClassAccount( }, }); if (!updated) throw ApiError.notFound('班级不存在'); + await prisma.permissionAudit.create({ + data: auditData(user, 'class-account', 'class', classId, before, { + code: updated.code, + passwordChanged: input.password !== undefined, + }), + }); return toClassDtoWithAccount(user, updated); } @@ -340,19 +385,12 @@ export async function updateClass( if (!current) throw ApiError.notFound('班级不存在'); if ('grade' in input) throw ApiError.badRequest('修改年级请使用学年升级入口'); - if (input.termWeeks !== undefined && input.termWeeks > (await getMaxTermWeeks())) - throw ApiError.badRequest('班级周数不能超过全校上限'); const enrollmentYear = input.enrollmentYear ?? current.enrollmentYear; const classIndex = input.classIndex ?? current.classIndex; const updated = await prisma.class.update({ where: { id: classId }, data: { - ...(input.termWeeks !== undefined ? { termWeeks: input.termWeeks } : {}), - // 学期开始日期:空串/null 都表示"回落到全局配置"(如 .env 的 TERM_START_DATE) - ...(input.termStartDate !== undefined - ? { termStartDate: input.termStartDate ? input.termStartDate : null } - : {}), ...(input.enrollmentYear !== undefined ? { enrollmentYear } : {}), ...(input.classIndex !== undefined ? { classIndex } : {}), // 届别齐了就把称呼重算一遍:班级称呼的唯一来源是「入学年份 + 班号」 @@ -364,10 +402,45 @@ export async function updateClass( }, }); + await prisma.permissionAudit.create({ + data: auditData(user, 'class-update', 'class', classId, current, { + enrollmentYear: updated.enrollmentYear, + classIndex: updated.classIndex, + name: updated.name, + }), + }); emitToClass(classId, SOCKET_EVENTS.classUpdated, { classId, action: 'updated' }); return toClassDto(updated); } +export async function updateClassSettings( + user: TokenPayload, + classId: string, + input: UpdateClassSettingsInput, +): Promise { + await assertHeadOnly(user, 'class:settings', classId); + if (input.termWeeks !== undefined && input.termWeeks > (await getMaxTermWeeks())) + throw ApiError.badRequest('班级周数不能超过全校上限'); + const before = await prisma.class.findUniqueOrThrow({ + where: { id: classId }, + select: { termWeeks: true, termStartDate: true }, + }); + const updated = await prisma.class.update({ + where: { id: classId }, + data: { + termWeeks: input.termWeeks, + ...(input.termStartDate !== undefined ? { termStartDate: input.termStartDate || null } : {}), + }, + }); + await prisma.permissionAudit.create({ + data: auditData(user, 'class-settings', 'class', classId, before, { + termWeeks: updated.termWeeks, + termStartDate: updated.termStartDate, + }), + }); + emitToClass(classId, SOCKET_EVENTS.classUpdated, { classId, action: 'updated' }); + return toClassDto(updated); +} /** * 学年升级(按升级权限与班级范围):把若干班级的年级改掉,**不归档、数据沿用**。 * @@ -405,6 +478,7 @@ export async function promoteClasses( } }); for (const classId of ids) emitToClass(classId, SOCKET_EVENTS.classUpdated, { classId, action: 'updated' }); + refreshClassSubscriptions(); return { promoted: ids.length }; } @@ -414,13 +488,21 @@ export async function deleteClass(user: TokenPayload, classId: string): Promise< if (await prisma.student.count({ where: { classId } })) throw ApiError.conflict('班级仍有学生,请先通过名单生命周期入口移出或归档,不能级联清除归属'); emitToClass(classId, SOCKET_EVENTS.classUpdated, { classId, action: 'deleted' }); + const before = await prisma.class.findUniqueOrThrow({ + where: { id: classId }, + select: { id: true, name: true, grade: true }, + }); await prisma.class.delete({ where: { id: classId } }); + refreshClassSubscriptions(); + await prisma.permissionAudit.create({ + data: auditData(user, 'class-delete', 'class', classId, before, null), + }); } /** 班级学生名单 */ export async function listClassStudents(user: TokenPayload, classId: string): Promise { - await assertStaffPermission(user, 'roster:read'); - await assertClassAccess(user, classId); + await assertPermissionOrClassDevice(user, 'roster:read'); + await assertClassAccess(user, classId, 'roster:read'); const students = await prisma.student.findMany({ where: { classId, ...activeStudentWhere() }, include: { class: { select: { name: true, grade: true } } }, @@ -472,7 +554,7 @@ export async function getStudentGradeQuery( user: TokenPayload, classId: string, ): Promise<{ studentGradeQueryEnabled: boolean }> { - await assertClassAccess(user, classId); + await assertClassAccess(user, classId, 'class:read'); const record = await prisma.class.findUnique({ where: { id: classId }, select: { studentGradeQueryEnabled: true }, @@ -493,7 +575,7 @@ export async function updateStudentGradeQuery( classId: string, input: UpdateStudentGradeQueryInput, ): Promise<{ studentGradeQueryEnabled: boolean }> { - await assertClassAccess(user, classId); + await assertManage(user, 'grade:write', classId); if (!isStaff(user)) { throw ApiError.forbidden('成绩查询开关由教师/管理员在 Web 端设置,班级端只读'); } diff --git a/packages/server/src/modules/clients/clients.module.ts b/packages/server/src/modules/clients/clients.module.ts index 63c871f..f947cef 100644 --- a/packages/server/src/modules/clients/clients.module.ts +++ b/packages/server/src/modules/clients/clients.module.ts @@ -2,7 +2,7 @@ import { Router } from 'express'; import type { ClientUpdateProgressDto } from '@classhelper/shared'; import { sendCreated, sendOk } from '../../lib/http.js'; import { idParamSchema } from '../../lib/schemas.js'; -import { authenticate, getAuthUser, requireAnyPermission, requirePermission } from '../../middleware/auth.js'; +import { authenticate, getAuthUser, requireRole, requirePermission } from '../../middleware/auth.js'; import { validate, validatedBody, validatedParams, validatedQuery } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; import { @@ -22,14 +22,19 @@ import * as clientService from './clients.service.js'; const router = Router(); router.use(authenticate()); -router.post('/update-progress', validate({ body: clientProgressSchema }), async (req, res) => { - const input = validatedBody<{ - deviceKey: string; - progress: ClientUpdateProgressDto; - }>(req); - await clientService.reportUpdateProgress(getAuthUser(req), input.deviceKey, input.progress); - sendOk(res, null); -}); +router.post( + '/update-progress', + requireRole('CLASS_DEVICE'), + validate({ body: clientProgressSchema }), + async (req, res) => { + const input = validatedBody<{ + deviceKey: string; + progress: ClientUpdateProgressDto; + }>(req); + await clientService.reportUpdateProgress(getAuthUser(req), input.deviceKey, input.progress); + sendOk(res, null); + }, +); /** * POST /api/clients/heartbeat - 客户端每 30 秒上报一次 @@ -37,22 +42,28 @@ router.post('/update-progress', validate({ body: clientProgressSchema }), async * **不挂权限键**:上报方是教室里的班级端会话(角色 CLASS_DEVICE,权限集为空)。 * 返回值里同时带回"要不要更新 + 安装包信息 + 一条待执行命令",客户端一次请求全拿到。 */ -router.post('/heartbeat', validate({ body: clientHeartbeatSchema }), async (req, res) => { - const user = getAuthUser(req); - const input = validatedBody(req); - const result = await clientService.heartbeat(user, input, req.ip ?? ''); - // 1.3.x 旧客户端误读顶层字段,提供兼容别名让它们仍能接收修复版更新。 - sendOk(res, result, '心跳已上报', 200, input.agentProtocol === 2 ? {} : result); -}); +router.post( + '/heartbeat', + requireRole('CLASS_DEVICE'), + validate({ body: clientHeartbeatSchema }), + async (req, res) => { + const user = getAuthUser(req); + const input = validatedBody(req); + const result = await clientService.heartbeat(user, input, req.ip ?? ''); + // 1.3.x 旧客户端误读顶层字段,提供兼容别名让它们仍能接收修复版更新。 + sendOk(res, result, '心跳已上报', 200, input.agentProtocol === 2 ? {} : result); + }, +); /** POST /api/clients/commands/:id/ack - 执行回执(同样不挂权限键,靠 deviceKey 归属校验) */ router.post( '/commands/:id/ack', + requireRole('CLASS_DEVICE'), validate({ params: idParamSchema, body: clientCommandAckSchema }), async (req, res) => { const { id } = validatedParams<{ id: string }>(req); const input = validatedBody(req); - sendOk(res, await clientService.ackCommand(id, input), '回执已记录'); + sendOk(res, await clientService.ackCommand(getAuthUser(req), id, input), '回执已记录'); }, ); @@ -79,7 +90,7 @@ router.post( /** GET /api/clients/devices?classId= - Web 端设备列表(版本 / 在线 / 待执行命令) */ router.get( '/devices', - requireAnyPermission('client:read', 'client:manage', 'remote:control', 'client:update-push'), + requirePermission('client:read'), validate({ query: listClientDevicesQuerySchema }), async (req, res) => { const query = validatedQuery(req); @@ -94,7 +105,7 @@ router.get( /** POST /api/clients/updates - 统一下发客户端更新 */ router.post( '/updates', - requirePermission('client:update'), + requirePermission('client:update-push'), validate({ body: pushClientUpdateSchema }), async (req, res) => { const user = getAuthUser(req); diff --git a/packages/server/src/modules/clients/clients.service.ts b/packages/server/src/modules/clients/clients.service.ts index 0b8b23f..b6cf357 100644 --- a/packages/server/src/modules/clients/clients.service.ts +++ b/packages/server/src/modules/clients/clients.service.ts @@ -1,3 +1,4 @@ +import { assertClassDevice } from '../../lib/authz/index.js'; import { CLIENT_COMMAND_EXPIRE_MS, CLIENT_COMMAND_LABELS, @@ -136,6 +137,11 @@ export async function heartbeat( input: ClientHeartbeatInput, ip: string, ): Promise { + const boundClassId = resolveClassId(user); + assertClassDevice(user, boundClassId ?? ''); + const previousDevice = await prisma.clientDevice.findUnique({ where: { deviceKey: input.deviceKey } }); + if (previousDevice && previousDevice.classId !== boundClassId) + throw ApiError.forbidden('设备不属于当前班级'); const now = new Date(); const heartbeatAt = { classId: resolveClassId(user), @@ -149,11 +155,17 @@ export async function heartbeat( lastIp: ip, }; - const device = (await prisma.clientDevice.upsert({ - where: { deviceKey: input.deviceKey }, - create: { deviceKey: input.deviceKey, ...heartbeatAt }, - update: heartbeatAt, - })) as unknown as DeviceRow; + const device = (await prisma.clientDevice + .upsert({ + where: { deviceKey: input.deviceKey, classId: boundClassId }, + create: { deviceKey: input.deviceKey, ...heartbeatAt }, + update: heartbeatAt, + }) + .catch(async (error: unknown) => { + const current = await prisma.clientDevice.findUnique({ where: { deviceKey: input.deviceKey } }); + if (current && current.classId !== boundClassId) throw ApiError.forbidden('设备不属于当前班级'); + throw error; + })) as unknown as DeviceRow; const targetVersion = device.updateTargetVersion.trim(); if (targetVersion && input.clientVersion && compareVersions(input.clientVersion, targetVersion) >= 0) { @@ -204,7 +216,7 @@ export async function reportUpdateProgress( progress: ClientUpdateProgressDto, ) { const device = await prisma.clientDevice.findUnique({ where: { deviceKey } }); - // 教师/管理员电脑不绑定班级(会话与设备两侧都是 null),同样允许上报自己的进度。 + assertClassDevice(user, device?.classId ?? ''); if (!device || device.classId !== resolveClassId(user)) throw ApiError.forbidden('设备不属于当前班级'); // 已取消或更换目标的迟到进度不得覆盖当前任务。 if (progress.version !== device.updateTargetVersion || progress.stage === 'completed') return; @@ -240,14 +252,16 @@ function readUpdateProgress(raw: string): ClientUpdateProgressDto | null { /** POST /api/clients/commands/:id/ack - 客户端执行完远控命令后的回执 */ export async function ackCommand( + user: TokenPayload, commandId: string, input: ClientCommandAckRequest, ): Promise { const command = (await prisma.clientCommand.findUnique({ where: { id: commandId }, - include: { device: { select: { deviceKey: true, name: true } } }, - })) as (CommandRow & { device: { deviceKey: string; name: string } }) | null; + include: { device: { select: { deviceKey: true, name: true, classId: true } } }, + })) as (CommandRow & { device: { deviceKey: string; name: string; classId: string | null } }) | null; if (!command) throw ApiError.notFound('命令不存在'); + assertClassDevice(user, command.device.classId ?? ''); if (command.device.deviceKey !== input.deviceKey) { throw ApiError.forbidden('这条命令不是发给这台电脑的'); @@ -271,7 +285,7 @@ export async function listDevices( user: TokenPayload, options: { classId?: string } = {}, ): Promise { - const scope = await resolveClassScope(user, options.classId); + const scope = await resolveClassScope(user, options.classId, 'client:read'); const rows = (await prisma.clientDevice.findMany({ where: classScopeWhere(scope), include: { class: { select: { id: true, name: true } } }, @@ -394,7 +408,7 @@ export async function createCommands( /** 更新推送的目标集合:优先设备,其次班级,最后"全部" */ async function resolveUpdateTargets(user: TokenPayload, input: PushClientUpdateInput): Promise { - const scope = classScopeWhere(await resolveClassScope(user, undefined, 'client:update')); + const scope = classScopeWhere(await resolveClassScope(user, undefined, 'client:update-push')); const deviceIds = [...new Set(input.deviceIds ?? [])]; if (deviceIds.length > 0) { const rows = (await prisma.clientDevice.findMany({ diff --git a/packages/server/src/modules/courses/courses.module.ts b/packages/server/src/modules/courses/courses.module.ts index 92c7349..6d8f132 100644 --- a/packages/server/src/modules/courses/courses.module.ts +++ b/packages/server/src/modules/courses/courses.module.ts @@ -4,7 +4,7 @@ import { idParamSchema } from '../../lib/schemas.js'; import { authenticate, getAuthUser, - requireStaffPermission, + requirePermissionOrClassDevice, requirePermission, } from '../../middleware/auth.js'; import { validate, validatedParams, validatedQuery } from '../../middleware/validate.js'; @@ -24,7 +24,7 @@ router.use(authenticate()); /** GET /api/courses?classId= - 课程列表 */ router.get( '/', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: listCoursesQuerySchema }), async (req, res) => { const user = getAuthUser(req); diff --git a/packages/server/src/modules/courses/courses.service.ts b/packages/server/src/modules/courses/courses.service.ts index 390ef89..37fa4c1 100644 --- a/packages/server/src/modules/courses/courses.service.ts +++ b/packages/server/src/modules/courses/courses.service.ts @@ -1,3 +1,4 @@ +import { refreshClassSubscriptions } from '../../realtime/bus.js'; import type { CourseDto } from '@classhelper/shared'; import { assertCanManageSchedule, classScopeWhere, resolveClassScope } from '../../lib/access.js'; import { prisma } from '../../lib/db.js'; @@ -9,7 +10,7 @@ import type { CreateCourseInput, UpdateCourseInput } from './courses.schemas.js' const teacherSelect = { select: { id: true, name: true, username: true } } as const; export async function listCourses(user: TokenPayload, classId?: string): Promise { - const scope = await resolveClassScope(user, classId); + const scope = await resolveClassScope(user, classId, 'schedule:read'); const courses = await prisma.course.findMany({ where: classScopeWhere(scope), include: { teacher: teacherSelect }, @@ -26,7 +27,7 @@ export async function createCourse(user: TokenPayload, input: CreateCourseInput) * * 这条不是"友好提示",是**权限护栏**:`course.create` 会把创建者写成这门课的任课老师, * 于是只要能再建一门同名的「数学」,创建者就凭空成了「数学」的老师 —— - * 后面那道 `assertCanManageSubjectContent` 的科目门随即形同虚设 + * 后面那道 `` 的科目门随即形同虚设 * (可以布置该科作业、录入该科成绩、删该科内容)。这就是"非该科科任老师 * 能布置其他科作业"的入口。 * @@ -82,4 +83,5 @@ export async function deleteCourse(user: TokenPayload, courseId: string): Promis if (!course) throw ApiError.notFound('课程不存在'); await assertCanManageSchedule(user, course.classId); await prisma.course.delete({ where: { id: courseId } }); + refreshClassSubscriptions(); } diff --git a/packages/server/src/modules/courseware/courseware.module.ts b/packages/server/src/modules/courseware/courseware.module.ts index d30712d..2c2f730 100644 --- a/packages/server/src/modules/courseware/courseware.module.ts +++ b/packages/server/src/modules/courseware/courseware.module.ts @@ -6,7 +6,7 @@ import { getAuthUser, requireRole, requirePermission, - requireStaffPermission, + requirePermissionOrClassDevice, } from '../../middleware/auth.js'; import { validate, validatedBody, validatedQuery, validatedParams } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; @@ -22,7 +22,7 @@ import * as service from './courseware.service.js'; const router = Router(); router.use(authenticate()); const staff = [requireRole('ADMIN', 'TEACHER'), requirePermission('courseware:write')]; -router.get('/', requireStaffPermission('courseware:read'), async (req, res) => +router.get('/', requirePermissionOrClassDevice('courseware:read'), async (req, res) => sendOk(res, await service.listCourseware(getAuthUser(req))), ); router.get('/classes', ...staff, async (req, res) => @@ -83,10 +83,14 @@ router.post('/upload', ...staff, validate({ query: coursewareUploadQuery }), asy ); router.get( '/:id/download', - requireStaffPermission('courseware:read'), + requirePermissionOrClassDevice('courseware:read'), validate({ params: idParamSchema }), async (req, res, next) => { - const row = await service.readable(getAuthUser(req), validatedParams<{ id: string }>(req).id); + const row = await service.readable( + getAuthUser(req), + validatedParams<{ id: string }>(req).id, + 'courseware:read', + ); res.setHeader('Cache-Control', 'private, no-store'); res.setHeader('Content-Type', 'application/octet-stream'); res.download(row.storagePath, row.name, { root: service.coursewareRoot, dotfiles: 'allow' }, (error) => { @@ -127,7 +131,7 @@ router.delete('/:id', ...staff, validate({ params: idParamSchema }), async (req, }); router.get( '/:id', - requireStaffPermission('courseware:read'), + requirePermissionOrClassDevice('courseware:read'), validate({ params: idParamSchema }), async (req, res) => sendOk(res, await service.getCourseware(getAuthUser(req), validatedParams<{ id: string }>(req).id)), diff --git a/packages/server/src/modules/courseware/courseware.service.ts b/packages/server/src/modules/courseware/courseware.service.ts index 27cfcc3..ae0e15b 100644 --- a/packages/server/src/modules/courseware/courseware.service.ts +++ b/packages/server/src/modules/courseware/courseware.service.ts @@ -1,3 +1,9 @@ +import { + assertContentWrite, + assertPermission, + assertPermissionOrClassDevice, + classWhere, +} from '../../lib/authz/index.js'; import fs from 'node:fs'; import fsp from 'node:fs/promises'; import path from 'node:path'; @@ -17,7 +23,7 @@ import { import { env } from '../../config/env.js'; import { prisma } from '../../lib/db.js'; import { ApiError } from '../../lib/http.js'; -import { assertCanManageSubjectContent, requireClassDeviceClassId } from '../../lib/access.js'; +import { requireClassDeviceClassId } from '../../lib/access.js'; import type { TokenPayload } from '../../lib/jwt.js'; import type { Prisma } from '../../generated/prisma/client.js'; import { emitToClass } from '../../realtime/bus.js'; @@ -47,13 +53,20 @@ function dto(row: RecordWithRelations): CoursewareDto { }; } export async function teachingClasses(user: TokenPayload) { + await assertPermission(user, 'courseware:write'); return prisma.class.findMany({ - where: { archivedYearId: null, courses: { some: { teacherId: user.sub } } }, + where: { + AND: [ + { archivedYearId: null, courses: { some: { teacherId: user.sub } } }, + await classWhere(user, 'courseware:write'), + ], + }, select: { id: true, name: true }, orderBy: { name: 'asc' }, }); } async function validateClasses(user: TokenPayload, ids: string[]) { + await assertPermission(user, 'courseware:write'); const classIds = [...new Set(ids)]; const allowed = new Set((await teachingClasses(user)).map((item) => item.id)); if (classIds.some((id) => !allowed.has(id))) throw ApiError.forbidden('只能选择自己任教的在读班级'); @@ -62,11 +75,12 @@ async function validateClasses(user: TokenPayload, ids: string[]) { where: { classId, teacherId: user.sub }, select: { id: true }, }); - await assertCanManageSubjectContent(user, classId, course?.id, '发布课件'); + await assertContentWrite(user, 'courseware:write', classId, course?.id, '发布课件'); } return classIds; } -export async function readable(user: TokenPayload, id: string) { +export async function readable(user: TokenPayload, id: string, key: 'courseware:read' | 'courseware:write') { + await assertPermissionOrClassDevice(user, key); const row = await prisma.courseware.findUnique({ where: { id }, include }); if (!row) throw ApiError.notFound('课件不存在'); if (user.role === 'CLASS_DEVICE') { @@ -77,17 +91,19 @@ export async function readable(user: TokenPayload, id: string) { return row; } async function owned(user: TokenPayload, id: string) { - const row = await readable(user, id); + await assertPermission(user, 'courseware:write'); + const row = await readable(user, id, 'courseware:write'); if (row.ownerId !== user.sub) throw ApiError.forbidden('只能修改自己的课件'); return row; } export async function getCourseware(user: TokenPayload, id: string) { - const item = dto(await readable(user, id)); + const item = dto(await readable(user, id, 'courseware:read')); if (user.role === 'CLASS_DEVICE') item.classes = item.classes.filter((c) => c.id === requireClassDeviceClassId(user)); return item; } export async function listCourseware(user: TokenPayload) { + await assertPermissionOrClassDevice(user, 'courseware:read'); const classId = user.role === 'CLASS_DEVICE' ? requireClassDeviceClassId(user) : null; const rows = await prisma.courseware.findMany({ where: classId @@ -177,6 +193,7 @@ async function assertFolder(user: TokenPayload, folderPath: string) { throw ApiError.badRequest('请选择自己创建的文件夹'); } export async function listFolders(user: TokenPayload) { + await assertPermission(user, 'courseware:write'); const rows = await prisma.coursewareFolder.findMany({ where: { ownerId: user.sub }, orderBy: { path: 'asc' }, @@ -184,6 +201,7 @@ export async function listFolders(user: TokenPayload) { return rows.map((row) => ({ id: row.id, path: row.path })); } export async function createFolder(user: TokenPayload, folderPath: string) { + await assertPermission(user, 'courseware:write'); const row = await prisma.coursewareFolder.upsert({ where: { ownerId_path: { ownerId: user.sub, path: folderPath } }, create: { ownerId: user.sub, path: folderPath }, @@ -259,7 +277,7 @@ export async function acknowledgeTransfer(user: TokenPayload, pushId: string, de const device = await deviceFor(user, deviceKey); const push = await prisma.coursewarePush.findFirst({ where: { id: pushId, classId: device.classId } }); if (!push) throw ApiError.notFound('传输任务不存在'); - await readable(user, push.coursewareId); + await readable(user, push.coursewareId, 'courseware:read'); await prisma.coursewareReceipt.upsert({ where: { pushId_deviceId: { pushId, deviceId: device.id } }, create: { pushId, deviceId: device.id }, diff --git a/packages/server/src/modules/dashboard/dashboard.module.ts b/packages/server/src/modules/dashboard/dashboard.module.ts index ed77009..ff696b3 100644 --- a/packages/server/src/modules/dashboard/dashboard.module.ts +++ b/packages/server/src/modules/dashboard/dashboard.module.ts @@ -1,7 +1,7 @@ import { Router } from 'express'; import { sendOk } from '../../lib/http.js'; import { resolveCurrentWeek, loadTermContext } from '../../lib/term.js'; -import { authenticate, getAuthUser, requireStaffPermission } from '../../middleware/auth.js'; +import { authenticate, getAuthUser, requirePermissionOrClassDevice } from '../../middleware/auth.js'; import { defineModule } from '../module.types.js'; import * as dashboardService from './dashboard.service.js'; @@ -9,7 +9,7 @@ const router = Router(); router.use(authenticate()); /** GET /api/dashboard/summary - 首页汇总(按角色权限收敛数据范围) */ -router.get('/summary', requireStaffPermission('dashboard:read'), async (req, res) => { +router.get('/summary', requirePermissionOrClassDevice('dashboard:read'), async (req, res) => { const user = getAuthUser(req); sendOk(res, await dashboardService.getDashboardSummary(user), '获取仪表盘数据成功'); }); @@ -21,7 +21,7 @@ router.get('/summary', requireStaffPermission('dashboard:read'), async (req, res * 这样周次选择器不会再出现"实际 20 周却给到 30 周"的情况;不带 classId 时退回全局默认值。 * 带 classId 时会先校验班级访问权限(见 resolveTermWeeks)。 */ -router.get('/term', requireStaffPermission('term:read'), async (req, res) => { +router.get('/term', requirePermissionOrClassDevice('term:read'), async (req, res) => { const user = getAuthUser(req); const classId = typeof req.query.classId === 'string' && req.query.classId ? req.query.classId : undefined; const maxWeek = await dashboardService.resolveTermWeeks(user, classId); diff --git a/packages/server/src/modules/dashboard/dashboard.service.ts b/packages/server/src/modules/dashboard/dashboard.service.ts index 9077481..7ac1bc6 100644 --- a/packages/server/src/modules/dashboard/dashboard.service.ts +++ b/packages/server/src/modules/dashboard/dashboard.service.ts @@ -1,9 +1,9 @@ +import type { PermissionKey } from '@classhelper/shared'; +import { classIdsFor, loadAuthPrincipal } from '../../lib/authz/index.js'; import { activeStudentWhere } from '../../lib/students.js'; import type { DashboardSummary, HomeworkDto, NotificationDto } from '@classhelper/shared'; import { assertClassAccess, - classScopeIdFilter, - classScopeWhere, isClassDevice, resolveClassScope, requireClassDeviceClassId, @@ -25,7 +25,7 @@ const creatorSelect = { select: { id: true, name: true, username: true } } as co * - 都不传:全局默认(getMaxTermWeeks 兜底)。 */ export async function resolveTermWeeks(user: TokenPayload, classId?: string): Promise { - if (classId) await assertClassAccess(user, classId); + if (classId) await assertClassAccess(user, classId, 'term:read'); const targetClassId = classId ?? (isClassDevice(user) ? requireClassDeviceClassId(user) : undefined); if (!targetClassId) return getMaxTermWeeks(); const record = await prisma.class.findUnique({ @@ -42,10 +42,38 @@ export async function resolveTermWeeks(user: TokenPayload, classId?: string): Pr export async function getDashboardSummary(user: TokenPayload): Promise { const device = isClassDevice(user); // 班级端强制限定在自己班级,避免越权统计 - const scope = await resolveClassScope(user, device ? requireClassDeviceClassId(user) : undefined); + const scope = await resolveClassScope( + user, + device ? requireClassDeviceClassId(user) : undefined, + 'dashboard:read', + ); // 子表按 classId 过滤;Class 表本身按主键 id 过滤 - const where = classScopeWhere(scope); - const classWhere = classScopeIdFilter(scope); + const allowed = scope.mode === 'in' ? scope.classIds : await classIdsFor(user, 'dashboard:read'); + const auth = await loadAuthPrincipal(user); + async function segment(key: PermissionKey) { + const ids = device ? allowed : (await classIdsFor(user, key)).filter((id) => allowed.includes(id)); + return { classId: { in: ids } }; + } + const [classes, students, courses, schedules, homeworks, notifications, grades] = await Promise.all( + [ + 'class:read', + 'roster:read', + 'schedule:read', + 'schedule:read', + 'homework:read', + 'notification:read', + 'grade:read', + ].map((key) => segment(key as PermissionKey)), + ); + const sections = { + classes: device || auth.permissions.has('class:read'), + students: device || auth.permissions.has('roster:read'), + courses: device || auth.permissions.has('schedule:read'), + schedules: device || auth.permissions.has('schedule:read'), + homeworks: device || auth.permissions.has('homework:read'), + notifications: device || auth.permissions.has('notification:read'), + grades: device || auth.permissions.has('grade:read'), + }; // ClassHelper 班级端以全班学生为范围 const personalIds = await resolvePersonalIds(user); const personalWhere = personalIdWhere(personalIds); @@ -64,27 +92,27 @@ export async function getDashboardSummary(user: TokenPayload): Promise { - sendOk(res, await databaseService.getDatabaseStatus()); +router.get('/status', async (req, res) => { + sendOk(res, await databaseService.forAdministrator(getAuthUser(req)).getDatabaseStatus()); }); /** POST /api/database/test-connection - 测试任意目标库连通性(切换前的前置检查) */ router.post('/test-connection', validate({ body: testConnectionSchema }), async (req, res) => { - const result = await databaseService.testConnection(validatedBody(req)); + const result = await databaseService + .forAdministrator(getAuthUser(req)) + .testConnection(validatedBody(req)); sendOk(res, result, result.ok ? '连接成功' : '连接失败'); }); /** GET /api/database/backups - 备份列表 */ -router.get('/backups', (_req, res) => { - sendOk(res, databaseService.listBackups()); +router.get('/backups', (req, res) => { + sendOk(res, databaseService.forAdministrator(getAuthUser(req)).listBackups()); }); /** POST /api/database/backups - 立即创建一份手动备份 */ -router.post('/backups', async (_req, res) => { - sendCreated(res, await databaseService.createBackup('manual'), '备份已创建'); +router.post('/backups', async (req, res) => { + sendCreated( + res, + await databaseService.forAdministrator(getAuthUser(req)).createBackup('manual'), + '备份已创建', + ); }); /** POST /api/database/backups/:name/restore - 从备份恢复(整库覆盖) */ router.post('/backups/:name/restore', validate({ params: backupNameParamSchema }), async (req, res) => { const { name } = validatedParams<{ name: string }>(req); - sendOk(res, await databaseService.restoreBackup(name), '已从备份恢复'); + sendOk(res, await databaseService.forAdministrator(getAuthUser(req)).restoreBackup(name), '已从备份恢复'); }); /** DELETE /api/database/backups/:name - 删除备份 */ router.delete('/backups/:name', validate({ params: backupNameParamSchema }), async (req, res) => { const { name } = validatedParams<{ name: string }>(req); - databaseService.deleteBackup(name); + databaseService.forAdministrator(getAuthUser(req)).deleteBackup(name); sendOk(res, { name }, '备份已删除'); }); /** GET /api/database/export - 下载当前库的 JSON 快照 */ -router.get('/export', async (_req, res) => { - const json = await databaseService.exportSnapshotJson(); +router.get('/export', async (req, res) => { + const json = await databaseService.forAdministrator(getAuthUser(req)).exportSnapshotJson(); const filename = `classhelper-snapshot-${new Date().toISOString().slice(0, 19).replaceAll(':', '')}.json`; res.setHeader('Content-Type', 'application/json; charset=utf-8'); res.setHeader('Content-Disposition', `attachment; filename="${filename}"`); @@ -77,8 +84,8 @@ router.get('/export', async (_req, res) => { }); /** GET /api/database/sqlite-file - 下载数据库文件(仅 SQLite 模式) */ -router.get('/sqlite-file', (_req, res) => { - const filePath = databaseService.sqliteFilePathForDownload(); +router.get('/sqlite-file', (req, res) => { + const filePath = databaseService.forAdministrator(getAuthUser(req)).sqliteFilePathForDownload(); res.setHeader('Content-Type', 'application/octet-stream'); res.setHeader('Content-Disposition', `attachment; filename="${path.basename(filePath)}"`); res.status(200).send(fs.readFileSync(filePath)); @@ -87,33 +94,41 @@ router.get('/sqlite-file', (_req, res) => { /** POST /api/database/import - 导入快照(整库覆盖;base64 随 JSON 请求体) */ router.post('/import', validate({ body: importSnapshotSchema }), async (req, res) => { const { data } = validatedBody(req); - sendOk(res, await databaseService.importSnapshotBase64(data), '快照已导入(原数据已被覆盖)'); + sendOk( + res, + await databaseService.forAdministrator(getAuthUser(req)).importSnapshotBase64(data), + '快照已导入(原数据已被覆盖)', + ); }); /** GET /api/database/backup-schedule - 定时备份配置 */ -router.get('/backup-schedule', (_req, res) => { - sendOk(res, databaseService.getBackupSchedule()); +router.get('/backup-schedule', (req, res) => { + sendOk(res, databaseService.forAdministrator(getAuthUser(req)).getBackupSchedule()); }); /** PUT /api/database/backup-schedule - 更新定时备份配置(立即生效,重启后仍有效) */ router.put('/backup-schedule', validate({ body: backupScheduleSchema }), async (req, res) => { sendOk( res, - databaseService.saveSchedulePatch(validatedBody(req)), + databaseService + .forAdministrator(getAuthUser(req)) + .saveSchedulePatch(validatedBody(req)), '定时备份配置已保存', ); }); /** POST /api/database/switch - 一键切换数据库(异步任务,返回 jobId) */ router.post('/switch', validate({ body: switchDatabaseSchema }), async (req, res) => { - const job = databaseService.startSwitch(validatedBody(req)); + const job = databaseService + .forAdministrator(getAuthUser(req)) + .startSwitch(validatedBody(req)); sendCreated(res, { jobId: job.id }, '切换任务已启动'); }); /** GET /api/database/switch/jobs/:id - 查询切换任务进度 */ router.get('/switch/jobs/:id', validate({ params: jobIdParamSchema }), async (req, res) => { const { id } = validatedParams<{ id: string }>(req); - const job = databaseService.getSwitchJob(id); + const job = databaseService.forAdministrator(getAuthUser(req)).getSwitchJob(id); sendOk(res, job, job ? 'ok' : '任务不存在'); }); diff --git a/packages/server/src/modules/database/database.service.ts b/packages/server/src/modules/database/database.service.ts index 7d36b1b..ab5f5a7 100644 --- a/packages/server/src/modules/database/database.service.ts +++ b/packages/server/src/modules/database/database.service.ts @@ -1,3 +1,5 @@ +import type { TokenPayload } from '../../lib/jwt.js'; +import { assertAdmin } from '../../lib/authz/index.js'; import { spawn } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; @@ -795,3 +797,23 @@ async function runSwitch(job: SwitchJob, target: TargetConnectionInput): Promise job.finishedAt = new Date().toISOString(); } } + +/** 请求入口必须携带 actor;后台调度只调用模块内部维护函数。 */ +export function forAdministrator(actor: TokenPayload) { + assertAdmin(actor); + return { + getDatabaseStatus, + testConnection, + listBackups, + createBackup, + restoreBackup, + deleteBackup, + exportSnapshotJson, + importSnapshotBase64, + sqliteFilePathForDownload, + getBackupSchedule, + saveSchedulePatch, + startSwitch, + getSwitchJob, + }; +} diff --git a/packages/server/src/modules/grades/grades.module.ts b/packages/server/src/modules/grades/grades.module.ts index d1e01d9..e74f7c7 100644 --- a/packages/server/src/modules/grades/grades.module.ts +++ b/packages/server/src/modules/grades/grades.module.ts @@ -1,11 +1,11 @@ import { Router } from 'express'; -import { sendCreated, sendOk } from '../../lib/http.js'; +import { ApiError, sendCreated, sendOk } from '../../lib/http.js'; import { idParamSchema } from '../../lib/schemas.js'; import { authenticate, getAuthUser, requirePermission, - requireStaffPermission, + requirePermissionOrClassDevice, } from '../../middleware/auth.js'; import { validate, validatedParams, validatedQuery } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; @@ -31,9 +31,10 @@ import * as gradeService from './grades.service.js'; const router = Router(); router.use(authenticate()); -router.get('/overview', async (req, res) => { +router.get('/overview', requirePermissionOrClassDevice('grade:read'), async (req, res) => { const user = getAuthUser(req); - const classId = user.classId ?? user.sub; + const classId = user.role === 'CLASS_DEVICE' ? (user.classId ?? user.sub) : String(req.query.classId ?? ''); + if (!classId) throw ApiError.badRequest('请指定班级'); const cls = await (await import('../../lib/db.js')).prisma.class.findUnique({ where: { id: classId } }); sendOk( res, @@ -42,14 +43,19 @@ router.get('/overview', async (req, res) => { : await gradeService.collectiveAnalysis(user, classId), ); }); -router.get('/collective', validate({ query: examListQuerySchema }), async (req, res) => { - const user = getAuthUser(req); - const { classId } = validatedQuery<{ classId: string }>(req); - sendOk(res, await gradeService.collectiveAnalysis(user, classId)); -}); +router.get( + '/collective', + requirePermissionOrClassDevice('grade:read'), + validate({ query: examListQuerySchema }), + async (req, res) => { + const user = getAuthUser(req); + const { classId } = validatedQuery<{ classId: string }>(req); + sendOk(res, await gradeService.collectiveAnalysis(user, classId)); + }, +); /** GET /api/grades/my - ClassHelper 班级端查看本班成绩(教师/管理员返回空数组) */ -router.get('/my', async (req, res) => { +router.get('/my', requirePermissionOrClassDevice('grade:read'), async (req, res) => { const user = getAuthUser(req); sendOk(res, await gradeService.listMyGrades(user), '获取本班成绩成功'); }); @@ -65,7 +71,7 @@ router.get('/my', async (req, res) => { */ router.get( '/student/:studentNo', - requireStaffPermission('student:grade-query'), + requirePermissionOrClassDevice('student:grade-query'), validate({ params: studentGradeParamSchema, query: studentGradeQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -93,11 +99,16 @@ router.get( * **刻意不挂权限键**:ClassHelper 班级端要用它列出可选考试(班级端的有效权限是空集, * 挂 `grade:read` 会把教室机器挡在门外)。边界在 service 里:`assertClassAccess` + 班级开关。 */ -router.get('/exams', validate({ query: examListQuerySchema }), async (req, res) => { - const user = getAuthUser(req); - const { classId } = validatedQuery<{ classId: string }>(req); - sendOk(res, await gradeService.listExams(user, classId), '获取考试列表成功'); -}); +router.get( + '/exams', + requirePermissionOrClassDevice('grade:read'), + validate({ query: examListQuerySchema }), + async (req, res) => { + const user = getAuthUser(req); + const { classId } = validatedQuery<{ classId: string }>(req); + sendOk(res, await gradeService.listExams(user, classId), '获取考试列表成功'); + }, +); /** PUT /api/grades/exams - 设置"这次考试是否把所有科目相加做总分排名"(教师/管理员) */ router.put( @@ -121,11 +132,16 @@ router.put( * 同样不挂权限键(班级端要看),边界在 service 里 —— 与按学号查明细共用 * `canQueryStudentGrades`:班级端受按班开关控制,教师端不受影响。 */ -router.get('/ranking', validate({ query: examRankingQuerySchema }), async (req, res) => { - const user = getAuthUser(req); - const { classId, examName } = validatedQuery<{ classId: string; examName: string }>(req); - sendOk(res, await gradeService.getExamRanking(user, classId, examName), '获取考试排名成功'); -}); +router.get( + '/ranking', + requirePermissionOrClassDevice('grade:read'), + validate({ query: examRankingQuerySchema }), + async (req, res) => { + const user = getAuthUser(req); + const { classId, examName } = validatedQuery<{ classId: string; examName: string }>(req); + sendOk(res, await gradeService.getExamRanking(user, classId, examName), '获取考试排名成功'); + }, +); /** GET /api/grades?classId=&courseId=&studentId=&examName= - 成绩列表(教师) */ router.get( diff --git a/packages/server/src/modules/grades/grades.service.ts b/packages/server/src/modules/grades/grades.service.ts index 1cb5860..8329723 100644 --- a/packages/server/src/modules/grades/grades.service.ts +++ b/packages/server/src/modules/grades/grades.service.ts @@ -1,3 +1,5 @@ +import { assertManage, assertPermissionOrClassDevice } from '../../lib/authz/index.js'; +import { assertContentWrite } from '../../lib/authz/index.js'; import type { CollectiveGradeAnalysisDto as ContractCollectiveGradeAnalysisDto } from '@classhelper/shared'; import { SOCKET_EVENTS, @@ -14,7 +16,6 @@ import { type StudentGradeDetailDto, } from '@classhelper/shared'; import { - assertCanManageSubjectContent, assertClassAccess, classScopeWhere, isClassDevice, @@ -57,16 +58,10 @@ const classSelect = { select: { name: true } } as const; const include = { course: courseSelect, student: studentSelect, class: classSelect } as const; async function assertDetailQuery(user: TokenPayload, classId: string): Promise { - await assertClassAccess(user, classId); + await assertClassAccess(user, classId, 'grade:read'); const cls = await prisma.class.findUniqueOrThrow({ where: { id: classId } }); - if ( - !canQueryStudentGrades({ - classRole: await resolveUserClassRole(user, classId), - gradeQueryEnabled: cls.studentGradeQueryEnabled, - }) - ) { + if (isClassDevice(user) && !cls.studentGradeQueryEnabled) throw ApiError.forbidden('本班只开放集体分析,未开放个人成绩'); - } } /** 服务端聚合;不返回极值、个人标识或可由补集反推的稀疏分段。 */ @@ -74,7 +69,7 @@ export async function collectiveAnalysis( user: TokenPayload, classId: string, ): Promise { - await assertClassAccess(user, classId); + await assertClassAccess(user, classId, 'grade:read'); const rows = await prisma.grade.findMany({ where: { classId, student: activeStudentWhere() }, select: { @@ -139,12 +134,17 @@ export interface ListGradeOptions { * 教师/管理员调用时返回空数组(他们没有"自己的成绩"),请用 `listGrades`。 */ export async function listMyGrades(user: TokenPayload): Promise { + await assertPermissionOrClassDevice(user, 'grade:read'); if (isClassDevice(user)) await assertDetailQuery(user, user.classId ?? user.sub); const studentIds = await resolvePersonalIds(user); if (studentIds.length === 0) return []; const grades = await prisma.grade.findMany({ - where: { studentId: { in: studentIds }, student: activeStudentWhere() }, + where: { + classId: user.classId ?? user.sub, + studentId: { in: studentIds }, + student: activeStudentWhere(), + }, include, orderBy: [{ publishedAt: 'desc' }, { examName: 'asc' }], take: 1000, @@ -154,7 +154,7 @@ export async function listMyGrades(user: TokenPayload): Promise { /** 教师 / 管理员查看成绩(按可访问班级过滤) */ export async function listGrades(user: TokenPayload, options: ListGradeOptions): Promise { - const scope = await resolveClassScope(user, options.classId); + const scope = await resolveClassScope(user, options.classId, 'grade:read'); if (isClassDevice(user)) await assertDetailQuery(user, user.classId ?? user.sub); const grades = await prisma.grade.findMany({ where: { @@ -220,11 +220,11 @@ export async function getGradeStats(user: TokenPayload, options: ListGradeOption /** * 录入一条成绩。 * - * 权限走 `assertCanManageSubjectContent`:**科任老师只能录自己任教科目**的成绩, + * 权限走 ``:**科任老师只能录自己任教科目**的成绩, * 班主任若不教这一科同样被拒;不指定科目(courseId 为空)时只有班主任/管理员可录。 */ export async function createGrade(user: TokenPayload, input: CreateGradeInput): Promise { - await assertCanManageSubjectContent(user, input.classId, input.courseId ?? null, '录入成绩'); + await assertContentWrite(user, 'grade:write', input.classId, input.courseId ?? null, '录入成绩'); await assertStudentInClass(input.studentId, input.classId); if (input.courseId) await assertCourseInClass(input.courseId, input.classId); @@ -249,7 +249,7 @@ export async function createGrade(user: TokenPayload, input: CreateGradeInput): /** 批量录入:同一个考试一次提交整班成绩 */ export async function bulkCreateGrades(user: TokenPayload, input: BulkCreateGradeInput): Promise { - await assertCanManageSubjectContent(user, input.classId, input.courseId ?? null, '录入成绩'); + await assertContentWrite(user, 'grade:write', input.classId, input.courseId ?? null, '录入成绩'); if (input.courseId) await assertCourseInClass(input.courseId, input.classId); const publishedAt = parseOptionalDate(input.publishedAt) ?? new Date(); @@ -292,8 +292,11 @@ export async function updateGrade( if (!current) throw ApiError.notFound('成绩记录不存在'); // 改的是哪条成绩,就按那条成绩所属的班级 + 科目判权限 + await assertContentWrite(user, 'grade:write', current.classId, current.courseId, '修改成绩', { + allowClassDevice: false, + }); const nextCourseId = input.courseId === undefined ? current.courseId : (input.courseId ?? null); - await assertCanManageSubjectContent(user, current.classId, nextCourseId, '修改成绩'); + await assertContentWrite(user, 'grade:write', current.classId, nextCourseId, '修改成绩'); if (nextCourseId) await assertCourseInClass(nextCourseId, current.classId); const totalScore = input.totalScore ?? current.totalScore; @@ -331,7 +334,7 @@ export async function updateGrade( export async function deleteGrade(user: TokenPayload, gradeId: string): Promise { const current = await prisma.grade.findFirst({ where: { id: gradeId, student: activeStudentWhere() } }); if (!current) throw ApiError.notFound('成绩记录不存在'); - await assertCanManageSubjectContent(user, current.classId, current.courseId, '删除成绩'); + await assertContentWrite(user, 'grade:write', current.classId, current.courseId, '删除成绩'); await prisma.grade.delete({ where: { id: gradeId } }); await emitGradeUpdated(current.classId, { @@ -369,7 +372,7 @@ export async function updateGradeLevels( // 逐条判权限:可能跨多个班级/科目(管理员在成绩页多选修改时会这样) for (const item of input.items) { const record = byId.get(item.id)!; - await assertCanManageSubjectContent(user, record.classId, record.courseId, '修改成绩等级'); + await assertContentWrite(user, 'grade:write', record.classId, record.courseId, '修改成绩等级'); } await prisma.$transaction( @@ -387,7 +390,7 @@ export async function updateGradeLevels( // 整批重算 const classId = input.classId!; - await assertCanManageSubjectContent(user, classId, input.courseId ?? null, '调整成绩等级'); + await assertContentWrite(user, 'grade:write', classId, input.courseId ?? null, '调整成绩等级'); const levelType = input.levelType!; if (levelType === 'custom') throw ApiError.badRequest('自定义等级不能由分数推算,请逐条填写等级'); const records = await prisma.grade.findMany({ @@ -433,7 +436,7 @@ export async function getStudentGradeDetail( requestedClassId?: string, ): Promise { if (isClassDevice(user)) await assertDetailQuery(user, user.classId ?? user.sub); - const scope = await resolveClassScope(user, requestedClassId); + const scope = await resolveClassScope(user, requestedClassId, 'student:grade-query'); const student = await prisma.student.findFirst({ where: { ...activeStudentWhere(), studentNo: normalizeStudentNo(studentNo), ...classScopeWhere(scope) }, @@ -458,7 +461,7 @@ export async function getStudentGradeDetail( } const grades = await prisma.grade.findMany({ - where: { studentId: student.id }, + where: { studentId: student.id, ...classScopeWhere(scope) }, include, orderBy: [{ publishedAt: 'desc' }, { examName: 'asc' }], take: 500, @@ -488,7 +491,7 @@ export async function getStudentGradeDetailById( }); if (!student || ('status' in student && !isActiveStudent(student as { status: string }))) throw ApiError.notFound('学生不存在'); - await assertClassAccess(user, student.classId ?? ''); + await assertClassAccess(user, student.classId ?? '', 'student:grade-query'); return getStudentGradeDetail(user, student.studentNo); } @@ -579,7 +582,8 @@ async function assertCourseInClass(courseId: string, classId: string): Promise { - await assertClassAccess(user, classId); + if (isClassDevice(user)) await assertDetailQuery(user, classId); + await assertClassAccess(user, classId, 'grade:read'); const [groups, exams] = await Promise.all([ prisma.grade.groupBy({ by: ['examName'], @@ -619,7 +623,7 @@ export async function setExamCountInTotal( name: string, countInTotal: boolean, ): Promise { - await assertClassAccess(user, classId); + await assertManage(user, 'grade:write', classId); if (!isStaff(user)) throw ApiError.forbidden('只有教师/管理员可以设置考试口径'); const row = await prisma.exam.upsert({ @@ -666,7 +670,7 @@ export async function getExamRanking( classId: string, examName: string, ): Promise { - await assertClassAccess(user, classId); + await assertClassAccess(user, classId, 'grade:read'); const classRecord = await prisma.class.findUnique({ where: { id: classId }, select: { name: true, studentGradeQueryEnabled: true }, diff --git a/packages/server/src/modules/homeworks/homeworks.module.ts b/packages/server/src/modules/homeworks/homeworks.module.ts index 322e81c..e6f0edd 100644 --- a/packages/server/src/modules/homeworks/homeworks.module.ts +++ b/packages/server/src/modules/homeworks/homeworks.module.ts @@ -4,7 +4,7 @@ import { idParamSchema } from '../../lib/schemas.js'; import { authenticate, getAuthUser, - requireStaffPermission, + requirePermissionOrClassDevice, requirePermission, } from '../../middleware/auth.js'; import { validate, validatedParams, validatedQuery } from '../../middleware/validate.js'; @@ -32,7 +32,7 @@ router.use(authenticate()); /** GET /api/homeworks?classId=&courseId=&pendingOnly=&keyword= - 作业列表 */ router.get( '/', - requireStaffPermission('homework:read'), + requirePermissionOrClassDevice('homework:read'), validate({ query: listHomeworksQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -54,7 +54,7 @@ router.get( */ router.get( '/days', - requireStaffPermission('homework:read'), + requirePermissionOrClassDevice('homework:read'), validate({ query: listHomeworkDaysQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -65,7 +65,7 @@ router.get( router.get( '/:id', - requireStaffPermission('homework:read'), + requirePermissionOrClassDevice('homework:read'), validate({ params: idParamSchema }), async (req, res) => { const user = getAuthUser(req); @@ -82,7 +82,7 @@ router.get( */ router.post( '/', - requireStaffPermission('homework:write'), + requirePermissionOrClassDevice('homework:write'), validate({ body: createHomeworkSchema }), async (req, res) => { const user = getAuthUser(req); @@ -99,7 +99,7 @@ router.post( * * 与 POST / 的区别:批量发布是 Web 管理端的"多班同发"工作流,因此这里挂 `homework:write`; * 教室机器的班级账号仍走单班录入(POST /,权限在服务层判,见 AGENTS.md 的现行工程约定)。 - * 每个班的科目归属依然由 createHomework 里的 assertCanManageSubjectContent 逐个判定 —— + * 每个班的科目归属依然由 createHomework 里的 逐个判定 —— * 批量不是绕过科目门的后门(§5 第 5 条)。 */ router.post( @@ -145,7 +145,7 @@ router.delete( /** PATCH /api/homeworks/:id/status - 标记完成 / 取消完成 */ router.patch( '/:id/status', - requireStaffPermission('homework:write'), + requirePermissionOrClassDevice('homework:write'), validate({ params: idParamSchema, body: updateHomeworkStatusSchema }), async (req, res) => { const user = getAuthUser(req); @@ -162,7 +162,7 @@ router.patch( /** GET /api/homeworks/:id/submissions - 提交名单(未交名单功能) */ router.get( '/:id/submissions', - requireStaffPermission('homework:read'), + requirePermissionOrClassDevice('homework:read'), validate({ params: idParamSchema }), async (req, res) => { const user = getAuthUser(req); @@ -175,7 +175,7 @@ router.get( /** PATCH /api/homeworks/:id/submissions - 勾选未交名单(其余学生一律视为已交) */ router.patch( '/:id/submissions', - requireStaffPermission('homework:write'), + requirePermissionOrClassDevice('homework:write'), validate({ params: idParamSchema, body: updateHomeworkSubmissionsSchema }), async (req, res) => { const user = getAuthUser(req); diff --git a/packages/server/src/modules/homeworks/homeworks.service.ts b/packages/server/src/modules/homeworks/homeworks.service.ts index 2f1e4a5..1882f98 100644 --- a/packages/server/src/modules/homeworks/homeworks.service.ts +++ b/packages/server/src/modules/homeworks/homeworks.service.ts @@ -1,4 +1,5 @@ -import { assertStaffPermission } from '../../lib/permissions.js'; +import { assertContentWrite } from '../../lib/authz/index.js'; +import { assertPermissionOrClassDevice } from '../../lib/permissions.js'; import { SOCKET_EVENTS, dayKeyLocal, @@ -12,13 +13,7 @@ import { type HomeworkSubmissionDto, type HomeworkSubmissionsDto, } from '@classhelper/shared'; -import { - assertCanManageSubjectContent, - assertClassAccess, - classScopeWhere, - isClassDevice, - resolveClassScope, -} from '../../lib/access.js'; +import { assertClassAccess, classScopeWhere, isClassDevice, resolveClassScope } from '../../lib/access.js'; import { normalizeBulkClassIds, summarizeBulk, toBulkFailure } from '../../lib/bulk.js'; import { activeStudentWhere, isActiveStudent } from '../../lib/students.js'; import { prisma } from '../../lib/db.js'; @@ -56,8 +51,8 @@ export async function listHomeworks( user: TokenPayload, options: ListHomeworkOptions, ): Promise { - await assertStaffPermission(user, 'homework:read'); - const scope = await resolveClassScope(user, options.classId); + await assertPermissionOrClassDevice(user, 'homework:read'); + const scope = await resolveClassScope(user, options.classId, 'homework:read'); const device = isClassDevice(user); // ClassHelper 班级端以全班学生为范围;教师/管理员没有"自己的完成状态" const personalIds = device ? await resolvePersonalIds(user) : []; @@ -97,8 +92,8 @@ export async function listHomeworkDays( user: TokenPayload, options: { classId?: string; from?: string; to?: string; days?: number }, ): Promise { - await assertStaffPermission(user, 'homework:read'); - const scope = await resolveClassScope(user, options.classId); + await assertPermissionOrClassDevice(user, 'homework:read'); + const scope = await resolveClassScope(user, options.classId, 'homework:read'); const today = dayKeyLocal(new Date()); const to = options.to ?? today; const from = options.from ?? shiftDayKey(to, -(options.days ?? 60) + 1); @@ -122,7 +117,7 @@ export async function listHomeworkDays( } export async function getHomework(user: TokenPayload, homeworkId: string): Promise { - await assertStaffPermission(user, 'homework:read'); + await assertPermissionOrClassDevice(user, 'homework:read'); const device = isClassDevice(user); const personalIds = device ? await resolvePersonalIds(user) : []; const homework = await prisma.homework.findUnique({ @@ -136,7 +131,7 @@ export async function getHomework(user: TokenPayload, homeworkId: string): Promi }, }); if (!homework) throw ApiError.notFound('作业不存在'); - await assertClassAccess(user, homework.classId); + await assertClassAccess(user, homework.classId, 'homework:read'); return toHomeworkDto(homework, { studentIds: device ? personalIds : [], @@ -149,15 +144,15 @@ export async function getHomework(user: TokenPayload, homeworkId: string): Promi /** * 发布作业并实时推送到班级房间。 * - * 权限走 `assertCanManageSubjectContent`(`allowClassDevice: true`): + * 权限走 ``(`allowClassDevice: true`): * - **选了科目** → 必须是该科的任课老师(班主任不教这一科也发不了); * - **没选科目** → 本班班主任或管理员; * - **ClassHelper 班级端** → 可以录(老师在教室电脑上顺手记一条是常见需求, * 见 AGENTS.md 的现行工程约定),班级端录入的作业归属该班班主任。 */ export async function createHomework(user: TokenPayload, input: CreateHomeworkInput): Promise { - await assertStaffPermission(user, 'homework:write'); - await assertCanManageSubjectContent(user, input.classId, input.courseId ?? null, '布置作业', { + await assertPermissionOrClassDevice(user, 'homework:write'); + await assertContentWrite(user, 'homework:write', input.classId, input.courseId ?? null, '布置作业', { allowClassDevice: true, }); if (input.courseId) await assertCourseInClass(input.courseId, input.classId); @@ -212,7 +207,7 @@ export async function bulkCreateHomeworks( user: TokenPayload, input: BulkCreateHomeworkRequest, ): Promise { - await assertStaffPermission(user, 'homework:write'); + await assertPermissionOrClassDevice(user, 'homework:write'); const classIds = normalizeBulkClassIds(input.classIds); const results: BulkPublishClassResult[] = []; @@ -261,13 +256,16 @@ export async function updateHomework( homeworkId: string, input: UpdateHomeworkInput, ): Promise { - await assertStaffPermission(user, 'homework:write'); + await assertPermissionOrClassDevice(user, 'homework:write'); const current = await prisma.homework.findUnique({ where: { id: homeworkId } }); if (!current) throw ApiError.notFound('作业不存在'); // 改科目等于把这条作业挪到另一个科目的权限域下,两端都要判 + await assertContentWrite(user, 'homework:write', current.classId, current.courseId, '修改作业', { + allowClassDevice: true, + }); const nextCourseId = input.courseId === undefined ? current.courseId : (input.courseId ?? null); - await assertCanManageSubjectContent(user, current.classId, nextCourseId, '修改作业', { + await assertContentWrite(user, 'homework:write', current.classId, nextCourseId, '修改作业', { allowClassDevice: true, }); if (nextCourseId) await assertCourseInClass(nextCourseId, current.classId); @@ -294,13 +292,13 @@ export async function updateHomework( } export async function deleteHomework(user: TokenPayload, homeworkId: string): Promise { - await assertStaffPermission(user, 'homework:write'); + await assertPermissionOrClassDevice(user, 'homework:write'); const current = await prisma.homework.findUnique({ where: { id: homeworkId }, include: { course: courseSelect, creator: creatorSelect }, }); if (!current) throw ApiError.notFound('作业不存在'); - await assertCanManageSubjectContent(user, current.classId, current.courseId, '删除作业', { + await assertContentWrite(user, 'homework:write', current.classId, current.courseId, '删除作业', { allowClassDevice: true, }); @@ -323,11 +321,13 @@ export async function updateHomeworkStatus( homeworkId: string, input: UpdateHomeworkStatusInput, ): Promise { - await assertStaffPermission(user, 'homework:write'); + await assertPermissionOrClassDevice(user, 'homework:write'); const homework = await prisma.homework.findUnique({ where: { id: homeworkId } }); if (!homework) throw ApiError.notFound('作业不存在'); - await assertClassAccess(user, homework.classId); + await assertContentWrite(user, 'homework:write', homework.classId, homework.courseId, '维护作业提交名单', { + allowClassDevice: true, + }); if (isClassDevice(user)) { const studentIds = await resolvePersonalIds(user); @@ -417,13 +417,15 @@ export async function listHomeworkSubmissions( user: TokenPayload, homeworkId: string, ): Promise { - await assertStaffPermission(user, 'homework:read'); + await assertPermissionOrClassDevice(user, 'homework:write'); const homework = await prisma.homework.findUnique({ where: { id: homeworkId }, - select: { id: true, classId: true }, + select: { id: true, classId: true, courseId: true }, }); if (!homework) throw ApiError.notFound('作业不存在'); - await assertClassAccess(user, homework.classId); + await assertContentWrite(user, 'homework:write', homework.classId, homework.courseId, '维护作业提交名单', { + allowClassDevice: true, + }); assertCanManageSubmissions(user); return buildSubmissions(homework.classId, homeworkId); } @@ -437,13 +439,15 @@ export async function updateHomeworkSubmissions( homeworkId: string, input: UpdateHomeworkSubmissionsInput, ): Promise { - await assertStaffPermission(user, 'homework:write'); + await assertPermissionOrClassDevice(user, 'homework:write'); const homework = await prisma.homework.findUnique({ where: { id: homeworkId }, - select: { id: true, classId: true }, + select: { id: true, classId: true, courseId: true }, }); if (!homework) throw ApiError.notFound('作业不存在'); - await assertClassAccess(user, homework.classId); + await assertContentWrite(user, 'homework:write', homework.classId, homework.courseId, '维护作业提交名单', { + allowClassDevice: true, + }); assertCanManageSubmissions(user); const students = await prisma.student.findMany({ diff --git a/packages/server/src/modules/imports/imports.module.ts b/packages/server/src/modules/imports/imports.module.ts index 9da905c..d05d767 100644 --- a/packages/server/src/modules/imports/imports.module.ts +++ b/packages/server/src/modules/imports/imports.module.ts @@ -6,7 +6,7 @@ import { idParamSchema } from '../../lib/schemas.js'; import { authenticate, getAuthUser, - requireStaffPermission, + requirePermissionOrClassDevice, requirePermission, requireAnyPermission, } from '../../middleware/auth.js'; @@ -115,7 +115,7 @@ router.post( const input = validatedBody(req); await assertImportKindAllowed(input.kind, getAuthUser(req)); // 教师名单与班级无关;成绩/学生名单必须带班级,否则拒绝(避免写到"全局") - if (input.kind !== 'teachers' && input.kind !== 'classTeachers' && !input.classId) { + if (input.kind === 'grades' && !input.classId) { throw ApiError.badRequest('请先选择要导入的班级'); } const result = await commitTable(getAuthUser(req), input); @@ -147,7 +147,7 @@ router.post( /** GET /api/imports/time-layout?classId= - 查看该班已导入的时间配置 */ router.get( '/time-layout', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: timeLayoutQuerySchema }), async (req, res) => { const { classId } = validatedQuery<{ classId: string }>(req); @@ -161,7 +161,7 @@ router.get( */ router.post( '/time-layout', - requirePermission('timetable:manage', 'import:schedule'), + requirePermission('schedule:write', 'import:schedule'), validate({ body: timeLayoutImportSchema }), async (req, res) => { const result = await importTimeLayout(getAuthUser(req), validatedBody(req)); @@ -178,7 +178,7 @@ router.post( /** DELETE /api/imports/time-layout/:id - 删除某份时间配置 */ router.delete( '/time-layout/:id', - requirePermission('timetable:manage'), + requirePermission('import:schedule', 'schedule:write'), validate({ params: idParamSchema }), async (req, res) => { const { id } = validatedParams<{ id: string }>(req); diff --git a/packages/server/src/modules/imports/table-import.service.ts b/packages/server/src/modules/imports/table-import.service.ts index ea9e9f0..ab2b4e1 100644 --- a/packages/server/src/modules/imports/table-import.service.ts +++ b/packages/server/src/modules/imports/table-import.service.ts @@ -1,7 +1,8 @@ +import { refreshClassSubscriptions } from '../../realtime/bus.js'; +import { assertAdmin, assertManage, assertContentWrite } from '../../lib/authz/index.js'; +import { changeStudentLifecycle, notifyStudentClasses } from '../../lib/student-lifecycle.js'; import { assertPermission } from '../../lib/permissions.js'; import { assertCanManageRoster, assertCanAssignTeachers, assertClassAccess } from '../../lib/access.js'; -import { addStudent } from '../classes/classes.service.js'; -import { updateStudent } from '../students/students.service.js'; import * as XLSX from 'xlsx'; import { formatClassName, normalizeStudentNo, type TableImportKind } from '@classhelper/shared'; import { activeStudentWhere, isActiveStudent } from '../../lib/students.js'; @@ -11,8 +12,6 @@ import { ApiError } from '../../lib/http.js'; import type { TokenPayload } from '../../lib/jwt.js'; import { logger } from '../../lib/logger.js'; import { hashPassword } from '../../lib/password.js'; -import { resolveUserClassRole } from '../../lib/access.js'; -import { canImport, canManageSubjectContent } from '@classhelper/shared'; import type { TableCommitInput, TableFileInput } from './imports.schemas.js'; /** @@ -362,7 +361,6 @@ export async function commitGrades(user: TokenPayload, input: TableCommitInput): * 不属于那门课的记录(且覆盖语义的 append/overwrite 会把它写进同一张表)。 * 判定沿用 shared 的 canManageSubjectContent,与 Web 端单条录入、作业发布**同一份规则**。 */ - const classRole = await resolveUserClassRole(user, classId); const errors: ImportRowError[] = []; const warnings: string[] = []; @@ -425,21 +423,7 @@ export async function commitGrades(user: TokenPayload, input: TableCommitInput): warnings.push(`第 ${rowNumber} 行:科目「${courseName}」不存在,已按"不指定科目"导入`); // 该科目的成绩能不能由**当前这个人**写(管理员全通;挂了科目就只能是该科任课老师) - const canWriteCourse = canManageSubjectContent({ - classRole, - hasSubject: Boolean(course), - isSubjectTeacherOfCourse: course ? course.teacherId === user.sub : false, - allowClassDevice: false, - }); - if (!canWriteCourse) { - errors.push({ - row: rowNumber, - message: course - ? `「${course.name}」不是你任教的科目,不能导入该科目的成绩` - : '不指定科目的成绩只有班主任或管理员可以导入,请填写科目列后再导入', - }); - continue; - } + await assertContentWrite(user, 'grade:import', classId, course?.id ?? null, '导入成绩'); // 表格里带等级列就按"自定义等级"落库(教师明确给了等级),否则按百分制换算 const levelType = levelText ? 'custom' : 'percent'; @@ -521,6 +505,15 @@ export async function commitStudents(user: TokenPayload, input: TableCommitInput else classByName.set(key, item); } + const operations: { + classId: string; + studentNo: string; + name: string; + gender: string; + guardianPhone: string; + existingId: string | null; + sourceClassId: string | null; + }[] = []; const errors: ImportRowError[] = []; const warnings: string[] = []; let inserted = 0; @@ -580,19 +573,68 @@ export async function commitStudents(user: TokenPayload, input: TableCommitInput skipped += 1; continue; } - if (existing.classId !== classId) - await addStudent(user, classId, { studentNo, name, gender, guardianPhone }); - await updateStudent(user, existing.id, { + if (existing.classId !== classId) await assertCanManageRoster(user, existing.classId ?? undefined); + operations.push({ + classId, + studentNo, name, - ...(gender ? { gender } : {}), - ...(guardianPhone ? { guardianPhone } : {}), + gender, + guardianPhone, + existingId: existing.id, + sourceClassId: existing.classId, }); updated += 1; } else { - await addStudent(user, classId, { studentNo, name, gender, guardianPhone }); + operations.push({ + classId, + studentNo, + name, + gender, + guardianPhone, + existingId: null, + sourceClassId: null, + }); inserted += 1; } } + await prisma.$transaction( + async (tx) => { + for (const op of operations) { + if (!op.existingId || op.sourceClassId !== op.classId) + await changeStudentLifecycle( + user, + { + studentIds: op.existingId ? [op.existingId] : [], + kind: 'class-change', + toClassId: op.classId, + note: '学生名单导入', + ...(!op.existingId + ? { + newStudent: { + studentNo: op.studentNo, + name: op.name, + gender: op.gender, + guardianPhone: op.guardianPhone, + }, + } + : {}), + }, + tx, + ); + if (op.existingId) + await tx.student.update({ + where: { id: op.existingId }, + data: { + name: op.name, + ...(op.gender ? { gender: op.gender } : {}), + ...(op.guardianPhone ? { guardianPhone: op.guardianPhone } : {}), + }, + }); + } + }, + { timeout: 30000 }, + ); + notifyStudentClasses(operations.flatMap((op) => [op.sourceClassId, op.classId])); const result: ImportResult = { kind: 'students', @@ -618,73 +660,94 @@ export async function commitStudents(user: TokenPayload, input: TableCommitInput */ export async function commitTeachers(user: TokenPayload, input: TableCommitInput): Promise { await assertImportAllowed(user, undefined, 'teachers'); - const buffer = decodeBase64(input.contentBase64); - const parsed = parseTable(buffer, input.fileName); + assertAdmin(user); + return prisma.$transaction( + async (tx) => { + const buffer = decodeBase64(input.contentBase64); + const parsed = parseTable(buffer, input.fileName); - const errors: ImportRowError[] = []; - const warnings: string[] = []; - let inserted = 0; - let updated = 0; - let skipped = 0; + const errors: ImportRowError[] = []; + const warnings: string[] = []; + let inserted = 0; + let updated = 0; + let skipped = 0; - for (const [index, row] of parsed.rows.entries()) { - const rowNumber = index + 2; - const username = cellValue(row, parsed.columns, input.mapping, 'username'); - const name = cellValue(row, parsed.columns, input.mapping, 'name'); - const phone = cellValue(row, parsed.columns, input.mapping, 'phone'); - const password = cellValue(row, parsed.columns, input.mapping, 'password'); - const roleCell = cellValue(row, parsed.columns, input.mapping, 'role'); + for (const [index, row] of parsed.rows.entries()) { + const rowNumber = index + 2; + const username = cellValue(row, parsed.columns, input.mapping, 'username'); + const name = cellValue(row, parsed.columns, input.mapping, 'name'); + const phone = cellValue(row, parsed.columns, input.mapping, 'phone'); + const password = cellValue(row, parsed.columns, input.mapping, 'password'); + const roleCell = cellValue(row, parsed.columns, input.mapping, 'role'); - if (!username || !name) { - errors.push({ row: rowNumber, message: '工号与姓名都必须填写' }); - continue; - } - if (!/^[A-Za-z0-9_.-]{3,32}$/.test(username)) { - errors.push({ row: rowNumber, message: `工号「${username}」格式不合法(3~32 位字母/数字/._-)` }); - continue; - } + if (!username || !name) { + errors.push({ row: rowNumber, message: '工号与姓名都必须填写' }); + continue; + } + if (!/^[A-Za-z0-9_.-]{3,32}$/.test(username)) { + errors.push({ row: rowNumber, message: `工号「${username}」格式不合法(3~32 位字母/数字/._-)` }); + continue; + } - const existing = await prisma.user.findUnique({ where: { username }, select: { id: true, role: true } }); - if (existing) { - if (input.mode === 'append') { - skipped += 1; - continue; + const existing = await tx.user.findUnique({ where: { username }, select: { id: true, role: true } }); + if (existing?.role === 'ADMIN') { + errors.push({ row: rowNumber, message: '管理员账号请通过教师账号管理修改' }); + continue; + } + if (existing) { + if (input.mode === 'append') { + skipped += 1; + continue; + } + const nextRole = parseTeacherRole(roleCell) ?? existing.role; + await tx.user.update({ + where: { id: existing.id }, + data: { name, role: nextRole, ...(phone ? { phone } : {}) }, + }); + updated += 1; + } else { + const initialPassword = password || env.defaultTeacherPassword; + await tx.user.create({ + data: { + username, + name, + phone, + role: parseTeacherRole(roleCell) ?? 'TEACHER', + passwordHash: await hashPassword(initialPassword), + }, + }); + inserted += 1; + } } - const nextRole = parseTeacherRole(roleCell) ?? existing.role; - await prisma.user.update({ - where: { id: existing.id }, - data: { name, role: nextRole, ...(phone ? { phone } : {}) }, - }); - updated += 1; - } else { - const initialPassword = password || env.defaultTeacherPassword; - await prisma.user.create({ + + const result: ImportResult = { + kind: 'teachers', + total: parsed.rows.length, + inserted, + updated, + skipped, + failed: errors.length, + errors, + warnings, + }; + logger.info( + `教师名单导入:模式=${input.mode} 新增=${inserted} 更新=${updated} 跳过=${skipped} 失败=${errors.length}`, + ); + await tx.permissionAudit.create({ data: { - username, - name, - phone, - role: parseTeacherRole(roleCell) ?? 'TEACHER', - passwordHash: await hashPassword(initialPassword), + actorId: user.sub, + actorName: user.name, + action: 'import-commitTeachers', + targetType: 'import', + targetId: '', + beforeJson: 'null', + afterJson: JSON.stringify(result), }, }); - inserted += 1; - } - } - - const result: ImportResult = { - kind: 'teachers', - total: parsed.rows.length, - inserted, - updated, - skipped, - failed: errors.length, - errors, - warnings, - }; - logger.info( - `教师名单导入:模式=${input.mode} 新增=${inserted} 更新=${updated} 跳过=${skipped} 失败=${errors.length}`, + return result; + }, + { timeout: 30000 }, ); - return result; } /* ------------------------------------------------------------------ 班级任课老师 */ @@ -705,160 +768,184 @@ export async function commitClassTeachers( input: TableCommitInput, ): Promise { await assertImportAllowed(user, undefined, 'classTeachers'); - const buffer = decodeBase64(input.contentBase64); - const parsed = parseTable(buffer, input.fileName); + assertAdmin(user); + return prisma + .$transaction( + async (tx) => { + const buffer = decodeBase64(input.contentBase64); + const parsed = parseTable(buffer, input.fileName); - const useTeacherNo = input.useTeacherNo !== false; // 默认开:有工号就优先按工号匹配 + const useTeacherNo = input.useTeacherNo !== false; // 默认开:有工号就优先按工号匹配 - const errors: ImportRowError[] = []; - const warnings: string[] = []; - let inserted = 0; - let updated = 0; - let skipped = 0; + const errors: ImportRowError[] = []; + const warnings: string[] = []; + let inserted = 0; + let updated = 0; + let skipped = 0; - const classes = await prisma.class.findMany({ - where: { archivedYearId: null }, - select: { id: true, name: true, teacherId: true }, - }); - const classByName = new Map(); - for (const item of classes) { - const key = item.name.toLowerCase(); - if (classByName.has(key)) classByName.delete(key); - else classByName.set(key, item); - } - - // 本次导入新建的教师账号(同一份表格里再遇到同名/同工号时复用,避免重复建号) - const createdTeachers = new Map(); - - for (const [index, row] of parsed.rows.entries()) { - const rowNumber = index + 2; - const className = cellValue(row, parsed.columns, input.mapping, 'className'); - const subjectName = cellValue(row, parsed.columns, input.mapping, 'subjectName'); - const teacherNo = cellValue(row, parsed.columns, input.mapping, 'teacherNo'); - const teacherName = cellValue(row, parsed.columns, input.mapping, 'teacherName'); - const roleCell = cellValue(row, parsed.columns, input.mapping, 'role'); - - if (!className || !teacherNo) { - errors.push({ row: rowNumber, message: '班级与教师工号都必须填写' }); - continue; - } - - const targetClass = classByName.get(className.toLowerCase()); - if (!targetClass) { - errors.push({ row: rowNumber, message: `找不到班级「${className}」(可能已毕业归档或名称重复)` }); - continue; - } - - await assertImportAllowed(user, targetClass.id, 'classTeachers'); - const role = parseClassTeacherRole(roleCell); - if (!role) { - errors.push({ row: rowNumber, message: `角色「${roleCell}」无法识别,请填「班主任」或「科任」` }); - continue; - } - if (role === 'SUBJECT' && !subjectName) { - errors.push({ row: rowNumber, message: '科任老师必须填写科目' }); - continue; - } - - // ---- 匹配或新建教师账号 - let teacherId = createdTeachers.get(teacherNo.toLowerCase()); - if (!teacherId) { - if (useTeacherNo) { - const byNo = await prisma.user.findUnique({ - where: { username: teacherNo }, - select: { id: true }, + const classes = await tx.class.findMany({ + where: { archivedYearId: null }, + select: { id: true, name: true, teacherId: true }, }); - if (byNo) { - teacherId = byNo.id; + const classByName = new Map(); + for (const item of classes) { + const key = item.name.toLowerCase(); + if (classByName.has(key)) classByName.delete(key); + else classByName.set(key, item); } - } else if (teacherName) { - const byName = await prisma.user.findMany({ - where: { name: teacherName, role: { in: ['TEACHER', 'ADMIN'] } }, - select: { id: true }, - take: 2, - }); - if (byName.length === 1) { - teacherId = byName[0]!.id; - } else if (byName.length > 1) { - errors.push({ - row: rowNumber, - message: `姓名「${teacherName}」对应多个教师账号,无法确定是哪一个;请打开「使用工号匹配」再导入`, - }); - continue; + + // 本次导入新建的教师账号(同一份表格里再遇到同名/同工号时复用,避免重复建号) + const createdTeachers = new Map(); + + for (const [index, row] of parsed.rows.entries()) { + const rowNumber = index + 2; + const className = cellValue(row, parsed.columns, input.mapping, 'className'); + const subjectName = cellValue(row, parsed.columns, input.mapping, 'subjectName'); + const teacherNo = cellValue(row, parsed.columns, input.mapping, 'teacherNo'); + const teacherName = cellValue(row, parsed.columns, input.mapping, 'teacherName'); + const roleCell = cellValue(row, parsed.columns, input.mapping, 'role'); + + if (!className || !teacherNo) { + errors.push({ row: rowNumber, message: '班级与教师工号都必须填写' }); + continue; + } + + const targetClass = classByName.get(className.toLowerCase()); + if (!targetClass) { + errors.push({ + row: rowNumber, + message: `找不到班级「${className}」(可能已毕业归档或名称重复)`, + }); + continue; + } + + const role = parseClassTeacherRole(roleCell); + if (!role) { + errors.push({ row: rowNumber, message: `角色「${roleCell}」无法识别,请填「班主任」或「科任」` }); + continue; + } + if (role === 'SUBJECT' && !subjectName) { + errors.push({ row: rowNumber, message: '科任老师必须填写科目' }); + continue; + } + + // ---- 匹配或新建教师账号 + let teacherId = createdTeachers.get(teacherNo.toLowerCase()); + if (!teacherId) { + if (useTeacherNo) { + const byNo = await tx.user.findUnique({ + where: { username: teacherNo }, + select: { id: true }, + }); + if (byNo) { + teacherId = byNo.id; + } + } else if (teacherName) { + const byName = await tx.user.findMany({ + where: { name: teacherName, role: { in: ['TEACHER', 'ADMIN'] } }, + select: { id: true }, + take: 2, + }); + if (byName.length === 1) { + teacherId = byName[0]!.id; + } else if (byName.length > 1) { + errors.push({ + row: rowNumber, + message: `姓名「${teacherName}」对应多个教师账号,无法确定是哪一个;请打开「使用工号匹配」再导入`, + }); + continue; + } + } + } + + if (!teacherId) { + if (!useTeacherNo) { + errors.push({ + row: rowNumber, + message: `按姓名找不到教师「${teacherName || teacherNo}」;请打开「使用工号匹配」以便按工号新建账号`, + }); + continue; + } + await assertPermission(user, 'teacher:manage'); + await assertPermission(user, 'import:teachers'); + const created = await tx.user.create({ + data: { + username: teacherNo, + name: teacherName || teacherNo, + role: 'TEACHER', + passwordHash: await hashPassword(env.defaultTeacherPassword), + }, + select: { id: true }, + }); + teacherId = created.id; + inserted += 1; + warnings.push( + `第 ${rowNumber} 行:工号 ${teacherNo} 没有对应账号,已新建教师「${teacherName || teacherNo}」(初始密码见部署配置)`, + ); + } + createdTeachers.set(teacherNo.toLowerCase(), teacherId); + + // ---- 写入角色 + if (role === 'HEAD') { + if (targetClass.teacherId === teacherId) { + skipped += 1; + continue; + } + await tx.class.update({ where: { id: targetClass.id }, data: { teacherId } }); + targetClass.teacherId = teacherId; + updated += 1; + } else { + const existing = await tx.course.findUnique({ + where: { classId_name: { classId: targetClass.id, name: subjectName } }, + select: { id: true, teacherId: true }, + }); + if (existing) { + if (existing.teacherId === teacherId) { + skipped += 1; + continue; + } + await tx.course.update({ where: { id: existing.id }, data: { teacherId } }); + } else { + await tx.course.create({ + data: { name: subjectName, classId: targetClass.id, teacherId }, + }); + } + updated += 1; + } } - } - } - if (!teacherId) { - if (!useTeacherNo) { - errors.push({ - row: rowNumber, - message: `按姓名找不到教师「${teacherName || teacherNo}」;请打开「使用工号匹配」以便按工号新建账号`, + const result: ImportResult = { + kind: 'classTeachers', + total: parsed.rows.length, + inserted, + updated, + skipped, + failed: errors.length, + errors, + warnings, + }; + logger.info( + `班级任课老师导入:用工号匹配=${useTeacherNo} 新建教师=${inserted} 更新关系=${updated} 跳过=${skipped} 失败=${errors.length}`, + ); + await tx.permissionAudit.create({ + data: { + actorId: user.sub, + actorName: user.name, + action: 'import-commitClassTeachers', + targetType: 'import', + targetId: '', + beforeJson: 'null', + afterJson: JSON.stringify(result), + }, }); - continue; - } - await assertPermission(user, 'teacher:manage'); - await assertPermission(user, 'import:teachers'); - const created = await prisma.user.create({ - data: { - username: teacherNo, - name: teacherName || teacherNo, - role: 'TEACHER', - passwordHash: await hashPassword(env.defaultTeacherPassword), - }, - select: { id: true }, - }); - teacherId = created.id; - inserted += 1; - warnings.push( - `第 ${rowNumber} 行:工号 ${teacherNo} 没有对应账号,已新建教师「${teacherName || teacherNo}」(初始密码见部署配置)`, - ); - } - createdTeachers.set(teacherNo.toLowerCase(), teacherId); - - // ---- 写入角色 - if (role === 'HEAD') { - if (targetClass.teacherId === teacherId) { - skipped += 1; - continue; - } - await prisma.class.update({ where: { id: targetClass.id }, data: { teacherId } }); - targetClass.teacherId = teacherId; - updated += 1; - } else { - const existing = await prisma.course.findUnique({ - where: { classId_name: { classId: targetClass.id, name: subjectName } }, - select: { id: true, teacherId: true }, - }); - if (existing) { - if (existing.teacherId === teacherId) { - skipped += 1; - continue; - } - await prisma.course.update({ where: { id: existing.id }, data: { teacherId } }); - } else { - await prisma.course.create({ - data: { name: subjectName, classId: targetClass.id, teacherId }, - }); - } - updated += 1; - } - } - - const result: ImportResult = { - kind: 'classTeachers', - total: parsed.rows.length, - inserted, - updated, - skipped, - failed: errors.length, - errors, - warnings, - }; - logger.info( - `班级任课老师导入:用工号匹配=${useTeacherNo} 新建教师=${inserted} 更新关系=${updated} 跳过=${skipped} 失败=${errors.length}`, - ); - return result; + return result; + }, + { timeout: 30000 }, + ) + .then((result) => { + refreshClassSubscriptions(); + return result; + }); } export async function commitTable(user: TokenPayload, input: TableCommitInput): Promise { @@ -890,19 +977,15 @@ async function assertImportAllowed( } as const; await assertPermission(user, key[kind]); if (classId) await assertClassAccess(user, classId, key[kind]); - if (kind === 'students') return assertCanManageRoster(user, classId); + if (kind === 'students') { + if (classId) await assertManage(user, 'import:students', classId); + return assertCanManageRoster(user, classId); + } if (kind === 'teachers') return assertPermission(user, 'teacher:manage'); if (kind === 'classTeachers') return assertCanAssignTeachers(user, classId); - const classRole = classId ? await resolveUserClassRole(user, classId) : 'NONE'; - if (canImport(user.role, classRole, kind)) return; - if (kind === 'grades') { - throw ApiError.forbidden( - classRole === 'SUBJECT' || classRole === 'CLASS_DEVICE' - ? '科任老师与 ClassHelper 班级端不能导入名单或成绩,请联系班主任或管理员' - : '只能导入自己担任班主任的班级的数据', - ); - } - throw ApiError.forbidden('该导入仅限管理员使用'); + if (kind === 'grades' && classId) return; + if (kind === 'scheduleTimes' && classId) return assertManage(user, 'import:schedule', classId); + throw ApiError.forbidden('请指定目标班级'); } /** 只接受明确的角色值;空值或未识别值保留原角色,避免意外降级。 */ diff --git a/packages/server/src/modules/imports/time-layout.service.ts b/packages/server/src/modules/imports/time-layout.service.ts index 91e29a9..50fe1ad 100644 --- a/packages/server/src/modules/imports/time-layout.service.ts +++ b/packages/server/src/modules/imports/time-layout.service.ts @@ -324,7 +324,7 @@ export async function importTimeLayout( user: TokenPayload, input: TimeLayoutImportInput, ): Promise<{ layout: TimeLayoutDto; mode: string; warnings: string[]; replaced: number; merged: number }> { - await assertCanImportSchedule(user, input.classId, 'timetable:manage'); + await assertCanImportSchedule(user, input.classId); const parsed = parseClassIslandTimeLayout(input.payload); if (parsed.errors.length > 0) { @@ -380,7 +380,7 @@ export async function importTimeLayout( actionSet: '{}', }; }); - const layout = await saveLayout({ classId: input.classId, name, points }, current?.id); + const layout = await saveLayout(user, { classId: input.classId, name, points }, current?.id); logger.info(`课表时间配置导入:班级=${input.classId} 模式=${input.mode} 共 ${combined.length} 个时间点`); return { layout: toDto(layout), diff --git a/packages/server/src/modules/notifications/notifications.module.ts b/packages/server/src/modules/notifications/notifications.module.ts index 2674c1e..353a876 100644 --- a/packages/server/src/modules/notifications/notifications.module.ts +++ b/packages/server/src/modules/notifications/notifications.module.ts @@ -4,7 +4,7 @@ import { idParamSchema } from '../../lib/schemas.js'; import { authenticate, getAuthUser, - requireStaffPermission, + requirePermissionOrClassDevice, requirePermission, } from '../../middleware/auth.js'; import { validate, validatedParams, validatedQuery } from '../../middleware/validate.js'; @@ -28,7 +28,7 @@ router.use(authenticate()); /** GET /api/notifications?classId=&priority=&unreadOnly=&date=&from=&to=&createdBy= - 通知列表 */ router.get( '/', - requireStaffPermission('notification:read'), + requirePermissionOrClassDevice('notification:read'), validate({ query: listNotificationsQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -40,7 +40,7 @@ router.get( /** GET /api/notifications/days?classId=&from=&to=&createdBy= - 按天归档(日期 + 条数) */ router.get( '/days', - requireStaffPermission('notification:read'), + requirePermissionOrClassDevice('notification:read'), validate({ query: notificationArchiveQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -52,7 +52,7 @@ router.get( /** GET /api/notifications/creators?classId=&from=&to=&date= - 按发布人归档 */ router.get( '/creators', - requireStaffPermission('notification:read'), + requirePermissionOrClassDevice('notification:read'), validate({ query: notificationArchiveQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -64,7 +64,7 @@ router.get( /** GET /api/notifications/unread-count?classId= - 未读数(客户端红点) */ router.get( '/unread-count', - requireStaffPermission('notification:read'), + requirePermissionOrClassDevice('notification:read'), validate({ query: notificationScopeQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -76,7 +76,7 @@ router.get( /** POST /api/notifications/read-all - 全部标为已读 */ router.post( '/read-all', - requireStaffPermission('notification:read'), + requirePermissionOrClassDevice('notification:read'), validate({ body: notificationScopeQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -88,7 +88,7 @@ router.post( /** POST /api/notifications - 发布通知(发布后广播 notification:new) */ router.post( '/', - requireStaffPermission('notification:publish'), + requirePermissionOrClassDevice('notification:publish'), validate({ body: createNotificationSchema }), async (req, res) => { const user = getAuthUser(req); @@ -100,7 +100,7 @@ router.post( /** POST /api/notifications/bulk - 一次给多个班级发同一条通知(逐班结果,不整批回滚) */ router.post( '/bulk', - requireStaffPermission('notification:publish'), + requirePermissionOrClassDevice('notification:publish'), validate({ body: bulkCreateNotificationSchema }), async (req, res) => { const user = getAuthUser(req); @@ -115,7 +115,7 @@ router.post( /** POST /api/notifications/:id/read - 标记已读 */ router.post( '/:id/read', - requireStaffPermission('notification:read'), + requirePermissionOrClassDevice('notification:read'), validate({ params: idParamSchema }), async (req, res) => { const user = getAuthUser(req); diff --git a/packages/server/src/modules/notifications/notifications.service.ts b/packages/server/src/modules/notifications/notifications.service.ts index 050fd32..eddfd46 100644 --- a/packages/server/src/modules/notifications/notifications.service.ts +++ b/packages/server/src/modules/notifications/notifications.service.ts @@ -1,4 +1,6 @@ -import { assertStaffPermission, assertPermission } from '../../lib/permissions.js'; +import { assertClassRead, isHead } from '../../lib/authz/index.js'; +import { assertPublish } from '../../lib/authz/index.js'; +import { assertPermissionOrClassDevice, assertPermission } from '../../lib/permissions.js'; import { resolveContentCreator } from '../../lib/access.js'; import { SOCKET_EVENTS, @@ -12,12 +14,7 @@ import { type NotificationDto, } from '@classhelper/shared'; import { normalizeBulkClassIds, summarizeBulk, toBulkFailure } from '../../lib/bulk.js'; -import { - assertClassAccess, - assertCanPublishNotification, - classScopeWhere, - resolveClassScope, -} from '../../lib/access.js'; +import { assertClassAccess, classScopeWhere, resolveClassScope } from '../../lib/access.js'; import { activeStudentWhere } from '../../lib/students.js'; import { prisma } from '../../lib/db.js'; import { ApiError } from '../../lib/http.js'; @@ -73,8 +70,8 @@ export async function listNotifications( user: TokenPayload, options: ListNotificationOptions, ): Promise { - await assertStaffPermission(user, 'notification:read'); - const scope = await resolveClassScope(user, options.classId); + await assertPermissionOrClassDevice(user, 'notification:read'); + const scope = await resolveClassScope(user, options.classId, 'notification:read'); const isStaff = user.role === 'ADMIN' || user.role === 'TEACHER'; // 班级账号(班级设备)以全班学生为"个人范围",普通学生就是自己 const personalIds = await resolvePersonalIds(user); @@ -112,8 +109,8 @@ export async function listNotificationDays( user: TokenPayload, options: { classId?: string; priority?: string; createdBy?: string; from?: string; to?: string }, ): Promise { - await assertStaffPermission(user, 'notification:read'); - const scope = await resolveClassScope(user, options.classId); + await assertPermissionOrClassDevice(user, 'notification:read'); + const scope = await resolveClassScope(user, options.classId, 'notification:read'); const grouped = await prisma.notification.groupBy({ by: ['assignDate'], where: { ...classScopeWhere(scope), ...archiveWhere(options) }, @@ -133,8 +130,8 @@ export async function listNotificationCreators( user: TokenPayload, options: { classId?: string; priority?: string; date?: string; from?: string; to?: string }, ): Promise { - await assertStaffPermission(user, 'notification:read'); - const scope = await resolveClassScope(user, options.classId); + await assertPermissionOrClassDevice(user, 'notification:read'); + const scope = await resolveClassScope(user, options.classId, 'notification:read'); const grouped = await prisma.notification.groupBy({ by: ['createdBy'], where: { ...classScopeWhere(scope), ...archiveWhere(options) }, @@ -171,7 +168,7 @@ export async function bulkCreateNotifications( user: TokenPayload, input: BulkCreateNotificationRequest, ): Promise { - await assertStaffPermission(user, 'notification:publish'); + await assertPermissionOrClassDevice(user, 'notification:publish'); const classIds = normalizeBulkClassIds(input.classIds); const results: BulkPublishClassResult[] = []; @@ -208,8 +205,8 @@ export async function createNotification( user: TokenPayload, input: CreateNotificationInput, ): Promise { - await assertStaffPermission(user, 'notification:publish'); - await assertCanPublishNotification(user, input.classId); + await assertPermissionOrClassDevice(user, 'notification:publish'); + await assertPublish(user, 'notification:publish', input.classId, { allowClassDevice: true }); const priority = input.priority ?? 'NORMAL'; if (priority === 'URGENT' && input.confirmDuringClass !== true) { @@ -251,7 +248,9 @@ export async function deleteNotification(user: TokenPayload, notificationId: str await assertPermission(user, 'notification:delete'); const current = await prisma.notification.findUnique({ where: { id: notificationId } }); if (!current) throw ApiError.notFound('通知不存在'); - await assertCanPublishNotification(user, current.classId); + await assertClassRead(user, 'notification:delete', current.classId); + if (user.role !== 'ADMIN' && current.createdBy !== user.sub && !(await isHead(user, current.classId))) + throw ApiError.forbidden('只有发布者、班主任或管理员可删除通知'); await prisma.notification.delete({ where: { id: notificationId } }); emitToClass(current.classId, SOCKET_EVENTS.notificationDeleted, { id: notificationId, @@ -267,10 +266,10 @@ export async function markAsRead( user: TokenPayload, notificationId: string, ): Promise<{ notificationId: string; readAt: string; marked: number }> { - await assertStaffPermission(user, 'notification:read'); + await assertPermissionOrClassDevice(user, 'notification:read'); const notification = await prisma.notification.findUnique({ where: { id: notificationId } }); if (!notification) throw ApiError.notFound('通知不存在'); - await assertClassAccess(user, notification.classId); + await assertClassAccess(user, notification.classId, 'notification:read'); const personalIds = await resolvePersonalIds(user); // 先过滤已读过的记录再创建:SQLite 下 createMany 不支持 skipDuplicates, @@ -293,8 +292,8 @@ export async function markAsRead( /** 全部标为已读(可按班级限定) */ export async function markAllAsRead(user: TokenPayload, classId?: string): Promise<{ marked: number }> { - await assertStaffPermission(user, 'notification:read'); - const scope = await resolveClassScope(user, classId); + await assertPermissionOrClassDevice(user, 'notification:read'); + const scope = await resolveClassScope(user, classId, 'notification:read'); const personalIds = await resolvePersonalIds(user); const personalWhere = personalIdWhere(personalIds); @@ -324,8 +323,8 @@ export async function markAllAsRead(user: TokenPayload, classId?: string): Promi /** 未读数量(客户端红点) */ export async function unreadCount(user: TokenPayload, classId?: string): Promise { - await assertStaffPermission(user, 'notification:read'); - const scope = await resolveClassScope(user, classId); + await assertPermissionOrClassDevice(user, 'notification:read'); + const scope = await resolveClassScope(user, classId, 'notification:read'); const personalIds = await resolvePersonalIds(user); return prisma.notification.count({ where: { ...classScopeWhere(scope), reads: { none: personalIdWhere(personalIds) } }, diff --git a/packages/server/src/modules/permissions/permissions.module.ts b/packages/server/src/modules/permissions/permissions.module.ts index d467312..37d5b88 100644 --- a/packages/server/src/modules/permissions/permissions.module.ts +++ b/packages/server/src/modules/permissions/permissions.module.ts @@ -1,9 +1,14 @@ import { z } from 'zod'; import { Router } from 'express'; -import { sendCreated, sendOk } from '../../lib/http.js'; +import { ApiError, sendCreated, sendOk } from '../../lib/http.js'; import { idParamSchema } from '../../lib/schemas.js'; -import { authenticate, getAuthUser, requirePermission } from '../../middleware/auth.js'; -import { validate, validatedBody, validatedParams, validatedQuery } from '../../middleware/validate.js'; +import { authenticate, getAuthUser, requirePermission, requireAdmin } from '../../middleware/auth.js'; +import { + validateBadRequest as validate, + validatedBody, + validatedParams, + validatedQuery, +} from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; import { assignUserGroupsSchema, @@ -29,17 +34,19 @@ router.get('/me', async (req, res) => { sendOk(res, await permissionService.myPermissions(user), '获取当前权限成功'); }); +router.use(requireAdmin()); + /** GET /api/permissions/catalog - 权限键目录(权限页整棵勾选树的唯一来源) */ -router.get('/catalog', requirePermission('permission:manage'), async (_req, res) => { - sendOk(res, await permissionService.permissionCatalog(), '获取权限目录成功'); +router.get('/catalog', requirePermission('permission:manage'), async (req, res) => { + sendOk(res, await permissionService.permissionCatalog(getAuthUser(req)), '获取权限目录成功'); }); /** GET /api/permissions/groups - 权限组列表 */ -router.get('/groups', requirePermission('permission:manage'), async (_req, res) => { - sendOk(res, await permissionService.listGroups(), '获取权限组成功'); +router.get('/groups', requirePermission('permission:manage'), async (req, res) => { + sendOk(res, await permissionService.listGroups(getAuthUser(req)), '获取权限组成功'); }); -router.get('/scopes', requirePermission('permission:manage'), async (_req, res) => +router.get('/scopes', requirePermission('permission:manage'), async (req, res) => sendOk(res, await permissionService.scopeOptions()), ); router.get( @@ -53,14 +60,15 @@ router.get( }), async (req, res) => { const { page, pageSize } = validatedQuery<{ page: number; pageSize: number }>(req); - sendOk(res, await permissionService.listAudits(page, pageSize)); + sendOk(res, await permissionService.listAudits(getAuthUser(req), page, pageSize)); }, ); router.get( '/groups/:id/members', requirePermission('permission:manage'), validate({ params: idParamSchema }), - async (req, res) => sendOk(res, await permissionService.groupMembers(String(req.params.id))), + async (req, res) => + sendOk(res, await permissionService.groupMembers(getAuthUser(req), String(req.params.id))), ); /** POST /api/permissions/groups - 新建权限组 */ @@ -99,10 +107,29 @@ router.delete( ); /** GET /api/permissions/users - 成员列表(含所属权限组与生效权限数量) */ -router.get('/users', requirePermission('permission:manage'), async (_req, res) => { - sendOk(res, await permissionService.listMembers(), '获取成员成功'); +router.get('/users', requirePermission('permission:manage'), async (req, res) => { + sendOk(res, await permissionService.listMembers(getAuthUser(req)), '获取成员成功'); }); +router.get( + '/users/:id/effective', + validate({ params: idParamSchema, query: z.object({ assignments: z.string().max(16000).optional() }) }), + async (req, res) => { + const query = validatedQuery<{ assignments?: string }>(req); + let preview: AssignUserGroupsInput | undefined; + if (query.assignments !== undefined) { + try { + preview = assignUserGroupsSchema.parse({ assignments: JSON.parse(query.assignments) }); + } catch { + throw ApiError.badRequest('分配预览格式不正确'); + } + } + sendOk( + res, + await permissionService.effectivePermissions(getAuthUser(req), String(req.params.id), preview), + ); + }, +); /** PUT /api/permissions/users/:id/groups - 整体替换某账号的权限组 */ router.put( '/users/:id/groups', diff --git a/packages/server/src/modules/permissions/permissions.schemas.ts b/packages/server/src/modules/permissions/permissions.schemas.ts index 72d0cc6..15f2a09 100644 --- a/packages/server/src/modules/permissions/permissions.schemas.ts +++ b/packages/server/src/modules/permissions/permissions.schemas.ts @@ -22,7 +22,7 @@ const keysSchema = z.array(permissionKeySchema).max(200, '一次最多提交 200 export const createPermissionGroupSchema = z.object({ name: z.string().trim().min(1, '请输入权限组名称').max(40, '权限组名称最多 40 个字'), description: z.string().trim().max(200, '描述最多 200 个字').optional(), - scope: z.enum(['SELF_CLASS', 'GRADE', 'DIVISION', 'ALL']).optional(), + scope: z.enum(['TEACHING', 'HEAD', 'GRADE', 'DIVISION', 'ALL']).optional(), scopeValue: z.string().trim().max(200).optional(), keys: keysSchema.optional(), }); @@ -36,15 +36,33 @@ export const createPermissionGroupSchema = z.object({ export const updatePermissionGroupSchema = z.object({ name: z.string().trim().min(1, '请输入权限组名称').max(40, '权限组名称最多 40 个字').optional(), description: z.string().trim().max(200, '描述最多 200 个字').optional(), - scope: z.enum(['SELF_CLASS', 'GRADE', 'DIVISION', 'ALL']).optional(), + scope: z.enum(['TEACHING', 'HEAD', 'GRADE', 'DIVISION', 'ALL']).optional(), scopeValue: z.string().trim().max(200).optional(), keys: keysSchema.optional(), }); /** 给账号分配权限组:整体替换;传空数组 = 回到角色默认模板 */ -export const assignUserGroupsSchema = z.object({ - groupIds: z.array(z.string().min(1)).max(50, '一次最多分配 50 个权限组'), -}); +export const assignUserGroupsSchema = z + .object({ + groupIds: z.array(z.string().min(1)).max(50).optional(), + assignments: z + .array( + z + .object({ + groupId: z.string().min(1), + scope: z.enum(['TEACHING', 'HEAD', 'GRADE', 'DIVISION', 'ALL']), + scopeValue: z.string().max(200).default(''), + }) + .strict(), + ) + .max(50) + .optional(), + }) + .strict() + .refine( + (v) => (v.assignments !== undefined) !== (v.groupIds !== undefined), + '请提供 assignments 或 groupIds 之一', + ); export type CreatePermissionGroupInput = z.infer; export type UpdatePermissionGroupInput = z.infer; diff --git a/packages/server/src/modules/permissions/permissions.service.ts b/packages/server/src/modules/permissions/permissions.service.ts index b314bd6..2e7599a 100644 --- a/packages/server/src/modules/permissions/permissions.service.ts +++ b/packages/server/src/modules/permissions/permissions.service.ts @@ -1,165 +1,72 @@ +import { disconnectUserSessions } from '../../realtime/bus.js'; import { - PERMISSION_CATEGORIES, PERMISSION_KEYS, + PERMISSION_META, PERMISSION_LABELS, + PERMISSION_CATEGORIES, ROLE_DEFAULT_PERMISSIONS, + parsePermissionScope, + defaultPromotionPlan, + type PermissionKey, + type PermissionScope, + type PermissionGroupDto, + type PermissionMemberDto, + type PermissionCatalogDto, + type EffectivePermissionsDto, type AssignUserGroupsRequest, type CreatePermissionGroupRequest, - type MyPermissionsDto, - type PermissionCatalogDto, - type PermissionGroupDto, - type PermissionKey, - type PermissionMemberDto, type UpdatePermissionGroupRequest, - type UserRole, + type PromotionPlan, } from '@classhelper/shared'; import { prisma } from '../../lib/db.js'; import { ApiError } from '../../lib/http.js'; import type { TokenPayload } from '../../lib/jwt.js'; +import { ensureDefaultGroups } from '../../lib/permissions.js'; import { - parsePermissionScope, - defaultPromotionPlan, - type PermissionScope, - type PromotionPlan, -} from '@classhelper/shared'; -import { assertPermission } from '../../lib/permissions.js'; + assertAdmin, + invalidateAuthPrincipals, + loadAuthPrincipal, + principalForAssignments, + classIdsFor, + manageClassIdsFor, + actionScopesFor, + type AssignmentRow, +} from '../../lib/authz/index.js'; import { getSetting } from '../../lib/settings.js'; -import { - ADMIN_UNREMOVABLE_PERMISSIONS, - ensureDefaultGroups, - loadEffectivePermissions, -} from '../../lib/permissions.js'; -/** - * 权限组服务:组 / 键 / 成员三件事的全部读写都收在这里。 - * - * 生效权限的计算**不在本文件**,而在 `lib/permissions.ts` 的 `loadEffectivePermissions` - * (鉴权中间件每请求调用一次);本文件只负责"编辑这些组",两者共用同一份 shared 常量。 - */ - -const GROUP_SELECT = { - id: true, - name: true, - description: true, - builtin: true, - defaultRole: true, - scope: true, - scopeValue: true, - createdAt: true, - updatedAt: true, - items: { select: { key: true } }, - _count: { select: { users: true } }, -} as const; - -type GroupRow = { - id: string; - name: string; - description: string; - builtin: boolean; - defaultRole: string | null; - scope: string; - scopeValue: string; - createdAt: Date; - updatedAt: Date; - items: { key: string }[]; - _count: { users: number }; -}; - -const MEMBER_SELECT = { - id: true, - username: true, - name: true, - role: true, - permissionGroups: { select: { groupId: true } }, -} as const; - -/** 目录顺序(key → 序号):组的键与"我的权限"都按它排序,前端渲染才稳定 */ -const KEY_ORDER = new Map(PERMISSION_KEYS.map((key, index) => [key, index])); - -function knownKey(key: string): key is PermissionKey { - return KEY_ORDER.has(key); -} - -function byCatalogOrder(a: string, b: string): number { - return (KEY_ORDER.get(a) ?? Number.MAX_SAFE_INTEGER) - (KEY_ORDER.get(b) ?? Number.MAX_SAFE_INTEGER); -} - -/** 去重 + 丢掉已下线的键 + 按目录顺序排序 */ -function normalizeKeys(keys: readonly string[] | undefined): PermissionKey[] { - const unique = new Set(); - for (const key of keys ?? []) if (knownKey(key)) unique.add(key); - return [...unique].sort(byCatalogOrder); -} - -function toGroupDto(row: GroupRow): PermissionGroupDto { - return { - id: row.id, - scope: row.scope as PermissionGroupDto['scope'], - scopeValue: row.scopeValue, - scopeLabel: scopeLabel(row), - name: row.name, - description: row.description, - builtin: row.builtin, - defaultRole: row.defaultRole as UserRole | null, - keys: row.items - .map((item) => item.key) - .filter(knownKey) - .sort(byCatalogOrder), - memberCount: row._count.users, - createdAt: row.createdAt.toISOString(), - updatedAt: row.updatedAt.toISOString(), - }; -} - -function scopeLabel(group: { scope: string; scopeValue: string }) { +const include = { items: true, _count: { select: { users: true } } } as const; +type Group = Awaited>>[number]; +const known = (key: string): key is PermissionKey => (PERMISSION_KEYS as readonly string[]).includes(key); +const keysFor = (group: { items: { key: string }[] }) => group.items.map((i) => i.key).filter(known); +const activeKeys = (group: { items: { key: string }[] }) => + keysFor(group).filter((key) => PERMISSION_META[key].kind !== 'admin'); +function label(scope: string, scopeValue: string) { try { - return parsePermissionScope(group.scope as PermissionScope, group.scopeValue).scopeLabel; + return parsePermissionScope(scope as PermissionScope, scopeValue).scopeLabel; } catch { return '未配置范围(无班级访问权)'; } } - -export async function scopeOptions() { - const classes = await prisma.class.findMany({ distinct: ['grade'], select: { grade: true } }); - const raw = await getSetting('term.promotionPlan'); - const plan: PromotionPlan = raw ? JSON.parse(raw) : defaultPromotionPlan(); - const planGrades = plan.tracks.flatMap((track) => track.stages.map((stage) => stage.grade)); +function dto(group: Group): PermissionGroupDto { + const inactiveKeys = keysFor(group).filter((k) => PERMISSION_META[k].kind === 'admin'); return { - grades: [...new Set([...classes.map((cls) => cls.grade), ...planGrades])].sort(), - planGrades, - divisions: plan.tracks.map((track) => ({ - name: track.name, - grades: track.stages.map((stage) => stage.grade), - })), + ...group, + keys: activeKeys(group), + scope: group.scope as PermissionScope, + scopeLabel: label(group.scope, group.scopeValue), + defaultScope: group.scope as PermissionScope, + defaultScopeValue: group.scopeValue, + defaultScopeLabel: label(group.scope, group.scopeValue), + defaultRole: group.defaultRole === 'TEACHER' ? 'TEACHER' : null, + kind: group.defaultRole ? 'default' : group.builtin ? 'builtin' : 'custom', + inactiveKeys, + warnings: inactiveKeys.length ? ['旧管理员专用键已停用,仅管理员固定拥有'] : [], + memberCount: group._count.users, + createdAt: group.createdAt.toISOString(), + updatedAt: group.updatedAt.toISOString(), }; } - -async function validateScope(input: { scope?: PermissionScope; scopeValue?: string }) { - try { - return parsePermissionScope( - input.scope ?? 'SELF_CLASS', - input.scopeValue ?? '', - (await scopeOptions()).grades, - ); - } catch (error) { - throw ApiError.badRequest(String(error instanceof Error ? error.message : error)); - } -} - -async function assertGrant( - actor: TokenPayload, - group: { scope: string; defaultRole?: string | null; keys: readonly string[] }, -) { - await assertPermission(actor, 'permission:manage'); - if (actor.role === 'ADMIN') return; - if (group.defaultRole) throw ApiError.forbidden('只有管理员可以管理角色默认组'); - if (group.scope !== 'SELF_CLASS') throw ApiError.forbidden('只有管理员可以管理年级、部或全校范围组'); - const own = await loadEffectivePermissions(actor); - if (group.keys.some((key) => !own.has(key as PermissionKey))) - throw ApiError.forbidden('不能授予或管理超出自己生效权限的组'); -} - -function auditData( +export function auditData( actor: TokenPayload, action: string, targetType: string, @@ -177,17 +84,34 @@ function auditData( afterJson: JSON.stringify(after), }; } - -export async function createGroup( - actor: TokenPayload, - input: CreatePermissionGroupRequest, -): Promise { - const scope = await validateScope(input); - const keys = normalizeKeys(input.keys); - await assertGrant(actor, { ...scope, keys }); - if (await prisma.permissionGroup.findUnique({ where: { name: input.name.trim() } })) - throw ApiError.conflict('权限组名称已存在'); - const created = await prisma.$transaction(async (tx) => { +export async function scopeOptions() { + const classes = await prisma.class.findMany({ distinct: ['grade'], select: { grade: true } }); + const raw = await getSetting('term.promotionPlan'); + const plan: PromotionPlan = raw ? JSON.parse(raw) : defaultPromotionPlan(); + const planGrades = plan.tracks.flatMap((t) => t.stages.map((s) => s.grade)); + return { + grades: [...new Set([...classes.map((c) => c.grade), ...planGrades])].sort(), + planGrades, + divisions: plan.tracks.map((t) => ({ name: t.name, grades: t.stages.map((s) => s.grade) })), + }; +} +async function validateScope(scope: PermissionScope = 'TEACHING', scopeValue = '') { + try { + return parsePermissionScope(scope, scopeValue, (await scopeOptions()).grades); + } catch (error) { + throw ApiError.badRequest(error instanceof Error ? error.message : String(error)); + } +} +function validateKeys(keys: readonly string[]) { + if (keys.some((k) => !known(k) || PERMISSION_META[k].kind === 'admin')) + throw ApiError.badRequest('教师模板不能包含管理员专用键或未知键'); + return [...new Set(keys)] as PermissionKey[]; +} +export async function createGroup(actor: TokenPayload, input: CreatePermissionGroupRequest) { + assertAdmin(actor); + const scope = await validateScope(input.scope, input.scopeValue); + const keys = validateKeys(input.keys ?? []); + return prisma.$transaction(async (tx) => { const row = await tx.permissionGroup.create({ data: { name: input.name.trim(), @@ -196,35 +120,34 @@ export async function createGroup( scopeValue: scope.scopeValue, items: { create: keys.map((key) => ({ key })) }, }, - select: GROUP_SELECT, + include, }); - await tx.permissionAudit.create({ - data: auditData(actor, 'create', 'group', row.id, null, toGroupDto(row)), - }); - return row; + await tx.permissionAudit.create({ data: auditData(actor, 'create', 'group', row.id, null, dto(row)) }); + invalidateAuthPrincipals(); + return dto(row); }); - return toGroupDto(created); } - -export async function updateGroup( - actor: TokenPayload, - groupId: string, - input: UpdatePermissionGroupRequest, -): Promise { - const current = await prisma.permissionGroup.findUnique({ where: { id: groupId }, select: GROUP_SELECT }); - if (!current) throw ApiError.notFound('权限组不存在'); - const before = toGroupDto(current); - await assertGrant(actor, { ...current, keys: before.keys }); - const scope = await validateScope({ - scope: input.scope ?? before.scope, - scopeValue: input.scopeValue ?? before.scopeValue, - }); - const keys = normalizeKeys(input.keys ?? before.keys); - await assertGrant(actor, { ...scope, defaultRole: current.defaultRole, keys }); - const updated = await prisma.$transaction(async (tx) => { - await tx.permissionGroupItem.deleteMany({ where: { groupId } }); +export async function updateGroup(actor: TokenPayload, id: string, input: UpdatePermissionGroupRequest) { + assertAdmin(actor); + const current = await prisma.permissionGroup.findUnique({ where: { id }, include }); + if (!current || current.defaultRole === 'ADMIN') throw ApiError.notFound('模板不存在'); + const scope = await validateScope( + input.scope ?? (current.scope as PermissionScope), + input.scopeValue ?? current.scopeValue, + ); + if (current.defaultRole === 'TEACHER' && scope.scope !== 'TEACHING') + throw ApiError.badRequest('教师默认模板固定使用任教班级范围'); + // 旧管理员键仅停用;编辑可分配能力时保留它们,不能通过写入口重新授予。 + const inactiveKeys = keysFor(current).filter((key) => PERMISSION_META[key].kind === 'admin'); + const keys = + input.keys === undefined + ? current.items.map((i) => i.key) + : [...new Set([...validateKeys(input.keys), ...inactiveKeys])]; + let affected: string[] = []; + const result = await prisma.$transaction(async (tx) => { + await tx.permissionGroupItem.deleteMany({ where: { groupId: id } }); const row = await tx.permissionGroup.update({ - where: { id: groupId }, + where: { id }, data: { name: input.name?.trim(), description: input.description?.trim(), @@ -232,120 +155,204 @@ export async function updateGroup( scopeValue: scope.scopeValue, items: { create: keys.map((key) => ({ key })) }, }, - select: GROUP_SELECT, + include, }); + await tx.permissionAudit.create({ + data: auditData(actor, 'update', 'group', id, dto(current), dto(row)), + }); + const members = + current.defaultRole === 'TEACHER' + ? await tx.user.findMany({ where: { role: 'TEACHER' }, select: { id: true } }) + : await tx.userPermissionGroup + .findMany({ where: { groupId: id }, select: { userId: true } }) + .then((rows) => rows.map((r) => ({ id: r.userId }))); + affected = members.map((u) => u.id); + return dto(row); + }); + invalidateAuthPrincipals(); + disconnectUserSessions(affected); + return result; +} +export async function deleteGroup(actor: TokenPayload, id: string) { + assertAdmin(actor); + const group = await prisma.permissionGroup.findUnique({ where: { id }, include }); + if (!group) throw ApiError.notFound('模板不存在'); + if (group.builtin || group.defaultRole) throw ApiError.badRequest('内置或默认模板不可删除'); + const members = await prisma.userPermissionGroup.findMany({ + where: { groupId: id }, + select: { userId: true }, + }); + await prisma.$transaction(async (tx) => { + await tx.permissionGroup.delete({ where: { id } }); + await tx.permissionAudit.create({ data: auditData(actor, 'delete', 'group', id, dto(group), null) }); + }); + invalidateAuthPrincipals(); + disconnectUserSessions(members.map((m) => m.userId)); + return { id }; +} +export async function listMembers(actor: TokenPayload): Promise { + assertAdmin(actor); + await ensureDefaultGroups(); + const defaultGroup = await prisma.permissionGroup.findUniqueOrThrow({ + where: { defaultRole: 'TEACHER' }, + include: { items: true }, + }); + const users = await prisma.user.findMany({ + where: { role: { in: ['ADMIN', 'TEACHER'] } }, + include: { permissionGroups: { include: { group: { include: { items: true } } } } }, + orderBy: { name: 'asc' }, + }); + return Promise.all( + users.map(async (u) => { + const user: TokenPayload = { + sub: u.id, + role: u.role as TokenPayload['role'], + username: u.username, + name: u.name, + classId: null, + }; + const auth = await principalForAssignments(user, u.permissionGroups, defaultGroup); + const assignments = + u.role === 'ADMIN' + ? [] + : u.permissionGroups.map((a) => ({ + groupId: a.groupId, + groupName: a.group.name, + scope: a.scope as PermissionScope, + scopeValue: a.scopeValue, + scopeLabel: label(a.scope, a.scopeValue), + })); + return { + id: u.id, + username: u.username, + name: u.name, + role: user.role, + fixed: u.role === 'ADMIN', + assignments, + groupIds: [...new Set(assignments.map((a) => a.groupId))], + permissions: [...auth.permissions], + permissionCount: auth.permissions.size, + scopeLabels: assignments.length + ? [...new Set(assignments.map((a) => a.scopeLabel))] + : [u.role === 'ADMIN' ? '固定全部权限' : '默认模板 · 任教班级'], + }; + }), + ); +} +export async function groupMembers(actor: TokenPayload, id: string) { + assertAdmin(actor); + const group = await prisma.permissionGroup.findUnique({ where: { id } }); + if (!group || group.defaultRole === 'ADMIN') throw ApiError.notFound('模板不存在'); + return (await listMembers(actor)).filter( + (u) => + !u.fixed && (u.groupIds.includes(id) || (group.defaultRole === 'TEACHER' && !u.assignments.length)), + ); +} +async function assignmentRows(input: AssignUserGroupsRequest): Promise { + const ids = input.assignments?.map((a) => a.groupId) ?? input.groupIds ?? []; + const groups = await prisma.permissionGroup.findMany({ + where: { id: { in: ids } }, + include: { items: true }, + }); + if (new Set(ids).size !== groups.length || groups.some((g) => g.defaultRole === 'ADMIN')) + throw ApiError.badRequest('模板不存在或已停用'); + const assignments = + input.assignments ?? + ids.map((groupId) => { + const g = groups.find((g) => g.id === groupId)!; + return { groupId, scope: g.scope as PermissionScope, scopeValue: g.scopeValue }; + }); + const rows: AssignmentRow[] = []; + for (const assignment of assignments) { + const group = groups.find((g) => g.id === assignment.groupId)!; + const scope = await validateScope(assignment.scope, assignment.scopeValue); + if (group.defaultRole === 'TEACHER' && scope.scope !== 'TEACHING') + throw ApiError.badRequest('教师默认模板只允许任教班级范围'); + if ( + activeKeys(group).some( + (k) => PERMISSION_META[k].kind === 'class' && !PERMISSION_META[k].allowedScopes.includes(scope.scope), + ) + ) + throw ApiError.badRequest('分配范围不适用于模板能力'); + rows.push({ groupId: group.id, scope: scope.scope, scopeValue: scope.scopeValue, group }); + } + return [...new Map(rows.map((a) => [`${a.groupId}:${a.scope}:${a.scopeValue}`, a])).values()]; +} +export async function effectivePermissions( + actor: TokenPayload, + id: string, + preview?: AssignUserGroupsRequest, +): Promise { + assertAdmin(actor); + await ensureDefaultGroups(); + const u = await prisma.user.findUnique({ + where: { id }, + include: { permissionGroups: { include: { group: { include: { items: true } } } } }, + }); + if (!u) throw ApiError.notFound('账号不存在'); + const user: TokenPayload = { + sub: id, + name: u.name, + username: u.username, + role: u.role as TokenPayload['role'], + classId: null, + }; + if (preview && u.role === 'ADMIN') throw ApiError.badRequest('管理员固定全部权限,不接受分配'); + const auth = await principalForAssignments( + user, + preview ? await assignmentRows(preview) : u.permissionGroups, + ); + const classes = await prisma.class.findMany({ select: { id: true, name: true } }); + const entries = await Promise.all( + [...auth.permissions].map(async (key) => { + const ids = await classIdsFor(user, key, auth); + return { + key, + scopes: [...new Set((auth.grants.get(key) ?? []).map((g) => label(g.scope, g.scopeValue)))], + classes: classes.filter((c) => ids.includes(c.id)), + classCount: ids.length, + }; + }), + ); + return { + permissions: [...auth.permissions], + entries, + conflicts: entries + .filter((e) => e.scopes.length > 1) + .map((e) => `${PERMISSION_LABELS[e.key]}:实际合并范围 ${e.scopes.join(' ∪ ')};较窄分配可能被覆盖`), + headOnlyKeys: [...auth.permissions].filter((k) => PERMISSION_META[k].relation === 'head'), + }; +} +export async function assignUserGroups(actor: TokenPayload, userId: string, input: AssignUserGroupsRequest) { + assertAdmin(actor); + const u = await prisma.user.findUnique({ where: { id: userId } }); + if (!u) throw ApiError.notFound('账号不存在'); + if (u.role !== 'TEACHER') throw ApiError.badRequest('管理员固定全部权限,不能分配模板'); + const rows = await assignmentRows(input); + const before = (await listMembers(actor)).find((m) => m.id === userId)!; + await prisma.$transaction(async (tx) => { + await tx.userPermissionGroup.deleteMany({ where: { userId } }); + if (rows.length) + await tx.userPermissionGroup.createMany({ + data: rows.map(({ groupId, scope, scopeValue }) => ({ userId, groupId, scope, scopeValue })), + }); await tx.permissionAudit.create({ data: auditData( actor, - current.defaultRole ? 'update-default' : 'update', - 'group', - groupId, - before, - toGroupDto(row), + 'assign', + 'user', + userId, + before.assignments, + rows.map(({ groupId, scope, scopeValue }) => ({ groupId, scope, scopeValue })), ), }); - return row; }); - return toGroupDto(updated); + invalidateAuthPrincipals(); + disconnectUserSessions([userId]); + return (await listMembers(actor)).find((m) => m.id === userId)!; } - -export async function deleteGroup(actor: TokenPayload, groupId: string) { - const current = await prisma.permissionGroup.findUnique({ where: { id: groupId }, select: GROUP_SELECT }); - if (!current) throw ApiError.notFound('权限组不存在'); - await assertGrant(actor, { ...current, keys: current.items.map((item) => item.key) }); - if (current.builtin) throw ApiError.badRequest('内置权限组不可删除'); - // 删除最后一组会回落默认组;非管理员不能借删除制造额外授权。 - if (actor.role !== 'ADMIN') throw ApiError.forbidden('删除组会改变成员默认权限,仅管理员可执行'); - await prisma.$transaction(async (tx) => { - await tx.permissionGroup.delete({ where: { id: groupId } }); - await tx.permissionAudit.create({ - data: auditData(actor, 'delete', 'group', groupId, toGroupDto(current), null), - }); - }); - return { id: groupId }; -} - -/** 组和成员各预取一次,账号数增长不会增加权限查询次数。 */ -export async function listMembers(): Promise { - await ensureDefaultGroups(); - const [rows, groups] = await Promise.all([ - prisma.user.findMany({ - where: { role: { in: ['ADMIN', 'TEACHER'] } }, - select: MEMBER_SELECT, - orderBy: [{ role: 'asc' }, { name: 'asc' }], - }), - prisma.permissionGroup.findMany({ include: { items: true } }), - ]); - return rows.map((row) => { - const groupIds = row.permissionGroups.map((link) => link.groupId); - const effective = groups.filter((group) => - groupIds.length ? groupIds.includes(group.id) : group.defaultRole === row.role, - ); - const permissions = normalizeKeys([ - ...effective.flatMap((group) => group.items.map((item) => item.key)), - ...(row.role === 'ADMIN' ? ADMIN_UNREMOVABLE_PERMISSIONS : []), - ]); - return { - id: row.id, - username: row.username, - name: row.name, - role: row.role as UserRole, - groupIds, - permissions, - permissionCount: permissions.length, - scopeLabels: [...new Set(effective.map(scopeLabel))], - }; - }); -} - -export async function groupMembers(groupId: string) { - const group = await prisma.permissionGroup.findUnique({ where: { id: groupId } }); - if (!group) throw ApiError.notFound('权限组不存在'); - return (await listMembers()).filter((member) => - member.groupIds.length ? member.groupIds.includes(groupId) : member.role === group.defaultRole, - ); -} - -export async function assignUserGroups( - actor: TokenPayload, - userId: string, - input: AssignUserGroupsRequest, -): Promise { - await assertPermission(actor, 'permission:manage'); - const user = await prisma.user.findUnique({ where: { id: userId }, select: MEMBER_SELECT }); - if (!user || !['ADMIN', 'TEACHER'].includes(user.role)) throw ApiError.notFound('员工账号不存在'); - const ids = [...new Set(input.groupIds)]; - const groups = await prisma.permissionGroup.findMany({ - where: ids.length ? { id: { in: ids } } : { defaultRole: user.role }, - include: { items: true }, - }); - if (ids.length && groups.length !== ids.length) throw ApiError.badRequest('部分权限组不存在'); - for (const group of groups) { - if (group.defaultRole && group.defaultRole !== user.role) - throw ApiError.forbidden('默认组只能分配给同角色账号'); - // 同角色默认组可显式选中,但仍检查范围与键的授权能力。 - await assertGrant(actor, { ...group, defaultRole: null, keys: group.items.map((item) => item.key) }); - } - if (actor.role !== 'ADMIN' && user.role === 'ADMIN') throw ApiError.forbidden('非管理员不能更改管理员分组'); - const before = (await listMembers()).find((member) => member.id === userId)!; - await prisma.$transaction(async (tx) => { - await tx.userPermissionGroup.deleteMany({ where: { userId } }); - if (ids.length) - await tx.userPermissionGroup.createMany({ data: ids.map((groupId) => ({ userId, groupId })) }); - await tx.permissionAudit.create({ - data: auditData(actor, 'assign', 'user', userId, before, { - groupIds: ids, - permissions: normalizeKeys([ - ...groups.flatMap((group) => group.items.map((item) => item.key)), - ...(user.role === 'ADMIN' ? ADMIN_UNREMOVABLE_PERMISSIONS : []), - ]), - }), - }); - }); - return (await listMembers()).find((member) => member.id === userId)!; -} - -export async function listAudits(page = 1, pageSize = 30) { +export async function listAudits(actor: TokenPayload, page = 1, pageSize = 30) { + assertAdmin(actor); const [items, total] = await Promise.all([ prisma.permissionAudit.findMany({ orderBy: [{ createdAt: 'desc' }, { id: 'desc' }], @@ -356,71 +363,68 @@ export async function listAudits(page = 1, pageSize = 30) { ]); return { items, total, page, pageSize }; } - -/** GET /api/permissions/catalog - 权限键目录(权限页整棵勾选树都按它渲染) */ -export async function permissionCatalog(): Promise { +export async function permissionCatalog(actor: TokenPayload): Promise { + assertAdmin(actor); await ensureDefaultGroups(); - const defaults = await prisma.permissionGroup.findMany({ - where: { defaultRole: { not: null } }, + const group = await prisma.permissionGroup.findUniqueOrThrow({ + where: { defaultRole: 'TEACHER' }, include: { items: true }, }); - const roles = Object.keys(ROLE_DEFAULT_PERMISSIONS) as UserRole[]; - const keysForRole = (role: UserRole): PermissionKey[] => { - const keys = - defaults.find((group) => group.defaultRole === role)?.items.map((item) => item.key) ?? - ROLE_DEFAULT_PERMISSIONS[role]; - return normalizeKeys(role === 'ADMIN' ? [...keys, ...ADMIN_UNREMOVABLE_PERMISSIONS] : keys); - }; return { keys: [...PERMISSION_KEYS], - labels: { ...PERMISSION_LABELS }, - categories: PERMISSION_CATEGORIES.map((category) => ({ - title: category.title, - keys: [...category.keys], - })), + meta: PERMISSION_META, + labels: PERMISSION_LABELS, + categories: PERMISSION_CATEGORIES.map((c) => ({ title: c.title, keys: [...c.keys] })), defaultRoles: Object.fromEntries( - PERMISSION_KEYS.map((key) => [key, roles.filter((role) => keysForRole(role).includes(key))]), - ) as Record, - roleDefaults: Object.fromEntries(roles.map((role) => [role, keysForRole(role)])) as Record< - UserRole, - PermissionKey[] - >, - unremovable: [...ADMIN_UNREMOVABLE_PERMISSIONS], + PERMISSION_KEYS.map((k) => [k, [...PERMISSION_META[k].defaultRoles]]), + ) as PermissionCatalogDto['defaultRoles'], + roleDefaults: { + ...ROLE_DEFAULT_PERMISSIONS, + ADMIN: [...PERMISSION_KEYS], + TEACHER: activeKeys(group), + CLASS_DEVICE: [], + }, + unremovable: [...PERMISSION_KEYS], }; } - -/** GET /api/permissions/groups - 权限组列表(内置组排在最前,其余按创建时间) */ -export async function listGroups(): Promise { +export async function listGroups(actor: TokenPayload): Promise { + assertAdmin(actor); await ensureDefaultGroups(); - const rows = await prisma.permissionGroup.findMany({ - select: GROUP_SELECT, - orderBy: [{ builtin: 'desc' }, { createdAt: 'asc' }], - }); - const members = await listMembers(); - return (rows as GroupRow[]).map((row) => ({ - ...toGroupDto(row), - memberCount: members.filter((m) => - m.groupIds.length ? m.groupIds.includes(row.id) : row.defaultRole === m.role, + const members = await listMembers(actor); + return ( + await prisma.permissionGroup.findMany({ + where: { OR: [{ defaultRole: null }, { defaultRole: 'TEACHER' }] }, + include, + orderBy: [{ builtin: 'desc' }, { createdAt: 'asc' }], + }) + ).map((group) => ({ + ...dto(group), + memberCount: members.filter( + (m) => + !m.fixed && + (m.groupIds.includes(group.id) || (group.defaultRole === 'TEACHER' && !m.assignments.length)), ).length, })); } - -/** - * GET /api/permissions/me - 当前账号的生效权限。 - * - * 两端按它决定"入口显不显示"(真正的拦截始终在服务端)。 - * 班级端会话恒为空集:它的能力由班级维度断言决定。 - */ -export async function myPermissions(user: TokenPayload): Promise { - const permissions = await loadEffectivePermissions(user); - const fromGroups = - user.classSession || user.role === 'CLASS_DEVICE' - ? false - : (await prisma.userPermissionGroup.count({ where: { userId: user.sub } })) > 0; - +export async function myPermissions(user: TokenPayload) { + const auth = await loadAuthPrincipal(user); + const classKeys = [...auth.permissions].filter((key) => PERMISSION_META[key].kind === 'class'); + const managementKeys = classKeys.filter((key) => + ['roster:manage', 'schedule:write', 'import:students', 'import:schedule', 'grade:write'].includes(key), + ); + const [scopes, management] = await Promise.all([ + Promise.all(classKeys.map(async (key) => [key, await classIdsFor(user, key, auth)] as const)), + Promise.all(managementKeys.map(async (key) => [key, await manageClassIdsFor(user, key, auth)] as const)), + ]); return { role: user.role, - permissions: [...permissions].sort(byCatalogOrder), - fromGroups, + permissions: [...auth.permissions], + fromGroups: auth.fromGroups, + classScopes: Object.fromEntries(scopes), + manageScopes: Object.fromEntries(management), + actionScopes: await actionScopesFor(user, scopes, management), + allScopeKeys: [...auth.grants] + .filter(([, grants]) => grants.some((g) => g.scope === 'ALL')) + .map(([key]) => key), }; } diff --git a/packages/server/src/modules/schedules/schedules.facade.ts b/packages/server/src/modules/schedules/schedules.facade.ts index 9f4fe70..3fc328d 100644 --- a/packages/server/src/modules/schedules/schedules.facade.ts +++ b/packages/server/src/modules/schedules/schedules.facade.ts @@ -40,8 +40,8 @@ export async function listSchedules( user: TokenPayload, options: ListScheduleOptions, ): Promise { - if (options.classId) await assertClassAccess(user, options.classId); - const classIds = options.classId ? [options.classId] : await getAccessibleClassIds(user); + if (options.classId) await assertClassAccess(user, options.classId, 'schedule:read'); + const classIds = options.classId ? [options.classId] : await getAccessibleClassIds(user, 'schedule:read'); const result: ScheduleDto[] = []; for (const classId of classIds) { if (options.week) { @@ -98,7 +98,7 @@ export async function getActiveScheduleWeek( ) { const classId = isClassDevice(user) ? requireClassDeviceClassId(user) : options.classId; if (!classId) throw ApiError.badRequest('请指定班级'); - await assertClassAccess(user, classId); + await assertClassAccess(user, classId, 'schedule:read'); const context = await loadTermContext(classId), week = options.week ?? resolveCurrentWeek(new Date(), context); if (week > context.maxWeek) throw ApiError.badRequest('周次超过本班教学周数'); @@ -124,7 +124,7 @@ export async function computeClassStatus(classId: string, at = new Date()): Prom export async function getClassStatus(user: TokenPayload, options: { classId?: string; at?: Date } = {}) { const classId = isClassDevice(user) ? requireClassDeviceClassId(user) : options.classId; if (!classId) throw ApiError.badRequest('请指定班级'); - await assertClassAccess(user, classId); + await assertClassAccess(user, classId, 'schedule:read'); return computeClassStatus(classId, options.at); } @@ -151,8 +151,8 @@ function matches(p: PlanRow, day: number, week: number) { (p.weekCountDiv === 0 || ((week - 1) % p.weekCountDivTotal) + 1 === p.weekCountDiv) ); } -async function assertCourse(courseId: string, classId: string) { - if (!(await prisma.course.findFirst({ where: { id: courseId, classId } }))) +async function assertCourse(courseId: string, classId: string, db: Tx = prisma) { + if (!(await db.course.findFirst({ where: { id: courseId, classId } }))) throw ApiError.badRequest('课程不属于本班'); } export async function createSchedule( @@ -161,10 +161,8 @@ export async function createSchedule( transaction?: Tx, identity?: string, ): Promise { - if (!transaction) { - await assertCanManageSchedule(user, input.classId); - await assertCourse(input.courseId, input.classId); - } + await assertCanManageSchedule(user, input.classId, transaction); + await assertCourse(input.courseId, input.classId, transaction); const cls = await (transaction ?? prisma).class.findUniqueOrThrow({ where: { id: input.classId } }), max = transaction ? normalizeMaxWeeks( @@ -282,6 +280,8 @@ export async function updateSchedule( const rule: Partial<{ weekStart: number; weekEnd: number; weekParity: 'ALL' | 'ODD' | 'EVEN' }> = stored ? JSON.parse(stored.value) : {}; + for (const targetClassId of new Set(entries.map((e) => e.plan.classId))) + await assertCanManageSchedule(user, targetClassId); const classId = entries[0]!.plan.classId; await assertCanManageSchedule(user, classId); if (input.courseId) await assertCourse(input.courseId, classId); diff --git a/packages/server/src/modules/schedules/schedules.module.ts b/packages/server/src/modules/schedules/schedules.module.ts index a30d38b..f60be3d 100644 --- a/packages/server/src/modules/schedules/schedules.module.ts +++ b/packages/server/src/modules/schedules/schedules.module.ts @@ -10,7 +10,7 @@ import { idParamSchema } from '../../lib/schemas.js'; import { authenticate, getAuthUser, - requireStaffPermission, + requirePermissionOrClassDevice, requirePermission, } from '../../middleware/auth.js'; import { validate, validatedParams, validatedQuery } from '../../middleware/validate.js'; @@ -30,18 +30,18 @@ const router = Router(); router.use(authenticate()); router.get( '/active-week', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: gridQuerySchema }), async (req, res) => sendOk(res, await scheduleService.getActiveScheduleWeek(getAuthUser(req), validatedQuery(req))), ); router.get( '/scheduled', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: z.object({ classId: z.string().min(1) }) }), async (req, res) => { const { classId } = validatedQuery<{ classId: string }>(req); - await assertClassAccess(getAuthUser(req), classId); + await assertClassAccess(getAuthUser(req), classId, 'schedule:read'); sendOk( res, await prisma.scheduledClassPlan.findMany({ @@ -109,7 +109,7 @@ router.post( /** GET /api/schedules?classId=&week=&dayOfWeek= - 课表列表 */ router.get( '/', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: listSchedulesQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -121,7 +121,7 @@ router.get( /** GET /api/schedules/grid?classId=&week= - 周视图(7 列结构) */ router.get( '/grid', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: gridQuerySchema }), async (req, res) => { const user = getAuthUser(req); @@ -145,7 +145,7 @@ router.get( */ router.get( '/current', - requireStaffPermission('schedule:read'), + requirePermissionOrClassDevice('schedule:read'), validate({ query: classStatusQuerySchema }), async (req, res) => { const user = getAuthUser(req); diff --git a/packages/server/src/modules/students/students.service.ts b/packages/server/src/modules/students/students.service.ts index 759c211..f105b85 100644 --- a/packages/server/src/modules/students/students.service.ts +++ b/packages/server/src/modules/students/students.service.ts @@ -8,11 +8,11 @@ import { getAccessibleClassIds, resolveClassScope, } from '../../lib/access.js'; -import { assertStaffPermission, assertPermission } from '../../lib/permissions.js'; +import { assertPermissionOrClassDevice, assertPermission } from '../../lib/permissions.js'; import { changeStudentLifecycle, notifyStudentClasses } from '../../lib/student-lifecycle.js'; import { activeStudentWhere } from '../../lib/students.js'; import { prisma } from '../../lib/db.js'; -import { hasAllScope } from '../../lib/permission-scope.js'; +import { hasOrganizationalGrant } from '../../lib/authz/index.js'; import { ApiError } from '../../lib/http.js'; import type { TokenPayload } from '../../lib/jwt.js'; import { toStudentDto, toStudentTransferDto } from '../../lib/mappers.js'; @@ -38,7 +38,7 @@ const withClass = { class: { select: { name: true, grade: true } } } as const; /** 学生名单(按班级权限过滤) */ export async function listStudents(user: TokenPayload, options: ListStudentsQuery): Promise { - await assertStaffPermission(user, 'roster:read'); + await assertPermissionOrClassDevice(user, 'roster:read'); const scope = await resolveClassScope(user, options.classId, 'roster:read'); const students = await prisma.student.findMany({ @@ -219,16 +219,16 @@ export async function listTransfers( options: ListTransfersQuery, ): Promise> { await assertPermission(user, 'roster:read'); - const hasGlobalRosterScope = isAdmin(user) || (await hasAllScope(user, 'roster:read')); + const hasGlobalRosterScope = isAdmin(user) || (await hasOrganizationalGrant(user, 'roster:read')); - if (options.classId) await assertClassAccess(user, options.classId); + if (options.classId) await assertClassAccess(user, options.classId, 'roster:read'); if (options.studentId) { const student = await prisma.student.findUnique({ where: { id: options.studentId }, select: { classId: true }, }); if (!student) throw ApiError.notFound('学生不存在'); - if (student.classId) await assertClassAccess(user, student.classId); + if (student.classId) await assertClassAccess(user, student.classId, 'roster:read'); else if (!hasGlobalRosterScope) throw ApiError.forbidden('无权查看未分班学生的调班历史'); } diff --git a/packages/server/src/modules/system/system.module.ts b/packages/server/src/modules/system/system.module.ts index 30d8e9b..ebf2111 100644 --- a/packages/server/src/modules/system/system.module.ts +++ b/packages/server/src/modules/system/system.module.ts @@ -1,3 +1,4 @@ +import { requireAdmin } from '../../middleware/auth.js'; import { Router } from 'express'; import { API_PATHS } from '@classhelper/shared'; import { sendOk } from '../../lib/http.js'; @@ -13,7 +14,7 @@ import { import * as systemService from './system.service.js'; const router = Router(); -router.use(authenticate()); +router.use(authenticate(), requireAdmin()); /** * 系统设置与运维接口(**全部仅 ADMIN**,权限键 `system:manage`)。 @@ -46,7 +47,7 @@ router.put( validate({ body: updateAutostartSchema }), async (req, res) => { const input = validatedBody(req); - sendOk(res, await systemService.updateAutostart(input), '开机自启设置已生效'); + sendOk(res, await systemService.updateAutostart(getAuthUser(req), input), '开机自启设置已生效'); }, ); diff --git a/packages/server/src/modules/system/system.service.ts b/packages/server/src/modules/system/system.service.ts index 5b6db69..b9d2492 100644 --- a/packages/server/src/modules/system/system.service.ts +++ b/packages/server/src/modules/system/system.service.ts @@ -1,3 +1,5 @@ +import { assertAdmin } from '../../lib/authz/index.js'; +import type { TokenPayload } from '../../lib/jwt.js'; import { createAutostartController } from './autostart.js'; import { spawnSync } from 'node:child_process'; import fs from 'node:fs'; @@ -10,7 +12,6 @@ import { } from '@classhelper/shared'; import { env } from '../../config/env.js'; import { prisma } from '../../lib/db.js'; -import type { TokenPayload } from '../../lib/jwt.js'; import { logger } from '../../lib/logger.js'; import { SETTING_KEYS, getBooleanSetting, setBooleanSetting } from '../../lib/settings.js'; import { APP_VERSION } from '../../lib/version.js'; @@ -39,6 +40,7 @@ export async function updateSystemSettings( user: TokenPayload, input: UpdateSystemSettingsInput, ): Promise { + assertAdmin(user); if (input.developerMode !== undefined) { await setBooleanSetting(SETTING_KEYS.developerMode, input.developerMode); logger.info(`开发者模式已${input.developerMode ? '开启' : '关闭'}(操作人=${user.username})`); @@ -55,7 +57,11 @@ const autostart = createAutostartController({ export async function getAutostartStatus(): Promise { return autostart.read(); } -export async function updateAutostart(input: UpdateAutostartInput): Promise { +export async function updateAutostart( + actor: TokenPayload, + input: UpdateAutostartInput, +): Promise { + assertAdmin(actor); return autostart.write(input.enabled); } diff --git a/packages/server/src/modules/teachers/teachers.module.ts b/packages/server/src/modules/teachers/teachers.module.ts index fb96f7f..bb8f2b1 100644 --- a/packages/server/src/modules/teachers/teachers.module.ts +++ b/packages/server/src/modules/teachers/teachers.module.ts @@ -1,7 +1,13 @@ import { Router } from 'express'; import { sendCreated, sendOk } from '../../lib/http.js'; import { idParamSchema } from '../../lib/schemas.js'; -import { authenticate, requirePermission, requireAnyPermission } from '../../middleware/auth.js'; +import { + authenticate, + getAuthUser, + requireAdmin, + requirePermission, + requireAnyPermission, +} from '../../middleware/auth.js'; import { validate, validatedParams, validatedQuery } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; import { @@ -27,39 +33,50 @@ router.get( validate({ query: listTeachersQuerySchema }), async (req, res) => { const { keyword } = validatedQuery<{ keyword?: string }>(req); - sendOk(res, await teacherService.listTeachers(keyword), '获取教师列表成功'); + sendOk(res, await teacherService.listTeachers(getAuthUser(req), keyword), '获取教师列表成功'); }, ); /** POST /api/teachers - 录入教师账号(需 teacher:manage) */ router.post( '/', + requireAdmin(), requirePermission('teacher:manage'), validate({ body: createTeacherSchema }), async (req, res) => { - sendCreated(res, await teacherService.createTeacher(req.body as CreateTeacherInput), '教师账号创建成功'); + sendCreated( + res, + await teacherService.createTeacher(getAuthUser(req), req.body as CreateTeacherInput), + '教师账号创建成功', + ); }, ); /** PATCH /api/teachers/:id - 编辑教师(姓名 / 用户名 / 角色) */ router.patch( '/:id', + requireAdmin(), requirePermission('teacher:manage'), validate({ params: idParamSchema, body: updateTeacherSchema }), async (req, res) => { const { id } = validatedParams<{ id: string }>(req); - sendOk(res, await teacherService.updateTeacher(id, req.body as UpdateTeacherInput), '教师信息更新成功'); + sendOk( + res, + await teacherService.updateTeacher(getAuthUser(req), id, req.body as UpdateTeacherInput), + '教师信息更新成功', + ); }, ); /** POST /api/teachers/:id/reset-password - 重置教师密码 */ router.post( '/:id/reset-password', + requireAdmin(), requirePermission('teacher:manage'), validate({ params: idParamSchema, body: resetTeacherPasswordSchema }), async (req, res) => { const { id } = validatedParams<{ id: string }>(req); - await teacherService.resetTeacherPassword(id, req.body as ResetTeacherPasswordInput); + await teacherService.resetTeacherPassword(getAuthUser(req), id, req.body as ResetTeacherPasswordInput); sendOk(res, { id }, '密码已重置'); }, ); @@ -67,11 +84,12 @@ router.post( /** DELETE /api/teachers/:id - 删除教师账号(有班级职责/课程时拒绝,见 service) */ router.delete( '/:id', + requireAdmin(), requirePermission('teacher:manage'), validate({ params: idParamSchema }), async (req, res) => { const { id } = validatedParams<{ id: string }>(req); - await teacherService.deleteTeacher(id); + await teacherService.deleteTeacher(getAuthUser(req), id); sendOk(res, { id }, '教师账号已删除'); }, ); diff --git a/packages/server/src/modules/teachers/teachers.service.ts b/packages/server/src/modules/teachers/teachers.service.ts index 40a897d..189bea0 100644 --- a/packages/server/src/modules/teachers/teachers.service.ts +++ b/packages/server/src/modules/teachers/teachers.service.ts @@ -1,3 +1,8 @@ +import type { Prisma } from '../../generated/prisma/client.js'; +import { disconnectUserSessions } from '../../realtime/bus.js'; +import { assertAdmin, assertPermission } from '../../lib/authz/index.js'; +import type { TokenPayload } from '../../lib/jwt.js'; +import { auditData } from '../permissions/permissions.service.js'; import type { UserDto } from '@classhelper/shared'; import { env } from '../../config/env.js'; import { prisma } from '../../lib/db.js'; @@ -17,7 +22,8 @@ import type { */ /** 教师列表(教师 + 管理员账号) */ -export async function listTeachers(keyword?: string): Promise { +export async function listTeachers(actor: TokenPayload, keyword?: string): Promise { + await assertPermission(actor, 'teacher:read'); const teachers = await prisma.user.findMany({ where: { role: { in: ['TEACHER', 'ADMIN'] }, @@ -29,7 +35,8 @@ export async function listTeachers(keyword?: string): Promise { return teachers.map(toUserDto); } -export async function createTeacher(input: CreateTeacherInput): Promise { +export async function createTeacher(actor: TokenPayload, input: CreateTeacherInput): Promise { + assertAdmin(actor); const created = await prisma.user.create({ data: { username: input.username, @@ -38,6 +45,12 @@ export async function createTeacher(input: CreateTeacherInput): Promise passwordHash: await hashPassword(input.password ?? env.defaultTeacherPassword), }, }); + await prisma.permissionAudit.create({ + data: auditData(actor, 'teacher-create', 'user', created.id, null, { + role: created.role, + name: created.name, + }), + }); return toUserDto(created); } @@ -53,29 +66,50 @@ async function findTeacherOrThrow(teacherId: string): Promise<{ id: string; role return teacher; } -export async function updateTeacher(teacherId: string, input: UpdateTeacherInput): Promise { +export async function updateTeacher( + actor: TokenPayload, + teacherId: string, + input: UpdateTeacherInput, +): Promise { + assertAdmin(actor); const teacher = await findTeacherOrThrow(teacherId); - const updated = await prisma.user.update({ - where: { id: teacher.id }, - data: { - ...(input.name ? { name: input.name } : {}), - ...(input.username ? { username: input.username } : {}), - ...(input.role ? { role: input.role } : {}), - }, + const updated = await prisma.$transaction(async (tx) => { + if (teacher.role === 'ADMIN' && input.role && input.role !== 'ADMIN') await protectLastAdmin(tx); + const result = await tx.user.update({ + where: { id: teacher.id }, + data: { + ...(input.name ? { name: input.name } : {}), + ...(input.username ? { username: input.username } : {}), + ...(input.role ? { role: input.role } : {}), + }, + }); + await tx.permissionAudit.create({ + data: auditData(actor, 'teacher-update', 'user', teacher.id, teacher, { + role: result.role, + name: result.name, + }), + }); + return result; }); + disconnectUserSessions([teacher.id]); return toUserDto(updated); } /** 重置教师密码(未指定时用默认初始密码) */ export async function resetTeacherPassword( + actor: TokenPayload, teacherId: string, input: ResetTeacherPasswordInput, ): Promise { + assertAdmin(actor); const teacher = await findTeacherOrThrow(teacherId); await prisma.user.update({ where: { id: teacher.id }, data: { passwordHash: await hashPassword(input.newPassword ?? env.defaultTeacherPassword) }, }); + await prisma.permissionAudit.create({ + data: auditData(actor, 'teacher-password', 'user', teacher.id, null, { passwordChanged: true }), + }); } /** @@ -101,8 +135,11 @@ export async function resetTeacherPassword( * 因此只有"没有留下任何班级共享内容"的账号才允许删除(实践中就是刚录入错的那条), * 否则返回 409 让管理员先转移/清理。 */ -export async function deleteTeacher(userId: string): Promise { +export async function deleteTeacher(actor: TokenPayload, userId: string): Promise { + assertAdmin(actor); const teacher = await findTeacherOrThrow(userId); + if (teacher.role === 'ADMIN' && (await prisma.user.count({ where: { role: 'ADMIN' } })) <= 1) + throw ApiError.conflict('不能删除最后一个管理员'); const [ownedClasses, courses, homeworks, notifications, coursewares] = await Promise.all([ prisma.class.count({ where: { teacherId: teacher.id } }), @@ -128,7 +165,21 @@ export async function deleteTeacher(userId: string): Promise { ); } - if (coursewares > 0) throw ApiError.conflict(`「${teacher.name}」还有 ${coursewares} 个课件,请先清理课件再删除账号`); + if (coursewares > 0) + throw ApiError.conflict(`「${teacher.name}」还有 ${coursewares} 个课件,请先清理课件再删除账号`); - await prisma.user.delete({ where: { id: teacher.id } }); + await prisma.$transaction(async (tx) => { + if (teacher.role === 'ADMIN') await protectLastAdmin(tx); + await tx.user.delete({ where: { id: teacher.id } }); + await tx.permissionAudit.create({ + data: auditData(actor, 'teacher-delete', 'user', teacher.id, teacher, null), + }); + }); + disconnectUserSessions([teacher.id]); +} + +async function protectLastAdmin(tx: Prisma.TransactionClient) { + await tx.user.updateMany({ where: { role: 'ADMIN' }, data: { role: 'ADMIN' } }); + if ((await tx.user.count({ where: { role: 'ADMIN' } })) <= 1) + throw ApiError.conflict('不能删除或降级最后一个管理员'); } diff --git a/packages/server/src/modules/term/promotion.service.ts b/packages/server/src/modules/term/promotion.service.ts index 283538d..97a32f2 100644 --- a/packages/server/src/modules/term/promotion.service.ts +++ b/packages/server/src/modules/term/promotion.service.ts @@ -1,3 +1,4 @@ +import { refreshClassSubscriptions } from '../../realtime/bus.js'; import { createHash, randomUUID } from 'node:crypto'; import fs from 'node:fs/promises'; import path from 'node:path'; @@ -441,6 +442,7 @@ async function executePromotion(year: number, options: RunOptions) { for (const track of preview.tracks) for (const cls of track.classes) emitToClass(cls.id, SOCKET_EVENTS.classUpdated, { classId: cls.id, action: 'updated' }); + refreshClassSubscriptions(); await notifyScheduleChanged(); return { ...(await prisma.promotionRun.findUniqueOrThrow({ where: { year } })), alreadyDone: false }; } diff --git a/packages/server/src/modules/term/term.module.ts b/packages/server/src/modules/term/term.module.ts index cd600ab..4866055 100644 --- a/packages/server/src/modules/term/term.module.ts +++ b/packages/server/src/modules/term/term.module.ts @@ -9,7 +9,13 @@ import { } from './promotion.service.js'; import { Router } from 'express'; import { ApiError, sendOk } from '../../lib/http.js'; -import { authenticate, getAuthUser, requirePermission } from '../../middleware/auth.js'; +import { + authenticate, + getAuthUser, + requireAnyPermission, + requirePermissionOrClassDevice, + requirePermission, +} from '../../middleware/auth.js'; import { validate, validatedBody, validatedQuery } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; import { @@ -74,16 +80,21 @@ router.post( * - **写**:仅管理员 —— 周次是全校口径,改错会让所有班的课表整体错位; * - `classId` 留空 = 全校默认;某个班有自己的配置时优先用它。 */ -router.get('/', requirePermission('term:read'), validate({ query: termQuerySchema }), async (req, res) => { - const user = getAuthUser(req); - const { classId } = validatedQuery<{ classId?: string }>(req); - sendOk(res, await termService.getTermWeeks(user, classId), '获取学期周次成功'); -}); +router.get( + '/', + requirePermissionOrClassDevice('term:read'), + validate({ query: termQuerySchema }), + async (req, res) => { + const user = getAuthUser(req); + const { classId } = validatedQuery<{ classId?: string }>(req); + sendOk(res, await termService.getTermWeeks(user, classId), '获取学期周次成功'); + }, +); /** PUT /api/term - 保存逐周区间(整表覆盖,仅管理员) */ router.put( '/', - requirePermission('term:write'), + requireAnyPermission('term:write', 'class:settings'), validate({ body: updateTermWeeksSchema }), async (req, res) => { const user = getAuthUser(req); @@ -102,7 +113,7 @@ router.put( */ router.post( '/auto', - requirePermission('term:write'), + requireAnyPermission('term:write', 'class:settings'), validate({ body: autoTermWeeksSchema }), async (req, res) => { const user = getAuthUser(req); @@ -121,7 +132,7 @@ router.post( */ router.get( '/holidays', - requirePermission('term:write'), + requireAnyPermission('term:write', 'class:settings'), validate({ query: holidayQuerySchema }), async (req, res) => { const { year } = validatedQuery<{ year?: number }>(req); diff --git a/packages/server/src/modules/term/term.service.ts b/packages/server/src/modules/term/term.service.ts index 099145e..3b89c06 100644 --- a/packages/server/src/modules/term/term.service.ts +++ b/packages/server/src/modules/term/term.service.ts @@ -1,3 +1,4 @@ +import { assertAdmin, assertHeadOnly } from '../../lib/authz/index.js'; import { buildAutoTermWeeks, validateTermWeeks, @@ -38,9 +39,15 @@ function scopeOf(classId?: string | null): string { /** 读取某个范围的周次配置 */ export async function getTermWeeks(user: TokenPayload, classId?: string | null): Promise { - const scope = scopeOf(classId); - if (scope) await assertClassAccess(user, scope); + const scope = user.role === 'CLASS_DEVICE' ? (user.classId ?? user.sub) : scopeOf(classId); + if (user.role === 'CLASS_DEVICE' && classId && classId !== scope) + throw ApiError.forbidden('不能读取其他班级周次'); + if (!scope) await assertPermission(user, 'term:read'); + if (scope) await assertClassAccess(user, scope, 'term:read'); + return readTermWeeks(scope); +} +async function readTermWeeks(scope: string): Promise { const [weeks] = await Promise.all([ prisma.termWeek.findMany({ where: { classId: scope }, orderBy: { weekNumber: 'asc' } }), scope @@ -75,8 +82,9 @@ export async function updateTermWeeks( user: TokenPayload, input: UpdateTermWeeksInput, ): Promise { - await assertPermission(user, 'term:write'); const scope = scopeOf(input.classId); + if (scope) await assertHeadOnly(user, 'class:settings', scope); + else assertAdmin(user); const maximum = input.maxTermWeeks ?? (await getMaxTermWeeks()); if (input.maxTermWeeks !== undefined && scope) throw ApiError.badRequest('总周数只能在全校默认范围修改'); @@ -132,7 +140,7 @@ export async function updateTermWeeks( logger.info(`学期周次已更新:范围=${scope || '全校默认'} 周数=${input.weeks.length} 由 ${user.name} 执行`); if (input.maxTermWeeks !== undefined) await setSetting(SETTING_KEYS.termMaxWeeks, String(maximum)); await publishTermChange(scope); - return getTermWeeks(user, scope || null); + return readTermWeeks(scope); } /** @@ -142,8 +150,9 @@ export async function updateTermWeeks( * 比从空白开始一周周填要快得多。 */ export async function autoTermWeeks(user: TokenPayload, input: AutoTermWeeksInput): Promise { - await assertPermission(user, 'term:write'); const scope = scopeOf(input.classId); + if (scope) await assertHeadOnly(user, 'class:settings', scope); + else assertAdmin(user); const context = await loadTermContext(scope || null); const termStartDate = input.termStartDate || context.termStartDate || env.termStartDate; const maxWeek = input.maxWeek ?? context.maxWeek; diff --git a/packages/server/src/modules/update/client-releases.service.ts b/packages/server/src/modules/update/client-releases.service.ts index 42b865f..8535cec 100644 --- a/packages/server/src/modules/update/client-releases.service.ts +++ b/packages/server/src/modules/update/client-releases.service.ts @@ -1,3 +1,5 @@ +import type { TokenPayload } from '../../lib/jwt.js'; +import { assertAdmin } from '../../lib/authz/index.js'; import { getReleaseProgress, setReleaseProgress } from './release-progress.js'; import { Transform } from 'node:stream'; import crypto from 'node:crypto'; @@ -54,10 +56,14 @@ function releaseRoot(): string { } function releaseDir(version: string): string { + if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(version) || version.includes('..')) + throw ApiError.badRequest('版本号不是安全路径段'); return path.join(releaseRoot(), version); } function releaseFilePath(version: string, fileName: string): string { + if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(fileName) || fileName.includes('..')) + throw ApiError.badRequest('文件名不是安全路径段'); return path.join(releaseDir(version), fileName); } @@ -128,9 +134,11 @@ export async function resolveReleaseFile( /** 登记一份已经在磁盘上的安装包:算 sha256 / 大小后落库(可重复登记,会覆盖) */ export async function registerRelease( - userId: string, + actor: TokenPayload, input: RegisterClientReleaseInput, ): Promise { + assertAdmin(actor); + const userId = actor.sub; const version = input.version; // 文件名默认走发布命名约定(与 GitHub Release、官网兜底直链一致) const known = (await prisma.clientRelease.findUnique({ where: { version } })) as ReleaseRow | null; @@ -171,11 +179,12 @@ export async function registerRelease( /** 让服务端从 GitHub 拉一份安装包并登记(教室无外网时由服务端代下) */ export async function fetchReleaseFromGithub( - userId: string, + actor: TokenPayload, input: FetchClientReleaseInput, ): Promise { if (['downloading', 'verifying'].includes(getReleaseProgress().stage)) throw ApiError.conflict('已有安装包正在下载'); + assertAdmin(actor); const version = input.version; setReleaseProgress({ version, stage: 'downloading', downloadedBytes: 0, totalBytes: 0, error: '' }); const fileName = clientReleaseFileName(version); @@ -221,13 +230,14 @@ export async function fetchReleaseFromGithub( // 落盘后统一走登记:sha256 / 大小 / 落库都在同一处算 setReleaseProgress({ stage: 'verifying' }); - const release = await registerRelease(userId, { version, fileName }); + const release = await registerRelease(actor, { version, fileName }); setReleaseProgress({ stage: 'ready', downloadedBytes: release.size, totalBytes: release.size }); return release; } /** 删除一份缓存的安装包(元数据 + 磁盘文件) */ -export async function deleteRelease(version: string): Promise<{ version: string }> { +export async function deleteRelease(actor: TokenPayload, version: string): Promise<{ version: string }> { + assertAdmin(actor); const row = (await prisma.clientRelease.findUnique({ where: { version } })) as ReleaseRow | null; if (!row) throw ApiError.notFound('服务端没有这个版本的安装包'); await prisma.clientRelease.delete({ where: { version } }); diff --git a/packages/server/src/modules/update/update.module.ts b/packages/server/src/modules/update/update.module.ts index c2b9f1e..22b5260 100644 --- a/packages/server/src/modules/update/update.module.ts +++ b/packages/server/src/modules/update/update.module.ts @@ -1,3 +1,4 @@ +import { assertClassDevice, assertPermission, classIdsFor } from '../../lib/authz/index.js'; import { getReleaseProgress, setReleaseProgress } from './release-progress.js'; import { Router } from 'express'; import { sendCreated, sendOk, ApiError } from '../../lib/http.js'; @@ -7,9 +8,10 @@ import { hasAuthPermission, requireAnyPermission, requirePermission, - requireStaffPermission, + requireAdmin, + requirePermissionOrClassDevice, } from '../../middleware/auth.js'; -import { validate, validatedBody, validatedParams } from '../../middleware/validate.js'; +import { validateBadRequest as validate, validatedBody, validatedParams } from '../../middleware/validate.js'; import { defineModule } from '../module.types.js'; import * as clientReleases from './client-releases.service.js'; import * as updateService from './update.service.js'; @@ -39,7 +41,7 @@ router.get('/client/progress', requirePermission('client:update'), async (_req, * 权限:任何已登录用户都能查(信息本身来自公开仓库)。`force=1` 绕过服务端缓存, * 但**只有管理员生效** —— 否则任意登录用户都能靠刷这个参数把匿名限流打满。 */ -router.get('/check', requireStaffPermission('update:check'), async (req, res) => { +router.get('/check', requirePermissionOrClassDevice('update:check'), async (req, res) => { const force = req.query.force === '1' && hasAuthPermission(req, 'update:force'); sendOk(res, await updateService.checkForUpdates({ force }), '更新检查完成'); }); @@ -68,13 +70,14 @@ router.get( */ router.post( '/client/fetch', + requireAdmin(), requirePermission('client:update'), validate({ body: fetchClientReleaseSchema }), async (req, res) => { const user = getAuthUser(req); const input = validatedBody(req); try { - sendCreated(res, await clientReleases.fetchReleaseFromGithub(user.sub, input), '安装包已下载并登记'); + sendCreated(res, await clientReleases.fetchReleaseFromGithub(user, input), '安装包已下载并登记'); } catch (error) { if ( !(error instanceof ApiError && error.status === 409) && @@ -97,23 +100,25 @@ router.post( */ router.post( '/client/releases', + requireAdmin(), requirePermission('client:update'), validate({ body: registerClientReleaseSchema }), async (req, res) => { const user = getAuthUser(req); const input = validatedBody(req); - sendCreated(res, await clientReleases.registerRelease(user.sub, input), '安装包已登记'); + sendCreated(res, await clientReleases.registerRelease(user, input), '安装包已登记'); }, ); /** DELETE /api/update/client/releases/:version - 删除缓存(元数据 + 磁盘文件) */ router.delete( '/client/releases/:version', + requireAdmin(), requirePermission('client:update'), validate({ params: clientReleaseVersionParamSchema }), async (req, res) => { const { version } = validatedParams<{ version: string }>(req); - sendOk(res, await clientReleases.deleteRelease(version), '安装包已删除'); + sendOk(res, await clientReleases.deleteRelease(getAuthUser(req), version), '安装包已删除'); }, ); @@ -128,6 +133,13 @@ router.get( '/client/download/:version', validate({ params: clientReleaseVersionParamSchema }), async (req, res) => { + const user = getAuthUser(req); + if (user.role === 'CLASS_DEVICE') assertClassDevice(user, user.classId ?? user.sub); + else { + await assertPermission(user, 'client:read'); + if (user.role !== 'ADMIN' && !(await classIdsFor(user, 'client:read')).length) + throw ApiError.forbidden('无可访问班级'); + } const { version } = validatedParams<{ version: string }>(req); const found = await clientReleases.resolveReleaseFile(version); if (!found) throw ApiError.notFound('服务端没有缓存这个版本的安装包'); diff --git a/packages/server/src/modules/update/update.schemas.ts b/packages/server/src/modules/update/update.schemas.ts index 2455123..740c426 100644 --- a/packages/server/src/modules/update/update.schemas.ts +++ b/packages/server/src/modules/update/update.schemas.ts @@ -13,7 +13,7 @@ export const clientReleaseVersionSchema = z .trim() .min(1, '请输入版本号') .max(40, '版本号最多 40 个字符') - .refine((value) => SAFE_SEGMENT.test(value), { + .refine((value) => SAFE_SEGMENT.test(value) && value !== '.' && value !== '..' && !value.includes('..'), { message: '版本号只能包含字母、数字、点、下划线与短横线', }); @@ -30,7 +30,9 @@ export const registerClientReleaseSchema = z.object({ .trim() .min(1) .max(120) - .refine((value) => SAFE_SEGMENT.test(value), { message: '文件名只能包含字母、数字、点、下划线与短横线' }) + .refine((value) => SAFE_SEGMENT.test(value) && value !== '.' && value !== '..' && !value.includes('..'), { + message: '文件名只能包含字母、数字、点、下划线与短横线', + }) .optional(), notes: z.string().trim().max(500).optional(), }); diff --git a/packages/server/src/realtime/bus.ts b/packages/server/src/realtime/bus.ts index 0e62240..ecee0e9 100644 --- a/packages/server/src/realtime/bus.ts +++ b/packages/server/src/realtime/bus.ts @@ -1,4 +1,4 @@ -import { SOCKET_ROOMS } from '@classhelper/shared'; +import { SOCKET_ROOMS, SOCKET_EVENT_CHANNELS } from '@classhelper/shared'; /** * 实时事件总线。 @@ -21,7 +21,19 @@ export function emitToRooms(rooms: string[], event: string, payload: unknown): v /** 按班级房间广播(class:{classId}) */ export function emitToClass(classId: string, event: string, payload: unknown): void { - emitToRooms([SOCKET_ROOMS.class(classId)], event, payload); + emitToRooms([SOCKET_ROOMS.classChannel(classId, SOCKET_EVENT_CHANNELS[event] ?? 'core')], event, payload); +} + +let disconnectUsers: (ids: string[] | null) => void = () => {}; +export function registerSessionInvalidator(invalidate: (ids: string[] | null) => void) { + disconnectUsers = invalidate; +} +export function disconnectUserSessions(ids: string[]) { + disconnectUsers(ids); +} +/** 班级集合或任课关系变化后,重连重新解析按键范围。 */ +export function refreshClassSubscriptions() { + disconnectUsers(null); } /** diff --git a/packages/server/src/realtime/socket.ts b/packages/server/src/realtime/socket.ts index 768dd31..36686db 100644 --- a/packages/server/src/realtime/socket.ts +++ b/packages/server/src/realtime/socket.ts @@ -3,36 +3,42 @@ import { Server } from 'socket.io'; import { SOCKET_EVENTS, SOCKET_ROOMS, + SOCKET_CHANNELS, + type SocketChannel, + type PermissionKey, type ClientToServerEvents, type ServerToClientEvents, type SocketAuthPayload, - type UserRole, } from '@classhelper/shared'; import { env } from '../config/env.js'; -import { getAccessibleClassIds } from '../lib/access.js'; -import { verifyToken } from '../lib/jwt.js'; +import { verifyToken, type TokenPayload } from '../lib/jwt.js'; +import { loadSessionUser } from '../lib/authz/session.js'; +import { classIdsFor, loadAuthPrincipal, classDeviceClassId } from '../lib/authz/index.js'; import { logger } from '../lib/logger.js'; -import { registerEmitter, type RealtimeEmitter } from './bus.js'; +import { registerEmitter, registerSessionInvalidator } from './bus.js'; interface SocketData { - user: { - id: string; - username: string; - name: string; - role: UserRole; - classId: string | null; - classSession: boolean; - }; + user: TokenPayload; + token: string; } - export type RealtimeServer = Server< ClientToServerEvents, ServerToClientEvents, Record, SocketData >; - -/** 绑定 Socket.IO 到 HTTP 服务,并注册到事件总线 */ +const channelKeys: Record = { + core: ['class:read', 'schedule:read'], + homework: ['homework:read'], + notification: ['notification:read'], + grade: ['grade:read'], + courseware: ['courseware:read'], +}; +async function channelClasses(user: TokenPayload, channel: SocketChannel): Promise> { + const id = classDeviceClassId(user); + if (id) return new Set([id]); + return new Set((await Promise.all(channelKeys[channel].map((key) => classIdsFor(user, key)))).flat()); +} export function initRealtime(httpServer: HttpServer): RealtimeServer { const io: RealtimeServer = new Server(httpServer, { cors: { origin: env.corsOrigins, credentials: true }, @@ -40,110 +46,92 @@ export function initRealtime(httpServer: HttpServer): RealtimeServer { pingInterval: 25000, pingTimeout: 20000, }); - - // 握手鉴权:客户端通过 handshake.auth.token 传入 JWT io.use((socket, next) => { - try { - const auth = (socket.handshake.auth ?? {}) as Partial; - const queryToken = - typeof socket.handshake.query.token === 'string' ? socket.handshake.query.token : null; - const token = auth.token ?? queryToken; - if (!token) { - next(new Error('缺少认证 token')); - return; + void (async () => { + try { + const auth = socket.handshake.auth as Partial; + const token = + auth.token ?? + (typeof socket.handshake.query.token === 'string' ? socket.handshake.query.token : ''); + const user = await loadSessionUser(verifyToken(token)); + await loadAuthPrincipal(user); + socket.data = { user, token }; + next(); + } catch { + next(new Error('认证失败,请重新登录')); } - const payload = verifyToken(token); - // ClassHelper 班级端:socket.data.user.id 用**班级 id**,据此加入 session:{classId} 房间, - // 「叫人」等定向消息因此能直达教室机器(见 calls.service)。 - socket.data.user = { - id: payload.classSession ? (payload.classId ?? payload.sub) : payload.sub, - username: payload.classSession ? (payload.classCode ?? payload.username) : payload.username, - name: payload.name, - role: payload.role, - classId: payload.classId, - classSession: payload.classSession === true, - }; - next(); - } catch { - next(new Error('认证失败,请重新登录')); - } + })(); }); - io.on('connection', (socket) => { const user = socket.data.user; - void (async () => { - const rooms = [SOCKET_ROOMS.session(user.id), SOCKET_ROOMS.role(user.role)]; - - try { - const classIds = await getAccessibleClassIds({ - sub: user.id, - username: user.username, - name: user.name, - role: user.role, - classId: user.classId, - classSession: user.classSession, - }); - for (const classId of classIds) { - await socket.join(SOCKET_ROOMS.class(classId)); - rooms.push(SOCKET_ROOMS.class(classId)); - } - } catch (error) { - logger.warn(`加入班级房间失败(user=${user.id})`, error); - } - - // ClassHelper 班级端归入 students 房间(它代表全班),教师/管理员归入 teachers - const audienceRoom = user.role === 'CLASS_DEVICE' ? SOCKET_ROOMS.students : SOCKET_ROOMS.teachers; - await socket.join(audienceRoom); - rooms.push(audienceRoom); - - logger.info(`实时连接建立:${user.name}(${user.role}) sid=${socket.id}`); - socket.emit(SOCKET_EVENTS.connected, { sessionId: user.id, role: user.role, rooms }); - })(); - - // 客户端可显式订阅某个班级(服务端二次校验权限) - socket.on('class:join', (classId, ack) => { + // 手动订阅每次回查账号与权限;不沿用握手时的权限快照。 + const ready = (async () => { + const base = [ + SOCKET_ROOMS.session(user.sub), + SOCKET_ROOMS.role(user.role), + user.role === 'CLASS_DEVICE' ? SOCKET_ROOMS.students : SOCKET_ROOMS.teachers, + ]; + await socket.join(base); + for (const channel of SOCKET_CHANNELS) + for (const id of await channelClasses(user, channel)) + await socket.join(SOCKET_ROOMS.classChannel(id, channel)); + socket.emit(SOCKET_EVENTS.connected, { + sessionId: user.sub, + role: user.role, + rooms: [...socket.rooms].filter((r) => r !== socket.id), + }); + })().catch((error) => { + logger.warn('实时订阅失败', error); + socket.disconnect(true); + }); + socket.on('class:join', (request, ack) => { void (async () => { + await ready; try { - const allowed = await getAccessibleClassIds({ - sub: user.id, - username: user.username, - name: user.name, - role: user.role, - classId: user.classId, - classSession: user.classSession, - }); - if (!allowed.includes(classId)) { - ack?.({ ok: false, message: '无权订阅该班级' }); + const current = await loadSessionUser(verifyToken(socket.data.token)); + const classId = typeof request === 'string' ? request : request.classId; + const requested = + typeof request === 'string' ? SOCKET_CHANNELS : (request.channels ?? SOCKET_CHANNELS); + if (!requested.length || requested.some((c) => !SOCKET_CHANNELS.includes(c))) { + ack?.({ ok: false, message: '未知事件通道' }); return; } - await socket.join(SOCKET_ROOMS.class(classId)); + const allowed: SocketChannel[] = []; + for (const channel of requested) + if ((await channelClasses(current, channel)).has(classId)) allowed.push(channel); + // 旧字符串协议只加入有权通道;新协议显式通道有任一无权则全部拒绝。 + if (!allowed.length || (typeof request !== 'string' && allowed.length !== requested.length)) { + ack?.({ ok: false, message: '无权订阅该班级或通道' }); + return; + } + for (const channel of allowed) await socket.join(SOCKET_ROOMS.classChannel(classId, channel)); ack?.({ ok: true }); } catch { ack?.({ ok: false, message: '订阅失败' }); } })(); }); - - socket.on('class:leave', (classId) => { - void socket.leave(SOCKET_ROOMS.class(classId)); - }); - - socket.on('ping', (ack) => { - ack?.(); - }); - - socket.on('disconnect', (reason) => { - logger.debug(`实时连接断开:${user.name} (${reason})`); + socket.on('class:leave', (request) => { + void (async () => { + await ready; + const classId = typeof request === 'string' ? request : request.classId; + for (const channel of typeof request === 'string' + ? SOCKET_CHANNELS + : (request.channels ?? SOCKET_CHANNELS)) + await socket.leave(SOCKET_ROOMS.classChannel(classId, channel)); + })(); }); + socket.on('ping', (ack) => ack?.()); + }); + registerEmitter((rooms, event, payload) => { + (io.to(rooms) as unknown as { emit(event: string, payload: unknown): void }).emit(event, payload); + }); + registerSessionInvalidator((ids) => { + if (ids === null) { + io.in(SOCKET_ROOMS.teachers).disconnectSockets(true); + return; + } + for (const id of ids) io.in(SOCKET_ROOMS.session(id)).disconnectSockets(true); }); - - const emit: RealtimeEmitter = (rooms, event, payload) => { - const target = io.to(rooms) as unknown as { emit: (event: string, payload: unknown) => void }; - target.emit(event, payload); - logger.debug(`实时推送 ${event} -> ${rooms.join(',')}`); - }; - registerEmitter(emit); - - logger.info('Socket.IO 实时通道已就绪(房间规则:class:{classId} / session:{id})'); return io; } diff --git a/packages/shared/src/class-plan.ts b/packages/shared/src/class-plan.ts index abdadec..71419a4 100644 --- a/packages/shared/src/class-plan.ts +++ b/packages/shared/src/class-plan.ts @@ -89,7 +89,7 @@ export function getMaxTermWeeks(configured?: unknown): number { return Number.isInteger(value) && value >= 1 && value <= 60 ? value : 30; } -export type PermissionScope = 'SELF_CLASS' | 'GRADE' | 'DIVISION' | 'ALL'; +export type PermissionScope = 'TEACHING' | 'HEAD' | 'GRADE' | 'DIVISION' | 'ALL'; export interface ReleaseProgressDto { version: string; stage: 'idle' | 'downloading' | 'verifying' | 'ready' | 'waiting' | 'installing' | 'failed'; diff --git a/packages/shared/src/constants.ts b/packages/shared/src/constants.ts index 49e9472..8d04602 100644 --- a/packages/shared/src/constants.ts +++ b/packages/shared/src/constants.ts @@ -493,6 +493,22 @@ export const SOCKET_EVENTS = { connected: 'connected', } as const; +/** 班级事件域;订阅资格按对应读能力逐域求值。 */ +export const SOCKET_CHANNELS = ['core', 'homework', 'notification', 'grade', 'courseware'] as const; +export type SocketChannel = (typeof SOCKET_CHANNELS)[number]; +export const SOCKET_EVENT_CHANNELS: Record = { + 'class:updated': 'core', + 'schedule:updated': 'core', + 'homework:new': 'homework', + 'homework:updated': 'homework', + 'homework:status': 'homework', + 'notification:new': 'notification', + 'notification:deleted': 'notification', + 'call:new': 'notification', + 'grade:updated': 'grade', + 'courseware:changed': 'courseware', +}; + /** ClassIsland JSON 导入:时间点类型(与 TimeLayoutItem.TimeType 一致) */ export const CLASSISLAND_TIME_TYPES = { class: 0, @@ -560,6 +576,8 @@ export function buildCallTitle(studentName: string, teacherName: string): string /** Socket.IO 房间名生成规则:与后端保持一致,客户端订阅时复用 */ export const SOCKET_ROOMS = { + classChannel: (classId: string, channel: SocketChannel): string => `class:${classId}:${channel}`, + /** @deprecated 仅供旧协议测试识别,生产不再订阅。 */ class: (classId: string): string => `class:${classId}`, /** * 会话自身的房间:老师/管理员是账号 id,ClassHelper 班级端是班级 id。 diff --git a/packages/shared/src/lifecycle.ts b/packages/shared/src/lifecycle.ts index 2544e1f..a7c95ae 100644 --- a/packages/shared/src/lifecycle.ts +++ b/packages/shared/src/lifecycle.ts @@ -2,14 +2,13 @@ import type { PermissionScope } from './class-plan.js'; /** 范围解析供保存、查询与展示共用;旧库空岗位范围会由调用方拒绝访问。 */ export function parsePermissionScope(scope: PermissionScope, value = '', knownGrades?: readonly string[]) { - if (scope === 'ALL') return { scope, scopeValue: '', grades: [], scopeLabel: '全校' }; - if (scope === 'SELF_CLASS') { - if (value !== '' && value !== 'HEAD') throw new Error('关联班级范围只允许全部关联班级或仅班主任班'); + if (scope === 'ALL' || scope === 'TEACHING' || scope === 'HEAD') { + if (value !== '') throw new Error('关联班级或全校范围不接受范围值'); return { scope, - scopeValue: value, + scopeValue: '', grades: [], - scopeLabel: value === 'HEAD' ? '仅班主任班' : '班主任与任课班级', + scopeLabel: scope === 'ALL' ? '全校' : scope === 'HEAD' ? '仅班主任班' : '班主任与任课班级', }; } if (scope !== 'GRADE' && scope !== 'DIVISION') throw new Error('未知的数据范围'); @@ -50,3 +49,10 @@ export function defaultPromotionPlan(classCount = 1): PromotionPlan { resetTermWeeks: true, }; } + +/** 仅迁移和旧快照恢复使用;运行时不接受旧枚举。 */ +export function migratePermissionScope(scope: string, scopeValue = '') { + return scope === 'SELF_CLASS' + ? { scope: scopeValue === 'HEAD' ? 'HEAD' : 'TEACHING', scopeValue: '' } + : { scope, scopeValue }; +} diff --git a/packages/shared/src/permissions.ts b/packages/shared/src/permissions.ts index d596cdf..348a577 100644 --- a/packages/shared/src/permissions.ts +++ b/packages/shared/src/permissions.ts @@ -1,4 +1,5 @@ import type { UserRole } from './types.js'; +import type { PermissionScope } from './class-plan.js'; /** * 班级内的角色(相对"某一个班级"而言)。 @@ -168,6 +169,8 @@ export const PERMISSION_KEYS = [ // 班级与人员 'class:read', 'class:manage', + 'class:account', + 'class:settings', 'roster:read', 'roster:manage', 'teacher:read', @@ -243,11 +246,22 @@ export const BUILTIN_TEACHER_GROUPS = [ { id: 'builtin-head', name: '班主任', - scope: 'SELF_CLASS', - scopeValue: 'HEAD', - keys: [...TEACHING_KEYS, 'client:read', 'client:manage'], + scope: 'HEAD', + scopeValue: '', + keys: [ + ...TEACHING_KEYS, + 'class:read', + 'class:account', + 'class:settings', + 'roster:manage', + 'schedule:write', + 'import:students', + 'import:schedule', + 'client:read', + 'client:manage', + ], }, - { id: 'builtin-teacher', name: '教师', scope: 'SELF_CLASS', scopeValue: '', keys: TEACHING_KEYS }, + { id: 'builtin-teacher', name: '教师', scope: 'TEACHING', scopeValue: '', keys: TEACHING_KEYS }, { id: 'builtin-grade', name: '级长', scope: 'GRADE', scopeValue: '', keys: LEAD_KEYS }, { id: 'builtin-division', name: '部长', scope: 'DIVISION', scopeValue: '', keys: LEAD_KEYS }, ] as const; @@ -257,7 +271,9 @@ export const PERMISSION_LABELS: Record = { 'courseware:read': '查看与下载课件', 'courseware:write': '上传、设置可见范围与推送自己的课件', 'class:read': '查看班级与班级列表', - 'class:manage': '创建 / 修改 / 删除班级(含班级账号密码)', + 'class:manage': '创建 / 修改 / 删除班级', + 'class:account': '管理本班班级码与密码(仅班主任)', + 'class:settings': '管理本班学期设置(仅班主任)', 'roster:read': '查看学生名单', 'roster:manage': '学生名单管理(资料 / 调班 / 转入转出 / 停用)', 'teacher:read': '查看教师名单', @@ -305,6 +321,8 @@ export const PERMISSION_CATEGORIES: readonly { title: string; keys: readonly Per keys: [ 'class:read', 'class:manage', + 'class:account', + 'class:settings', 'roster:read', 'roster:manage', 'teacher:read', @@ -376,6 +394,8 @@ export const PERMISSION_DEFAULT_ROLES: Record = { ADMIN: PERMISSION_KEYS, @@ -460,7 +480,7 @@ export const PERMISSION_MATRIX: readonly { subject: boolean; classDevice?: boolean; }[] = [ - { action: '学年升级(默认管理员,可按权限组授权)', admin: true, head: false, subject: false }, + { action: '学年升级(仅管理员)', admin: true, head: false, subject: false }, { action: '班级创建 / 修改 / 删除', admin: true, head: false, subject: false }, { action: '分配班主任与各科科任老师', admin: true, head: false, subject: false }, { action: '学生名单管理(增删 / 导入 / 调班)', admin: true, head: true, subject: false }, @@ -474,3 +494,68 @@ export const PERMISSION_MATRIX: readonly { { action: '按学号查询学生成绩明细', admin: true, head: true, subject: true, classDevice: true }, { action: '查看 ClassHelper 班级端在线状态', admin: true, head: true, subject: true }, ]; + +/** 能力目录:管理员能力不可下放,关系提示不替代服务层数据校验。 */ +export const PERMISSION_SCOPES = ['TEACHING', 'HEAD', 'GRADE', 'DIVISION', 'ALL'] as const; +export interface PermissionMeta { + kind: 'admin' | 'class' | 'org'; + risk: 'normal' | 'high'; + relation: 'head' | 'subject' | 'publish' | 'creator' | 'none'; + allowedScopes: readonly PermissionScope[]; + defaultRoles: readonly UserRole[]; + label: string; + category: string; +} +const ADMIN_KEYS: readonly PermissionKey[] = [ + 'class:manage', + 'teacher:manage', + 'permission:manage', + 'system:manage', + 'database:manage', + 'update:force', + 'ai:manage', + 'import:teachers', + 'import:class-teachers', + 'timetable:manage', + 'promotion:manage', + 'archive:manage', + 'term:write', + 'client:update', +]; +const ORG_KEYS: readonly PermissionKey[] = ['teacher:read', 'update:check']; +const HIGH_KEYS: readonly PermissionKey[] = [ + ...ADMIN_KEYS, + 'class:account', + 'client:manage', + 'client:update-push', + 'remote:control', + 'import:students', + 'import:schedule', + 'grade:import', +]; +export const PERMISSION_META: Record = Object.fromEntries( + PERMISSION_KEYS.map((key) => { + const kind = ADMIN_KEYS.includes(key) ? 'admin' : ORG_KEYS.includes(key) ? 'org' : 'class'; + const relation = ['class:account', 'class:settings'].includes(key) + ? 'head' + : ['homework:write', 'grade:write', 'grade:import'].includes(key) + ? 'subject' + : ['notification:publish', 'call:create'].includes(key) + ? 'publish' + : key === 'notification:delete' + ? 'creator' + : 'none'; + return [ + key, + { + kind, + relation, + risk: HIGH_KEYS.includes(key) ? 'high' : 'normal', + allowedScopes: kind === 'class' ? PERMISSION_SCOPES : [], + defaultRoles: PERMISSION_DEFAULT_ROLES[key], + label: PERMISSION_LABELS[key], + category: PERMISSION_CATEGORIES.find((c) => c.keys.includes(key))?.title ?? '', + }, + ]; + }), +) as unknown as Record; diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 6d8fa0e..199e87f 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -12,7 +12,8 @@ import type { // 只导入类型(PermissionKey 由 permissions.ts 的 PERMISSION_KEYS 推导): // 两个文件之间是**类型层面**的相互引用,编译后都会被抹掉,运行时不存在循环依赖。 -import type { PermissionKey } from './permissions.js'; +import type { PermissionKey, PermissionMeta } from './permissions.js'; +import type { SocketChannel } from './constants.js'; /** * 账号角色:管理员 / 教师 / ClassHelper 班级端。 @@ -495,14 +496,12 @@ export interface CreateClassRequest { } export interface UpdateClassRequest { - /** 本班学期开始日期(YYYY-MM-DD,第 1 教学周的周一);留空串表示回落到全局配置 */ - termStartDate?: string | null; - /** 入学年份(有名无实的旧数据需要补填;填了会重算 name) */ enrollmentYear?: number; - /** 班号(同上) */ classIndex?: number; - /** 本学期教学周数(1~30,仅管理员可调) */ +} +export interface UpdateClassSettingsRequest { termWeeks?: number; + termStartDate?: string | null; } /** 班级端成绩查询开关 */ @@ -1205,6 +1204,10 @@ export interface IslandState { /* ------------------------------------------------------------------ 仪表盘 */ export interface DashboardSummary { + sections: Record< + 'classes' | 'students' | 'courses' | 'schedules' | 'homeworks' | 'notifications' | 'grades', + boolean + >; classCount: number; studentCount: number; courseCount: number; @@ -1325,8 +1328,11 @@ export interface TimeLayoutImportResult { /** 客户端 -> 服务端事件名 */ export interface ClientToServerEvents { - 'class:join': (classId: string, ack?: (result: { ok: boolean; message?: string }) => void) => void; - 'class:leave': (classId: string) => void; + 'class:join': ( + classId: string | { classId: string; channels?: SocketChannel[] }, + ack?: (result: { ok: boolean; message?: string }) => void, + ) => void; + 'class:leave': (classId: string | { classId: string; channels?: SocketChannel[] }) => void; ping: (ack?: () => void) => void; } @@ -1465,6 +1471,12 @@ export interface UpdateInfo { * **没有任何分组**时回落角色默认模板(逐条镜像权限组上线前各路由的 requireRole)。 */ export interface PermissionGroupDto { + defaultScope: ContractPermissionScope; + defaultScopeValue: string; + defaultScopeLabel: string; + kind: 'builtin' | 'custom' | 'default'; + inactiveKeys: PermissionKey[]; + warnings: string[]; scope?: ContractPermissionScope; scopeValue?: string; scopeLabel: string; @@ -1481,14 +1493,32 @@ export interface PermissionGroupDto { } /** 权限页里的一个成员(管理员/教师账号) */ +export interface PermissionAssignment { + groupId: string; + scope: ContractPermissionScope; + scopeValue: string; +} +export interface EffectivePermissionsDto { + permissions: PermissionKey[]; + entries: { + key: PermissionKey; + scopes: string[]; + classes: { id: string; name: string }[]; + classCount: number; + }[]; + conflicts: string[]; + headOnlyKeys: PermissionKey[]; +} export interface PermissionMemberDto { + fixed: boolean; + assignments: (PermissionAssignment & { groupName: string; scopeLabel: string })[]; id: string; username: string; name: string; role: UserRole; - /** 所属权限组;空数组 = 走角色默认模板 */ + /** 所属模板的派生 id;空数组 = 教师默认模板 */ groupIds: string[]; - /** 生效权限数量;管理员在分组并集之外始终保留两个管理入口 */ + /** 生效能力数量;管理员固定为全集 */ permissionCount: number; permissions: PermissionKey[]; scopeLabels: string[]; @@ -1496,6 +1526,7 @@ export interface PermissionMemberDto { /** `GET /api/permissions/catalog`:权限键目录(与 shared 的常量一一对应,供权限页渲染) */ export interface PermissionCatalogDto { + meta: Record; keys: PermissionKey[]; labels: Record; categories: { title: string; keys: PermissionKey[] }[]; @@ -1503,7 +1534,7 @@ export interface PermissionCatalogDto { defaultRoles: Record; /** 每个角色的默认模板("没有分组时会是什么") */ roleDefaults: Record; - /** 管理员不可被剥夺的键(前端置灰、服务端也会合并回去) */ + /** 兼容字段:管理员固定拥有的全部目录键 */ unremovable: PermissionKey[]; } @@ -1525,7 +1556,8 @@ export interface UpdatePermissionGroupRequest { /** `PUT /api/permissions/users/:id/groups`:整体替换某账号的权限组 */ export interface AssignUserGroupsRequest { - groupIds: string[]; + groupIds?: string[]; + assignments?: PermissionAssignment[]; } /** @@ -1535,9 +1567,15 @@ export interface AssignUserGroupsRequest { * 真正的拦截始终在服务端。 */ export interface MyPermissionsDto { + /** 各能力实际班级集合,供界面选择器与按钮使用;服务端仍须再授权。 */ + classScopes?: Partial>; + manageScopes?: Partial>; + /** 结合班主任、任课及发布者关系后的动作范围,用于维护页面入口。 */ + actionScopes?: Partial>; + allScopeKeys?: PermissionKey[]; role: UserRole; permissions: PermissionKey[]; - /** true = 权限来自权限组;false = 走角色默认模板(未分配任何组) */ + /** true = 教师有显式分配;管理员和班级端恒为 false */ fromGroups: boolean; } diff --git a/packages/web-admin/src/api/index.ts b/packages/web-admin/src/api/index.ts index 8fa186f..4ffb81c 100644 --- a/packages/web-admin/src/api/index.ts +++ b/packages/web-admin/src/api/index.ts @@ -105,6 +105,10 @@ export const classApi = { create: (payload: CreateClassRequest): Promise => api.post(API_PATHS.classes, payload), update: (id: string, payload: UpdateClassRequest): Promise => api.patch(`${API_PATHS.classes}/${id}`, payload), + updateSettings: ( + id: string, + payload: { termWeeks?: number; termStartDate?: string | null }, + ): Promise => api.patch(`${API_PATHS.classes}/${id}/settings`, payload), remove: (id: string): Promise<{ id: string }> => api.delete(`${API_PATHS.classes}/${id}`), students: (id: string): Promise => api.get(`${API_PATHS.classes}/${id}/students`), addStudent: ( diff --git a/packages/web-admin/src/components/TimeLayoutEditor.vue b/packages/web-admin/src/components/TimeLayoutEditor.vue index 35e41b3..a46b7e0 100644 --- a/packages/web-admin/src/components/TimeLayoutEditor.vue +++ b/packages/web-admin/src/components/TimeLayoutEditor.vue @@ -21,6 +21,7 @@ const props = defineProps<{ layouts: TimeLayoutDetailDto[]; courses: CourseDto[]; canEdit: boolean; + canCreate: boolean; saving: boolean; /** 引用当前时间表的日课表数量,显示在「时间表信息」里。 */ planCount: number; @@ -321,7 +322,7 @@ onUnmounted(() => {

Rvm4+(aLAA?nNLoL%QwW1jrEK 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 xpa1$x-=FxdKHPJYD@<);T3K0RT1b$Aka? diff --git a/docs/screenshots/plan-editor-timeline.png b/docs/screenshots/plan-editor-timeline.png index 43d745b4f11c120de158d5014d586f1ba77e8ba5..2ce4e31b86289dfb48fe0c9c9071430b757bb2c2 100644 GIT binary patch literal 103408 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