25.10.2021, 09:12
|
Новичок на форуме
|
|
Регистрация: 25.10.2021
Сообщений: 8
|
|
FTP-server на node js
Всем привет. С толкнулся с проблемой при создании ftp сервера на node js.
Нашел библиотеку ftp-srv. В принципе она рабочая. Через клиент FileZilla подключается, файлы, каталоги все передается. Но есть проблемка, то что не все события прослушиваются . Рабочие только STOR,RETR, RNTO.
Все остальные не слушаются.
Начал писать без использования бибилиотеки с помощью модуля NET.
Но столкнулся с проблемой, то что вроде как авторизовывается клиент, но каталог не показывается. Пишется невозможно построить каталог. Кто сталкивался с такой проблемой? Буду признателен, если укажите мне(неандертальцу) в чем может заключаться данная проблема
|
|
25.10.2021, 09:13
|
Новичок на форуме
|
|
Регистрация: 25.10.2021
Сообщений: 8
|
|
const net = require('net');
const path = require('path');
const fs = require('fs')
/**
*
DELE 250 Удалить файл
RMD 250 Удалить директорию
CWD 250 Перейти в директорию
MKD 257 Создать директорию
PWD 257 Узнать текущую директорию
QUIT 221 Закончить работу
TYPE 200 Установить тип передачи
PORT 200 Перейти в активный режим
PASV 227 Перейти в пассивный режим
LIST 150,226 Получить содержимое каталога
RETR 150,226 Скачать файл
STOR 150,226 Залить файл
ABOR 426,226 Отменить передачу
RNFR 350 Выбрать файл для переименования
RNTO 250 Переименовать файл
* @type {Server}
*/
const server = net.createServer({pauseOnConnect: true}, (socket) => {
console.log(socket.id)
socket.setTimeout(0)
// 'connection' listener.
console.log('client connected');
socket.on('error', (err) => {
console.log('Client error:', err)
});
socket.on('connect', function (data) {
console.log('connect:', data)
});
socket.on('data', function (data) {
console.log('data:', data.toString().split('\r\n'))
const message = data.toString().split('\r\n');
if (message[0].substr(0,4) === 'AUTH') {
socket.write('502\r\n 504 \r\n')
}
if (message[0] === 'USER anonymous') {
socket.write('331 \r\n')
}
if (message[0] === 'PASS [email]anonymous@example.com[/email]') {
socket.write('230 \r\n')
}
if (message[0] === 'FEAT') {
socket.write('211 \r\n')
}
if (message[0] === 'SYST') {
socket.write('230 \r\n')
}
if (message[0] === 'OPTS UTF8 ON') {
socket.write('200 \r\n')
}
if (message[0] === 'PWD') {
const command = '257 "\\" \r\n';
socket.write(command)
}
if (message[0].substr(0,4) === 'TYPE') {
socket.write('200 \r\n')
}
if (message[0] === 'PASV') {
const portByte1 = 21 / 256 | 0;
const portByte2 = 21 % 256;
socket.write(`227 PASV OK\r\n`)
}
if (message[0].substr(0,4) === 'PORT') {
socket.write('200 \r\n')
}
if (message[0] === 'LIST') {
socket.write('150\r\n 226\r\n', 'utf8')
}
if (message[0] === 'CDUP') {
socket.write('250 \r\n')
}
if (message[0].substr(0,3) === 'CWD') {
socket.write('250 \r\n')
}
});
socket.on('timeout', () => {
console.log('Client timeout')
});
socket.on('end', () => {
console.log('client disconnected');
});
socket.write('220 Hello World!\n')
socket.resume()
});
server.on('error', (err) => {
console.log(err)
});
server.listen(21, '127.0.0.1', () => {
console.log('opened server on', server.address());
});
|
|
25.10.2021, 12:15
|
Новичок на форуме
|
|
Регистрация: 25.10.2021
Сообщений: 8
|
|
Вот это не прослушивает
connection.on('MKD', (error, fileName) => {
console.log('Создать каталог')
});
в консоле не выводит , что отработало.
|
|
25.10.2021, 12:17
|
Новичок на форуме
|
|
Регистрация: 25.10.2021
Сообщений: 8
|
|
require('dotenv').config()
const FtpSrv = require('ftp-srv');
const User = require('./user')
const winston = require('winston');
const ftpServer = new FtpSrv({
blacklist: []
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({filename: 'src/storage/logs/events.log'}),
],
});
ftpServer.on('login', ({connection, username, password}, resolve, reject) => {
if (process.env.METHOD_AUTHORIZATION === 'normal') {
const user = new User(username, password)
// проверка | check
if (user.isLogin()) {
// Работа с файлами | Working with files
// загрузка | upload
connection.on('STOR', (error, fileName) => {
logger.log('info', {
event: "file:upload",
path: fileName,
src_ip: '',
src_port: ''
});
});
// скачивание | download
connection.on('RETR', (error, fileName) => {
logger.log('info', {
event: "file:download",
path: fileName,
src_ip: '',
src_port: ''
});
});
// удаление | delete
connection.on('DELE', (error, fileName) => {
logger.log('info', {
event: "file:delete",
path: fileName,
src_ip: '',
src_port: ''
});
});
// Работа с каталогами | Working with catalogs
// создать | create
connection.on('MKD', (error, fileName) => {
console.log('Создать каталог')
});
// удалить | delete
connection.on('RMD', (error, fileName) => {
console.log('Удалить каталог')
});
// переименовать во что | rename
connection.on('RNTO', (error, fileName) => {
console.log('Переименовано')
});
// Установить рабочий каталог | Install the working directory
resolve({root: `src/storage/disk`})
} else {
reject({message: user.getError()})
}
} else {
resolve({root: `src/disk`})
}
})
ftpServer.on('client-error', ({connection, context, error}) => {
console.log(error.message)
});
ftpServer.listen().then(() => {
});
|
|
25.10.2021, 17:06
|
Новичок на форуме
|
|
Регистрация: 25.10.2021
Сообщений: 8
|
|
А как их дописать, просто в документации ничего такого нет, что можно как то дописывать команды?
|
|
25.10.2021, 18:14
|
Новичок на форуме
|
|
Регистрация: 25.10.2021
Сообщений: 8
|
|
А в каком файле это дописать? как подгрузить свой модуль в либу?
|
|
25.10.2021, 18:15
|
Новичок на форуме
|
|
Регистрация: 25.10.2021
Сообщений: 8
|
|
Или это возможно только через клонирование самой либы ?
|
|
25.10.2021, 23:52
|
Новичок на форуме
|
|
Регистрация: 25.10.2021
Сообщений: 8
|
|
Спасибо за ответы решил проблемы через File System
|
|
|
|