PermissionManager 是 ZerOS 内核的权限管理系统,负责管理所有程序的内核操作权限。提供权限声明、权限检查、动态权限申请和权限持久化功能。权限管理系统是 ZerOS 安全架构的核心组件,确保所有内核 API 调用都经过严格的权限验证。
ProcessManager - 进程管理器(用于获取程序信息)LStorage - 本地存储(用于权限持久化)GUIManager - GUI 管理器(用于显示权限请求对话框)权限管理系统定义了三种权限级别:
PermissionManager.PERMISSION.SYSTEM_NOTIFICATION // 发送系统通知
PermissionManager.PERMISSION.SYSTEM_STORAGE_READ // 读取系统级本地存储
PermissionManager.PERMISSION.SYSTEM_STORAGE_WRITE // 写入系统级本地存储(基础权限,仅可写入非敏感键)
// 系统存储细粒度权限(危险权限,仅管理员可授予)
PermissionManager.PERMISSION.SYSTEM_STORAGE_WRITE_USER_CONTROL // 写入用户控制相关存储(userControl.*)
PermissionManager.PERMISSION.SYSTEM_STORAGE_WRITE_PERMISSION_CONTROL // 写入权限控制相关存储(permissionControl.*, permissionManager.*)
// 系统存储细粒度权限(特殊权限,普通用户可以授予)
PermissionManager.PERMISSION.SYSTEM_STORAGE_WRITE_DESKTOP // 写入桌面相关存储(desktop.*)
PermissionManager.PERMISSION.PROCESS_MANAGE // 管理其他进程(启动/终止)
// 服务扩展权限(最高等级,DANGEROUS)
PermissionManager.PERMISSION.SERVER_SERVICE_MANAGE // 启动/停止/查询 D/server 服务(Server.* API)
PermissionManager.PERMISSION.THEME_READ // 读取系统主题配置
PermissionManager.PERMISSION.THEME_WRITE // 更改系统主题配置
PermissionManager.PERMISSION.DESKTOP_MANAGE // 管理桌面快捷方式和背景
PermissionManager.PERMISSION.DESKTOP_SHORTCUT // 创建/删除桌面快捷方式(普通权限)
PermissionManager.PERMISSION.KERNEL_DISK_READ // 读取磁盘文件
PermissionManager.PERMISSION.KERNEL_DISK_WRITE // 写入磁盘文件
PermissionManager.PERMISSION.KERNEL_DISK_DELETE // 删除磁盘文件
PermissionManager.PERMISSION.KERNEL_DISK_CREATE // 创建磁盘文件/目录
PermissionManager.PERMISSION.KERNEL_DISK_LIST // 列出磁盘文件/目录
PermissionManager.PERMISSION.KERNEL_MEMORY_READ // 读取内核内存数据
PermissionManager.PERMISSION.KERNEL_MEMORY_WRITE // 写入内核内存数据
PermissionManager.PERMISSION.NETWORK_ACCESS // 访问网络(fetch, XMLHttpRequest等)
PermissionManager.PERMISSION.GUI_WINDOW_CREATE // 创建GUI窗口
PermissionManager.PERMISSION.GUI_WINDOW_MANAGE // 管理其他程序的GUI窗口(最小化/最大化/关闭)
PermissionManager.PERMISSION.CRYPT_GENERATE_KEY // 生成密钥对
PermissionManager.PERMISSION.CRYPT_IMPORT_KEY // 导入密钥对
PermissionManager.PERMISSION.CRYPT_DELETE_KEY // 删除密钥
PermissionManager.PERMISSION.CRYPT_ENCRYPT // 加密数据
PermissionManager.PERMISSION.CRYPT_DECRYPT // 解密数据
PermissionManager.PERMISSION.CRYPT_MD5 // MD5 哈希
PermissionManager.PERMISSION.CRYPT_RANDOM // 随机数生成
PermissionManager.PERMISSION.GEOGRAPHY_LOCATION // 获取地理位置信息
PermissionManager.PERMISSION.DRAG_ELEMENT // 元素拖拽
PermissionManager.PERMISSION.DRAG_FILE // 文件拖拽
PermissionManager.PERMISSION.DRAG_WINDOW // 窗口拖拽
PermissionManager.PERMISSION.EVENT_LISTENER // 注册事件监听器
PermissionManager.PERMISSION.CACHE_READ // 读取缓存
PermissionManager.PERMISSION.CACHE_WRITE // 写入/删除缓存
PermissionManager.PERMISSION.SPEECH_RECOGNITION // 语音识别
PermissionManager.PERMISSION.MEDIA_ACCESS // 访问摄像头和麦克风
PermissionManager.PERMISSION.LANGUAGES_READ // 读取语言包、按常量名获取文本、列出语言包
PermissionManager.PERMISSION.LANGUAGES_WRITE // 加载语言包、设置当前语言
权限管理器在系统启动时自动初始化,无需手动调用。
// 自动初始化(在 BootLoader 中)
await PermissionManager.init();
registerProgramPermissions(pid, programInfoOrPermissions)注册程序的权限声明。在程序启动时由 ProcessManager 自动调用。
参数:
pid (number): 进程IDprogramInfoOrPermissions (Object|Array): 程序信息对象(包含 permissions 数组)或权限数组(向后兼容)返回值: Promise<void>
示例:
// 在程序的 __info__ 方法中声明权限
__info__() {
return {
name: 'myapp',
type: 'GUI',
version: '1.0.0',
permissions: [
PermissionManager.PERMISSION.GUI_WINDOW_CREATE,
PermissionManager.PERMISSION.KERNEL_DISK_READ,
PermissionManager.PERMISSION.KERNEL_DISK_WRITE,
PermissionManager.PERMISSION.SYSTEM_NOTIFICATION
]
};
}
// ProcessManager 会自动调用
await PermissionManager.registerProgramPermissions(pid, programInfo);
hasPermission(pid, permission)检查程序是否已有指定权限。
参数:
pid (number): 进程IDpermission (string): 权限名称返回值: boolean - 是否有权限
示例:
const hasNotify = PermissionManager.hasPermission(pid, PermissionManager.PERMISSION.SYSTEM_NOTIFICATION);
if (hasNotify) {
// 程序已有通知权限
}
checkAndRequestPermission(pid, permission)检查并申请权限(如果未授予)。这是权限检查的核心方法,会自动处理权限请求流程。
参数:
pid (number): 进程IDpermission (string): 权限名称返回值: Promise<boolean> - 是否获得权限
工作流程:
示例:
// 在创建通知前检查权限
const hasPermission = await PermissionManager.checkAndRequestPermission(
this.pid,
PermissionManager.PERMISSION.SYSTEM_NOTIFICATION
);
if (hasPermission) {
// 创建通知
NotificationManager.createNotification(this.pid, {...});
} else {
// 权限被拒绝
console.error('没有通知权限');
}
revokePermission(pid, permission)撤销程序的指定权限。
参数:
pid (number): 进程IDpermission (string): 权限名称示例:
PermissionManager.revokePermission(pid, PermissionManager.PERMISSION.SYSTEM_NOTIFICATION);
clearProgramPermissions(pid)清除程序的所有权限。在程序终止时由 ProcessManager 自动调用。
参数:
pid (number): 进程ID示例:
// ProcessManager 会自动调用
PermissionManager.clearProgramPermissions(pid);
getProgramPermissions(pid)获取程序的所有权限列表。
参数:
pid (number): 进程ID返回值: Array<string> - 权限列表
示例:
const permissions = PermissionManager.getProgramPermissions(pid);
console.log('程序权限:', permissions);
clearPermissionCache(pid)清除权限检查缓存。用于强制重新检查权限。
参数:
pid (number|null): 进程ID,如果为 null 则清除所有缓存示例:
// 清除指定程序的缓存
PermissionManager.clearPermissionCache(pid);
// 清除所有缓存
PermissionManager.clearPermissionCache(null);
getPermissionStats()获取权限统计信息(用于调试和监控)。
返回值: Object - 统计信息对象
totalPrograms (number): 已注册权限的程序数量totalPermissions (number): 总权限数量cacheSize (number): 缓存大小pendingChecks (number): 正在进行的权限检查数量pendingRequests (number): 待处理的权限请求数量initialized (boolean): 是否已初始化auditLogSize (number): 审计日志条数violationLogSize (number): 违规日志条数permissionStats (Object): 每个权限的详细统计(granted, denied, checked)示例:
const stats = PermissionManager.getPermissionStats();
console.log('权限统计:', stats);
getAuditLog(filters, limit)获取权限审计日志。记录所有权限检查、授予、拒绝等操作。
参数:
filters (Object, 可选): 过滤条件
pid (number, 可选): 进程IDpermission (string, 可选): 权限名称action (string, 可选): 操作类型('check', 'grant', 'deny', 'request')result (boolean, 可选): 操作结果limit (number, 可选): 返回的最大条数,默认 100返回值: Array<Object> - 审计日志条目数组
timestamp (number): 时间戳pid (number): 进程IDprogramName (string): 程序名称permission (string): 权限名称action (string): 操作类型result (boolean): 操作结果level (string): 权限级别context (Object): 上下文信息示例:
// 获取所有审计日志
const allLogs = PermissionManager.getAuditLog();
// 获取特定程序的审计日志
const programLogs = PermissionManager.getAuditLog({ pid: 10001 }, 50);
// 获取特定权限的审计日志
const permissionLogs = PermissionManager.getAuditLog({
permission: 'KERNEL_DISK_WRITE'
}, 20);
getViolationLog(filters, limit)获取权限违规日志。记录所有未授权访问尝试。
参数:
filters (Object, 可选): 过滤条件
pid (number, 可选): 进程IDpermission (string, 可选): 权限名称limit (number, 可选): 返回的最大条数,默认 100返回值: Array<Object> - 违规日志条目数组
timestamp (number): 时间戳pid (number): 进程IDprogramName (string): 程序名称permission (string): 权限名称context (Object): 上下文信息stack (string): 调用栈示例:
// 获取所有违规记录
const violations = PermissionManager.getViolationLog();
// 获取特定程序的违规记录
const programViolations = PermissionManager.getViolationLog({ pid: 10001 });
// 获取最近的 10 条违规记录
const recentViolations = PermissionManager.getViolationLog({}, 10);
clearAuditLog(clearViolations)清除审计日志和/或违规日志。
参数:
clearViolations (boolean, 可选): 是否同时清除违规日志,默认 false示例:
// 只清除审计日志
PermissionManager.clearAuditLog();
// 同时清除审计日志和违规日志
PermissionManager.clearAuditLog(true);
普通权限会在程序启动时自动授予,或在首次使用时根据"自动授予普通权限"设置决定是否自动授予。
KERNEL_DISK_READ - 读取文件KERNEL_DISK_LIST - 列出目录GUI_WINDOW_CREATE - 创建窗口THEME_READ - 读取主题SYSTEM_NOTIFICATION - 系统通知NETWORK_ACCESS - 网络访问(普通权限,自动授予)EVENT_LISTENER - 事件监听CACHE_READ - 读取缓存CACHE_WRITE - 写入缓存CRYPT_MD5 - MD5 哈希CRYPT_RANDOM - 随机数生成DRAG_ELEMENT - 拖拽元素DRAG_FILE - 拖拽文件DRAG_WINDOW - 拖拽窗口特殊权限首次使用时需要用户确认,用户允许后会被持久化保存。
KERNEL_DISK_WRITE - 写入文件KERNEL_DISK_CREATE - 创建文件/目录KERNEL_DISK_DELETE - 删除文件KERNEL_MEMORY_READ - 读取内存KERNEL_MEMORY_WRITE - 写入内存GUI_WINDOW_MANAGE - 管理窗口SYSTEM_STORAGE_READ - 读取系统存储SYSTEM_STORAGE_WRITE - 写入系统存储(基础权限,仅可写入非敏感键)SYSTEM_STORAGE_WRITE_DESKTOP - 写入桌面相关存储(desktop.* 键)THEME_WRITE - 修改主题DESKTOP_MANAGE - 管理桌面DESKTOP_SHORTCUT - 创建/删除桌面快捷方式(普通权限,自动授予)MULTITHREADING_CREATE - 创建线程MULTITHREADING_EXECUTE - 执行多线程任务GEOGRAPHY_LOCATION - 获取地理位置CRYPT_GENERATE_KEY - 生成密钥对CRYPT_IMPORT_KEY - 导入密钥对CRYPT_DELETE_KEY - 删除密钥CRYPT_ENCRYPT - 加密数据CRYPT_DECRYPT - 解密数据危险权限每次使用时都可能需要用户确认,需要用户明确授权。只有管理员用户才能授权危险权限给程序,普通用户无法授权。
PROCESS_MANAGE - 管理进程(启动/终止其他程序)SYSTEM_STORAGE_WRITE_USER_CONTROL - 写入用户控制相关存储(userControl.* 键,注意:userControl.users 键只能由内核模块写入,用户程序即使获得此权限也无法写入该键)SYSTEM_STORAGE_WRITE_PERMISSION_CONTROL - 写入权限控制相关存储(permissionControl.*、permissionManager.permissions 键)// system/service/DISK/D/application/myapp/myapp.js
__info__() {
return {
name: 'myapp',
type: 'GUI',
version: '1.0.0',
permissions: [
PermissionManager.PERMISSION.GUI_WINDOW_CREATE,
PermissionManager.PERMISSION.KERNEL_DISK_READ,
PermissionManager.PERMISSION.KERNEL_DISK_WRITE,
PermissionManager.PERMISSION.SYSTEM_NOTIFICATION
]
};
}
// 在创建通知前检查权限
async function createNotification() {
const hasPermission = await PermissionManager.checkAndRequestPermission(
this.pid,
PermissionManager.PERMISSION.SYSTEM_NOTIFICATION
);
if (!hasPermission) {
console.error('没有通知权限');
return;
}
// 创建通知
await NotificationManager.createNotification(this.pid, {
type: 'snapshot',
title: '通知标题',
content: '通知内容'
});
}
// ProcessManager 会自动检查权限
try {
const content = await ProcessManager.callKernelAPI(
this.pid,
'FileSystem.read',
['D:/myfile.txt']
);
console.log('文件内容:', content);
} catch (e) {
if (e.message.includes('没有权限')) {
console.error('权限被拒绝:', e.message);
} else {
console.error('读取文件失败:', e.message);
}
}
当程序请求特殊或危险权限时,系统会自动弹出权限请求对话框:
权限请求对话框使用拟态设计,提供良好的用户体验。
权限管理器使用 LStorage 持久化权限记录:
permissionManager.permissions 键中CACHE_TTL)权限管理系统支持程序黑名单和白名单功能,通过 PermissionControl 程序进行管理:
权限管理系统提供完整的审计功能:
注意:在权限请求流程中(用户正在确认权限时),系统不会记录违规。只有在权限被明确拒绝后,程序再次尝试访问时才会记录违规。
CACHE_TTL)__info__ 中声明所需权限isRequesting 标志避免误记录违规userControl.users 键特殊保护:userControl.users 键只能由 UserControl 内核模块写入,用户程序即使获得 SYSTEM_STORAGE_WRITE_USER_CONTROL 权限也无法写入该键,这是为了防止权限提升攻击