@internxt/cli 1.3.2 → 1.4.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 (112) hide show
  1. package/.env +13 -0
  2. package/README.md +590 -176
  3. package/dist/commands/add-cert.d.ts +10 -3
  4. package/dist/commands/add-cert.js +24 -38
  5. package/dist/commands/config.d.ts +15 -12
  6. package/dist/commands/config.js +24 -28
  7. package/dist/commands/create-folder.d.ts +16 -8
  8. package/dist/commands/create-folder.js +67 -24
  9. package/dist/commands/delete-permanently-file.d.ts +18 -0
  10. package/dist/commands/delete-permanently-file.js +63 -0
  11. package/dist/commands/delete-permanently-folder.d.ts +18 -0
  12. package/dist/commands/delete-permanently-folder.js +63 -0
  13. package/dist/commands/download-file.d.ts +26 -0
  14. package/dist/commands/{download.js → download-file.js} +98 -56
  15. package/dist/commands/list.d.ts +12 -12
  16. package/dist/commands/list.js +45 -73
  17. package/dist/commands/login.d.ts +11 -9
  18. package/dist/commands/login.js +46 -49
  19. package/dist/commands/logout.d.ts +7 -2
  20. package/dist/commands/logout.js +14 -8
  21. package/dist/commands/logs.d.ts +11 -2
  22. package/dist/commands/logs.js +16 -3
  23. package/dist/commands/move-file.d.ts +9 -7
  24. package/dist/commands/move-file.js +38 -37
  25. package/dist/commands/move-folder.d.ts +9 -7
  26. package/dist/commands/move-folder.js +38 -37
  27. package/dist/commands/rename-file.d.ts +24 -0
  28. package/dist/commands/rename-file.js +80 -0
  29. package/dist/commands/rename-folder.d.ts +24 -0
  30. package/dist/commands/rename-folder.js +80 -0
  31. package/dist/commands/trash-clear.d.ts +9 -5
  32. package/dist/commands/trash-clear.js +21 -19
  33. package/dist/commands/trash-file.d.ts +21 -0
  34. package/dist/commands/trash-file.js +58 -0
  35. package/dist/commands/trash-folder.d.ts +21 -0
  36. package/dist/commands/trash-folder.js +58 -0
  37. package/dist/commands/trash-list.d.ts +10 -11
  38. package/dist/commands/trash-list.js +33 -62
  39. package/dist/commands/trash-restore-file.d.ts +10 -8
  40. package/dist/commands/trash-restore-file.js +33 -35
  41. package/dist/commands/trash-restore-folder.d.ts +10 -8
  42. package/dist/commands/trash-restore-folder.js +33 -35
  43. package/dist/commands/upload-file.d.ts +21 -0
  44. package/dist/commands/upload-file.js +140 -0
  45. package/dist/commands/webdav-config.d.ts +11 -9
  46. package/dist/commands/webdav-config.js +40 -66
  47. package/dist/commands/webdav.d.ts +16 -9
  48. package/dist/commands/webdav.js +77 -61
  49. package/dist/commands/whoami.d.ts +14 -2
  50. package/dist/commands/whoami.js +40 -11
  51. package/dist/hooks/prerun/auth_check.js +6 -4
  52. package/dist/services/auth.service.d.ts +2 -8
  53. package/dist/services/auth.service.js +33 -24
  54. package/dist/services/config.service.d.ts +3 -3
  55. package/dist/services/config.service.js +8 -8
  56. package/dist/services/crypto.service.d.ts +1 -3
  57. package/dist/services/crypto.service.js +11 -36
  58. package/dist/services/database/drive-file/drive-file.repository.d.ts +3 -3
  59. package/dist/services/database/drive-folder/drive-folder.repository.d.ts +3 -3
  60. package/dist/services/drive/drive-file.service.d.ts +1 -8
  61. package/dist/services/drive/drive-file.service.js +9 -23
  62. package/dist/services/drive/drive-folder.service.d.ts +1 -4
  63. package/dist/services/drive/drive-folder.service.js +2 -5
  64. package/dist/services/drive/trash.service.d.ts +2 -0
  65. package/dist/services/drive/trash.service.js +8 -0
  66. package/dist/services/keys.service.js +17 -7
  67. package/dist/services/network/network-facade.service.d.ts +1 -3
  68. package/dist/services/network/network-facade.service.js +20 -13
  69. package/dist/services/network/upload.service.d.ts +0 -1
  70. package/dist/services/sdk-manager.service.d.ts +2 -3
  71. package/dist/services/sdk-manager.service.js +14 -12
  72. package/dist/services/validation.service.d.ts +10 -0
  73. package/dist/services/validation.service.js +40 -1
  74. package/dist/types/command.types.d.ts +26 -17
  75. package/dist/types/command.types.js +38 -24
  76. package/dist/types/network.types.d.ts +0 -1
  77. package/dist/types/webdav.types.d.ts +1 -2
  78. package/dist/utils/cli.utils.d.ts +28 -19
  79. package/dist/utils/cli.utils.js +64 -44
  80. package/dist/utils/errors.utils.d.ts +1 -1
  81. package/dist/utils/errors.utils.js +3 -3
  82. package/dist/utils/hash.utils.d.ts +4 -7
  83. package/dist/utils/hash.utils.js +6 -6
  84. package/dist/utils/inquirer.utils.d.ts +4 -0
  85. package/dist/utils/inquirer.utils.js +24 -0
  86. package/dist/utils/network.utils.d.ts +2 -2
  87. package/dist/utils/network.utils.js +10 -8
  88. package/dist/utils/pm2.utils.d.ts +5 -1
  89. package/dist/utils/pm2.utils.js +35 -3
  90. package/dist/utils/stream.utils.d.ts +1 -4
  91. package/dist/utils/webdav.utils.js +4 -4
  92. package/dist/utils/xml.utils.js +4 -1
  93. package/dist/webdav/handlers/GET.handler.js +8 -3
  94. package/dist/webdav/handlers/MKCOL.handler.js +2 -6
  95. package/dist/webdav/handlers/MOVE.handler.js +0 -3
  96. package/dist/webdav/handlers/PROPFIND.handler.js +2 -2
  97. package/dist/webdav/handlers/PUT.handler.js +14 -9
  98. package/dist/webdav/middewares/errors.middleware.js +1 -1
  99. package/dist/webdav/middewares/request-logger.middleware.d.ts +1 -2
  100. package/dist/webdav/middewares/request-logger.middleware.js +6 -5
  101. package/dist/webdav/webdav-server.js +2 -3
  102. package/oclif.manifest.json +517 -350
  103. package/package.json +42 -47
  104. package/dist/commands/download.d.ts +0 -19
  105. package/dist/commands/rename.d.ts +0 -18
  106. package/dist/commands/rename.js +0 -109
  107. package/dist/commands/trash.d.ts +0 -15
  108. package/dist/commands/trash.js +0 -85
  109. package/dist/commands/upload.d.ts +0 -15
  110. package/dist/commands/upload.js +0 -93
  111. package/dist/services/analytics.service.d.ts +0 -22
  112. package/dist/services/analytics.service.js +0 -20
@@ -5,6 +5,7 @@ const sdk_manager_service_1 = require("./sdk-manager.service");
5
5
  const keys_service_1 = require("./keys.service");
6
6
  const crypto_service_1 = require("./crypto.service");
7
7
  const config_service_1 = require("./config.service");
8
+ const command_types_1 = require("../types/command.types");
8
9
  const validation_service_1 = require("./validation.service");
9
10
  class AuthService {
10
11
  static instance = new AuthService();
@@ -35,7 +36,8 @@ class AuthService {
35
36
  user: clearUser,
36
37
  token: token,
37
38
  newToken: newToken,
38
- mnemonic: clearMnemonic,
39
+ lastLoggedInAt: new Date().toISOString(),
40
+ lastTokenRefreshAt: new Date().toISOString(),
39
41
  };
40
42
  };
41
43
  is2FANeeded = async (email) => {
@@ -45,35 +47,42 @@ class AuthService {
45
47
  });
46
48
  return securityDetails.tfaEnabled;
47
49
  };
48
- getUser = async () => {
49
- const usersClient = sdk_manager_service_1.SdkManager.instance.getUsers();
50
- const { user } = await usersClient.refreshUser();
51
- return user;
52
- };
53
50
  getAuthDetails = async () => {
54
- const loginCredentials = await config_service_1.ConfigService.instance.readUser();
55
- if (!loginCredentials) {
56
- throw new Error('Credentials not found, please login first');
57
- }
58
- const { token, newToken, mnemonic } = loginCredentials;
59
- if (!token) {
60
- throw new Error('Auth token not found, please login again');
51
+ let loginCreds = await config_service_1.ConfigService.instance.readUser();
52
+ if (!(loginCreds?.newToken && loginCreds?.token && loginCreds?.user?.mnemonic)) {
53
+ throw new command_types_1.MissingCredentialsError();
61
54
  }
62
- if (!newToken) {
63
- throw new Error('New Auth token not found, please login again');
55
+ const oldTokenDetails = validation_service_1.ValidationService.instance.validateTokenAndCheckExpiration(loginCreds.token);
56
+ const newTokenDetails = validation_service_1.ValidationService.instance.validateTokenAndCheckExpiration(loginCreds.newToken);
57
+ const isValidMnemonic = validation_service_1.ValidationService.instance.validateMnemonic(loginCreds.user.mnemonic);
58
+ if (!(oldTokenDetails.isValid && newTokenDetails.isValid && isValidMnemonic)) {
59
+ throw new command_types_1.InvalidCredentialsError();
64
60
  }
65
- if (!mnemonic) {
66
- throw new Error('Mnemonic not found, please login again');
61
+ if (oldTokenDetails.expiration.expired || newTokenDetails.expiration.expired) {
62
+ throw new command_types_1.ExpiredCredentialsError();
67
63
  }
68
- if (!validation_service_1.ValidationService.instance.validateMnemonic(mnemonic)) {
69
- throw new Error('Mnemonic is not valid, please login again');
64
+ const refreshOldToken = !oldTokenDetails.expiration.expired && oldTokenDetails.expiration.refreshRequired;
65
+ const refreshNewToken = !newTokenDetails.expiration.expired && newTokenDetails.expiration.refreshRequired;
66
+ if (refreshOldToken || refreshNewToken) {
67
+ loginCreds = await this.refreshUserTokens(loginCreds);
70
68
  }
71
- return {
72
- token,
73
- newToken,
74
- mnemonic,
75
- user: loginCredentials.user,
69
+ return loginCreds;
70
+ };
71
+ refreshUserTokens = async (oldCreds) => {
72
+ const usersClient = sdk_manager_service_1.SdkManager.instance.getUsers(true);
73
+ const newCreds = await usersClient.getUserData({ userUuid: oldCreds.user.uuid });
74
+ const loginCreds = {
75
+ user: {
76
+ ...newCreds.user,
77
+ mnemonic: oldCreds.user.mnemonic,
78
+ privateKey: oldCreds.user.privateKey,
79
+ },
80
+ token: newCreds.oldToken,
81
+ newToken: newCreds.newToken,
82
+ lastLoggedInAt: oldCreds.lastLoggedInAt,
83
+ lastTokenRefreshAt: new Date().toISOString(),
76
84
  };
85
+ return loginCreds;
77
86
  };
78
87
  }
79
88
  exports.AuthService = AuthService;
@@ -1,5 +1,5 @@
1
1
  import { ConfigKeys } from '../types/config.types';
2
- import { CLICredentials, WebdavConfig } from '../types/command.types';
2
+ import { LoginCredentials, WebdavConfig } from '../types/command.types';
3
3
  export declare class ConfigService {
4
4
  static readonly INTERNXT_CLI_DATA_DIR: string;
5
5
  static readonly INTERNXT_CLI_LOGS_DIR: string;
@@ -13,9 +13,9 @@ export declare class ConfigService {
13
13
  static readonly WEBDAV_DEFAULT_PROTOCOL = "https";
14
14
  static readonly instance: ConfigService;
15
15
  get: (key: keyof ConfigKeys) => string;
16
- saveUser: (loginCredentials: CLICredentials) => Promise<void>;
16
+ saveUser: (loginCredentials: LoginCredentials) => Promise<void>;
17
17
  clearUser: () => Promise<void>;
18
- readUser: () => Promise<CLICredentials | undefined>;
18
+ readUser: () => Promise<LoginCredentials | undefined>;
19
19
  saveWebdavConfig: (webdavConfig: WebdavConfig) => Promise<void>;
20
20
  readWebdavConfig: () => Promise<WebdavConfig>;
21
21
  ensureInternxtCliDataDirExists: () => Promise<void>;
@@ -4,18 +4,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ConfigService = void 0;
7
- const path_1 = __importDefault(require("path"));
7
+ const node_path_1 = __importDefault(require("node:path"));
8
8
  const os_1 = __importDefault(require("os"));
9
- const promises_1 = __importDefault(require("fs/promises"));
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
10
10
  const crypto_service_1 = require("./crypto.service");
11
11
  class ConfigService {
12
- static INTERNXT_CLI_DATA_DIR = path_1.default.join(os_1.default.homedir(), '.internxt-cli');
13
- static INTERNXT_CLI_LOGS_DIR = path_1.default.join(this.INTERNXT_CLI_DATA_DIR, 'logs');
12
+ static INTERNXT_CLI_DATA_DIR = node_path_1.default.join(os_1.default.homedir(), '.internxt-cli');
13
+ static INTERNXT_CLI_LOGS_DIR = node_path_1.default.join(this.INTERNXT_CLI_DATA_DIR, 'logs');
14
14
  static INTERNXT_TMP_DIR = os_1.default.tmpdir();
15
- static CREDENTIALS_FILE = path_1.default.join(this.INTERNXT_CLI_DATA_DIR, '.inxtcli');
16
- static DRIVE_SQLITE_FILE = path_1.default.join(this.INTERNXT_CLI_DATA_DIR, 'internxt-cli-drive.sqlite');
17
- static WEBDAV_SSL_CERTS_DIR = path_1.default.join(this.INTERNXT_CLI_DATA_DIR, 'certs');
18
- static WEBDAV_CONFIGS_FILE = path_1.default.join(this.INTERNXT_CLI_DATA_DIR, 'config.webdav.inxt');
15
+ static CREDENTIALS_FILE = node_path_1.default.join(this.INTERNXT_CLI_DATA_DIR, '.inxtcli');
16
+ static DRIVE_SQLITE_FILE = node_path_1.default.join(this.INTERNXT_CLI_DATA_DIR, 'internxt-cli-drive.sqlite');
17
+ static WEBDAV_SSL_CERTS_DIR = node_path_1.default.join(this.INTERNXT_CLI_DATA_DIR, 'certs');
18
+ static WEBDAV_CONFIGS_FILE = node_path_1.default.join(this.INTERNXT_CLI_DATA_DIR, 'config.webdav.inxt');
19
19
  static WEBDAV_LOCAL_URL = 'webdav.local.internxt.com';
20
20
  static WEBDAV_DEFAULT_PORT = '3005';
21
21
  static WEBDAV_DEFAULT_PROTOCOL = 'https';
@@ -1,7 +1,5 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  import { CryptoProvider } from '@internxt/sdk';
4
- import { Transform } from 'stream';
2
+ import { Transform } from 'node:stream';
5
3
  export declare class CryptoService {
6
4
  static readonly instance: CryptoService;
7
5
  static readonly cryptoProvider: CryptoProvider;
@@ -1,40 +1,17 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
3
  exports.CryptoService = void 0;
27
- const node_crypto_1 = __importStar(require("node:crypto"));
4
+ const node_crypto_1 = require("node:crypto");
28
5
  const keys_service_1 = require("./keys.service");
29
6
  const config_service_1 = require("../services/config.service");
30
7
  const stream_utils_1 = require("../utils/stream.utils");
31
8
  class CryptoService {
32
9
  static instance = new CryptoService();
33
10
  static cryptoProvider = {
34
- encryptPasswordHash(password, encryptedSalt) {
11
+ async encryptPasswordHash(password, encryptedSalt) {
35
12
  const salt = CryptoService.instance.decryptText(encryptedSalt);
36
13
  const hashObj = CryptoService.instance.passToHash({ password, salt });
37
- return Promise.resolve(CryptoService.instance.encryptText(hashObj.hash));
14
+ return CryptoService.instance.encryptText(hashObj.hash);
38
15
  },
39
16
  async generateKeys(password) {
40
17
  const { privateKeyArmoredEncrypted, publicKeyArmored, revocationCertificate } = await keys_service_1.KeysService.instance.generateNewKeysWithEncrypted(password);
@@ -48,17 +25,15 @@ class CryptoService {
48
25
  },
49
26
  kyber: {
50
27
  privateKeyEncrypted: null,
51
- publicKey: null
52
- }
28
+ publicKey: null,
29
+ },
53
30
  };
54
31
  return keys;
55
32
  },
56
33
  };
57
34
  passToHash = (passObject) => {
58
- const salt = passObject.salt ? passObject.salt : node_crypto_1.default.randomBytes(128 / 8).toString('hex');
59
- const hash = node_crypto_1.default
60
- .pbkdf2Sync(passObject.password, Buffer.from(salt, 'hex'), 10000, 256 / 8, 'sha1')
61
- .toString('hex');
35
+ const salt = passObject.salt ? passObject.salt : (0, node_crypto_1.randomBytes)(128 / 8).toString('hex');
36
+ const hash = (0, node_crypto_1.pbkdf2Sync)(passObject.password, Buffer.from(salt, 'hex'), 10000, 256 / 8, 'sha1').toString('hex');
62
37
  const hashedObjetc = {
63
38
  salt,
64
39
  hash,
@@ -74,9 +49,9 @@ class CryptoService {
74
49
  return this.decryptTextWithKey(encryptedText, APP_CRYPTO_SECRET);
75
50
  };
76
51
  encryptTextWithKey = (textToEncrypt, secret) => {
77
- const salt = node_crypto_1.default.randomBytes(8);
52
+ const salt = (0, node_crypto_1.randomBytes)(8);
78
53
  const { key, iv } = this.getKeyAndIvFrom(secret, salt);
79
- const cipher = node_crypto_1.default.createCipheriv('aes-256-cbc', key, iv);
54
+ const cipher = (0, node_crypto_1.createCipheriv)('aes-256-cbc', key, iv);
80
55
  const encrypted = Buffer.concat([cipher.update(textToEncrypt, 'utf8'), cipher.final()]);
81
56
  const openSSLstart = Buffer.from('Salted__');
82
57
  return Buffer.concat([openSSLstart, salt, encrypted]).toString('hex');
@@ -85,7 +60,7 @@ class CryptoService {
85
60
  const cypherText = Buffer.from(encryptedText, 'hex');
86
61
  const salt = cypherText.subarray(8, 16);
87
62
  const { key, iv } = this.getKeyAndIvFrom(secret, salt);
88
- const decipher = node_crypto_1.default.createDecipheriv('aes-256-cbc', key, iv);
63
+ const decipher = (0, node_crypto_1.createDecipheriv)('aes-256-cbc', key, iv);
89
64
  const contentsToDecrypt = cypherText.subarray(16);
90
65
  return Buffer.concat([decipher.update(contentsToDecrypt), decipher.final()]).toString('utf8');
91
66
  };
@@ -123,7 +98,7 @@ class CryptoService {
123
98
  const md5Hashes = [];
124
99
  let digest = password;
125
100
  for (let i = 0; i < TRANSFORM_ROUNDS; i++) {
126
- md5Hashes[i] = node_crypto_1.default.createHash('md5').update(digest).digest();
101
+ md5Hashes[i] = (0, node_crypto_1.createHash)('md5').update(digest).digest();
127
102
  digest = Buffer.concat([md5Hashes[i], password]);
128
103
  }
129
104
  const key = Buffer.concat([md5Hashes[0], md5Hashes[1]]);
@@ -2,9 +2,9 @@ import { DriveFileItem } from '../../../types/drive.types';
2
2
  import { DriveFileModel } from './drive-file.model';
3
3
  import { DriveFile } from './drive-file.domain';
4
4
  export declare class DriveFileRepository {
5
- findByRelativePath: (relativePath: DriveFile['relativePath']) => Promise<DriveFile | null>;
6
- findById: (id: DriveFile['id']) => Promise<DriveFile | null>;
7
- deleteById: (id: DriveFile['id']) => Promise<void>;
5
+ findByRelativePath: (relativePath: DriveFile["relativePath"]) => Promise<DriveFile | null>;
6
+ findById: (id: DriveFile["id"]) => Promise<DriveFile | null>;
7
+ deleteById: (id: DriveFile["id"]) => Promise<void>;
8
8
  createFile: (driveFileItem: DriveFileItem, relativePath: string) => Promise<DriveFile>;
9
9
  toDomain: (model: DriveFileModel) => DriveFile;
10
10
  static readonly clean: () => Promise<void>;
@@ -2,9 +2,9 @@ import { DriveFolderItem } from '../../../types/drive.types';
2
2
  import { DriveFolder } from './drive-folder.domain';
3
3
  import { DriveFolderModel } from './drive-folder.model';
4
4
  export declare class DriveFolderRepository {
5
- findByRelativePath: (relativePath: DriveFolder['relativePath']) => Promise<DriveFolder | null>;
6
- findById: (id: DriveFolder['id']) => Promise<DriveFolder | null>;
7
- deleteById: (id: DriveFolder['id']) => Promise<void>;
5
+ findByRelativePath: (relativePath: DriveFolder["relativePath"]) => Promise<DriveFolder | null>;
6
+ findById: (id: DriveFolder["id"]) => Promise<DriveFolder | null>;
7
+ deleteById: (id: DriveFolder["id"]) => Promise<void>;
8
8
  createFolder: (driveFolderItem: DriveFolderItem, relativePath: string) => Promise<DriveFolder>;
9
9
  toDomain: (model: DriveFolderModel) => DriveFolder;
10
10
  static readonly clean: () => Promise<void>;
@@ -2,14 +2,7 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
2
2
  import { DriveFileItem } from '../../types/drive.types';
3
3
  export declare class DriveFileService {
4
4
  static readonly instance: DriveFileService;
5
- createFile: (payload: {
6
- name: string;
7
- type: string;
8
- size: number;
9
- folderId: number;
10
- fileId: string;
11
- bucket: string;
12
- }) => Promise<DriveFileItem>;
5
+ createFile: (payload: StorageTypes.FileEntryByUuid) => Promise<DriveFileItem>;
13
6
  getFileMetadata: (uuid: string) => Promise<DriveFileItem>;
14
7
  moveFile: (payload: StorageTypes.MoveFileUuidPayload) => Promise<StorageTypes.FileMeta>;
15
8
  renameFile: (fileUuid: string, payload: {
@@ -1,38 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DriveFileService = void 0;
4
- const lib_1 = require("@internxt/lib");
5
- const types_1 = require("@internxt/sdk/dist/drive/storage/types");
6
4
  const sdk_manager_service_1 = require("../sdk-manager.service");
7
- const config_service_1 = require("../config.service");
8
- const crypto_utils_1 = require("../../utils/crypto.utils");
9
5
  const drive_utils_1 = require("../../utils/drive.utils");
10
6
  class DriveFileService {
11
7
  static instance = new DriveFileService();
12
8
  createFile = async (payload) => {
13
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
14
- const encryptedName = lib_1.aes.encrypt(payload.name, `${config_service_1.ConfigService.instance.get('APP_CRYPTO_SECRET2')}-${payload.folderId}`, crypto_utils_1.CryptoUtils.getAesInit());
15
- const driveFile = await storageClient.createFileEntry({
16
- name: encryptedName,
17
- size: payload.size,
18
- folder_id: payload.folderId,
19
- id: payload.fileId,
20
- type: payload.type,
21
- plain_name: payload.name,
22
- bucket: payload.bucket,
23
- encrypt_version: types_1.EncryptionVersion.Aes03,
24
- });
9
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
10
+ const driveFile = await storageClient.createFileEntryByUuid(payload);
25
11
  return {
26
- size: Number(driveFile.size),
12
+ name: payload.plain_name,
13
+ encryptedName: driveFile.name,
14
+ id: driveFile.id,
27
15
  uuid: driveFile.uuid,
28
- encryptedName,
29
- name: payload.name,
30
- bucket: payload.bucket,
16
+ size: driveFile.size,
17
+ bucket: driveFile.bucket,
31
18
  createdAt: new Date(driveFile.createdAt),
32
19
  updatedAt: new Date(driveFile.updatedAt),
33
- fileId: payload.fileId,
34
- id: driveFile.id,
35
- type: payload.type,
20
+ fileId: driveFile.fileId,
21
+ type: driveFile.type,
36
22
  status: driveFile.status,
37
23
  folderId: driveFile.folderId,
38
24
  folderUuid: driveFile.folderUuid,
@@ -13,10 +13,7 @@ export declare class DriveFolderService {
13
13
  private readonly getAllSubfolders;
14
14
  private readonly getAllSubfiles;
15
15
  moveFolder: (payload: StorageTypes.MoveFolderUuidPayload) => Promise<StorageTypes.FolderMeta>;
16
- createFolder(payload: {
17
- folderName: string;
18
- parentFolderId: number;
19
- }): [Promise<StorageTypes.CreateFolderResponse>, RequestCanceler];
16
+ createFolder(payload: StorageTypes.CreateFolderByUuidPayload): [Promise<StorageTypes.CreateFolderResponse>, RequestCanceler];
20
17
  renameFolder: (payload: {
21
18
  folderUuid: string;
22
19
  name: string;
@@ -46,11 +46,8 @@ class DriveFolderService {
46
46
  return storageClient.moveFolderByUuid(payload);
47
47
  };
48
48
  createFolder(payload) {
49
- const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
50
- return storageClient.createFolder({
51
- folderName: payload.folderName,
52
- parentFolderId: payload.parentFolderId,
53
- });
49
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
50
+ return storageClient.createFolderByUuid(payload);
54
51
  }
55
52
  renameFolder = (payload) => {
56
53
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
@@ -2,6 +2,8 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
2
2
  export declare class TrashService {
3
3
  static readonly instance: TrashService;
4
4
  trashItems: (payload: StorageTypes.AddItemsToTrashPayload) => Promise<void>;
5
+ deleteFile: (payload: StorageTypes.DeleteFilePayload) => Promise<unknown>;
6
+ deleteFolder: (folderId: number) => Promise<unknown>;
5
7
  clearTrash: () => Promise<void>;
6
8
  getTrashFolderContent: () => Promise<{
7
9
  folders: StorageTypes.FetchPaginatedFolder[];
@@ -8,6 +8,14 @@ class TrashService {
8
8
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
9
9
  return storageClient.addItemsToTrash(payload);
10
10
  };
11
+ deleteFile = (payload) => {
12
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(false);
13
+ return storageClient.deleteFile(payload);
14
+ };
15
+ deleteFolder = (folderId) => {
16
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(false);
17
+ return storageClient.deleteFolder(folderId);
18
+ };
11
19
  clearTrash = () => {
12
20
  const storageClient = sdk_manager_service_1.SdkManager.instance.getTrash();
13
21
  return storageClient.clearTrash();
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.KeysService = void 0;
27
37
  const lib_1 = require("@internxt/lib");
@@ -1,11 +1,9 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
1
  import { Network } from '@internxt/sdk';
2
+ import { Readable } from 'node:stream';
4
3
  import { DownloadOptions, UploadOptions } from '../../types/network.types';
5
4
  import { CryptoService } from '../crypto.service';
6
5
  import { UploadService } from './upload.service';
7
6
  import { DownloadService } from './download.service';
8
- import { Readable } from 'node:stream';
9
7
  export declare class NetworkFacade {
10
8
  private readonly network;
11
9
  private readonly uploadService;
@@ -15,23 +15,30 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
28
35
  Object.defineProperty(exports, "__esModule", { value: true });
29
36
  exports.NetworkFacade = void 0;
30
37
  const sdk_1 = require("@internxt/sdk");
31
38
  const NetworkUpload = __importStar(require("@internxt/sdk/dist/network/upload"));
32
39
  const NetworkDownload = __importStar(require("@internxt/sdk/dist/network/download"));
33
40
  const inxt_js_1 = require("@internxt/inxt-js");
34
- const crypto_1 = __importDefault(require("crypto"));
41
+ const node_crypto_1 = require("node:crypto");
35
42
  const validation_service_1 = require("../validation.service");
36
43
  const hash_utils_1 = require("../../utils/hash.utils");
37
44
  const stream_utils_1 = require("../../utils/stream.utils");
@@ -54,7 +61,7 @@ class NetworkFacade {
54
61
  generateFileKey: (mnemonic, bucketId, index) => {
55
62
  return inxt_js_1.Environment.utils.generateFileKey(mnemonic, bucketId, index);
56
63
  },
57
- randomBytes: crypto_1.default.randomBytes,
64
+ randomBytes: node_crypto_1.randomBytes,
58
65
  };
59
66
  }
60
67
  async downloadToStream(bucketId, mnemonic, fileId, to, options) {
@@ -93,7 +100,6 @@ class NetworkFacade {
93
100
  async uploadFromStream(bucketId, mnemonic, size, from, options) {
94
101
  const hashStream = new hash_utils_1.HashStream();
95
102
  const abortable = options?.abortController ?? new AbortController();
96
- let fileHash;
97
103
  let encryptionTransform;
98
104
  const progressTransform = new stream_utils_1.ProgressTransform({ totalBytes: size }, (progress) => {
99
105
  if (options?.progressCallback) {
@@ -120,6 +126,7 @@ class NetworkFacade {
120
126
  };
121
127
  const uploadOperation = async () => {
122
128
  const uploadResult = await NetworkUpload.uploadFile(this.network, this.cryptoLib, bucketId, mnemonic, size, encryptFile, uploadFile);
129
+ const fileHash = Buffer.from('');
123
130
  onProgress(1);
124
131
  return {
125
132
  fileId: uploadResult,
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { Readable } from 'node:stream';
3
2
  import { UploadOptions } from '../../types/network.types';
4
3
  export declare class UploadService {
@@ -12,10 +12,9 @@ export declare class SdkManager {
12
12
  throwErrorOnMissingCredentials: boolean;
13
13
  }) => SdkManagerApiSecurity;
14
14
  static readonly getAppDetails: () => AppDetails;
15
- getAuthV2(): Auth;
16
- getAuth(): Auth;
15
+ getAuth(useNewApi?: boolean): Auth;
17
16
  getPayments(): Drive.Payments;
18
- getUsers(): Drive.Users;
17
+ getUsers(useNewApi?: boolean): Drive.Users;
19
18
  getReferrals(): Drive.Referrals;
20
19
  getStorage(useNewApi?: boolean): Drive.Storage;
21
20
  getTrash(): Drive.Trash;
@@ -29,17 +29,15 @@ class SdkManager {
29
29
  clientVersion: package_json_1.default.version,
30
30
  };
31
31
  };
32
- getAuthV2() {
33
- const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
34
- const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
35
- const appDetails = SdkManager.getAppDetails();
36
- return sdk_1.Auth.client(DRIVE_NEW_API_URL, appDetails, apiSecurity);
37
- }
38
- getAuth() {
39
- const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_API_URL');
32
+ getAuth(useNewApi = false) {
33
+ const DRIVE_API_URL = useNewApi
34
+ ? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
35
+ : config_service_1.ConfigService.instance.get('DRIVE_API_URL');
40
36
  const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
41
37
  const appDetails = SdkManager.getAppDetails();
42
- return sdk_1.Auth.client(DRIVE_API_URL, appDetails, apiSecurity);
38
+ return sdk_1.Auth.client(DRIVE_API_URL, appDetails, {
39
+ token: useNewApi ? apiSecurity?.newToken : apiSecurity?.token,
40
+ });
43
41
  }
44
42
  getPayments() {
45
43
  const PAYMENTS_API_URL = config_service_1.ConfigService.instance.get('PAYMENTS_API_URL');
@@ -49,11 +47,15 @@ class SdkManager {
49
47
  token: newToken,
50
48
  });
51
49
  }
52
- getUsers() {
53
- const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_API_URL');
50
+ getUsers(useNewApi = false) {
51
+ const DRIVE_API_URL = useNewApi
52
+ ? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
53
+ : config_service_1.ConfigService.instance.get('DRIVE_API_URL');
54
54
  const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
55
55
  const appDetails = SdkManager.getAppDetails();
56
- return sdk_1.Drive.Users.client(DRIVE_API_URL, appDetails, apiSecurity);
56
+ return sdk_1.Drive.Users.client(DRIVE_API_URL, appDetails, {
57
+ token: useNewApi ? apiSecurity.newToken : apiSecurity.token,
58
+ });
57
59
  }
58
60
  getReferrals() {
59
61
  const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_API_URL');
@@ -6,4 +6,14 @@ export declare class ValidationService {
6
6
  validateUUIDv4: (uuid: string) => boolean;
7
7
  validateYesOrNoString: (message: string) => boolean;
8
8
  validateTCPIntegerPort: (port: string) => boolean;
9
+ validateStringIsNotEmpty: (str: string) => boolean;
10
+ validateDirectoryExists: (path: string) => Promise<boolean>;
11
+ validateFileExists: (path: string) => Promise<boolean>;
12
+ validateTokenAndCheckExpiration: (token?: string) => {
13
+ isValid: boolean;
14
+ expiration: {
15
+ expired: boolean;
16
+ refreshRequired: boolean;
17
+ };
18
+ };
9
19
  }
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.ValidationService = void 0;
4
7
  const lib_1 = require("@internxt/lib");
5
8
  const bip39_1 = require("bip39");
9
+ const promises_1 = __importDefault(require("node:fs/promises"));
6
10
  class ValidationService {
7
11
  static instance = new ValidationService();
8
12
  validateEmail = (email) => {
@@ -18,10 +22,45 @@ class ValidationService {
18
22
  return /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i.test(uuid);
19
23
  };
20
24
  validateYesOrNoString = (message) => {
21
- return message.length > 0 && /^(yes|no|y|n)$/i.test(message.toLowerCase().trim());
25
+ return message.length > 0 && /^(yes|no|y|n)$/i.test(message.trim());
22
26
  };
23
27
  validateTCPIntegerPort = (port) => {
24
28
  return /^\d+$/.test(port) && Number(port) >= 1 && Number(port) <= 65535;
25
29
  };
30
+ validateStringIsNotEmpty = (str) => {
31
+ return str.trim().length > 0;
32
+ };
33
+ validateDirectoryExists = async (path) => {
34
+ const directoryStat = await promises_1.default.stat(path);
35
+ return directoryStat.isDirectory();
36
+ };
37
+ validateFileExists = async (path) => {
38
+ const fileStat = await promises_1.default.stat(path);
39
+ return fileStat.isFile();
40
+ };
41
+ validateTokenAndCheckExpiration = (token) => {
42
+ if (!token || typeof token !== 'string') {
43
+ return { isValid: false, expiration: { expired: true, refreshRequired: false } };
44
+ }
45
+ const parts = token.split('.');
46
+ if (parts.length !== 3) {
47
+ return { isValid: false, expiration: { expired: true, refreshRequired: false } };
48
+ }
49
+ try {
50
+ const payload = JSON.parse(atob(parts[1]));
51
+ if (typeof payload.exp !== 'number') {
52
+ return { isValid: false, expiration: { expired: true, refreshRequired: false } };
53
+ }
54
+ const currentTime = Math.floor(Date.now() / 1000);
55
+ const twoDaysInSeconds = 2 * 24 * 60 * 60;
56
+ const remainingSeconds = payload.exp - currentTime;
57
+ const expired = remainingSeconds <= 0;
58
+ const refreshRequired = remainingSeconds > 0 && remainingSeconds <= twoDaysInSeconds;
59
+ return { isValid: true, expiration: { expired, refreshRequired } };
60
+ }
61
+ catch {
62
+ return { isValid: false, expiration: { expired: true, refreshRequired: false } };
63
+ }
64
+ };
26
65
  }
27
66
  exports.ValidationService = ValidationService;