Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.10.2021, 09:12
Новичок на форуме
Отправить личное сообщение для SazonovAV Посмотреть профиль Найти все сообщения от SazonovAV
 
Регистрация: 25.10.2021
Сообщений: 8

FTP-server на node js
Всем привет. С толкнулся с проблемой при создании ftp сервера на node js.

Нашел библиотеку ftp-srv. В принципе она рабочая. Через клиент FileZilla подключается, файлы, каталоги все передается. Но есть проблемка, то что не все события прослушиваются . Рабочие только STOR,RETR, RNTO.
Все остальные не слушаются.

Начал писать без использования бибилиотеки с помощью модуля NET.
Но столкнулся с проблемой, то что вроде как авторизовывается клиент, но каталог не показывается. Пишется невозможно построить каталог. Кто сталкивался с такой проблемой? Буду признателен, если укажите мне(неандертальцу) в чем может заключаться данная проблема
Ответить с цитированием
  #2 (permalink)  
Старый 25.10.2021, 09:13
Новичок на форуме
Отправить личное сообщение для SazonovAV Посмотреть профиль Найти все сообщения от SazonovAV
 
Регистрация: 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());
});
Ответить с цитированием
  #3 (permalink)  
Старый 25.10.2021, 12:15
Новичок на форуме
Отправить личное сообщение для SazonovAV Посмотреть профиль Найти все сообщения от SazonovAV
 
Регистрация: 25.10.2021
Сообщений: 8

Вот это не прослушивает
connection.on('MKD', (error, fileName) => {
                console.log('Создать каталог')
            });




в консоле не выводит , что отработало.
Ответить с цитированием
  #4 (permalink)  
Старый 25.10.2021, 12:17
Новичок на форуме
Отправить личное сообщение для SazonovAV Посмотреть профиль Найти все сообщения от SazonovAV
 
Регистрация: 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(() => {

});
Ответить с цитированием
  #5 (permalink)  
Старый 25.10.2021, 17:06
Новичок на форуме
Отправить личное сообщение для SazonovAV Посмотреть профиль Найти все сообщения от SazonovAV
 
Регистрация: 25.10.2021
Сообщений: 8

А как их дописать, просто в документации ничего такого нет, что можно как то дописывать команды?
Ответить с цитированием
  #6 (permalink)  
Старый 25.10.2021, 18:14
Новичок на форуме
Отправить личное сообщение для SazonovAV Посмотреть профиль Найти все сообщения от SazonovAV
 
Регистрация: 25.10.2021
Сообщений: 8

А в каком файле это дописать? как подгрузить свой модуль в либу?
Ответить с цитированием
  #7 (permalink)  
Старый 25.10.2021, 18:15
Новичок на форуме
Отправить личное сообщение для SazonovAV Посмотреть профиль Найти все сообщения от SazonovAV
 
Регистрация: 25.10.2021
Сообщений: 8

Или это возможно только через клонирование самой либы ?
Ответить с цитированием
  #8 (permalink)  
Старый 25.10.2021, 23:52
Новичок на форуме
Отправить личное сообщение для SazonovAV Посмотреть профиль Найти все сообщения от SazonovAV
 
Регистрация: 25.10.2021
Сообщений: 8

Спасибо за ответы решил проблемы через File System
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Документация по node JS oleg901 Node.JS 0 16.03.2020 00:55
Маршрутизация и get post запросы в Node js daniilka87 Node.JS 6 24.02.2020 21:40
WebStorm, node js, автодополнение torsar Общие вопросы Javascript 1 22.01.2020 17:01
Node js + electron +usb = error koeshiro Node.JS 0 23.11.2016 23:36
node js IP камера mader Node.JS 0 21.10.2016 12:55