@internxt/cli 1.6.2 → 1.6.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/README.md +411 -72
- package/dist/commands/add-cert.d.ts +1 -1
- package/dist/commands/add-cert.js +1 -1
- 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/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 +4 -5
- package/dist/commands/upload-file.js +42 -31
- 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 +2 -1
- package/dist/constants/configs.js +4 -3
- package/dist/hooks/prerun/auth_check.js +13 -4
- package/dist/services/auth.service.d.ts +5 -2
- package/dist/services/auth.service.js +69 -12
- package/dist/services/config.service.d.ts +1 -1
- package/dist/services/config.service.js +12 -4
- 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 +11 -8
- package/dist/services/network/network-facade.service.js +19 -32
- package/dist/services/network/upload/upload-facade.service.d.ts +1 -1
- package/dist/services/network/upload/upload-facade.service.js +14 -7
- package/dist/services/network/upload/upload-file.service.d.ts +3 -3
- package/dist/services/network/upload/upload-file.service.js +38 -30
- 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 +11 -0
- package/dist/services/sdk-manager.service.d.ts +9 -7
- package/dist/services/sdk-manager.service.js +27 -13
- package/dist/services/thumbnail.service.d.ts +19 -1
- package/dist/services/thumbnail.service.js +34 -9
- 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.js +14 -4
- 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 +20 -15
- package/dist/utils/cli.utils.js +48 -18
- 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 -4
- package/dist/utils/errors.utils.js +16 -19
- 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/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 +16 -41
- package/dist/utils/webdav.utils.d.ts +5 -20
- package/dist/utils/webdav.utils.js +31 -14
- package/dist/utils/xml.utils.d.ts +1 -1
- package/dist/webdav/handlers/DELETE.handler.d.ts +0 -9
- package/dist/webdav/handlers/DELETE.handler.js +2 -16
- package/dist/webdav/handlers/GET.handler.d.ts +0 -13
- package/dist/webdav/handlers/GET.handler.js +6 -11
- 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 +37 -43
- 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 +2 -2
- 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 +29 -87
- package/oclif.manifest.json +429 -6
- package/package.json +27 -22
- package/dist/types/fast-xml-parser.types.d.ts +0 -59
- package/dist/types/fast-xml-parser.types.js +0 -2
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import { WebDavMethodHandler } from '../../types/webdav.types';
|
|
2
2
|
import { Request, Response } from 'express';
|
|
3
|
-
import { DriveFolderService } from '../../services/drive/drive-folder.service';
|
|
4
|
-
import { WebDavFolderService } from '../services/webdav-folder.service';
|
|
5
3
|
export declare class MKCOLRequestHandler implements WebDavMethodHandler {
|
|
6
|
-
private readonly dependencies;
|
|
7
|
-
constructor(dependencies: {
|
|
8
|
-
driveFolderService: DriveFolderService;
|
|
9
|
-
webDavFolderService: WebDavFolderService;
|
|
10
|
-
});
|
|
11
4
|
handle: (req: Request, res: Response) => Promise<void>;
|
|
12
5
|
}
|
|
@@ -4,28 +4,21 @@ exports.MKCOLRequestHandler = void 0;
|
|
|
4
4
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
5
5
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
6
6
|
const xml_utils_1 = require("../../utils/xml.utils");
|
|
7
|
+
const webdav_folder_service_1 = require("../../services/webdav/webdav-folder.service");
|
|
7
8
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
8
9
|
class MKCOLRequestHandler {
|
|
9
|
-
dependencies;
|
|
10
|
-
constructor(dependencies) {
|
|
11
|
-
this.dependencies = dependencies;
|
|
12
|
-
}
|
|
13
10
|
handle = async (req, res) => {
|
|
14
|
-
const { driveFolderService, webDavFolderService } = this.dependencies;
|
|
15
11
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
|
|
16
12
|
logger_utils_1.webdavLogger.info(`[MKCOL] Request received for folder at ${resource.url}`);
|
|
17
|
-
const parentDriveFolderItem = (await
|
|
18
|
-
(await
|
|
19
|
-
const driveFolderItem = await webdav_utils_1.WebDavUtils.getDriveFolderFromResource(
|
|
20
|
-
url: resource.url,
|
|
21
|
-
driveFolderService,
|
|
22
|
-
});
|
|
13
|
+
const parentDriveFolderItem = (await webdav_folder_service_1.WebDavFolderService.instance.getDriveFolderItemFromPath(resource.parentPath)) ??
|
|
14
|
+
(await webdav_folder_service_1.WebDavFolderService.instance.createParentPathOrThrow(resource.parentPath));
|
|
15
|
+
const driveFolderItem = await webdav_utils_1.WebDavUtils.getDriveFolderFromResource(resource.url);
|
|
23
16
|
const folderAlreadyExists = !!driveFolderItem;
|
|
24
17
|
if (folderAlreadyExists) {
|
|
25
18
|
logger_utils_1.webdavLogger.info(`[MKCOL] ❌ Folder '${resource.url}' already exists`);
|
|
26
19
|
throw new errors_utils_1.MethodNotAllowed('Folder already exists');
|
|
27
20
|
}
|
|
28
|
-
const newFolder = await
|
|
21
|
+
const newFolder = await webdav_folder_service_1.WebDavFolderService.instance.createFolder({
|
|
29
22
|
folderName: resource.path.base,
|
|
30
23
|
parentFolderUuid: parentDriveFolderItem.uuid,
|
|
31
24
|
});
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
|
-
import { DriveFileService } from '../../services/drive/drive-file.service';
|
|
3
|
-
import { DriveFolderService } from '../../services/drive/drive-folder.service';
|
|
4
2
|
import { WebDavMethodHandler } from '../../types/webdav.types';
|
|
5
|
-
import { WebDavFolderService } from '../services/webdav-folder.service';
|
|
6
3
|
export declare class MOVERequestHandler implements WebDavMethodHandler {
|
|
7
|
-
private readonly dependencies;
|
|
8
|
-
constructor(dependencies: {
|
|
9
|
-
driveFolderService: DriveFolderService;
|
|
10
|
-
driveFileService: DriveFileService;
|
|
11
|
-
webDavFolderService: WebDavFolderService;
|
|
12
|
-
});
|
|
13
4
|
handle: (req: Request, res: Response) => Promise<void>;
|
|
14
5
|
}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MOVERequestHandler = void 0;
|
|
4
|
+
const drive_file_service_1 = require("../../services/drive/drive-file.service");
|
|
5
|
+
const drive_folder_service_1 = require("../../services/drive/drive-folder.service");
|
|
4
6
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
5
7
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
6
8
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
9
|
+
const webdav_folder_service_1 = require("../../services/webdav/webdav-folder.service");
|
|
7
10
|
class MOVERequestHandler {
|
|
8
|
-
dependencies;
|
|
9
|
-
constructor(dependencies) {
|
|
10
|
-
this.dependencies = dependencies;
|
|
11
|
-
}
|
|
12
11
|
handle = async (req, res) => {
|
|
13
|
-
const { driveFolderService, driveFileService, webDavFolderService } = this.dependencies;
|
|
14
12
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
|
|
15
13
|
logger_utils_1.webdavLogger.info(`[MOVE] Request received for item at ${resource.url}`);
|
|
16
14
|
const destinationUrl = req.header('destination');
|
|
@@ -20,11 +18,7 @@ class MOVERequestHandler {
|
|
|
20
18
|
const destinationPath = webdav_utils_1.WebDavUtils.removeHostFromURL(destinationUrl);
|
|
21
19
|
const destinationResource = await webdav_utils_1.WebDavUtils.getRequestedResource(destinationPath);
|
|
22
20
|
logger_utils_1.webdavLogger.info('[MOVE] Destination resource found', { destinationResource });
|
|
23
|
-
const originalDriveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(
|
|
24
|
-
resource,
|
|
25
|
-
driveFolderService,
|
|
26
|
-
driveFileService,
|
|
27
|
-
});
|
|
21
|
+
const originalDriveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(resource);
|
|
28
22
|
if (!originalDriveItem) {
|
|
29
23
|
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
30
24
|
}
|
|
@@ -33,7 +27,7 @@ class MOVERequestHandler {
|
|
|
33
27
|
with UUID ${originalDriveItem.uuid} to ${destinationResource.name}`);
|
|
34
28
|
if (originalDriveItem.itemType === 'folder') {
|
|
35
29
|
const folder = originalDriveItem;
|
|
36
|
-
await
|
|
30
|
+
await drive_folder_service_1.DriveFolderService.instance.renameFolder({
|
|
37
31
|
folderUuid: folder.uuid,
|
|
38
32
|
name: destinationResource.name,
|
|
39
33
|
});
|
|
@@ -42,7 +36,7 @@ class MOVERequestHandler {
|
|
|
42
36
|
const file = originalDriveItem;
|
|
43
37
|
const plainName = destinationResource.path.name;
|
|
44
38
|
const fileType = destinationResource.path.ext.replace('.', '');
|
|
45
|
-
await
|
|
39
|
+
await drive_file_service_1.DriveFileService.instance.renameFile(file.uuid, {
|
|
46
40
|
plainName: plainName,
|
|
47
41
|
type: fileType,
|
|
48
42
|
});
|
|
@@ -50,11 +44,11 @@ class MOVERequestHandler {
|
|
|
50
44
|
}
|
|
51
45
|
else {
|
|
52
46
|
logger_utils_1.webdavLogger.info(`[MOVE] Moving ${originalDriveItem.itemType} with UUID ${originalDriveItem.uuid} to ${destinationPath}`);
|
|
53
|
-
const destinationFolderItem = (await
|
|
54
|
-
(await
|
|
47
|
+
const destinationFolderItem = (await webdav_folder_service_1.WebDavFolderService.instance.getDriveFolderItemFromPath(destinationResource.parentPath)) ??
|
|
48
|
+
(await webdav_folder_service_1.WebDavFolderService.instance.createParentPathOrThrow(destinationResource.parentPath));
|
|
55
49
|
if (originalDriveItem.itemType === 'folder') {
|
|
56
50
|
const folder = originalDriveItem;
|
|
57
|
-
await
|
|
51
|
+
await drive_folder_service_1.DriveFolderService.instance.moveFolder(folder.uuid, {
|
|
58
52
|
destinationFolder: destinationFolderItem.uuid,
|
|
59
53
|
name: destinationResource.name,
|
|
60
54
|
});
|
|
@@ -63,7 +57,7 @@ class MOVERequestHandler {
|
|
|
63
57
|
const file = originalDriveItem;
|
|
64
58
|
const plainName = destinationResource.path.name;
|
|
65
59
|
const fileType = destinationResource.path.ext.replace('.', '');
|
|
66
|
-
await
|
|
60
|
+
await drive_file_service_1.DriveFileService.instance.moveFile(file.uuid, {
|
|
67
61
|
destinationFolder: destinationFolderItem.uuid,
|
|
68
62
|
name: plainName,
|
|
69
63
|
type: fileType,
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { WebDavMethodHandler } from '../../types/webdav.types';
|
|
2
|
-
import { DriveFolderService } from '../../services/drive/drive-folder.service';
|
|
3
|
-
import { DriveFileService } from '../../services/drive/drive-file.service';
|
|
4
2
|
import { Request, Response } from 'express';
|
|
5
3
|
export declare class PROPFINDRequestHandler implements WebDavMethodHandler {
|
|
6
|
-
private readonly dependencies;
|
|
7
|
-
constructor(dependencies: {
|
|
8
|
-
driveFolderService: DriveFolderService;
|
|
9
|
-
driveFileService: DriveFileService;
|
|
10
|
-
});
|
|
11
4
|
handle: (req: Request, res: Response) => Promise<void>;
|
|
12
5
|
private readonly getFileMetaXML;
|
|
13
6
|
private readonly getFolderContentXML;
|
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.PROPFINDRequestHandler = void 0;
|
|
7
7
|
const xml_utils_1 = require("../../utils/xml.utils");
|
|
8
|
+
const drive_folder_service_1 = require("../../services/drive/drive-folder.service");
|
|
8
9
|
const format_utils_1 = require("../../utils/format.utils");
|
|
9
10
|
const node_crypto_1 = require("node:crypto");
|
|
10
11
|
const mime_types_1 = __importDefault(require("mime-types"));
|
|
@@ -12,19 +13,10 @@ const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
|
12
13
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
13
14
|
const usage_service_1 = require("../../services/usage.service");
|
|
14
15
|
class PROPFINDRequestHandler {
|
|
15
|
-
dependencies;
|
|
16
|
-
constructor(dependencies) {
|
|
17
|
-
this.dependencies = dependencies;
|
|
18
|
-
}
|
|
19
16
|
handle = async (req, res) => {
|
|
20
|
-
const { driveFolderService, driveFileService } = this.dependencies;
|
|
21
17
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
|
|
22
18
|
logger_utils_1.webdavLogger.info(`[PROPFIND] Request received for item at ${resource.url}`);
|
|
23
|
-
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(
|
|
24
|
-
resource,
|
|
25
|
-
driveFolderService,
|
|
26
|
-
driveFileService,
|
|
27
|
-
});
|
|
19
|
+
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(resource);
|
|
28
20
|
if (!driveItem) {
|
|
29
21
|
res.status(404).send();
|
|
30
22
|
return;
|
|
@@ -83,8 +75,7 @@ class PROPFINDRequestHandler {
|
|
|
83
75
|
return xml;
|
|
84
76
|
};
|
|
85
77
|
getFolderChildsXMLNode = async (relativePath, folderUuid) => {
|
|
86
|
-
const
|
|
87
|
-
const folderContent = await driveFolderService.getFolderContent(folderUuid);
|
|
78
|
+
const folderContent = await drive_folder_service_1.DriveFolderService.instance.getFolderContent(folderUuid);
|
|
88
79
|
const foldersXML = folderContent.folders.map((folder) => {
|
|
89
80
|
const folderRelativePath = webdav_utils_1.WebDavUtils.joinURL(relativePath, folder.plainName, '/');
|
|
90
81
|
return this.driveFolderItemToXMLNode({
|
|
@@ -94,11 +85,10 @@ class PROPFINDRequestHandler {
|
|
|
94
85
|
status: folder.deleted || folder.removed ? 'TRASHED' : 'EXISTS',
|
|
95
86
|
createdAt: new Date(folder.createdAt),
|
|
96
87
|
updatedAt: new Date(folder.updatedAt),
|
|
97
|
-
|
|
98
|
-
|
|
88
|
+
creationTime: new Date(folder.creationTime),
|
|
89
|
+
modificationTime: new Date(folder.modificationTime),
|
|
99
90
|
uuid: folder.uuid,
|
|
100
|
-
|
|
101
|
-
parentUuid: null,
|
|
91
|
+
parentUuid: folder.parentUuid,
|
|
102
92
|
}, folderRelativePath);
|
|
103
93
|
});
|
|
104
94
|
const filesXML = folderContent.files.map((file) => {
|
|
@@ -107,12 +97,10 @@ class PROPFINDRequestHandler {
|
|
|
107
97
|
itemType: 'file',
|
|
108
98
|
name: file.plainName,
|
|
109
99
|
bucket: file.bucket,
|
|
110
|
-
id: file.id,
|
|
111
100
|
fileId: file.fileId,
|
|
112
101
|
uuid: file.uuid,
|
|
113
102
|
type: file.type,
|
|
114
103
|
status: file.status,
|
|
115
|
-
folderId: file.folderId,
|
|
116
104
|
folderUuid: file.folderUuid,
|
|
117
105
|
size: Number(file.size),
|
|
118
106
|
creationTime: new Date(file.creationTime),
|
|
@@ -124,7 +112,7 @@ class PROPFINDRequestHandler {
|
|
|
124
112
|
return foldersXML.concat(filesXML);
|
|
125
113
|
};
|
|
126
114
|
driveFolderRootStatsToXMLNode = async (driveFolderItem, relativePath) => {
|
|
127
|
-
const totalUsage =
|
|
115
|
+
const totalUsage = await usage_service_1.UsageService.instance.fetchUsage();
|
|
128
116
|
const spaceLimit = await usage_service_1.UsageService.instance.fetchSpaceLimit();
|
|
129
117
|
const driveFolderXML = {
|
|
130
118
|
[xml_utils_1.XMLUtils.addDefaultNamespace('href')]: xml_utils_1.XMLUtils.encodeWebDavUri(relativePath),
|
|
@@ -1,20 +1,5 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
|
-
import { DriveFileService } from '../../services/drive/drive-file.service';
|
|
3
|
-
import { NetworkFacade } from '../../services/network/network-facade.service';
|
|
4
|
-
import { AuthService } from '../../services/auth.service';
|
|
5
2
|
import { WebDavMethodHandler } from '../../types/webdav.types';
|
|
6
|
-
import { TrashService } from '../../services/drive/trash.service';
|
|
7
|
-
import { WebDavFolderService } from '../services/webdav-folder.service';
|
|
8
|
-
import { DriveFolderService } from '../../services/drive/drive-folder.service';
|
|
9
3
|
export declare class PUTRequestHandler implements WebDavMethodHandler {
|
|
10
|
-
private readonly dependencies;
|
|
11
|
-
constructor(dependencies: {
|
|
12
|
-
driveFileService: DriveFileService;
|
|
13
|
-
driveFolderService: DriveFolderService;
|
|
14
|
-
webDavFolderService: WebDavFolderService;
|
|
15
|
-
trashService: TrashService;
|
|
16
|
-
authService: AuthService;
|
|
17
|
-
networkFacade: NetworkFacade;
|
|
18
|
-
});
|
|
19
4
|
handle: (req: Request, res: Response) => Promise<void>;
|
|
20
5
|
}
|
|
@@ -2,30 +2,25 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PUTRequestHandler = void 0;
|
|
4
4
|
const drive_file_service_1 = require("../../services/drive/drive-file.service");
|
|
5
|
+
const auth_service_1 = require("../../services/auth.service");
|
|
5
6
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
6
7
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
7
8
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
8
9
|
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
9
10
|
const cli_utils_1 = require("../../utils/cli.utils");
|
|
10
11
|
const stream_utils_1 = require("../../utils/stream.utils");
|
|
11
|
-
const
|
|
12
|
+
const webdav_folder_service_1 = require("../../services/webdav/webdav-folder.service");
|
|
12
13
|
const async_utils_1 = require("../../utils/async.utils");
|
|
14
|
+
const thumbnail_utils_1 = require("../../utils/thumbnail.utils");
|
|
15
|
+
const thumbnail_service_1 = require("../../services/thumbnail.service");
|
|
13
16
|
class PUTRequestHandler {
|
|
14
|
-
dependencies;
|
|
15
|
-
constructor(dependencies) {
|
|
16
|
-
this.dependencies = dependencies;
|
|
17
|
-
}
|
|
18
17
|
handle = async (req, res) => {
|
|
19
18
|
let contentLength = Number(req.headers['content-length']);
|
|
20
19
|
if (!contentLength || Number.isNaN(contentLength) || contentLength <= 0) {
|
|
21
20
|
contentLength = 0;
|
|
22
21
|
}
|
|
23
22
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
|
|
24
|
-
const driveFileItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(
|
|
25
|
-
resource: resource,
|
|
26
|
-
driveFileService: this.dependencies.driveFileService,
|
|
27
|
-
driveFolderService: this.dependencies.driveFolderService,
|
|
28
|
-
});
|
|
23
|
+
const driveFileItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(resource);
|
|
29
24
|
if (driveFileItem?.itemType === 'folder') {
|
|
30
25
|
throw new errors_utils_1.NotFoundError('Folders cannot be created with PUT. Use MKCOL instead.');
|
|
31
26
|
}
|
|
@@ -36,27 +31,26 @@ class PUTRequestHandler {
|
|
|
36
31
|
driveUpload: 0,
|
|
37
32
|
thumbnailUpload: 0,
|
|
38
33
|
};
|
|
39
|
-
const parentDriveFolderItem = (await
|
|
40
|
-
(await
|
|
34
|
+
const parentDriveFolderItem = (await webdav_folder_service_1.WebDavFolderService.instance.getDriveFolderItemFromPath(resource.parentPath)) ??
|
|
35
|
+
(await webdav_folder_service_1.WebDavFolderService.instance.createParentPathOrThrow(resource.parentPath));
|
|
41
36
|
try {
|
|
42
37
|
if (driveFileItem && driveFileItem.status === 'EXISTS') {
|
|
43
|
-
logger_utils_1.webdavLogger.info(`[PUT] File '${resource.name}' already exists in '${resource.path.dir}',
|
|
44
|
-
await
|
|
45
|
-
items: [{ type: driveFileItem.itemType, uuid: driveFileItem.uuid }],
|
|
46
|
-
});
|
|
38
|
+
logger_utils_1.webdavLogger.info(`[PUT] File '${resource.name}' already exists in '${resource.path.dir}', it will be replaced...`);
|
|
39
|
+
await webdav_utils_1.WebDavUtils.deleteOrTrashItem(driveFileItem);
|
|
47
40
|
}
|
|
48
41
|
}
|
|
49
42
|
catch {
|
|
50
43
|
}
|
|
51
|
-
const { user } = await
|
|
44
|
+
const { user } = await auth_service_1.AuthService.instance.getAuthDetails();
|
|
52
45
|
const fileType = resource.path.ext.replace('.', '');
|
|
53
46
|
let bufferStream;
|
|
54
47
|
let fileStream = req;
|
|
55
|
-
const isThumbnailable =
|
|
48
|
+
const isThumbnailable = thumbnail_utils_1.ThumbnailUtils.isFileThumbnailable(fileType);
|
|
56
49
|
if (isThumbnailable) {
|
|
57
50
|
bufferStream = new stream_utils_1.BufferStream();
|
|
58
51
|
fileStream = req.pipe(bufferStream);
|
|
59
52
|
}
|
|
53
|
+
const { networkFacade, bucket } = await cli_utils_1.CLIUtils.prepareNetwork(user);
|
|
60
54
|
let fileId;
|
|
61
55
|
if (contentLength > 0) {
|
|
62
56
|
let uploaded = false, aborted = false;
|
|
@@ -66,21 +60,20 @@ class PUTRequestHandler {
|
|
|
66
60
|
}
|
|
67
61
|
};
|
|
68
62
|
const networkUploadTimer = cli_utils_1.CLIUtils.timer();
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
});
|
|
63
|
+
const abortable = new AbortController();
|
|
64
|
+
fileId = await networkFacade.uploadFile({
|
|
65
|
+
from: fileStream,
|
|
66
|
+
size: contentLength,
|
|
67
|
+
bucketId: bucket,
|
|
68
|
+
progressCallback,
|
|
69
|
+
abortSignal: abortable.signal,
|
|
70
|
+
});
|
|
71
|
+
res.on('close', async () => {
|
|
72
|
+
aborted = true;
|
|
73
|
+
if (!uploaded) {
|
|
74
|
+
logger_utils_1.webdavLogger.info('[PUT] ❌ HTTP Client has been disconnected, res has been closed.');
|
|
75
|
+
abortable.abort();
|
|
76
|
+
}
|
|
84
77
|
});
|
|
85
78
|
uploaded = true;
|
|
86
79
|
timings.networkUpload = networkUploadTimer.stop();
|
|
@@ -92,29 +85,30 @@ class PUTRequestHandler {
|
|
|
92
85
|
type: fileType,
|
|
93
86
|
size: contentLength,
|
|
94
87
|
folderUuid: parentDriveFolderItem.uuid,
|
|
95
|
-
fileId
|
|
96
|
-
bucket
|
|
88
|
+
fileId,
|
|
89
|
+
bucket,
|
|
97
90
|
encryptVersion: types_1.EncryptionVersion.Aes03,
|
|
98
91
|
});
|
|
99
92
|
timings.driveUpload = driveTimer.stop();
|
|
100
93
|
const thumbnailTimer = cli_utils_1.CLIUtils.timer();
|
|
101
94
|
if (contentLength > 0 && isThumbnailable && bufferStream) {
|
|
102
|
-
|
|
95
|
+
await thumbnail_service_1.ThumbnailService.instance.tryUploadThumbnail({
|
|
96
|
+
fileUuid: file.uuid,
|
|
103
97
|
bufferStream,
|
|
104
98
|
fileType,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
99
|
+
bucket,
|
|
100
|
+
networkFacade,
|
|
101
|
+
size: contentLength,
|
|
108
102
|
});
|
|
109
103
|
}
|
|
110
104
|
timings.thumbnailUpload = thumbnailTimer.stop();
|
|
111
105
|
const totalTime = Object.values(timings).reduce((sum, time) => sum + time, 0);
|
|
112
106
|
const throughputMBps = cli_utils_1.CLIUtils.calculateThroughputMBps(contentLength, timings.networkUpload);
|
|
113
107
|
logger_utils_1.webdavLogger.info(`[PUT] ✅ File uploaded in ${cli_utils_1.CLIUtils.formatDuration(totalTime)} to Internxt Drive`);
|
|
114
|
-
logger_utils_1.webdavLogger.info(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
108
|
+
logger_utils_1.webdavLogger.info('[PUT] Timing breakdown:\n' +
|
|
109
|
+
`Network upload: ${cli_utils_1.CLIUtils.formatDuration(timings.networkUpload)} (${throughputMBps.toFixed(2)} MB/s)\n` +
|
|
110
|
+
`Drive upload: ${cli_utils_1.CLIUtils.formatDuration(timings.driveUpload)}\n` +
|
|
111
|
+
`Thumbnail: ${cli_utils_1.CLIUtils.formatDuration(timings.thumbnailUpload)}\n`);
|
|
118
112
|
await async_utils_1.AsyncUtils.sleep(500);
|
|
119
113
|
logger_utils_1.webdavLogger.info(`[PUT] [RESPONSE-201] ${resource.url} - Returning 201 Created after ${cli_utils_1.CLIUtils.formatDuration(totalTime)}`);
|
|
120
114
|
res.status(201).send();
|
package/dist/webdav/index.js
CHANGED
|
@@ -7,22 +7,20 @@ const dotenv_1 = __importDefault(require("dotenv"));
|
|
|
7
7
|
const webdav_server_1 = require("./webdav-server");
|
|
8
8
|
const express_1 = __importDefault(require("express"));
|
|
9
9
|
const config_service_1 = require("../services/config.service");
|
|
10
|
-
const drive_folder_service_1 = require("../services/drive/drive-folder.service");
|
|
11
|
-
const drive_file_service_1 = require("../services/drive/drive-file.service");
|
|
12
|
-
const download_service_1 = require("../services/network/download.service");
|
|
13
10
|
const auth_service_1 = require("../services/auth.service");
|
|
14
|
-
const crypto_service_1 = require("../services/crypto.service");
|
|
15
|
-
const trash_service_1 = require("../services/drive/trash.service");
|
|
16
11
|
const logger_utils_1 = require("../utils/logger.utils");
|
|
17
12
|
const sdk_manager_service_1 = require("../services/sdk-manager.service");
|
|
13
|
+
const database_service_1 = require("../services/database/database.service");
|
|
18
14
|
dotenv_1.default.config({ quiet: true });
|
|
19
15
|
const init = async () => {
|
|
20
16
|
await config_service_1.ConfigService.instance.ensureInternxtCliDataDirExists();
|
|
21
17
|
await config_service_1.ConfigService.instance.ensureWebdavCertsDirExists();
|
|
22
18
|
await config_service_1.ConfigService.instance.ensureInternxtLogsDirExists();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
await database_service_1.DatabaseService.instance.initialize();
|
|
20
|
+
await database_service_1.DatabaseService.instance.clear();
|
|
21
|
+
const { token, workspace } = await auth_service_1.AuthService.instance.getAuthDetails();
|
|
22
|
+
sdk_manager_service_1.SdkManager.init({ token, workspaceToken: workspace?.workspaceCredentials.token });
|
|
23
|
+
new webdav_server_1.WebDavServer((0, express_1.default)())
|
|
26
24
|
.start()
|
|
27
25
|
.then()
|
|
28
26
|
.catch((err) => logger_utils_1.webdavLogger.error('Failed to start WebDAV server', err));
|
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AuthMiddleware = void 0;
|
|
4
4
|
const sdk_manager_service_1 = require("../../services/sdk-manager.service");
|
|
5
|
+
const auth_service_1 = require("../../services/auth.service");
|
|
5
6
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
6
7
|
const xml_utils_1 = require("../../utils/xml.utils");
|
|
7
8
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
8
|
-
const AuthMiddleware = (
|
|
9
|
+
const AuthMiddleware = () => {
|
|
9
10
|
return (_, res, next) => {
|
|
10
11
|
(async () => {
|
|
11
12
|
try {
|
|
12
|
-
const { token } = await
|
|
13
|
-
sdk_manager_service_1.SdkManager.init({ token });
|
|
13
|
+
const { token, workspace } = await auth_service_1.AuthService.instance.getAuthDetails();
|
|
14
|
+
sdk_manager_service_1.SdkManager.init({ token, workspaceToken: workspace?.workspaceCredentials.token });
|
|
14
15
|
next();
|
|
15
16
|
}
|
|
16
17
|
catch (error) {
|
|
17
18
|
let message = 'Authentication required to access this resource.';
|
|
18
|
-
if (
|
|
19
|
+
if (errors_utils_1.ErrorUtils.isError(error)) {
|
|
19
20
|
message = error.message;
|
|
20
21
|
if (error.stack) {
|
|
21
22
|
logger_utils_1.webdavLogger.error(`Error from AuthMiddleware: ${message}\nStack: ${error.stack}`);
|
|
@@ -5,8 +5,8 @@ const logger_utils_1 = require("../../utils/logger.utils");
|
|
|
5
5
|
const xml_utils_1 = require("../../utils/xml.utils");
|
|
6
6
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
7
7
|
const ErrorHandlingMiddleware = (err, req, res, _) => {
|
|
8
|
-
const message =
|
|
9
|
-
if (
|
|
8
|
+
const message = errors_utils_1.ErrorUtils.isError(err) ? err.message : 'Something went wrong';
|
|
9
|
+
if (errors_utils_1.ErrorUtils.isError(err) && err.stack) {
|
|
10
10
|
logger_utils_1.webdavLogger.error(`[ERROR MIDDLEWARE] [${req.method.toUpperCase()} - ${req.url}] ${message}\nStack: ${err.stack}`);
|
|
11
11
|
}
|
|
12
12
|
else {
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebDAVAuthMiddleware = void 0;
|
|
4
|
+
const xml_utils_1 = require("../../utils/xml.utils");
|
|
5
|
+
const WebDAVAuthMiddleware = (configs) => {
|
|
6
|
+
return (req, res, next) => {
|
|
7
|
+
(async () => {
|
|
8
|
+
if (configs.customAuth) {
|
|
9
|
+
const authHeader = req.headers.authorization;
|
|
10
|
+
if (!authHeader) {
|
|
11
|
+
return sendUnauthorizedError(res, 'Missing Authorization header.');
|
|
12
|
+
}
|
|
13
|
+
if (!authHeader.startsWith('Basic ')) {
|
|
14
|
+
return sendUnauthorizedError(res, 'Unsupported authentication method. Only Basic authentication is supported.');
|
|
15
|
+
}
|
|
16
|
+
const base64Credentials = authHeader.substring(6);
|
|
17
|
+
const credentials = Buffer.from(base64Credentials, 'base64').toString('utf-8');
|
|
18
|
+
const [username, password] = credentials.split(':');
|
|
19
|
+
if (!username || !password) {
|
|
20
|
+
return sendUnauthorizedError(res, 'Invalid authentication credentials format.');
|
|
21
|
+
}
|
|
22
|
+
if (username !== configs.username || password !== configs.password) {
|
|
23
|
+
return sendUnauthorizedError(res, 'Authentication failed. Please check your WebDAV custom credentials.');
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
next();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
next();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
})();
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
exports.WebDAVAuthMiddleware = WebDAVAuthMiddleware;
|
|
38
|
+
const sendUnauthorizedError = (res, message) => {
|
|
39
|
+
const errorBodyXML = xml_utils_1.XMLUtils.toWebDavXML({
|
|
40
|
+
[xml_utils_1.XMLUtils.addDefaultNamespace('responsedescription')]: message,
|
|
41
|
+
}, {}, 'error');
|
|
42
|
+
res.status(401).send(errorBodyXML);
|
|
43
|
+
return;
|
|
44
|
+
};
|
|
@@ -1,24 +1,11 @@
|
|
|
1
1
|
import { Express } from 'express';
|
|
2
|
-
import {
|
|
3
|
-
import { DriveFolderService } from '../services/drive/drive-folder.service';
|
|
4
|
-
import { DriveFileService } from '../services/drive/drive-file.service';
|
|
5
|
-
import { DownloadService } from '../services/network/download.service';
|
|
6
|
-
import { AuthService } from '../services/auth.service';
|
|
7
|
-
import { CryptoService } from '../services/crypto.service';
|
|
8
|
-
import { TrashService } from '../services/drive/trash.service';
|
|
2
|
+
import { WebdavConfig } from '../types/command.types';
|
|
9
3
|
export declare class WebDavServer {
|
|
10
4
|
private readonly app;
|
|
11
|
-
|
|
12
|
-
private readonly driveFileService;
|
|
13
|
-
private readonly driveFolderService;
|
|
14
|
-
private readonly downloadService;
|
|
15
|
-
private readonly authService;
|
|
16
|
-
private readonly cryptoService;
|
|
17
|
-
private readonly trashService;
|
|
18
|
-
constructor(app: Express, configService: ConfigService, driveFileService: DriveFileService, driveFolderService: DriveFolderService, downloadService: DownloadService, authService: AuthService, cryptoService: CryptoService, trashService: TrashService);
|
|
19
|
-
private readonly getNetworkFacade;
|
|
5
|
+
constructor(app: Express);
|
|
20
6
|
private readonly registerStartMiddlewares;
|
|
21
7
|
private readonly registerEndMiddleWares;
|
|
22
8
|
private readonly registerHandlers;
|
|
9
|
+
static readonly checkwebDAVCredentials: (configs: WebdavConfig) => void;
|
|
23
10
|
start: () => Promise<void>;
|
|
24
11
|
}
|