@internxt/cli 1.6.1 → 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +410 -71
- package/dist/commands/add-cert.d.ts +1 -1
- package/dist/commands/add-cert.js +3 -3
- package/dist/commands/config.d.ts +7 -1
- package/dist/commands/config.js +36 -5
- package/dist/commands/create-folder.d.ts +2 -1
- package/dist/commands/create-folder.js +10 -7
- package/dist/commands/delete-permanently-file.d.ts +1 -0
- package/dist/commands/delete-permanently-folder.d.ts +1 -0
- package/dist/commands/download-file.d.ts +1 -0
- package/dist/commands/download-file.js +4 -2
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.js +2 -4
- package/dist/commands/login-legacy.d.ts +1 -0
- package/dist/commands/logs.js +3 -3
- package/dist/commands/move-file.d.ts +1 -1
- package/dist/commands/move-file.js +7 -21
- package/dist/commands/move-folder.d.ts +1 -1
- package/dist/commands/move-folder.js +7 -21
- package/dist/commands/rename-file.d.ts +1 -0
- package/dist/commands/rename-folder.d.ts +1 -0
- package/dist/commands/trash-clear.d.ts +1 -0
- package/dist/commands/trash-file.d.ts +1 -0
- package/dist/commands/trash-folder.d.ts +1 -0
- package/dist/commands/trash-restore-file.d.ts +1 -1
- package/dist/commands/trash-restore-file.js +7 -21
- package/dist/commands/trash-restore-folder.d.ts +1 -1
- package/dist/commands/trash-restore-folder.js +7 -21
- package/dist/commands/upload-file.d.ts +5 -6
- package/dist/commands/upload-file.js +77 -52
- package/dist/commands/upload-folder.d.ts +1 -0
- package/dist/commands/upload-folder.js +11 -6
- package/dist/commands/webdav-config.d.ts +19 -1
- package/dist/commands/webdav-config.js +81 -3
- package/dist/commands/webdav.d.ts +1 -1
- package/dist/commands/webdav.js +10 -5
- package/dist/commands/whoami.js +2 -1
- package/dist/commands/workspaces-list.d.ts +20 -0
- package/dist/commands/workspaces-list.js +67 -0
- package/dist/commands/workspaces-unset.d.ts +23 -0
- package/dist/commands/workspaces-unset.js +45 -0
- package/dist/commands/workspaces-use.d.ts +27 -0
- package/dist/commands/workspaces-use.js +113 -0
- package/dist/constants/configs.d.ts +13 -0
- package/dist/constants/configs.js +21 -0
- package/dist/hooks/prerun/auth_check.js +13 -4
- package/dist/services/auth.service.d.ts +5 -2
- package/dist/services/auth.service.js +68 -6
- package/dist/services/config.service.d.ts +1 -13
- package/dist/services/config.service.js +44 -41
- package/dist/services/crypto.service.d.ts +5 -0
- package/dist/services/crypto.service.js +43 -0
- package/dist/services/database/database.service.d.ts +9 -0
- package/dist/services/database/database.service.js +39 -0
- package/dist/services/database/drive-file/drive-file.attributes.d.ts +3 -6
- package/dist/services/database/drive-file/drive-file.domain.d.ts +3 -6
- package/dist/services/database/drive-file/drive-file.domain.js +1 -12
- package/dist/services/database/drive-file/drive-file.model.d.ts +15 -0
- package/dist/services/database/drive-file/drive-file.model.js +67 -0
- package/dist/services/database/drive-file/drive-file.repository.d.ts +11 -0
- package/dist/services/database/drive-file/drive-file.repository.js +63 -0
- package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +3 -4
- package/dist/services/database/drive-folder/drive-folder.domain.d.ts +4 -5
- package/dist/services/database/drive-folder/drive-folder.domain.js +11 -15
- package/dist/services/database/drive-folder/drive-folder.model.d.ts +11 -0
- package/dist/services/database/drive-folder/drive-folder.model.js +51 -0
- package/dist/services/database/drive-folder/drive-folder.repository.d.ts +13 -0
- package/dist/services/database/drive-folder/drive-folder.repository.js +99 -0
- package/dist/services/drive/drive-file.service.d.ts +2 -0
- package/dist/services/drive/drive-file.service.js +71 -15
- package/dist/services/drive/drive-folder.service.d.ts +6 -1
- package/dist/services/drive/drive-folder.service.js +157 -31
- package/dist/services/drive/trash.service.d.ts +3 -0
- package/dist/services/drive/trash.service.js +52 -16
- package/dist/services/drive/workspace.service.d.ts +7 -0
- package/dist/services/drive/workspace.service.js +30 -0
- package/dist/services/keys.service.d.ts +7 -0
- package/dist/services/keys.service.js +55 -0
- package/dist/services/local-filesystem/local-filesystem.service.d.ts +2 -2
- package/dist/services/local-filesystem/local-filesystem.service.js +4 -4
- package/dist/services/network/download.service.d.ts +2 -2
- package/dist/services/network/download.service.js +2 -2
- package/dist/services/network/network-facade.service.d.ts +3 -7
- package/dist/services/network/network-facade.service.js +9 -11
- package/dist/services/network/upload/upload-facade.service.d.ts +1 -1
- package/dist/services/network/upload/upload-facade.service.js +15 -8
- package/dist/services/network/upload/upload-file.service.d.ts +5 -4
- package/dist/services/network/upload/upload-file.service.js +73 -41
- package/dist/services/network/upload/upload-folder.service.d.ts +2 -2
- package/dist/services/network/upload/upload-folder.service.js +15 -10
- package/dist/services/network/upload/upload.types.d.ts +13 -2
- package/dist/services/network/upload/upload.types.js +1 -1
- package/dist/services/sdk-manager.service.d.ts +11 -9
- package/dist/services/sdk-manager.service.js +29 -15
- package/dist/services/thumbnail.service.d.ts +19 -1
- package/dist/services/thumbnail.service.js +29 -2
- package/dist/services/universal-link.service.d.ts +3 -1
- package/dist/services/universal-link.service.js +15 -3
- package/dist/services/usage.service.d.ts +1 -2
- package/dist/services/usage.service.js +1 -1
- package/dist/services/validation.service.d.ts +5 -0
- package/dist/services/validation.service.js +36 -22
- package/dist/{webdav/services → services/webdav}/webdav-folder.service.d.ts +1 -7
- package/dist/{webdav/services → services/webdav}/webdav-folder.service.js +6 -10
- package/dist/types/command.types.d.ts +44 -1
- package/dist/types/command.types.js +29 -1
- package/dist/types/config.types.d.ts +1 -0
- package/dist/types/drive.types.d.ts +7 -6
- package/dist/types/network.types.d.ts +6 -0
- package/dist/utils/async.utils.d.ts +2 -1
- package/dist/utils/async.utils.js +13 -2
- package/dist/utils/cli.utils.d.ts +23 -15
- package/dist/utils/cli.utils.js +85 -21
- package/dist/utils/crypto.utils.d.ts +3 -1
- package/dist/utils/crypto.utils.js +15 -2
- package/dist/utils/database.utils.d.ts +11 -0
- package/dist/utils/database.utils.js +26 -0
- package/dist/utils/drive.utils.js +7 -10
- package/dist/utils/errors.utils.d.ts +4 -3
- package/dist/utils/errors.utils.js +16 -13
- package/dist/utils/format.utils.d.ts +1 -0
- package/dist/utils/format.utils.js +3 -0
- package/dist/utils/inquirer.utils.js +10 -1
- package/dist/utils/logger.utils.js +5 -5
- package/dist/utils/network.utils.js +17 -18
- package/dist/utils/path.utils.d.ts +7 -0
- package/dist/utils/path.utils.js +18 -0
- package/dist/utils/thumbnail.utils.d.ts +6 -20
- package/dist/utils/thumbnail.utils.js +20 -45
- package/dist/utils/webdav.utils.d.ts +4 -20
- package/dist/utils/webdav.utils.js +12 -14
- package/dist/utils/xml.utils.d.ts +1 -1
- package/dist/utils/xml.utils.js +1 -1
- package/dist/webdav/handlers/DELETE.handler.d.ts +0 -9
- package/dist/webdav/handlers/DELETE.handler.js +18 -16
- package/dist/webdav/handlers/GET.handler.d.ts +0 -13
- package/dist/webdav/handlers/GET.handler.js +6 -13
- package/dist/webdav/handlers/HEAD.handler.d.ts +0 -5
- package/dist/webdav/handlers/HEAD.handler.js +11 -23
- package/dist/webdav/handlers/MKCOL.handler.d.ts +0 -7
- package/dist/webdav/handlers/MKCOL.handler.js +5 -12
- package/dist/webdav/handlers/MOVE.handler.d.ts +0 -9
- package/dist/webdav/handlers/MOVE.handler.js +10 -16
- package/dist/webdav/handlers/PROPFIND.handler.d.ts +0 -7
- package/dist/webdav/handlers/PROPFIND.handler.js +7 -19
- package/dist/webdav/handlers/PUT.handler.d.ts +0 -15
- package/dist/webdav/handlers/PUT.handler.js +70 -57
- package/dist/webdav/index.js +6 -8
- package/dist/webdav/middewares/auth.middleware.d.ts +1 -2
- package/dist/webdav/middewares/auth.middleware.js +5 -4
- package/dist/webdav/middewares/errors.middleware.js +3 -3
- package/dist/webdav/middewares/webdav-auth.middleware.d.ts +3 -0
- package/dist/webdav/middewares/webdav-auth.middleware.js +44 -0
- package/dist/webdav/webdav-server.d.ts +3 -16
- package/dist/webdav/webdav-server.js +33 -91
- package/oclif.manifest.json +429 -6
- package/package.json +27 -22
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { Workspace } from '../types/command.types';
|
|
3
|
+
export default class WorkspacesUse extends Command {
|
|
4
|
+
static readonly args: {};
|
|
5
|
+
static readonly description: string;
|
|
6
|
+
static readonly aliases: string[];
|
|
7
|
+
static readonly examples: string[];
|
|
8
|
+
static readonly flags: {
|
|
9
|
+
id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
personal: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
'non-interactive': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
12
|
+
debug: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
|
+
};
|
|
14
|
+
static readonly enableJsonFlag = true;
|
|
15
|
+
run: () => Promise<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
message: string;
|
|
18
|
+
} | {
|
|
19
|
+
success: boolean;
|
|
20
|
+
workspace: Workspace;
|
|
21
|
+
}>;
|
|
22
|
+
catch: (error: Error) => Promise<never>;
|
|
23
|
+
private getWorkspaceUuid;
|
|
24
|
+
private extractUuidFromWorkspaceString;
|
|
25
|
+
private getWorkspace;
|
|
26
|
+
private setWorkspace;
|
|
27
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
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 config_service_1 = require("../services/config.service");
|
|
8
|
+
const cli_utils_1 = require("../utils/cli.utils");
|
|
9
|
+
const command_types_1 = require("../types/command.types");
|
|
10
|
+
const workspace_service_1 = require("../services/drive/workspace.service");
|
|
11
|
+
const format_utils_1 = require("../utils/format.utils");
|
|
12
|
+
const validation_service_1 = require("../services/validation.service");
|
|
13
|
+
const sdk_manager_service_1 = require("../services/sdk-manager.service");
|
|
14
|
+
const workspaces_unset_1 = __importDefault(require("./workspaces-unset"));
|
|
15
|
+
const database_service_1 = require("../services/database/database.service");
|
|
16
|
+
class WorkspacesUse extends core_1.Command {
|
|
17
|
+
static args = {};
|
|
18
|
+
static description = 'Set the active workspace context for the current user session. ' +
|
|
19
|
+
'Once a workspace is selected, WebDAV and all of the subsequent CLI commands ' +
|
|
20
|
+
'will operate within that workspace until it is changed or unset.';
|
|
21
|
+
static aliases = ['workspaces:use'];
|
|
22
|
+
static examples = ['<%= config.bin %> <%= command.id %>'];
|
|
23
|
+
static flags = {
|
|
24
|
+
...cli_utils_1.CLIUtils.CommonFlags,
|
|
25
|
+
id: core_1.Flags.string({
|
|
26
|
+
char: 'i',
|
|
27
|
+
description: 'The id of the workspace to activate. ' +
|
|
28
|
+
'Use <%= config.bin %> workspaces list to view your available workspace ids.',
|
|
29
|
+
required: false,
|
|
30
|
+
exclusive: ['personal'],
|
|
31
|
+
}),
|
|
32
|
+
personal: core_1.Flags.boolean({
|
|
33
|
+
char: 'p',
|
|
34
|
+
description: 'Change to the personal drive space. It unsets the active workspace context for the current user session.',
|
|
35
|
+
required: false,
|
|
36
|
+
}),
|
|
37
|
+
};
|
|
38
|
+
static enableJsonFlag = true;
|
|
39
|
+
run = async () => {
|
|
40
|
+
const { flags } = await this.parse(WorkspacesUse);
|
|
41
|
+
const nonInteractive = flags['non-interactive'];
|
|
42
|
+
const userCredentials = await config_service_1.ConfigService.instance.readUser();
|
|
43
|
+
if (!userCredentials)
|
|
44
|
+
throw new command_types_1.MissingCredentialsError();
|
|
45
|
+
const reporter = this.log.bind(this);
|
|
46
|
+
if (flags['personal']) {
|
|
47
|
+
return workspaces_unset_1.default.unsetWorkspace(userCredentials, reporter);
|
|
48
|
+
}
|
|
49
|
+
const workspace = await this.getWorkspace(userCredentials, flags['id'], nonInteractive, reporter);
|
|
50
|
+
await this.setWorkspace(userCredentials, workspace);
|
|
51
|
+
const message = `Workspace ${workspace.workspaceCredentials.id} selected successfully. Now WebDAV and ` +
|
|
52
|
+
'all of the CLI commands will operate within this workspace until it is changed or unset.';
|
|
53
|
+
cli_utils_1.CLIUtils.success(reporter, message);
|
|
54
|
+
return { success: true, workspace };
|
|
55
|
+
};
|
|
56
|
+
catch = async (error) => {
|
|
57
|
+
const { flags } = await this.parse(WorkspacesUse);
|
|
58
|
+
cli_utils_1.CLIUtils.catchError({
|
|
59
|
+
error,
|
|
60
|
+
command: this.id,
|
|
61
|
+
logReporter: this.log.bind(this),
|
|
62
|
+
jsonFlag: flags['json'],
|
|
63
|
+
});
|
|
64
|
+
this.exit(1);
|
|
65
|
+
};
|
|
66
|
+
getWorkspaceUuid = async (workspaceUuidFlag, availableWorkspaces, nonInteractive, reporter) => {
|
|
67
|
+
const workspaceUuid = await cli_utils_1.CLIUtils.getValueFromFlag({
|
|
68
|
+
value: workspaceUuidFlag ? `[${workspaceUuidFlag}]` : undefined,
|
|
69
|
+
name: WorkspacesUse.flags['id'].name,
|
|
70
|
+
}, {
|
|
71
|
+
nonInteractive,
|
|
72
|
+
prompt: {
|
|
73
|
+
message: 'What is the workspace you want to use?',
|
|
74
|
+
options: {
|
|
75
|
+
type: 'list',
|
|
76
|
+
choices: { values: availableWorkspaces },
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
}, {
|
|
80
|
+
validate: (value) => validation_service_1.ValidationService.instance.validateUUIDv4(this.extractUuidFromWorkspaceString(value)),
|
|
81
|
+
error: new command_types_1.NotValidWorkspaceUuidError(),
|
|
82
|
+
}, reporter);
|
|
83
|
+
return this.extractUuidFromWorkspaceString(workspaceUuid);
|
|
84
|
+
};
|
|
85
|
+
extractUuidFromWorkspaceString = (workspaceString) => workspaceString.match(/\[(.*?)\]/)?.[1] ?? workspaceString;
|
|
86
|
+
getWorkspace = async (userCredentials, workspaceUuidFlag, nonInteractive, reporter) => {
|
|
87
|
+
const workspaces = await workspace_service_1.WorkspaceService.instance.getAvailableWorkspaces(userCredentials.user);
|
|
88
|
+
const availableWorkspaces = workspaces.map((workspaceData) => {
|
|
89
|
+
const name = workspaceData.workspace.name;
|
|
90
|
+
const id = workspaceData.workspace.id;
|
|
91
|
+
const totalUsedSpace = Number(workspaceData.workspaceUser?.driveUsage ?? 0) + Number(workspaceData.workspaceUser?.backupsUsage ?? 0);
|
|
92
|
+
const spaceLimit = Number(workspaceData.workspaceUser?.spaceLimit ?? 0);
|
|
93
|
+
const usedSpace = format_utils_1.FormatUtils.humanFileSize(totalUsedSpace);
|
|
94
|
+
const availableSpace = format_utils_1.FormatUtils.formatLimit(spaceLimit);
|
|
95
|
+
return `[${id}] Name: ${name} | Used Space: ${usedSpace} | Available Space: ${availableSpace}`;
|
|
96
|
+
});
|
|
97
|
+
const workspaceUuid = await this.getWorkspaceUuid(workspaceUuidFlag, availableWorkspaces, nonInteractive, reporter);
|
|
98
|
+
const workspaceCredentials = await workspace_service_1.WorkspaceService.instance.getWorkspaceCredentials(workspaceUuid);
|
|
99
|
+
const selectedWorkspace = workspaces.find((workspace) => workspace.workspace.id === workspaceUuid);
|
|
100
|
+
if (!selectedWorkspace)
|
|
101
|
+
throw new command_types_1.NotValidWorkspaceUuidError();
|
|
102
|
+
return { workspaceCredentials, workspaceData: selectedWorkspace };
|
|
103
|
+
};
|
|
104
|
+
setWorkspace = async (userCredentials, workspace) => {
|
|
105
|
+
sdk_manager_service_1.SdkManager.init({ token: userCredentials.token, workspaceToken: workspace.workspaceCredentials.token });
|
|
106
|
+
await config_service_1.ConfigService.instance.saveUser({
|
|
107
|
+
...userCredentials,
|
|
108
|
+
workspace,
|
|
109
|
+
});
|
|
110
|
+
void database_service_1.DatabaseService.instance.clear();
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
exports.default = WorkspacesUse;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const INTERNXT_CLI_DATA_DIR: string;
|
|
2
|
+
export declare const INTERNXT_CLI_LOGS_DIR: string;
|
|
3
|
+
export declare const CREDENTIALS_FILE: string;
|
|
4
|
+
export declare const DRIVE_SQLITE_FILE: string;
|
|
5
|
+
export declare const WEBDAV_SSL_CERTS_DIR: string;
|
|
6
|
+
export declare const WEBDAV_CONFIGS_FILE: string;
|
|
7
|
+
export declare const WEBDAV_DEFAULT_HOST = "127.0.0.1";
|
|
8
|
+
export declare const WEBDAV_DEFAULT_PORT = "3005";
|
|
9
|
+
export declare const WEBDAV_DEFAULT_PROTOCOL = "https";
|
|
10
|
+
export declare const WEBDAV_DEFAULT_TIMEOUT = 0;
|
|
11
|
+
export declare const WEBDAV_DEFAULT_CREATE_FULL_PATH = true;
|
|
12
|
+
export declare const WEBDAV_DEFAULT_CUSTOM_AUTH = false;
|
|
13
|
+
export declare const WEBDAV_DEFAULT_DELETE_FILES_PERMANENTLY = false;
|
|
@@ -0,0 +1,21 @@
|
|
|
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.WEBDAV_DEFAULT_DELETE_FILES_PERMANENTLY = exports.WEBDAV_DEFAULT_CUSTOM_AUTH = exports.WEBDAV_DEFAULT_CREATE_FULL_PATH = exports.WEBDAV_DEFAULT_TIMEOUT = exports.WEBDAV_DEFAULT_PROTOCOL = exports.WEBDAV_DEFAULT_PORT = exports.WEBDAV_DEFAULT_HOST = exports.WEBDAV_CONFIGS_FILE = exports.WEBDAV_SSL_CERTS_DIR = exports.DRIVE_SQLITE_FILE = exports.CREDENTIALS_FILE = exports.INTERNXT_CLI_LOGS_DIR = exports.INTERNXT_CLI_DATA_DIR = void 0;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
+
exports.INTERNXT_CLI_DATA_DIR = node_path_1.default.join(node_os_1.default.homedir(), '.internxt-cli');
|
|
10
|
+
exports.INTERNXT_CLI_LOGS_DIR = node_path_1.default.join(exports.INTERNXT_CLI_DATA_DIR, 'logs');
|
|
11
|
+
exports.CREDENTIALS_FILE = node_path_1.default.join(exports.INTERNXT_CLI_DATA_DIR, '.inxtcli');
|
|
12
|
+
exports.DRIVE_SQLITE_FILE = node_path_1.default.join(exports.INTERNXT_CLI_DATA_DIR, 'internxt-cli-drive.db');
|
|
13
|
+
exports.WEBDAV_SSL_CERTS_DIR = node_path_1.default.join(exports.INTERNXT_CLI_DATA_DIR, 'certs');
|
|
14
|
+
exports.WEBDAV_CONFIGS_FILE = node_path_1.default.join(exports.INTERNXT_CLI_DATA_DIR, 'config.webdav.inxt');
|
|
15
|
+
exports.WEBDAV_DEFAULT_HOST = '127.0.0.1';
|
|
16
|
+
exports.WEBDAV_DEFAULT_PORT = '3005';
|
|
17
|
+
exports.WEBDAV_DEFAULT_PROTOCOL = 'https';
|
|
18
|
+
exports.WEBDAV_DEFAULT_TIMEOUT = 0;
|
|
19
|
+
exports.WEBDAV_DEFAULT_CREATE_FULL_PATH = true;
|
|
20
|
+
exports.WEBDAV_DEFAULT_CUSTOM_AUTH = false;
|
|
21
|
+
exports.WEBDAV_DEFAULT_DELETE_FILES_PERMANENTLY = false;
|
|
@@ -13,17 +13,26 @@ const sdk_manager_service_1 = require("../../services/sdk-manager.service");
|
|
|
13
13
|
const auth_service_1 = require("../../services/auth.service");
|
|
14
14
|
const webdav_1 = __importDefault(require("../../commands/webdav"));
|
|
15
15
|
const webdav_config_1 = __importDefault(require("../../commands/webdav-config"));
|
|
16
|
-
const
|
|
16
|
+
const database_service_1 = require("../../services/database/database.service");
|
|
17
|
+
const Autocomplete = {
|
|
18
|
+
name: 'autocomplete',
|
|
19
|
+
id: 'autocomplete',
|
|
20
|
+
};
|
|
21
|
+
const CommandsToSkip = [whoami_1.default, login_1.default, login_legacy_1.default, logout_1.default, logs_1.default, webdav_1.default, webdav_config_1.default, Autocomplete];
|
|
17
22
|
const hook = async function (opts) {
|
|
18
23
|
const { Command, argv } = opts;
|
|
19
24
|
const jsonFlag = argv.includes('--json');
|
|
20
|
-
|
|
25
|
+
const commandsToSkipNames = CommandsToSkip.map((command) => command.name?.toLowerCase()).filter(Boolean);
|
|
26
|
+
const commandsToSkipIds = CommandsToSkip.map((command) => command.id?.toLowerCase()).filter(Boolean);
|
|
27
|
+
if (!commandsToSkipNames.includes(Command.name?.toLowerCase()) &&
|
|
28
|
+
!commandsToSkipIds.includes(Command.id?.toLowerCase())) {
|
|
21
29
|
cli_utils_1.CLIUtils.doing('Checking credentials', jsonFlag);
|
|
22
30
|
try {
|
|
23
|
-
const { token } = await auth_service_1.AuthService.instance.getAuthDetails();
|
|
24
|
-
sdk_manager_service_1.SdkManager.init({ token });
|
|
31
|
+
const { token, workspace } = await auth_service_1.AuthService.instance.getAuthDetails();
|
|
32
|
+
sdk_manager_service_1.SdkManager.init({ token, workspaceToken: workspace?.workspaceCredentials.token });
|
|
25
33
|
cli_utils_1.CLIUtils.done(jsonFlag);
|
|
26
34
|
cli_utils_1.CLIUtils.clearPreviousLine(jsonFlag);
|
|
35
|
+
await database_service_1.DatabaseService.instance.initialize();
|
|
27
36
|
}
|
|
28
37
|
catch (error) {
|
|
29
38
|
const err = error;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { LoginCredentials } from '../types/command.types';
|
|
1
|
+
import { LoginCredentials, Workspace } from '../types/command.types';
|
|
2
2
|
export declare class AuthService {
|
|
3
3
|
static readonly instance: AuthService;
|
|
4
4
|
doLogin: (email: string, password: string, twoFactorCode?: string) => Promise<LoginCredentials>;
|
|
5
5
|
is2FANeeded: (email: string) => Promise<boolean>;
|
|
6
6
|
getAuthDetails: () => Promise<LoginCredentials>;
|
|
7
|
-
refreshUserToken: (oldToken: string, mnemonic: string) => Promise<LoginCredentials>;
|
|
7
|
+
refreshUserToken: (oldToken: string, mnemonic: string, privateKey: string) => Promise<LoginCredentials>;
|
|
8
|
+
refreshWorkspaceCredentials: (loginCreds: LoginCredentials) => Promise<Workspace | undefined>;
|
|
9
|
+
getCurrentWorkspace: () => Promise<Workspace | undefined>;
|
|
10
|
+
getCurrentRootFolder: () => Promise<string>;
|
|
8
11
|
logout: () => Promise<void>;
|
|
9
12
|
}
|
|
@@ -6,6 +6,7 @@ const crypto_service_1 = require("./crypto.service");
|
|
|
6
6
|
const config_service_1 = require("./config.service");
|
|
7
7
|
const command_types_1 = require("../types/command.types");
|
|
8
8
|
const validation_service_1 = require("./validation.service");
|
|
9
|
+
const workspace_service_1 = require("./drive/workspace.service");
|
|
9
10
|
class AuthService {
|
|
10
11
|
static instance = new AuthService();
|
|
11
12
|
doLogin = async (email, password, twoFactorCode) => {
|
|
@@ -18,6 +19,11 @@ class AuthService {
|
|
|
18
19
|
const data = await authClient.loginAccess(loginDetails, crypto_service_1.CryptoService.cryptoProvider);
|
|
19
20
|
const { user, newToken } = data;
|
|
20
21
|
const clearMnemonic = crypto_service_1.CryptoService.instance.decryptTextWithKey(user.mnemonic, password);
|
|
22
|
+
const clearPrivateKey = Buffer.from(crypto_service_1.CryptoService.instance.decryptPrivateKey(user.keys.ecc.privateKey, password)).toString('base64');
|
|
23
|
+
user.keys.ecc.privateKey = clearPrivateKey;
|
|
24
|
+
if (user.keys?.kyber?.privateKey) {
|
|
25
|
+
user.keys.kyber.privateKey = Buffer.from(crypto_service_1.CryptoService.instance.decryptPrivateKey(user.keys.kyber.privateKey, password)).toString('base64');
|
|
26
|
+
}
|
|
21
27
|
const clearUser = {
|
|
22
28
|
...user,
|
|
23
29
|
mnemonic: clearMnemonic,
|
|
@@ -47,13 +53,22 @@ class AuthService {
|
|
|
47
53
|
if (tokenDetails.expiration.expired) {
|
|
48
54
|
throw new command_types_1.ExpiredCredentialsError();
|
|
49
55
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
if (tokenDetails.expiration.refreshRequired) {
|
|
57
|
+
try {
|
|
58
|
+
loginCreds = await this.refreshUserToken(loginCreds.token, loginCreds.user.mnemonic, loginCreds.user.keys.ecc.privateKey);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
await config_service_1.ConfigService.instance.clearUser();
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
53
64
|
}
|
|
65
|
+
const workspaceCreds = await this.refreshWorkspaceCredentials(loginCreds);
|
|
66
|
+
loginCreds.workspace = workspaceCreds;
|
|
67
|
+
sdk_manager_service_1.SdkManager.init({ token: loginCreds.token, workspaceToken: workspaceCreds?.workspaceCredentials.token });
|
|
68
|
+
await config_service_1.ConfigService.instance.saveUser(loginCreds);
|
|
54
69
|
return loginCreds;
|
|
55
70
|
};
|
|
56
|
-
refreshUserToken = async (oldToken, mnemonic) => {
|
|
71
|
+
refreshUserToken = async (oldToken, mnemonic, privateKey) => {
|
|
57
72
|
sdk_manager_service_1.SdkManager.init({ token: oldToken });
|
|
58
73
|
const isValidMnemonic = validation_service_1.ValidationService.instance.validateMnemonic(mnemonic);
|
|
59
74
|
if (!isValidMnemonic) {
|
|
@@ -66,16 +81,63 @@ class AuthService {
|
|
|
66
81
|
user: {
|
|
67
82
|
...newCreds.user,
|
|
68
83
|
mnemonic: mnemonic,
|
|
84
|
+
keys: {
|
|
85
|
+
ecc: {
|
|
86
|
+
privateKey: privateKey,
|
|
87
|
+
publicKey: newCreds.user.keys.ecc.publicKey,
|
|
88
|
+
},
|
|
89
|
+
kyber: {
|
|
90
|
+
privateKey: newCreds.user.keys.kyber.privateKey,
|
|
91
|
+
publicKey: newCreds.user.keys.kyber.publicKey,
|
|
92
|
+
},
|
|
93
|
+
},
|
|
69
94
|
},
|
|
70
95
|
token: newCreds.newToken,
|
|
71
96
|
};
|
|
72
|
-
await config_service_1.ConfigService.instance.saveUser(newLoginCreds);
|
|
73
97
|
return newLoginCreds;
|
|
74
98
|
};
|
|
99
|
+
refreshWorkspaceCredentials = async (loginCreds) => {
|
|
100
|
+
if (loginCreds.workspace?.workspaceCredentials && loginCreds.workspace?.workspaceData) {
|
|
101
|
+
const workspaceToken = loginCreds.workspace.workspaceCredentials.token;
|
|
102
|
+
const workspaceUuid = loginCreds.workspace.workspaceCredentials.id;
|
|
103
|
+
const workspaceTokenDetails = validation_service_1.ValidationService.instance.validateTokenAndCheckExpiration(workspaceToken);
|
|
104
|
+
if (!workspaceTokenDetails.isValid) {
|
|
105
|
+
throw new command_types_1.InvalidCredentialsError();
|
|
106
|
+
}
|
|
107
|
+
if (workspaceTokenDetails.expiration.expired) {
|
|
108
|
+
throw new command_types_1.ExpiredCredentialsError();
|
|
109
|
+
}
|
|
110
|
+
if (workspaceTokenDetails.expiration.refreshRequired) {
|
|
111
|
+
sdk_manager_service_1.SdkManager.init({ token: loginCreds.token, workspaceToken: loginCreds.workspace.workspaceCredentials.token });
|
|
112
|
+
const workspaceCredentials = await workspace_service_1.WorkspaceService.instance.getWorkspaceCredentials(workspaceUuid);
|
|
113
|
+
return {
|
|
114
|
+
workspaceCredentials,
|
|
115
|
+
workspaceData: loginCreds.workspace.workspaceData,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
return loginCreds.workspace;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
getCurrentWorkspace = async () => {
|
|
124
|
+
const loginCreds = await config_service_1.ConfigService.instance.readUser();
|
|
125
|
+
if (!loginCreds?.token || !loginCreds?.user?.mnemonic) {
|
|
126
|
+
throw new command_types_1.MissingCredentialsError();
|
|
127
|
+
}
|
|
128
|
+
return loginCreds.workspace;
|
|
129
|
+
};
|
|
130
|
+
getCurrentRootFolder = async () => {
|
|
131
|
+
const loginCreds = await config_service_1.ConfigService.instance.readUser();
|
|
132
|
+
if (!loginCreds?.token || !loginCreds?.user?.mnemonic) {
|
|
133
|
+
throw new command_types_1.MissingCredentialsError();
|
|
134
|
+
}
|
|
135
|
+
return loginCreds.workspace?.workspaceData?.workspaceUser?.rootFolderId ?? loginCreds.user.rootFolderId;
|
|
136
|
+
};
|
|
75
137
|
logout = async () => {
|
|
76
138
|
try {
|
|
77
139
|
const user = await config_service_1.ConfigService.instance.readUser();
|
|
78
|
-
if (!user
|
|
140
|
+
if (!user?.token) {
|
|
79
141
|
return;
|
|
80
142
|
}
|
|
81
143
|
const authClient = sdk_manager_service_1.SdkManager.instance.getAuth();
|
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
import { ConfigKeys } from '../types/config.types';
|
|
2
2
|
import { LoginCredentials, WebdavConfig } from '../types/command.types';
|
|
3
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_CONFIGS_FILE: string;
|
|
11
|
-
static readonly WEBDAV_DEFAULT_HOST = "127.0.0.1";
|
|
12
|
-
static readonly WEBDAV_DEFAULT_PORT = "3005";
|
|
13
|
-
static readonly WEBDAV_DEFAULT_PROTOCOL = "https";
|
|
14
|
-
static readonly WEBDAV_DEFAULT_TIMEOUT = 0;
|
|
15
|
-
static readonly WEBDAV_DEFAULT_CREATE_FULL_PATH = true;
|
|
16
4
|
static readonly instance: ConfigService;
|
|
17
|
-
get: (key: keyof ConfigKeys) => string;
|
|
5
|
+
get: (key: keyof ConfigKeys, throwIfNotFound?: boolean) => string;
|
|
18
6
|
saveUser: (loginCredentials: LoginCredentials) => Promise<void>;
|
|
19
7
|
clearUser: () => Promise<void>;
|
|
20
8
|
readUser: () => Promise<LoginCredentials | undefined>;
|
|
@@ -4,45 +4,40 @@ 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 node_path_1 = __importDefault(require("node:path"));
|
|
8
|
-
const os_1 = __importDefault(require("os"));
|
|
9
7
|
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
10
8
|
const crypto_service_1 = require("./crypto.service");
|
|
9
|
+
const errors_utils_1 = require("../utils/errors.utils");
|
|
10
|
+
const configs_1 = require("../constants/configs");
|
|
11
11
|
class ConfigService {
|
|
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
|
-
static INTERNXT_TMP_DIR = os_1.default.tmpdir();
|
|
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
|
-
static WEBDAV_DEFAULT_HOST = '127.0.0.1';
|
|
20
|
-
static WEBDAV_DEFAULT_PORT = '3005';
|
|
21
|
-
static WEBDAV_DEFAULT_PROTOCOL = 'https';
|
|
22
|
-
static WEBDAV_DEFAULT_TIMEOUT = 0;
|
|
23
|
-
static WEBDAV_DEFAULT_CREATE_FULL_PATH = true;
|
|
24
12
|
static instance = new ConfigService();
|
|
25
|
-
get = (key) => {
|
|
13
|
+
get = (key, throwIfNotFound = true) => {
|
|
26
14
|
const value = process.env[key];
|
|
27
|
-
if (!value)
|
|
15
|
+
if (!value && throwIfNotFound)
|
|
28
16
|
throw new Error(`Config key ${key} was not found in process.env`);
|
|
29
|
-
return value;
|
|
17
|
+
return value ?? '';
|
|
30
18
|
};
|
|
31
19
|
saveUser = async (loginCredentials) => {
|
|
32
20
|
await this.ensureInternxtCliDataDirExists();
|
|
33
21
|
const credentialsString = JSON.stringify(loginCredentials);
|
|
34
22
|
const encryptedCredentials = crypto_service_1.CryptoService.instance.encryptText(credentialsString);
|
|
35
|
-
await promises_1.default.writeFile(
|
|
23
|
+
await promises_1.default.writeFile(configs_1.CREDENTIALS_FILE, encryptedCredentials, 'utf8');
|
|
36
24
|
};
|
|
37
25
|
clearUser = async () => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
26
|
+
try {
|
|
27
|
+
const stat = await promises_1.default.stat(configs_1.CREDENTIALS_FILE);
|
|
28
|
+
if (stat.size === 0)
|
|
29
|
+
return;
|
|
30
|
+
await promises_1.default.writeFile(configs_1.CREDENTIALS_FILE, '', 'utf8');
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (!errors_utils_1.ErrorUtils.isFileNotFoundError(error)) {
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
42
37
|
};
|
|
43
38
|
readUser = async () => {
|
|
44
39
|
try {
|
|
45
|
-
const encryptedCredentials = await promises_1.default.readFile(
|
|
40
|
+
const encryptedCredentials = await promises_1.default.readFile(configs_1.CREDENTIALS_FILE, 'utf8');
|
|
46
41
|
const credentialsString = crypto_service_1.CryptoService.instance.decryptText(encryptedCredentials);
|
|
47
42
|
const loginCredentials = JSON.parse(credentialsString);
|
|
48
43
|
return loginCredentials;
|
|
@@ -54,52 +49,60 @@ class ConfigService {
|
|
|
54
49
|
saveWebdavConfig = async (webdavConfig) => {
|
|
55
50
|
await this.ensureInternxtCliDataDirExists();
|
|
56
51
|
const configs = JSON.stringify(webdavConfig);
|
|
57
|
-
await promises_1.default.writeFile(
|
|
52
|
+
await promises_1.default.writeFile(configs_1.WEBDAV_CONFIGS_FILE, configs, 'utf8');
|
|
58
53
|
};
|
|
59
54
|
readWebdavConfig = async () => {
|
|
60
55
|
try {
|
|
61
|
-
const configsData = await promises_1.default.readFile(
|
|
56
|
+
const configsData = await promises_1.default.readFile(configs_1.WEBDAV_CONFIGS_FILE, 'utf8');
|
|
62
57
|
const configs = JSON.parse(configsData);
|
|
63
58
|
return {
|
|
64
|
-
host: configs?.host ??
|
|
65
|
-
port: configs?.port ??
|
|
66
|
-
protocol: configs?.protocol ??
|
|
67
|
-
timeoutMinutes: configs?.timeoutMinutes ??
|
|
68
|
-
createFullPath: configs?.createFullPath ??
|
|
59
|
+
host: configs?.host ?? configs_1.WEBDAV_DEFAULT_HOST,
|
|
60
|
+
port: configs?.port ?? configs_1.WEBDAV_DEFAULT_PORT,
|
|
61
|
+
protocol: configs?.protocol ?? configs_1.WEBDAV_DEFAULT_PROTOCOL,
|
|
62
|
+
timeoutMinutes: configs?.timeoutMinutes ?? configs_1.WEBDAV_DEFAULT_TIMEOUT,
|
|
63
|
+
createFullPath: configs?.createFullPath ?? configs_1.WEBDAV_DEFAULT_CREATE_FULL_PATH,
|
|
64
|
+
customAuth: configs?.customAuth ?? configs_1.WEBDAV_DEFAULT_CUSTOM_AUTH,
|
|
65
|
+
username: configs?.username ?? '',
|
|
66
|
+
password: configs?.password ?? '',
|
|
67
|
+
deleteFilesPermanently: configs?.deleteFilesPermanently ?? configs_1.WEBDAV_DEFAULT_DELETE_FILES_PERMANENTLY,
|
|
69
68
|
};
|
|
70
69
|
}
|
|
71
70
|
catch {
|
|
72
71
|
return {
|
|
73
|
-
host:
|
|
74
|
-
port:
|
|
75
|
-
protocol:
|
|
76
|
-
timeoutMinutes:
|
|
77
|
-
createFullPath:
|
|
72
|
+
host: configs_1.WEBDAV_DEFAULT_HOST,
|
|
73
|
+
port: configs_1.WEBDAV_DEFAULT_PORT,
|
|
74
|
+
protocol: configs_1.WEBDAV_DEFAULT_PROTOCOL,
|
|
75
|
+
timeoutMinutes: configs_1.WEBDAV_DEFAULT_TIMEOUT,
|
|
76
|
+
createFullPath: configs_1.WEBDAV_DEFAULT_CREATE_FULL_PATH,
|
|
77
|
+
customAuth: configs_1.WEBDAV_DEFAULT_CUSTOM_AUTH,
|
|
78
|
+
username: '',
|
|
79
|
+
password: '',
|
|
80
|
+
deleteFilesPermanently: configs_1.WEBDAV_DEFAULT_DELETE_FILES_PERMANENTLY,
|
|
78
81
|
};
|
|
79
82
|
}
|
|
80
83
|
};
|
|
81
84
|
ensureInternxtCliDataDirExists = async () => {
|
|
82
85
|
try {
|
|
83
|
-
await promises_1.default.access(
|
|
86
|
+
await promises_1.default.access(configs_1.INTERNXT_CLI_DATA_DIR);
|
|
84
87
|
}
|
|
85
88
|
catch {
|
|
86
|
-
await promises_1.default.mkdir(
|
|
89
|
+
await promises_1.default.mkdir(configs_1.INTERNXT_CLI_DATA_DIR);
|
|
87
90
|
}
|
|
88
91
|
};
|
|
89
92
|
ensureWebdavCertsDirExists = async () => {
|
|
90
93
|
try {
|
|
91
|
-
await promises_1.default.access(
|
|
94
|
+
await promises_1.default.access(configs_1.WEBDAV_SSL_CERTS_DIR);
|
|
92
95
|
}
|
|
93
96
|
catch {
|
|
94
|
-
await promises_1.default.mkdir(
|
|
97
|
+
await promises_1.default.mkdir(configs_1.WEBDAV_SSL_CERTS_DIR);
|
|
95
98
|
}
|
|
96
99
|
};
|
|
97
100
|
ensureInternxtLogsDirExists = async () => {
|
|
98
101
|
try {
|
|
99
|
-
await promises_1.default.access(
|
|
102
|
+
await promises_1.default.access(configs_1.INTERNXT_CLI_LOGS_DIR);
|
|
100
103
|
}
|
|
101
104
|
catch {
|
|
102
|
-
await promises_1.default.mkdir(
|
|
105
|
+
await promises_1.default.mkdir(configs_1.INTERNXT_CLI_LOGS_DIR);
|
|
103
106
|
}
|
|
104
107
|
};
|
|
105
108
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { CryptoProvider } from '@internxt/sdk';
|
|
2
|
+
import { LoginCredentials } from '../types/command.types';
|
|
3
|
+
import { WorkspaceData } from '@internxt/sdk/dist/workspaces';
|
|
2
4
|
export declare class CryptoService {
|
|
3
5
|
static readonly instance: CryptoService;
|
|
4
6
|
static readonly cryptoProvider: CryptoProvider;
|
|
@@ -15,4 +17,7 @@ export declare class CryptoService {
|
|
|
15
17
|
decryptTextWithKey: (encryptedText: string, secret: string) => string;
|
|
16
18
|
decryptStream: (inputSlices: ReadableStream<Uint8Array>[], key: Buffer, iv: Buffer, startOffsetByte?: number) => ReadableStream<any>;
|
|
17
19
|
private readonly getKeyAndIvFrom;
|
|
20
|
+
private readonly decryptWorkspaceMnemonic;
|
|
21
|
+
decryptWorkspacesMnemonic: (workspaces: WorkspaceData[], user: LoginCredentials["user"]) => Promise<WorkspaceData[]>;
|
|
22
|
+
decryptPrivateKey: (privateKey: string, password: string) => string;
|
|
18
23
|
}
|
|
@@ -5,6 +5,7 @@ const node_crypto_1 = require("node:crypto");
|
|
|
5
5
|
const keys_service_1 = require("./keys.service");
|
|
6
6
|
const config_service_1 = require("../services/config.service");
|
|
7
7
|
const stream_utils_1 = require("../utils/stream.utils");
|
|
8
|
+
const lib_1 = require("@internxt/lib");
|
|
8
9
|
class CryptoService {
|
|
9
10
|
static instance = new CryptoService();
|
|
10
11
|
static cryptoProvider = {
|
|
@@ -115,5 +116,47 @@ class CryptoService {
|
|
|
115
116
|
const iv = md5Hashes[2];
|
|
116
117
|
return { key, iv };
|
|
117
118
|
};
|
|
119
|
+
decryptWorkspaceMnemonic = async (encryptionKey, user) => {
|
|
120
|
+
const privateKeyInBase64 = user.keys?.ecc?.privateKey;
|
|
121
|
+
const privateKyberKeyInBase64 = user.keys?.kyber?.privateKey;
|
|
122
|
+
if (!privateKeyInBase64) {
|
|
123
|
+
throw new Error('Missing privateKey in user keys');
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
return await keys_service_1.KeysService.instance.hybridDecryptMessageWithPrivateKey({
|
|
127
|
+
encryptedMessageInBase64: encryptionKey,
|
|
128
|
+
privateKeyInBase64,
|
|
129
|
+
privateKyberKeyInBase64,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
throw new Error('Failed to decrypt workspace mnemonic');
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
decryptWorkspacesMnemonic = async (workspaces, user) => {
|
|
137
|
+
return await Promise.all(workspaces.map(async (workspace) => {
|
|
138
|
+
return {
|
|
139
|
+
...workspace,
|
|
140
|
+
workspaceUser: {
|
|
141
|
+
...workspace.workspaceUser,
|
|
142
|
+
key: await this.decryptWorkspaceMnemonic(workspace.workspaceUser.key, user),
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}));
|
|
146
|
+
};
|
|
147
|
+
decryptPrivateKey = (privateKey, password) => {
|
|
148
|
+
const MINIMAL_ENCRYPTED_KEY_LEN = 129;
|
|
149
|
+
if (!privateKey || privateKey.length <= MINIMAL_ENCRYPTED_KEY_LEN)
|
|
150
|
+
return '';
|
|
151
|
+
else {
|
|
152
|
+
try {
|
|
153
|
+
const result = lib_1.aes.decrypt(privateKey, password);
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
throw new Error('Private key is corrupted');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
};
|
|
118
161
|
}
|
|
119
162
|
exports.CryptoService = CryptoService;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DataSource } from 'typeorm';
|
|
2
|
+
export declare class DatabaseService {
|
|
3
|
+
static readonly instance: DatabaseService;
|
|
4
|
+
dataSource: DataSource;
|
|
5
|
+
initialize: () => Promise<DataSource>;
|
|
6
|
+
destroy: () => Promise<void>;
|
|
7
|
+
clear: () => Promise<void>;
|
|
8
|
+
drop: () => Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DatabaseService = void 0;
|
|
4
|
+
const typeorm_1 = require("typeorm");
|
|
5
|
+
const drive_file_model_1 = require("./drive-file/drive-file.model");
|
|
6
|
+
const drive_folder_model_1 = require("./drive-folder/drive-folder.model");
|
|
7
|
+
const configs_1 = require("../../constants/configs");
|
|
8
|
+
const config_service_1 = require("../config.service");
|
|
9
|
+
class DatabaseService {
|
|
10
|
+
static instance = new DatabaseService();
|
|
11
|
+
dataSource = new typeorm_1.DataSource(config_service_1.ConfigService.instance.get('NODE_ENV', false) === 'test'
|
|
12
|
+
? {
|
|
13
|
+
type: 'sqljs',
|
|
14
|
+
autoSave: false,
|
|
15
|
+
logging: false,
|
|
16
|
+
synchronize: true,
|
|
17
|
+
entities: [drive_file_model_1.DriveFileModel, drive_folder_model_1.DriveFolderModel],
|
|
18
|
+
}
|
|
19
|
+
: {
|
|
20
|
+
type: 'better-sqlite3',
|
|
21
|
+
database: configs_1.DRIVE_SQLITE_FILE,
|
|
22
|
+
logging: false,
|
|
23
|
+
synchronize: true,
|
|
24
|
+
entities: [drive_file_model_1.DriveFileModel, drive_folder_model_1.DriveFolderModel],
|
|
25
|
+
});
|
|
26
|
+
initialize = () => {
|
|
27
|
+
return this.dataSource.initialize();
|
|
28
|
+
};
|
|
29
|
+
destroy = () => {
|
|
30
|
+
return this.dataSource.destroy();
|
|
31
|
+
};
|
|
32
|
+
clear = () => {
|
|
33
|
+
return this.dataSource.synchronize(true);
|
|
34
|
+
};
|
|
35
|
+
drop = () => {
|
|
36
|
+
return this.dataSource.dropDatabase();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
exports.DatabaseService = DatabaseService;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
export interface DriveFileAttributes {
|
|
2
|
-
id: number;
|
|
3
|
-
name: string;
|
|
4
|
-
type?: string;
|
|
5
2
|
uuid: string;
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
name: string;
|
|
4
|
+
type: string | null;
|
|
5
|
+
fileId: string | null;
|
|
8
6
|
folderUuid: string;
|
|
9
7
|
bucket: string;
|
|
10
|
-
relativePath: string;
|
|
11
8
|
createdAt: Date;
|
|
12
9
|
updatedAt: Date;
|
|
13
10
|
size: number;
|