From 1450a8c0e5213321a48c64a8600a7cf01929859e Mon Sep 17 00:00:00 2001 From: anschrammh Date: Sun, 13 Oct 2019 16:42:34 +0200 Subject: [PATCH] Continuing to implement the FTPServer --- .../tcpServer_test/FTPClient.cpp | 9 ++-- src/software_test/tcpServer_test/FTPClient.h | 5 ++- src/software_test/tcpServer_test/FTPServer.h | 42 +++++++++++++++++-- .../tcpServer_test/tcpServer_test.ino | 2 +- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/software_test/tcpServer_test/FTPClient.cpp b/src/software_test/tcpServer_test/FTPClient.cpp index 8fe365f..e8a166f 100644 --- a/src/software_test/tcpServer_test/FTPClient.cpp +++ b/src/software_test/tcpServer_test/FTPClient.cpp @@ -5,9 +5,11 @@ _ftpCommand({'\0'}), _cmdParameters(NULL), _loggedIn(false), _username(NULL), -_dataSocketOpen(false), +_currentDirectory(NULL), +_waitingForDataConnection(false), _ftpClientState(FTPServer::FTPClientState::WAITING_FOR_COMMANDS), -_binaryFlag(FTPServer::BinaryFlag::OFF) +_binaryFlag(FTPServer::BinaryFlag::OFF), +_dataTransferPending(FTPServer::FTPClientDataTransfer::NONE) { } @@ -16,11 +18,12 @@ FTPClient::~FTPClient() { delete _cmdParameters; free(_username); + free(_currentDirectory); } void FTPClient::setDataClient(WiFiClient dataClient) { - _dataClient = _dataClient; + _dataClient = dataClient; } boolean FTPClient::parseCommandAndParameters() diff --git a/src/software_test/tcpServer_test/FTPClient.h b/src/software_test/tcpServer_test/FTPClient.h index 8774915..ffe78b3 100644 --- a/src/software_test/tcpServer_test/FTPClient.h +++ b/src/software_test/tcpServer_test/FTPClient.h @@ -23,10 +23,13 @@ class FTPClient : public TCPClient Dictionary *_cmdParameters; boolean _loggedIn; char *_username; - boolean _dataSocketOpen; + char *_currentDirectory; + boolean _waitingForDataConnection; + FTPServer::FTPClientState _ftpClientState; FTPServer::BinaryFlag _binaryFlag; + FTPServer::FTPClientDataTransfer _dataTransferPending; WiFiClient _dataClient; //data socket }; diff --git a/src/software_test/tcpServer_test/FTPServer.h b/src/software_test/tcpServer_test/FTPServer.h index 340324b..8e75088 100644 --- a/src/software_test/tcpServer_test/FTPServer.h +++ b/src/software_test/tcpServer_test/FTPServer.h @@ -9,6 +9,7 @@ class FTPServer : public TCPServer { public: enum FTPClientState {WAITING_FOR_COMMANDS}; + enum FTPClientDataTransfer {NONE, LIST_DF, NLST_DF}; enum BinaryFlag {OFF = 0, ON}; FTPServer(unsigned int port = 21, const char *login = NULL, const char *password = NULL, uint8_t maxClient = MAX_CLIENT, uint16_t clientCommandDataBufferSize = 255) : TCPServer(port, maxClient, clientCommandDataBufferSize), @@ -30,6 +31,11 @@ class FTPServer : public TCPServer } } + void setCustomDataPort(unsigned int port) + { + _dataPort = port; + } + virtual ~FTPServer() { free(_login);free(_password); @@ -50,7 +56,7 @@ class FTPServer : public TCPServer virtual void processClientData(T *client) { - if(client->_dataSocketOpen) + if(client->_waitingForDataConnection) { #ifdef DEBUG_FTPS Serial.println("Listening for new data client"); @@ -61,7 +67,7 @@ class FTPServer : public TCPServer { if(dataClient.connected()) { - client->_dataSocketOpen = false; + client->_waitingForDataConnection = false; client->setDataClient(dataClient); #ifdef DEBUG_FTPS Serial.println("Data client accepted successfully"); @@ -72,6 +78,30 @@ class FTPServer : public TCPServer } } + if(client->_dataTransferPending == LIST_DF)//We list the files of the current directory + { + //We check if the dataConnection is established: + if(client->_dataClient.connected()) + { + //client->_client.println("125 Data connection already open."); + + client->_dataClient.print("-rw-r--r-- 1 owner group 213 Aug 26 16:31 README.txt\r\n\ + -rw-r--r-- 1 owner group 213 Aug 26 16:31 music.mp3\r\n\ + drw-r--r-- 1 owner group 213 Aug 26 16:31 directory\r\n\ + drw-r--r-- 1 owner group 213 Aug 26 16:31 subdir\r\n\ + "); + + client->_client.println("226 Closing data connection."); + client->_dataClient.stop(); + client->_dataTransferPending = NONE; + } + //With timeout + /*else + { + client->_client.println("425 Can't open data connection."); + }*/ + } + #ifdef DEBUG_FTPS if(client->_newDataAvailable) { @@ -181,9 +211,13 @@ class FTPServer : public TCPServer { _dataServer.begin(_dataPort); client->_client.printf("227 Entering Passive Mode (%u,%u,%u,%u,%d,%d).\r\n", WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], WiFi.localIP()[3], _dataPort/256, _dataPort%256); - client->_dataSocketOpen = true; + client->_waitingForDataConnection = true; + } + else if(strcmp(client->_ftpCommand,"LIST") == 0) + { + //We inform that a data transfer is pending + client->_dataTransferPending = LIST_DF; } - ese if() else client->_client.println("502 Command not implemented."); } diff --git a/src/software_test/tcpServer_test/tcpServer_test.ino b/src/software_test/tcpServer_test/tcpServer_test.ino index 8d6bd8c..008ce39 100644 --- a/src/software_test/tcpServer_test/tcpServer_test.ino +++ b/src/software_test/tcpServer_test/tcpServer_test.ino @@ -15,7 +15,7 @@ uint16_t lastClientCount(0); //TCPServer server(80, MAX_CLIENT, 5); //WEBServer webServer(8080); -FTPServer ftpServer; +FTPServer ftpServer;//(21,"test","test"); WiFiEventHandler gotIpEventHandler, disconnectedEventHandler;