@internxt/cli 1.5.4 → 1.5.6

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.
Files changed (60) hide show
  1. package/.env +4 -3
  2. package/README.md +65 -30
  3. package/dist/commands/create-folder.js +2 -0
  4. package/dist/commands/download-file.d.ts +1 -1
  5. package/dist/commands/download-file.js +9 -2
  6. package/dist/commands/list.d.ts +40 -2
  7. package/dist/commands/login.d.ts +1 -0
  8. package/dist/commands/login.js +58 -8
  9. package/dist/commands/move-file.d.ts +19 -1
  10. package/dist/commands/move-file.js +1 -1
  11. package/dist/commands/move-folder.js +3 -1
  12. package/dist/commands/rename-file.d.ts +1 -0
  13. package/dist/commands/rename-file.js +11 -4
  14. package/dist/commands/trash-file.js +1 -1
  15. package/dist/commands/trash-folder.js +1 -1
  16. package/dist/commands/trash-list.d.ts +40 -2
  17. package/dist/commands/trash-restore-file.d.ts +19 -1
  18. package/dist/commands/trash-restore-file.js +1 -1
  19. package/dist/commands/trash-restore-folder.js +3 -1
  20. package/dist/commands/upload-file.d.ts +17 -1
  21. package/dist/commands/upload-file.js +17 -11
  22. package/dist/commands/webdav-config.d.ts +1 -0
  23. package/dist/commands/webdav-config.js +9 -0
  24. package/dist/commands/webdav.js +2 -2
  25. package/dist/commands/whoami.js +14 -8
  26. package/dist/hooks/prerun/auth_check.js +2 -5
  27. package/dist/services/auth.service.d.ts +2 -1
  28. package/dist/services/auth.service.js +32 -37
  29. package/dist/services/config.service.d.ts +1 -1
  30. package/dist/services/config.service.js +4 -7
  31. package/dist/services/database/drive-file/drive-file.attributes.d.ts +3 -1
  32. package/dist/services/database/drive-file/drive-file.domain.d.ts +4 -2
  33. package/dist/services/database/drive-file/drive-file.domain.js +9 -2
  34. package/dist/services/drive/drive-file.service.d.ts +1 -1
  35. package/dist/services/drive/drive-file.service.js +5 -4
  36. package/dist/services/drive/drive-folder.service.d.ts +41 -4
  37. package/dist/services/drive/drive-folder.service.js +2 -2
  38. package/dist/services/drive/trash.service.d.ts +40 -2
  39. package/dist/services/keys.service.d.ts +0 -3
  40. package/dist/services/keys.service.js +1 -60
  41. package/dist/services/sdk-manager.service.d.ts +1 -3
  42. package/dist/services/sdk-manager.service.js +6 -15
  43. package/dist/services/thumbnail.service.js +59 -15
  44. package/dist/types/command.types.d.ts +27 -3
  45. package/dist/types/config.types.d.ts +1 -0
  46. package/dist/types/drive.types.d.ts +5 -4
  47. package/dist/types/keys.types.d.ts +0 -12
  48. package/dist/types/keys.types.js +0 -29
  49. package/dist/utils/drive.utils.js +4 -3
  50. package/dist/utils/network.utils.d.ts +4 -3
  51. package/dist/utils/network.utils.js +8 -8
  52. package/dist/webdav/handlers/DELETE.handler.js +1 -1
  53. package/dist/webdav/handlers/MOVE.handler.js +9 -7
  54. package/dist/webdav/handlers/PROPFIND.handler.js +8 -5
  55. package/dist/webdav/handlers/PUT.handler.js +5 -6
  56. package/dist/webdav/index.js +2 -5
  57. package/dist/webdav/middewares/auth.middleware.js +3 -10
  58. package/dist/webdav/webdav-server.js +4 -3
  59. package/oclif.manifest.json +27 -3
  60. package/package.json +27 -28
@@ -41,9 +41,9 @@ class DriveFolderService {
41
41
  return files;
42
42
  }
43
43
  };
44
- moveFolder = (payload) => {
44
+ moveFolder = (uuid, payload) => {
45
45
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
46
- return storageClient.moveFolderByUuid(payload);
46
+ return storageClient.moveFolderByUuid(uuid, payload);
47
47
  };
48
48
  createFolder(payload) {
49
49
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
@@ -8,8 +8,46 @@ export declare class TrashService {
8
8
  deleteFolder: (folderId: string) => Promise<void>;
9
9
  clearTrash: () => Promise<void>;
10
10
  getTrashFolderContent: () => Promise<{
11
- folders: StorageTypes.FetchPaginatedFolder[];
12
- files: StorageTypes.FetchPaginatedFile[];
11
+ folders: {
12
+ type: string;
13
+ id: number;
14
+ parentId: number;
15
+ parentUuid: string;
16
+ name: string;
17
+ parent: import("@internxt/sdk/dist/schema").components["schemas"]["Folder"];
18
+ bucket: string;
19
+ userId: number;
20
+ encryptVersion: string;
21
+ createdAt: string;
22
+ updatedAt: string;
23
+ uuid: string;
24
+ plainName: string;
25
+ size: number;
26
+ creationTime: string;
27
+ modificationTime: string;
28
+ status: "EXISTS" | "TRASHED" | "DELETED";
29
+ removed: boolean;
30
+ deleted: boolean;
31
+ }[];
32
+ files: {
33
+ id: number;
34
+ uuid: string;
35
+ fileId: string;
36
+ name: string;
37
+ type: string;
38
+ size: string;
39
+ bucket: string;
40
+ folderId: number;
41
+ folderUuid: string;
42
+ encryptVersion: string;
43
+ userId: number;
44
+ creationTime: string;
45
+ modificationTime: string;
46
+ createdAt: string;
47
+ updatedAt: string;
48
+ plainName: string;
49
+ status: "EXISTS" | "TRASHED" | "DELETED";
50
+ }[];
13
51
  }>;
14
52
  private readonly getAllTrashSubfolders;
15
53
  private readonly getAllTrashSubfiles;
@@ -1,10 +1,7 @@
1
1
  export declare class KeysService {
2
2
  static readonly instance: KeysService;
3
- assertPrivateKeyIsValid: (privateKey: string, password: string) => Promise<void>;
4
3
  encryptPrivateKey: (privateKey: string, password: string) => string;
5
4
  decryptPrivateKey: (privateKey: string, password: string) => string;
6
- assertValidateKeys: (privateKey: string, publicKey: string) => Promise<void>;
7
- isValidKey: (key: string) => Promise<boolean>;
8
5
  generateNewKeysWithEncrypted: (password: string) => Promise<{
9
6
  privateKeyArmored: string;
10
7
  privateKeyArmoredEncrypted: string;
@@ -36,78 +36,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.KeysService = void 0;
37
37
  const lib_1 = require("@internxt/lib");
38
38
  const openpgp = __importStar(require("openpgp"));
39
- const keys_types_1 = require("../types/keys.types");
40
39
  const crypto_utils_1 = require("../utils/crypto.utils");
41
40
  class KeysService {
42
41
  static instance = new KeysService();
43
- assertPrivateKeyIsValid = async (privateKey, password) => {
44
- let privateKeyDecrypted;
45
- let badIterations = true;
46
- try {
47
- lib_1.aes.decrypt(privateKey, password, 9999);
48
- }
49
- catch {
50
- badIterations = false;
51
- }
52
- if (badIterations === true)
53
- throw new keys_types_1.WrongIterationsToEncryptPrivateKeyError();
54
- let badEncrypted = false;
55
- try {
56
- privateKeyDecrypted = this.decryptPrivateKey(privateKey, password);
57
- }
58
- catch {
59
- badEncrypted = true;
60
- }
61
- let hasValidFormat = false;
62
- try {
63
- if (privateKeyDecrypted !== undefined) {
64
- hasValidFormat = await this.isValidKey(privateKeyDecrypted);
65
- }
66
- }
67
- catch {
68
- }
69
- if (badEncrypted === true)
70
- throw new keys_types_1.CorruptedEncryptedPrivateKeyError();
71
- if (hasValidFormat === false)
72
- throw new keys_types_1.BadEncodedPrivateKeyError();
73
- };
74
42
  encryptPrivateKey = (privateKey, password) => {
75
43
  return lib_1.aes.encrypt(privateKey, password, crypto_utils_1.CryptoUtils.getAesInit());
76
44
  };
77
45
  decryptPrivateKey = (privateKey, password) => {
78
46
  return lib_1.aes.decrypt(privateKey, password);
79
47
  };
80
- assertValidateKeys = async (privateKey, publicKey) => {
81
- const publicKeyArmored = await openpgp.readKey({ armoredKey: publicKey });
82
- const privateKeyArmored = await openpgp.readPrivateKey({ armoredKey: privateKey });
83
- const plainMessage = 'validate-keys';
84
- const originalText = await openpgp.createMessage({ text: plainMessage });
85
- const encryptedMessage = await openpgp.encrypt({
86
- message: originalText,
87
- encryptionKeys: publicKeyArmored,
88
- });
89
- const decryptedMessage = (await openpgp.decrypt({
90
- message: await openpgp.readMessage({ armoredMessage: encryptedMessage }),
91
- verificationKeys: publicKeyArmored,
92
- decryptionKeys: privateKeyArmored,
93
- })).data;
94
- if (decryptedMessage !== plainMessage) {
95
- throw new keys_types_1.KeysDoNotMatchError();
96
- }
97
- };
98
- isValidKey = async (key) => {
99
- try {
100
- await openpgp.readKey({ armoredKey: key });
101
- return true;
102
- }
103
- catch {
104
- return false;
105
- }
106
- };
107
48
  generateNewKeysWithEncrypted = async (password) => {
108
49
  const { privateKey, publicKey, revocationCertificate } = await openpgp.generateKey({
109
50
  userIDs: [{ email: 'inxt@inxt.com' }],
110
- curve: 'ed25519',
51
+ curve: 'ed25519Legacy',
111
52
  });
112
53
  return {
113
54
  privateKeyArmored: privateKey,
@@ -1,8 +1,6 @@
1
1
  import { Auth, Drive, Network as NetworkModule } from '@internxt/sdk';
2
2
  import { ApiSecurity, AppDetails } from '@internxt/sdk/dist/shared';
3
- export type SdkManagerApiSecurity = ApiSecurity & {
4
- newToken: string;
5
- };
3
+ export type SdkManagerApiSecurity = ApiSecurity;
6
4
  export declare class SdkManager {
7
5
  static readonly instance: SdkManager;
8
6
  private static apiSecurity?;
@@ -27,47 +27,38 @@ class SdkManager {
27
27
  return {
28
28
  clientName: package_json_1.default.clientName,
29
29
  clientVersion: package_json_1.default.version,
30
+ desktopHeader: config_service_1.ConfigService.instance.get('DESKTOP_HEADER'),
30
31
  };
31
32
  };
32
33
  getAuth() {
33
34
  const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
34
35
  const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
35
36
  const appDetails = SdkManager.getAppDetails();
36
- return sdk_1.Auth.client(DRIVE_API_URL, appDetails, {
37
- token: apiSecurity?.newToken,
38
- });
37
+ return sdk_1.Auth.client(DRIVE_API_URL, appDetails, apiSecurity);
39
38
  }
40
39
  getUsers() {
41
40
  const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
42
41
  const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
43
42
  const appDetails = SdkManager.getAppDetails();
44
- return sdk_1.Drive.Users.client(DRIVE_API_URL, appDetails, {
45
- token: apiSecurity.newToken,
46
- });
43
+ return sdk_1.Drive.Users.client(DRIVE_API_URL, appDetails, apiSecurity);
47
44
  }
48
45
  getStorage() {
49
46
  const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
50
47
  const apiSecurity = SdkManager.getApiSecurity();
51
48
  const appDetails = SdkManager.getAppDetails();
52
- return sdk_1.Drive.Storage.client(DRIVE_API_URL, appDetails, {
53
- token: apiSecurity.newToken,
54
- });
49
+ return sdk_1.Drive.Storage.client(DRIVE_API_URL, appDetails, apiSecurity);
55
50
  }
56
51
  getTrash() {
57
52
  const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
58
53
  const apiSecurity = SdkManager.getApiSecurity();
59
54
  const appDetails = SdkManager.getAppDetails();
60
- return drive_1.Trash.client(DRIVE_NEW_API_URL, appDetails, {
61
- token: apiSecurity.newToken,
62
- });
55
+ return drive_1.Trash.client(DRIVE_NEW_API_URL, appDetails, apiSecurity);
63
56
  }
64
57
  getShare() {
65
58
  const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
66
59
  const apiSecurity = SdkManager.getApiSecurity();
67
60
  const appDetails = SdkManager.getAppDetails();
68
- return sdk_1.Drive.Share.client(DRIVE_NEW_API_URL, appDetails, {
69
- token: apiSecurity.newToken,
70
- });
61
+ return sdk_1.Drive.Share.client(DRIVE_NEW_API_URL, appDetails, apiSecurity);
71
62
  }
72
63
  getNetwork(credentials) {
73
64
  const appDetails = SdkManager.getAppDetails();
@@ -1,14 +1,55 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
5
35
  Object.defineProperty(exports, "__esModule", { value: true });
6
36
  exports.ThumbnailService = void 0;
7
37
  const node_stream_1 = require("node:stream");
8
38
  const drive_file_service_1 = require("./drive/drive-file.service");
9
39
  const drive_1 = require("@internxt/sdk/dist/drive");
10
40
  const thumbnail_utils_1 = require("../utils/thumbnail.utils");
11
- const sharp_1 = __importDefault(require("sharp"));
41
+ let sharpDependency = null;
42
+ const getSharp = async () => {
43
+ if (!sharpDependency) {
44
+ try {
45
+ sharpDependency = (await Promise.resolve().then(() => __importStar(require('sharp')))).default;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ return sharpDependency;
52
+ };
12
53
  class ThumbnailService {
13
54
  static instance = new ThumbnailService();
14
55
  uploadThumbnail = async (fileContent, fileType, userBucket, file_id, networkFacade) => {
@@ -39,17 +80,20 @@ class ThumbnailService {
39
80
  return createdThumbnailFile;
40
81
  }
41
82
  };
42
- getThumbnailFromImageBuffer = (buffer) => {
43
- return (0, sharp_1.default)(buffer)
44
- .resize({
45
- height: thumbnail_utils_1.ThumbnailConfig.MaxHeight,
46
- width: thumbnail_utils_1.ThumbnailConfig.MaxWidth,
47
- fit: 'inside',
48
- })
49
- .png({
50
- quality: thumbnail_utils_1.ThumbnailConfig.Quality,
51
- })
52
- .toBuffer();
83
+ getThumbnailFromImageBuffer = async (buffer) => {
84
+ const sharp = await getSharp();
85
+ if (sharp) {
86
+ return sharp(buffer, { failOnError: false })
87
+ .resize({
88
+ height: thumbnail_utils_1.ThumbnailConfig.MaxHeight,
89
+ width: thumbnail_utils_1.ThumbnailConfig.MaxWidth,
90
+ fit: 'inside',
91
+ })
92
+ .png({
93
+ quality: thumbnail_utils_1.ThumbnailConfig.Quality,
94
+ })
95
+ .toBuffer();
96
+ }
53
97
  };
54
98
  }
55
99
  exports.ThumbnailService = ThumbnailService;
@@ -1,12 +1,36 @@
1
- import { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings';
1
+ export interface LoginUserDetails {
2
+ userId: string;
3
+ uuid: string;
4
+ email: string;
5
+ name: string;
6
+ lastname: string;
7
+ username: string;
8
+ bridgeUser: string;
9
+ bucket: string;
10
+ rootFolderId: string;
11
+ mnemonic: string;
12
+ keys: {
13
+ ecc: {
14
+ publicKey: string;
15
+ privateKey: string;
16
+ };
17
+ kyber: {
18
+ publicKey: string;
19
+ privateKey: string;
20
+ };
21
+ };
22
+ createdAt: string;
23
+ avatar: string | null;
24
+ emailVerified: boolean;
25
+ }
2
26
  export interface LoginCredentials {
3
- user: UserSettings;
27
+ user: LoginUserDetails;
4
28
  token: string;
5
- newToken: string;
6
29
  lastLoggedInAt: string;
7
30
  lastTokenRefreshAt: string;
8
31
  }
9
32
  export interface WebdavConfig {
33
+ host: string;
10
34
  port: string;
11
35
  protocol: 'http' | 'https';
12
36
  timeoutMinutes: number;
@@ -5,4 +5,5 @@ export interface ConfigKeys {
5
5
  readonly APP_MAGIC_IV: string;
6
6
  readonly APP_MAGIC_SALT: string;
7
7
  readonly NETWORK_URL: string;
8
+ readonly DESKTOP_HEADER: string;
8
9
  }
@@ -1,10 +1,11 @@
1
- import { DriveFileData, DriveFolderData } from '@internxt/sdk/dist/drive/storage/types';
2
- export type DriveFileItem = Pick<DriveFileData, 'name' | 'bucket' | 'fileId' | 'id' | 'uuid' | 'folderId' | 'status' | 'folderUuid'> & {
3
- encryptedName: string;
1
+ import { DriveFolderData, FileMeta } from '@internxt/sdk/dist/drive/storage/types';
2
+ export type DriveFileItem = Omit<FileMeta, 'plainName' | 'userId' | 'encryptVersion' | 'size' | 'createdAt' | 'updatedAt' | 'creationTime' | 'modificationTime' | 'type'> & {
4
3
  size: number;
5
4
  createdAt: Date;
6
5
  updatedAt: Date;
7
- type?: string;
6
+ creationTime: Date;
7
+ modificationTime: Date;
8
+ type?: string | null;
8
9
  };
9
10
  export type DriveFolderItem = Pick<DriveFolderData, 'name' | 'bucket' | 'id' | 'parentId'> & {
10
11
  encryptedName: string;
@@ -1,15 +1,3 @@
1
- export declare class BadEncodedPrivateKeyError extends Error {
2
- constructor();
3
- }
4
- export declare class WrongIterationsToEncryptPrivateKeyError extends Error {
5
- constructor();
6
- }
7
- export declare class CorruptedEncryptedPrivateKeyError extends Error {
8
- constructor();
9
- }
10
- export declare class KeysDoNotMatchError extends Error {
11
- constructor();
12
- }
13
1
  export interface AesInit {
14
2
  iv: string;
15
3
  salt: string;
@@ -1,31 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KeysDoNotMatchError = exports.CorruptedEncryptedPrivateKeyError = exports.WrongIterationsToEncryptPrivateKeyError = exports.BadEncodedPrivateKeyError = void 0;
4
- class BadEncodedPrivateKeyError extends Error {
5
- constructor() {
6
- super('Private key is bad encoded');
7
- Object.setPrototypeOf(this, BadEncodedPrivateKeyError.prototype);
8
- }
9
- }
10
- exports.BadEncodedPrivateKeyError = BadEncodedPrivateKeyError;
11
- class WrongIterationsToEncryptPrivateKeyError extends Error {
12
- constructor() {
13
- super('Private key was encrypted using the wrong iterations number');
14
- Object.setPrototypeOf(this, WrongIterationsToEncryptPrivateKeyError.prototype);
15
- }
16
- }
17
- exports.WrongIterationsToEncryptPrivateKeyError = WrongIterationsToEncryptPrivateKeyError;
18
- class CorruptedEncryptedPrivateKeyError extends Error {
19
- constructor() {
20
- super('Private key is corrupted');
21
- Object.setPrototypeOf(this, CorruptedEncryptedPrivateKeyError.prototype);
22
- }
23
- }
24
- exports.CorruptedEncryptedPrivateKeyError = CorruptedEncryptedPrivateKeyError;
25
- class KeysDoNotMatchError extends Error {
26
- constructor() {
27
- super('Keys do not match');
28
- Object.setPrototypeOf(this, KeysDoNotMatchError.prototype);
29
- }
30
- }
31
- exports.KeysDoNotMatchError = KeysDoNotMatchError;
@@ -6,14 +6,15 @@ class DriveUtils {
6
6
  return {
7
7
  uuid: fileMeta.uuid ?? '',
8
8
  status: fileMeta.status,
9
- folderId: fileMeta.folderId ?? fileMeta.folder_id,
9
+ folderId: fileMeta.folderId,
10
10
  folderUuid: fileMeta.folderUuid,
11
- size: fileMeta.size,
12
- encryptedName: fileMeta.name,
11
+ size: Number(fileMeta.size),
13
12
  name: fileMeta.plainName ?? fileMeta.name,
14
13
  bucket: fileMeta.bucket,
15
14
  createdAt: new Date(fileMeta.createdAt),
16
15
  updatedAt: new Date(fileMeta.updatedAt),
16
+ creationTime: new Date(fileMeta.creationTime ?? fileMeta.createdAt),
17
+ modificationTime: new Date(fileMeta.modificationTime ?? fileMeta.updatedAt),
17
18
  fileId: fileMeta.fileId,
18
19
  id: fileMeta.id,
19
20
  type: fileMeta.type,
@@ -1,6 +1,7 @@
1
1
  import { NetworkCredentials, SelfsignedCert } from '../types/network.types';
2
2
  import selfsigned from 'selfsigned';
3
3
  import parseRange from 'range-parser';
4
+ import { WebdavConfig } from '../types/command.types';
4
5
  export declare class NetworkUtils {
5
6
  static getAuthFromCredentials(creds: NetworkCredentials): {
6
7
  username: string;
@@ -10,10 +11,10 @@ export declare class NetworkUtils {
10
11
  cert: string;
11
12
  privateKey: string;
12
13
  };
13
- static generateNewSelfsignedCerts(): SelfsignedCert;
14
- static getWebdavSSLCerts(): Promise<SelfsignedCert>;
14
+ static generateNewSelfsignedCerts(configs: WebdavConfig): SelfsignedCert;
15
+ static getWebdavSSLCerts(configs: WebdavConfig): Promise<SelfsignedCert>;
15
16
  static saveWebdavSSLCerts(pems: selfsigned.GenerateResult): Promise<void>;
16
- static generateSelfSignedSSLCerts(): selfsigned.GenerateResult;
17
+ static generateSelfSignedSSLCerts(configs: WebdavConfig): selfsigned.GenerateResult;
17
18
  static parseRangeHeader(rangeOptions: {
18
19
  range?: string;
19
20
  totalFileSize: number;
@@ -21,19 +21,19 @@ class NetworkUtils {
21
21
  cert: node_path_1.default.join(config_service_1.ConfigService.WEBDAV_SSL_CERTS_DIR, 'cert.crt'),
22
22
  privateKey: node_path_1.default.join(config_service_1.ConfigService.WEBDAV_SSL_CERTS_DIR, 'priv.key'),
23
23
  };
24
- static generateNewSelfsignedCerts() {
25
- const newCerts = this.generateSelfSignedSSLCerts();
24
+ static generateNewSelfsignedCerts(configs) {
25
+ const newCerts = this.generateSelfSignedSSLCerts(configs);
26
26
  this.saveWebdavSSLCerts(newCerts);
27
27
  return {
28
28
  cert: newCerts.cert,
29
29
  key: newCerts.private,
30
30
  };
31
31
  }
32
- static async getWebdavSSLCerts() {
32
+ static async getWebdavSSLCerts(configs) {
33
33
  const existCert = !!(await (0, promises_1.stat)(this.WEBDAV_SSL_CERTS_PATH.cert).catch(() => false));
34
34
  const existKey = !!(await (0, promises_1.stat)(this.WEBDAV_SSL_CERTS_PATH.privateKey).catch(() => false));
35
35
  if (!existCert || !existKey) {
36
- return this.generateNewSelfsignedCerts();
36
+ return this.generateNewSelfsignedCerts(configs);
37
37
  }
38
38
  else {
39
39
  let selfsignedCert = {
@@ -44,7 +44,7 @@ class NetworkUtils {
44
44
  const dateToday = new Date();
45
45
  const dateValid = new Date(validTo);
46
46
  if (dateToday > dateValid) {
47
- const newCerts = this.generateNewSelfsignedCerts();
47
+ const newCerts = this.generateNewSelfsignedCerts(configs);
48
48
  selfsignedCert = {
49
49
  cert: newCerts.cert,
50
50
  key: newCerts.key,
@@ -57,15 +57,15 @@ class NetworkUtils {
57
57
  await (0, promises_1.writeFile)(this.WEBDAV_SSL_CERTS_PATH.cert, pems.cert, 'utf8');
58
58
  await (0, promises_1.writeFile)(this.WEBDAV_SSL_CERTS_PATH.privateKey, pems.private, 'utf8');
59
59
  }
60
- static generateSelfSignedSSLCerts() {
61
- const attrs = [{ name: 'commonName', value: config_service_1.ConfigService.WEBDAV_LOCAL_URL }];
60
+ static generateSelfSignedSSLCerts(configs) {
61
+ const attrs = [{ name: 'commonName', value: configs.host }];
62
62
  const extensions = [
63
63
  {
64
64
  name: 'subjectAltName',
65
65
  altNames: [
66
66
  {
67
67
  type: 2,
68
- value: config_service_1.ConfigService.WEBDAV_LOCAL_URL,
68
+ value: configs.host,
69
69
  },
70
70
  ],
71
71
  },
@@ -23,7 +23,7 @@ class DELETERequestHandler {
23
23
  }
24
24
  logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Trashing ${resource.type}`);
25
25
  await trashService.trashItems({
26
- items: [{ type: resource.type, uuid: driveItem.uuid }],
26
+ items: [{ type: resource.type, uuid: driveItem.uuid, id: null }],
27
27
  });
28
28
  res.status(204).send();
29
29
  const type = resource.type.charAt(0).toUpperCase() + resource.type.substring(1);
@@ -28,9 +28,9 @@ class MOVERequestHandler {
28
28
  if (!originalDriveItem) {
29
29
  throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
30
30
  }
31
+ const newName = destinationResource.name;
31
32
  if (destinationResource.path.dir === resource.path.dir) {
32
33
  logger_utils_1.webdavLogger.info(`[MOVE] Renaming ${resource.type} with UUID ${originalDriveItem.uuid} to ${destinationResource.name}`);
33
- const newName = destinationResource.name;
34
34
  if (resource.type === 'folder') {
35
35
  const folder = originalDriveItem;
36
36
  await driveFolderService.renameFolder({
@@ -60,16 +60,18 @@ class MOVERequestHandler {
60
60
  const destinationFolderItem = destinationDriveFolderItem;
61
61
  if (resource.type === 'folder') {
62
62
  const folder = originalDriveItem;
63
- await driveFolderService.moveFolder({
64
- folderUuid: folder.uuid,
65
- destinationFolderUuid: destinationFolderItem.uuid,
63
+ await driveFolderService.moveFolder(folder.uuid, {
64
+ destinationFolder: destinationFolderItem.uuid,
65
+ name: newName,
66
66
  });
67
67
  }
68
68
  else if (resource.type === 'file') {
69
69
  const file = originalDriveItem;
70
- await driveFileService.moveFile({
71
- fileUuid: file.uuid,
72
- destinationFolderUuid: destinationFolderItem.uuid,
70
+ const newType = destinationResource.path.ext.replace('.', '');
71
+ await driveFileService.moveFile(file.uuid, {
72
+ destinationFolder: destinationFolderItem.uuid,
73
+ name: newName,
74
+ type: newType,
73
75
  });
74
76
  }
75
77
  }
@@ -62,13 +62,14 @@ class PROPFINDRequestHandler {
62
62
  id: driveFileItem.id,
63
63
  uuid: driveFileItem.uuid,
64
64
  fileId: driveFileItem.fileId,
65
- encryptedName: driveFileItem.name,
66
65
  size: driveFileItem.size,
67
66
  createdAt: driveFileItem.createdAt,
68
67
  updatedAt: driveFileItem.updatedAt,
69
68
  status: driveFileItem.status,
70
69
  folderId: driveFileItem.folderId,
71
70
  folderUuid: driveFileItem.folderUuid,
71
+ creationTime: driveFileItem.creationTime,
72
+ modificationTime: driveFileItem.modificationTime,
72
73
  }, resource.url);
73
74
  const xml = xml_utils_1.XMLUtils.toWebDavXML([driveFile], {
74
75
  arrayNodeName: xml_utils_1.XMLUtils.addDefaultNamespace('response'),
@@ -131,16 +132,17 @@ class PROPFINDRequestHandler {
131
132
  name: file.plainName,
132
133
  bucket: file.bucket,
133
134
  id: file.id,
134
- createdAt: new Date(file.createdAt),
135
- updatedAt: new Date(file.updatedAt),
136
135
  fileId: file.fileId,
137
136
  uuid: file.uuid,
138
137
  type: file.type,
139
- encryptedName: file.name,
140
138
  status: file.status,
141
139
  folderId: file.folderId,
142
140
  folderUuid: file.folderUuid,
143
141
  size: Number(file.size),
142
+ creationTime: new Date(file.creationTime),
143
+ modificationTime: new Date(file.modificationTime),
144
+ createdAt: new Date(file.createdAt),
145
+ updatedAt: new Date(file.updatedAt),
144
146
  }, fileRelativePath);
145
147
  });
146
148
  return foldersXML.concat(filesXML);
@@ -196,6 +198,7 @@ class PROPFINDRequestHandler {
196
198
  };
197
199
  driveFileItemToXMLNode = (driveFileItem, relativePath) => {
198
200
  const displayName = driveFileItem.type ? `${driveFileItem.name}.${driveFileItem.type}` : driveFileItem.name;
201
+ const lastModified = format_utils_1.FormatUtils.formatDateForWebDav(driveFileItem.modificationTime ?? driveFileItem.updatedAt);
199
202
  const driveFileXML = {
200
203
  [xml_utils_1.XMLUtils.addDefaultNamespace('href')]: xml_utils_1.XMLUtils.encodeWebDavUri(relativePath),
201
204
  [xml_utils_1.XMLUtils.addDefaultNamespace('propstat')]: {
@@ -205,7 +208,7 @@ class PROPFINDRequestHandler {
205
208
  [xml_utils_1.XMLUtils.addDefaultNamespace('getetag')]: '"' + (0, node_crypto_1.randomUUID)().replaceAll('-', '') + '"',
206
209
  [xml_utils_1.XMLUtils.addDefaultNamespace('displayname')]: displayName,
207
210
  [xml_utils_1.XMLUtils.addDefaultNamespace('getcontenttype')]: mime_types_1.default.lookup(displayName) || 'application/octet-stream',
208
- [xml_utils_1.XMLUtils.addDefaultNamespace('getlastmodified')]: format_utils_1.FormatUtils.formatDateForWebDav(driveFileItem.updatedAt),
211
+ [xml_utils_1.XMLUtils.addDefaultNamespace('getlastmodified')]: lastModified,
209
212
  [xml_utils_1.XMLUtils.addDefaultNamespace('getcontentlength')]: driveFileItem.size,
210
213
  },
211
214
  },
@@ -43,7 +43,7 @@ class PUTRequestHandler {
43
43
  if (driveFileItem && driveFileItem.status === 'EXISTS') {
44
44
  logger_utils_1.webdavLogger.info(`[PUT] File '${resource.name}' already exists in '${resource.path.dir}', trashing it...`);
45
45
  await trashService.trashItems({
46
- items: [{ type: resource.type, uuid: driveFileItem.uuid }],
46
+ items: [{ type: resource.type, uuid: driveFileItem.uuid, id: null }],
47
47
  });
48
48
  }
49
49
  }
@@ -84,14 +84,13 @@ class PUTRequestHandler {
84
84
  uploaded = true;
85
85
  logger_utils_1.webdavLogger.info('[PUT] ✅ File uploaded to network');
86
86
  const file = await drive_file_service_1.DriveFileService.instance.createFile({
87
- plain_name: resource.path.name,
87
+ plainName: resource.path.name,
88
88
  type: fileType,
89
89
  size: contentLength,
90
- folder_id: parentFolderItem.uuid,
91
- id: fileId,
90
+ folderUuid: parentFolderItem.uuid,
91
+ fileId: fileId,
92
92
  bucket: user.bucket,
93
- encrypt_version: types_1.EncryptionVersion.Aes03,
94
- name: '',
93
+ encryptVersion: types_1.EncryptionVersion.Aes03,
95
94
  });
96
95
  try {
97
96
  if (isThumbnailable && bufferStream) {