ftpd-lite 0.0.0-stage → 1.0.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.
Files changed (66) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +121 -2
  3. package/examples/basic.js +28 -0
  4. package/package.json +47 -4
  5. package/src/commands/CwdCommand.d.ts +3 -0
  6. package/src/commands/CwdCommand.js +91 -0
  7. package/src/commands/DeleCommand.d.ts +3 -0
  8. package/src/commands/DeleCommand.js +85 -0
  9. package/src/commands/FeatCommand.d.ts +2 -0
  10. package/src/commands/FeatCommand.js +30 -0
  11. package/src/commands/ListCommand.d.ts +4 -0
  12. package/src/commands/ListCommand.js +92 -0
  13. package/src/commands/MkdCommand.d.ts +3 -0
  14. package/src/commands/MkdCommand.js +97 -0
  15. package/src/commands/NoopCommand.d.ts +2 -0
  16. package/src/commands/NoopCommand.js +12 -0
  17. package/src/commands/PassCommand.d.ts +3 -0
  18. package/src/commands/PassCommand.js +43 -0
  19. package/src/commands/PasvCommand.d.ts +2 -0
  20. package/src/commands/PasvCommand.js +27 -0
  21. package/src/commands/PortCommand.d.ts +2 -0
  22. package/src/commands/PortCommand.js +34 -0
  23. package/src/commands/PwdCommand.d.ts +2 -0
  24. package/src/commands/PwdCommand.js +30 -0
  25. package/src/commands/QuitCommand.d.ts +2 -0
  26. package/src/commands/QuitCommand.js +21 -0
  27. package/src/commands/RetrCommand.d.ts +3 -0
  28. package/src/commands/RetrCommand.js +83 -0
  29. package/src/commands/RmdCommand.d.ts +3 -0
  30. package/src/commands/RmdCommand.js +97 -0
  31. package/src/commands/RnfrCommand.d.ts +3 -0
  32. package/src/commands/RnfrCommand.js +85 -0
  33. package/src/commands/RntoCommand.d.ts +3 -0
  34. package/src/commands/RntoCommand.js +104 -0
  35. package/src/commands/StorCommand.d.ts +3 -0
  36. package/src/commands/StorCommand.js +87 -0
  37. package/src/commands/SystCommand.d.ts +2 -0
  38. package/src/commands/SystCommand.js +22 -0
  39. package/src/commands/TypeCommand.d.ts +2 -0
  40. package/src/commands/TypeCommand.js +29 -0
  41. package/src/commands/UserCommand.d.ts +3 -0
  42. package/src/commands/UserCommand.js +79 -0
  43. package/src/commands/index.d.ts +19 -0
  44. package/src/commands/index.js +36 -0
  45. package/src/connection.d.ts +28 -0
  46. package/src/connection.js +133 -0
  47. package/src/core/DataServer.d.ts +7 -0
  48. package/src/core/DataServer.js +76 -0
  49. package/src/core/FtpServer.d.ts +44 -0
  50. package/src/core/FtpServer.js +502 -0
  51. package/src/core/index.d.ts +2 -0
  52. package/src/core/index.js +19 -0
  53. package/src/fileTransfer.d.ts +15 -0
  54. package/src/fileTransfer.js +120 -0
  55. package/src/index.d.ts +6 -0
  56. package/src/index.js +16 -0
  57. package/src/types/index.d.ts +119 -0
  58. package/src/types/index.js +53 -0
  59. package/src/types.d.ts +130 -0
  60. package/src/types.js +53 -0
  61. package/src/userManager.d.ts +24 -0
  62. package/src/userManager.js +287 -0
  63. package/src/utils/logger.d.ts +14 -0
  64. package/src/utils/logger.js +36 -0
  65. package/src/utils/pathUtils.d.ts +7 -0
  66. package/src/utils/pathUtils.js +145 -0
@@ -0,0 +1,120 @@
1
+ "use strict";
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
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.fileTransfer = exports.FileTransfer = void 0;
37
+ const path = __importStar(require("path"));
38
+ const types_1 = require("./types");
39
+ const userManager_1 = require("./userManager");
40
+ class FileTransfer {
41
+ constructor() {
42
+ this.userManager = null;
43
+ }
44
+ getUserManager() {
45
+ if (!this.userManager) {
46
+ this.userManager = global.__userManager ||
47
+ new userManager_1.UserManager(path.join(__dirname, '../users.json'));
48
+ }
49
+ return this.userManager;
50
+ }
51
+ checkPermission(user, permission) {
52
+ return true;
53
+ }
54
+ async uploadFile(conn, remotePath, data) {
55
+ console.log(`[FileTransfer] Dosya yükleme: ${conn.user || 'unknown'} - ${remotePath}`);
56
+ if (!this.userManager.checkPermission(conn.user || '', 'write')) {
57
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
58
+ conn.lastMessage = `Permission denied: upload`;
59
+ }
60
+ conn.lastReply = types_1.ReplyCode.CMD_ERR;
61
+ conn.lastMessage = `Command not yet implemented: STOR`;
62
+ }
63
+ async downloadFile(conn, remotePath) {
64
+ console.log(`[FileTransfer] Dosya indirme: ${conn.user || 'unknown'} - ${remotePath}`);
65
+ if (!this.userManager.checkPermission(conn.user || '', 'read')) {
66
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
67
+ conn.lastMessage = `Permission denied: download`;
68
+ }
69
+ conn.lastReply = types_1.ReplyCode.CMD_ERR;
70
+ conn.lastMessage = `Command not yet implemented: RETR`;
71
+ }
72
+ async deleteFile(conn, remotePath) {
73
+ console.log(`[FileTransfer] Dosya silme: ${conn.user || 'unknown'} - ${remotePath}`);
74
+ if (!this.userManager.checkPermission(conn.user || '', 'delete')) {
75
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
76
+ conn.lastMessage = `Permission denied: delete`;
77
+ }
78
+ conn.lastReply = types_1.ReplyCode.CMD_ERR;
79
+ conn.lastMessage = `Command not yet implemented: DELE`;
80
+ }
81
+ async createDirectory(conn, remotePath) {
82
+ console.log(`[FileTransfer] Dizin oluşturma: ${conn.user || 'unknown'} - ${remotePath}`);
83
+ if (!this.userManager.checkPermission(conn.user || '', 'mkd')) {
84
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
85
+ conn.lastMessage = `Permission denied: create directory`;
86
+ }
87
+ conn.lastReply = types_1.ReplyCode.CMD_ERR;
88
+ conn.lastMessage = `Command not yet implemented: MKD`;
89
+ }
90
+ async removeDirectory(conn, remotePath) {
91
+ console.log(`[FileTransfer] Dizin silme: ${conn.user || 'unknown'} - ${remotePath}`);
92
+ if (!this.userManager.checkPermission(conn.user || '', 'rmdir')) {
93
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
94
+ conn.lastMessage = `Permission denied: remove directory`;
95
+ }
96
+ conn.lastReply = types_1.ReplyCode.CMD_ERR;
97
+ conn.lastMessage = `Command not yet implemented: RMD`;
98
+ }
99
+ async renameFile(conn, oldPath, newPath) {
100
+ console.log(`[FileTransfer] Dosya yeniden adlandırma: ${conn.user || 'unknown'} - ${oldPath} -> ${newPath}`);
101
+ if (!this.userManager.checkPermission(conn.user || '', 'rename')) {
102
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
103
+ conn.lastMessage = `Permission denied: rename`;
104
+ }
105
+ conn.lastReply = types_1.ReplyCode.CMD_ERR;
106
+ conn.lastMessage = `Command not yet implemented: RNFR/RNTO`;
107
+ }
108
+ async changeFileMode(conn, remotePath, mode) {
109
+ console.log(`[FileTransfer] Dosya izinleri değiştirme: ${conn.user || 'unknown'} - ${remotePath}`);
110
+ if (!this.userManager.checkPermission(conn.user || '', 'chmod')) {
111
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
112
+ conn.lastMessage = `Permission denied: chmod`;
113
+ }
114
+ conn.lastReply = types_1.ReplyCode.CMD_ERR;
115
+ conn.lastMessage = `Command not yet implemented: CHMOD`;
116
+ }
117
+ }
118
+ exports.FileTransfer = FileTransfer;
119
+ exports.fileTransfer = new FileTransfer();
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVRyYW5zZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZpbGVUcmFuc2Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxNQUFZLElBQUksaUNBQWE7QUFDN0IsbUNBQW1EO0FBQ25ELCtDQUE0QztBQUs1QztJQUdFO1FBRUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFXLENBQUM7SUFDakMsQ0FBQztJQUtPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV0QixJQUFJLENBQUMsV0FBVyxHQUFJLE1BQWMsQ0FBQyxhQUFhO2dCQUM5QyxJQUFJLHlCQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFLTyxlQUFlLENBQUMsSUFBWSxFQUFFLFVBQWtCO1FBRXRELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtNLEtBQUssQ0FBQyxVQUFVLENBQ3JCLElBQW1CLEVBQ25CLFVBQWtCLEVBQ2xCLElBQVk7UUFFWixPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBR3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQztRQUNqRCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLG1DQUFtQyxDQUFDO0lBQ3pELENBQUM7SUFLTSxLQUFLLENBQUMsWUFBWSxDQUN2QixJQUFtQixFQUNuQixVQUFrQjtRQUVsQixPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBR3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyw2QkFBNkIsQ0FBQztRQUNuRCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLG1DQUFtQyxDQUFDO0lBQ3pELENBQUM7SUFLTSxLQUFLLENBQUMsVUFBVSxDQUNyQixJQUFtQixFQUNuQixVQUFrQjtRQUVsQixPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBR3JGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQztRQUNqRCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLG1DQUFtQyxDQUFDO0lBQ3pELENBQUM7SUFLTSxLQUFLLENBQUMsZUFBZSxDQUMxQixJQUFtQixFQUNuQixVQUFrQjtRQUVsQixPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBR3pGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlELElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxxQ0FBcUMsQ0FBQztRQUMzRCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLGtDQUFrQyxDQUFDO0lBQ3hELENBQUM7SUFLTSxLQUFLLENBQUMsZUFBZSxDQUMxQixJQUFtQixFQUNuQixVQUFrQjtRQUVsQixPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBR3JGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxxQ0FBcUMsQ0FBQztRQUMzRCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLGtDQUFrQyxDQUFDO0lBQ3hELENBQUM7SUFLTSxLQUFLLENBQUMsVUFBVSxDQUNyQixJQUFtQixFQUNuQixPQUFlLEVBQ2YsT0FBZTtRQUVmLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxNQUFNLE9BQU8sT0FBTyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRzdHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQztRQUNqRCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLHdDQUF3QyxDQUFDO0lBQzlELENBQUM7SUFLTSxLQUFLLENBQUMsY0FBYyxDQUN6QixJQUFtQixFQUNuQixVQUFrQixFQUNsQixJQUFZO1FBRVosT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQztRQUduRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsMEJBQTBCLENBQUM7UUFDaEQsQ0FBQztRQUdELElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxvQ0FBb0MsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7O0FBR1ksUUFBQSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBSZXBseUNvZGUsIEZ0cENvbm5lY3Rpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi91c2VyTWFuYWdlcic7XG5cbi8qKlxuICogRmlsZVRyYW5zZmVyIC0gRG9zeWEgdHJhbnNmZXIgacWfbGVtbGVyaVxuICovXG5leHBvcnQgY2xhc3MgRmlsZVRyYW5zZmVyIHtcbiAgcHJpdmF0ZSB1c2VyTWFuYWdlcjogVXNlck1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRMO2bmfDvCBiYcSfxLFtbMSxbMSxxJ/EsW5kYW4ga2HDp8Sxbm1hayBpw6dpbiBsYXp5IGluaXRcbiAgICB0aGlzLnVzZXJNYW5hZ2VyID0gbnVsbCBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogVXNlck1hbmFnZXIgc2luZ2xldG9uJ8SxbsSxIGFsXG4gICAqL1xuICBwcml2YXRlIGdldFVzZXJNYW5hZ2VyKCk6IFVzZXJNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMudXNlck1hbmFnZXIpIHtcbiAgICAgIC8vIETDtm5nw7wgYmHEn8SxbWzEsWzEscSfxLFuxLEgw6fDtnptZWsgacOnaW4gZ2xvYmFsIGluc3RhbmNlIGt1bGxhblxuICAgICAgdGhpcy51c2VyTWFuYWdlciA9IChnbG9iYWwgYXMgYW55KS5fX3VzZXJNYW5hZ2VyIHx8IFxuICAgICAgICBuZXcgVXNlck1hbmFnZXIocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3VzZXJzLmpzb24nKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVzZXJNYW5hZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIMSwemluIGtvbnRyb2zDvCAtIFRPRE86IEltcGxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1Blcm1pc3Npb24odXNlcjogc3RyaW5nLCBwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgcGVybWlzc2lvbiBjaGVja2luZ1xuICAgIHJldHVybiB0cnVlOyAvLyBQbGFjZWhvbGRlclxuICB9XG5cbiAgLyoqXG4gICAqIERvc3lhIHnDvGtsZSAoU1RPUikgLSBUT0RPOiBJbXBsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGxvYWRGaWxlKFxuICAgIGNvbm46IEZ0cENvbm5lY3Rpb24sXG4gICAgcmVtb3RlUGF0aDogc3RyaW5nLFxuICAgIGRhdGE6IEJ1ZmZlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgW0ZpbGVUcmFuc2Zlcl0gRG9zeWEgecO8a2xlbWU6ICR7Y29ubi51c2VyIHx8ICd1bmtub3duJ30gLSAke3JlbW90ZVBhdGh9YCk7XG4gICAgXG4gICAgLy8gxLB6aW4ga29udHJvbMO8XG4gICAgaWYgKCF0aGlzLnVzZXJNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihjb25uLnVzZXIgfHwgJycsICd3cml0ZScpKSB7XG4gICAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5OT19QRVJNSVNTSU9OO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBQZXJtaXNzaW9uIGRlbmllZDogdXBsb2FkYDtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBEb3N5YSB5w7xrbGVtZSBpbXBsZW1lbnRhc3lvbnVcbiAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5DTURfRVJSO1xuICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgQ29tbWFuZCBub3QgeWV0IGltcGxlbWVudGVkOiBTVE9SYDsgIFxuICB9XG5cbiAgLyoqXG4gICAqIERvc3lhIGluZGlyIChSRVRSKSAtIFRPRE86IEltcGxlbWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRvd25sb2FkRmlsZShcbiAgICBjb25uOiBGdHBDb25uZWN0aW9uLFxuICAgIHJlbW90ZVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgW0ZpbGVUcmFuc2Zlcl0gRG9zeWEgaW5kaXJtZTogJHtjb25uLnVzZXIgfHwgJ3Vua25vd24nfSAtICR7cmVtb3RlUGF0aH1gKTtcbiAgICBcbiAgICAvLyDEsHppbiBrb250cm9sw7xcbiAgICBpZiAoIXRoaXMudXNlck1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKGNvbm4udXNlciB8fCAnJywgJ3JlYWQnKSkge1xuICAgICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuTk9fUEVSTUlTU0lPTjtcbiAgICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgUGVybWlzc2lvbiBkZW5pZWQ6IGRvd25sb2FkYDtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBEb3N5YSBpbmRpcm1lIGltcGxlbWVudGFzeW9udVxuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLkNNRF9FUlI7XG4gICAgY29ubi5sYXN0TWVzc2FnZSA9IGBDb21tYW5kIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6IFJFVFJgOyAgXG4gIH1cblxuICAvKipcbiAgICogRG9zeWEgc2lsIChERUxFKSAtIFRPRE86IEltcGxlbWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZUZpbGUoXG4gICAgY29ubjogRnRwQ29ubmVjdGlvbixcbiAgICByZW1vdGVQYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coYFtGaWxlVHJhbnNmZXJdIERvc3lhIHNpbG1lOiAke2Nvbm4udXNlciB8fCAndW5rbm93bid9IC0gJHtyZW1vdGVQYXRofWApO1xuICAgIFxuICAgIC8vIMSwemluIGtvbnRyb2zDvFxuICAgIGlmICghdGhpcy51c2VyTWFuYWdlci5jaGVja1Blcm1pc3Npb24oY29ubi51c2VyIHx8ICcnLCAnZGVsZXRlJykpIHtcbiAgICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLk5PX1BFUk1JU1NJT047XG4gICAgICBjb25uLmxhc3RNZXNzYWdlID0gYFBlcm1pc3Npb24gZGVuaWVkOiBkZWxldGVgO1xuICAgIH1cblxuICAgIC8vIFRPRE86IERvc3lhIHNpbG1lIGltcGxlbWVudGFzeW9udVxuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLkNNRF9FUlI7XG4gICAgY29ubi5sYXN0TWVzc2FnZSA9IGBDb21tYW5kIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6IERFTEVgOyAgXG4gIH1cblxuICAvKipcbiAgICogRGl6aW4gb2x1xZ90dXJtYSAoTUtEKSAtIFRPRE86IEltcGxlbWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZURpcmVjdG9yeShcbiAgICBjb25uOiBGdHBDb25uZWN0aW9uLFxuICAgIHJlbW90ZVBhdGg6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgW0ZpbGVUcmFuc2Zlcl0gRGl6aW4gb2x1xZ90dXJtYTogJHtjb25uLnVzZXIgfHwgJ3Vua25vd24nfSAtICR7cmVtb3RlUGF0aH1gKTtcbiAgICBcbiAgICAvLyDEsHppbiBrb250cm9sw7xcbiAgICBpZiAoIXRoaXMudXNlck1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKGNvbm4udXNlciB8fCAnJywgJ21rZCcpKSB7XG4gICAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5OT19QRVJNSVNTSU9OO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBQZXJtaXNzaW9uIGRlbmllZDogY3JlYXRlIGRpcmVjdG9yeWA7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRGl6aW4gb2x1xZ90dXJtYSBpbXBsZW1lbnRhc3lvbnVcbiAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5DTURfRVJSO1xuICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgQ29tbWFuZCBub3QgeWV0IGltcGxlbWVudGVkOiBNS0RgOyAgXG4gIH1cblxuICAvKipcbiAgICogRGl6aW4gc2lsbWUgKFJNRCkgLSBUT0RPOiBJbXBsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZW1vdmVEaXJlY3RvcnkoXG4gICAgY29ubjogRnRwQ29ubmVjdGlvbixcbiAgICByZW1vdGVQYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coYFtGaWxlVHJhbnNmZXJdIERpemluIHNpbG1lOiAke2Nvbm4udXNlciB8fCAndW5rbm93bid9IC0gJHtyZW1vdGVQYXRofWApO1xuICAgIFxuICAgIC8vIMSwemluIGtvbnRyb2zDvFxuICAgIGlmICghdGhpcy51c2VyTWFuYWdlci5jaGVja1Blcm1pc3Npb24oY29ubi51c2VyIHx8ICcnLCAncm1kaXInKSkge1xuICAgICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuTk9fUEVSTUlTU0lPTjtcbiAgICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgUGVybWlzc2lvbiBkZW5pZWQ6IHJlbW92ZSBkaXJlY3RvcnlgO1xuICAgIH1cblxuICAgIC8vIFRPRE86IERpemluIHNpbG1lIGltcGxlbWVudGFzeW9udVxuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLkNNRF9FUlI7XG4gICAgY29ubi5sYXN0TWVzc2FnZSA9IGBDb21tYW5kIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6IFJNRGA7ICBcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3N5YSB5ZW5pZGVuIGFkbGFuZMSxcm1hIChSTkZSL1JOVE8pIC0gVE9ETzogSW1wbGVtZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVuYW1lRmlsZShcbiAgICBjb25uOiBGdHBDb25uZWN0aW9uLFxuICAgIG9sZFBhdGg6IHN0cmluZyxcbiAgICBuZXdQYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5sb2coYFtGaWxlVHJhbnNmZXJdIERvc3lhIHllbmlkZW4gYWRsYW5kxLFybWE6ICR7Y29ubi51c2VyIHx8ICd1bmtub3duJ30gLSAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gKTtcbiAgICBcbiAgICAvLyDEsHppbiBrb250cm9sw7xcbiAgICBpZiAoIXRoaXMudXNlck1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKGNvbm4udXNlciB8fCAnJywgJ3JlbmFtZScpKSB7XG4gICAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5OT19QRVJNSVNTSU9OO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBQZXJtaXNzaW9uIGRlbmllZDogcmVuYW1lYDtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBEb3N5YSB5ZW5pZGVuIGFkbGFuZMSxcm1hIGltcGxlbWVudGFzeW9udVxuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLkNNRF9FUlI7XG4gICAgY29ubi5sYXN0TWVzc2FnZSA9IGBDb21tYW5kIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6IFJORlIvUk5UT2A7ICBcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3N5YSBpemlubGVyaW5pIGRlxJ9pxZ90aXIgKENITU9EKSAtIFRPRE86IEltcGxlbWVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoYW5nZUZpbGVNb2RlKFxuICAgIGNvbm46IEZ0cENvbm5lY3Rpb24sXG4gICAgcmVtb3RlUGF0aDogc3RyaW5nLFxuICAgIG1vZGU6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZyhgW0ZpbGVUcmFuc2Zlcl0gRG9zeWEgaXppbmxlcmkgZGXEn2nFn3Rpcm1lOiAke2Nvbm4udXNlciB8fCAndW5rbm93bid9IC0gJHtyZW1vdGVQYXRofWApO1xuICAgIFxuICAgIC8vIMSwemluIGtvbnRyb2zDvFxuICAgIGlmICghdGhpcy51c2VyTWFuYWdlci5jaGVja1Blcm1pc3Npb24oY29ubi51c2VyIHx8ICcnLCAnY2htb2QnKSkge1xuICAgICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuTk9fUEVSTUlTU0lPTjtcbiAgICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgUGVybWlzc2lvbiBkZW5pZWQ6IGNobW9kYDtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBEb3N5YSBpemlubGVyaSBkZcSfacWfdGlybWUgaW1wbGVtZW50YXN5b251XG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuQ01EX0VSUjtcbiAgICBjb25uLmxhc3RNZXNzYWdlID0gYENvbW1hbmQgbm90IHlldCBpbXBsZW1lbnRlZDogQ0hNT0RgOyAgXG4gIH1cbn1cblxuLy8gU2luZ2xldG9uIGluc3RhbmNlXG5leHBvcnQgY29uc3QgZmlsZVRyYW5zZmVyID0gbmV3IEZpbGVUcmFuc2ZlcigpOyJdfQ==
package/src/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export { FtpServer } from './core/FtpServer';
2
+ export { UserManager, getUserManager } from './userManager';
3
+ export { Logger, LogLevel } from './utils/logger';
4
+ export { ReplyCode } from './types';
5
+ export type { ServerConfig, FtpConnection, User, UserPermissions, Permission, CommandResult, } from './types';
6
+ export { buildDirectoryListing } from './commands/ListCommand';
package/src/index.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildDirectoryListing = exports.ReplyCode = exports.LogLevel = exports.Logger = exports.getUserManager = exports.UserManager = exports.FtpServer = void 0;
4
+ var FtpServer_1 = require("./core/FtpServer");
5
+ Object.defineProperty(exports, "FtpServer", { enumerable: true, get: function () { return FtpServer_1.FtpServer; } });
6
+ var userManager_1 = require("./userManager");
7
+ Object.defineProperty(exports, "UserManager", { enumerable: true, get: function () { return userManager_1.UserManager; } });
8
+ Object.defineProperty(exports, "getUserManager", { enumerable: true, get: function () { return userManager_1.getUserManager; } });
9
+ var logger_1 = require("./utils/logger");
10
+ Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return logger_1.Logger; } });
11
+ Object.defineProperty(exports, "LogLevel", { enumerable: true, get: function () { return logger_1.LogLevel; } });
12
+ var types_1 = require("./types");
13
+ Object.defineProperty(exports, "ReplyCode", { enumerable: true, get: function () { return types_1.ReplyCode; } });
14
+ var ListCommand_1 = require("./commands/ListCommand");
15
+ Object.defineProperty(exports, "buildDirectoryListing", { enumerable: true, get: function () { return ListCommand_1.buildDirectoryListing; } });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBYUEsOENBQTZDO0FBQXBDLHNHQUFBLFNBQVMsT0FBQTtBQUdsQiw2Q0FBNEQ7QUFBbkQsMEdBQUEsV0FBVyxPQUFBO0FBQUUsNkdBQUEsY0FBYyxPQUFBO0FBR3BDLHlDQUFrRDtBQUF6QyxnR0FBQSxNQUFNLE9BQUE7QUFBRSxrR0FBQSxRQUFRLE9BQUE7QUFHekIsaUNBQW9DO0FBQTNCLGtHQUFBLFNBQVMsT0FBQTtBQWFsQixzREFBK0Q7QUFBdEQsb0hBQUEscUJBQXFCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZ0cC1EIC0gbW9kw7xsIGdpcmnFn2lcbiAqXG4gKiBCdSBkb3N5YSB5YWxuxLF6Y2EgZMSxxZ9hIGFrdGFyxLFtIHlhcGFyOyBpbXBvcnQgZWRpbGRpxJ9pbmRlIHN1bnVjdSBiYcWfbGF0xLFsbWF6LFxuICogZG9zeWEgb2x1xZ90dXJ1bG1heiwgcG9ydCBkaW5sZW5tZXouXG4gKlxuICogS3VsbGFuxLFtOlxuICogICBjb25zdCB7IEZ0cFNlcnZlciB9ID0gcmVxdWlyZSgnZnRwLWQnKTtcbiAqICAgY29uc3Qgc2VydmVyID0gbmV3IEZ0cFNlcnZlcih7IHBvcnQ6IDIxLCB1c2VyRmlsZTogJy4vdXNlcnMuanNvbicgfSk7XG4gKiAgIHNlcnZlci5zdGFydCgpO1xuICovXG5cbi8vIEFuYSBzxLFuxLFmXG5leHBvcnQgeyBGdHBTZXJ2ZXIgfSBmcm9tICcuL2NvcmUvRnRwU2VydmVyJztcblxuLy8gS3VsbGFuxLFjxLEgdmUgaXppbiB5w7ZuZXRpbWlcbmV4cG9ydCB7IFVzZXJNYW5hZ2VyLCBnZXRVc2VyTWFuYWdlciB9IGZyb20gJy4vdXNlck1hbmFnZXInO1xuXG4vLyBMb2dsYW1hXG5leHBvcnQgeyBMb2dnZXIsIExvZ0xldmVsIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuXG4vLyBSRkMgOTU5IHlhbsSxdCBrb2RsYXLEsVxuZXhwb3J0IHsgUmVwbHlDb2RlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIFRpcCBha3RhcsSxbWxhcsSxIChUUyBrdWxsYW7EsWPEsWxhcsSxIGnDp2luKVxuZXhwb3J0IHR5cGUge1xuICBTZXJ2ZXJDb25maWcsXG4gIEZ0cENvbm5lY3Rpb24sXG4gIFVzZXIsXG4gIFVzZXJQZXJtaXNzaW9ucyxcbiAgUGVybWlzc2lvbixcbiAgQ29tbWFuZFJlc3VsdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIExJU1Qgw6fEsWt0xLFzxLFuxLEga2VuZGkgZW5kcG9pbnQnaW5kZSBrdWxsYW5tYWsgaXN0ZXllbmxlciBpw6dpblxuZXhwb3J0IHsgYnVpbGREaXJlY3RvcnlMaXN0aW5nIH0gZnJvbSAnLi9jb21tYW5kcy9MaXN0Q29tbWFuZCc7XG4iXX0=
@@ -0,0 +1,119 @@
1
+ import * as net from 'net';
2
+ export declare enum ReplyCode {
3
+ CONTINUE = 125,
4
+ DATA_CONNECT = 150,
5
+ OK = 200,
6
+ USER_OK = 230,
7
+ PASS_OK = 230,
8
+ SYS_NAME = 211,
9
+ SYS_TYPE = 215,
10
+ FEAT_OK = 211,
11
+ RETR_OK = 226,
12
+ STOR_OK = 226,
13
+ DELE_OK = 250,
14
+ RMD_OK = 250,
15
+ MKD_OK = 257,
16
+ LIST_OK = 150,
17
+ LIST_END = 226,
18
+ NOOP_OK = 200,
19
+ QUIT_OK = 221,
20
+ CWD_OK = 250,
21
+ PWD_OK = 257,
22
+ REST_OK = 350,
23
+ USER_PASS = 331,
24
+ PASS_ACC = 332,
25
+ USER_ACC = 332,
26
+ REST_NEW = 350,
27
+ USER_ERR = 503,
28
+ PASS_ERR = 503,
29
+ CMD_ERR = 500,
30
+ SYNTAX_ERR = 501,
31
+ PARAM_ERR = 502,
32
+ BAD_SEQ = 503,
33
+ NO_SUCH_USER = 530,
34
+ NOT_LOGGED = 530,
35
+ WRITE_PROTECT = 451,
36
+ INTERNAL_ERR = 500,
37
+ BAD_CMD = 502,
38
+ BAD_USER = 530,
39
+ NOT_ALLOWED = 550,
40
+ FILE_NOT_FOUND = 551,
41
+ PATH_EXISTS = 550,
42
+ NO_PERMISSION = 551,
43
+ DIRECTORY_EXISTS = 551,
44
+ FILE_EXISTS = 551,
45
+ SYST_OK = 215,
46
+ BAD_ADDRESS = 421,
47
+ TIMEOUT = 421,
48
+ SERVICE_NOT_AVAILABLE = 421
49
+ }
50
+ export type Permission = 'read' | 'write' | 'list' | 'create' | 'append' | 'delete' | 'chmod' | 'mkd' | 'rmdir' | 'rename' | 'deletemyfiles' | 'nopasswd' | 'passive' | 'port' | 'nonlocalbind' | 'private' | 'tls';
51
+ export interface UserPermissions {
52
+ read?: boolean;
53
+ write?: boolean;
54
+ list?: boolean;
55
+ create?: boolean;
56
+ append?: boolean;
57
+ delete?: boolean;
58
+ chmod?: boolean;
59
+ mkd?: boolean;
60
+ rmdir?: boolean;
61
+ rename?: boolean;
62
+ deletemyfiles?: boolean;
63
+ nopasswd?: boolean;
64
+ passive?: boolean;
65
+ port?: boolean;
66
+ nonlocalbind?: boolean;
67
+ private?: boolean;
68
+ tls?: boolean;
69
+ }
70
+ export interface FtpConnection {
71
+ socket: net.Socket;
72
+ user: string | null;
73
+ pass: string | null;
74
+ homeDir: string;
75
+ currentDir: string;
76
+ permissions: UserPermissions;
77
+ transferMode: 'ascii' | 'binary' | null;
78
+ transferSize: number;
79
+ lastReply: number;
80
+ lastMessage: string;
81
+ }
82
+ export interface User {
83
+ username: string;
84
+ password: string;
85
+ homeDir: string;
86
+ permissions: UserPermissions;
87
+ isActive: boolean;
88
+ }
89
+ export interface UserManagerData {
90
+ users: User[];
91
+ lastUpdated: string;
92
+ }
93
+ export interface DataConnection {
94
+ socket: net.Socket;
95
+ passive: boolean;
96
+ localPort: number;
97
+ state: 'listening' | 'connecting' | 'connected' | 'closing' | 'closed';
98
+ }
99
+ export interface CommandResult {
100
+ code: number;
101
+ message: string;
102
+ data?: unknown;
103
+ }
104
+ export type CommandHandler = (conn: FtpConnection, args: string) => Promise<CommandResult> | CommandResult;
105
+ export interface ServerConfig {
106
+ port: number;
107
+ dataPort: number;
108
+ userFile: string;
109
+ maxConnections: number;
110
+ logLevel: 'debug' | 'info' | 'warn' | 'error';
111
+ }
112
+ export interface TransferStatus {
113
+ file: string;
114
+ state: 'pending' | 'transferring' | 'complete' | 'failed';
115
+ size: number;
116
+ transferred: number;
117
+ mode: 'ascii' | 'binary';
118
+ timestamp: string;
119
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReplyCode = void 0;
4
+ var ReplyCode;
5
+ (function (ReplyCode) {
6
+ ReplyCode[ReplyCode["CONTINUE"] = 125] = "CONTINUE";
7
+ ReplyCode[ReplyCode["DATA_CONNECT"] = 150] = "DATA_CONNECT";
8
+ ReplyCode[ReplyCode["OK"] = 200] = "OK";
9
+ ReplyCode[ReplyCode["USER_OK"] = 230] = "USER_OK";
10
+ ReplyCode[ReplyCode["PASS_OK"] = 230] = "PASS_OK";
11
+ ReplyCode[ReplyCode["SYS_NAME"] = 211] = "SYS_NAME";
12
+ ReplyCode[ReplyCode["SYS_TYPE"] = 215] = "SYS_TYPE";
13
+ ReplyCode[ReplyCode["FEAT_OK"] = 211] = "FEAT_OK";
14
+ ReplyCode[ReplyCode["RETR_OK"] = 226] = "RETR_OK";
15
+ ReplyCode[ReplyCode["STOR_OK"] = 226] = "STOR_OK";
16
+ ReplyCode[ReplyCode["DELE_OK"] = 250] = "DELE_OK";
17
+ ReplyCode[ReplyCode["RMD_OK"] = 250] = "RMD_OK";
18
+ ReplyCode[ReplyCode["MKD_OK"] = 257] = "MKD_OK";
19
+ ReplyCode[ReplyCode["LIST_OK"] = 150] = "LIST_OK";
20
+ ReplyCode[ReplyCode["LIST_END"] = 226] = "LIST_END";
21
+ ReplyCode[ReplyCode["NOOP_OK"] = 200] = "NOOP_OK";
22
+ ReplyCode[ReplyCode["QUIT_OK"] = 221] = "QUIT_OK";
23
+ ReplyCode[ReplyCode["CWD_OK"] = 250] = "CWD_OK";
24
+ ReplyCode[ReplyCode["PWD_OK"] = 257] = "PWD_OK";
25
+ ReplyCode[ReplyCode["REST_OK"] = 350] = "REST_OK";
26
+ ReplyCode[ReplyCode["USER_PASS"] = 331] = "USER_PASS";
27
+ ReplyCode[ReplyCode["PASS_ACC"] = 332] = "PASS_ACC";
28
+ ReplyCode[ReplyCode["USER_ACC"] = 332] = "USER_ACC";
29
+ ReplyCode[ReplyCode["REST_NEW"] = 350] = "REST_NEW";
30
+ ReplyCode[ReplyCode["USER_ERR"] = 503] = "USER_ERR";
31
+ ReplyCode[ReplyCode["PASS_ERR"] = 503] = "PASS_ERR";
32
+ ReplyCode[ReplyCode["CMD_ERR"] = 500] = "CMD_ERR";
33
+ ReplyCode[ReplyCode["SYNTAX_ERR"] = 501] = "SYNTAX_ERR";
34
+ ReplyCode[ReplyCode["PARAM_ERR"] = 502] = "PARAM_ERR";
35
+ ReplyCode[ReplyCode["BAD_SEQ"] = 503] = "BAD_SEQ";
36
+ ReplyCode[ReplyCode["NO_SUCH_USER"] = 530] = "NO_SUCH_USER";
37
+ ReplyCode[ReplyCode["NOT_LOGGED"] = 530] = "NOT_LOGGED";
38
+ ReplyCode[ReplyCode["WRITE_PROTECT"] = 451] = "WRITE_PROTECT";
39
+ ReplyCode[ReplyCode["INTERNAL_ERR"] = 500] = "INTERNAL_ERR";
40
+ ReplyCode[ReplyCode["BAD_CMD"] = 502] = "BAD_CMD";
41
+ ReplyCode[ReplyCode["BAD_USER"] = 530] = "BAD_USER";
42
+ ReplyCode[ReplyCode["NOT_ALLOWED"] = 550] = "NOT_ALLOWED";
43
+ ReplyCode[ReplyCode["FILE_NOT_FOUND"] = 551] = "FILE_NOT_FOUND";
44
+ ReplyCode[ReplyCode["PATH_EXISTS"] = 550] = "PATH_EXISTS";
45
+ ReplyCode[ReplyCode["NO_PERMISSION"] = 551] = "NO_PERMISSION";
46
+ ReplyCode[ReplyCode["DIRECTORY_EXISTS"] = 551] = "DIRECTORY_EXISTS";
47
+ ReplyCode[ReplyCode["FILE_EXISTS"] = 551] = "FILE_EXISTS";
48
+ ReplyCode[ReplyCode["SYST_OK"] = 215] = "SYST_OK";
49
+ ReplyCode[ReplyCode["BAD_ADDRESS"] = 421] = "BAD_ADDRESS";
50
+ ReplyCode[ReplyCode["TIMEOUT"] = 421] = "TIMEOUT";
51
+ ReplyCode[ReplyCode["SERVICE_NOT_AVAILABLE"] = 421] = "SERVICE_NOT_AVAILABLE";
52
+ })(ReplyCode || (exports.ReplyCode = ReplyCode = {}));
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsSUFBWSxTQXdEWDtBQXhERCxXQUFZLFNBQVM7SUFFbkIsbURBQWMsQ0FBQTtJQUNkLDJEQUFrQixDQUFBO0lBR2xCLHVDQUFRLENBQUE7SUFDUixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxtREFBYyxDQUFBO0lBQ2QsaURBQWEsQ0FBQTtJQUNiLGlEQUFhLENBQUE7SUFDYixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUdiLHFEQUFlLENBQUE7SUFDZixtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLG1EQUFjLENBQUE7SUFHZCxtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLGlEQUFhLENBQUE7SUFDYix1REFBZ0IsQ0FBQTtJQUNoQixxREFBZSxDQUFBO0lBQ2YsaURBQWEsQ0FBQTtJQUNiLDJEQUFrQixDQUFBO0lBQ2xCLHVEQUFnQixDQUFBO0lBQ2hCLDZEQUFtQixDQUFBO0lBR25CLDJEQUFrQixDQUFBO0lBQ2xCLGlEQUFhLENBQUE7SUFDYixtREFBYyxDQUFBO0lBQ2QseURBQWlCLENBQUE7SUFDakIsK0RBQW9CLENBQUE7SUFDcEIseURBQWlCLENBQUE7SUFDakIsNkRBQW1CLENBQUE7SUFDbkIsbUVBQXNCLENBQUE7SUFDdEIseURBQWlCLENBQUE7SUFDakIsaURBQWEsQ0FBQTtJQUNiLHlEQUFpQixDQUFBO0lBQ2pCLGlEQUFhLENBQUE7SUFDYiw2RUFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBeERXLFNBQVMsYUFBVCxTQUFTLEdBQVQsU0FBUyxRQXdEcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcblxuLyoqXG4gKiBSRkMgOTU5IEZUUCBQcm90b2NvbCBUeXBlc1xuICogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvaW5mby9yZmM5NTlcbiAqL1xuXG4vKipcbiAqIEZUUCBZYW7EsXQgS29kbGFyxLEgKFJGQyA5NTkpXG4gKi9cbmV4cG9ydCBlbnVtIFJlcGx5Q29kZSB7XG4gIC8qKiAxMDAtMTk5OiDEsMWfbGVtIHRhbWFtbGFubWFkxLEsIGJpbGdpIG1lc2FqxLEgKi9cbiAgQ09OVElOVUUgPSAxMjUsXG4gIERBVEFfQ09OTkVDVCA9IDE1MCxcbiAgXG4gIC8qKiAyMDAtMjk5OiBCYcWfYXLEsWzEsSAqL1xuICBPSyA9IDIwMCxcbiAgVVNFUl9PSyA9IDIzMCxcbiAgUEFTU19PSyA9IDIzMCxcbiAgU1lTX05BTUUgPSAyMTEsXG4gIFNZU19UWVBFID0gMjE1LFxuICBGRUFUX09LID0gMjExLFxuICBSRVRSX09LID0gMjI2LFxuICBTVE9SX09LID0gMjI2LFxuICBERUxFX09LID0gMjUwLFxuICBSTURfT0sgPSAyNTAsXG4gIE1LRF9PSyA9IDI1NyxcbiAgTElTVF9PSyA9IDE1MCxcbiAgTElTVF9FTkQgPSAyMjYsXG4gIE5PT1BfT0sgPSAyMDAsXG4gIFFVSVRfT0sgPSAyMjEsXG4gIENXRF9PSyA9IDI1MCxcbiAgUFdEX09LID0gMjU3LFxuICBSRVNUX09LID0gMzUwLFxuICBcbiAgLyoqIDMwMC0zOTk6IEJla2xleWVuIGJpbGdpICovXG4gIFVTRVJfUEFTUyA9IDMzMSxcbiAgUEFTU19BQ0MgPSAzMzIsXG4gIFVTRVJfQUNDID0gMzMyLFxuICBSRVNUX05FVyA9IDM1MCxcbiAgXG4gIC8qKiA0MDAtNDk5OiBHZcOnaWNpIGhhdGEgKi9cbiAgVVNFUl9FUlIgPSA1MDMsXG4gIFBBU1NfRVJSID0gNTAzLFxuICBDTURfRVJSID0gNTAwLFxuICBTWU5UQVhfRVJSID0gNTAxLFxuICBQQVJBTV9FUlIgPSA1MDIsXG4gIEJBRF9TRVEgPSA1MDMsXG4gIE5PX1NVQ0hfVVNFUiA9IDUzMCxcbiAgTk9UX0xPR0dFRCA9IDUzMCxcbiAgV1JJVEVfUFJPVEVDVCA9IDQ1MSxcbiAgXG4gIC8qKiA1MDAtNTk5OiBLYWzEsWPEsSBoYXRhICovXG4gIElOVEVSTkFMX0VSUiA9IDUwMCxcbiAgQkFEX0NNRCA9IDUwMixcbiAgQkFEX1VTRVIgPSA1MzAsXG4gIE5PVF9BTExPV0VEID0gNTUwLFxuICBGSUxFX05PVF9GT1VORCA9IDU1MSxcbiAgUEFUSF9FWElTVFMgPSA1NTAsXG4gIE5PX1BFUk1JU1NJT04gPSA1NTEsXG4gIERJUkVDVE9SWV9FWElTVFMgPSA1NTEsXG4gIEZJTEVfRVhJU1RTID0gNTUxLFxuICBTWVNUX09LID0gMjE1LFxuICBCQURfQUREUkVTUyA9IDQyMSxcbiAgVElNRU9VVCA9IDQyMSxcbiAgU0VSVklDRV9OT1RfQVZBSUxBQkxFID0gNDIxLFxufVxuXG4vKipcbiAqIEt1bGxhbsSxY8SxIGl6aW4gdMO8cmxlcmlcbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9IFxuICB8ICdyZWFkJyAgICAgICAgICAgLy8gRG9zeWEgb2t1bWFcbiAgfCAnd3JpdGUnICAgICAgICAgIC8vIERvc3lhIHlhem1hXG4gIHwgJ2xpc3QnICAgICAgICAgICAvLyBEaXppbiBsaXN0ZWxlbWVcbiAgfCAnY3JlYXRlJyAgICAgICAgIC8vIERvc3lhL2RpemluIG9sdcWfdHVybWFcbiAgfCAnYXBwZW5kJyAgICAgICAgIC8vIERvc3lhIGVrbGVtZVxuICB8ICdkZWxldGUnICAgICAgICAgLy8gRG9zeWEgc2lsbWVcbiAgfCAnY2htb2QnICAgICAgICAgIC8vIERvc3lhIGl6aW5sZXJpIGRlxJ9pxZ90aXJtZVxuICB8ICdta2QnICAgICAgICAgICAgLy8gRGl6aW4gb2x1xZ90dXJtYVxuICB8ICdybWRpcicgICAgICAgICAgLy8gRGl6aW4gc2lsbWVcbiAgfCAncmVuYW1lJyAgICAgICAgIC8vIERvc3lhIHllbmlkZW4gYWRsYW5kxLFybWFcbiAgfCAnZGVsZXRlbXlmaWxlcycgIC8vIEtlbmRpIGRvc3lhbGFyxLFuxLEgc2lsbWVcbiAgfCAnbm9wYXNzd2QnICAgICAgIC8vIMWeaWZyZXNpeiBnaXJpxZ9cbiAgfCAncGFzc2l2ZScgICAgICAgIC8vIFBhc2lmIG1vZCAoUEFTVilcbiAgfCAncG9ydCcgICAgICAgICAgIC8vIEFrdGlmIG1vZCAoUE9SVClcbiAgfCAnbm9ubG9jYWxiaW5kJyAgIC8vIFllcmVsIG9sbWF5YW4gYmHEn2xhbm1hXG4gIHwgJ3ByaXZhdGUnICAgICAgICAvLyDDlnplbCBrb211dGxhclxuICB8ICd0bHMnOyAgICAgICAgICAgIC8vIFRMUy9TU0xcblxuLyoqXG4gKiBLdWxsYW7EsWPEsSBpemluIG9iamVzaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQZXJtaXNzaW9ucyB7XG4gIHJlYWQ/OiBib29sZWFuO1xuICB3cml0ZT86IGJvb2xlYW47XG4gIGxpc3Q/OiBib29sZWFuO1xuICBjcmVhdGU/OiBib29sZWFuO1xuICBhcHBlbmQ/OiBib29sZWFuO1xuICBkZWxldGU/OiBib29sZWFuO1xuICBjaG1vZD86IGJvb2xlYW47XG4gIG1rZD86IGJvb2xlYW47XG4gIHJtZGlyPzogYm9vbGVhbjtcbiAgcmVuYW1lPzogYm9vbGVhbjtcbiAgZGVsZXRlbXlmaWxlcz86IGJvb2xlYW47XG4gIG5vcGFzc3dkPzogYm9vbGVhbjtcbiAgcGFzc2l2ZT86IGJvb2xlYW47XG4gIHBvcnQ/OiBib29sZWFuO1xuICBub25sb2NhbGJpbmQ/OiBib29sZWFuO1xuICBwcml2YXRlPzogYm9vbGVhbjtcbiAgdGxzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGVFAgQmHEn2xhbnTEsSBiaWxnaWxlcmlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdHBDb25uZWN0aW9uIHtcbiAgc29ja2V0OiBuZXQuU29ja2V0O1xuICB1c2VyOiBzdHJpbmcgfCBudWxsO1xuICBwYXNzOiBzdHJpbmcgfCBudWxsO1xuICBob21lRGlyOiBzdHJpbmc7XG4gIGN1cnJlbnREaXI6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9ucztcbiAgdHJhbnNmZXJNb2RlOiAnYXNjaWknIHwgJ2JpbmFyeScgfCBudWxsO1xuICB0cmFuc2ZlclNpemU6IG51bWJlcjtcbiAgbGFzdFJlcGx5OiBudW1iZXI7XG4gIGxhc3RNZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogS3VsbGFuxLFjxLEgYmlsZ2lsZXJpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlciB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG4gIGhvbWVEaXI6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IFVzZXJQZXJtaXNzaW9ucztcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogS3VsbGFuxLFjxLEgecO2bmV0aW1pIHZlcml0YWJhbsSxXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1hbmFnZXJEYXRhIHtcbiAgdXNlcnM6IFVzZXJbXTtcbiAgbGFzdFVwZGF0ZWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBWZXJpIGJhxJ9sYW50xLFzxLEgYmlsZ2lsZXJpIChQT1JUL1BBU1YpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUNvbm5lY3Rpb24ge1xuICBzb2NrZXQ6IG5ldC5Tb2NrZXQ7XG4gIHBhc3NpdmU6IGJvb2xlYW47XG4gIGxvY2FsUG9ydDogbnVtYmVyO1xuICBzdGF0ZTogJ2xpc3RlbmluZycgfCAnY29ubmVjdGluZycgfCAnY29ubmVjdGVkJyB8ICdjbG9zaW5nJyB8ICdjbG9zZWQnO1xufVxuXG4vKipcbiAqIEtvbXV0IHNvbnXDpyBvYmplc2lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzdWx0IHtcbiAgY29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRhdGE/OiB1bmtub3duO1xufVxuXG4vKipcbiAqIEtvbXV0IGnFn2xldmkgdGlwIHRhbsSxbWxhbWFzxLFcbiAqL1xuZXhwb3J0IHR5cGUgQ29tbWFuZEhhbmRsZXIgPSAoY29ubjogRnRwQ29ubmVjdGlvbiwgYXJnczogc3RyaW5nKSA9PiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHwgQ29tbWFuZFJlc3VsdDtcblxuLyoqXG4gKiBTZXJ2ZXIgYXlhcmxhcsSxXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyQ29uZmlnIHtcbiAgcG9ydDogbnVtYmVyO1xuICBkYXRhUG9ydDogbnVtYmVyO1xuICB1c2VyRmlsZTogc3RyaW5nO1xuICBtYXhDb25uZWN0aW9uczogbnVtYmVyO1xuICBsb2dMZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcic7XG59XG5cbi8qKlxuICogRG9zeWEgdHJhbnNmZXIgZHVydW11XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTdGF0dXMge1xuICBmaWxlOiBzdHJpbmc7XG4gIHN0YXRlOiAncGVuZGluZycgfCAndHJhbnNmZXJyaW5nJyB8ICdjb21wbGV0ZScgfCAnZmFpbGVkJztcbiAgc2l6ZTogbnVtYmVyO1xuICB0cmFuc2ZlcnJlZDogbnVtYmVyO1xuICBtb2RlOiAnYXNjaWknIHwgJ2JpbmFyeSc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuIl19
package/src/types.d.ts ADDED
@@ -0,0 +1,130 @@
1
+ import * as net from 'net';
2
+ export declare enum ReplyCode {
3
+ CONTINUE = 125,
4
+ DATA_CONNECT = 150,
5
+ OK = 200,
6
+ USER_OK = 230,
7
+ PASS_OK = 230,
8
+ SYS_NAME = 211,
9
+ SYS_TYPE = 215,
10
+ FEAT_OK = 211,
11
+ RETR_OK = 226,
12
+ STOR_OK = 226,
13
+ DELE_OK = 250,
14
+ RMD_OK = 250,
15
+ MKD_OK = 257,
16
+ LIST_OK = 150,
17
+ LIST_END = 226,
18
+ NOOP_OK = 200,
19
+ QUIT_OK = 221,
20
+ CWD_OK = 250,
21
+ PWD_OK = 257,
22
+ REST_OK = 350,
23
+ USER_PASS = 331,
24
+ PASS_ACC = 332,
25
+ USER_ACC = 332,
26
+ REST_NEW = 350,
27
+ USER_ERR = 503,
28
+ PASS_ERR = 503,
29
+ CMD_ERR = 500,
30
+ SYNTAX_ERR = 501,
31
+ PARAM_ERR = 502,
32
+ BAD_SEQ = 503,
33
+ NO_SUCH_USER = 530,
34
+ NOT_LOGGED = 530,
35
+ WRITE_PROTECT = 451,
36
+ INTERNAL_ERR = 500,
37
+ BAD_CMD = 502,
38
+ BAD_USER = 530,
39
+ NOT_ALLOWED = 550,
40
+ FILE_NOT_FOUND = 550,
41
+ PATH_EXISTS = 550,
42
+ NO_PERMISSION = 550,
43
+ DIRECTORY_EXISTS = 550,
44
+ FILE_EXISTS = 550,
45
+ SYST_OK = 215,
46
+ BAD_ADDRESS = 421,
47
+ TIMEOUT = 421,
48
+ SERVICE_NOT_AVAILABLE = 421
49
+ }
50
+ export type Permission = 'read' | 'write' | 'list' | 'create' | 'append' | 'delete' | 'chmod' | 'mkd' | 'rmdir' | 'rename' | 'deletemyfiles' | 'nopasswd' | 'passive' | 'port' | 'nonlocalbind' | 'private' | 'tls';
51
+ export interface UserPermissions {
52
+ read?: boolean;
53
+ write?: boolean;
54
+ list?: boolean;
55
+ create?: boolean;
56
+ append?: boolean;
57
+ delete?: boolean;
58
+ chmod?: boolean;
59
+ mkd?: boolean;
60
+ rmdir?: boolean;
61
+ rename?: boolean;
62
+ deletemyfiles?: boolean;
63
+ nopasswd?: boolean;
64
+ passive?: boolean;
65
+ port?: boolean;
66
+ nonlocalbind?: boolean;
67
+ private?: boolean;
68
+ tls?: boolean;
69
+ }
70
+ export interface FtpConnection {
71
+ socket: net.Socket;
72
+ user: string | null;
73
+ pass: string | null;
74
+ homeDir: string;
75
+ currentDir: string;
76
+ permissions: UserPermissions;
77
+ transferMode: 'ascii' | 'binary' | null;
78
+ transferSize: number;
79
+ lastReply: number;
80
+ lastMessage: string;
81
+ rnfrPath?: string | null;
82
+ dataMode?: 'passive' | 'active';
83
+ activeDataTarget?: {
84
+ ip: string;
85
+ port: number;
86
+ };
87
+ }
88
+ export interface User {
89
+ username: string;
90
+ password: string;
91
+ homeDir: string;
92
+ permissions: UserPermissions;
93
+ isActive: boolean;
94
+ }
95
+ export interface UserManagerData {
96
+ users: User[];
97
+ lastUpdated: string;
98
+ }
99
+ export interface DataConnection {
100
+ socket: net.Socket;
101
+ passive: boolean;
102
+ localPort: number;
103
+ state: 'listening' | 'connecting' | 'connected' | 'closing' | 'closed';
104
+ }
105
+ export interface CommandResult {
106
+ code: number;
107
+ message: string;
108
+ data?: unknown;
109
+ }
110
+ export type CommandHandler = (conn: FtpConnection, args: string) => Promise<CommandResult>;
111
+ export interface ServerConfig {
112
+ port: number;
113
+ dataPort: number;
114
+ userFile: string;
115
+ maxConnections: number;
116
+ logLevel: 'debug' | 'info' | 'warn' | 'error';
117
+ banner: string;
118
+ passivePortRange: {
119
+ min: number;
120
+ max: number;
121
+ };
122
+ }
123
+ export interface TransferStatus {
124
+ file: string;
125
+ state: 'pending' | 'transferring' | 'complete' | 'failed';
126
+ size: number;
127
+ transferred: number;
128
+ mode: 'ascii' | 'binary';
129
+ timestamp: string;
130
+ }
package/src/types.js ADDED
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReplyCode = void 0;
4
+ var ReplyCode;
5
+ (function (ReplyCode) {
6
+ ReplyCode[ReplyCode["CONTINUE"] = 125] = "CONTINUE";
7
+ ReplyCode[ReplyCode["DATA_CONNECT"] = 150] = "DATA_CONNECT";
8
+ ReplyCode[ReplyCode["OK"] = 200] = "OK";
9
+ ReplyCode[ReplyCode["USER_OK"] = 230] = "USER_OK";
10
+ ReplyCode[ReplyCode["PASS_OK"] = 230] = "PASS_OK";
11
+ ReplyCode[ReplyCode["SYS_NAME"] = 211] = "SYS_NAME";
12
+ ReplyCode[ReplyCode["SYS_TYPE"] = 215] = "SYS_TYPE";
13
+ ReplyCode[ReplyCode["FEAT_OK"] = 211] = "FEAT_OK";
14
+ ReplyCode[ReplyCode["RETR_OK"] = 226] = "RETR_OK";
15
+ ReplyCode[ReplyCode["STOR_OK"] = 226] = "STOR_OK";
16
+ ReplyCode[ReplyCode["DELE_OK"] = 250] = "DELE_OK";
17
+ ReplyCode[ReplyCode["RMD_OK"] = 250] = "RMD_OK";
18
+ ReplyCode[ReplyCode["MKD_OK"] = 257] = "MKD_OK";
19
+ ReplyCode[ReplyCode["LIST_OK"] = 150] = "LIST_OK";
20
+ ReplyCode[ReplyCode["LIST_END"] = 226] = "LIST_END";
21
+ ReplyCode[ReplyCode["NOOP_OK"] = 200] = "NOOP_OK";
22
+ ReplyCode[ReplyCode["QUIT_OK"] = 221] = "QUIT_OK";
23
+ ReplyCode[ReplyCode["CWD_OK"] = 250] = "CWD_OK";
24
+ ReplyCode[ReplyCode["PWD_OK"] = 257] = "PWD_OK";
25
+ ReplyCode[ReplyCode["REST_OK"] = 350] = "REST_OK";
26
+ ReplyCode[ReplyCode["USER_PASS"] = 331] = "USER_PASS";
27
+ ReplyCode[ReplyCode["PASS_ACC"] = 332] = "PASS_ACC";
28
+ ReplyCode[ReplyCode["USER_ACC"] = 332] = "USER_ACC";
29
+ ReplyCode[ReplyCode["REST_NEW"] = 350] = "REST_NEW";
30
+ ReplyCode[ReplyCode["USER_ERR"] = 503] = "USER_ERR";
31
+ ReplyCode[ReplyCode["PASS_ERR"] = 503] = "PASS_ERR";
32
+ ReplyCode[ReplyCode["CMD_ERR"] = 500] = "CMD_ERR";
33
+ ReplyCode[ReplyCode["SYNTAX_ERR"] = 501] = "SYNTAX_ERR";
34
+ ReplyCode[ReplyCode["PARAM_ERR"] = 502] = "PARAM_ERR";
35
+ ReplyCode[ReplyCode["BAD_SEQ"] = 503] = "BAD_SEQ";
36
+ ReplyCode[ReplyCode["NO_SUCH_USER"] = 530] = "NO_SUCH_USER";
37
+ ReplyCode[ReplyCode["NOT_LOGGED"] = 530] = "NOT_LOGGED";
38
+ ReplyCode[ReplyCode["WRITE_PROTECT"] = 451] = "WRITE_PROTECT";
39
+ ReplyCode[ReplyCode["INTERNAL_ERR"] = 500] = "INTERNAL_ERR";
40
+ ReplyCode[ReplyCode["BAD_CMD"] = 502] = "BAD_CMD";
41
+ ReplyCode[ReplyCode["BAD_USER"] = 530] = "BAD_USER";
42
+ ReplyCode[ReplyCode["NOT_ALLOWED"] = 550] = "NOT_ALLOWED";
43
+ ReplyCode[ReplyCode["FILE_NOT_FOUND"] = 550] = "FILE_NOT_FOUND";
44
+ ReplyCode[ReplyCode["PATH_EXISTS"] = 550] = "PATH_EXISTS";
45
+ ReplyCode[ReplyCode["NO_PERMISSION"] = 550] = "NO_PERMISSION";
46
+ ReplyCode[ReplyCode["DIRECTORY_EXISTS"] = 550] = "DIRECTORY_EXISTS";
47
+ ReplyCode[ReplyCode["FILE_EXISTS"] = 550] = "FILE_EXISTS";
48
+ ReplyCode[ReplyCode["SYST_OK"] = 215] = "SYST_OK";
49
+ ReplyCode[ReplyCode["BAD_ADDRESS"] = 421] = "BAD_ADDRESS";
50
+ ReplyCode[ReplyCode["TIMEOUT"] = 421] = "TIMEOUT";
51
+ ReplyCode[ReplyCode["SERVICE_NOT_AVAILABLE"] = 421] = "SERVICE_NOT_AVAILABLE";
52
+ })(ReplyCode || (exports.ReplyCode = ReplyCode = {}));
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsSUFBWSxTQXdEWDtBQXhERCxXQUFZLFNBQVM7SUFFbkIsbURBQWMsQ0FBQTtJQUNkLDJEQUFrQixDQUFBO0lBR2xCLHVDQUFRLENBQUE7SUFDUixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxtREFBYyxDQUFBO0lBQ2QsaURBQWEsQ0FBQTtJQUNiLGlEQUFhLENBQUE7SUFDYixpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUNiLG1EQUFjLENBQUE7SUFDZCxpREFBYSxDQUFBO0lBQ2IsaURBQWEsQ0FBQTtJQUNiLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osaURBQWEsQ0FBQTtJQUdiLHFEQUFlLENBQUE7SUFDZixtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLG1EQUFjLENBQUE7SUFHZCxtREFBYyxDQUFBO0lBQ2QsbURBQWMsQ0FBQTtJQUNkLGlEQUFhLENBQUE7SUFDYix1REFBZ0IsQ0FBQTtJQUNoQixxREFBZSxDQUFBO0lBQ2YsaURBQWEsQ0FBQTtJQUNiLDJEQUFrQixDQUFBO0lBQ2xCLHVEQUFnQixDQUFBO0lBQ2hCLDZEQUFtQixDQUFBO0lBR25CLDJEQUFrQixDQUFBO0lBQ2xCLGlEQUFhLENBQUE7SUFDYixtREFBYyxDQUFBO0lBQ2QseURBQWlCLENBQUE7SUFDakIsK0RBQW9CLENBQUE7SUFDcEIseURBQWlCLENBQUE7SUFDakIsNkRBQW1CLENBQUE7SUFDbkIsbUVBQXNCLENBQUE7SUFDdEIseURBQWlCLENBQUE7SUFDakIsaURBQWEsQ0FBQTtJQUNiLHlEQUFpQixDQUFBO0lBQ2pCLGlEQUFhLENBQUE7SUFDYiw2RUFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBeERXLFNBQVMsYUFBVCxTQUFTLEdBQVQsU0FBUyxRQXdEcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcclxuXHJcbi8qKlxyXG4gKiBSRkMgOTU5IEZUUCBQcm90b2NvbCBUeXBlc1xyXG4gKiBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9pbmZvL3JmYzk1OVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBGVFAgWWFuxLF0IEtvZGxhcsSxIChSRkMgOTU5KVxyXG4gKi9cclxuZXhwb3J0IGVudW0gUmVwbHlDb2RlIHtcclxuICAvKiogMTAwLTE5OTogxLDFn2xlbSB0YW1hbWxhbm1hZMSxLCBiaWxnaSBtZXNhasSxICovXHJcbiAgQ09OVElOVUUgPSAxMjUsXHJcbiAgREFUQV9DT05ORUNUID0gMTUwLFxyXG4gIFxyXG4gIC8qKiAyMDAtMjk5OiBCYcWfYXLEsWzEsSAqL1xyXG4gIE9LID0gMjAwLFxyXG4gIFVTRVJfT0sgPSAyMzAsXHJcbiAgUEFTU19PSyA9IDIzMCxcclxuICBTWVNfTkFNRSA9IDIxMSxcclxuICBTWVNfVFlQRSA9IDIxNSxcclxuICBGRUFUX09LID0gMjExLFxyXG4gIFJFVFJfT0sgPSAyMjYsXHJcbiAgU1RPUl9PSyA9IDIyNixcclxuICBERUxFX09LID0gMjUwLFxyXG4gIFJNRF9PSyA9IDI1MCxcclxuICBNS0RfT0sgPSAyNTcsXHJcbiAgTElTVF9PSyA9IDE1MCxcclxuICBMSVNUX0VORCA9IDIyNixcclxuICBOT09QX09LID0gMjAwLFxyXG4gIFFVSVRfT0sgPSAyMjEsXHJcbiAgQ1dEX09LID0gMjUwLFxyXG4gIFBXRF9PSyA9IDI1NyxcclxuICBSRVNUX09LID0gMzUwLFxyXG4gIFxyXG4gIC8qKiAzMDAtMzk5OiBCZWtsZXllbiBiaWxnaSAqL1xyXG4gIFVTRVJfUEFTUyA9IDMzMSxcclxuICBQQVNTX0FDQyA9IDMzMixcclxuICBVU0VSX0FDQyA9IDMzMixcclxuICBSRVNUX05FVyA9IDM1MCxcclxuICBcclxuICAvKiogNDAwLTQ5OTogR2XDp2ljaSBoYXRhICovXHJcbiAgVVNFUl9FUlIgPSA1MDMsXHJcbiAgUEFTU19FUlIgPSA1MDMsXHJcbiAgQ01EX0VSUiA9IDUwMCxcclxuICBTWU5UQVhfRVJSID0gNTAxLFxyXG4gIFBBUkFNX0VSUiA9IDUwMixcclxuICBCQURfU0VRID0gNTAzLFxyXG4gIE5PX1NVQ0hfVVNFUiA9IDUzMCxcclxuICBOT1RfTE9HR0VEID0gNTMwLFxyXG4gIFdSSVRFX1BST1RFQ1QgPSA0NTEsXHJcbiAgXHJcbiAgLyoqIDUwMC01OTk6IEthbMSxY8SxIGhhdGEgKi9cclxuICBJTlRFUk5BTF9FUlIgPSA1MDAsXHJcbiAgQkFEX0NNRCA9IDUwMixcclxuICBCQURfVVNFUiA9IDUzMCxcclxuICBOT1RfQUxMT1dFRCA9IDU1MCxcclxuICBGSUxFX05PVF9GT1VORCA9IDU1MCxcclxuICBQQVRIX0VYSVNUUyA9IDU1MCxcclxuICBOT19QRVJNSVNTSU9OID0gNTUwLFxyXG4gIERJUkVDVE9SWV9FWElTVFMgPSA1NTAsXHJcbiAgRklMRV9FWElTVFMgPSA1NTAsXHJcbiAgU1lTVF9PSyA9IDIxNSxcclxuICBCQURfQUREUkVTUyA9IDQyMSxcclxuICBUSU1FT1VUID0gNDIxLFxyXG4gIFNFUlZJQ0VfTk9UX0FWQUlMQUJMRSA9IDQyMSxcclxufVxyXG5cclxuLyoqXHJcbiAqIEt1bGxhbsSxY8SxIGl6aW4gdMO8cmxlcmlcclxuICovXHJcbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPSBcclxuICB8ICdyZWFkJyAgICAgICAgICAgLy8gRG9zeWEgb2t1bWFcclxuICB8ICd3cml0ZScgICAgICAgICAgLy8gRG9zeWEgeWF6bWFcclxuICB8ICdsaXN0JyAgICAgICAgICAgLy8gRGl6aW4gbGlzdGVsZW1lXHJcbiAgfCAnY3JlYXRlJyAgICAgICAgIC8vIERvc3lhL2RpemluIG9sdcWfdHVybWFcclxuICB8ICdhcHBlbmQnICAgICAgICAgLy8gRG9zeWEgZWtsZW1lXHJcbiAgfCAnZGVsZXRlJyAgICAgICAgIC8vIERvc3lhIHNpbG1lXHJcbiAgfCAnY2htb2QnICAgICAgICAgIC8vIERvc3lhIGl6aW5sZXJpIGRlxJ9pxZ90aXJtZVxyXG4gIHwgJ21rZCcgICAgICAgICAgICAvLyBEaXppbiBvbHXFn3R1cm1hXHJcbiAgfCAncm1kaXInICAgICAgICAgIC8vIERpemluIHNpbG1lXHJcbiAgfCAncmVuYW1lJyAgICAgICAgIC8vIERvc3lhIHllbmlkZW4gYWRsYW5kxLFybWFcclxuICB8ICdkZWxldGVteWZpbGVzJyAgLy8gS2VuZGkgZG9zeWFsYXLEsW7EsSBzaWxtZVxyXG4gIHwgJ25vcGFzc3dkJyAgICAgICAvLyDFnmlmcmVzaXogZ2lyacWfXHJcbiAgfCAncGFzc2l2ZScgICAgICAgIC8vIFBhc2lmIG1vZCAoUEFTVilcclxuICB8ICdwb3J0JyAgICAgICAgICAgLy8gQWt0aWYgbW9kIChQT1JUKVxyXG4gIHwgJ25vbmxvY2FsYmluZCcgICAvLyBZZXJlbCBvbG1heWFuIGJhxJ9sYW5tYVxyXG4gIHwgJ3ByaXZhdGUnICAgICAgICAvLyDDlnplbCBrb211dGxhclxyXG4gIHwgJ3Rscyc7ICAgICAgICAgICAgLy8gVExTL1NTTFxyXG5cclxuLyoqXHJcbiAqIEt1bGxhbsSxY8SxIGl6aW4gb2JqZXNpXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQZXJtaXNzaW9ucyB7XHJcbiAgcmVhZD86IGJvb2xlYW47XHJcbiAgd3JpdGU/OiBib29sZWFuO1xyXG4gIGxpc3Q/OiBib29sZWFuO1xyXG4gIGNyZWF0ZT86IGJvb2xlYW47XHJcbiAgYXBwZW5kPzogYm9vbGVhbjtcclxuICBkZWxldGU/OiBib29sZWFuO1xyXG4gIGNobW9kPzogYm9vbGVhbjtcclxuICBta2Q/OiBib29sZWFuO1xyXG4gIHJtZGlyPzogYm9vbGVhbjtcclxuICByZW5hbWU/OiBib29sZWFuO1xyXG4gIGRlbGV0ZW15ZmlsZXM/OiBib29sZWFuO1xyXG4gIG5vcGFzc3dkPzogYm9vbGVhbjtcclxuICBwYXNzaXZlPzogYm9vbGVhbjtcclxuICBwb3J0PzogYm9vbGVhbjtcclxuICBub25sb2NhbGJpbmQ/OiBib29sZWFuO1xyXG4gIHByaXZhdGU/OiBib29sZWFuO1xyXG4gIHRscz86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGVFAgQmHEn2xhbnTEsSBiaWxnaWxlcmlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRnRwQ29ubmVjdGlvbiB7XHJcbiAgc29ja2V0OiBuZXQuU29ja2V0O1xyXG4gIHVzZXI6IHN0cmluZyB8IG51bGw7XHJcbiAgcGFzczogc3RyaW5nIHwgbnVsbDtcclxuICBob21lRGlyOiBzdHJpbmc7XHJcbiAgY3VycmVudERpcjogc3RyaW5nO1xyXG4gIHBlcm1pc3Npb25zOiBVc2VyUGVybWlzc2lvbnM7XHJcbiAgdHJhbnNmZXJNb2RlOiAnYXNjaWknIHwgJ2JpbmFyeScgfCBudWxsO1xyXG4gIHRyYW5zZmVyU2l6ZTogbnVtYmVyO1xyXG4gIGxhc3RSZXBseTogbnVtYmVyO1xyXG4gIGxhc3RNZXNzYWdlOiBzdHJpbmc7XHJcbiAgLyoqIFJORlIgaWxlIGJlbGlybGVuZW4geWVuaWRlbiBhZGxhbmTEsXJtYSBrYXluYcSfxLEgKi9cclxuICBybmZyUGF0aD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFZlcmkgYmFnbGFudGkgbW9kdTogUEFTViAocGFzaWYpIHZleWEgUE9SVCAoYWt0aWYpICovXHJcbiAgZGF0YU1vZGU/OiAncGFzc2l2ZScgfCAnYWN0aXZlJztcclxuICAvKiogQWt0aWYgbW9kZGEgKFBPUlQpIGlzdGVtY2luaW4gZGlubGVkaWdpIGFkcmVzICovXHJcbiAgYWN0aXZlRGF0YVRhcmdldD86IHsgaXA6IHN0cmluZzsgcG9ydDogbnVtYmVyIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBLdWxsYW7EsWPEsSBiaWxnaWxlcmlcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXNlciB7XHJcbiAgdXNlcm5hbWU6IHN0cmluZztcclxuICBwYXNzd29yZDogc3RyaW5nO1xyXG4gIGhvbWVEaXI6IHN0cmluZztcclxuICBwZXJtaXNzaW9uczogVXNlclBlcm1pc3Npb25zO1xyXG4gIGlzQWN0aXZlOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogS3VsbGFuxLFjxLEgecO2bmV0aW1pIHZlcml0YWJhbsSxXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJNYW5hZ2VyRGF0YSB7XHJcbiAgdXNlcnM6IFVzZXJbXTtcclxuICBsYXN0VXBkYXRlZDogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogVmVyaSBiYcSfbGFudMSxc8SxIGJpbGdpbGVyaSAoUE9SVC9QQVNWKVxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29ubmVjdGlvbiB7XHJcbiAgc29ja2V0OiBuZXQuU29ja2V0O1xyXG4gIHBhc3NpdmU6IGJvb2xlYW47XHJcbiAgbG9jYWxQb3J0OiBudW1iZXI7XHJcbiAgc3RhdGU6ICdsaXN0ZW5pbmcnIHwgJ2Nvbm5lY3RpbmcnIHwgJ2Nvbm5lY3RlZCcgfCAnY2xvc2luZycgfCAnY2xvc2VkJztcclxufVxyXG5cclxuLyoqXHJcbiAqIEtvbXV0IHNvbnXDpyBvYmplc2lcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJlc3VsdCB7XHJcbiAgY29kZTogbnVtYmVyO1xyXG4gIG1lc3NhZ2U6IHN0cmluZztcclxuICBkYXRhPzogdW5rbm93bjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEtvbXV0IGnFn2xldmkgdGlwIHRhbsSxbWxhbWFzxLFcclxuICovXHJcbmV4cG9ydCB0eXBlIENvbW1hbmRIYW5kbGVyID0gKGNvbm46IEZ0cENvbm5lY3Rpb24sIGFyZ3M6IHN0cmluZykgPT4gUHJvbWlzZTxDb21tYW5kUmVzdWx0PjtcclxuXHJcbi8qKlxyXG4gKiBTZXJ2ZXIgYXlhcmxhcsSxXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlckNvbmZpZyB7XHJcbiAgcG9ydDogbnVtYmVyO1xyXG4gIGRhdGFQb3J0OiBudW1iZXI7XHJcbiAgdXNlckZpbGU6IHN0cmluZztcclxuICBtYXhDb25uZWN0aW9uczogbnVtYmVyO1xyXG4gIGxvZ0xldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJztcclxuICAvKiogMjIwIGthcnNpbGFtYSAoYmFubmVyKSBtZXNhamk7IGJvcyBiaXJha2lsaXJzYSBcIjxwb3J0PiBGVFAgU2VydmVyIFJlYWR5XCIga3VsbGFuaWxpciAqL1xyXG4gIGJhbm5lcjogc3RyaW5nO1xyXG4gIC8qKiBQQVNWIHZlcmkgYmFnbGFudGkgcG9ydGxhcmkgYnUgYXJhbGlrdGFuIHNlY2lsaXIgKi9cclxuICBwYXNzaXZlUG9ydFJhbmdlOiB7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9O1xyXG59XHJcblxyXG4vKipcclxuICogRG9zeWEgdHJhbnNmZXIgZHVydW11XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyU3RhdHVzIHtcclxuICBmaWxlOiBzdHJpbmc7XHJcbiAgc3RhdGU6ICdwZW5kaW5nJyB8ICd0cmFuc2ZlcnJpbmcnIHwgJ2NvbXBsZXRlJyB8ICdmYWlsZWQnO1xyXG4gIHNpemU6IG51bWJlcjtcclxuICB0cmFuc2ZlcnJlZDogbnVtYmVyO1xyXG4gIG1vZGU6ICdhc2NpaScgfCAnYmluYXJ5JztcclxuICB0aW1lc3RhbXA6IHN0cmluZztcclxufVxyXG5cclxuIl19
@@ -0,0 +1,24 @@
1
+ import { User, UserPermissions, Permission } from './types';
2
+ export declare class UserManager {
3
+ private userFile;
4
+ private users;
5
+ private data;
6
+ constructor(userFile: string);
7
+ private load;
8
+ private save;
9
+ findUser(username: string): User | null;
10
+ addUser(username: string, password: string, homeDir: string, permissions: UserPermissions): boolean;
11
+ deleteUser(username: string): boolean;
12
+ toggleUserStatus(username: string, isActive: boolean): boolean;
13
+ updatePermissions(username: string, permissions: UserPermissions): boolean;
14
+ checkPermission(username: string, permission: Permission): boolean;
15
+ listUsers(): User[];
16
+ getUserStats(): Map<string, number>;
17
+ getUserCount(): number;
18
+ changeUsername(oldUsername: string, newUsername: string): boolean;
19
+ changePassword(username: string, newPassword: string): boolean;
20
+ changeHomeDir(username: string, newHomeDir: string): boolean;
21
+ static getInstance(userFile: string): UserManager;
22
+ private static _instance;
23
+ }
24
+ export declare function getUserManager(userFile?: string): Promise<UserManager>;