/* * FTP SERVER FOR ESP8266/ESP32 * based on FTP Serveur for Arduino Due and Ethernet shield (W5100) or WIZ820io (W5200) * based on Jean-Michel Gallego's work * modified to work with esp8266 SPIFFS by David Paiva (david@nailbuster.com) * modified to work with esp8266 LitteFS by Daniel Plasa dplasa@gmail.com * Also done some code reworks and all string contants are now in flash memory * by using F(), PSTR() ... on the string literals. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ESP_FTP_SERVER_H #define ESP_FTP_SERVER_H #include #include /******************************************************************************* ** ** ** DEFINITIONS FOR FTP SERVER ** ** ** *******************************************************************************/ // // DEBUG via Serial Console // Please select in your Arduino IDE menu Tools->Debug Port to enable debugging. // (This will provide DEBUG_ESP_PORT at compile time.) // // Use ESP8266 Core Debug functionality #ifdef DEBUG_ESP_PORT #define FTP_DEBUG_MSG(fmt, ...) \ do \ { \ DEBUG_ESP_PORT.printf_P(PSTR("[FTP] " fmt "\n"), ##__VA_ARGS__); \ yield(); \ } while (0) #else #define FTP_DEBUG_MSG(...) #endif #define FTP_SERVER_VERSION "0.9.3-20200526" #define FTP_CTRL_PORT 21 // Command port on wich server is listening #define FTP_DATA_PORT_PASV 50009 // Data port in passive mode #define FTP_TIME_OUT 5 // Disconnect client after 5 minutes of inactivity #define FTP_CMD_SIZE 127 // allow max. 127 chars in a received command class FtpServer { public: // contruct an instance of the FTP server using a // given FS object, e.g. SPIFFS or LittleFS FtpServer(FS &_FSImplementation); // starts the FTP server with username and password, // either one can be empty to enable anonymous ftp void begin(const String &uname, const String &pword); // stops the FTP server void stop(); // set the FTP server's timeout in seconds void setTimeout(uint16_t timeout = FTP_TIME_OUT * 60); // needs to be called frequently (e.g. in loop() ) // to process ftp requests void handleFTP(); private: FS &THEFS; enum internalState { cInit = 0, cWait, cCheck, cUserId, cPassword, cLoginOk, cProcess, tIdle, tRetrieve, tStore }; void iniVariables(); void disconnectClient(bool gracious = true); int8_t processCommand(); int8_t dataConnect(); bool doRetrieve(); bool doStore(); void closeTransfer(); void abortTransfer(); uint16_t allocateBuffer(uint16_t desiredBytes); void freeBuffer(); String getPathName(const String ¶m, bool includeLast = false); String getFileName(const String ¶m, bool fullFilePath = false); String makeDateTimeStr(time_t fileTime); int8_t readChar(); void updateTimeout(uint16_t timeout); WiFiClient control; WiFiClient data; File file; bool dataPassiveConn = true; // PASV (passive) mode is our default IPAddress dataIP; // IP address for PORT (active) mode uint16_t dataPort = // holds our PASV port number or the port number provided by PORT FTP_DATA_PORT_PASV; uint32_t command; // numeric command code of command sent by the client String cmdLine; // command line as read from client String cmdString; // command as textual representation String parameters; // parameters sent by client String cwd; // the current directory String rnFrom; // previous command was RNFR, this is the source file name internalState cmdState, // state of ftp control connection transferState; // state of ftp data connection uint16_t sTimeOut = // disconnect after 5 min of inactivity FTP_TIME_OUT * 60; uint32_t millisEndConnection, // millisBeginTrans, // store time of beginning of a transaction bytesTransfered; // uint8_t *fileBuffer = NULL; // pointer to buffer for file transfer (by allocateBuffer) uint16_t fileBufferSize; // size of buffer String _FTP_USER; // usename String _FTP_PASS; // password }; #endif // ESP_FTP_SERVER_H