blockmine 1.4.4 → 1.4.6

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/backend/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  const fs = require('fs');
3
3
  const os = require('os');
4
4
  const path = require('path');
@@ -1,126 +1,126 @@
1
- -- CreateTable
2
- CREATE TABLE "Server" (
3
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
- "name" TEXT NOT NULL,
5
- "host" TEXT NOT NULL,
6
- "port" INTEGER NOT NULL DEFAULT 25565,
7
- "version" TEXT NOT NULL
8
- );
9
-
10
- -- CreateTable
11
- CREATE TABLE "Bot" (
12
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
13
- "username" TEXT NOT NULL,
14
- "password" TEXT,
15
- "prefix" TEXT DEFAULT '@',
16
- "note" TEXT,
17
- "serverId" INTEGER NOT NULL,
18
- "proxyHost" TEXT,
19
- "proxyPort" INTEGER,
20
- "proxyUsername" TEXT,
21
- "proxyPassword" TEXT,
22
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
- "updatedAt" DATETIME NOT NULL,
24
- CONSTRAINT "Bot_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES "Server" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
25
- );
26
-
27
- -- CreateTable
28
- CREATE TABLE "InstalledPlugin" (
29
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
30
- "botId" INTEGER NOT NULL,
31
- "name" TEXT NOT NULL,
32
- "version" TEXT NOT NULL,
33
- "description" TEXT,
34
- "sourceType" TEXT NOT NULL,
35
- "sourceUri" TEXT,
36
- "path" TEXT NOT NULL,
37
- "isEnabled" BOOLEAN NOT NULL DEFAULT true,
38
- "manifest" TEXT,
39
- "settings" TEXT DEFAULT '{}',
40
- CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
41
- );
42
-
43
- -- CreateTable
44
- CREATE TABLE "Command" (
45
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
46
- "botId" INTEGER NOT NULL,
47
- "name" TEXT NOT NULL,
48
- "isEnabled" BOOLEAN NOT NULL DEFAULT true,
49
- "cooldown" INTEGER NOT NULL DEFAULT 0,
50
- "aliases" TEXT NOT NULL DEFAULT '[]',
51
- "description" TEXT,
52
- "owner" TEXT,
53
- "permissionId" INTEGER,
54
- "allowedChatTypes" TEXT NOT NULL DEFAULT '["chat", "private"]',
55
- CONSTRAINT "Command_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
56
- CONSTRAINT "Command_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE SET NULL ON UPDATE CASCADE
57
- );
58
-
59
- -- CreateTable
60
- CREATE TABLE "User" (
61
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
62
- "username" TEXT NOT NULL,
63
- "isBlacklisted" BOOLEAN NOT NULL DEFAULT false,
64
- "botId" INTEGER NOT NULL,
65
- CONSTRAINT "User_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
66
- );
67
-
68
- -- CreateTable
69
- CREATE TABLE "Group" (
70
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
71
- "name" TEXT NOT NULL,
72
- "owner" TEXT NOT NULL DEFAULT 'system',
73
- "botId" INTEGER NOT NULL,
74
- CONSTRAINT "Group_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
75
- );
76
-
77
- -- CreateTable
78
- CREATE TABLE "Permission" (
79
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
80
- "name" TEXT NOT NULL,
81
- "description" TEXT,
82
- "owner" TEXT NOT NULL DEFAULT 'system',
83
- "botId" INTEGER NOT NULL,
84
- CONSTRAINT "Permission_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
85
- );
86
-
87
- -- CreateTable
88
- CREATE TABLE "UserGroup" (
89
- "userId" INTEGER NOT NULL,
90
- "groupId" INTEGER NOT NULL,
91
-
92
- PRIMARY KEY ("userId", "groupId"),
93
- CONSTRAINT "UserGroup_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
94
- CONSTRAINT "UserGroup_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE
95
- );
96
-
97
- -- CreateTable
98
- CREATE TABLE "GroupPermission" (
99
- "groupId" INTEGER NOT NULL,
100
- "permissionId" INTEGER NOT NULL,
101
-
102
- PRIMARY KEY ("groupId", "permissionId"),
103
- CONSTRAINT "GroupPermission_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
104
- CONSTRAINT "GroupPermission_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE CASCADE ON UPDATE CASCADE
105
- );
106
-
107
- -- CreateIndex
108
- CREATE UNIQUE INDEX "Server_name_key" ON "Server"("name");
109
-
110
- -- CreateIndex
111
- CREATE UNIQUE INDEX "Bot_username_key" ON "Bot"("username");
112
-
113
- -- CreateIndex
114
- CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
115
-
116
- -- CreateIndex
117
- CREATE UNIQUE INDEX "Command_botId_name_key" ON "Command"("botId", "name");
118
-
119
- -- CreateIndex
120
- CREATE UNIQUE INDEX "User_botId_username_key" ON "User"("botId", "username");
121
-
122
- -- CreateIndex
123
- CREATE UNIQUE INDEX "Group_botId_name_key" ON "Group"("botId", "name");
124
-
125
- -- CreateIndex
126
- CREATE UNIQUE INDEX "Permission_botId_name_key" ON "Permission"("botId", "name");
1
+ -- CreateTable
2
+ CREATE TABLE "Server" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "name" TEXT NOT NULL,
5
+ "host" TEXT NOT NULL,
6
+ "port" INTEGER NOT NULL DEFAULT 25565,
7
+ "version" TEXT NOT NULL
8
+ );
9
+
10
+ -- CreateTable
11
+ CREATE TABLE "Bot" (
12
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
13
+ "username" TEXT NOT NULL,
14
+ "password" TEXT,
15
+ "prefix" TEXT DEFAULT '@',
16
+ "note" TEXT,
17
+ "serverId" INTEGER NOT NULL,
18
+ "proxyHost" TEXT,
19
+ "proxyPort" INTEGER,
20
+ "proxyUsername" TEXT,
21
+ "proxyPassword" TEXT,
22
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
+ "updatedAt" DATETIME NOT NULL,
24
+ CONSTRAINT "Bot_serverId_fkey" FOREIGN KEY ("serverId") REFERENCES "Server" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
25
+ );
26
+
27
+ -- CreateTable
28
+ CREATE TABLE "InstalledPlugin" (
29
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
30
+ "botId" INTEGER NOT NULL,
31
+ "name" TEXT NOT NULL,
32
+ "version" TEXT NOT NULL,
33
+ "description" TEXT,
34
+ "sourceType" TEXT NOT NULL,
35
+ "sourceUri" TEXT,
36
+ "path" TEXT NOT NULL,
37
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
38
+ "manifest" TEXT,
39
+ "settings" TEXT DEFAULT '{}',
40
+ CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
41
+ );
42
+
43
+ -- CreateTable
44
+ CREATE TABLE "Command" (
45
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
46
+ "botId" INTEGER NOT NULL,
47
+ "name" TEXT NOT NULL,
48
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
49
+ "cooldown" INTEGER NOT NULL DEFAULT 0,
50
+ "aliases" TEXT NOT NULL DEFAULT '[]',
51
+ "description" TEXT,
52
+ "owner" TEXT,
53
+ "permissionId" INTEGER,
54
+ "allowedChatTypes" TEXT NOT NULL DEFAULT '["chat", "private"]',
55
+ CONSTRAINT "Command_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
56
+ CONSTRAINT "Command_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE SET NULL ON UPDATE CASCADE
57
+ );
58
+
59
+ -- CreateTable
60
+ CREATE TABLE "User" (
61
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
62
+ "username" TEXT NOT NULL,
63
+ "isBlacklisted" BOOLEAN NOT NULL DEFAULT false,
64
+ "botId" INTEGER NOT NULL,
65
+ CONSTRAINT "User_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
66
+ );
67
+
68
+ -- CreateTable
69
+ CREATE TABLE "Group" (
70
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
71
+ "name" TEXT NOT NULL,
72
+ "owner" TEXT NOT NULL DEFAULT 'system',
73
+ "botId" INTEGER NOT NULL,
74
+ CONSTRAINT "Group_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
75
+ );
76
+
77
+ -- CreateTable
78
+ CREATE TABLE "Permission" (
79
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
80
+ "name" TEXT NOT NULL,
81
+ "description" TEXT,
82
+ "owner" TEXT NOT NULL DEFAULT 'system',
83
+ "botId" INTEGER NOT NULL,
84
+ CONSTRAINT "Permission_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
85
+ );
86
+
87
+ -- CreateTable
88
+ CREATE TABLE "UserGroup" (
89
+ "userId" INTEGER NOT NULL,
90
+ "groupId" INTEGER NOT NULL,
91
+
92
+ PRIMARY KEY ("userId", "groupId"),
93
+ CONSTRAINT "UserGroup_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
94
+ CONSTRAINT "UserGroup_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE
95
+ );
96
+
97
+ -- CreateTable
98
+ CREATE TABLE "GroupPermission" (
99
+ "groupId" INTEGER NOT NULL,
100
+ "permissionId" INTEGER NOT NULL,
101
+
102
+ PRIMARY KEY ("groupId", "permissionId"),
103
+ CONSTRAINT "GroupPermission_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "Group" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
104
+ CONSTRAINT "GroupPermission_permissionId_fkey" FOREIGN KEY ("permissionId") REFERENCES "Permission" ("id") ON DELETE CASCADE ON UPDATE CASCADE
105
+ );
106
+
107
+ -- CreateIndex
108
+ CREATE UNIQUE INDEX "Server_name_key" ON "Server"("name");
109
+
110
+ -- CreateIndex
111
+ CREATE UNIQUE INDEX "Bot_username_key" ON "Bot"("username");
112
+
113
+ -- CreateIndex
114
+ CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
115
+
116
+ -- CreateIndex
117
+ CREATE UNIQUE INDEX "Command_botId_name_key" ON "Command"("botId", "name");
118
+
119
+ -- CreateIndex
120
+ CREATE UNIQUE INDEX "User_botId_username_key" ON "User"("botId", "username");
121
+
122
+ -- CreateIndex
123
+ CREATE UNIQUE INDEX "Group_botId_name_key" ON "Group"("botId", "name");
124
+
125
+ -- CreateIndex
126
+ CREATE UNIQUE INDEX "Permission_botId_name_key" ON "Permission"("botId", "name");
@@ -1,27 +1,27 @@
1
- -- AlterTable
2
- ALTER TABLE "Bot" ADD COLUMN "owners" TEXT DEFAULT '';
3
-
4
- -- RedefineTables
5
- PRAGMA defer_foreign_keys=ON;
6
- PRAGMA foreign_keys=OFF;
7
- CREATE TABLE "new_InstalledPlugin" (
8
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
9
- "botId" INTEGER NOT NULL,
10
- "name" TEXT NOT NULL,
11
- "version" TEXT NOT NULL,
12
- "description" TEXT,
13
- "sourceType" TEXT NOT NULL,
14
- "sourceUri" TEXT,
15
- "path" TEXT NOT NULL,
16
- "isEnabled" BOOLEAN NOT NULL DEFAULT true,
17
- "manifest" TEXT,
18
- "settings" TEXT DEFAULT '{}',
19
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
20
- CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
21
- );
22
- INSERT INTO "new_InstalledPlugin" ("botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version") SELECT "botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version" FROM "InstalledPlugin";
23
- DROP TABLE "InstalledPlugin";
24
- ALTER TABLE "new_InstalledPlugin" RENAME TO "InstalledPlugin";
25
- CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
26
- PRAGMA foreign_keys=ON;
27
- PRAGMA defer_foreign_keys=OFF;
1
+ -- AlterTable
2
+ ALTER TABLE "Bot" ADD COLUMN "owners" TEXT DEFAULT '';
3
+
4
+ -- RedefineTables
5
+ PRAGMA defer_foreign_keys=ON;
6
+ PRAGMA foreign_keys=OFF;
7
+ CREATE TABLE "new_InstalledPlugin" (
8
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
9
+ "botId" INTEGER NOT NULL,
10
+ "name" TEXT NOT NULL,
11
+ "version" TEXT NOT NULL,
12
+ "description" TEXT,
13
+ "sourceType" TEXT NOT NULL,
14
+ "sourceUri" TEXT,
15
+ "path" TEXT NOT NULL,
16
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
17
+ "manifest" TEXT,
18
+ "settings" TEXT DEFAULT '{}',
19
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
20
+ CONSTRAINT "InstalledPlugin_botId_fkey" FOREIGN KEY ("botId") REFERENCES "Bot" ("id") ON DELETE CASCADE ON UPDATE CASCADE
21
+ );
22
+ INSERT INTO "new_InstalledPlugin" ("botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version") SELECT "botId", "description", "id", "isEnabled", "manifest", "name", "path", "settings", "sourceType", "sourceUri", "version" FROM "InstalledPlugin";
23
+ DROP TABLE "InstalledPlugin";
24
+ ALTER TABLE "new_InstalledPlugin" RENAME TO "InstalledPlugin";
25
+ CREATE UNIQUE INDEX "InstalledPlugin_botId_name_key" ON "InstalledPlugin"("botId", "name");
26
+ PRAGMA foreign_keys=ON;
27
+ PRAGMA defer_foreign_keys=OFF;
@@ -1,13 +1,13 @@
1
- -- CreateTable
2
- CREATE TABLE "ScheduledTask" (
3
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
- "name" TEXT NOT NULL,
5
- "cronPattern" TEXT NOT NULL,
6
- "action" TEXT NOT NULL,
7
- "targetBotIds" TEXT NOT NULL,
8
- "payload" TEXT DEFAULT '{}',
9
- "isEnabled" BOOLEAN NOT NULL DEFAULT true,
10
- "lastRun" DATETIME,
11
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
- "updatedAt" DATETIME NOT NULL
13
- );
1
+ -- CreateTable
2
+ CREATE TABLE "ScheduledTask" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "name" TEXT NOT NULL,
5
+ "cronPattern" TEXT NOT NULL,
6
+ "action" TEXT NOT NULL,
7
+ "targetBotIds" TEXT NOT NULL,
8
+ "payload" TEXT DEFAULT '{}',
9
+ "isEnabled" BOOLEAN NOT NULL DEFAULT true,
10
+ "lastRun" DATETIME,
11
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+ "updatedAt" DATETIME NOT NULL
13
+ );
@@ -1,26 +1,26 @@
1
- -- CreateTable
2
- CREATE TABLE "PanelUser" (
3
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
- "uuid" TEXT NOT NULL,
5
- "username" TEXT NOT NULL,
6
- "passwordHash" TEXT NOT NULL,
7
- "roleId" INTEGER NOT NULL,
8
- "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
9
- CONSTRAINT "PanelUser_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "PanelRole" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
10
- );
11
-
12
- -- CreateTable
13
- CREATE TABLE "PanelRole" (
14
- "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
15
- "name" TEXT NOT NULL,
16
- "permissions" TEXT NOT NULL DEFAULT '[]'
17
- );
18
-
19
- -- CreateIndex
20
- CREATE UNIQUE INDEX "PanelUser_uuid_key" ON "PanelUser"("uuid");
21
-
22
- -- CreateIndex
23
- CREATE UNIQUE INDEX "PanelUser_username_key" ON "PanelUser"("username");
24
-
25
- -- CreateIndex
26
- CREATE UNIQUE INDEX "PanelRole_name_key" ON "PanelRole"("name");
1
+ -- CreateTable
2
+ CREATE TABLE "PanelUser" (
3
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
4
+ "uuid" TEXT NOT NULL,
5
+ "username" TEXT NOT NULL,
6
+ "passwordHash" TEXT NOT NULL,
7
+ "roleId" INTEGER NOT NULL,
8
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
9
+ CONSTRAINT "PanelUser_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "PanelRole" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
10
+ );
11
+
12
+ -- CreateTable
13
+ CREATE TABLE "PanelRole" (
14
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
15
+ "name" TEXT NOT NULL,
16
+ "permissions" TEXT NOT NULL DEFAULT '[]'
17
+ );
18
+
19
+ -- CreateIndex
20
+ CREATE UNIQUE INDEX "PanelUser_uuid_key" ON "PanelUser"("uuid");
21
+
22
+ -- CreateIndex
23
+ CREATE UNIQUE INDEX "PanelUser_username_key" ON "PanelUser"("username");
24
+
25
+ -- CreateIndex
26
+ CREATE UNIQUE INDEX "PanelRole_name_key" ON "PanelRole"("name");
@@ -1,3 +1,3 @@
1
- # Please do not edit this file manually
2
- # It should be added in your version-control system (i.e. Git)
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (i.e. Git)
3
3
  provider = "sqlite"
@@ -1,17 +1,14 @@
1
-
2
1
  const jwt = require('jsonwebtoken');
3
2
  const config = require('../../config');
4
3
 
5
4
  const JWT_SECRET = config.security.jwtSecret;
6
5
 
7
- /**
8
- * Middleware для проверки JWT-токена.
9
- * Извлекает токен из заголовка Authorization, проверяет его подлинность
10
- * и добавляет расшифрованные данные (payload) в req.user.
11
- */
6
+ const tokenCache = new Map();
7
+ const CACHE_TTL = 5 * 60 * 1000;
8
+
9
+
12
10
  function authenticate(req, res, next) {
13
11
  const authHeader = req.header('Authorization');
14
-
15
12
  if (!authHeader) {
16
13
  return res.status(401).json({ error: 'Нет токена, доступ запрещен' });
17
14
  }
@@ -23,28 +20,39 @@ function authenticate(req, res, next) {
23
20
 
24
21
  const token = tokenParts[1];
25
22
 
23
+ if (tokenCache.has(token)) {
24
+ const cached = tokenCache.get(token);
25
+ if (Date.now() < cached.expires) {
26
+ req.user = cached.payload;
27
+ return next();
28
+ } else {
29
+ tokenCache.delete(token);
30
+ }
31
+ }
32
+
26
33
  try {
27
- const decoded = jwt.verify(token, JWT_SECRET);
34
+ const decoded = jwt.verify(token, JWT_SECRET, { algorithms: ['HS256'] });
28
35
  req.user = decoded;
36
+
37
+ tokenCache.set(token, {
38
+ payload: decoded,
39
+ expires: Date.now() + CACHE_TTL
40
+ });
41
+
29
42
  next();
30
43
  } catch (err) {
31
44
  res.status(401).json({ error: 'Невалидный токен' });
32
45
  }
33
46
  }
34
47
 
35
- /**
36
- * Middleware-фабрика для проверки прав доступа.
37
- * @param {string} requiredPermission - Право, необходимое для доступа к роуту (например, 'bot:delete').
38
- * @returns {function} - Express middleware.
39
- */
48
+
40
49
  function authorize(requiredPermission) {
41
50
  return (req, res, next) => {
42
- if (!req.user || !req.user.permissions) {
43
- return res.status(403).json({ error: 'Ошибка прав доступа: пользователь не аутентифицирован.' });
51
+ if (!req.user || !Array.isArray(req.user.permissions)) {
52
+ return res.status(403).json({ error: 'Ошибка прав доступа: пользователь не аутентифицирован или формат прав некорректен.' });
44
53
  }
45
54
 
46
55
  const userPermissions = req.user.permissions;
47
-
48
56
  if (userPermissions.includes('*') || userPermissions.includes(requiredPermission)) {
49
57
  next();
50
58
  } else {
@@ -24,6 +24,26 @@ const WARNING_COOLDOWN = 10 * 1000;
24
24
  const STATS_SERVER_URL = 'http://185.65.200.184:3000';
25
25
  let instanceId = null;
26
26
  const DATA_DIR = path.join(os.homedir(), '.blockmine');
27
+ const INSTANCE_ID_PATH = path.join(DATA_DIR, '.instance_id');
28
+
29
+ function getInstanceId() {
30
+ if (instanceId) return instanceId;
31
+ try {
32
+ if (fs.existsSync(INSTANCE_ID_PATH)) {
33
+ instanceId = fs.readFileSync(INSTANCE_ID_PATH, 'utf-8');
34
+ } else {
35
+ instanceId = uuidv4();
36
+ if (!fs.existsSync(DATA_DIR)) {
37
+ fs.mkdirSync(DATA_DIR, { recursive: true });
38
+ }
39
+ fs.writeFileSync(INSTANCE_ID_PATH, instanceId, 'utf-8');
40
+ }
41
+ } catch (error) {
42
+ console.error('[Telemetry] Ошибка при загрузке/создании Instance ID:', error);
43
+ return null;
44
+ }
45
+ return instanceId;
46
+ }
27
47
 
28
48
 
29
49
  class BotManager {
@@ -33,6 +53,8 @@ class BotManager {
33
53
  this.resourceUsage = new Map();
34
54
  this.botConfigs = new Map();
35
55
 
56
+ getInstanceId();
57
+
36
58
  setInterval(() => this.updateAllResourceUsage(), 5000);
37
59
  if (config.telemetry?.enabled) {
38
60
  setInterval(() => this.sendHeartbeat(), 5 * 60 * 1000);
@@ -1,24 +1,30 @@
1
-
2
1
  const crypto = require('crypto');
3
2
  const config = require('../../config');
4
-
5
3
  const ALGORITHM = 'aes-256-gcm';
6
4
  const IV_LENGTH = 16;
7
- const AUTH_TAG_LENGTH = 16;
8
- const KEY = Buffer.from(config.security.encryptionKey, 'hex');
5
+
6
+
7
+ function getEncryptionKey() {
8
+ const key = config.security.encryptionKey;
9
+ if (!key || key.length !== 64) {
10
+ throw new Error('[Crypto] Ключ шифрования не настроен или имеет неверную длину в config.json');
11
+ }
12
+ return Buffer.from(key, 'hex');
13
+ }
14
+
9
15
 
10
16
  function encrypt(text) {
11
17
  if (!text) return null;
12
18
  try {
19
+ const key = getEncryptionKey();
13
20
  const iv = crypto.randomBytes(IV_LENGTH);
14
- const cipher = crypto.createCipheriv(ALGORITHM, KEY, iv);
21
+ const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
15
22
  const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);
16
23
  const authTag = cipher.getAuthTag();
17
24
 
18
25
  return `${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted.toString('hex')}`;
19
26
  } catch (error) {
20
- console.error('[Crypto] Ошибка шифрования:', error);
21
- return null;
27
+ throw new Error(`[Crypto] Ошибка шифрования: ${error.message}`);
22
28
  }
23
29
  }
24
30
 
@@ -27,22 +33,21 @@ function decrypt(hash) {
27
33
  try {
28
34
  const parts = hash.split(':');
29
35
  if (parts.length !== 3) {
30
- console.error('[Crypto] Неверный формат зашифрованных данных. Возвращаем как есть.');
31
- return hash;
36
+ return hash;
32
37
  }
33
38
 
39
+ const key = getEncryptionKey();
34
40
  const iv = Buffer.from(parts[0], 'hex');
35
41
  const authTag = Buffer.from(parts[1], 'hex');
36
42
  const encrypted = Buffer.from(parts[2], 'hex');
37
43
 
38
- const decipher = crypto.createDecipheriv(ALGORITHM, KEY, iv);
44
+ const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
39
45
  decipher.setAuthTag(authTag);
40
46
 
41
47
  const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
42
48
  return decrypted.toString('utf8');
43
49
  } catch (error) {
44
- console.error('[Crypto] Ошибка дешифрования. Возможно, ключ был изменен или данные повреждены.', error);
45
- return null;
50
+ throw new Error(`[Crypto] Ошибка дешифрования. Возможно, ключ был изменен или данные повреждены. ${error.message}`);
46
51
  }
47
52
  }
48
53
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blockmine",
3
- "version": "1.4.4",
3
+ "version": "1.4.6",
4
4
  "description": "Мощная панель управления ботами для Майнкрафта.",
5
5
  "author": "merka",
6
6
  "license": "MIT",