@internxt/cli 1.5.1 → 1.5.2
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 +0 -3
- package/README.md +30 -29
- package/dist/commands/login.js +0 -3
- package/dist/commands/logout.js +0 -2
- package/dist/commands/webdav-config.d.ts +1 -0
- package/dist/commands/webdav-config.js +10 -0
- package/dist/commands/webdav.js +0 -3
- package/dist/commands/whoami.js +0 -2
- package/dist/services/auth.service.js +10 -2
- package/dist/services/config.service.d.ts +1 -0
- package/dist/services/config.service.js +3 -0
- package/dist/types/command.types.d.ts +1 -0
- package/dist/types/config.types.d.ts +0 -3
- package/dist/utils/webdav.utils.d.ts +2 -8
- package/dist/utils/webdav.utils.js +16 -33
- package/dist/utils/xml.utils.d.ts +1 -1
- package/dist/webdav/handlers/DELETE.handler.d.ts +0 -2
- package/dist/webdav/handlers/DELETE.handler.js +1 -8
- package/dist/webdav/handlers/GET.handler.d.ts +0 -2
- package/dist/webdav/handlers/GET.handler.js +1 -2
- package/dist/webdav/handlers/HEAD.handler.d.ts +0 -2
- package/dist/webdav/handlers/HEAD.handler.js +24 -19
- package/dist/webdav/handlers/MKCOL.handler.d.ts +0 -2
- package/dist/webdav/handlers/MKCOL.handler.js +14 -15
- package/dist/webdav/handlers/MOVE.handler.d.ts +0 -2
- package/dist/webdav/handlers/MOVE.handler.js +1 -7
- package/dist/webdav/handlers/PROPFIND.handler.d.ts +0 -2
- package/dist/webdav/handlers/PROPFIND.handler.js +23 -38
- package/dist/webdav/handlers/PUT.handler.d.ts +0 -2
- package/dist/webdav/handlers/PUT.handler.js +3 -7
- package/dist/webdav/index.js +1 -5
- package/dist/webdav/middewares/mkcol.middleware.d.ts +2 -0
- package/dist/webdav/middewares/mkcol.middleware.js +23 -0
- package/dist/webdav/webdav-server.d.ts +1 -3
- package/dist/webdav/webdav-server.js +16 -22
- package/oclif.manifest.json +10 -1
- package/package.json +24 -30
- package/dist/database/migrations/20240402164914-create-files.d.ts +0 -1
- package/dist/database/migrations/20240402164914-create-files.js +0 -55
- package/dist/database/migrations/20240402165418-create-folders.d.ts +0 -1
- package/dist/database/migrations/20240402165418-create-folders.js +0 -37
- package/dist/database/migrations/20241018114828-add-parent-column.d.ts +0 -1
- package/dist/database/migrations/20241018114828-add-parent-column.js +0 -24
- package/dist/services/database/drive-database-manager.service.d.ts +0 -23
- package/dist/services/database/drive-database-manager.service.js +0 -93
- package/dist/services/database/drive-file/drive-file.model.d.ts +0 -18
- package/dist/services/database/drive-file/drive-file.model.js +0 -80
- package/dist/services/database/drive-file/drive-file.repository.d.ts +0 -11
- package/dist/services/database/drive-file/drive-file.repository.js +0 -40
- package/dist/services/database/drive-folder/drive-folder.model.d.ts +0 -14
- package/dist/services/database/drive-folder/drive-folder.model.js +0 -65
- package/dist/services/database/drive-folder/drive-folder.repository.d.ts +0 -11
- package/dist/services/database/drive-folder/drive-folder.repository.js +0 -40
package/.env
CHANGED
|
@@ -2,12 +2,9 @@ DRIVE_URL=https://drive.internxt.com
|
|
|
2
2
|
DRIVE_API_URL=https://drive.internxt.com/api
|
|
3
3
|
DRIVE_NEW_API_URL=https://api.internxt.com/drive
|
|
4
4
|
PAYMENTS_API_URL=https://api.internxt.com/payments
|
|
5
|
-
PHOTOS_API_URL=https://photos.internxt.com/api
|
|
6
5
|
NETWORK_URL=https://api.internxt.com
|
|
7
6
|
APP_CRYPTO_SECRET=6KYQBP847D4ATSFA
|
|
8
7
|
APP_CRYPTO_SECRET2=8Q8VMUE3BJZV87GT
|
|
9
8
|
APP_MAGIC_IV=d139cb9a2cd17092e79e1861cf9d7023
|
|
10
9
|
APP_MAGIC_SALT=38dce0391b49efba88dbc8c39ebf868f0267eb110bb0012ab27dc52a528d61b1d1ed9d76f400ff58e3240028442b1eab9bb84e111d9dadd997982dbde9dbd25e
|
|
11
|
-
RUDDERSTACK_WRITE_KEY=
|
|
12
|
-
RUDDERSTACK_DATAPLANE_URL=
|
|
13
10
|
NODE_ENV=production
|
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ $ npm install -g @internxt/cli
|
|
|
31
31
|
$ internxt COMMAND
|
|
32
32
|
running command...
|
|
33
33
|
$ internxt (--version)
|
|
34
|
-
@internxt/cli/1.5.
|
|
34
|
+
@internxt/cli/1.5.2 linux-x64 node-v20.19.1
|
|
35
35
|
$ internxt --help [COMMAND]
|
|
36
36
|
USAGE
|
|
37
37
|
$ internxt COMMAND
|
|
@@ -99,7 +99,7 @@ EXAMPLES
|
|
|
99
99
|
$ internxt add-cert
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
-
_See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
102
|
+
_See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/add-cert.ts)_
|
|
103
103
|
|
|
104
104
|
## `internxt config`
|
|
105
105
|
|
|
@@ -119,7 +119,7 @@ EXAMPLES
|
|
|
119
119
|
$ internxt config
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
_See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
122
|
+
_See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/config.ts)_
|
|
123
123
|
|
|
124
124
|
## `internxt create-folder`
|
|
125
125
|
|
|
@@ -148,7 +148,7 @@ EXAMPLES
|
|
|
148
148
|
$ internxt create-folder
|
|
149
149
|
```
|
|
150
150
|
|
|
151
|
-
_See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
151
|
+
_See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/create-folder.ts)_
|
|
152
152
|
|
|
153
153
|
## `internxt delete-permanently-file`
|
|
154
154
|
|
|
@@ -178,7 +178,7 @@ EXAMPLES
|
|
|
178
178
|
$ internxt delete-permanently-file
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
_See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
181
|
+
_See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/delete-permanently-file.ts)_
|
|
182
182
|
|
|
183
183
|
## `internxt delete-permanently-folder`
|
|
184
184
|
|
|
@@ -208,7 +208,7 @@ EXAMPLES
|
|
|
208
208
|
$ internxt delete-permanently-folder
|
|
209
209
|
```
|
|
210
210
|
|
|
211
|
-
_See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
211
|
+
_See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/delete-permanently-folder.ts)_
|
|
212
212
|
|
|
213
213
|
## `internxt delete permanently file`
|
|
214
214
|
|
|
@@ -297,7 +297,7 @@ EXAMPLES
|
|
|
297
297
|
$ internxt download-file
|
|
298
298
|
```
|
|
299
299
|
|
|
300
|
-
_See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
300
|
+
_See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/download-file.ts)_
|
|
301
301
|
|
|
302
302
|
## `internxt download file`
|
|
303
303
|
|
|
@@ -356,7 +356,7 @@ EXAMPLES
|
|
|
356
356
|
$ internxt list
|
|
357
357
|
```
|
|
358
358
|
|
|
359
|
-
_See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
359
|
+
_See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/list.ts)_
|
|
360
360
|
|
|
361
361
|
## `internxt login`
|
|
362
362
|
|
|
@@ -385,7 +385,7 @@ EXAMPLES
|
|
|
385
385
|
$ internxt login
|
|
386
386
|
```
|
|
387
387
|
|
|
388
|
-
_See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
388
|
+
_See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/login.ts)_
|
|
389
389
|
|
|
390
390
|
## `internxt logout`
|
|
391
391
|
|
|
@@ -405,7 +405,7 @@ EXAMPLES
|
|
|
405
405
|
$ internxt logout
|
|
406
406
|
```
|
|
407
407
|
|
|
408
|
-
_See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
408
|
+
_See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/logout.ts)_
|
|
409
409
|
|
|
410
410
|
## `internxt logs`
|
|
411
411
|
|
|
@@ -425,7 +425,7 @@ EXAMPLES
|
|
|
425
425
|
$ internxt logs
|
|
426
426
|
```
|
|
427
427
|
|
|
428
|
-
_See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
428
|
+
_See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/logs.ts)_
|
|
429
429
|
|
|
430
430
|
## `internxt move-file`
|
|
431
431
|
|
|
@@ -457,7 +457,7 @@ EXAMPLES
|
|
|
457
457
|
$ internxt move-file
|
|
458
458
|
```
|
|
459
459
|
|
|
460
|
-
_See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
460
|
+
_See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/move-file.ts)_
|
|
461
461
|
|
|
462
462
|
## `internxt move-folder`
|
|
463
463
|
|
|
@@ -489,7 +489,7 @@ EXAMPLES
|
|
|
489
489
|
$ internxt move-folder
|
|
490
490
|
```
|
|
491
491
|
|
|
492
|
-
_See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
492
|
+
_See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/move-folder.ts)_
|
|
493
493
|
|
|
494
494
|
## `internxt move file`
|
|
495
495
|
|
|
@@ -580,7 +580,7 @@ EXAMPLES
|
|
|
580
580
|
$ internxt rename-file
|
|
581
581
|
```
|
|
582
582
|
|
|
583
|
-
_See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
583
|
+
_See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/rename-file.ts)_
|
|
584
584
|
|
|
585
585
|
## `internxt rename-folder`
|
|
586
586
|
|
|
@@ -611,7 +611,7 @@ EXAMPLES
|
|
|
611
611
|
$ internxt rename-folder
|
|
612
612
|
```
|
|
613
613
|
|
|
614
|
-
_See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
614
|
+
_See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/rename-folder.ts)_
|
|
615
615
|
|
|
616
616
|
## `internxt rename file`
|
|
617
617
|
|
|
@@ -699,7 +699,7 @@ EXAMPLES
|
|
|
699
699
|
$ internxt trash-clear
|
|
700
700
|
```
|
|
701
701
|
|
|
702
|
-
_See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
702
|
+
_See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/trash-clear.ts)_
|
|
703
703
|
|
|
704
704
|
## `internxt trash-file`
|
|
705
705
|
|
|
@@ -729,7 +729,7 @@ EXAMPLES
|
|
|
729
729
|
$ internxt trash-file
|
|
730
730
|
```
|
|
731
731
|
|
|
732
|
-
_See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
732
|
+
_See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/trash-file.ts)_
|
|
733
733
|
|
|
734
734
|
## `internxt trash-folder`
|
|
735
735
|
|
|
@@ -759,7 +759,7 @@ EXAMPLES
|
|
|
759
759
|
$ internxt trash-folder
|
|
760
760
|
```
|
|
761
761
|
|
|
762
|
-
_See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
762
|
+
_See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/trash-folder.ts)_
|
|
763
763
|
|
|
764
764
|
## `internxt trash-list`
|
|
765
765
|
|
|
@@ -785,7 +785,7 @@ EXAMPLES
|
|
|
785
785
|
$ internxt trash-list
|
|
786
786
|
```
|
|
787
787
|
|
|
788
|
-
_See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
788
|
+
_See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/trash-list.ts)_
|
|
789
789
|
|
|
790
790
|
## `internxt trash-restore-file`
|
|
791
791
|
|
|
@@ -816,7 +816,7 @@ EXAMPLES
|
|
|
816
816
|
$ internxt trash-restore-file
|
|
817
817
|
```
|
|
818
818
|
|
|
819
|
-
_See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
819
|
+
_See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/trash-restore-file.ts)_
|
|
820
820
|
|
|
821
821
|
## `internxt trash-restore-folder`
|
|
822
822
|
|
|
@@ -847,7 +847,7 @@ EXAMPLES
|
|
|
847
847
|
$ internxt trash-restore-folder
|
|
848
848
|
```
|
|
849
849
|
|
|
850
|
-
_See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
850
|
+
_See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/trash-restore-folder.ts)_
|
|
851
851
|
|
|
852
852
|
## `internxt trash clear`
|
|
853
853
|
|
|
@@ -1044,7 +1044,7 @@ EXAMPLES
|
|
|
1044
1044
|
$ internxt upload-file
|
|
1045
1045
|
```
|
|
1046
1046
|
|
|
1047
|
-
_See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
1047
|
+
_See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/upload-file.ts)_
|
|
1048
1048
|
|
|
1049
1049
|
## `internxt upload file`
|
|
1050
1050
|
|
|
@@ -1099,7 +1099,7 @@ EXAMPLES
|
|
|
1099
1099
|
$ internxt webdav status
|
|
1100
1100
|
```
|
|
1101
1101
|
|
|
1102
|
-
_See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
1102
|
+
_See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/webdav.ts)_
|
|
1103
1103
|
|
|
1104
1104
|
## `internxt webdav-config`
|
|
1105
1105
|
|
|
@@ -1107,12 +1107,13 @@ Edit the configuration of the Internxt CLI WebDav server as the port or the prot
|
|
|
1107
1107
|
|
|
1108
1108
|
```
|
|
1109
1109
|
USAGE
|
|
1110
|
-
$ internxt webdav-config [--json] [-p <value>] [-s | -h]
|
|
1110
|
+
$ internxt webdav-config [--json] [-p <value>] [-s | -h] [-t <value>]
|
|
1111
1111
|
|
|
1112
1112
|
FLAGS
|
|
1113
|
-
-h, --http
|
|
1114
|
-
-p, --port=<value>
|
|
1115
|
-
-s, --https
|
|
1113
|
+
-h, --http Configures the WebDAV server to use insecure plain HTTP.
|
|
1114
|
+
-p, --port=<value> The new port for the WebDAV server.
|
|
1115
|
+
-s, --https Configures the WebDAV server to use HTTPS with self-signed certificates.
|
|
1116
|
+
-t, --timeout=<value> Configures the WebDAV server to use this timeout in minutes.
|
|
1116
1117
|
|
|
1117
1118
|
GLOBAL FLAGS
|
|
1118
1119
|
--json Format output as json.
|
|
@@ -1124,7 +1125,7 @@ EXAMPLES
|
|
|
1124
1125
|
$ internxt webdav-config
|
|
1125
1126
|
```
|
|
1126
1127
|
|
|
1127
|
-
_See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
1128
|
+
_See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/webdav-config.ts)_
|
|
1128
1129
|
|
|
1129
1130
|
## `internxt whoami`
|
|
1130
1131
|
|
|
@@ -1144,7 +1145,7 @@ EXAMPLES
|
|
|
1144
1145
|
$ internxt whoami
|
|
1145
1146
|
```
|
|
1146
1147
|
|
|
1147
|
-
_See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
1148
|
+
_See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.5.2/src/commands/whoami.ts)_
|
|
1148
1149
|
<!-- commandsstop -->
|
|
1149
1150
|
|
|
1150
1151
|
# Current Limitations
|
package/dist/commands/login.js
CHANGED
|
@@ -8,7 +8,6 @@ const validation_service_1 = require("../services/validation.service");
|
|
|
8
8
|
const cli_utils_1 = require("../utils/cli.utils");
|
|
9
9
|
const errors_utils_1 = require("../utils/errors.utils");
|
|
10
10
|
const sdk_manager_service_1 = require("../services/sdk-manager.service");
|
|
11
|
-
const drive_database_manager_service_1 = require("../services/database/drive-database-manager.service");
|
|
12
11
|
class Login extends core_1.Command {
|
|
13
12
|
static args = {};
|
|
14
13
|
static description = 'Logs into an Internxt account. If the account is two-factor protected, then an extra code will be required.';
|
|
@@ -56,8 +55,6 @@ class Login extends core_1.Command {
|
|
|
56
55
|
newToken: loginCredentials.newToken,
|
|
57
56
|
});
|
|
58
57
|
await config_service_1.ConfigService.instance.saveUser(loginCredentials);
|
|
59
|
-
await drive_database_manager_service_1.DriveDatabaseManager.init();
|
|
60
|
-
await drive_database_manager_service_1.DriveDatabaseManager.clean();
|
|
61
58
|
const message = `Succesfully logged in to: ${loginCredentials.user.email}`;
|
|
62
59
|
cli_utils_1.CLIUtils.success(this.log.bind(this), message);
|
|
63
60
|
return {
|
package/dist/commands/logout.js
CHANGED
|
@@ -4,7 +4,6 @@ const core_1 = require("@oclif/core");
|
|
|
4
4
|
const config_service_1 = require("../services/config.service");
|
|
5
5
|
const cli_utils_1 = require("../utils/cli.utils");
|
|
6
6
|
const errors_utils_1 = require("../utils/errors.utils");
|
|
7
|
-
const drive_database_manager_service_1 = require("../services/database/drive-database-manager.service");
|
|
8
7
|
class Logout extends core_1.Command {
|
|
9
8
|
static args = {};
|
|
10
9
|
static description = 'Logs out the current internxt user that is logged into the Internxt CLI.';
|
|
@@ -16,7 +15,6 @@ class Logout extends core_1.Command {
|
|
|
16
15
|
const user = await config_service_1.ConfigService.instance.readUser();
|
|
17
16
|
if (user) {
|
|
18
17
|
await config_service_1.ConfigService.instance.clearUser();
|
|
19
|
-
await drive_database_manager_service_1.DriveDatabaseManager.clean();
|
|
20
18
|
const message = 'User logged out successfully.';
|
|
21
19
|
cli_utils_1.CLIUtils.success(this.log.bind(this), message);
|
|
22
20
|
return { success: true, message };
|
|
@@ -8,6 +8,7 @@ export default class WebDAVConfig extends Command {
|
|
|
8
8
|
port: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
9
9
|
https: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
10
10
|
http: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
timeout: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
|
|
11
12
|
};
|
|
12
13
|
static readonly enableJsonFlag = true;
|
|
13
14
|
run: () => Promise<{
|
|
@@ -29,6 +29,12 @@ class WebDAVConfig extends core_1.Command {
|
|
|
29
29
|
required: false,
|
|
30
30
|
exclusive: ['https'],
|
|
31
31
|
}),
|
|
32
|
+
timeout: core_1.Flags.integer({
|
|
33
|
+
char: 't',
|
|
34
|
+
description: 'Configures the WebDAV server to use this timeout in minutes.',
|
|
35
|
+
required: false,
|
|
36
|
+
min: 0,
|
|
37
|
+
}),
|
|
32
38
|
};
|
|
33
39
|
static enableJsonFlag = true;
|
|
34
40
|
run = async () => {
|
|
@@ -51,6 +57,10 @@ class WebDAVConfig extends core_1.Command {
|
|
|
51
57
|
if (https) {
|
|
52
58
|
webdavConfig['protocol'] = 'https';
|
|
53
59
|
}
|
|
60
|
+
const timeout = flags['timeout'];
|
|
61
|
+
if (timeout !== undefined) {
|
|
62
|
+
webdavConfig['timeoutMinutes'] = timeout;
|
|
63
|
+
}
|
|
54
64
|
await config_service_1.ConfigService.instance.saveWebdavConfig(webdavConfig);
|
|
55
65
|
const message = `On the next start, the WebDAV server will use the next config: ${JSON.stringify(webdavConfig)}`;
|
|
56
66
|
cli_utils_1.CLIUtils.success(this.log.bind(this), message);
|
package/dist/commands/webdav.js
CHANGED
|
@@ -4,7 +4,6 @@ const core_1 = require("@oclif/core");
|
|
|
4
4
|
const pm2_utils_1 = require("../utils/pm2.utils");
|
|
5
5
|
const cli_utils_1 = require("../utils/cli.utils");
|
|
6
6
|
const config_service_1 = require("../services/config.service");
|
|
7
|
-
const drive_database_manager_service_1 = require("../services/database/drive-database-manager.service");
|
|
8
7
|
const errors_utils_1 = require("../utils/errors.utils");
|
|
9
8
|
const auth_service_1 = require("../services/auth.service");
|
|
10
9
|
class Webdav extends core_1.Command {
|
|
@@ -70,7 +69,6 @@ class Webdav extends core_1.Command {
|
|
|
70
69
|
};
|
|
71
70
|
enableWebDav = async () => {
|
|
72
71
|
cli_utils_1.CLIUtils.doing('Starting Internxt WebDav server...');
|
|
73
|
-
await drive_database_manager_service_1.DriveDatabaseManager.clean();
|
|
74
72
|
await pm2_utils_1.PM2Utils.killWebDavServer();
|
|
75
73
|
await pm2_utils_1.PM2Utils.startWebDavServer();
|
|
76
74
|
cli_utils_1.CLIUtils.done();
|
|
@@ -99,7 +97,6 @@ class Webdav extends core_1.Command {
|
|
|
99
97
|
};
|
|
100
98
|
restartWebDav = async () => {
|
|
101
99
|
cli_utils_1.CLIUtils.doing('Restarting Internxt WebDav server...');
|
|
102
|
-
await drive_database_manager_service_1.DriveDatabaseManager.clean();
|
|
103
100
|
const { status } = await pm2_utils_1.PM2Utils.webdavServerStatus();
|
|
104
101
|
if (status === 'online') {
|
|
105
102
|
await pm2_utils_1.PM2Utils.killWebDavServer();
|
package/dist/commands/whoami.js
CHANGED
|
@@ -5,7 +5,6 @@ const cli_utils_1 = require("../utils/cli.utils");
|
|
|
5
5
|
const errors_utils_1 = require("../utils/errors.utils");
|
|
6
6
|
const config_service_1 = require("../services/config.service");
|
|
7
7
|
const validation_service_1 = require("../services/validation.service");
|
|
8
|
-
const drive_database_manager_service_1 = require("../services/database/drive-database-manager.service");
|
|
9
8
|
class Whoami extends core_1.Command {
|
|
10
9
|
static args = {};
|
|
11
10
|
static description = 'Display the current user logged into the Internxt CLI.';
|
|
@@ -25,7 +24,6 @@ class Whoami extends core_1.Command {
|
|
|
25
24
|
if (!validCreds) {
|
|
26
25
|
const message = 'Your session has expired. You have been logged out. Please log in again.';
|
|
27
26
|
await config_service_1.ConfigService.instance.clearUser();
|
|
28
|
-
await drive_database_manager_service_1.DriveDatabaseManager.clean();
|
|
29
27
|
cli_utils_1.CLIUtils.error(this.log.bind(this), message);
|
|
30
28
|
return { success: false, message };
|
|
31
29
|
}
|
|
@@ -49,13 +49,13 @@ class AuthService {
|
|
|
49
49
|
};
|
|
50
50
|
getAuthDetails = async () => {
|
|
51
51
|
let loginCreds = await config_service_1.ConfigService.instance.readUser();
|
|
52
|
-
if (!
|
|
52
|
+
if (!loginCreds?.newToken || !loginCreds?.token || !loginCreds?.user?.mnemonic) {
|
|
53
53
|
throw new command_types_1.MissingCredentialsError();
|
|
54
54
|
}
|
|
55
55
|
const oldTokenDetails = validation_service_1.ValidationService.instance.validateTokenAndCheckExpiration(loginCreds.token);
|
|
56
56
|
const newTokenDetails = validation_service_1.ValidationService.instance.validateTokenAndCheckExpiration(loginCreds.newToken);
|
|
57
57
|
const isValidMnemonic = validation_service_1.ValidationService.instance.validateMnemonic(loginCreds.user.mnemonic);
|
|
58
|
-
if (!
|
|
58
|
+
if (!oldTokenDetails.isValid || !newTokenDetails.isValid || !isValidMnemonic) {
|
|
59
59
|
throw new command_types_1.InvalidCredentialsError();
|
|
60
60
|
}
|
|
61
61
|
if (oldTokenDetails.expiration.expired || newTokenDetails.expiration.expired) {
|
|
@@ -69,6 +69,10 @@ class AuthService {
|
|
|
69
69
|
return loginCreds;
|
|
70
70
|
};
|
|
71
71
|
refreshUserTokens = async (oldCreds) => {
|
|
72
|
+
sdk_manager_service_1.SdkManager.init({
|
|
73
|
+
token: oldCreds.token,
|
|
74
|
+
newToken: oldCreds.newToken,
|
|
75
|
+
});
|
|
72
76
|
const usersClient = sdk_manager_service_1.SdkManager.instance.getUsers(true);
|
|
73
77
|
const newCreds = await usersClient.getUserData({ userUuid: oldCreds.user.uuid });
|
|
74
78
|
const loginCreds = {
|
|
@@ -82,6 +86,10 @@ class AuthService {
|
|
|
82
86
|
lastLoggedInAt: oldCreds.lastLoggedInAt,
|
|
83
87
|
lastTokenRefreshAt: new Date().toISOString(),
|
|
84
88
|
};
|
|
89
|
+
sdk_manager_service_1.SdkManager.init({
|
|
90
|
+
token: newCreds.oldToken,
|
|
91
|
+
newToken: newCreds.newToken,
|
|
92
|
+
});
|
|
85
93
|
return loginCreds;
|
|
86
94
|
};
|
|
87
95
|
}
|
|
@@ -11,6 +11,7 @@ export declare class ConfigService {
|
|
|
11
11
|
static readonly WEBDAV_LOCAL_URL = "webdav.local.internxt.com";
|
|
12
12
|
static readonly WEBDAV_DEFAULT_PORT = "3005";
|
|
13
13
|
static readonly WEBDAV_DEFAULT_PROTOCOL = "https";
|
|
14
|
+
static readonly WEBDAV_DEFAULT_TIMEOUT = 0;
|
|
14
15
|
static readonly instance: ConfigService;
|
|
15
16
|
get: (key: keyof ConfigKeys) => string;
|
|
16
17
|
saveUser: (loginCredentials: LoginCredentials) => Promise<void>;
|
|
@@ -19,6 +19,7 @@ class ConfigService {
|
|
|
19
19
|
static WEBDAV_LOCAL_URL = 'webdav.local.internxt.com';
|
|
20
20
|
static WEBDAV_DEFAULT_PORT = '3005';
|
|
21
21
|
static WEBDAV_DEFAULT_PROTOCOL = 'https';
|
|
22
|
+
static WEBDAV_DEFAULT_TIMEOUT = 0;
|
|
22
23
|
static instance = new ConfigService();
|
|
23
24
|
get = (key) => {
|
|
24
25
|
const value = process.env[key];
|
|
@@ -66,12 +67,14 @@ class ConfigService {
|
|
|
66
67
|
return {
|
|
67
68
|
port: configs?.port ?? ConfigService.WEBDAV_DEFAULT_PORT,
|
|
68
69
|
protocol: configs?.protocol ?? ConfigService.WEBDAV_DEFAULT_PROTOCOL,
|
|
70
|
+
timeoutMinutes: configs?.timeoutMinutes ?? ConfigService.WEBDAV_DEFAULT_TIMEOUT,
|
|
69
71
|
};
|
|
70
72
|
}
|
|
71
73
|
catch {
|
|
72
74
|
return {
|
|
73
75
|
port: ConfigService.WEBDAV_DEFAULT_PORT,
|
|
74
76
|
protocol: ConfigService.WEBDAV_DEFAULT_PROTOCOL,
|
|
77
|
+
timeoutMinutes: ConfigService.WEBDAV_DEFAULT_TIMEOUT,
|
|
75
78
|
};
|
|
76
79
|
}
|
|
77
80
|
};
|
|
@@ -3,12 +3,9 @@ export interface ConfigKeys {
|
|
|
3
3
|
readonly DRIVE_API_URL: string;
|
|
4
4
|
readonly DRIVE_NEW_API_URL: string;
|
|
5
5
|
readonly PAYMENTS_API_URL: string;
|
|
6
|
-
readonly PHOTOS_API_URL: string;
|
|
7
6
|
readonly APP_CRYPTO_SECRET: string;
|
|
8
7
|
readonly APP_CRYPTO_SECRET2: string;
|
|
9
8
|
readonly APP_MAGIC_IV: string;
|
|
10
9
|
readonly APP_MAGIC_SALT: string;
|
|
11
10
|
readonly NETWORK_URL: string;
|
|
12
|
-
readonly RUDDERSTACK_WRITE_KEY: string;
|
|
13
|
-
readonly RUDDERSTACK_DATAPLANE_URL: string;
|
|
14
11
|
}
|
|
@@ -1,21 +1,15 @@
|
|
|
1
1
|
import { Request } from 'express';
|
|
2
2
|
import { WebDavRequestedResource } from '../types/webdav.types';
|
|
3
|
-
import { DriveFile } from '../services/database/drive-file/drive-file.domain';
|
|
4
|
-
import { DriveFolder } from '../services/database/drive-folder/drive-folder.domain';
|
|
5
|
-
import { DriveDatabaseManager } from '../services/database/drive-database-manager.service';
|
|
6
3
|
import { DriveFolderService } from '../services/drive/drive-folder.service';
|
|
7
4
|
import { DriveFileService } from '../services/drive/drive-file.service';
|
|
8
5
|
import { DriveFileItem, DriveFolderItem } from '../types/drive.types';
|
|
9
6
|
export declare class WebDavUtils {
|
|
10
7
|
static joinURL(...pathComponents: string[]): string;
|
|
11
8
|
static removeHostFromURL(completeURL: string): string;
|
|
12
|
-
static getRequestedResource(urlObject: string | Request): Promise<WebDavRequestedResource>;
|
|
13
|
-
static getDatabaseItemFromResource(resource: WebDavRequestedResource, driveDatabaseManager: DriveDatabaseManager): Promise<DriveFileItem | DriveFolderItem | null>;
|
|
14
|
-
static setDatabaseItem(type: 'file' | 'folder', driveItem: DriveFileItem | DriveFolderItem, driveDatabaseManager: DriveDatabaseManager, relativePath: string): Promise<DriveFolder | DriveFile | undefined>;
|
|
9
|
+
static getRequestedResource(urlObject: string | Request, decodeUri?: boolean): Promise<WebDavRequestedResource>;
|
|
15
10
|
static getDriveItemFromResource(resource: WebDavRequestedResource, driveFolderService?: DriveFolderService, driveFileService?: DriveFileService): Promise<DriveFileItem | DriveFolderItem | undefined>;
|
|
16
|
-
static getAndSearchItemFromResource({ resource,
|
|
11
|
+
static getAndSearchItemFromResource({ resource, driveFolderService, driveFileService, }: {
|
|
17
12
|
resource: WebDavRequestedResource;
|
|
18
|
-
driveDatabaseManager: DriveDatabaseManager;
|
|
19
13
|
driveFolderService?: DriveFolderService;
|
|
20
14
|
driveFileService?: DriveFileService;
|
|
21
15
|
}): Promise<DriveFileItem | DriveFolderItem>;
|
|
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.WebDavUtils = void 0;
|
|
7
7
|
const node_path_1 = __importDefault(require("node:path"));
|
|
8
8
|
const errors_utils_1 = require("./errors.utils");
|
|
9
|
-
const logger_utils_1 = require("./logger.utils");
|
|
10
9
|
class WebDavUtils {
|
|
11
10
|
static joinURL(...pathComponents) {
|
|
12
11
|
return node_path_1.default.posix.join(...pathComponents);
|
|
@@ -21,7 +20,7 @@ class WebDavUtils {
|
|
|
21
20
|
url = '/'.concat(url);
|
|
22
21
|
return url;
|
|
23
22
|
}
|
|
24
|
-
static async getRequestedResource(urlObject) {
|
|
23
|
+
static async getRequestedResource(urlObject, decodeUri = true) {
|
|
25
24
|
let requestUrl;
|
|
26
25
|
if (typeof urlObject === 'string') {
|
|
27
26
|
requestUrl = urlObject;
|
|
@@ -29,7 +28,7 @@ class WebDavUtils {
|
|
|
29
28
|
else {
|
|
30
29
|
requestUrl = urlObject.url;
|
|
31
30
|
}
|
|
32
|
-
const decodedUrl = decodeURIComponent(requestUrl).replaceAll('/./', '/');
|
|
31
|
+
const decodedUrl = (decodeUri ? decodeURIComponent(requestUrl) : requestUrl).replaceAll('/./', '/');
|
|
33
32
|
const parsedPath = node_path_1.default.parse(decodedUrl);
|
|
34
33
|
let parentPath = node_path_1.default.dirname(decodedUrl);
|
|
35
34
|
if (!parentPath.startsWith('/'))
|
|
@@ -56,46 +55,30 @@ class WebDavUtils {
|
|
|
56
55
|
};
|
|
57
56
|
}
|
|
58
57
|
}
|
|
59
|
-
static async getDatabaseItemFromResource(resource, driveDatabaseManager) {
|
|
60
|
-
let databaseResource = null;
|
|
61
|
-
if (resource.type === 'folder') {
|
|
62
|
-
databaseResource = await driveDatabaseManager.findFolderByRelativePath(resource.url);
|
|
63
|
-
}
|
|
64
|
-
if (resource.type === 'file') {
|
|
65
|
-
databaseResource = await driveDatabaseManager.findFileByRelativePath(resource.url);
|
|
66
|
-
}
|
|
67
|
-
return databaseResource?.toItem() ?? null;
|
|
68
|
-
}
|
|
69
|
-
static async setDatabaseItem(type, driveItem, driveDatabaseManager, relativePath) {
|
|
70
|
-
if (type === 'folder') {
|
|
71
|
-
return await driveDatabaseManager.createFolder(driveItem, relativePath);
|
|
72
|
-
}
|
|
73
|
-
if (type === 'file') {
|
|
74
|
-
return await driveDatabaseManager.createFile(driveItem, relativePath);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
58
|
static async getDriveItemFromResource(resource, driveFolderService, driveFileService) {
|
|
78
59
|
let item = undefined;
|
|
79
60
|
if (resource.type === 'folder') {
|
|
80
|
-
|
|
61
|
+
try {
|
|
62
|
+
item = await driveFolderService?.getFolderMetadataByPath(resource.url);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error.status === 404) {
|
|
66
|
+
throw new errors_utils_1.ConflictError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
81
70
|
}
|
|
82
71
|
if (resource.type === 'file') {
|
|
83
72
|
item = await driveFileService?.getFileMetadataByPath(resource.url);
|
|
84
73
|
}
|
|
85
74
|
return item;
|
|
86
75
|
}
|
|
87
|
-
static async getAndSearchItemFromResource({ resource,
|
|
88
|
-
|
|
89
|
-
if (!
|
|
90
|
-
|
|
91
|
-
const driveItem = await this.getDriveItemFromResource(resource, driveFolderService, driveFileService);
|
|
92
|
-
if (!driveItem) {
|
|
93
|
-
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
94
|
-
}
|
|
95
|
-
databaseItem = driveItem;
|
|
96
|
-
await this.setDatabaseItem(resource.type, driveItem, driveDatabaseManager, resource.url);
|
|
76
|
+
static async getAndSearchItemFromResource({ resource, driveFolderService, driveFileService, }) {
|
|
77
|
+
const driveItem = await this.getDriveItemFromResource(resource, driveFolderService, driveFileService);
|
|
78
|
+
if (!driveItem) {
|
|
79
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
97
80
|
}
|
|
98
|
-
return
|
|
81
|
+
return driveItem;
|
|
99
82
|
}
|
|
100
83
|
}
|
|
101
84
|
exports.WebDavUtils = WebDavUtils;
|
|
@@ -2,7 +2,7 @@ import { X2jOptions, XmlBuilderOptions } from 'fast-xml-parser';
|
|
|
2
2
|
export declare class XMLUtils {
|
|
3
3
|
static readonly DEFAULT_NAMESPACE_LETTER = "D";
|
|
4
4
|
static toJSON(xml: string, options?: X2jOptions): any;
|
|
5
|
-
static toXML(object: object, options?: XmlBuilderOptions):
|
|
5
|
+
static toXML(object: object, options?: XmlBuilderOptions): string;
|
|
6
6
|
static toWebDavXML(object: object, options: XmlBuilderOptions): string;
|
|
7
7
|
static addDefaultNamespace(key: string): string;
|
|
8
8
|
static encodeWebDavUri(uri: string): string;
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
2
|
import { WebDavMethodHandler } from '../../types/webdav.types';
|
|
3
|
-
import { DriveDatabaseManager } from '../../services/database/drive-database-manager.service';
|
|
4
3
|
import { TrashService } from '../../services/drive/trash.service';
|
|
5
4
|
import { DriveFileService } from '../../services/drive/drive-file.service';
|
|
6
5
|
import { DriveFolderService } from '../../services/drive/drive-folder.service';
|
|
7
6
|
export declare class DELETERequestHandler implements WebDavMethodHandler {
|
|
8
7
|
private readonly dependencies;
|
|
9
8
|
constructor(dependencies: {
|
|
10
|
-
driveDatabaseManager: DriveDatabaseManager;
|
|
11
9
|
trashService: TrashService;
|
|
12
10
|
driveFileService: DriveFileService;
|
|
13
11
|
driveFolderService: DriveFolderService;
|
|
@@ -9,12 +9,11 @@ class DELETERequestHandler {
|
|
|
9
9
|
this.dependencies = dependencies;
|
|
10
10
|
}
|
|
11
11
|
handle = async (req, res) => {
|
|
12
|
-
const {
|
|
12
|
+
const { driveFileService, driveFolderService, trashService } = this.dependencies;
|
|
13
13
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
|
|
14
14
|
logger_utils_1.webdavLogger.info(`[DELETE] Request received for ${resource.type} at ${resource.url}`);
|
|
15
15
|
const driveItem = await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
|
|
16
16
|
resource,
|
|
17
|
-
driveDatabaseManager,
|
|
18
17
|
driveFolderService,
|
|
19
18
|
driveFileService: driveFileService,
|
|
20
19
|
});
|
|
@@ -22,12 +21,6 @@ class DELETERequestHandler {
|
|
|
22
21
|
await trashService.trashItems({
|
|
23
22
|
items: [{ type: resource.type, uuid: driveItem.uuid }],
|
|
24
23
|
});
|
|
25
|
-
if (resource.type === 'folder') {
|
|
26
|
-
await driveDatabaseManager.deleteFolderById(driveItem.id);
|
|
27
|
-
}
|
|
28
|
-
else if (resource.type === 'file') {
|
|
29
|
-
await driveDatabaseManager.deleteFileById(driveItem.id);
|
|
30
|
-
}
|
|
31
24
|
res.status(204).send();
|
|
32
25
|
const type = resource.type.charAt(0).toUpperCase() + resource.type.substring(1);
|
|
33
26
|
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] ${type} trashed successfully`);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { WebDavMethodHandler } from '../../types/webdav.types';
|
|
2
2
|
import { Request, Response } from 'express';
|
|
3
3
|
import { DriveFileService } from '../../services/drive/drive-file.service';
|
|
4
|
-
import { DriveDatabaseManager } from '../../services/database/drive-database-manager.service';
|
|
5
4
|
import { NetworkFacade } from '../../services/network/network-facade.service';
|
|
6
5
|
import { DownloadService } from '../../services/network/download.service';
|
|
7
6
|
import { CryptoService } from '../../services/crypto.service';
|
|
@@ -10,7 +9,6 @@ export declare class GETRequestHandler implements WebDavMethodHandler {
|
|
|
10
9
|
private readonly dependencies;
|
|
11
10
|
constructor(dependencies: {
|
|
12
11
|
driveFileService: DriveFileService;
|
|
13
|
-
driveDatabaseManager: DriveDatabaseManager;
|
|
14
12
|
downloadService: DownloadService;
|
|
15
13
|
cryptoService: CryptoService;
|
|
16
14
|
authService: AuthService;
|
|
@@ -11,7 +11,7 @@ class GETRequestHandler {
|
|
|
11
11
|
this.dependencies = dependencies;
|
|
12
12
|
}
|
|
13
13
|
handle = async (req, res) => {
|
|
14
|
-
const {
|
|
14
|
+
const { driveFileService, authService, networkFacade } = this.dependencies;
|
|
15
15
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
|
|
16
16
|
if (resource.name.startsWith('._'))
|
|
17
17
|
throw new errors_utils_1.NotFoundError('File not found');
|
|
@@ -20,7 +20,6 @@ class GETRequestHandler {
|
|
|
20
20
|
logger_utils_1.webdavLogger.info(`[GET] Request received for ${resource.type} at ${resource.url}`);
|
|
21
21
|
const driveFile = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
|
|
22
22
|
resource,
|
|
23
|
-
driveDatabaseManager,
|
|
24
23
|
driveFileService,
|
|
25
24
|
}));
|
|
26
25
|
logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Found Drive File`);
|