@internxt/cli 1.6.2 → 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +410 -71
- package/dist/commands/add-cert.d.ts +1 -1
- package/dist/commands/add-cert.js +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 +32 -21
- 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 +3 -7
- package/dist/services/network/network-facade.service.js +9 -11
- package/dist/services/network/upload/upload-facade.service.d.ts +1 -1
- package/dist/services/network/upload/upload-facade.service.js +14 -7
- package/dist/services/network/upload/upload-file.service.d.ts +3 -3
- package/dist/services/network/upload/upload-file.service.js +33 -23
- 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 +29 -2
- package/dist/services/universal-link.service.d.ts +3 -1
- package/dist/services/universal-link.service.js +15 -3
- package/dist/services/usage.service.d.ts +1 -2
- package/dist/services/usage.service.js +1 -1
- package/dist/services/validation.service.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 +4 -20
- package/dist/utils/webdav.utils.js +12 -14
- package/dist/webdav/handlers/DELETE.handler.d.ts +0 -9
- package/dist/webdav/handlers/DELETE.handler.js +18 -16
- package/dist/webdav/handlers/GET.handler.d.ts +0 -13
- package/dist/webdav/handlers/GET.handler.js +6 -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 +24 -26
- 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 +25 -20
|
@@ -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,26 @@
|
|
|
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");
|
|
9
|
+
const trash_service_1 = require("../../services/drive/trash.service");
|
|
8
10
|
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
9
11
|
const cli_utils_1 = require("../../utils/cli.utils");
|
|
10
12
|
const stream_utils_1 = require("../../utils/stream.utils");
|
|
11
|
-
const
|
|
13
|
+
const webdav_folder_service_1 = require("../../services/webdav/webdav-folder.service");
|
|
12
14
|
const async_utils_1 = require("../../utils/async.utils");
|
|
15
|
+
const thumbnail_utils_1 = require("../../utils/thumbnail.utils");
|
|
16
|
+
const thumbnail_service_1 = require("../../services/thumbnail.service");
|
|
13
17
|
class PUTRequestHandler {
|
|
14
|
-
dependencies;
|
|
15
|
-
constructor(dependencies) {
|
|
16
|
-
this.dependencies = dependencies;
|
|
17
|
-
}
|
|
18
18
|
handle = async (req, res) => {
|
|
19
19
|
let contentLength = Number(req.headers['content-length']);
|
|
20
20
|
if (!contentLength || Number.isNaN(contentLength) || contentLength <= 0) {
|
|
21
21
|
contentLength = 0;
|
|
22
22
|
}
|
|
23
23
|
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
|
-
});
|
|
24
|
+
const driveFileItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(resource);
|
|
29
25
|
if (driveFileItem?.itemType === 'folder') {
|
|
30
26
|
throw new errors_utils_1.NotFoundError('Folders cannot be created with PUT. Use MKCOL instead.');
|
|
31
27
|
}
|
|
@@ -36,27 +32,28 @@ class PUTRequestHandler {
|
|
|
36
32
|
driveUpload: 0,
|
|
37
33
|
thumbnailUpload: 0,
|
|
38
34
|
};
|
|
39
|
-
const parentDriveFolderItem = (await
|
|
40
|
-
(await
|
|
35
|
+
const parentDriveFolderItem = (await webdav_folder_service_1.WebDavFolderService.instance.getDriveFolderItemFromPath(resource.parentPath)) ??
|
|
36
|
+
(await webdav_folder_service_1.WebDavFolderService.instance.createParentPathOrThrow(resource.parentPath));
|
|
41
37
|
try {
|
|
42
38
|
if (driveFileItem && driveFileItem.status === 'EXISTS') {
|
|
43
39
|
logger_utils_1.webdavLogger.info(`[PUT] File '${resource.name}' already exists in '${resource.path.dir}', trashing it...`);
|
|
44
|
-
await
|
|
40
|
+
await trash_service_1.TrashService.instance.trashItems({
|
|
45
41
|
items: [{ type: driveFileItem.itemType, uuid: driveFileItem.uuid }],
|
|
46
42
|
});
|
|
47
43
|
}
|
|
48
44
|
}
|
|
49
45
|
catch {
|
|
50
46
|
}
|
|
51
|
-
const { user } = await
|
|
47
|
+
const { user } = await auth_service_1.AuthService.instance.getAuthDetails();
|
|
52
48
|
const fileType = resource.path.ext.replace('.', '');
|
|
53
49
|
let bufferStream;
|
|
54
50
|
let fileStream = req;
|
|
55
|
-
const isThumbnailable =
|
|
51
|
+
const isThumbnailable = thumbnail_utils_1.ThumbnailUtils.isFileThumbnailable(fileType);
|
|
56
52
|
if (isThumbnailable) {
|
|
57
53
|
bufferStream = new stream_utils_1.BufferStream();
|
|
58
54
|
fileStream = req.pipe(bufferStream);
|
|
59
55
|
}
|
|
56
|
+
const { networkFacade, bucket } = await cli_utils_1.CLIUtils.prepareNetwork(user);
|
|
60
57
|
let fileId;
|
|
61
58
|
if (contentLength > 0) {
|
|
62
59
|
let uploaded = false, aborted = false;
|
|
@@ -67,7 +64,7 @@ class PUTRequestHandler {
|
|
|
67
64
|
};
|
|
68
65
|
const networkUploadTimer = cli_utils_1.CLIUtils.timer();
|
|
69
66
|
fileId = await new Promise((resolve, reject) => {
|
|
70
|
-
const state =
|
|
67
|
+
const state = networkFacade.uploadFile(fileStream, contentLength, bucket, (err, res) => {
|
|
71
68
|
if (err) {
|
|
72
69
|
aborted = true;
|
|
73
70
|
return reject(err);
|
|
@@ -92,29 +89,30 @@ class PUTRequestHandler {
|
|
|
92
89
|
type: fileType,
|
|
93
90
|
size: contentLength,
|
|
94
91
|
folderUuid: parentDriveFolderItem.uuid,
|
|
95
|
-
fileId
|
|
96
|
-
bucket
|
|
92
|
+
fileId,
|
|
93
|
+
bucket,
|
|
97
94
|
encryptVersion: types_1.EncryptionVersion.Aes03,
|
|
98
95
|
});
|
|
99
96
|
timings.driveUpload = driveTimer.stop();
|
|
100
97
|
const thumbnailTimer = cli_utils_1.CLIUtils.timer();
|
|
101
98
|
if (contentLength > 0 && isThumbnailable && bufferStream) {
|
|
102
|
-
|
|
99
|
+
await thumbnail_service_1.ThumbnailService.instance.tryUploadThumbnail({
|
|
100
|
+
fileUuid: file.uuid,
|
|
103
101
|
bufferStream,
|
|
104
102
|
fileType,
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
103
|
+
bucket,
|
|
104
|
+
networkFacade,
|
|
105
|
+
size: contentLength,
|
|
108
106
|
});
|
|
109
107
|
}
|
|
110
108
|
timings.thumbnailUpload = thumbnailTimer.stop();
|
|
111
109
|
const totalTime = Object.values(timings).reduce((sum, time) => sum + time, 0);
|
|
112
110
|
const throughputMBps = cli_utils_1.CLIUtils.calculateThroughputMBps(contentLength, timings.networkUpload);
|
|
113
111
|
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
|
-
|
|
112
|
+
logger_utils_1.webdavLogger.info('[PUT] Timing breakdown:\n' +
|
|
113
|
+
`Network upload: ${cli_utils_1.CLIUtils.formatDuration(timings.networkUpload)} (${throughputMBps.toFixed(2)} MB/s)\n` +
|
|
114
|
+
`Drive upload: ${cli_utils_1.CLIUtils.formatDuration(timings.driveUpload)}\n` +
|
|
115
|
+
`Thumbnail: ${cli_utils_1.CLIUtils.formatDuration(timings.thumbnailUpload)}\n`);
|
|
118
116
|
await async_utils_1.AsyncUtils.sleep(500);
|
|
119
117
|
logger_utils_1.webdavLogger.info(`[PUT] [RESPONSE-201] ${resource.url} - Returning 201 Created after ${cli_utils_1.CLIUtils.formatDuration(totalTime)}`);
|
|
120
118
|
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
|
}
|
|
@@ -15,13 +15,9 @@ const auth_middleware_1 = require("./middewares/auth.middleware");
|
|
|
15
15
|
const request_logger_middleware_1 = require("./middewares/request-logger.middleware");
|
|
16
16
|
const GET_handler_1 = require("./handlers/GET.handler");
|
|
17
17
|
const HEAD_handler_1 = require("./handlers/HEAD.handler");
|
|
18
|
-
const download_service_1 = require("../services/network/download.service");
|
|
19
|
-
const auth_service_1 = require("../services/auth.service");
|
|
20
|
-
const crypto_service_1 = require("../services/crypto.service");
|
|
21
18
|
const errors_middleware_1 = require("./middewares/errors.middleware");
|
|
22
19
|
const express_async_handler_1 = __importDefault(require("express-async-handler"));
|
|
23
20
|
const sdk_manager_service_1 = require("../services/sdk-manager.service");
|
|
24
|
-
const network_facade_service_1 = require("../services/network/network-facade.service");
|
|
25
21
|
const network_utils_1 = require("../utils/network.utils");
|
|
26
22
|
const PUT_handler_1 = require("./handlers/PUT.handler");
|
|
27
23
|
const MKCOL_handler_1 = require("./handlers/MKCOL.handler");
|
|
@@ -29,48 +25,16 @@ const DELETE_handler_1 = require("./handlers/DELETE.handler");
|
|
|
29
25
|
const PROPPATCH_handler_1 = require("./handlers/PROPPATCH.handler");
|
|
30
26
|
const MOVE_handler_1 = require("./handlers/MOVE.handler");
|
|
31
27
|
const COPY_handler_1 = require("./handlers/COPY.handler");
|
|
32
|
-
const inxt_js_1 = require("@internxt/inxt-js");
|
|
33
28
|
const mkcol_middleware_1 = require("./middewares/mkcol.middleware");
|
|
34
|
-
const
|
|
29
|
+
const webdav_auth_middleware_1 = require("./middewares/webdav-auth.middleware");
|
|
35
30
|
class WebDavServer {
|
|
36
31
|
app;
|
|
37
|
-
|
|
38
|
-
driveFileService;
|
|
39
|
-
driveFolderService;
|
|
40
|
-
downloadService;
|
|
41
|
-
authService;
|
|
42
|
-
cryptoService;
|
|
43
|
-
trashService;
|
|
44
|
-
constructor(app, configService, driveFileService, driveFolderService, downloadService, authService, cryptoService, trashService) {
|
|
32
|
+
constructor(app) {
|
|
45
33
|
this.app = app;
|
|
46
|
-
this.configService = configService;
|
|
47
|
-
this.driveFileService = driveFileService;
|
|
48
|
-
this.driveFolderService = driveFolderService;
|
|
49
|
-
this.downloadService = downloadService;
|
|
50
|
-
this.authService = authService;
|
|
51
|
-
this.cryptoService = cryptoService;
|
|
52
|
-
this.trashService = trashService;
|
|
53
34
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
throw new Error('Credentials not found in Config service, do login first');
|
|
58
|
-
const networkModule = sdk_manager_service_1.SdkManager.instance.getNetwork({
|
|
59
|
-
user: credentials.user.bridgeUser,
|
|
60
|
-
pass: credentials.user.userId,
|
|
61
|
-
});
|
|
62
|
-
const environment = new inxt_js_1.Environment({
|
|
63
|
-
bridgeUser: credentials.user.bridgeUser,
|
|
64
|
-
bridgePass: credentials.user.userId,
|
|
65
|
-
bridgeUrl: config_service_1.ConfigService.instance.get('NETWORK_URL'),
|
|
66
|
-
encryptionKey: credentials.user.mnemonic,
|
|
67
|
-
appDetails: sdk_manager_service_1.SdkManager.getAppDetails(),
|
|
68
|
-
});
|
|
69
|
-
const networkFacade = new network_facade_service_1.NetworkFacade(networkModule, environment, download_service_1.DownloadService.instance, crypto_service_1.CryptoService.instance);
|
|
70
|
-
return networkFacade;
|
|
71
|
-
};
|
|
72
|
-
registerStartMiddlewares = () => {
|
|
73
|
-
this.app.use((0, auth_middleware_1.AuthMiddleware)(auth_service_1.AuthService.instance));
|
|
35
|
+
registerStartMiddlewares = (configs) => {
|
|
36
|
+
this.app.use((0, webdav_auth_middleware_1.WebDAVAuthMiddleware)(configs));
|
|
37
|
+
this.app.use((0, auth_middleware_1.AuthMiddleware)());
|
|
74
38
|
this.app.use((0, request_logger_middleware_1.RequestLoggerMiddleware)({
|
|
75
39
|
enable: true,
|
|
76
40
|
}));
|
|
@@ -80,58 +44,35 @@ class WebDavServer {
|
|
|
80
44
|
registerEndMiddleWares = () => {
|
|
81
45
|
this.app.use(errors_middleware_1.ErrorHandlingMiddleware);
|
|
82
46
|
};
|
|
83
|
-
registerHandlers =
|
|
47
|
+
registerHandlers = () => {
|
|
84
48
|
const serverListenPath = /(.*)/;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
driveFolderService: this.driveFolderService,
|
|
88
|
-
configService: this.configService,
|
|
89
|
-
});
|
|
90
|
-
this.app.head(serverListenPath, (0, express_async_handler_1.default)(new HEAD_handler_1.HEADRequestHandler({
|
|
91
|
-
driveFileService: this.driveFileService,
|
|
92
|
-
}).handle));
|
|
93
|
-
this.app.get(serverListenPath, (0, express_async_handler_1.default)(new GET_handler_1.GETRequestHandler({
|
|
94
|
-
driveFileService: this.driveFileService,
|
|
95
|
-
downloadService: this.downloadService,
|
|
96
|
-
cryptoService: this.cryptoService,
|
|
97
|
-
authService: this.authService,
|
|
98
|
-
networkFacade: networkFacade,
|
|
99
|
-
}).handle));
|
|
49
|
+
this.app.head(serverListenPath, (0, express_async_handler_1.default)(new HEAD_handler_1.HEADRequestHandler().handle));
|
|
50
|
+
this.app.get(serverListenPath, (0, express_async_handler_1.default)(new GET_handler_1.GETRequestHandler().handle));
|
|
100
51
|
this.app.options(serverListenPath, (0, express_async_handler_1.default)(new OPTIONS_handler_1.OPTIONSRequestHandler().handle));
|
|
101
|
-
this.app.propfind(serverListenPath, (0, express_async_handler_1.default)(new PROPFIND_handler_1.PROPFINDRequestHandler(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
this.app.put(serverListenPath, (0, express_async_handler_1.default)(new PUT_handler_1.PUTRequestHandler({
|
|
106
|
-
driveFileService: this.driveFileService,
|
|
107
|
-
driveFolderService: this.driveFolderService,
|
|
108
|
-
webDavFolderService: webDavFolderService,
|
|
109
|
-
authService: this.authService,
|
|
110
|
-
trashService: this.trashService,
|
|
111
|
-
networkFacade: networkFacade,
|
|
112
|
-
}).handle));
|
|
113
|
-
this.app.mkcol(serverListenPath, (0, express_async_handler_1.default)(new MKCOL_handler_1.MKCOLRequestHandler({
|
|
114
|
-
driveFolderService: this.driveFolderService,
|
|
115
|
-
webDavFolderService: webDavFolderService,
|
|
116
|
-
}).handle));
|
|
117
|
-
this.app.delete(serverListenPath, (0, express_async_handler_1.default)(new DELETE_handler_1.DELETERequestHandler({
|
|
118
|
-
trashService: this.trashService,
|
|
119
|
-
driveFileService: this.driveFileService,
|
|
120
|
-
driveFolderService: this.driveFolderService,
|
|
121
|
-
}).handle));
|
|
52
|
+
this.app.propfind(serverListenPath, (0, express_async_handler_1.default)(new PROPFIND_handler_1.PROPFINDRequestHandler().handle));
|
|
53
|
+
this.app.put(serverListenPath, (0, express_async_handler_1.default)(new PUT_handler_1.PUTRequestHandler().handle));
|
|
54
|
+
this.app.mkcol(serverListenPath, (0, express_async_handler_1.default)(new MKCOL_handler_1.MKCOLRequestHandler().handle));
|
|
55
|
+
this.app.delete(serverListenPath, (0, express_async_handler_1.default)(new DELETE_handler_1.DELETERequestHandler().handle));
|
|
122
56
|
this.app.proppatch(serverListenPath, (0, express_async_handler_1.default)(new PROPPATCH_handler_1.PROPPATCHRequestHandler().handle));
|
|
123
|
-
this.app.move(serverListenPath, (0, express_async_handler_1.default)(new MOVE_handler_1.MOVERequestHandler(
|
|
124
|
-
driveFolderService: this.driveFolderService,
|
|
125
|
-
driveFileService: this.driveFileService,
|
|
126
|
-
webDavFolderService,
|
|
127
|
-
}).handle));
|
|
57
|
+
this.app.move(serverListenPath, (0, express_async_handler_1.default)(new MOVE_handler_1.MOVERequestHandler().handle));
|
|
128
58
|
this.app.copy(serverListenPath, (0, express_async_handler_1.default)(new COPY_handler_1.COPYRequestHandler().handle));
|
|
129
59
|
};
|
|
60
|
+
static checkwebDAVCredentials = (configs) => {
|
|
61
|
+
if (configs.customAuth) {
|
|
62
|
+
if (!configs.username?.trim()) {
|
|
63
|
+
throw new Error('WebDAV CustomAuth is enabled but no username was provided.');
|
|
64
|
+
}
|
|
65
|
+
if (!configs.password?.trim()) {
|
|
66
|
+
throw new Error('WebDAV CustomAuth is enabled but no password was provided.');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
130
70
|
start = async () => {
|
|
131
|
-
const configs = await
|
|
71
|
+
const configs = await config_service_1.ConfigService.instance.readWebdavConfig();
|
|
72
|
+
WebDavServer.checkwebDAVCredentials(configs);
|
|
132
73
|
this.app.disable('x-powered-by');
|
|
133
|
-
this.registerStartMiddlewares();
|
|
134
|
-
|
|
74
|
+
this.registerStartMiddlewares(configs);
|
|
75
|
+
this.registerHandlers();
|
|
135
76
|
this.registerEndMiddleWares();
|
|
136
77
|
const plainHttp = configs.protocol === 'http';
|
|
137
78
|
let server;
|
|
@@ -145,7 +86,8 @@ class WebDavServer {
|
|
|
145
86
|
server.requestTimeout = configs.timeoutMinutes * 60 * 1000;
|
|
146
87
|
server.listen(Number(configs.port), configs.host, undefined, () => {
|
|
147
88
|
logger_utils_1.webdavLogger.info(`Internxt ${sdk_manager_service_1.SdkManager.getAppDetails().clientVersion} WebDav server ` +
|
|
148
|
-
`listening at ${configs.protocol}://${configs.host}:${configs.port}`
|
|
89
|
+
`listening at ${configs.protocol}://${configs.host}:${configs.port}` +
|
|
90
|
+
`${configs.customAuth ? ' (with custom authentication)' : ''}`);
|
|
149
91
|
});
|
|
150
92
|
};
|
|
151
93
|
}
|