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 +1 -1
- package/backend/prisma/migrations/20250614085849_add_bot_note/migration.sql +126 -126
- package/backend/prisma/migrations/20250614153037_add_plugin_installed_date/migration.sql +27 -27
- package/backend/prisma/migrations/20250615232848_add_scheduled_tasks/migration.sql +13 -13
- package/backend/prisma/migrations/20250617133815_add_panel_users_and_roles/migration.sql +26 -26
- package/backend/prisma/migrations/migration_lock.toml +2 -2
- package/backend/src/api/middleware/auth.js +24 -16
- package/backend/src/core/BotManager.js +22 -0
- package/backend/src/core/utils/crypto.js +17 -12
- package/package.json +1 -1
package/backend/cli.js
CHANGED
|
@@ -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
|
-
*
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
8
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
45
|
-
return null;
|
|
50
|
+
throw new Error(`[Crypto] Ошибка дешифрования. Возможно, ключ был изменен или данные повреждены. ${error.message}`);
|
|
46
51
|
}
|
|
47
52
|
}
|
|
48
53
|
|