koishi-vault-permission-basic 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # koishi-vault-permission-basic
2
+
3
+ JSON file-based `PermissionProvider` for [koishi-vault](https://github.com/koishijs/koishi-vault).
4
+
5
+ ## Features
6
+
7
+ - **JSON file storage** — permissions and groups persisted to a single JSON file
8
+ - **Permission inheritance** — users inherit permissions from all groups they belong to
9
+ - **Wildcard matching** — `economy.*` matches `economy.balance`, `economy.admin`, etc.
10
+ - **Configurable defaults** — specify default permissions and groups for new users
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm install koishi-vault-permission-basic koishi-vault
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```typescript
21
+ // koishi.yml
22
+ plugins:
23
+ koishi-vault:
24
+ # vault config...
25
+ vault-permission-basic:
26
+ path: ./data/permissions.json
27
+ defaultPermissions:
28
+ - command.help
29
+ defaultGroups:
30
+ - default
31
+ ```
32
+
33
+ ## Configuration
34
+
35
+ | Key | Type | Default | Description |
36
+ |-----|------|---------|-------------|
37
+ | `path` | `string` | `./data/vault-permission.json` | Path to the JSON data file |
38
+ | `defaultPermissions` | `string[]` | `[]` | Permissions granted to every new user |
39
+ | `defaultGroups` | `string[]` | `[]` | Groups every new user is placed in |
40
+
41
+ ## Wildcard Rules
42
+
43
+ | Pattern | Matches |
44
+ |---------|---------|
45
+ | `*` | Everything |
46
+ | `economy.*` | `economy.balance`, `economy.admin`, `economy` (exact) |
47
+ | `command.balance` | Only `command.balance` |
48
+
49
+ ## Data Format
50
+
51
+ ```json
52
+ {
53
+ "users": {
54
+ "onebot:123456": {
55
+ "permissions": ["command.help", "economy.balance"],
56
+ "groups": ["default", "vip"]
57
+ }
58
+ },
59
+ "groups": {
60
+ "default": {
61
+ "permissions": ["command.help"]
62
+ },
63
+ "vip": {
64
+ "permissions": ["economy.*"]
65
+ }
66
+ }
67
+ }
68
+ ```
package/lib/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * koishi-vault-permission-basic
3
+ *
4
+ * Permission provider using JSON file storage with wildcard and group inheritance.
5
+ */
6
+ import { Context, Schema } from 'koishi';
7
+ export interface BasicPermissionConfig {
8
+ path?: string;
9
+ defaultPermissions?: string[];
10
+ defaultGroups?: string[];
11
+ }
12
+ export declare const Config: Schema<BasicPermissionConfig>;
13
+ export declare const name = "vault-permission-basic";
14
+ export declare function apply(ctx: Context, config: BasicPermissionConfig): void;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAKxC,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,qBAAqB,CAI/C,CAAA;AAOF,eAAO,MAAM,IAAI,2BAA2B,CAAA;AAE5C,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,QAEhE"}
package/lib/index.js ADDED
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.name = exports.Config = void 0;
4
+ exports.apply = apply;
5
+ /**
6
+ * koishi-vault-permission-basic
7
+ *
8
+ * Permission provider using JSON file storage with wildcard and group inheritance.
9
+ */
10
+ const koishi_1 = require("koishi");
11
+ const koishi_vault_1 = require("koishi-vault");
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ exports.Config = koishi_1.Schema.object({
15
+ path: koishi_1.Schema.string().default('vault-permission.json').description('Data file path'),
16
+ defaultPermissions: koishi_1.Schema.array(String).default(['command.help']).description('Default permissions for new users'),
17
+ defaultGroups: koishi_1.Schema.array(String).default(['user']).description('Default groups for new users'),
18
+ });
19
+ exports.name = 'vault-permission-basic';
20
+ function apply(ctx, config) {
21
+ ctx.plugin(BasicPermission, config);
22
+ }
23
+ class BasicPermission extends koishi_vault_1.PermissionProvider {
24
+ constructor(ctx, config) {
25
+ super(ctx, 'vault-permission', true);
26
+ this.data = { users: {}, groups: {} };
27
+ this.dirty = false;
28
+ this.filePath = (0, path_1.join)(ctx.baseDir, 'data', config.path ?? 'vault-permission.json');
29
+ this.defaultPermissions = config.defaultPermissions ?? ['command.help'];
30
+ this.defaultGroups = config.defaultGroups ?? ['user'];
31
+ this.start();
32
+ ctx.on('dispose', () => this.stop());
33
+ }
34
+ async start() { await this.load(); }
35
+ async stop() { await this.save(); }
36
+ getKey(user) { return `${user.platform || 'unknown'}:${user.userId}`; }
37
+ async load() {
38
+ try {
39
+ this.data = JSON.parse(await fs_1.promises.readFile(this.filePath, 'utf-8'));
40
+ }
41
+ catch {
42
+ this.data = { users: {}, groups: {} };
43
+ }
44
+ }
45
+ async save() {
46
+ if (!this.dirty)
47
+ return;
48
+ await fs_1.promises.mkdir((0, path_1.join)(this.filePath, '..'), { recursive: true });
49
+ await fs_1.promises.writeFile(this.filePath, JSON.stringify(this.data, null, 2), 'utf-8');
50
+ this.dirty = false;
51
+ }
52
+ matchPattern(pattern, target) {
53
+ if (pattern === '*')
54
+ return true;
55
+ if (pattern.endsWith('.*')) {
56
+ const prefix = pattern.slice(0, -2);
57
+ return target === prefix || target.startsWith(prefix + '.');
58
+ }
59
+ return pattern === target;
60
+ }
61
+ getUserData(user) {
62
+ const key = this.getKey(user);
63
+ if (!this.data.users[key]) {
64
+ this.data.users[key] = { permissions: [...this.defaultPermissions], groups: [...this.defaultGroups] };
65
+ this.dirty = true;
66
+ }
67
+ return this.data.users[key];
68
+ }
69
+ async has(user, permission, options) {
70
+ const userData = this.getUserData(user);
71
+ const allPerms = new Set(userData.permissions);
72
+ for (const group of userData.groups) {
73
+ const groupData = this.data.groups[group];
74
+ if (groupData)
75
+ groupData.permissions.forEach(p => allPerms.add(p));
76
+ }
77
+ for (const p of allPerms) {
78
+ if (this.matchPattern(p, permission))
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ async grant(user, permission) {
84
+ const userData = this.getUserData(user);
85
+ if (!userData.permissions.includes(permission)) {
86
+ userData.permissions.push(permission);
87
+ this.dirty = true;
88
+ await this.save();
89
+ }
90
+ return true;
91
+ }
92
+ async revoke(user, permission) {
93
+ const userData = this.getUserData(user);
94
+ const idx = userData.permissions.indexOf(permission);
95
+ if (idx >= 0) {
96
+ userData.permissions.splice(idx, 1);
97
+ this.dirty = true;
98
+ await this.save();
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+ async getPermissions(user) { return [...this.getUserData(user).permissions]; }
104
+ async getGroups(user) { return [...this.getUserData(user).groups]; }
105
+ async addToGroup(user, group) {
106
+ const userData = this.getUserData(user);
107
+ if (!userData.groups.includes(group)) {
108
+ userData.groups.push(group);
109
+ this.dirty = true;
110
+ await this.save();
111
+ }
112
+ return true;
113
+ }
114
+ async removeFromGroup(user, group) {
115
+ const userData = this.getUserData(user);
116
+ const idx = userData.groups.indexOf(group);
117
+ if (idx >= 0) {
118
+ userData.groups.splice(idx, 1);
119
+ this.dirty = true;
120
+ await this.save();
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ async getGroupPermissions(group) { return [...(this.data.groups[group]?.permissions ?? [])]; }
126
+ async setGroupPermissions(group, permissions) {
127
+ if (!this.data.groups[group])
128
+ this.data.groups[group] = { permissions: [] };
129
+ this.data.groups[group].permissions = permissions;
130
+ this.dirty = true;
131
+ await this.save();
132
+ return true;
133
+ }
134
+ }
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "koishi-vault-permission-basic",
3
+ "version": "0.1.0",
4
+ "description": "koishi-vault permission provider - JSON file with wildcards",
5
+ "main": "lib/index.js",
6
+ "typings": "lib/index.d.ts",
7
+ "scripts": { "build": "tsc" },
8
+ "files": ["lib"],
9
+ "peerDependencies": { "koishi": "^4.18.0", "koishi-vault": "workspace:^" },
10
+ "devDependencies": { "@types/node": "^20.0.0", "typescript": "^5.0.0" },
11
+ "koishi": { "service": { "vault-permission": "BasicPermission" } }
12
+ }