@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.
- package/.env +13 -0
- package/README.md +590 -176
- package/dist/commands/add-cert.d.ts +10 -3
- package/dist/commands/add-cert.js +24 -38
- package/dist/commands/config.d.ts +15 -12
- package/dist/commands/config.js +24 -28
- package/dist/commands/create-folder.d.ts +16 -8
- package/dist/commands/create-folder.js +67 -24
- package/dist/commands/delete-permanently-file.d.ts +18 -0
- package/dist/commands/delete-permanently-file.js +63 -0
- package/dist/commands/delete-permanently-folder.d.ts +18 -0
- package/dist/commands/delete-permanently-folder.js +63 -0
- package/dist/commands/download-file.d.ts +26 -0
- package/dist/commands/{download.js → download-file.js} +98 -56
- package/dist/commands/list.d.ts +12 -12
- package/dist/commands/list.js +45 -73
- package/dist/commands/login.d.ts +11 -9
- package/dist/commands/login.js +46 -49
- package/dist/commands/logout.d.ts +7 -2
- package/dist/commands/logout.js +14 -8
- package/dist/commands/logs.d.ts +11 -2
- package/dist/commands/logs.js +16 -3
- package/dist/commands/move-file.d.ts +9 -7
- package/dist/commands/move-file.js +38 -37
- package/dist/commands/move-folder.d.ts +9 -7
- package/dist/commands/move-folder.js +38 -37
- package/dist/commands/rename-file.d.ts +24 -0
- package/dist/commands/rename-file.js +80 -0
- package/dist/commands/rename-folder.d.ts +24 -0
- package/dist/commands/rename-folder.js +80 -0
- package/dist/commands/trash-clear.d.ts +9 -5
- package/dist/commands/trash-clear.js +21 -19
- package/dist/commands/trash-file.d.ts +21 -0
- package/dist/commands/trash-file.js +58 -0
- package/dist/commands/trash-folder.d.ts +21 -0
- package/dist/commands/trash-folder.js +58 -0
- package/dist/commands/trash-list.d.ts +10 -11
- package/dist/commands/trash-list.js +33 -62
- package/dist/commands/trash-restore-file.d.ts +10 -8
- package/dist/commands/trash-restore-file.js +33 -35
- package/dist/commands/trash-restore-folder.d.ts +10 -8
- package/dist/commands/trash-restore-folder.js +33 -35
- package/dist/commands/upload-file.d.ts +21 -0
- package/dist/commands/upload-file.js +140 -0
- package/dist/commands/webdav-config.d.ts +11 -9
- package/dist/commands/webdav-config.js +40 -66
- package/dist/commands/webdav.d.ts +16 -9
- package/dist/commands/webdav.js +77 -61
- package/dist/commands/whoami.d.ts +14 -2
- package/dist/commands/whoami.js +40 -11
- package/dist/hooks/prerun/auth_check.js +6 -4
- package/dist/services/auth.service.d.ts +2 -8
- package/dist/services/auth.service.js +33 -24
- package/dist/services/config.service.d.ts +3 -3
- package/dist/services/config.service.js +8 -8
- package/dist/services/crypto.service.d.ts +1 -3
- package/dist/services/crypto.service.js +11 -36
- package/dist/services/database/drive-file/drive-file.repository.d.ts +3 -3
- package/dist/services/database/drive-folder/drive-folder.repository.d.ts +3 -3
- package/dist/services/drive/drive-file.service.d.ts +1 -8
- package/dist/services/drive/drive-file.service.js +9 -23
- package/dist/services/drive/drive-folder.service.d.ts +1 -4
- package/dist/services/drive/drive-folder.service.js +2 -5
- package/dist/services/drive/trash.service.d.ts +2 -0
- package/dist/services/drive/trash.service.js +8 -0
- package/dist/services/keys.service.js +17 -7
- package/dist/services/network/network-facade.service.d.ts +1 -3
- package/dist/services/network/network-facade.service.js +20 -13
- package/dist/services/network/upload.service.d.ts +0 -1
- package/dist/services/sdk-manager.service.d.ts +2 -3
- package/dist/services/sdk-manager.service.js +14 -12
- package/dist/services/validation.service.d.ts +10 -0
- package/dist/services/validation.service.js +40 -1
- package/dist/types/command.types.d.ts +26 -17
- package/dist/types/command.types.js +38 -24
- package/dist/types/network.types.d.ts +0 -1
- package/dist/types/webdav.types.d.ts +1 -2
- package/dist/utils/cli.utils.d.ts +28 -19
- package/dist/utils/cli.utils.js +64 -44
- package/dist/utils/errors.utils.d.ts +1 -1
- package/dist/utils/errors.utils.js +3 -3
- package/dist/utils/hash.utils.d.ts +4 -7
- package/dist/utils/hash.utils.js +6 -6
- package/dist/utils/inquirer.utils.d.ts +4 -0
- package/dist/utils/inquirer.utils.js +24 -0
- package/dist/utils/network.utils.d.ts +2 -2
- package/dist/utils/network.utils.js +10 -8
- package/dist/utils/pm2.utils.d.ts +5 -1
- package/dist/utils/pm2.utils.js +35 -3
- package/dist/utils/stream.utils.d.ts +1 -4
- package/dist/utils/webdav.utils.js +4 -4
- package/dist/utils/xml.utils.js +4 -1
- package/dist/webdav/handlers/GET.handler.js +8 -3
- package/dist/webdav/handlers/MKCOL.handler.js +2 -6
- package/dist/webdav/handlers/MOVE.handler.js +0 -3
- package/dist/webdav/handlers/PROPFIND.handler.js +2 -2
- package/dist/webdav/handlers/PUT.handler.js +14 -9
- package/dist/webdav/middewares/errors.middleware.js +1 -1
- package/dist/webdav/middewares/request-logger.middleware.d.ts +1 -2
- package/dist/webdav/middewares/request-logger.middleware.js +6 -5
- package/dist/webdav/webdav-server.js +2 -3
- package/oclif.manifest.json +517 -350
- package/package.json +42 -47
- package/dist/commands/download.d.ts +0 -19
- package/dist/commands/rename.d.ts +0 -18
- package/dist/commands/rename.js +0 -109
- package/dist/commands/trash.d.ts +0 -15
- package/dist/commands/trash.js +0 -85
- package/dist/commands/upload.d.ts +0 -15
- package/dist/commands/upload.js +0 -93
- package/dist/services/analytics.service.d.ts +0 -22
- 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
|
-
|
|
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
|
-
|
|
55
|
-
if (!
|
|
56
|
-
throw new
|
|
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
|
-
|
|
63
|
-
|
|
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 (
|
|
66
|
-
throw new
|
|
61
|
+
if (oldTokenDetails.expiration.expired || newTokenDetails.expiration.expired) {
|
|
62
|
+
throw new command_types_1.ExpiredCredentialsError();
|
|
67
63
|
}
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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 {
|
|
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:
|
|
16
|
+
saveUser: (loginCredentials: LoginCredentials) => Promise<void>;
|
|
17
17
|
clearUser: () => Promise<void>;
|
|
18
|
-
readUser: () => Promise<
|
|
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
|
|
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 =
|
|
13
|
-
static INTERNXT_CLI_LOGS_DIR =
|
|
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 =
|
|
16
|
-
static DRIVE_SQLITE_FILE =
|
|
17
|
-
static WEBDAV_SSL_CERTS_DIR =
|
|
18
|
-
static WEBDAV_CONFIGS_FILE =
|
|
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 =
|
|
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
|
|
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.
|
|
59
|
-
const hash = node_crypto_1.
|
|
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.
|
|
52
|
+
const salt = (0, node_crypto_1.randomBytes)(8);
|
|
78
53
|
const { key, iv } = this.getKeyAndIvFrom(secret, salt);
|
|
79
|
-
const cipher = node_crypto_1.
|
|
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.
|
|
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.
|
|
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[
|
|
6
|
-
findById: (id: DriveFile[
|
|
7
|
-
deleteById: (id: DriveFile[
|
|
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[
|
|
6
|
-
findById: (id: DriveFolder[
|
|
7
|
-
deleteById: (id: DriveFolder[
|
|
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
|
|
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
|
-
|
|
12
|
+
name: payload.plain_name,
|
|
13
|
+
encryptedName: driveFile.name,
|
|
14
|
+
id: driveFile.id,
|
|
27
15
|
uuid: driveFile.uuid,
|
|
28
|
-
|
|
29
|
-
|
|
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:
|
|
34
|
-
|
|
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.
|
|
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 (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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 (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
|
|
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
|
|
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:
|
|
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,
|
|
@@ -12,10 +12,9 @@ export declare class SdkManager {
|
|
|
12
12
|
throwErrorOnMissingCredentials: boolean;
|
|
13
13
|
}) => SdkManagerApiSecurity;
|
|
14
14
|
static readonly getAppDetails: () => AppDetails;
|
|
15
|
-
|
|
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
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
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,
|
|
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 =
|
|
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,
|
|
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.
|
|
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;
|