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,4 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ import { UserManager } from '../userManager';
3
+ export declare function buildDirectoryListing(directory: string): Promise<string>;
4
+ export declare function handleList(connId: string, conn: FtpConnection, userManager: UserManager, controlSocket: any): Promise<CommandResult>;
@@ -0,0 +1,92 @@
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.buildDirectoryListing = buildDirectoryListing;
37
+ exports.handleList = handleList;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const types_1 = require("../types");
41
+ const pathUtils_1 = require("../utils/pathUtils");
42
+ async function buildDirectoryListing(directory) {
43
+ const files = await fs.promises.readdir(directory, { withFileTypes: true });
44
+ files.sort((a, b) => a.name.localeCompare(b.name));
45
+ let output = '';
46
+ for (const file of files) {
47
+ const filePath = path.join(directory, file.name);
48
+ const stat = await fs.promises.stat(filePath).catch(() => null);
49
+ const perms = file.isDirectory() ? 'drwxr-xr-x' : '-rw-r--r--';
50
+ const size = file.isDirectory() ? '4096' : stat ? stat.size.toString() : '0';
51
+ output += `${perms} 1 admin admin ${size} Oct 29 00:00 ${file.name}\r\n`;
52
+ }
53
+ return output;
54
+ }
55
+ async function handleList(connId, conn, userManager, controlSocket) {
56
+ try {
57
+ if (!conn.user) {
58
+ conn.lastReply = types_1.ReplyCode.NOT_LOGGED;
59
+ conn.lastMessage = `Not logged in`;
60
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
61
+ return { code: conn.lastReply, message: conn.lastMessage };
62
+ }
63
+ const directoryResolved = path.resolve(conn.currentDir);
64
+ if (!(0, pathUtils_1.isPathWithinHome)(directoryResolved, conn.homeDir)) {
65
+ conn.lastReply = types_1.ReplyCode.NOT_ALLOWED;
66
+ conn.lastMessage = `Access denied: Cannot list outside home directory`;
67
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
68
+ return { code: conn.lastReply, message: conn.lastMessage };
69
+ }
70
+ if (!userManager || !userManager.checkPermission(conn.user || '', 'list')) {
71
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
72
+ conn.lastMessage = `Permission denied: LIST`;
73
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
74
+ return { code: conn.lastReply, message: conn.lastMessage };
75
+ }
76
+ const output = await buildDirectoryListing(directoryResolved);
77
+ conn.lastReply = types_1.ReplyCode.DATA_CONNECT;
78
+ conn.lastMessage = `Opening DATA connection for LIST`;
79
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
80
+ console.log(`[FtpServer] LIST: ${conn.user} - ${directoryResolved}`);
81
+ return { code: conn.lastReply, message: conn.lastMessage, data: { output, directory: directoryResolved } };
82
+ }
83
+ catch (error) {
84
+ console.error(`[FtpServer] LIST komutu hatası:`, error);
85
+ const err = error;
86
+ conn.lastReply = types_1.ReplyCode.INTERNAL_ERR;
87
+ conn.lastMessage = `Internal server error: ${err.message}`;
88
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
89
+ return { code: conn.lastReply, message: conn.lastMessage };
90
+ }
91
+ }
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGlzdENvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvTGlzdENvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksRUFBRSwrQkFBVztBQUN6QixNQUFZLElBQUksaUNBQWE7QUFDN0Isb0NBQW1FO0FBRW5FLGtEQUFzRDtBQU8vQyxLQUFLLGdDQUFnQyxTQUFpQjtJQUMzRCxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVuRCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUMvRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDN0UsTUFBTSxJQUFJLEdBQUcsS0FBSyxrQkFBa0IsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBS00sS0FBSyxxQkFBcUIsTUFBYyxFQUFFLElBQW1CLEVBQUUsV0FBd0IsRUFBRSxhQUFrQjtJQUNoSCxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFVBQVUsQ0FBQztZQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQztZQUNuQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztZQUNsRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBR0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsSUFBQSw0QkFBZ0IsRUFBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsV0FBVyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsbURBQW1ELENBQUM7WUFDdkUsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsTUFBTSxDQUFDLENBQUM7WUFDbEUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUdELElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDMUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLGFBQWEsQ0FBQztZQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLHlCQUF5QixDQUFDO1lBQzdDLGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFHOUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLGtDQUFrQyxDQUFDO1FBQ3RELGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1FBRWxFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLE1BQU0saUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztJQUM3RyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsS0FBYyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRywwQkFBMEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNELGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFJlcGx5Q29kZSwgRnRwQ29ubmVjdGlvbiwgQ29tbWFuZFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi4vdXNlck1hbmFnZXInO1xuaW1wb3J0IHsgaXNQYXRoV2l0aGluSG9tZSB9IGZyb20gJy4uL3V0aWxzL3BhdGhVdGlscyc7XG5cbi8qKlxuICogRGl6aW4gbGlzdGVzaW5pIFJGQyA5NTkgTElTVCBmb3JtYXTEsW5kYSBoYXrEsXJsYTpcbiAqICAgLXJ3LXItLXItLSAxIGFkbWluIGFkbWluIDQwOTYgT2N0IDI5IDAwOjAwIGRvc3lhLnR4dFxuICogKERpemluIHTDvHLDvCBpemluIGFsYW7EsW7EsW4gaWxrIGhhcmZpbmRlbiBhbmxhxZ/EsWzEsXIsIGVrIHNhdMSxciB5YXrEsWxtYXouKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGREaXJlY3RvcnlMaXN0aW5nKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBmaWxlcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcblxuICBsZXQgb3V0cHV0ID0gJyc7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgZmlsZS5uYW1lKTtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgY29uc3QgcGVybXMgPSBmaWxlLmlzRGlyZWN0b3J5KCkgPyAnZHJ3eHIteHIteCcgOiAnLXJ3LXItLXItLSc7XG4gICAgY29uc3Qgc2l6ZSA9IGZpbGUuaXNEaXJlY3RvcnkoKSA/ICc0MDk2JyA6IHN0YXQgPyBzdGF0LnNpemUudG9TdHJpbmcoKSA6ICcwJztcbiAgICBvdXRwdXQgKz0gYCR7cGVybXN9IDEgYWRtaW4gYWRtaW4gJHtzaXplfSBPY3QgMjkgMDA6MDAgJHtmaWxlLm5hbWV9XFxyXFxuYDtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIExJU1Qga29tdXR1bnUgacWfbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUxpc3QoY29ubklkOiBzdHJpbmcsIGNvbm46IEZ0cENvbm5lY3Rpb24sIHVzZXJNYW5hZ2VyOiBVc2VyTWFuYWdlciwgY29udHJvbFNvY2tldDogYW55KTogUHJvbWlzZTxDb21tYW5kUmVzdWx0PiB7XG4gIHRyeSB7XG4gICAgaWYgKCFjb25uLnVzZXIpIHtcbiAgICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLk5PVF9MT0dHRUQ7XG4gICAgICBjb25uLmxhc3RNZXNzYWdlID0gYE5vdCBsb2dnZWQgaW5gO1xuICAgICAgY29udHJvbFNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gICAgfVxuXG4gICAgLy8gR8OcVkVOTMSwSzogS3VsbGFuxLFjxLEgc2FkZWNlIGtlbmRpIGhvbWVEaXInaW5lIGVyacWfZWJpbGlyXG4gICAgY29uc3QgZGlyZWN0b3J5UmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29ubi5jdXJyZW50RGlyKTtcbiAgICBpZiAoIWlzUGF0aFdpdGhpbkhvbWUoZGlyZWN0b3J5UmVzb2x2ZWQsIGNvbm4uaG9tZURpcikpIHtcbiAgICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLk5PVF9BTExPV0VEO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBBY2Nlc3MgZGVuaWVkOiBDYW5ub3QgbGlzdCBvdXRzaWRlIGhvbWUgZGlyZWN0b3J5YDtcbiAgICAgIGNvbnRyb2xTb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICAgIH1cblxuICAgIC8vIMSwemluIGtvbnRyb2zDvFxuICAgIGlmICghdXNlck1hbmFnZXIgfHwgIXVzZXJNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihjb25uLnVzZXIgfHwgJycsICdsaXN0JykpIHtcbiAgICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLk5PX1BFUk1JU1NJT047XG4gICAgICBjb25uLmxhc3RNZXNzYWdlID0gYFBlcm1pc3Npb24gZGVuaWVkOiBMSVNUYDtcbiAgICAgIGNvbnRyb2xTb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGJ1aWxkRGlyZWN0b3J5TGlzdGluZyhkaXJlY3RvcnlSZXNvbHZlZCk7XG5cbiAgICAvLyAxNTAgeWFuxLF0xLFuxLEga29udHJvbCBzb2NrZXQnZSBnw7ZuZGVyXG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuREFUQV9DT05ORUNUO1xuICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgT3BlbmluZyBEQVRBIGNvbm5lY3Rpb24gZm9yIExJU1RgO1xuICAgIGNvbnRyb2xTb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG5cbiAgICBjb25zb2xlLmxvZyhgW0Z0cFNlcnZlcl0gTElTVDogJHtjb25uLnVzZXJ9IC0gJHtkaXJlY3RvcnlSZXNvbHZlZH1gKTtcbiAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSwgZGF0YTogeyBvdXRwdXQsIGRpcmVjdG9yeTogZGlyZWN0b3J5UmVzb2x2ZWQgfSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtGdHBTZXJ2ZXJdIExJU1Qga29tdXR1IGhhdGFzxLE6YCwgZXJyb3IpO1xuICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLklOVEVSTkFMX0VSUjtcbiAgICBjb25uLmxhc3RNZXNzYWdlID0gYEludGVybmFsIHNlcnZlciBlcnJvcjogJHtlcnIubWVzc2FnZX1gO1xuICAgIGNvbnRyb2xTb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgcmV0dXJuIHsgY29kZTogY29ubi5sYXN0UmVwbHksIG1lc3NhZ2U6IGNvbm4ubGFzdE1lc3NhZ2UgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ import { UserManager } from '../userManager';
3
+ export declare function handleMkd(connId: string, conn: FtpConnection, dirPath: string, userManager: UserManager): Promise<CommandResult>;
@@ -0,0 +1,97 @@
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.handleMkd = handleMkd;
37
+ const fs = __importStar(require("fs"));
38
+ const types_1 = require("../types");
39
+ const pathUtils_1 = require("../utils/pathUtils");
40
+ async function handleMkd(connId, conn, dirPath, userManager) {
41
+ const socket = conn?.socket;
42
+ try {
43
+ if (!conn.user) {
44
+ conn.lastReply = types_1.ReplyCode.NOT_LOGGED;
45
+ conn.lastMessage = `Not logged in`;
46
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
47
+ return { code: conn.lastReply, message: conn.lastMessage };
48
+ }
49
+ if (!userManager || !userManager.checkPermission(conn.user || '', 'mkd')) {
50
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
51
+ conn.lastMessage = `Permission denied: MKD`;
52
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
53
+ return { code: conn.lastReply, message: conn.lastMessage };
54
+ }
55
+ const targetDir = (0, pathUtils_1.resolveFtpPath)(dirPath, conn.currentDir, conn.homeDir);
56
+ if (!(0, pathUtils_1.isPathWithinHome)(targetDir, conn.homeDir)) {
57
+ conn.lastReply = types_1.ReplyCode.NOT_ALLOWED;
58
+ conn.lastMessage = `Access denied: Cannot create directory outside home directory`;
59
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
60
+ return { code: conn.lastReply, message: conn.lastMessage };
61
+ }
62
+ try {
63
+ await fs.promises.mkdir(targetDir, { recursive: true });
64
+ }
65
+ catch (error) {
66
+ const err = error;
67
+ if (err.code === 'EEXIST') {
68
+ conn.lastReply = types_1.ReplyCode.DIRECTORY_EXISTS;
69
+ conn.lastMessage = `Directory already exists: ${dirPath}`;
70
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
71
+ return { code: conn.lastReply, message: conn.lastMessage };
72
+ }
73
+ if (err.code === 'ENOENT') {
74
+ conn.lastReply = types_1.ReplyCode.FILE_NOT_FOUND;
75
+ conn.lastMessage = `No such parent directory: ${dirPath}`;
76
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
77
+ return { code: conn.lastReply, message: conn.lastMessage };
78
+ }
79
+ throw error;
80
+ }
81
+ const normalizedDir = (0, pathUtils_1.toVirtualPath)(targetDir, conn.homeDir);
82
+ conn.lastReply = types_1.ReplyCode.MKD_OK;
83
+ conn.lastMessage = `"${normalizedDir}" directory created`;
84
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
85
+ console.log(`[FtpServer] MKD: ${conn.user} -> ${targetDir}`);
86
+ return { code: conn.lastReply, message: conn.lastMessage };
87
+ }
88
+ catch (error) {
89
+ console.error(`[FtpServer] MKD komutu hatası:`, error);
90
+ const err = error;
91
+ conn.lastReply = types_1.ReplyCode.INTERNAL_ERR;
92
+ conn.lastMessage = `Internal server error: ${err.message}`;
93
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
94
+ return { code: conn.lastReply, message: conn.lastMessage };
95
+ }
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWtkQ29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9Na2RDb21tYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE1BQVksRUFBRSwrQkFBVztBQUV6QixvQ0FBbUU7QUFFbkUsa0RBQXFGO0FBSzlFLEtBQUssb0JBQW9CLE1BQWMsRUFBRSxJQUFtQixFQUFFLE9BQWUsRUFBRSxXQUF3QjtJQUM1RyxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsVUFBVSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDO1lBQ25DLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1lBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFHRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyx3QkFBd0IsQ0FBQztZQUM1QyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztZQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBQSwwQkFBYyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUd6RSxJQUFJLENBQUMsSUFBQSw0QkFBZ0IsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFdBQVcsQ0FBQztZQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLCtEQUErRCxDQUFDO1lBQ25GLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1lBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxHQUFHLEdBQUcsS0FBOEIsQ0FBQztZQUMzQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyw2QkFBNkIsT0FBTyxFQUFFLENBQUM7Z0JBQzFELE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsY0FBYyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLDZCQUE2QixPQUFPLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsTUFBTSxDQUFDLENBQUM7Z0JBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdELENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFBLHlCQUFhLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsTUFBTSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxhQUFhLHFCQUFxQixDQUFDO1FBQzFELE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1FBRTNELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM3RCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsTUFBTSxHQUFHLEdBQUcsS0FBYyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRywwQkFBMEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNELE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1FBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFJlcGx5Q29kZSwgRnRwQ29ubmVjdGlvbiwgQ29tbWFuZFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi4vdXNlck1hbmFnZXInO1xuaW1wb3J0IHsgcmVzb2x2ZUZ0cFBhdGgsIHRvVmlydHVhbFBhdGgsIGlzUGF0aFdpdGhpbkhvbWUgfSBmcm9tICcuLi91dGlscy9wYXRoVXRpbHMnO1xuXG4vKipcbiAqIE1LRCBrb211dHVudSBpxZ9sZSAoZGl6aW4gb2x1xZ90dXIpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVNa2QoY29ubklkOiBzdHJpbmcsIGNvbm46IEZ0cENvbm5lY3Rpb24sIGRpclBhdGg6IHN0cmluZywgdXNlck1hbmFnZXI6IFVzZXJNYW5hZ2VyKTogUHJvbWlzZTxDb21tYW5kUmVzdWx0PiB7XG4gIGNvbnN0IHNvY2tldCA9IGNvbm4/LnNvY2tldDtcbiAgdHJ5IHtcbiAgICBpZiAoIWNvbm4udXNlcikge1xuICAgICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuTk9UX0xPR0dFRDtcbiAgICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgTm90IGxvZ2dlZCBpbmA7XG4gICAgICBzb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICAgIH1cblxuICAgIC8vIMSwemluIGtvbnRyb2zDvFxuICAgIGlmICghdXNlck1hbmFnZXIgfHwgIXVzZXJNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihjb25uLnVzZXIgfHwgJycsICdta2QnKSkge1xuICAgICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuTk9fUEVSTUlTU0lPTjtcbiAgICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgUGVybWlzc2lvbiBkZW5pZWQ6IE1LRGA7XG4gICAgICBzb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldERpciA9IHJlc29sdmVGdHBQYXRoKGRpclBhdGgsIGNvbm4uY3VycmVudERpciwgY29ubi5ob21lRGlyKTtcblxuICAgIC8vIEfDnFZFTkzEsEs6IFllbmkgZGl6aW4gaG9tZURpciBpw6dpbmRlIG9sbWFsxLFcbiAgICBpZiAoIWlzUGF0aFdpdGhpbkhvbWUodGFyZ2V0RGlyLCBjb25uLmhvbWVEaXIpKSB7XG4gICAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5OT1RfQUxMT1dFRDtcbiAgICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgQWNjZXNzIGRlbmllZDogQ2Fubm90IGNyZWF0ZSBkaXJlY3Rvcnkgb3V0c2lkZSBob21lIGRpcmVjdG9yeWA7XG4gICAgICBzb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLkRJUkVDVE9SWV9FWElTVFM7XG4gICAgICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOiAke2RpclBhdGh9YDtcbiAgICAgICAgc29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgICAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5GSUxFX05PVF9GT1VORDtcbiAgICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBObyBzdWNoIHBhcmVudCBkaXJlY3Rvcnk6ICR7ZGlyUGF0aH1gO1xuICAgICAgICBzb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkRGlyID0gdG9WaXJ0dWFsUGF0aCh0YXJnZXREaXIsIGNvbm4uaG9tZURpcik7XG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuTUtEX09LO1xuICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgXCIke25vcm1hbGl6ZWREaXJ9XCIgZGlyZWN0b3J5IGNyZWF0ZWRgO1xuICAgIHNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcblxuICAgIGNvbnNvbGUubG9nKGBbRnRwU2VydmVyXSBNS0Q6ICR7Y29ubi51c2VyfSAtPiAke3RhcmdldERpcn1gKTtcbiAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtGdHBTZXJ2ZXJdIE1LRCBrb211dHUgaGF0YXPEsTpgLCBlcnJvcik7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuSU5URVJOQUxfRVJSO1xuICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgSW50ZXJuYWwgc2VydmVyIGVycm9yOiAke2Vyci5tZXNzYWdlfWA7XG4gICAgc29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ export declare function handleNoop(connId: string, conn: FtpConnection): CommandResult;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleNoop = handleNoop;
4
+ const types_1 = require("../types");
5
+ function handleNoop(connId, conn) {
6
+ const socket = conn?.socket;
7
+ conn.lastReply = types_1.ReplyCode.NOOP_OK;
8
+ conn.lastMessage = 'OK';
9
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
10
+ return { code: conn.lastReply, message: conn.lastMessage };
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9vcENvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvTm9vcENvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0NBQW1FO0FBS25FLG9CQUEyQixNQUFjLEVBQUUsSUFBbUI7SUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsT0FBTyxDQUFDO0lBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3hCLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO0lBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBseUNvZGUsIEZ0cENvbm5lY3Rpb24sIENvbW1hbmRSZXN1bHQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogTk9PUCBrb211dHVudSBpxZ9sZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlTm9vcChjb25uSWQ6IHN0cmluZywgY29ubjogRnRwQ29ubmVjdGlvbik6IENvbW1hbmRSZXN1bHQge1xuICBjb25zdCBzb2NrZXQgPSBjb25uPy5zb2NrZXQ7XG4gIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLk5PT1BfT0s7XG4gIGNvbm4ubGFzdE1lc3NhZ2UgPSAnT0snO1xuICBzb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ import { UserManager } from '../userManager';
3
+ export declare function handlePass(connId: string, conn: FtpConnection, password: string, userManager: UserManager): Promise<CommandResult>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handlePass = handlePass;
4
+ const types_1 = require("../types");
5
+ async function handlePass(connId, conn, password, userManager) {
6
+ const socket = conn?.socket;
7
+ try {
8
+ if (!conn.user) {
9
+ conn.lastReply = types_1.ReplyCode.NOT_LOGGED;
10
+ conn.lastMessage = `Not logged in`;
11
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
12
+ return { code: conn.lastReply, message: conn.lastMessage };
13
+ }
14
+ if (!userManager) {
15
+ conn.lastReply = types_1.ReplyCode.INTERNAL_ERR;
16
+ conn.lastMessage = `Internal server error: userManager not initialized`;
17
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
18
+ return { code: conn.lastReply, message: conn.lastMessage };
19
+ }
20
+ const user = userManager.findUser(conn.user);
21
+ if (!user || user.password !== password) {
22
+ conn.lastReply = types_1.ReplyCode.BAD_USER;
23
+ conn.lastMessage = `Incorrect password for user ${conn.user}`;
24
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
25
+ return { code: conn.lastReply, message: conn.lastMessage };
26
+ }
27
+ conn.pass = password;
28
+ conn.lastReply = types_1.ReplyCode.PASS_OK;
29
+ conn.lastMessage = `Login successful`;
30
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
31
+ console.log(`[FtpServer] Şifre doğrulandı: ${conn.user} (${connId})`);
32
+ return { code: conn.lastReply, message: conn.lastMessage };
33
+ }
34
+ catch (error) {
35
+ console.error(`[FtpServer] PASS komutu hatası:`, error);
36
+ const err = error;
37
+ conn.lastReply = types_1.ReplyCode.INTERNAL_ERR;
38
+ conn.lastMessage = `Internal server error: ${err.message}`;
39
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
40
+ return { code: conn.lastReply, message: conn.lastMessage };
41
+ }
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFzc0NvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvUGFzc0NvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0NBQW1FO0FBTTVELEtBQUsscUJBQXFCLE1BQWMsRUFBRSxJQUFtQixFQUFFLFFBQWdCLEVBQUUsV0FBd0I7SUFDOUcsTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUM1QixJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFVBQVUsQ0FBQztZQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQztZQUNuQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztZQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBR0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7WUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxvREFBb0QsQ0FBQztZQUN4RSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztZQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxRQUFRLENBQUM7WUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRywrQkFBK0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlELE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1lBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsT0FBTyxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7UUFDdEMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsTUFBTSxDQUFDLENBQUM7UUFFM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxLQUFjLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLDBCQUEwQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsTUFBTSxDQUFDLENBQUM7UUFDM0QsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBseUNvZGUsIEZ0cENvbm5lY3Rpb24sIENvbW1hbmRSZXN1bHQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBVc2VyTWFuYWdlciB9IGZyb20gJy4uL3VzZXJNYW5hZ2VyJztcblxuLyoqXG4gKiBQQVNTIGtvbXV0dW51IGnFn2xlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVQYXNzKGNvbm5JZDogc3RyaW5nLCBjb25uOiBGdHBDb25uZWN0aW9uLCBwYXNzd29yZDogc3RyaW5nLCB1c2VyTWFuYWdlcjogVXNlck1hbmFnZXIpOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgY29uc3Qgc29ja2V0ID0gY29ubj8uc29ja2V0O1xuICB0cnkge1xuICAgIGlmICghY29ubi51c2VyKSB7XG4gICAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5OT1RfTE9HR0VEO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBOb3QgbG9nZ2VkIGluYDtcbiAgICAgIHNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gICAgfVxuXG4gICAgLy8gS3VsbGFuxLFjxLEgxZ9pZnJlc2luaSBrb250cm9sIGV0XG4gICAgaWYgKCF1c2VyTWFuYWdlcikge1xuICAgICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuSU5URVJOQUxfRVJSO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3I6IHVzZXJNYW5hZ2VyIG5vdCBpbml0aWFsaXplZGA7XG4gICAgICBzb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICAgIH1cbiAgICBjb25zdCB1c2VyID0gdXNlck1hbmFnZXIuZmluZFVzZXIoY29ubi51c2VyKTtcbiAgICBpZiAoIXVzZXIgfHwgdXNlci5wYXNzd29yZCAhPT0gcGFzc3dvcmQpIHtcbiAgICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLkJBRF9VU0VSO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBJbmNvcnJlY3QgcGFzc3dvcmQgZm9yIHVzZXIgJHtjb25uLnVzZXJ9YDtcbiAgICAgIHNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gICAgfVxuXG4gICAgY29ubi5wYXNzID0gcGFzc3dvcmQ7XG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuUEFTU19PSztcbiAgICBjb25uLmxhc3RNZXNzYWdlID0gYExvZ2luIHN1Y2Nlc3NmdWxgO1xuICAgIHNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcblxuICAgIGNvbnNvbGUubG9nKGBbRnRwU2VydmVyXSDFnmlmcmUgZG/En3J1bGFuZMSxOiAke2Nvbm4udXNlcn0gKCR7Y29ubklkfSlgKTtcbiAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtGdHBTZXJ2ZXJdIFBBU1Mga29tdXR1IGhhdGFzxLE6YCwgZXJyb3IpO1xuICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLklOVEVSTkFMX0VSUjtcbiAgICBjb25uLmxhc3RNZXNzYWdlID0gYEludGVybmFsIHNlcnZlciBlcnJvcjogJHtlcnIubWVzc2FnZX1gO1xuICAgIHNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcbiAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ export declare function handlePasv(connId: string, conn: FtpConnection, passiveIp: string, dynamicPort: number): CommandResult;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handlePasv = handlePasv;
4
+ const types_1 = require("../types");
5
+ function handlePasv(connId, conn, passiveIp, dynamicPort) {
6
+ const socket = conn?.socket;
7
+ try {
8
+ const p1 = Math.floor(dynamicPort / 256);
9
+ const p2 = dynamicPort % 256;
10
+ const pasvResponse = `227 Entering Passive Mode (${passiveIp.replace(/\./g, ',')},${p1},${p2})\r\n`;
11
+ conn.dataMode = 'passive';
12
+ conn.activeDataTarget = undefined;
13
+ conn.lastReply = 227;
14
+ conn.lastMessage = 'Entering Passive Mode';
15
+ socket?.write(pasvResponse);
16
+ console.log(`[FtpServer] PASV: ${connId} - Passive mode enabled, port: ${dynamicPort}`);
17
+ return { code: 227, message: 'Entering Passive Mode' };
18
+ }
19
+ catch (error) {
20
+ console.error(`[FtpServer] PASV komutu hatası:`, error);
21
+ conn.lastReply = types_1.ReplyCode.INTERNAL_ERR;
22
+ conn.lastMessage = `Internal server error`;
23
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
24
+ return { code: conn.lastReply, message: conn.lastMessage };
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFzdkNvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvUGFzdkNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0NBQW1FO0FBS25FLG9CQUEyQixNQUFjLEVBQUUsSUFBbUIsRUFBRSxTQUFpQixFQUFFLFdBQW1CO0lBQ3BHLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxNQUFNLENBQUM7SUFDNUIsSUFBSSxDQUFDO1FBR0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUM3QixNQUFNLFlBQVksR0FBRyw4QkFBOEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO1FBR3BHLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFFbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQztRQUMzQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTVCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLE1BQU0sa0NBQWtDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEYsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLENBQUM7SUFDekQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQztRQUMzQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztRQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGx5Q29kZSwgRnRwQ29ubmVjdGlvbiwgQ29tbWFuZFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBQQVNWIGtvbXV0dW51IGnFn2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXN2KGNvbm5JZDogc3RyaW5nLCBjb25uOiBGdHBDb25uZWN0aW9uLCBwYXNzaXZlSXA6IHN0cmluZywgZHluYW1pY1BvcnQ6IG51bWJlcik6IENvbW1hbmRSZXN1bHQge1xuICBjb25zdCBzb2NrZXQgPSBjb25uPy5zb2NrZXQ7XG4gIHRyeSB7XG4gICAgLy8gUEFTViB5YW7EsXTEsTogMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoaDEsaDIsaDMsaDQscDEscDIpXG4gICAgLy8gUG9ydCwgRnRwU2VydmVyIHlhcMSxbGFuZMSxcm1hc8SxbmRha2kgcGFzc2l2ZVBvcnRSYW5nZSBhcmFsxLHEn8SxbmRhbiBzZcOnaWxpclxuICAgIGNvbnN0IHAxID0gTWF0aC5mbG9vcihkeW5hbWljUG9ydCAvIDI1Nik7XG4gICAgY29uc3QgcDIgPSBkeW5hbWljUG9ydCAlIDI1NjtcbiAgICBjb25zdCBwYXN2UmVzcG9uc2UgPSBgMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoJHtwYXNzaXZlSXAucmVwbGFjZSgvXFwuL2csICcsJyl9LCR7cDF9LCR7cDJ9KVxcclxcbmA7XG5cbiAgICAvLyBQYXNpZiBtb2Q6IGJpciBzb25yYWtpIHZlcmkgYWt0YXLEsW3EsSBidSBwb3J0IMO8emVyaW5kZW4geWFwxLFsxLFyXG4gICAgY29ubi5kYXRhTW9kZSA9ICdwYXNzaXZlJztcbiAgICBjb25uLmFjdGl2ZURhdGFUYXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgXG4gICAgY29ubi5sYXN0UmVwbHkgPSAyMjc7XG4gICAgY29ubi5sYXN0TWVzc2FnZSA9ICdFbnRlcmluZyBQYXNzaXZlIE1vZGUnO1xuICAgIHNvY2tldD8ud3JpdGUocGFzdlJlc3BvbnNlKTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhgW0Z0cFNlcnZlcl0gUEFTVjogJHtjb25uSWR9IC0gUGFzc2l2ZSBtb2RlIGVuYWJsZWQsIHBvcnQ6ICR7ZHluYW1pY1BvcnR9YCk7XG4gICAgcmV0dXJuIHsgY29kZTogMjI3LCBtZXNzYWdlOiAnRW50ZXJpbmcgUGFzc2l2ZSBNb2RlJyB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtGdHBTZXJ2ZXJdIFBBU1Yga29tdXR1IGhhdGFzxLE6YCwgZXJyb3IpO1xuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLklOVEVSTkFMX0VSUjtcbiAgICBjb25uLmxhc3RNZXNzYWdlID0gYEludGVybmFsIHNlcnZlciBlcnJvcmA7XG4gICAgc29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ export declare function handlePort(conn: FtpConnection, args: string): CommandResult;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handlePort = handlePort;
4
+ const types_1 = require("../types");
5
+ function handlePort(conn, args) {
6
+ const socket = conn?.socket;
7
+ try {
8
+ const match = args.trim().match(/^(\d{1,3},){3}\d{1,3},\d{1,3},\d{1,3}$/);
9
+ if (!match) {
10
+ conn.lastReply = types_1.ReplyCode.SYNTAX_ERR;
11
+ conn.lastMessage = `Syntax error in PORT command`;
12
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
13
+ return { code: conn.lastReply, message: conn.lastMessage };
14
+ }
15
+ const parts = args.trim().split(',').map((n) => parseInt(n, 10));
16
+ const ip = parts.slice(0, 4).join('.');
17
+ const port = parts[4] * 256 + parts[5];
18
+ conn.dataMode = 'active';
19
+ conn.activeDataTarget = { ip, port };
20
+ conn.lastReply = types_1.ReplyCode.OK;
21
+ conn.lastMessage = `Ready to send data`;
22
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
23
+ console.log(`[FtpServer] PORT: Active mode enabled -> ${ip}:${port}`);
24
+ return { code: conn.lastReply, message: conn.lastMessage };
25
+ }
26
+ catch (error) {
27
+ console.error(`[FtpServer] PORT komutu hatası:`, error);
28
+ conn.lastReply = types_1.ReplyCode.INTERNAL_ERR;
29
+ conn.lastMessage = `Internal server error`;
30
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
31
+ return { code: conn.lastReply, message: conn.lastMessage };
32
+ }
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydENvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvUG9ydENvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0NBQW1FO0FBS25FLG9CQUEyQixJQUFtQixFQUFFLElBQVk7SUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUM1QixJQUFJLENBQUM7UUFHSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFVBQVUsQ0FBQztZQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLDhCQUE4QixDQUFDO1lBQ2xELE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1lBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUd2QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDO1FBQ3hDLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1FBRTNELE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsWUFBWSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLEdBQUcsdUJBQXVCLENBQUM7UUFDM0MsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsTUFBTSxDQUFDLENBQUM7UUFDM0QsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBseUNvZGUsIEZ0cENvbm5lY3Rpb24sIENvbW1hbmRSZXN1bHQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogUE9SVCBrb211dHVudSBpxZ9sZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUG9ydChjb25uOiBGdHBDb25uZWN0aW9uLCBhcmdzOiBzdHJpbmcpOiBDb21tYW5kUmVzdWx0IHtcbiAgY29uc3Qgc29ja2V0ID0gY29ubj8uc29ja2V0O1xuICB0cnkge1xuICAgIC8vIFBPUlQga29tdXR1OiBQT1JUIGgxLGgyLGgzLGg0LHAxLHAyXG4gICAgLy8gUE9SVCBoMSxoMixoMyxoNCxwMSxwMiAoZMO2cnQgb2t0ZXQgdmUgaWtpIHBvcnQgYnl0ZSfEsSB2aXJnw7xsbGUgYXlyxLFsxLFyKVxuICAgIGNvbnN0IG1hdGNoID0gYXJncy50cmltKCkubWF0Y2goL14oXFxkezEsM30sKXszfVxcZHsxLDN9LFxcZHsxLDN9LFxcZHsxLDN9JC8pO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLlNZTlRBWF9FUlI7XG4gICAgICBjb25uLmxhc3RNZXNzYWdlID0gYFN5bnRheCBlcnJvciBpbiBQT1JUIGNvbW1hbmRgO1xuICAgICAgc29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgICAgcmV0dXJuIHsgY29kZTogY29ubi5sYXN0UmVwbHksIG1lc3NhZ2U6IGNvbm4ubGFzdE1lc3NhZ2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IGFyZ3MudHJpbSgpLnNwbGl0KCcsJykubWFwKChuKSA9PiBwYXJzZUludChuLCAxMCkpO1xuICAgIGNvbnN0IGlwID0gcGFydHMuc2xpY2UoMCwgNCkuam9pbignLicpO1xuICAgIGNvbnN0IHBvcnQgPSBwYXJ0c1s0XSAqIDI1NiArIHBhcnRzWzVdO1xuXG4gICAgLy8gQWt0aWYgbW9kOiB2ZXJpIGJhxJ9sYW50xLFzxLEgc3VudWN1ZGFuIGlzdGVtY2l5ZSBhw6fEsWzEsXJcbiAgICBjb25uLmRhdGFNb2RlID0gJ2FjdGl2ZSc7XG4gICAgY29ubi5hY3RpdmVEYXRhVGFyZ2V0ID0geyBpcCwgcG9ydCB9O1xuXG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuT0s7XG4gICAgY29ubi5sYXN0TWVzc2FnZSA9IGBSZWFkeSB0byBzZW5kIGRhdGFgO1xuICAgIHNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcblxuICAgIGNvbnNvbGUubG9nKGBbRnRwU2VydmVyXSBQT1JUOiBBY3RpdmUgbW9kZSBlbmFibGVkIC0+ICR7aXB9OiR7cG9ydH1gKTtcbiAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYFtGdHBTZXJ2ZXJdIFBPUlQga29tdXR1IGhhdGFzxLE6YCwgZXJyb3IpO1xuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLklOVEVSTkFMX0VSUjtcbiAgICBjb25uLmxhc3RNZXNzYWdlID0gYEludGVybmFsIHNlcnZlciBlcnJvcmA7XG4gICAgc29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ export declare function handlePwd(connId: string, conn: FtpConnection): CommandResult;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handlePwd = handlePwd;
4
+ const types_1 = require("../types");
5
+ const pathUtils_1 = require("../utils/pathUtils");
6
+ function handlePwd(connId, conn) {
7
+ const socket = conn?.socket;
8
+ try {
9
+ if (!conn.user) {
10
+ conn.lastReply = types_1.ReplyCode.NOT_LOGGED;
11
+ conn.lastMessage = `Not logged in`;
12
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
13
+ return { code: conn.lastReply, message: conn.lastMessage };
14
+ }
15
+ conn.lastReply = types_1.ReplyCode.PWD_OK;
16
+ const normalizedDir = (0, pathUtils_1.toVirtualPath)(conn.currentDir, conn.homeDir);
17
+ conn.lastMessage = `"${normalizedDir}" is currently in directory`;
18
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
19
+ return { code: conn.lastReply, message: conn.lastMessage };
20
+ }
21
+ catch (error) {
22
+ console.error(`[FtpServer] PWD komutu hatası:`, error);
23
+ const err = error;
24
+ conn.lastReply = types_1.ReplyCode.INTERNAL_ERR;
25
+ conn.lastMessage = `Internal server error: ${err.message}`;
26
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
27
+ return { code: conn.lastReply, message: conn.lastMessage };
28
+ }
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHdkQ29tbWFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9Qd2RDb21tYW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9DQUFtRTtBQUNuRSxrREFBbUQ7QUFLbkQsbUJBQTBCLE1BQWMsRUFBRSxJQUFtQjtJQUMzRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsVUFBVSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDO1lBQ25DLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1lBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsTUFBTSxDQUFDO1FBRWxDLE1BQU0sYUFBYSxHQUFHLElBQUEseUJBQWEsRUFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksYUFBYSw2QkFBNkIsQ0FBQztRQUNsRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztRQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsTUFBTSxHQUFHLEdBQUcsS0FBYyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRywwQkFBMEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNELE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1FBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwbHlDb2RlLCBGdHBDb25uZWN0aW9uLCBDb21tYW5kUmVzdWx0IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgdG9WaXJ0dWFsUGF0aCB9IGZyb20gJy4uL3V0aWxzL3BhdGhVdGlscyc7XG5cbi8qKlxuICogUFdEIGtvbXV0dW51IGnFn2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQd2QoY29ubklkOiBzdHJpbmcsIGNvbm46IEZ0cENvbm5lY3Rpb24pOiBDb21tYW5kUmVzdWx0IHtcbiAgY29uc3Qgc29ja2V0ID0gY29ubj8uc29ja2V0O1xuICB0cnkge1xuICAgIGlmICghY29ubi51c2VyKSB7XG4gICAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5OT1RfTE9HR0VEO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBOb3QgbG9nZ2VkIGluYDtcbiAgICAgIHNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcbiAgICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gICAgfVxuXG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuUFdEX09LO1xuICAgIC8vIGhvbWVEaXIgPSBzYW5hbCBrw7ZrICgvKSwgaXN0ZW1jaXllIGRvc3lhIHNpc3RlbWkgeW9sdSBnw7ZzdGVybWVcbiAgICBjb25zdCBub3JtYWxpemVkRGlyID0gdG9WaXJ0dWFsUGF0aChjb25uLmN1cnJlbnREaXIsIGNvbm4uaG9tZURpcik7XG4gICAgY29ubi5sYXN0TWVzc2FnZSA9IGBcIiR7bm9ybWFsaXplZERpcn1cIiBpcyBjdXJyZW50bHkgaW4gZGlyZWN0b3J5YDtcbiAgICBzb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgcmV0dXJuIHsgY29kZTogY29ubi5sYXN0UmVwbHksIG1lc3NhZ2U6IGNvbm4ubGFzdE1lc3NhZ2UgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbRnRwU2VydmVyXSBQV0Qga29tdXR1IGhhdGFzxLE6YCwgZXJyb3IpO1xuICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLklOVEVSTkFMX0VSUjtcbiAgICBjb25uLmxhc3RNZXNzYWdlID0gYEludGVybmFsIHNlcnZlciBlcnJvcjogJHtlcnIubWVzc2FnZX1gO1xuICAgIHNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcbiAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ export declare function handleQuit(connId: string, conn: FtpConnection, closeConnection: (connId: string, reason?: string) => void): CommandResult;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleQuit = handleQuit;
4
+ const types_1 = require("../types");
5
+ function handleQuit(connId, conn, closeConnection) {
6
+ try {
7
+ const socket = conn?.socket;
8
+ console.log(`[FtpServer] QUIT: ${conn.user || 'anonim'} (${connId})`);
9
+ conn.lastReply = types_1.ReplyCode.QUIT_OK;
10
+ conn.lastMessage = `Goodbye`;
11
+ socket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
12
+ closeConnection(connId);
13
+ return { code: conn.lastReply, message: conn.lastMessage };
14
+ }
15
+ catch (error) {
16
+ console.error(`[FtpServer] QUIT komutu hatası:`, error);
17
+ closeConnection(connId);
18
+ return { code: types_1.ReplyCode.QUIT_OK, message: 'Goodbye' };
19
+ }
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVpdENvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvUXVpdENvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0NBQW1FO0FBS25FLG9CQUEyQixNQUFjLEVBQUUsSUFBbUIsRUFBRSxlQUEwRDtJQUN4SCxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxLQUFLLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM3QixNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztRQUMzRCxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLGlCQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGx5Q29kZSwgRnRwQ29ubmVjdGlvbiwgQ29tbWFuZFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBRVUlUIGtvbXV0dW51IGnFn2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVRdWl0KGNvbm5JZDogc3RyaW5nLCBjb25uOiBGdHBDb25uZWN0aW9uLCBjbG9zZUNvbm5lY3Rpb246IChjb25uSWQ6IHN0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiB2b2lkKTogQ29tbWFuZFJlc3VsdCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc29ja2V0ID0gY29ubj8uc29ja2V0O1xuICAgIGNvbnNvbGUubG9nKGBbRnRwU2VydmVyXSBRVUlUOiAke2Nvbm4udXNlciB8fCAnYW5vbmltJ30gKCR7Y29ubklkfSlgKTtcbiAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5RVUlUX09LO1xuICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgR29vZGJ5ZWA7XG4gICAgc29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgIGNsb3NlQ29ubmVjdGlvbihjb25uSWQpO1xuICAgIHJldHVybiB7IGNvZGU6IGNvbm4ubGFzdFJlcGx5LCBtZXNzYWdlOiBjb25uLmxhc3RNZXNzYWdlIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgW0Z0cFNlcnZlcl0gUVVJVCBrb211dHUgaGF0YXPEsTpgLCBlcnJvcik7XG4gICAgY2xvc2VDb25uZWN0aW9uKGNvbm5JZCk7XG4gICAgcmV0dXJuIHsgY29kZTogUmVwbHlDb2RlLlFVSVRfT0ssIG1lc3NhZ2U6ICdHb29kYnllJyB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ import { UserManager } from '../userManager';
3
+ export declare function handleRetr(connId: string, conn: FtpConnection, filename: string, userManager: UserManager, controlSocket: any): Promise<CommandResult>;
@@ -0,0 +1,83 @@
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.handleRetr = handleRetr;
37
+ const fs = __importStar(require("fs"));
38
+ const types_1 = require("../types");
39
+ const pathUtils_1 = require("../utils/pathUtils");
40
+ async function handleRetr(connId, conn, filename, userManager, controlSocket) {
41
+ try {
42
+ if (!conn.user) {
43
+ conn.lastReply = types_1.ReplyCode.NOT_LOGGED;
44
+ conn.lastMessage = `Not logged in`;
45
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
46
+ return { code: conn.lastReply, message: conn.lastMessage };
47
+ }
48
+ if (!userManager || !userManager.checkPermission(conn.user || '', 'read')) {
49
+ conn.lastReply = types_1.ReplyCode.NO_PERMISSION;
50
+ conn.lastMessage = `Permission denied: RETR`;
51
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
52
+ return { code: conn.lastReply, message: conn.lastMessage };
53
+ }
54
+ const filePath = (0, pathUtils_1.resolveFtpPath)(filename, conn.currentDir, conn.homeDir);
55
+ if (!(0, pathUtils_1.isPathWithinHome)(filePath, conn.homeDir)) {
56
+ conn.lastReply = types_1.ReplyCode.NOT_ALLOWED;
57
+ conn.lastMessage = `Access denied: Cannot download outside home directory`;
58
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
59
+ return { code: conn.lastReply, message: conn.lastMessage };
60
+ }
61
+ const stat = await fs.promises.stat(filePath).catch(() => null);
62
+ if (!stat || !stat.isFile()) {
63
+ conn.lastReply = types_1.ReplyCode.FILE_NOT_FOUND;
64
+ conn.lastMessage = `No such file or directory: ${filename}`;
65
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
66
+ return { code: conn.lastReply, message: conn.lastMessage };
67
+ }
68
+ conn.lastReply = types_1.ReplyCode.DATA_CONNECT;
69
+ conn.lastMessage = `Opening DATA connection for RETR`;
70
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
71
+ console.log(`[FtpServer] RETR: ${conn.user} - ${filename}`);
72
+ return { code: conn.lastReply, message: conn.lastMessage, data: { filePath } };
73
+ }
74
+ catch (error) {
75
+ console.error(`[FtpServer] RETR komutu hatası:`, error);
76
+ const err = error;
77
+ conn.lastReply = types_1.ReplyCode.INTERNAL_ERR;
78
+ conn.lastMessage = `Internal server error: ${err.message}`;
79
+ controlSocket?.write(`${conn.lastReply} ${conn.lastMessage}\r\n`);
80
+ return { code: conn.lastReply, message: conn.lastMessage };
81
+ }
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmV0ckNvbW1hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvUmV0ckNvbW1hbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsTUFBWSxFQUFFLCtCQUFXO0FBRXpCLG9DQUFtRTtBQUVuRSxrREFBc0U7QUFLL0QsS0FBSyxxQkFBcUIsTUFBYyxFQUFFLElBQW1CLEVBQUUsUUFBZ0IsRUFBRSxXQUF3QixFQUFFLGFBQWtCO0lBQ2xJLElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFTLENBQUMsVUFBVSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDO1lBQ25DLGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFHRCxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQztZQUM3QyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztZQUNsRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBQSwwQkFBYyxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUd6RSxJQUFJLENBQUMsSUFBQSw0QkFBZ0IsRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFdBQVcsQ0FBQztZQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLHVEQUF1RCxDQUFDO1lBQzNFLGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLGNBQWMsQ0FBQztZQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLDhCQUE4QixRQUFRLEVBQUUsQ0FBQztZQUM1RCxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxNQUFNLENBQUMsQ0FBQztZQUNsRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBR0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFlBQVksQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLGtDQUFrQyxDQUFDO1FBQ3RELGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1FBRWxFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLE1BQU0sUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUNqRixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsTUFBTSxHQUFHLEdBQUcsS0FBYyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRywwQkFBMEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNELGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFJlcGx5Q29kZSwgRnRwQ29ubmVjdGlvbiwgQ29tbWFuZFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFVzZXJNYW5hZ2VyIH0gZnJvbSAnLi4vdXNlck1hbmFnZXInO1xuaW1wb3J0IHsgcmVzb2x2ZUZ0cFBhdGgsIGlzUGF0aFdpdGhpbkhvbWUgfSBmcm9tICcuLi91dGlscy9wYXRoVXRpbHMnO1xuXG4vKipcbiAqIFJFVFIga29tdXR1bnUgacWfbGUgKGRvc3lhIGluZGlyKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmV0cihjb25uSWQ6IHN0cmluZywgY29ubjogRnRwQ29ubmVjdGlvbiwgZmlsZW5hbWU6IHN0cmluZywgdXNlck1hbmFnZXI6IFVzZXJNYW5hZ2VyLCBjb250cm9sU29ja2V0OiBhbnkpOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgdHJ5IHtcbiAgICBpZiAoIWNvbm4udXNlcikge1xuICAgICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuTk9UX0xPR0dFRDtcbiAgICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgTm90IGxvZ2dlZCBpbmA7XG4gICAgICBjb250cm9sU29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgICAgcmV0dXJuIHsgY29kZTogY29ubi5sYXN0UmVwbHksIG1lc3NhZ2U6IGNvbm4ubGFzdE1lc3NhZ2UgfTtcbiAgICB9XG5cbiAgICAvLyDEsHppbiBrb250cm9sw7xcbiAgICBpZiAoIXVzZXJNYW5hZ2VyIHx8ICF1c2VyTWFuYWdlci5jaGVja1Blcm1pc3Npb24oY29ubi51c2VyIHx8ICcnLCAncmVhZCcpKSB7XG4gICAgICBjb25uLmxhc3RSZXBseSA9IFJlcGx5Q29kZS5OT19QRVJNSVNTSU9OO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBQZXJtaXNzaW9uIGRlbmllZDogUkVUUmA7XG4gICAgICBjb250cm9sU29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgICAgcmV0dXJuIHsgY29kZTogY29ubi5sYXN0UmVwbHksIG1lc3NhZ2U6IGNvbm4ubGFzdE1lc3NhZ2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmVGdHBQYXRoKGZpbGVuYW1lLCBjb25uLmN1cnJlbnREaXIsIGNvbm4uaG9tZURpcik7XG5cbiAgICAvLyBHw5xWRU5MxLBLOiBEb3N5YSBob21lRGlyIGnDp2luZGUgb2xtYWzEsVxuICAgIGlmICghaXNQYXRoV2l0aGluSG9tZShmaWxlUGF0aCwgY29ubi5ob21lRGlyKSkge1xuICAgICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuTk9UX0FMTE9XRUQ7XG4gICAgICBjb25uLmxhc3RNZXNzYWdlID0gYEFjY2VzcyBkZW5pZWQ6IENhbm5vdCBkb3dubG9hZCBvdXRzaWRlIGhvbWUgZGlyZWN0b3J5YDtcbiAgICAgIGNvbnRyb2xTb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG4gICAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICBpZiAoIXN0YXQgfHwgIXN0YXQuaXNGaWxlKCkpIHtcbiAgICAgIGNvbm4ubGFzdFJlcGx5ID0gUmVwbHlDb2RlLkZJTEVfTk9UX0ZPVU5EO1xuICAgICAgY29ubi5sYXN0TWVzc2FnZSA9IGBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAke2ZpbGVuYW1lfWA7XG4gICAgICBjb250cm9sU29ja2V0Py53cml0ZShgJHtjb25uLmxhc3RSZXBseX0gJHtjb25uLmxhc3RNZXNzYWdlfVxcclxcbmApO1xuICAgICAgcmV0dXJuIHsgY29kZTogY29ubi5sYXN0UmVwbHksIG1lc3NhZ2U6IGNvbm4ubGFzdE1lc3NhZ2UgfTtcbiAgICB9XG5cbiAgICAvLyAxNTAgeWFuxLF0xLFuxLEga29udHJvbCBzb2NrZXQnZSBnw7ZuZGVyXG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuREFUQV9DT05ORUNUO1xuICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgT3BlbmluZyBEQVRBIGNvbm5lY3Rpb24gZm9yIFJFVFJgO1xuICAgIGNvbnRyb2xTb2NrZXQ/LndyaXRlKGAke2Nvbm4ubGFzdFJlcGx5fSAke2Nvbm4ubGFzdE1lc3NhZ2V9XFxyXFxuYCk7XG5cbiAgICBjb25zb2xlLmxvZyhgW0Z0cFNlcnZlcl0gUkVUUjogJHtjb25uLnVzZXJ9IC0gJHtmaWxlbmFtZX1gKTtcbiAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSwgZGF0YTogeyBmaWxlUGF0aCB9IH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgW0Z0cFNlcnZlcl0gUkVUUiBrb211dHUgaGF0YXPEsTpgLCBlcnJvcik7XG4gICAgY29uc3QgZXJyID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgY29ubi5sYXN0UmVwbHkgPSBSZXBseUNvZGUuSU5URVJOQUxfRVJSO1xuICAgIGNvbm4ubGFzdE1lc3NhZ2UgPSBgSW50ZXJuYWwgc2VydmVyIGVycm9yOiAke2Vyci5tZXNzYWdlfWA7XG4gICAgY29udHJvbFNvY2tldD8ud3JpdGUoYCR7Y29ubi5sYXN0UmVwbHl9ICR7Y29ubi5sYXN0TWVzc2FnZX1cXHJcXG5gKTtcbiAgICByZXR1cm4geyBjb2RlOiBjb25uLmxhc3RSZXBseSwgbWVzc2FnZTogY29ubi5sYXN0TWVzc2FnZSB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import { FtpConnection, CommandResult } from '../types';
2
+ import { UserManager } from '../userManager';
3
+ export declare function handleRmd(connId: string, conn: FtpConnection, dirPath: string, userManager: UserManager): Promise<CommandResult>;