@internxt/cli 0.1.4

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 (144) hide show
  1. package/.env +11 -0
  2. package/README.md +297 -0
  3. package/bin/dev.cmd +3 -0
  4. package/bin/dev.js +7 -0
  5. package/bin/run.cmd +3 -0
  6. package/bin/run.js +7 -0
  7. package/dist/commands/config.d.ts +18 -0
  8. package/dist/commands/config.js +50 -0
  9. package/dist/commands/download.d.ts +19 -0
  10. package/dist/commands/download.js +119 -0
  11. package/dist/commands/list.d.ts +22 -0
  12. package/dist/commands/list.js +125 -0
  13. package/dist/commands/login.d.ts +21 -0
  14. package/dist/commands/login.js +124 -0
  15. package/dist/commands/logout.d.ts +9 -0
  16. package/dist/commands/logout.js +28 -0
  17. package/dist/commands/logs.d.ts +6 -0
  18. package/dist/commands/logs.js +12 -0
  19. package/dist/commands/move.d.ts +18 -0
  20. package/dist/commands/move.js +109 -0
  21. package/dist/commands/trash.d.ts +15 -0
  22. package/dist/commands/trash.js +85 -0
  23. package/dist/commands/upload.d.ts +15 -0
  24. package/dist/commands/upload.js +93 -0
  25. package/dist/commands/webdav.d.ts +12 -0
  26. package/dist/commands/webdav.js +64 -0
  27. package/dist/commands/whoami.d.ts +9 -0
  28. package/dist/commands/whoami.js +27 -0
  29. package/dist/database/migrations/20240402164914-create-files.d.ts +1 -0
  30. package/dist/database/migrations/20240402164914-create-files.js +55 -0
  31. package/dist/database/migrations/20240402165418-create-folders.d.ts +1 -0
  32. package/dist/database/migrations/20240402165418-create-folders.js +37 -0
  33. package/dist/hooks/prerun/auth_check.d.ts +3 -0
  34. package/dist/hooks/prerun/auth_check.js +32 -0
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.js +5 -0
  37. package/dist/services/auth.service.d.ts +14 -0
  38. package/dist/services/auth.service.js +79 -0
  39. package/dist/services/config.service.d.ts +19 -0
  40. package/dist/services/config.service.js +79 -0
  41. package/dist/services/crypto.service.d.ts +22 -0
  42. package/dist/services/crypto.service.js +126 -0
  43. package/dist/services/database/drive-database-manager.service.d.ts +18 -0
  44. package/dist/services/database/drive-database-manager.service.js +76 -0
  45. package/dist/services/database/drive-file/drive-file.attributes.d.ts +14 -0
  46. package/dist/services/database/drive-file/drive-file.attributes.js +2 -0
  47. package/dist/services/database/drive-file/drive-file.domain.d.ts +18 -0
  48. package/dist/services/database/drive-file/drive-file.domain.js +51 -0
  49. package/dist/services/database/drive-file/drive-file.model.d.ts +17 -0
  50. package/dist/services/database/drive-file/drive-file.model.js +82 -0
  51. package/dist/services/database/drive-file/drive-file.repository.d.ts +11 -0
  52. package/dist/services/database/drive-file/drive-file.repository.js +40 -0
  53. package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +9 -0
  54. package/dist/services/database/drive-folder/drive-folder.attributes.js +2 -0
  55. package/dist/services/database/drive-folder/drive-folder.domain.d.ts +13 -0
  56. package/dist/services/database/drive-folder/drive-folder.domain.js +36 -0
  57. package/dist/services/database/drive-folder/drive-folder.model.d.ts +12 -0
  58. package/dist/services/database/drive-folder/drive-folder.model.js +56 -0
  59. package/dist/services/database/drive-folder/drive-folder.repository.d.ts +11 -0
  60. package/dist/services/database/drive-folder/drive-folder.repository.js +40 -0
  61. package/dist/services/drive/drive-file.service.d.ts +15 -0
  62. package/dist/services/drive/drive-file.service.js +51 -0
  63. package/dist/services/drive/drive-folder.service.d.ts +15 -0
  64. package/dist/services/drive/drive-folder.service.js +49 -0
  65. package/dist/services/drive/trash.service.d.ts +5 -0
  66. package/dist/services/drive/trash.service.js +12 -0
  67. package/dist/services/keys.service.d.ts +14 -0
  68. package/dist/services/keys.service.js +110 -0
  69. package/dist/services/network/download.service.d.ts +7 -0
  70. package/dist/services/network/download.service.js +33 -0
  71. package/dist/services/network/network-facade.service.d.ts +21 -0
  72. package/dist/services/network/network-facade.service.js +128 -0
  73. package/dist/services/network/upload.service.d.ts +9 -0
  74. package/dist/services/network/upload.service.js +20 -0
  75. package/dist/services/realms/drive-files.realm.d.ts +23 -0
  76. package/dist/services/realms/drive-files.realm.js +76 -0
  77. package/dist/services/realms/drive-folders.realm.d.ts +20 -0
  78. package/dist/services/realms/drive-folders.realm.js +68 -0
  79. package/dist/services/realms/drive-realm-manager.service.d.ts +15 -0
  80. package/dist/services/realms/drive-realm-manager.service.js +63 -0
  81. package/dist/services/sdk-manager.service.d.ts +28 -0
  82. package/dist/services/sdk-manager.service.js +107 -0
  83. package/dist/services/usage.service.d.ts +6 -0
  84. package/dist/services/usage.service.js +23 -0
  85. package/dist/services/validation.service.d.ts +7 -0
  86. package/dist/services/validation.service.js +21 -0
  87. package/dist/types/command.types.d.ts +42 -0
  88. package/dist/types/command.types.js +59 -0
  89. package/dist/types/config.types.d.ts +13 -0
  90. package/dist/types/config.types.js +2 -0
  91. package/dist/types/drive.types.d.ts +14 -0
  92. package/dist/types/drive.types.js +2 -0
  93. package/dist/types/keys.types.d.ts +16 -0
  94. package/dist/types/keys.types.js +31 -0
  95. package/dist/types/network.types.d.ts +11 -0
  96. package/dist/types/network.types.js +2 -0
  97. package/dist/types/webdav.types.d.ts +15 -0
  98. package/dist/types/webdav.types.js +6 -0
  99. package/dist/utils/cli.utils.d.ts +32 -0
  100. package/dist/utils/cli.utils.js +105 -0
  101. package/dist/utils/crypto.utils.d.ts +6 -0
  102. package/dist/utils/crypto.utils.js +10 -0
  103. package/dist/utils/drive.utils.d.ts +6 -0
  104. package/dist/utils/drive.utils.js +34 -0
  105. package/dist/utils/errors.utils.d.ts +19 -0
  106. package/dist/utils/errors.utils.js +50 -0
  107. package/dist/utils/format.utils.d.ts +6 -0
  108. package/dist/utils/format.utils.js +30 -0
  109. package/dist/utils/hash.utils.d.ts +15 -0
  110. package/dist/utils/hash.utils.js +37 -0
  111. package/dist/utils/logger.utils.d.ts +3 -0
  112. package/dist/utils/logger.utils.js +50 -0
  113. package/dist/utils/network.utils.d.ts +22 -0
  114. package/dist/utils/network.utils.js +49 -0
  115. package/dist/utils/pm2.utils.d.ts +10 -0
  116. package/dist/utils/pm2.utils.js +65 -0
  117. package/dist/utils/stream.utils.d.ts +7 -0
  118. package/dist/utils/stream.utils.js +56 -0
  119. package/dist/utils/webdav.utils.d.ts +7 -0
  120. package/dist/utils/webdav.utils.js +47 -0
  121. package/dist/utils/xml.utils.d.ts +8 -0
  122. package/dist/utils/xml.utils.js +23 -0
  123. package/dist/webdav/handlers/GET.handler.d.ts +23 -0
  124. package/dist/webdav/handlers/GET.handler.js +52 -0
  125. package/dist/webdav/handlers/HEAD.handler.d.ts +5 -0
  126. package/dist/webdav/handlers/HEAD.handler.js +9 -0
  127. package/dist/webdav/handlers/OPTIONS.handler.d.ts +5 -0
  128. package/dist/webdav/handlers/OPTIONS.handler.js +11 -0
  129. package/dist/webdav/handlers/PROPFIND.handler.d.ts +21 -0
  130. package/dist/webdav/handlers/PROPFIND.handler.js +234 -0
  131. package/dist/webdav/handlers/PUT.handler.d.ts +23 -0
  132. package/dist/webdav/handlers/PUT.handler.js +51 -0
  133. package/dist/webdav/index.d.ts +1 -0
  134. package/dist/webdav/index.js +30 -0
  135. package/dist/webdav/middewares/auth.middleware.d.ts +3 -0
  136. package/dist/webdav/middewares/auth.middleware.js +27 -0
  137. package/dist/webdav/middewares/errors.middleware.d.ts +2 -0
  138. package/dist/webdav/middewares/errors.middleware.js +20 -0
  139. package/dist/webdav/middewares/request-logger.middleware.d.ts +7 -0
  140. package/dist/webdav/middewares/request-logger.middleware.js +15 -0
  141. package/dist/webdav/webdav-server.d.ts +25 -0
  142. package/dist/webdav/webdav-server.js +98 -0
  143. package/oclif.manifest.json +593 -0
  144. package/package.json +122 -0
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const core_1 = require("@oclif/core");
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_fs_1 = require("node:fs");
9
+ const network_facade_service_1 = require("../services/network/network-facade.service");
10
+ const sdk_manager_service_1 = require("../services/sdk-manager.service");
11
+ const auth_service_1 = require("../services/auth.service");
12
+ const cli_utils_1 = require("../utils/cli.utils");
13
+ const config_service_1 = require("../services/config.service");
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ const drive_file_service_1 = require("../services/drive/drive-file.service");
16
+ const upload_service_1 = require("../services/network/upload.service");
17
+ const crypto_service_1 = require("../services/crypto.service");
18
+ const download_service_1 = require("../services/network/download.service");
19
+ const errors_utils_1 = require("../utils/errors.utils");
20
+ const drive_folder_service_1 = require("../services/drive/drive-folder.service");
21
+ class Upload extends core_1.Command {
22
+ static description = 'Upload a file to Internxt Drive';
23
+ static examples = ['<%= config.bin %> <%= command.id %>'];
24
+ static enableJsonFlag = true;
25
+ static flags = {
26
+ file: core_1.Flags.string({ description: 'The path to read the file in your system', required: true }),
27
+ id: core_1.Flags.string({ description: 'The folder id to upload the file to', required: false }),
28
+ };
29
+ async catch(error) {
30
+ errors_utils_1.ErrorUtils.report(error, { command: this.id });
31
+ cli_utils_1.CLIUtils.error(error.message);
32
+ this.exit(1);
33
+ }
34
+ async run() {
35
+ const { flags } = await this.parse(Upload);
36
+ const folderUuid = flags.id;
37
+ let folderId;
38
+ const stat = await promises_1.default.stat(flags.file);
39
+ if (!stat.size) {
40
+ throw new Error('File is empty, cannot upload empty files as is not allowed.');
41
+ }
42
+ if (!folderUuid || folderUuid.trim().length === 0) {
43
+ cli_utils_1.CLIUtils.warning('No folder id provided, uploading to root folder');
44
+ }
45
+ else {
46
+ folderId = (await drive_folder_service_1.DriveFolderService.instance.getFolderMetaByUuid(folderUuid)).id;
47
+ }
48
+ cli_utils_1.CLIUtils.doing('Preparing Network');
49
+ const { mnemonic } = await auth_service_1.AuthService.instance.getAuthDetails();
50
+ const user = await auth_service_1.AuthService.instance.getUser();
51
+ const networkModule = sdk_manager_service_1.SdkManager.instance.getNetwork({
52
+ user: user.bridgeUser,
53
+ pass: user.userId,
54
+ });
55
+ const networkFacade = new network_facade_service_1.NetworkFacade(networkModule, upload_service_1.UploadService.instance, download_service_1.DownloadService.instance, crypto_service_1.CryptoService.instance);
56
+ cli_utils_1.CLIUtils.done();
57
+ const timer = cli_utils_1.CLIUtils.timer();
58
+ const fileStream = (0, node_fs_1.createReadStream)(flags.file);
59
+ const progressBar = core_1.ux.progress({
60
+ format: 'Uploading file [{bar}] {percentage}%',
61
+ linewrap: true,
62
+ });
63
+ progressBar.start(1, 0);
64
+ const [uploadPromise, abortable] = await networkFacade.uploadFromStream(user.bucket, mnemonic, stat.size, fileStream, {
65
+ progressCallback: (progress) => {
66
+ progressBar.update(progress);
67
+ },
68
+ });
69
+ process.on('SIGINT', () => {
70
+ abortable.abort('SIGINT received');
71
+ process.exit(1);
72
+ });
73
+ const uploadResult = await uploadPromise;
74
+ progressBar.stop();
75
+ const fileInfo = node_path_1.default.parse(flags.file);
76
+ const createdDriveFile = await drive_file_service_1.DriveFileService.instance.createFile({
77
+ name: fileInfo.name,
78
+ type: fileInfo.ext.replaceAll('.', ''),
79
+ size: stat.size,
80
+ folderId: folderId ?? user.root_folder_id,
81
+ fileId: uploadResult.fileId,
82
+ bucket: user.bucket,
83
+ });
84
+ const uploadTime = timer.stop();
85
+ this.log('\n');
86
+ cli_utils_1.CLIUtils.success(`File uploaded in ${uploadTime}ms, view it at ${config_service_1.ConfigService.instance.get('DRIVE_URL')}/file/${createdDriveFile.uuid}`);
87
+ return {
88
+ fileId: uploadResult.fileId,
89
+ uuid: createdDriveFile.uuid,
90
+ };
91
+ }
92
+ }
93
+ exports.default = Upload;
@@ -0,0 +1,12 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Webdav extends Command {
3
+ static readonly description = "Enable or disable the Internxt CLI WebDav server";
4
+ static examples: string[];
5
+ static flags: {};
6
+ static args: {
7
+ action: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ enableWebDav(): Promise<void>;
10
+ disableWebDav(): Promise<void>;
11
+ run(): Promise<void>;
12
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const pm2_utils_1 = require("../utils/pm2.utils");
5
+ const cli_utils_1 = require("../utils/cli.utils");
6
+ const config_service_1 = require("../services/config.service");
7
+ class Webdav extends core_1.Command {
8
+ static description = 'Enable or disable the Internxt CLI WebDav server';
9
+ static examples = ['<%= config.bin %> <%= command.id %>'];
10
+ static flags = {};
11
+ static args = {
12
+ action: core_1.Args.string({
13
+ required: true,
14
+ options: ['enable', 'disable'],
15
+ }),
16
+ };
17
+ async enableWebDav() {
18
+ cli_utils_1.CLIUtils.doing('Starting Internxt WebDav server...');
19
+ await pm2_utils_1.PM2Utils.connect();
20
+ await pm2_utils_1.PM2Utils.killWebDavServer();
21
+ await pm2_utils_1.PM2Utils.startWebDavServer();
22
+ cli_utils_1.CLIUtils.done();
23
+ const { status } = await pm2_utils_1.PM2Utils.webdavServerStatus();
24
+ if (status === 'online') {
25
+ core_1.ux.log(`\nWebDav server status: ${core_1.ux.colorize('green', 'online')}\n`);
26
+ cli_utils_1.CLIUtils.success(`Internxt WebDav server started successfully on https://${config_service_1.ConfigService.WEBDAV_LOCAL_URL}:${process.env.WEBDAV_SERVER_PORT}`);
27
+ }
28
+ else {
29
+ core_1.ux.log(`WebDav server status: ${core_1.ux.colorize('red', status)}`);
30
+ }
31
+ }
32
+ async disableWebDav() {
33
+ cli_utils_1.CLIUtils.doing('Stopping Internxt WebDav server...');
34
+ await pm2_utils_1.PM2Utils.connect();
35
+ await pm2_utils_1.PM2Utils.killWebDavServer();
36
+ cli_utils_1.CLIUtils.done();
37
+ cli_utils_1.CLIUtils.success('Internxt WebDav server stopped successfully');
38
+ }
39
+ async run() {
40
+ const { args } = await this.parse(Webdav);
41
+ try {
42
+ switch (args.action) {
43
+ case 'enable': {
44
+ await this.enableWebDav();
45
+ break;
46
+ }
47
+ case 'disable': {
48
+ await this.disableWebDav();
49
+ break;
50
+ }
51
+ }
52
+ }
53
+ catch (error) {
54
+ if (error instanceof Error) {
55
+ cli_utils_1.CLIUtils.error(error.message);
56
+ }
57
+ else {
58
+ cli_utils_1.CLIUtils.error(JSON.stringify(error));
59
+ }
60
+ }
61
+ this.exit(0);
62
+ }
63
+ }
64
+ exports.default = Webdav;
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Whoami extends Command {
3
+ static readonly args: {};
4
+ static readonly description = "Display the current user logged into the Internxt CLI.";
5
+ static readonly examples: string[];
6
+ static readonly flags: {};
7
+ catch(error: Error): Promise<void>;
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const config_service_1 = require("../services/config.service");
5
+ const cli_utils_1 = require("../utils/cli.utils");
6
+ const errors_utils_1 = require("../utils/errors.utils");
7
+ class Whoami extends core_1.Command {
8
+ static args = {};
9
+ static description = 'Display the current user logged into the Internxt CLI.';
10
+ static examples = ['<%= config.bin %> <%= command.id %>'];
11
+ static flags = {};
12
+ async catch(error) {
13
+ errors_utils_1.ErrorUtils.report(error, { command: this.id });
14
+ cli_utils_1.CLIUtils.error(error.message);
15
+ this.exit(1);
16
+ }
17
+ async run() {
18
+ const userCredentials = await config_service_1.ConfigService.instance.readUser();
19
+ if (userCredentials?.user?.email) {
20
+ cli_utils_1.CLIUtils.success(`You are logged in with: ${userCredentials.user.email}`);
21
+ }
22
+ else {
23
+ cli_utils_1.CLIUtils.error('You are not logged in');
24
+ }
25
+ }
26
+ }
27
+ exports.default = Whoami;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ module.exports = {
4
+ async up(queryInterface, Sequelize) {
5
+ await queryInterface.createTable('files', {
6
+ id: {
7
+ allowNull: false,
8
+ autoIncrement: true,
9
+ primaryKey: true,
10
+ type: Sequelize.INTEGER,
11
+ },
12
+ name: {
13
+ type: Sequelize.STRING,
14
+ },
15
+ type: {
16
+ type: Sequelize.STRING(24),
17
+ allowNull: true,
18
+ },
19
+ uuid: {
20
+ type: Sequelize.UUIDV4,
21
+ unique: true,
22
+ },
23
+ file_id: {
24
+ type: Sequelize.STRING(24),
25
+ },
26
+ folder_id: {
27
+ type: Sequelize.INTEGER,
28
+ },
29
+ bucket: {
30
+ type: Sequelize.STRING(24),
31
+ },
32
+ relative_path: {
33
+ type: Sequelize.TEXT,
34
+ },
35
+ size: {
36
+ type: Sequelize.BIGINT,
37
+ },
38
+ status: {
39
+ type: Sequelize.ENUM,
40
+ values: ['EXISTS', 'TRASHED', 'DELETED'],
41
+ defaultValue: 'EXISTS',
42
+ allowNull: false,
43
+ },
44
+ created_at: {
45
+ type: Sequelize.DATE,
46
+ },
47
+ updated_at: {
48
+ type: Sequelize.DATE,
49
+ },
50
+ });
51
+ },
52
+ async down(queryInterface) {
53
+ await queryInterface.dropTable('files');
54
+ },
55
+ };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ module.exports = {
4
+ async up(queryInterface, Sequelize) {
5
+ await queryInterface.createTable('folders', {
6
+ id: {
7
+ allowNull: false,
8
+ autoIncrement: true,
9
+ primaryKey: true,
10
+ type: Sequelize.INTEGER,
11
+ },
12
+ name: {
13
+ type: Sequelize.STRING,
14
+ },
15
+ uuid: {
16
+ type: Sequelize.UUIDV4,
17
+ unique: true,
18
+ },
19
+ relative_path: {
20
+ type: Sequelize.TEXT,
21
+ },
22
+ parent_id: {
23
+ type: Sequelize.INTEGER,
24
+ allowNull: true,
25
+ },
26
+ created_at: {
27
+ type: Sequelize.DATE,
28
+ },
29
+ updated_at: {
30
+ type: Sequelize.DATE,
31
+ },
32
+ });
33
+ },
34
+ async down(queryInterface) {
35
+ await queryInterface.dropTable('folders');
36
+ },
37
+ };
@@ -0,0 +1,3 @@
1
+ import { Hook } from '@oclif/core';
2
+ declare const hook: Hook<'prerun'>;
3
+ export default hook;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const whoami_1 = __importDefault(require("../../commands/whoami"));
7
+ const login_1 = __importDefault(require("../../commands/login"));
8
+ const logout_1 = __importDefault(require("../../commands/logout"));
9
+ const cli_utils_1 = require("../../utils/cli.utils");
10
+ const sdk_manager_service_1 = require("../../services/sdk-manager.service");
11
+ const auth_service_1 = require("../../services/auth.service");
12
+ const command_types_1 = require("../../types/command.types");
13
+ const CommandsToSkip = [whoami_1.default, login_1.default, logout_1.default];
14
+ const hook = async function (opts) {
15
+ if (!CommandsToSkip.map((command) => command.name).includes(opts.Command.name)) {
16
+ cli_utils_1.CLIUtils.doing('Checking credentials');
17
+ try {
18
+ const { token, newToken } = await auth_service_1.AuthService.instance.getAuthDetails();
19
+ sdk_manager_service_1.SdkManager.init({
20
+ token,
21
+ newToken,
22
+ });
23
+ }
24
+ catch (error) {
25
+ cli_utils_1.CLIUtils.error(new command_types_1.MissingCredentialsError().message);
26
+ opts.context.exit(1);
27
+ }
28
+ cli_utils_1.CLIUtils.done();
29
+ cli_utils_1.CLIUtils.clearPreviousLine();
30
+ }
31
+ };
32
+ exports.default = hook;
@@ -0,0 +1 @@
1
+ export { run } from '@oclif/core';
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.run = void 0;
4
+ var core_1 = require("@oclif/core");
5
+ Object.defineProperty(exports, "run", { enumerable: true, get: function () { return core_1.run; } });
@@ -0,0 +1,14 @@
1
+ import { LoginCredentials } from '../types/command.types';
2
+ import { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings';
3
+ export declare class AuthService {
4
+ static readonly instance: AuthService;
5
+ doLogin: (email: string, password: string, twoFactorCode?: string) => Promise<LoginCredentials>;
6
+ is2FANeeded: (email: string) => Promise<boolean>;
7
+ getUser: () => Promise<UserSettings>;
8
+ getAuthDetails: () => Promise<{
9
+ token: string;
10
+ newToken: string;
11
+ mnemonic: string;
12
+ user: UserSettings;
13
+ }>;
14
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthService = void 0;
4
+ const sdk_manager_service_1 = require("./sdk-manager.service");
5
+ const keys_service_1 = require("./keys.service");
6
+ const crypto_service_1 = require("./crypto.service");
7
+ const config_service_1 = require("./config.service");
8
+ const validation_service_1 = require("./validation.service");
9
+ class AuthService {
10
+ static instance = new AuthService();
11
+ doLogin = async (email, password, twoFactorCode) => {
12
+ const authClient = sdk_manager_service_1.SdkManager.instance.getAuth();
13
+ const loginDetails = {
14
+ email: email.toLowerCase(),
15
+ password: password,
16
+ tfaCode: twoFactorCode,
17
+ };
18
+ const data = await authClient.login(loginDetails, crypto_service_1.CryptoService.cryptoProvider);
19
+ const { user, token, newToken } = data;
20
+ const { privateKey, publicKey } = user;
21
+ const plainPrivateKeyInBase64 = privateKey
22
+ ? Buffer.from(keys_service_1.KeysService.instance.decryptPrivateKey(privateKey, password)).toString('base64')
23
+ : '';
24
+ if (privateKey) {
25
+ await keys_service_1.KeysService.instance.assertPrivateKeyIsValid(privateKey, password);
26
+ await keys_service_1.KeysService.instance.assertValidateKeys(Buffer.from(plainPrivateKeyInBase64, 'base64').toString(), Buffer.from(publicKey, 'base64').toString());
27
+ }
28
+ const clearMnemonic = crypto_service_1.CryptoService.instance.decryptTextWithKey(user.mnemonic, password);
29
+ const clearUser = {
30
+ ...user,
31
+ mnemonic: clearMnemonic,
32
+ privateKey: plainPrivateKeyInBase64,
33
+ };
34
+ return {
35
+ user: clearUser,
36
+ token: token,
37
+ newToken: newToken,
38
+ mnemonic: clearMnemonic,
39
+ };
40
+ };
41
+ is2FANeeded = async (email) => {
42
+ const authClient = sdk_manager_service_1.SdkManager.instance.getAuth();
43
+ const securityDetails = await authClient.securityDetails(email).catch((error) => {
44
+ throw new Error(error.message ?? 'Login error');
45
+ });
46
+ return securityDetails.tfaEnabled;
47
+ };
48
+ getUser = async () => {
49
+ const usersClient = sdk_manager_service_1.SdkManager.instance.getUsers();
50
+ const { user } = await usersClient.refreshUser();
51
+ return user;
52
+ };
53
+ 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');
61
+ }
62
+ if (!newToken) {
63
+ throw new Error('New Auth token not found, please login again');
64
+ }
65
+ if (!mnemonic) {
66
+ throw new Error('Mnemonic not found, please login again');
67
+ }
68
+ if (!validation_service_1.ValidationService.instance.validateMnemonic(mnemonic)) {
69
+ throw new Error('Mnemonic is not valid, please login again');
70
+ }
71
+ return {
72
+ token,
73
+ newToken,
74
+ mnemonic,
75
+ user: loginCredentials.user,
76
+ };
77
+ };
78
+ }
79
+ exports.AuthService = AuthService;
@@ -0,0 +1,19 @@
1
+ import { ConfigKeys } from '../types/config.types';
2
+ import { CLICredentials } from '../types/command.types';
3
+ export declare class ConfigService {
4
+ static readonly INTERNXT_CLI_DATA_DIR: string;
5
+ static readonly INTERNXT_CLI_LOGS_DIR: string;
6
+ static readonly INTERNXT_TMP_DIR: string;
7
+ static readonly CREDENTIALS_FILE: string;
8
+ static readonly DRIVE_SQLITE_FILE: string;
9
+ static readonly WEBDAV_SSL_CERTS_DIR: string;
10
+ static readonly WEBDAV_LOCAL_URL = "webdav.local.internxt.com";
11
+ static readonly instance: ConfigService;
12
+ get: (key: keyof ConfigKeys) => string;
13
+ saveUser: (loginCredentials: CLICredentials) => Promise<void>;
14
+ clearUser: () => Promise<void>;
15
+ readUser: () => Promise<CLICredentials | undefined>;
16
+ ensureInternxtCliDataDirExists: () => Promise<void>;
17
+ ensureWebdavCertsDirExists: () => Promise<void>;
18
+ ensureInternxtLogsDirExists: () => Promise<void>;
19
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ConfigService = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const promises_1 = __importDefault(require("fs/promises"));
10
+ const crypto_service_1 = require("./crypto.service");
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');
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_LOCAL_URL = 'webdav.local.internxt.com';
19
+ static instance = new ConfigService();
20
+ get = (key) => {
21
+ const value = process.env[key];
22
+ if (!value)
23
+ throw new Error(`Config key ${key} was not found in process.env`);
24
+ return value;
25
+ };
26
+ saveUser = async (loginCredentials) => {
27
+ await this.ensureInternxtCliDataDirExists();
28
+ const credentialsString = JSON.stringify(loginCredentials);
29
+ const encryptedCredentials = crypto_service_1.CryptoService.instance.encryptText(credentialsString);
30
+ await promises_1.default.writeFile(ConfigService.CREDENTIALS_FILE, encryptedCredentials, 'utf8');
31
+ };
32
+ clearUser = async () => {
33
+ const stat = await promises_1.default.stat(ConfigService.CREDENTIALS_FILE);
34
+ if (stat.size === 0)
35
+ throw new Error('Credentials file is already empty');
36
+ return promises_1.default.writeFile(ConfigService.CREDENTIALS_FILE, '', 'utf8');
37
+ };
38
+ readUser = async () => {
39
+ try {
40
+ const encryptedCredentials = await promises_1.default.readFile(ConfigService.CREDENTIALS_FILE, 'utf8');
41
+ const credentialsString = crypto_service_1.CryptoService.instance.decryptText(encryptedCredentials);
42
+ const loginCredentials = JSON.parse(credentialsString, (key, value) => {
43
+ if (typeof value === 'string' && key === 'createdAt') {
44
+ return new Date(value);
45
+ }
46
+ return value;
47
+ });
48
+ return loginCredentials;
49
+ }
50
+ catch {
51
+ return;
52
+ }
53
+ };
54
+ ensureInternxtCliDataDirExists = async () => {
55
+ try {
56
+ await promises_1.default.access(ConfigService.INTERNXT_CLI_DATA_DIR);
57
+ }
58
+ catch {
59
+ await promises_1.default.mkdir(ConfigService.INTERNXT_CLI_DATA_DIR);
60
+ }
61
+ };
62
+ ensureWebdavCertsDirExists = async () => {
63
+ try {
64
+ await promises_1.default.access(ConfigService.WEBDAV_SSL_CERTS_DIR);
65
+ }
66
+ catch {
67
+ await promises_1.default.mkdir(ConfigService.WEBDAV_SSL_CERTS_DIR);
68
+ }
69
+ };
70
+ ensureInternxtLogsDirExists = async () => {
71
+ try {
72
+ await promises_1.default.access(ConfigService.INTERNXT_CLI_LOGS_DIR);
73
+ }
74
+ catch {
75
+ await promises_1.default.mkdir(ConfigService.INTERNXT_CLI_LOGS_DIR);
76
+ }
77
+ };
78
+ }
79
+ exports.ConfigService = ConfigService;
@@ -0,0 +1,22 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { CryptoProvider } from '@internxt/sdk';
4
+ import { Transform } from 'stream';
5
+ export declare class CryptoService {
6
+ static readonly instance: CryptoService;
7
+ static readonly cryptoProvider: CryptoProvider;
8
+ passToHash: (passObject: {
9
+ password: string;
10
+ salt?: string | null;
11
+ }) => {
12
+ salt: string;
13
+ hash: string;
14
+ };
15
+ encryptText: (textToEncrypt: string) => string;
16
+ decryptText: (encryptedText: string) => string;
17
+ encryptTextWithKey: (textToEncrypt: string, secret: string) => string;
18
+ decryptTextWithKey: (encryptedText: string, secret: string) => string;
19
+ decryptStream(inputSlices: ReadableStream<Uint8Array>[], key: Buffer, iv: Buffer): Promise<ReadableStream<any>>;
20
+ getEncryptionTransform(key: Buffer, iv: Buffer): Promise<Transform>;
21
+ private getKeyAndIvFrom;
22
+ }