00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00113 #ifndef BFTPSERVER_H
00114 #define BFTPSERVER_H
00115
00116
00117 #include <deque>
00118 #include <netinet/in.h>
00119 #include "gba_nds_fat/gba_nds_fat.h"
00120
00121
00122 #include "BTCPConnection.h"
00123
00124 #if !defined(FILE_TIME_SUPPORT)
00125 #error DSFTP needs FILE_TIME_SUPPORT commented in (see gba_nds_fat.h)
00126 #endif
00127
00128 class BFTPControlConn;
00129
00131 typedef struct {
00133 std::string name;
00134
00136 std::string pass;
00137
00139 std::string root;
00140
00142 std::string home;
00143
00145 bool writePermission;
00146
00148 bool bootPermission;
00149
00151 bool loggedIn;
00152 } BFTPUser;
00153
00161 class BFTPServer: public BTCPConnection {
00162 public:
00163
00171 BFTPServer();
00172
00174 BFTPServer(short port);
00175 ~BFTPServer();
00176
00178 virtual void handle();
00179
00181 int numActiveConnections() { return connections.size(); }
00182
00188
00189 void addUser(const std::string& name,
00190 const std::string& pass,
00191 const std::string& home = "/",
00192 const std::string& root = "/",
00193 bool writePermission = true,
00194 bool bootPermission = true);
00195
00197 bool anonymousLoginOK();
00198
00200 void setMOTDFile(const std::string& motdFile);
00202 const std::string& getMOTDFile() { return motdFile; }
00203
00212 void setMasqueradeAsHost(const std::string& host);
00214 const std::string& getMasqueradeAsHost() { return masqueradeAsHost; }
00215
00222 void setInactivityTimeout(int timeout);
00224 int getInactivityTimeout() { return inactivityTimeout; }
00225
00227 void setPortRangeStart(int portRangeStart);
00229 int getPortRangeStart() { return portRangeStart; }
00231 void setPortRangeEnd(int portRangeEnd);
00233 int getPortRangeEnd() { return portRangeEnd; }
00234
00244 class Delegate {
00245 public:
00246 virtual ~Delegate() {}
00248 virtual bool controlConnectionWillOpen(BFTPServer *server,
00249 long address) { return true; }
00250 virtual void controlConnectionDidOpen(BFTPServer *server,
00251 BFTPControlConn *conn) {}
00252 };
00253
00254 void setDelegate(Delegate* deleg);
00255 Delegate* delegate() { return deleg; }
00256
00261
00262 void connectionDidClose(BFTPControlConn* conn);
00263
00265 void setScreenSaverTimeout(int to) { ssTimeout = to; }
00267 int screenSaverTimeout() { return ssTimeout; }
00268
00269 protected:
00270 virtual bool handleAccept();
00271
00272 private:
00273 std::string motdFile;
00274 std::deque<BFTPUser> users;
00275 std::string masqueradeAsHost;
00276 int inactivityTimeout;
00277 int portRangeStart, portRangeEnd;
00278 std::deque<BFTPControlConn*> connections;
00279 std::deque<BFTPControlConn*> connectionsToDelete;
00280 Delegate *deleg;
00281
00282 int ssTimeout;
00283
00284 public:
00285 BFTPUser getUserWithName(const std::string& name);
00286 int getNumberOfUsers() { return users.size(); }
00287 };
00288
00295 class BFTPControlConn: public BTCPConnection {
00296 protected:
00297
00304 class BFTPDataConn: public BTCPConnection {
00305 public:
00306 BFTPDataConn(long addr, short port, BFTPControlConn* master);
00307 BFTPDataConn(const char* hostname, short port, BFTPControlConn* master);
00308 BFTPDataConn(short port, BFTPControlConn* master);
00309 virtual bool handleAccept();
00310 virtual bool handleConnection();
00311 virtual void close();
00312 bool jobDone() { return jobdone; }
00313 int finishCode() { return fcode; }
00314 const std::string& finishMessage() { return fdescr; }
00315
00316 virtual void startStoring(FAT_FILE* file);
00317 virtual void startRetrieving(FAT_FILE* file);
00318 virtual void startSendingData(const std::string& data);
00319
00320 virtual bool handleStore();
00321 virtual bool handleRetrieve();
00322 virtual bool handleSend();
00323
00324 virtual void abort();
00325
00326 typedef enum {
00327 DCMODE_IDLE,
00328 DCMODE_STORING,
00329 DCMODE_RETRIEVING,
00330 DCMODE_SENDINGDATA
00331 } DCMode;
00332
00333 private:
00334 void finish(int code, const std::string& descr);
00335
00336 BFTPControlConn* master;
00337
00338 std::string data;
00339 FAT_FILE* file;
00340 DCMode mode;
00341
00342 char buf[8192];
00343 unsigned int buflen, bufindex, total;
00344 bool finished, remoteclosed, jobdone;
00345 int fcode; std::string fdescr;
00346 };
00347
00348 public:
00349 BFTPControlConn(BFTPServer* master, int conn,
00350 const struct sockaddr_in& lastaddr);
00351 virtual ~BFTPControlConn();
00352
00353 std::string userInfo();
00354 const BFTPUser& currentUser();
00355
00356 virtual void close();
00357 virtual void handle();
00358
00359 int createDataConnection();
00360 void destroyDataConnection();
00361 void updateActivityTime();
00362
00368 class Delegate {
00369 public:
00370 virtual ~Delegate() {}
00371 virtual void controlConnectionWillClose(BFTPControlConn *conn) {}
00372 virtual void controlConnectionDidClose(BFTPControlConn *conn) {}
00373
00375 virtual void activityOnControlConnection(BFTPControlConn *conn) {}
00376
00377 virtual bool handleUnknownCommand(BFTPControlConn *cconn,
00378 std::string& cmd, std::string& arg)
00379 {
00380 return false;
00381 }
00382
00383 };
00384
00385 void setDelegate(Delegate* deleg) { this->deleg = deleg; }
00386 Delegate* delegate() { return deleg; }
00387
00392 bool sendReply(int code, const char* format, ...);
00393 bool sendReply(int code, const std::string& reply);
00394
00396 std::string makeAbsoluteFilename(const std::string& fname);
00397
00398 protected:
00399 virtual bool handleInput(const unsigned char* buf, int buflen);
00400
00401 bool setLoginName(const std::string& name);
00402 bool setLoginPassword(const std::string& pass);
00403 bool setCurrentUserByName(const std::string& name);
00404
00405 bool changeWorkingDir(const std::string& newwd);
00406 bool moveFile(const std::string& file1, const std::string& file2);
00407 bool listDir(BFTPDataConn* dc, const std::string& args,
00408 bool namesOnly = false);
00409 bool storeFile(BFTPDataConn* dc, const std::string& args);
00410 bool retrieveFile(BFTPDataConn* dc, const std::string& args);
00411
00412 void closeIfInactive();
00413
00414 BFTPDataConn* dc;
00415 BFTPServer* master;
00416 Delegate *deleg;
00417
00418 void dcHandleAccept(BFTPDataConn* dc);
00419 void dcReportFinish(BFTPDataConn* dc,
00420 BFTPDataConn::DCMode mode,
00421 bool remoteclosed);
00422
00423 std::string cwd, fullcwd;
00424 std::string lastcmd, lastarg;
00425 std::string renameFrom;
00426
00427 char buf[4096];
00428
00429 typedef enum {
00430 TYPE_ASCII,
00431 TYPE_IMAGE
00432 } TransferType;
00433 TransferType ttype;
00434
00435 BFTPUser user;
00436
00437 time_t lastActivityTime;
00438 };
00439
00440
00441 #endif