@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.
- package/.env +11 -0
- package/README.md +297 -0
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +7 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +7 -0
- package/dist/commands/config.d.ts +18 -0
- package/dist/commands/config.js +50 -0
- package/dist/commands/download.d.ts +19 -0
- package/dist/commands/download.js +119 -0
- package/dist/commands/list.d.ts +22 -0
- package/dist/commands/list.js +125 -0
- package/dist/commands/login.d.ts +21 -0
- package/dist/commands/login.js +124 -0
- package/dist/commands/logout.d.ts +9 -0
- package/dist/commands/logout.js +28 -0
- package/dist/commands/logs.d.ts +6 -0
- package/dist/commands/logs.js +12 -0
- package/dist/commands/move.d.ts +18 -0
- package/dist/commands/move.js +109 -0
- package/dist/commands/trash.d.ts +15 -0
- package/dist/commands/trash.js +85 -0
- package/dist/commands/upload.d.ts +15 -0
- package/dist/commands/upload.js +93 -0
- package/dist/commands/webdav.d.ts +12 -0
- package/dist/commands/webdav.js +64 -0
- package/dist/commands/whoami.d.ts +9 -0
- package/dist/commands/whoami.js +27 -0
- package/dist/database/migrations/20240402164914-create-files.d.ts +1 -0
- package/dist/database/migrations/20240402164914-create-files.js +55 -0
- package/dist/database/migrations/20240402165418-create-folders.d.ts +1 -0
- package/dist/database/migrations/20240402165418-create-folders.js +37 -0
- package/dist/hooks/prerun/auth_check.d.ts +3 -0
- package/dist/hooks/prerun/auth_check.js +32 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -0
- package/dist/services/auth.service.d.ts +14 -0
- package/dist/services/auth.service.js +79 -0
- package/dist/services/config.service.d.ts +19 -0
- package/dist/services/config.service.js +79 -0
- package/dist/services/crypto.service.d.ts +22 -0
- package/dist/services/crypto.service.js +126 -0
- package/dist/services/database/drive-database-manager.service.d.ts +18 -0
- package/dist/services/database/drive-database-manager.service.js +76 -0
- package/dist/services/database/drive-file/drive-file.attributes.d.ts +14 -0
- package/dist/services/database/drive-file/drive-file.attributes.js +2 -0
- package/dist/services/database/drive-file/drive-file.domain.d.ts +18 -0
- package/dist/services/database/drive-file/drive-file.domain.js +51 -0
- package/dist/services/database/drive-file/drive-file.model.d.ts +17 -0
- package/dist/services/database/drive-file/drive-file.model.js +82 -0
- package/dist/services/database/drive-file/drive-file.repository.d.ts +11 -0
- package/dist/services/database/drive-file/drive-file.repository.js +40 -0
- package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +9 -0
- package/dist/services/database/drive-folder/drive-folder.attributes.js +2 -0
- package/dist/services/database/drive-folder/drive-folder.domain.d.ts +13 -0
- package/dist/services/database/drive-folder/drive-folder.domain.js +36 -0
- package/dist/services/database/drive-folder/drive-folder.model.d.ts +12 -0
- package/dist/services/database/drive-folder/drive-folder.model.js +56 -0
- package/dist/services/database/drive-folder/drive-folder.repository.d.ts +11 -0
- package/dist/services/database/drive-folder/drive-folder.repository.js +40 -0
- package/dist/services/drive/drive-file.service.d.ts +15 -0
- package/dist/services/drive/drive-file.service.js +51 -0
- package/dist/services/drive/drive-folder.service.d.ts +15 -0
- package/dist/services/drive/drive-folder.service.js +49 -0
- package/dist/services/drive/trash.service.d.ts +5 -0
- package/dist/services/drive/trash.service.js +12 -0
- package/dist/services/keys.service.d.ts +14 -0
- package/dist/services/keys.service.js +110 -0
- package/dist/services/network/download.service.d.ts +7 -0
- package/dist/services/network/download.service.js +33 -0
- package/dist/services/network/network-facade.service.d.ts +21 -0
- package/dist/services/network/network-facade.service.js +128 -0
- package/dist/services/network/upload.service.d.ts +9 -0
- package/dist/services/network/upload.service.js +20 -0
- package/dist/services/realms/drive-files.realm.d.ts +23 -0
- package/dist/services/realms/drive-files.realm.js +76 -0
- package/dist/services/realms/drive-folders.realm.d.ts +20 -0
- package/dist/services/realms/drive-folders.realm.js +68 -0
- package/dist/services/realms/drive-realm-manager.service.d.ts +15 -0
- package/dist/services/realms/drive-realm-manager.service.js +63 -0
- package/dist/services/sdk-manager.service.d.ts +28 -0
- package/dist/services/sdk-manager.service.js +107 -0
- package/dist/services/usage.service.d.ts +6 -0
- package/dist/services/usage.service.js +23 -0
- package/dist/services/validation.service.d.ts +7 -0
- package/dist/services/validation.service.js +21 -0
- package/dist/types/command.types.d.ts +42 -0
- package/dist/types/command.types.js +59 -0
- package/dist/types/config.types.d.ts +13 -0
- package/dist/types/config.types.js +2 -0
- package/dist/types/drive.types.d.ts +14 -0
- package/dist/types/drive.types.js +2 -0
- package/dist/types/keys.types.d.ts +16 -0
- package/dist/types/keys.types.js +31 -0
- package/dist/types/network.types.d.ts +11 -0
- package/dist/types/network.types.js +2 -0
- package/dist/types/webdav.types.d.ts +15 -0
- package/dist/types/webdav.types.js +6 -0
- package/dist/utils/cli.utils.d.ts +32 -0
- package/dist/utils/cli.utils.js +105 -0
- package/dist/utils/crypto.utils.d.ts +6 -0
- package/dist/utils/crypto.utils.js +10 -0
- package/dist/utils/drive.utils.d.ts +6 -0
- package/dist/utils/drive.utils.js +34 -0
- package/dist/utils/errors.utils.d.ts +19 -0
- package/dist/utils/errors.utils.js +50 -0
- package/dist/utils/format.utils.d.ts +6 -0
- package/dist/utils/format.utils.js +30 -0
- package/dist/utils/hash.utils.d.ts +15 -0
- package/dist/utils/hash.utils.js +37 -0
- package/dist/utils/logger.utils.d.ts +3 -0
- package/dist/utils/logger.utils.js +50 -0
- package/dist/utils/network.utils.d.ts +22 -0
- package/dist/utils/network.utils.js +49 -0
- package/dist/utils/pm2.utils.d.ts +10 -0
- package/dist/utils/pm2.utils.js +65 -0
- package/dist/utils/stream.utils.d.ts +7 -0
- package/dist/utils/stream.utils.js +56 -0
- package/dist/utils/webdav.utils.d.ts +7 -0
- package/dist/utils/webdav.utils.js +47 -0
- package/dist/utils/xml.utils.d.ts +8 -0
- package/dist/utils/xml.utils.js +23 -0
- package/dist/webdav/handlers/GET.handler.d.ts +23 -0
- package/dist/webdav/handlers/GET.handler.js +52 -0
- package/dist/webdav/handlers/HEAD.handler.d.ts +5 -0
- package/dist/webdav/handlers/HEAD.handler.js +9 -0
- package/dist/webdav/handlers/OPTIONS.handler.d.ts +5 -0
- package/dist/webdav/handlers/OPTIONS.handler.js +11 -0
- package/dist/webdav/handlers/PROPFIND.handler.d.ts +21 -0
- package/dist/webdav/handlers/PROPFIND.handler.js +234 -0
- package/dist/webdav/handlers/PUT.handler.d.ts +23 -0
- package/dist/webdav/handlers/PUT.handler.js +51 -0
- package/dist/webdav/index.d.ts +1 -0
- package/dist/webdav/index.js +30 -0
- package/dist/webdav/middewares/auth.middleware.d.ts +3 -0
- package/dist/webdav/middewares/auth.middleware.js +27 -0
- package/dist/webdav/middewares/errors.middleware.d.ts +2 -0
- package/dist/webdav/middewares/errors.middleware.js +20 -0
- package/dist/webdav/middewares/request-logger.middleware.d.ts +7 -0
- package/dist/webdav/middewares/request-logger.middleware.js +15 -0
- package/dist/webdav/webdav-server.d.ts +25 -0
- package/dist/webdav/webdav-server.js +98 -0
- package/oclif.manifest.json +593 -0
- package/package.json +122 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CLIUtils = void 0;
|
|
4
|
+
const core_1 = require("@oclif/core");
|
|
5
|
+
class CLIUtils {
|
|
6
|
+
static clearPreviousLine() {
|
|
7
|
+
process.stdout.write('\x1b[1A');
|
|
8
|
+
process.stdout.clearLine(0);
|
|
9
|
+
}
|
|
10
|
+
static warning(message) {
|
|
11
|
+
core_1.ux.log(core_1.ux.colorize('#a67805', `⚠ Warning: ${message}`));
|
|
12
|
+
}
|
|
13
|
+
static error(message) {
|
|
14
|
+
core_1.ux.log(core_1.ux.colorize('red', `⚠ Error: ${message}`));
|
|
15
|
+
}
|
|
16
|
+
static doing(message) {
|
|
17
|
+
core_1.ux.action.start(message, undefined, {});
|
|
18
|
+
}
|
|
19
|
+
static success(message) {
|
|
20
|
+
core_1.ux.log(core_1.ux.colorize('green', `✓ ${message}`));
|
|
21
|
+
}
|
|
22
|
+
static done() {
|
|
23
|
+
core_1.ux.action.stop(core_1.ux.colorize('green', 'done ✓'));
|
|
24
|
+
}
|
|
25
|
+
static CommonFlags = {
|
|
26
|
+
'non-interactive': core_1.Flags.boolean({
|
|
27
|
+
char: 'n',
|
|
28
|
+
env: 'INXT_NONINTERACTIVE',
|
|
29
|
+
helpGroup: 'helper',
|
|
30
|
+
description: 'Blocks the cli from being interactive. If passed, the cli will not request data through the console and will throw errors directly',
|
|
31
|
+
required: false,
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
static getValueFromFlag = (flag, nonInteractive, validate) => {
|
|
35
|
+
if (flag.canBeEmpty) {
|
|
36
|
+
if (!flag.value || flag.value.trim().length === 0) {
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (flag.value) {
|
|
41
|
+
const isValid = validate(flag.value);
|
|
42
|
+
if (isValid) {
|
|
43
|
+
return flag.value;
|
|
44
|
+
}
|
|
45
|
+
else if (nonInteractive) {
|
|
46
|
+
throw flag.error;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
CLIUtils.error(flag.error.message);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (nonInteractive) {
|
|
53
|
+
throw new NoFlagProvidedError(flag.name);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
static promptWithAttempts = async (prompt, maxAttempts, validate) => {
|
|
57
|
+
let isValid = false;
|
|
58
|
+
let currentAttempts = 0;
|
|
59
|
+
let promptValue = '';
|
|
60
|
+
do {
|
|
61
|
+
promptValue = await core_1.ux.prompt(prompt.message, prompt.options);
|
|
62
|
+
isValid = validate(promptValue);
|
|
63
|
+
if (!isValid) {
|
|
64
|
+
currentAttempts++;
|
|
65
|
+
if (currentAttempts < maxAttempts) {
|
|
66
|
+
CLIUtils.warning(prompt.error.message + ', please type it again');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
} while (!isValid && currentAttempts < maxAttempts);
|
|
70
|
+
if (!isValid) {
|
|
71
|
+
throw prompt.error;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
return promptValue;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
static timer() {
|
|
78
|
+
const start = new Date();
|
|
79
|
+
return {
|
|
80
|
+
stop: () => {
|
|
81
|
+
const end = new Date();
|
|
82
|
+
const time = end.getTime() - start.getTime();
|
|
83
|
+
return time;
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
static prompt = async (prompt, validate) => {
|
|
88
|
+
const promptValue = await core_1.ux.prompt(prompt.message, prompt.options);
|
|
89
|
+
if (validate) {
|
|
90
|
+
const isValid = validate(promptValue);
|
|
91
|
+
if (!isValid) {
|
|
92
|
+
throw prompt.error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return promptValue;
|
|
96
|
+
};
|
|
97
|
+
static parseEmpty = async (input) => (input.trim().length === 0 ? ' ' : input);
|
|
98
|
+
}
|
|
99
|
+
exports.CLIUtils = CLIUtils;
|
|
100
|
+
class NoFlagProvidedError extends Error {
|
|
101
|
+
constructor(flag) {
|
|
102
|
+
super(`No ${flag} flag has been provided`);
|
|
103
|
+
Object.setPrototypeOf(this, NoFlagProvidedError.prototype);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CryptoUtils = void 0;
|
|
4
|
+
const config_service_1 = require("../services/config.service");
|
|
5
|
+
class CryptoUtils {
|
|
6
|
+
static getAesInit() {
|
|
7
|
+
return { iv: config_service_1.ConfigService.instance.get('APP_MAGIC_IV'), salt: config_service_1.ConfigService.instance.get('APP_MAGIC_SALT') };
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.CryptoUtils = CryptoUtils;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FileMeta, FolderMeta } from '@internxt/sdk/dist/drive/storage/types';
|
|
2
|
+
import { DriveFileItem, DriveFolderItem } from '../types/drive.types';
|
|
3
|
+
export declare class DriveUtils {
|
|
4
|
+
static driveFileMetaToItem(fileMeta: FileMeta): DriveFileItem;
|
|
5
|
+
static driveFolderMetaToItem(folderMeta: FolderMeta): DriveFolderItem;
|
|
6
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DriveUtils = void 0;
|
|
4
|
+
class DriveUtils {
|
|
5
|
+
static driveFileMetaToItem(fileMeta) {
|
|
6
|
+
return {
|
|
7
|
+
uuid: fileMeta.uuid ?? '',
|
|
8
|
+
status: fileMeta.status,
|
|
9
|
+
folderId: fileMeta.folder_id,
|
|
10
|
+
size: fileMeta.size,
|
|
11
|
+
encryptedName: fileMeta.name,
|
|
12
|
+
name: fileMeta.plainName ?? fileMeta.name,
|
|
13
|
+
bucket: fileMeta.bucket,
|
|
14
|
+
createdAt: new Date(fileMeta.createdAt),
|
|
15
|
+
updatedAt: new Date(fileMeta.updatedAt),
|
|
16
|
+
fileId: fileMeta.fileId,
|
|
17
|
+
id: fileMeta.id,
|
|
18
|
+
type: fileMeta.type,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
static driveFolderMetaToItem(folderMeta) {
|
|
22
|
+
return {
|
|
23
|
+
uuid: folderMeta.uuid,
|
|
24
|
+
id: folderMeta.id,
|
|
25
|
+
bucket: folderMeta.bucket,
|
|
26
|
+
name: folderMeta.plainName ?? folderMeta.name,
|
|
27
|
+
encryptedName: folderMeta.name,
|
|
28
|
+
parentId: folderMeta.parentId,
|
|
29
|
+
createdAt: new Date(folderMeta.createdAt),
|
|
30
|
+
updatedAt: new Date(folderMeta.updatedAt),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.DriveUtils = DriveUtils;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare class ErrorUtils {
|
|
2
|
+
static report(error: unknown, props?: Record<string, unknown>): void;
|
|
3
|
+
}
|
|
4
|
+
export declare class NotFoundError extends Error {
|
|
5
|
+
statusCode: number;
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class BadRequestError extends Error {
|
|
9
|
+
statusCode: number;
|
|
10
|
+
constructor(message: string);
|
|
11
|
+
}
|
|
12
|
+
export declare class UnsupportedMediaTypeError extends Error {
|
|
13
|
+
statusCode: number;
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
export declare class NotImplementedError extends Error {
|
|
17
|
+
statusCode: number;
|
|
18
|
+
constructor(message: string);
|
|
19
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NotImplementedError = exports.UnsupportedMediaTypeError = exports.BadRequestError = exports.NotFoundError = exports.ErrorUtils = void 0;
|
|
4
|
+
class ErrorUtils {
|
|
5
|
+
static report(error, props = {}) {
|
|
6
|
+
if (error instanceof Error) {
|
|
7
|
+
console.error(`[REPORTED_ERROR]: ${error.message}\nProperties => ${JSON.stringify(props, null, 2)}\nStack => ${error.stack}`);
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
console.error(`[REPORTED_ERROR]: ${JSON.stringify(error)}\nProperties => ${JSON.stringify(props, null, 2)}\n`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.ErrorUtils = ErrorUtils;
|
|
15
|
+
class NotFoundError extends Error {
|
|
16
|
+
statusCode = 404;
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'NotFoundError';
|
|
20
|
+
Object.setPrototypeOf(this, NotFoundError.prototype);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.NotFoundError = NotFoundError;
|
|
24
|
+
class BadRequestError extends Error {
|
|
25
|
+
statusCode = 400;
|
|
26
|
+
constructor(message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = 'BadRequestError';
|
|
29
|
+
Object.setPrototypeOf(this, BadRequestError.prototype);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.BadRequestError = BadRequestError;
|
|
33
|
+
class UnsupportedMediaTypeError extends Error {
|
|
34
|
+
statusCode = 415;
|
|
35
|
+
constructor(message) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = 'UnsupportedMediaTypeError';
|
|
38
|
+
Object.setPrototypeOf(this, UnsupportedMediaTypeError.prototype);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.UnsupportedMediaTypeError = UnsupportedMediaTypeError;
|
|
42
|
+
class NotImplementedError extends Error {
|
|
43
|
+
statusCode = 501;
|
|
44
|
+
constructor(message) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = 'NotImplementedError';
|
|
47
|
+
Object.setPrototypeOf(this, NotImplementedError.prototype);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.NotImplementedError = NotImplementedError;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare class FormatUtils {
|
|
2
|
+
static readonly humanFileSize: (size: number) => string;
|
|
3
|
+
static readonly formatDate: (date: string | Date) => string;
|
|
4
|
+
static readonly formatDateForWebDav: (date: string | Date) => string;
|
|
5
|
+
static readonly formatLimit: (limit: number) => string;
|
|
6
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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.FormatUtils = void 0;
|
|
7
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
8
|
+
const utc_1 = __importDefault(require("dayjs/plugin/utc"));
|
|
9
|
+
const usage_service_1 = require("../services/usage.service");
|
|
10
|
+
dayjs_1.default.extend(utc_1.default);
|
|
11
|
+
class FormatUtils {
|
|
12
|
+
static humanFileSize = (size) => {
|
|
13
|
+
const i = size == 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024));
|
|
14
|
+
return Number((size / Math.pow(1024, i)).toFixed(2)) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
|
|
15
|
+
};
|
|
16
|
+
static formatDate = (date) => {
|
|
17
|
+
return (0, dayjs_1.default)(date).format('D MMMM, YYYY [at] HH:mm');
|
|
18
|
+
};
|
|
19
|
+
static formatDateForWebDav = (date) => {
|
|
20
|
+
return dayjs_1.default.utc(date).format('ddd, DD MMM YYYY HH:mm:ss [GMT]');
|
|
21
|
+
};
|
|
22
|
+
static formatLimit = (limit) => {
|
|
23
|
+
let result = '...';
|
|
24
|
+
if (limit > 0) {
|
|
25
|
+
result = limit === usage_service_1.UsageService.INFINITE_LIMIT ? 'infinity' : this.humanFileSize(limit);
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
exports.FormatUtils = FormatUtils;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import { Hash } from 'crypto';
|
|
5
|
+
import { Transform, TransformCallback, TransformOptions } from 'stream';
|
|
6
|
+
export declare class HashStream extends Transform {
|
|
7
|
+
hasher: Hash;
|
|
8
|
+
finalHash: Buffer;
|
|
9
|
+
constructor(opts?: TransformOptions);
|
|
10
|
+
_transform(chunk: Buffer, enc: BufferEncoding, cb: TransformCallback): void;
|
|
11
|
+
_flush(cb: (err: Error | null) => void): Hash;
|
|
12
|
+
reset(): void;
|
|
13
|
+
readHash(): Buffer;
|
|
14
|
+
getHash(): Buffer;
|
|
15
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HashStream = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const stream_1 = require("stream");
|
|
6
|
+
class HashStream extends stream_1.Transform {
|
|
7
|
+
hasher;
|
|
8
|
+
finalHash;
|
|
9
|
+
constructor(opts) {
|
|
10
|
+
super(opts);
|
|
11
|
+
this.hasher = (0, crypto_1.createHash)('sha256');
|
|
12
|
+
this.finalHash = Buffer.alloc(0);
|
|
13
|
+
}
|
|
14
|
+
_transform(chunk, enc, cb) {
|
|
15
|
+
this.hasher.update(chunk);
|
|
16
|
+
cb(null, chunk);
|
|
17
|
+
}
|
|
18
|
+
_flush(cb) {
|
|
19
|
+
return this.hasher.end(cb);
|
|
20
|
+
}
|
|
21
|
+
reset() {
|
|
22
|
+
this.hasher = (0, crypto_1.createHash)('sha256');
|
|
23
|
+
}
|
|
24
|
+
readHash() {
|
|
25
|
+
if (!this.finalHash.length) {
|
|
26
|
+
this.finalHash = this.hasher.read();
|
|
27
|
+
}
|
|
28
|
+
return this.finalHash;
|
|
29
|
+
}
|
|
30
|
+
getHash() {
|
|
31
|
+
if (!this.finalHash.length) {
|
|
32
|
+
this.readHash();
|
|
33
|
+
}
|
|
34
|
+
return (0, crypto_1.createHash)('ripemd160').update(this.finalHash).digest();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.HashStream = HashStream;
|
|
@@ -0,0 +1,50 @@
|
|
|
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.webdavLogger = exports.logger = void 0;
|
|
7
|
+
const winston_1 = __importDefault(require("winston"));
|
|
8
|
+
const config_service_1 = require("../services/config.service");
|
|
9
|
+
exports.logger = winston_1.default.createLogger({
|
|
10
|
+
level: 'info',
|
|
11
|
+
format: winston_1.default.format.json(),
|
|
12
|
+
defaultMeta: { service: 'internxt-cli' },
|
|
13
|
+
transports: [
|
|
14
|
+
new winston_1.default.transports.File({
|
|
15
|
+
filename: 'internxt-cli-error.log',
|
|
16
|
+
level: 'error',
|
|
17
|
+
dirname: config_service_1.ConfigService.INTERNXT_CLI_LOGS_DIR,
|
|
18
|
+
}),
|
|
19
|
+
new winston_1.default.transports.File({
|
|
20
|
+
filename: 'internxt-cli-combined.log',
|
|
21
|
+
dirname: config_service_1.ConfigService.INTERNXT_CLI_LOGS_DIR,
|
|
22
|
+
}),
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
exports.webdavLogger = winston_1.default.createLogger({
|
|
26
|
+
level: 'info',
|
|
27
|
+
format: winston_1.default.format.json(),
|
|
28
|
+
defaultMeta: { service: 'internxt-webdav' },
|
|
29
|
+
transports: [
|
|
30
|
+
new winston_1.default.transports.File({
|
|
31
|
+
filename: 'internxt-webdav-error.log',
|
|
32
|
+
level: 'error',
|
|
33
|
+
dirname: config_service_1.ConfigService.INTERNXT_CLI_LOGS_DIR,
|
|
34
|
+
}),
|
|
35
|
+
new winston_1.default.transports.File({
|
|
36
|
+
filename: 'internxt-webdav-combined.log',
|
|
37
|
+
dirname: config_service_1.ConfigService.INTERNXT_CLI_LOGS_DIR,
|
|
38
|
+
}),
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
42
|
+
exports.webdavLogger.add(new winston_1.default.transports.Console({
|
|
43
|
+
format: winston_1.default.format.simple(),
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
47
|
+
exports.logger.add(new winston_1.default.transports.Console({
|
|
48
|
+
format: winston_1.default.format.simple(),
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { NetworkCredentials } from '../types/network.types';
|
|
3
|
+
import selfsigned from 'selfsigned';
|
|
4
|
+
export declare class NetworkUtils {
|
|
5
|
+
static getAuthFromCredentials(creds: NetworkCredentials): {
|
|
6
|
+
username: string;
|
|
7
|
+
password: string;
|
|
8
|
+
};
|
|
9
|
+
static readonly WEBDAV_SSL_CERTS_PATH: {
|
|
10
|
+
cert: string;
|
|
11
|
+
privateKey: string;
|
|
12
|
+
};
|
|
13
|
+
static getWebdavSSLCerts(): {
|
|
14
|
+
cert: string;
|
|
15
|
+
key: string;
|
|
16
|
+
} | {
|
|
17
|
+
cert: Buffer;
|
|
18
|
+
key: Buffer;
|
|
19
|
+
};
|
|
20
|
+
static saveWebdavSSLCerts(pems: selfsigned.GenerateResult): void;
|
|
21
|
+
static generateSelfSignedSSLCerts(): selfsigned.GenerateResult;
|
|
22
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
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.NetworkUtils = void 0;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const selfsigned_1 = __importDefault(require("selfsigned"));
|
|
11
|
+
const config_service_1 = require("../services/config.service");
|
|
12
|
+
class NetworkUtils {
|
|
13
|
+
static getAuthFromCredentials(creds) {
|
|
14
|
+
return {
|
|
15
|
+
username: creds.user,
|
|
16
|
+
password: (0, node_crypto_1.createHash)('SHA256').update(Buffer.from(creds.pass)).digest().toString('hex'),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
static WEBDAV_SSL_CERTS_PATH = {
|
|
20
|
+
cert: node_path_1.default.join(config_service_1.ConfigService.WEBDAV_SSL_CERTS_DIR, 'cert.crt'),
|
|
21
|
+
privateKey: node_path_1.default.join(config_service_1.ConfigService.WEBDAV_SSL_CERTS_DIR, 'priv.key'),
|
|
22
|
+
};
|
|
23
|
+
static getWebdavSSLCerts() {
|
|
24
|
+
if (!(0, node_fs_1.existsSync)(this.WEBDAV_SSL_CERTS_PATH.cert) || !(0, node_fs_1.existsSync)(this.WEBDAV_SSL_CERTS_PATH.privateKey)) {
|
|
25
|
+
const newCerts = this.generateSelfSignedSSLCerts();
|
|
26
|
+
this.saveWebdavSSLCerts(newCerts);
|
|
27
|
+
return {
|
|
28
|
+
cert: newCerts.cert,
|
|
29
|
+
key: newCerts.private,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return {
|
|
34
|
+
cert: (0, node_fs_1.readFileSync)(this.WEBDAV_SSL_CERTS_PATH.cert),
|
|
35
|
+
key: (0, node_fs_1.readFileSync)(this.WEBDAV_SSL_CERTS_PATH.privateKey),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
static saveWebdavSSLCerts(pems) {
|
|
40
|
+
(0, node_fs_1.writeFileSync)(this.WEBDAV_SSL_CERTS_PATH.cert, pems.cert, 'utf8');
|
|
41
|
+
(0, node_fs_1.writeFileSync)(this.WEBDAV_SSL_CERTS_PATH.privateKey, pems.private, 'utf8');
|
|
42
|
+
}
|
|
43
|
+
static generateSelfSignedSSLCerts() {
|
|
44
|
+
const attrs = [{ name: 'commonName', value: config_service_1.ConfigService.WEBDAV_LOCAL_URL }];
|
|
45
|
+
const pems = selfsigned_1.default.generate(attrs, { days: 365, algorithm: 'sha256', keySize: 2048 });
|
|
46
|
+
return pems;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.NetworkUtils = NetworkUtils;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type WebDavProcessStatus = 'online' | 'unknown' | 'errored';
|
|
2
|
+
export declare class PM2Utils {
|
|
3
|
+
private static WEBDAV_APP_NAME;
|
|
4
|
+
static connect(): Promise<void>;
|
|
5
|
+
static killWebDavServer(): Promise<void>;
|
|
6
|
+
static webdavServerStatus(): Promise<{
|
|
7
|
+
status: WebDavProcessStatus;
|
|
8
|
+
}>;
|
|
9
|
+
static startWebDavServer(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
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.PM2Utils = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const pm2_1 = __importDefault(require("pm2"));
|
|
9
|
+
class PM2Utils {
|
|
10
|
+
static WEBDAV_APP_NAME = 'Internxt CLI WebDav';
|
|
11
|
+
static connect() {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
pm2_1.default.connect((err) => {
|
|
14
|
+
if (err) {
|
|
15
|
+
reject(err);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
resolve();
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
static killWebDavServer() {
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
pm2_1.default.delete(this.WEBDAV_APP_NAME, () => {
|
|
26
|
+
resolve();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
static webdavServerStatus() {
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
pm2_1.default.describe(this.WEBDAV_APP_NAME, (err, processDescription) => {
|
|
33
|
+
if (err) {
|
|
34
|
+
reject(err);
|
|
35
|
+
}
|
|
36
|
+
else if (processDescription.length === 0) {
|
|
37
|
+
reject(new Error('WebDav server is not running'));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const process = processDescription[0];
|
|
41
|
+
resolve({
|
|
42
|
+
status: (process.pm2_env?.status ?? 'unknown'),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
static startWebDavServer() {
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
pm2_1.default.start({
|
|
51
|
+
wait_ready: true,
|
|
52
|
+
script: path_1.default.join(__dirname, '../webdav/index.js'),
|
|
53
|
+
name: this.WEBDAV_APP_NAME,
|
|
54
|
+
}, (err) => {
|
|
55
|
+
if (err) {
|
|
56
|
+
reject(err);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
resolve();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.PM2Utils = PM2Utils;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ReadStream, WriteStream } from 'fs';
|
|
3
|
+
export declare class StreamUtils {
|
|
4
|
+
static readStreamToReadableStream(readStream: ReadStream): ReadableStream<Uint8Array>;
|
|
5
|
+
static writeStreamToWritableStream(writeStream: WriteStream): WritableStream<Uint8Array>;
|
|
6
|
+
static joinReadableBinaryStreams(streams: ReadableStream<Uint8Array>[]): ReadableStream<Uint8Array>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StreamUtils = void 0;
|
|
4
|
+
class StreamUtils {
|
|
5
|
+
static readStreamToReadableStream(readStream) {
|
|
6
|
+
const readable = new ReadableStream({
|
|
7
|
+
async start(controller) {
|
|
8
|
+
readStream.on('data', (chunk) => {
|
|
9
|
+
controller.enqueue(Buffer.from(chunk));
|
|
10
|
+
});
|
|
11
|
+
readStream.on('end', () => {
|
|
12
|
+
controller.close();
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
return readable;
|
|
17
|
+
}
|
|
18
|
+
static writeStreamToWritableStream(writeStream) {
|
|
19
|
+
const writable = new WritableStream({
|
|
20
|
+
write(chunk) {
|
|
21
|
+
writeStream.write(chunk);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
return writable;
|
|
25
|
+
}
|
|
26
|
+
static joinReadableBinaryStreams(streams) {
|
|
27
|
+
const streamsCopy = streams.map((s) => s);
|
|
28
|
+
let keepReading = true;
|
|
29
|
+
const flush = () => streamsCopy.forEach((s) => s.cancel());
|
|
30
|
+
const stream = new ReadableStream({
|
|
31
|
+
async pull(controller) {
|
|
32
|
+
if (!keepReading)
|
|
33
|
+
return flush();
|
|
34
|
+
const downStream = streamsCopy.shift();
|
|
35
|
+
if (!downStream) {
|
|
36
|
+
return controller.close();
|
|
37
|
+
}
|
|
38
|
+
const reader = downStream.getReader();
|
|
39
|
+
let done = false;
|
|
40
|
+
while (!done && keepReading) {
|
|
41
|
+
const status = await reader.read();
|
|
42
|
+
if (!status.done) {
|
|
43
|
+
controller.enqueue(status.value);
|
|
44
|
+
}
|
|
45
|
+
done = status.done;
|
|
46
|
+
}
|
|
47
|
+
reader.releaseLock();
|
|
48
|
+
},
|
|
49
|
+
cancel() {
|
|
50
|
+
keepReading = false;
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
return stream;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.StreamUtils = StreamUtils;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Request } from 'express';
|
|
2
|
+
import { WebDavRequestedResource } from '../types/webdav.types';
|
|
3
|
+
import { DriveDatabaseManager } from '../services/database/drive-database-manager.service';
|
|
4
|
+
export declare class WebDavUtils {
|
|
5
|
+
static joinURL(...pathComponents: string[]): string;
|
|
6
|
+
static getRequestedResource(req: Request, driveDatabaseManager: DriveDatabaseManager): Promise<WebDavRequestedResource>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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.WebDavUtils = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const drive_folder_domain_1 = require("../services/database/drive-folder/drive-folder.domain");
|
|
9
|
+
const drive_file_domain_1 = require("../services/database/drive-file/drive-file.domain");
|
|
10
|
+
class WebDavUtils {
|
|
11
|
+
static joinURL(...pathComponents) {
|
|
12
|
+
return path_1.default.posix.join(...pathComponents);
|
|
13
|
+
}
|
|
14
|
+
static async getRequestedResource(req, driveDatabaseManager) {
|
|
15
|
+
const decodedUrl = decodeURI(req.url);
|
|
16
|
+
const parsedPath = path_1.default.parse(decodedUrl);
|
|
17
|
+
let isFolder = req.url.endsWith('/');
|
|
18
|
+
if (!isFolder) {
|
|
19
|
+
const findDatabaseItem = await driveDatabaseManager.findByRelativePath(decodedUrl);
|
|
20
|
+
if (findDatabaseItem) {
|
|
21
|
+
if (findDatabaseItem instanceof drive_file_domain_1.DriveFile) {
|
|
22
|
+
isFolder = false;
|
|
23
|
+
}
|
|
24
|
+
else if (findDatabaseItem instanceof drive_folder_domain_1.DriveFolder) {
|
|
25
|
+
isFolder = true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (isFolder) {
|
|
30
|
+
return {
|
|
31
|
+
url: decodedUrl,
|
|
32
|
+
type: 'folder',
|
|
33
|
+
name: parsedPath.name,
|
|
34
|
+
path: parsedPath,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return {
|
|
39
|
+
type: 'file',
|
|
40
|
+
url: decodedUrl,
|
|
41
|
+
name: parsedPath.name,
|
|
42
|
+
path: parsedPath,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.WebDavUtils = WebDavUtils;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { X2jOptions, XmlBuilderOptions } from 'fast-xml-parser';
|
|
2
|
+
export declare class XMLUtils {
|
|
3
|
+
static readonly DEFAULT_NAMESPACE_LETTER = "D";
|
|
4
|
+
static toJSON(xml: string, options?: X2jOptions): any;
|
|
5
|
+
static toXML(object: object, options?: XmlBuilderOptions): any;
|
|
6
|
+
static toWebDavXML(object: object, options: XmlBuilderOptions): string;
|
|
7
|
+
static addDefaultNamespace(key: string): string;
|
|
8
|
+
}
|