discos 1.1.6 → 2.0.1

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.
Files changed (108) hide show
  1. package/.github/PRIVACY_POLICY.md +3 -1
  2. package/.github/TERMS_OF_SERVICE.md +1 -0
  3. package/README.md +2 -2
  4. package/dist/common.d.ts +57 -36
  5. package/dist/common.d.ts.map +1 -1
  6. package/dist/common.js +88 -39
  7. package/dist/common.js.map +1 -1
  8. package/dist/{config.d.ts → config/config.d.ts} +2 -1
  9. package/dist/config/config.d.ts.map +1 -0
  10. package/dist/{config.js → config/config.js} +1 -0
  11. package/dist/config/config.js.map +1 -0
  12. package/dist/config/validateDb.d.ts +3 -0
  13. package/dist/config/validateDb.d.ts.map +1 -0
  14. package/dist/{tools → config}/validateDb.js +16 -15
  15. package/dist/config/validateDb.js.map +1 -0
  16. package/dist/config/validateDotenv.d.ts +2 -0
  17. package/dist/config/validateDotenv.d.ts.map +1 -0
  18. package/dist/{tools → config}/validateDotenv.js +30 -20
  19. package/dist/config/validateDotenv.js.map +1 -0
  20. package/dist/{tools → exec}/backend.d.ts +4 -3
  21. package/dist/exec/backend.d.ts.map +1 -0
  22. package/dist/exec/backend.js +131 -0
  23. package/dist/exec/backend.js.map +1 -0
  24. package/dist/exec/terminal-manager.d.ts +9 -0
  25. package/dist/exec/terminal-manager.d.ts.map +1 -0
  26. package/dist/exec/terminal-manager.js +112 -0
  27. package/dist/exec/terminal-manager.js.map +1 -0
  28. package/dist/exec/username.d.ts +5 -0
  29. package/dist/exec/username.d.ts.map +1 -0
  30. package/dist/exec/username.js +31 -0
  31. package/dist/exec/username.js.map +1 -0
  32. package/dist/interfaces/queues.d.ts.map +1 -0
  33. package/dist/{types → interfaces}/queues.js.map +1 -1
  34. package/dist/logging/logger.d.ts +4 -0
  35. package/dist/logging/logger.d.ts.map +1 -0
  36. package/dist/logging/logger.js +22 -0
  37. package/dist/logging/logger.js.map +1 -0
  38. package/dist/models/user.d.ts +14 -0
  39. package/dist/models/user.d.ts.map +1 -0
  40. package/dist/models/user.js +61 -0
  41. package/dist/models/user.js.map +1 -0
  42. package/dist/modules/admin.d.ts +1 -1
  43. package/dist/modules/admin.d.ts.map +1 -1
  44. package/dist/modules/admin.js +56 -31
  45. package/dist/modules/admin.js.map +1 -1
  46. package/dist/modules/clear.d.ts.map +1 -1
  47. package/dist/modules/clear.js +7 -8
  48. package/dist/modules/clear.js.map +1 -1
  49. package/dist/modules/command.d.ts +1 -1
  50. package/dist/modules/command.d.ts.map +1 -1
  51. package/dist/modules/command.js +5 -5
  52. package/dist/modules/command.js.map +1 -1
  53. package/dist/modules/debug.d.ts +1 -1
  54. package/dist/modules/debug.d.ts.map +1 -1
  55. package/dist/modules/debug.js +3 -2
  56. package/dist/modules/debug.js.map +1 -1
  57. package/dist/modules/file.d.ts +3 -2
  58. package/dist/modules/file.d.ts.map +1 -1
  59. package/dist/modules/file.js +36 -13
  60. package/dist/modules/file.js.map +1 -1
  61. package/dist/modules/watch.d.ts +1 -1
  62. package/dist/modules/watch.d.ts.map +1 -1
  63. package/dist/modules/watch.js +4 -3
  64. package/dist/modules/watch.js.map +1 -1
  65. package/dist/security/ipcServer.d.ts +4 -0
  66. package/dist/security/ipcServer.d.ts.map +1 -0
  67. package/dist/{tools → security}/ipcServer.js +6 -5
  68. package/dist/security/ipcServer.js.map +1 -0
  69. package/dist/{tools → security}/queue-utils.d.ts +2 -1
  70. package/dist/security/queue-utils.d.ts.map +1 -0
  71. package/dist/{tools → security}/queue-utils.js +4 -1
  72. package/dist/security/queue-utils.js.map +1 -0
  73. package/dist/shared/consts.d.ts +6 -0
  74. package/dist/shared/consts.d.ts.map +1 -1
  75. package/dist/shared/consts.js +7 -1
  76. package/dist/shared/consts.js.map +1 -1
  77. package/dist/shared/interfaces.d.ts +1 -0
  78. package/dist/shared/interfaces.d.ts.map +1 -1
  79. package/dist/shared/types.d.ts.map +1 -1
  80. package/dist/slash-commands.d.ts +1 -1
  81. package/dist/slash-commands.d.ts.map +1 -1
  82. package/dist/slash-commands.js +17 -10
  83. package/dist/slash-commands.js.map +1 -1
  84. package/dist/startup.d.ts +1 -1
  85. package/dist/startup.d.ts.map +1 -1
  86. package/dist/startup.js +57 -37
  87. package/dist/startup.js.map +1 -1
  88. package/package.json +19 -16
  89. package/setup/install.sh +45 -132
  90. package/dist/config.d.ts.map +0 -1
  91. package/dist/config.js.map +0 -1
  92. package/dist/tools/backend.d.ts.map +0 -1
  93. package/dist/tools/backend.js +0 -166
  94. package/dist/tools/backend.js.map +0 -1
  95. package/dist/tools/ipcServer.d.ts +0 -4
  96. package/dist/tools/ipcServer.d.ts.map +0 -1
  97. package/dist/tools/ipcServer.js.map +0 -1
  98. package/dist/tools/queue-utils.d.ts.map +0 -1
  99. package/dist/tools/queue-utils.js.map +0 -1
  100. package/dist/tools/validateDb.d.ts +0 -3
  101. package/dist/tools/validateDb.d.ts.map +0 -1
  102. package/dist/tools/validateDb.js.map +0 -1
  103. package/dist/tools/validateDotenv.d.ts +0 -2
  104. package/dist/tools/validateDotenv.d.ts.map +0 -1
  105. package/dist/tools/validateDotenv.js.map +0 -1
  106. package/dist/types/queues.d.ts.map +0 -1
  107. /package/dist/{types → interfaces}/queues.d.ts +0 -0
  108. /package/dist/{types → interfaces}/queues.js +0 -0
@@ -0,0 +1,3 @@
1
+ import type { CommandQueues } from '../interfaces/queues.js';
2
+ export declare function validateDb(queues: CommandQueues): boolean;
3
+ //# sourceMappingURL=validateDb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateDb.d.ts","sourceRoot":"","sources":["../../src/config/validateDb.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAO7D,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAsFzD"}
@@ -1,7 +1,8 @@
1
- import fs from 'fs';
1
+ import fs from 'node:fs';
2
2
  import * as COMMON from '../common.js';
3
- import { Config } from '../config.js';
4
- import { updateExternalBackendDatabase } from './backend.js';
3
+ import { Config } from './config.js';
4
+ import logger from '../logging/logger.js';
5
+ import { updateExternalBackendDatabase } from '../exec/backend.js';
5
6
  const isValidId = (id) => /^\d{17,}$/.test(id);
6
7
  export function validateDb(queues) {
7
8
  let db;
@@ -10,55 +11,55 @@ export function validateDb(queues) {
10
11
  db = JSON.parse(rawData);
11
12
  }
12
13
  catch {
13
- console.error(COMMON.DB_ERR);
14
+ logger.error(COMMON.DB_ERR);
14
15
  return false;
15
16
  }
16
17
  if (typeof db !== 'object' || db === null) {
17
- console.error(COMMON.DB_ERR);
18
+ logger.error(COMMON.DB_ERR);
18
19
  return false;
19
20
  }
20
21
  const { users, adminUsers, allowedChannels } = db;
21
22
  if (typeof users !== 'object' || users === null) {
22
- console.error(COMMON.DB_USER_ERR);
23
+ logger.error(COMMON.DB_USER_ERR);
23
24
  return false;
24
25
  }
25
26
  const userIds = Object.keys(users);
26
27
  if (userIds.length === 0) {
27
- console.warn(COMMON.DB_USERS_EMPTY);
28
+ logger.warn(COMMON.DB_USERS_EMPTY);
28
29
  }
29
30
  if (userIds.some((id) => !isValidId(id))) {
30
- console.error(COMMON.DB_USERS_INVALID);
31
+ logger.error(COMMON.DB_USERS_INVALID);
31
32
  return false;
32
33
  }
33
34
  if (!Array.isArray(adminUsers)) {
34
- console.error(COMMON.DB_ADMIN_ERR);
35
+ logger.error(COMMON.DB_ADMIN_ERR);
35
36
  return false;
36
37
  }
37
38
  if (adminUsers.length === 0) {
38
- console.error(COMMON.DB_NO_ADMIN);
39
+ logger.error(COMMON.DB_NO_ADMIN);
39
40
  return false;
40
41
  }
41
42
  if (adminUsers.some((id) => !isValidId(id))) {
42
- console.error(COMMON.DB_ADMIN_INVALID);
43
+ logger.error(COMMON.DB_ADMIN_INVALID);
43
44
  return false;
44
45
  }
45
46
  if (allowedChannels !== undefined) {
46
47
  if (!Array.isArray(allowedChannels)) {
47
- console.error(COMMON.DB_ALLOWED_CHANNELS_ARRAY);
48
+ logger.error(COMMON.DB_ALLOWED_CHANNELS_ARRAY);
48
49
  return false;
49
50
  }
50
51
  if (allowedChannels.length === 0) {
51
- console.warn(COMMON.DB_ALLOWED_CH_EMPTY);
52
+ logger.warn(COMMON.DB_ALLOWED_CH_EMPTY);
52
53
  }
53
54
  if (allowedChannels.some((id) => !isValidId(id))) {
54
- console.error(COMMON.DB_ALLOWED_CH_INVALID);
55
+ logger.error(COMMON.DB_ALLOWED_CH_INVALID);
55
56
  return false;
56
57
  }
57
58
  }
58
59
  const booleanFields = ['standalone', 'safemode', 'lockdown'];
59
60
  for (const key of booleanFields) {
60
61
  if (typeof db[key] !== 'boolean') {
61
- console.error(`${COMMON.DB_BOOLEAN_ERR} (${key})`);
62
+ logger.error(`${COMMON.DB_BOOLEAN_ERR} (${key})`);
62
63
  return false;
63
64
  }
64
65
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateDb.js","sourceRoot":"","sources":["../../src/config/validateDb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function validateDotenv(): Promise<boolean>;
2
+ //# sourceMappingURL=validateDotenv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateDotenv.d.ts","sourceRoot":"","sources":["../../src/config/validateDotenv.ts"],"names":[],"mappings":"AAQA,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAyGvD"}
@@ -1,8 +1,10 @@
1
1
  import * as COMMON from '../common.js';
2
2
  import dotenv from 'dotenv';
3
- import { Config } from '../config.js';
3
+ import { Config } from './config.js';
4
+ import logger from '../logging/logger.js';
5
+ import { refreshDbCache } from '../exec/username.js';
4
6
  dotenv.config({ quiet: true });
5
- export function validateDotenv() {
7
+ export async function validateDotenv() {
6
8
  const requiredEnvVars = [
7
9
  'BOT_TOKEN',
8
10
  'APP_ID',
@@ -14,65 +16,73 @@ export function validateDotenv() {
14
16
  'READ_BIN_OVERRIDE',
15
17
  'QUICK_VIEW',
16
18
  'QUICK_VIEW_MAX_LENGTH',
19
+ 'USER_RATE_LIMIT',
17
20
  ];
18
21
  const missingVars = requiredEnvVars.filter((envVar) => !process.env[envVar]);
19
22
  if (missingVars.length > 0) {
20
- console.error(COMMON.ENV_MISSING_VAR(missingVars));
23
+ logger.error(COMMON.ENV_MISSING_VAR(missingVars));
21
24
  return false;
22
25
  }
23
26
  if (process.env.BOT_TOKEN.length < 59) {
24
- console.error(COMMON.ENV_TOKEN);
27
+ logger.error(COMMON.ENV_TOKEN);
25
28
  return false;
26
29
  }
27
30
  if (!/^\d{17,}$/.test(process.env.APP_ID)) {
28
- console.error(COMMON.ENV_APPID);
31
+ logger.error(COMMON.ENV_APPID);
29
32
  return false;
30
33
  }
31
34
  const guildIds = process.env.GUILD_IDS.split(',').map((id) => id.trim());
32
35
  if (guildIds.some((id) => !/^\d{17,}$/.test(id))) {
33
- console.error(COMMON.ENV_GUILDS);
36
+ logger.error(COMMON.ENV_GUILDS);
34
37
  return false;
35
38
  }
36
- const cmdQueueMaxSize = parseInt(process.env.CMD_QUEUE_MAX_SIZE, 10);
37
- if (isNaN(cmdQueueMaxSize) || cmdQueueMaxSize <= 0) {
38
- console.error(COMMON.ENV_QUEUE_MAX);
39
+ const cmdQueueMaxSize = Number.parseInt(process.env.CMD_QUEUE_MAX_SIZE, 10);
40
+ if (Number.isNaN(cmdQueueMaxSize) || cmdQueueMaxSize <= 0) {
41
+ logger.error(COMMON.ENV_QUEUE_MAX);
39
42
  return false;
40
43
  }
41
44
  Config.cmdQueueMaxSize = cmdQueueMaxSize;
42
45
  if (!process.env.BACKEND || process.env.BACKEND.trim() === '') {
43
- console.error(COMMON.ENV_BACKEND);
46
+ logger.error(COMMON.ENV_BACKEND);
44
47
  return false;
45
48
  }
46
49
  Config.backend = process.env.BACKEND;
47
50
  if (!process.env.DATABASE_PATH || process.env.DATABASE_PATH.trim() === '') {
48
- console.error('DiscOS ERROR: DATABASE_PATH must be a non-empty string.');
51
+ logger.error('DiscOS ERROR: DATABASE_PATH must be a non-empty string.');
49
52
  return false;
50
53
  }
51
54
  Config.databasePath = process.env.DATABASE_PATH;
52
- const fileMaxSize = parseInt(process.env.FILE_MAX_SIZE, 10);
53
- if (isNaN(fileMaxSize) || fileMaxSize <= 0 || fileMaxSize > 1000) {
54
- console.error(COMMON.ENV_FILE_MAX);
55
+ await refreshDbCache();
56
+ const fileMaxSize = Number.parseInt(process.env.FILE_MAX_SIZE, 10);
57
+ if (Number.isNaN(fileMaxSize) || fileMaxSize <= 0 || fileMaxSize > 1000) {
58
+ logger.error(COMMON.ENV_FILE_MAX);
55
59
  return false;
56
60
  }
57
61
  Config.fileMaxSize = fileMaxSize;
58
62
  const readBinOverride = process.env.READ_BIN_OVERRIDE.split(',').map((bin) => bin.trim());
59
- if (readBinOverride.length === 0 || readBinOverride.some((bin) => bin === '')) {
60
- console.error(COMMON.ENV_BIN_OVERRIDE);
63
+ if (readBinOverride.length === 0 || readBinOverride.includes('')) {
64
+ logger.error(COMMON.ENV_BIN_OVERRIDE);
61
65
  return false;
62
66
  }
63
67
  Config.readBinOverride = readBinOverride;
64
68
  const quickView = process.env.QUICK_VIEW.split(',').map((ext) => ext.trim());
65
69
  if (quickView.length === 0 || quickView.some((ext) => ext === '' || ext === '?')) {
66
- console.error(COMMON.ENV_QUICK_VIEW);
70
+ logger.error(COMMON.ENV_QUICK_VIEW);
67
71
  return false;
68
72
  }
69
73
  Config.quickView = quickView;
70
- const quickViewMaxLength = parseInt(process.env.QUICK_VIEW_MAX_LENGTH, 10);
71
- if (isNaN(quickViewMaxLength) || quickViewMaxLength <= 0 || quickViewMaxLength > 2000) {
72
- console.error(COMMON.ENV_QUICK_VIEW_MAX_LENGTH);
74
+ const quickViewMaxLength = Number.parseInt(process.env.QUICK_VIEW_MAX_LENGTH, 10);
75
+ if (Number.isNaN(quickViewMaxLength) || quickViewMaxLength <= 0 || quickViewMaxLength > 2000) {
76
+ logger.error(COMMON.ENV_QUICK_VIEW_MAX_LENGTH);
73
77
  return false;
74
78
  }
75
79
  Config.quickViewMaxLength = quickViewMaxLength;
80
+ const userRateLimit = Number.parseInt(process.env.USER_RATE_LIMIT, 10);
81
+ if (Number.isNaN(userRateLimit) || userRateLimit < 2 || userRateLimit > 30) {
82
+ logger.error(COMMON.ENV_USER_RATE_LIMIT);
83
+ return false;
84
+ }
85
+ Config.userRateLimit = userRateLimit;
76
86
  return true;
77
87
  }
78
88
  //# sourceMappingURL=validateDotenv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateDotenv.js","sourceRoot":"","sources":["../../src/config/validateDotenv.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import type { AxiosResponse } from 'axios';
1
+ import { type AxiosResponse } from 'axios';
2
2
  import type { ICommandQueueItem, IFileWritePayload } from '../shared/interfaces.js';
3
3
  import type { DB } from '../shared/types.js';
4
- import type { CommandQueues } from 'src/types/queues.js';
5
- export declare function post(payload: ICommandQueueItem, b64decode: boolean): Promise<AxiosResponse<any, any>>;
4
+ import type { CommandQueues } from '../interfaces/queues.js';
5
+ export declare function axiosError(): void;
6
+ export declare function post(payload: ICommandQueueItem, b64decode: boolean, silent: boolean): Promise<AxiosResponse<any, any>>;
6
7
  export declare function put(req: IFileWritePayload): Promise<AxiosResponse<any, any>>;
7
8
  export declare function ping(): Promise<string>;
8
9
  export declare function updateExternalBackendDatabase(database: DB, queues: CommandQueues): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/exec/backend.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAmC,MAAM,OAAO,CAAC;AAMnF,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGpF,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAQ7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAc7D,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAmDD,wBAAsB,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAmB5H;AAGD,wBAAsB,GAAG,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAoBlF;AAGD,wBAAsB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CA0B5C;AAGD,wBAAsB,6BAA6B,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtG"}
@@ -0,0 +1,131 @@
1
+ import axios from 'axios';
2
+ import { Config } from '../config/config.js';
3
+ import * as COMMON from '../common.js';
4
+ import { PING_RESPONSE, DB_UPDATE, INTERNAL_UID, INTERNAL_UNAME } from '../shared/consts.js';
5
+ const WRITE_OP_SUCCESS = '';
6
+ import * as queueUtils from '../security/queue-utils.js';
7
+ import { execCommand } from './terminal-manager.js';
8
+ import { localUser } from './username.js';
9
+ import logger from '../logging/logger.js';
10
+ import shellEscape from 'shell-escape';
11
+ import path from 'node:path';
12
+ import fs from 'node:fs';
13
+ export function axiosError() {
14
+ logger.error(COMMON.NETWORK_ERR);
15
+ process.exit(1);
16
+ }
17
+ function internalAxiosResponse(data, status) {
18
+ return {
19
+ data: data,
20
+ status: status,
21
+ statusText: '',
22
+ headers: {},
23
+ config: {
24
+ headers: {},
25
+ },
26
+ };
27
+ }
28
+ async function fileWrite(url, _path, payload) {
29
+ const escapedPath = shellEscape([_path]);
30
+ const serverUser = localUser(payload.user);
31
+ let stdout;
32
+ const dirName = path.dirname(_path);
33
+ if (!fs.existsSync(dirName) || !fs.lstatSync(dirName).isDirectory())
34
+ return COMMON.EB_DIR_ERR;
35
+ const testPermissionCmd = `mkdir -p ${dirName} ` + `&& > ${escapedPath}`;
36
+ stdout = await execCommand(payload.user, payload.username, serverUser, testPermissionCmd, true);
37
+ if (stdout.trim() !== '')
38
+ return COMMON.EB_PERM_ERR;
39
+ const curlCmd = `curl -fsSL ${shellEscape([url])} -o ${escapedPath}`;
40
+ stdout = await execCommand(payload.user, payload.username, serverUser, curlCmd, true);
41
+ if (stdout.trim() !== '')
42
+ return COMMON.EB_DOWNLOAD_ERR;
43
+ fs.chmodSync(_path, 0o660);
44
+ return WRITE_OP_SUCCESS;
45
+ }
46
+ export async function post(payload, b64decode, silent) {
47
+ let res = internalAxiosResponse('', 500);
48
+ if (Config.standalone) {
49
+ const output = await execCommand(payload.user, payload.username, localUser(payload.user), payload.cmd, silent);
50
+ res = internalAxiosResponse(b64decode ? Buffer.from(output.toString(), 'base64') : output, 200);
51
+ }
52
+ else {
53
+ try {
54
+ res = await axios.post(Config.backend, payload, {
55
+ responseType: 'text',
56
+ validateStatus: (status) => status < 400,
57
+ });
58
+ }
59
+ catch {
60
+ axiosError();
61
+ }
62
+ if (b64decode)
63
+ res.data = Buffer.from(res.data, 'base64');
64
+ }
65
+ return res;
66
+ }
67
+ export async function put(req) {
68
+ let res = internalAxiosResponse('', 500);
69
+ if (Config.standalone) {
70
+ const internalResponse = await fileWrite(req.url, req.path, req.payload);
71
+ return internalAxiosResponse(internalResponse, internalResponse === WRITE_OP_SUCCESS ? 200 : 500);
72
+ }
73
+ else {
74
+ try {
75
+ res = await axios.put(Config.backend, req, {
76
+ headers: {
77
+ 'Content-Type': 'application/json',
78
+ },
79
+ validateStatus: (status) => status < 400,
80
+ });
81
+ }
82
+ catch {
83
+ axiosError();
84
+ }
85
+ }
86
+ return res;
87
+ }
88
+ export async function ping() {
89
+ const controller = new AbortController();
90
+ const timeout = setTimeout(() => controller.abort(), 5000);
91
+ try {
92
+ const res = await axios.get(Config.backend, {
93
+ responseType: 'text',
94
+ validateStatus: (status) => status >= 200 && status < 300,
95
+ signal: controller.signal,
96
+ });
97
+ if (res.data.trim() !== PING_RESPONSE) {
98
+ throw new Error(COMMON.EXTERNAL_NORESPONSE);
99
+ }
100
+ logger.info(COMMON.EXTERNAL_OK);
101
+ return COMMON.EXTERNAL_OK;
102
+ }
103
+ catch (err) {
104
+ if (err instanceof Error)
105
+ logger.error(err.message);
106
+ else
107
+ logger.error(String(err));
108
+ axiosError();
109
+ return COMMON.EXTERNAL_NORESPONSE;
110
+ }
111
+ finally {
112
+ clearTimeout(timeout);
113
+ }
114
+ }
115
+ export async function updateExternalBackendDatabase(database, queues) {
116
+ const validationPayload = { user: INTERNAL_UID, username: INTERNAL_UNAME, cmd: DB_UPDATE };
117
+ queueUtils.addToAll(queues, validationPayload);
118
+ try {
119
+ await axios.put(Config.backend + '/' + DB_UPDATE, database, {
120
+ headers: {
121
+ 'Content-Type': 'application/json',
122
+ },
123
+ validateStatus: (status) => status <= 500,
124
+ });
125
+ }
126
+ catch {
127
+ logger.error(COMMON.NETWORK_ERR);
128
+ }
129
+ queueUtils.tryRemoveInQueue(queues.validationQueue, validationPayload);
130
+ }
131
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../src/exec/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CommandQueues } from '../interfaces/queues.js';
2
+ export declare const IS_TEST_MODE: boolean;
3
+ export declare function execCommand(dcUid: string, discosUser: string, localUser: string, command: string, silent: boolean): Promise<string>;
4
+ export declare function initTerminalsFromConfig(queues: CommandQueues): Promise<void>;
5
+ export declare function axiosHelper(queues: CommandQueues, user: string, username: string, cmd: string): Promise<void>;
6
+ export declare function syncTerminalsWithConfig(switchHappened: boolean, queues: CommandQueues): Promise<void>;
7
+ export declare function destroyTerminalForUser(dcUid: string, respawn?: boolean): void;
8
+ export declare function destroyAllTerminals(): void;
9
+ //# sourceMappingURL=terminal-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-manager.d.ts","sourceRoot":"","sources":["../../src/exec/terminal-manager.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAc7D,eAAO,MAAM,YAAY,SAAqC,CAAC;AAc/D,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCzI;AAGD,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlF;AAGD,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnH;AAID,wBAAsB,uBAAuB,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB3G;AAGD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,GAAG,IAAI,CASnF;AAGD,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}
@@ -0,0 +1,112 @@
1
+ import * as COMMON from '../common.js';
2
+ import { User } from '../models/user.js';
3
+ import { Config } from '../config/config.js';
4
+ import { localUser } from './username.js';
5
+ import * as queueUtils from '../security/queue-utils.js';
6
+ import { axiosError } from './backend.js';
7
+ import logger from '../logging/logger.js';
8
+ import { ROOT_UID, ROOT_UNAME, INTERNAL_UID, INTERNAL_UNAME, CLEAR_TERMINALS, INIT_TERMINALS } from '../shared/consts.js';
9
+ import stripAnsi from 'strip-ansi';
10
+ import axios from 'axios';
11
+ import os from 'node:os';
12
+ export const IS_TEST_MODE = Boolean(process.env.PTY_TEST_MODE);
13
+ const hostname = os.hostname();
14
+ const users = new Map();
15
+ async function getUserPwd(dcUid) {
16
+ const user = users.get(dcUid);
17
+ const pwd = await execCommand(dcUid, user.dcUname, user.localUser, 'pwd', true);
18
+ return pwd.trim();
19
+ }
20
+ export async function execCommand(dcUid, discosUser, localUser, command, silent) {
21
+ const user = users.get(dcUid);
22
+ if (!command || command.trim() === '')
23
+ command = 'pwd';
24
+ user.write(command);
25
+ return new Promise((resolve) => {
26
+ const firstLine = IS_TEST_MODE ? `${ROOT_UNAME}@${hostname}` : `${localUser}@${hostname}`;
27
+ const interval = setInterval(async () => {
28
+ const clean = stripAnsi(user.buffer);
29
+ const lines = clean.split('\n').map((l) => l.replaceAll('\r', '').trim());
30
+ if (lines.length < 2)
31
+ return;
32
+ const lastLine = lines.at(-1);
33
+ if (lastLine?.startsWith(firstLine)) {
34
+ clearInterval(interval);
35
+ const output = lines.slice(1, -1).join('\n');
36
+ user.buffer = '';
37
+ if (silent)
38
+ resolve(output);
39
+ else
40
+ resolve(COMMON.TERMINAL_OUTPUT(discosUser, localUser, hostname, await getUserPwd(dcUid), command, output));
41
+ }
42
+ }, 100);
43
+ });
44
+ }
45
+ export async function initTerminalsFromConfig(queues) {
46
+ if (Config.standalone) {
47
+ if (!users.has(INTERNAL_UID))
48
+ users.set(INTERNAL_UID, new User(INTERNAL_UID, INTERNAL_UNAME, ROOT_UNAME));
49
+ if (!users.has(ROOT_UID))
50
+ users.set(ROOT_UID, new User(ROOT_UID, ROOT_UNAME, ROOT_UNAME));
51
+ for (const dcUid of Config.allowedUsers) {
52
+ try {
53
+ if (!users.has(dcUid)) {
54
+ users.set(dcUid, new User(dcUid, '', localUser(dcUid)));
55
+ logger.info(COMMON.terminalSpawnedMessage(dcUid, localUser(dcUid)));
56
+ }
57
+ }
58
+ catch (err) {
59
+ logger.error(COMMON.terminalSpawnFailedMessage(dcUid), err);
60
+ process.exit(1);
61
+ }
62
+ }
63
+ }
64
+ else
65
+ await axiosHelper(queues, INTERNAL_UID, INTERNAL_UNAME, INIT_TERMINALS);
66
+ }
67
+ export async function axiosHelper(queues, user, username, cmd) {
68
+ const validationPayload = { user: user, username: username, cmd: cmd };
69
+ queueUtils.addToAll(queues, validationPayload);
70
+ try {
71
+ await axios.put(Config.backend + '/' + validationPayload.cmd, null, {
72
+ headers: {
73
+ 'Content-Type': 'application/json',
74
+ },
75
+ validateStatus: (status) => status < 400,
76
+ });
77
+ }
78
+ catch {
79
+ axiosError();
80
+ }
81
+ queueUtils.tryRemoveInQueue(queues.validationQueue, validationPayload);
82
+ }
83
+ export async function syncTerminalsWithConfig(switchHappened, queues) {
84
+ const allowed = new Set(Config.allowedUsers);
85
+ allowed.add(INTERNAL_UID);
86
+ allowed.add(ROOT_UID);
87
+ if (switchHappened && !Config.standalone)
88
+ destroyAllTerminals();
89
+ if (!switchHappened && Config.standalone)
90
+ for (const dcUid of users.keys())
91
+ if (!allowed.has(dcUid))
92
+ destroyTerminalForUser(dcUid, false);
93
+ if (!switchHappened && !Config.standalone)
94
+ await axiosHelper(queues, INTERNAL_UID, INTERNAL_UNAME, CLEAR_TERMINALS);
95
+ await initTerminalsFromConfig(queues);
96
+ logger.info(COMMON.terminalSyncCompleteMessage());
97
+ }
98
+ export function destroyTerminalForUser(dcUid, respawn = true) {
99
+ const user = users.get(dcUid);
100
+ user.destroy();
101
+ users.delete(dcUid);
102
+ if (respawn && Config.allowedUsers.includes(dcUid))
103
+ users.set(dcUid, new User(dcUid, user.dcUname, user.localUser));
104
+ logger.info(COMMON.terminalDestroyedMessage(dcUid, respawn));
105
+ }
106
+ export function destroyAllTerminals() {
107
+ for (const dcUid of users.keys()) {
108
+ destroyTerminalForUser(dcUid, false);
109
+ }
110
+ users.clear();
111
+ }
112
+ //# sourceMappingURL=terminal-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-manager.js","sourceRoot":"","sources":["../../src/exec/terminal-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ChatInputCommandInteraction, CacheType } from 'discord.js';
2
+ export declare function discordUsername(interaction: ChatInputCommandInteraction<CacheType>): string;
3
+ export declare function refreshDbCache(): Promise<void>;
4
+ export declare function localUser(user: string): string;
5
+ //# sourceMappingURL=username.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"username.d.ts","sourceRoot":"","sources":["../../src/exec/username.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAczE,wBAAgB,eAAe,CAAC,WAAW,EAAE,2BAA2B,CAAC,SAAS,CAAC,GAAG,MAAM,CAO3F;AAGD,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAYpD;AAGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI9C"}
@@ -0,0 +1,31 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { Config } from '../config/config.js';
3
+ import { ROOT_UID, ROOT_UNAME } from '../shared/consts.js';
4
+ import { DB_ERR } from '../common.js';
5
+ import logger from '../logging/logger.js';
6
+ import shellEscape from 'shell-escape';
7
+ let dbUserCache = {};
8
+ export function discordUsername(interaction) {
9
+ const username = interaction.member && 'nickname' in interaction.member
10
+ ? (interaction.member.nickname ?? interaction.user.username)
11
+ : (interaction.user.displayName ?? interaction.user.username);
12
+ return username;
13
+ }
14
+ export async function refreshDbCache() {
15
+ try {
16
+ const dbContent = await readFile(Config.databasePath, 'utf-8');
17
+ const dbParsed = JSON.parse(dbContent);
18
+ dbUserCache = dbParsed.users;
19
+ }
20
+ catch {
21
+ dbUserCache = {};
22
+ logger.error(DB_ERR);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ export function localUser(user) {
27
+ if (user === ROOT_UID)
28
+ return ROOT_UNAME;
29
+ return shellEscape([dbUserCache[user]]);
30
+ }
31
+ //# sourceMappingURL=username.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"username.js","sourceRoot":"","sources":["../../src/exec/username.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAE1C,OAAO,WAAW,MAAM,cAAc,CAAC;AAGvC,IAAI,WAAW,GAA2B,EAAE,CAAC;AAG7C,MAAM,UAAU,eAAe,CAAC,WAAmD;IACjF,MAAM,QAAQ,GACZ,WAAW,CAAC,MAAM,IAAI,UAAU,IAAI,WAAW,CAAC,MAAM;QACpD,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC5D,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,SAAS,GAAW,MAAM,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAEpC,CAAC;QACF,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,GAAG,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAGD,MAAM,UAAU,SAAS,CAAC,IAAY;IAEpC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC;IACzC,OAAO,WAAW,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queues.d.ts","sourceRoot":"","sources":["../../src/interfaces/queues.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,eAAe,EAAE,iBAAiB,EAAE,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,iBAAiB,EAAE,CAAC;CAC9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"queues.js","sourceRoot":"","sources":["../../src/types/queues.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"queues.js","sourceRoot":"","sources":["../../src/interfaces/queues.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import winston from 'winston';
2
+ declare const logger: winston.Logger;
3
+ export default logger;
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAU9B,QAAA,MAAM,MAAM,gBAmBV,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,22 @@
1
+ import winston from 'winston';
2
+ const { combine, timestamp, printf, colorize } = winston.format;
3
+ const logFormat = printf(({ level, message, timestamp }) => {
4
+ return `${timestamp} [${level.toUpperCase()}]: ${message}`;
5
+ });
6
+ const logger = winston.createLogger({
7
+ level: 'info',
8
+ format: combine(timestamp({ format: 'YYYY-MM-DD HH:mm:ss' })),
9
+ transports: [
10
+ new winston.transports.File({
11
+ filename: 'discos-error.log',
12
+ level: 'error',
13
+ format: combine(timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), logFormat),
14
+ }),
15
+ new winston.transports.File({ filename: 'discos.log', format: combine(timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), logFormat) }),
16
+ new winston.transports.Console({
17
+ format: combine(colorize(), timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), logFormat),
18
+ }),
19
+ ],
20
+ });
21
+ export default logger;
22
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;AAGhE,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;IAEzD,OAAO,GAAG,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAClC,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC7D,UAAU,EAAE;QAEV,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1B,QAAQ,EAAE,kBAAkB;YAC5B,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,SAAS,CAAC;SACzE,CAAC;QAGF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;QAGjI,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,SAAS,CAAC;SACrF,CAAC;KACH;CACF,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type IPty } from 'node-pty';
2
+ export declare class User {
3
+ dcUid: string;
4
+ dcUname: string;
5
+ localUser: string;
6
+ ptyProcess: IPty;
7
+ buffer: string;
8
+ respawn: boolean;
9
+ constructor(dcUid: string, dcUname: string, localUser: string);
10
+ spawnPty(): IPty;
11
+ write(cmd: string): void;
12
+ destroy(): void;
13
+ }
14
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/models/user.ts"],"names":[],"mappings":"AAIA,OAAY,EAAE,KAAK,IAAI,EAAE,MAAM,UAAU,CAAC;AAG1C,qBAAa,IAAI;IAEf,KAAK,EAAE,MAAM,CAAC;IAGd,OAAO,EAAE,MAAM,CAAC;IAGhB,SAAS,EAAE,MAAM,CAAC;IAGlB,UAAU,EAAE,IAAI,CAAC;IAGjB,MAAM,EAAE,MAAM,CAAM;IAGpB,OAAO,EAAE,OAAO,CAAQ;gBAEZ,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAQ7D,QAAQ,IAAI,IAAI;IAgDhB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxB,OAAO,IAAI,IAAI;CAIhB"}