ftpd-lite 0.0.0-stage → 1.0.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/LICENSE +201 -0
- package/README.md +121 -2
- package/examples/basic.js +28 -0
- package/package.json +47 -4
- package/src/commands/CwdCommand.d.ts +3 -0
- package/src/commands/CwdCommand.js +91 -0
- package/src/commands/DeleCommand.d.ts +3 -0
- package/src/commands/DeleCommand.js +85 -0
- package/src/commands/FeatCommand.d.ts +2 -0
- package/src/commands/FeatCommand.js +30 -0
- package/src/commands/ListCommand.d.ts +4 -0
- package/src/commands/ListCommand.js +92 -0
- package/src/commands/MkdCommand.d.ts +3 -0
- package/src/commands/MkdCommand.js +97 -0
- package/src/commands/NoopCommand.d.ts +2 -0
- package/src/commands/NoopCommand.js +12 -0
- package/src/commands/PassCommand.d.ts +3 -0
- package/src/commands/PassCommand.js +43 -0
- package/src/commands/PasvCommand.d.ts +2 -0
- package/src/commands/PasvCommand.js +27 -0
- package/src/commands/PortCommand.d.ts +2 -0
- package/src/commands/PortCommand.js +34 -0
- package/src/commands/PwdCommand.d.ts +2 -0
- package/src/commands/PwdCommand.js +30 -0
- package/src/commands/QuitCommand.d.ts +2 -0
- package/src/commands/QuitCommand.js +21 -0
- package/src/commands/RetrCommand.d.ts +3 -0
- package/src/commands/RetrCommand.js +83 -0
- package/src/commands/RmdCommand.d.ts +3 -0
- package/src/commands/RmdCommand.js +97 -0
- package/src/commands/RnfrCommand.d.ts +3 -0
- package/src/commands/RnfrCommand.js +85 -0
- package/src/commands/RntoCommand.d.ts +3 -0
- package/src/commands/RntoCommand.js +104 -0
- package/src/commands/StorCommand.d.ts +3 -0
- package/src/commands/StorCommand.js +87 -0
- package/src/commands/SystCommand.d.ts +2 -0
- package/src/commands/SystCommand.js +22 -0
- package/src/commands/TypeCommand.d.ts +2 -0
- package/src/commands/TypeCommand.js +29 -0
- package/src/commands/UserCommand.d.ts +3 -0
- package/src/commands/UserCommand.js +79 -0
- package/src/commands/index.d.ts +19 -0
- package/src/commands/index.js +36 -0
- package/src/connection.d.ts +28 -0
- package/src/connection.js +133 -0
- package/src/core/DataServer.d.ts +7 -0
- package/src/core/DataServer.js +76 -0
- package/src/core/FtpServer.d.ts +44 -0
- package/src/core/FtpServer.js +502 -0
- package/src/core/index.d.ts +2 -0
- package/src/core/index.js +19 -0
- package/src/fileTransfer.d.ts +15 -0
- package/src/fileTransfer.js +120 -0
- package/src/index.d.ts +6 -0
- package/src/index.js +16 -0
- package/src/types/index.d.ts +119 -0
- package/src/types/index.js +53 -0
- package/src/types.d.ts +130 -0
- package/src/types.js +53 -0
- package/src/userManager.d.ts +24 -0
- package/src/userManager.js +287 -0
- package/src/utils/logger.d.ts +14 -0
- package/src/utils/logger.js +36 -0
- package/src/utils/pathUtils.d.ts +7 -0
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVRyYW5zZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZpbGVUcmFuc2Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxNQUFZLElBQUksaUNBQWE7QUFDN0IsbUNBQW1EO0FBQ25ELCtDQUE0QztBQUs1QztJQUdFO1FBRUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFXLENBQUM7SUFDakMsQ0FBQztJQUtPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV0QixJQUFJLENBQUMsV0FBVyxHQUFJLE1BQWMsQ0FBQyxhQUFhO2dCQUM5QyxJQUFJLHlCQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFLTyxlQUFlLENBQUMsSUFBWSxFQUFFLFVBQWtCO1FBRXRELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUtNLEtBQUssQ0FBQyxVQUFVLENBQ3JCLElBQW1CLEVBQ25CLFVBQWtCLEVBQ2xCLElBQVk7UUFFWixPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBR3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQztRQUNqRCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9B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QUksQ0FBQyxJQUFJLElBQUksU0FBUyxNQUFNLE9BQU8sT0FBTyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRzdHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsQ0FBQztRQUNqRCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLHdDQUF3QyxDQUFDO0lBQzlELENBQUM7SUFLTSxLQUFLLENBQUMsY0FBYyxDQUN6QixJQUFtQixFQUNuQixVQUFrQixFQUNsQixJQUFZO1FBRVosT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQztRQUduRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsMEJBQTBCLENBQUM7UUFDaEQsQ0FBQztRQUdELElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxvQ0FBb0MsQ0FBQztJQUMxRCxDQUFDO0NBQ0Y7O0FBR1ksUUFBQSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBSZXBseUNvZGUsIEZ0cENvbm5lY3Rpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi91c2VyTWFuYWdlcic7XG5cbi8qKlxuICogRmlsZVRyYW5zZmVyIC0gRG9zeWEgdHJhbnNmZXIgacWfbGVtbGVyaVxuICovXG5leHBvcnQgY2xhc3MgRmlsZVRyYW5zZmVyIHtcbiAgcHJpdmF0ZSB1c2VyTWFuYWdlcjogVXNlck1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRMO2bmfDvCBiYcSfxLFtbMSxbMSxxJ/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>;
|