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 <stdio.h>
00120 #include <fat.h>
00121 #include <DSGUI/BVirtualFile.h>
00122
00123
00124 #include "BTCPConnection.h"
00125
00126 class BFTPControlConn;
00127
00129 typedef struct {
00131 std::string name;
00132
00134 std::string pass;
00135
00137 std::string root;
00138
00140 std::string home;
00141
00143 bool writePermission;
00144
00146 bool bootPermission;
00147
00149 bool loggedIn;
00150 } BFTPUser;
00151
00159 class BFTPServer: public BTCPConnection {
00160 public:
00161
00169 BFTPServer();
00170
00172 BFTPServer(short port);
00173 ~BFTPServer();
00174
00176 virtual void handle();
00177
00179 int numActiveConnections() { return connections.size(); }
00180
00186
00187 void addUser(const std::string& name,
00188 const std::string& pass,
00189 const std::string& home = "/",
00190 const std::string& root = "/",
00191 bool writePermission = true,
00192 bool bootPermission = true);
00193
00195 bool anonymousLoginOK();
00196
00198 void setMOTDFile(const std::string& motdFile);
00200 const std::string& getMOTDFile() { return motdFile; }
00201
00210 void setMasqueradeAsHost(const std::string& host);
00212 const std::string& getMasqueradeAsHost() { return masqueradeAsHost; }
00213
00220 void setInactivityTimeout(int timeout);
00222 int getInactivityTimeout() { return inactivityTimeout; }
00223
00225 void setPortRangeStart(int portRangeStart);
00227 int getPortRangeStart() { return portRangeStart; }
00229 void setPortRangeEnd(int portRangeEnd);
00231 int getPortRangeEnd() { return portRangeEnd; }
00232
00234 void setTransferBlockSize(size_t size) { transferBlockSize = size; }
00236 size_t getTransferBlockSize() { return transferBlockSize; }
00237
00247 class Delegate {
00248 public:
00249 virtual ~Delegate() {}
00251 virtual bool controlConnectionWillOpen(BFTPServer *server,
00252 long address) { return true; }
00253 virtual void controlConnectionDidOpen(BFTPServer *server,
00254 BFTPControlConn *conn) {}
00255 };
00256
00257 void setDelegate(Delegate* deleg);
00258 Delegate* delegate() { return deleg; }
00259
00264
00265 void connectionDidClose(BFTPControlConn* conn);
00266
00268 void setScreenSaverTimeout(int to) { ssTimeout = to; }
00270 int screenSaverTimeout() { return ssTimeout; }
00271
00272 protected:
00273 virtual bool handleAccept();
00274
00275 private:
00276 std::string motdFile;
00277 std::deque<BFTPUser> users;
00278 std::string masqueradeAsHost;
00279 int inactivityTimeout;
00280 int portRangeStart, portRangeEnd;
00281 size_t transferBlockSize;
00282 std::deque<BFTPControlConn*> connections;
00283 std::deque<BFTPControlConn*> connectionsToDelete;
00284 Delegate *deleg;
00285
00286 int ssTimeout;
00287
00288 public:
00289 BFTPUser getUserWithName(const std::string& name);
00290 int getNumberOfUsers() { return users.size(); }
00291 };
00292
00299 class BFTPControlConn: public BTCPConnection {
00300 protected:
00301
00308 class BFTPDataConn: public BTCPConnection {
00309 public:
00310 BFTPDataConn(long addr, short port, BFTPControlConn* master);
00311 BFTPDataConn(const char* hostname, short port, BFTPControlConn* master);
00312 BFTPDataConn(short port, BFTPControlConn* master);
00313 ~BFTPDataConn();
00314
00315 virtual bool handleAccept();
00316 virtual bool handleConnection();
00317 virtual void close();
00318 bool jobDone() { return jobdone; }
00319 int finishCode() { return fcode; }
00320 const std::string& finishMessage() { return fdescr; }
00321
00322 virtual void startStoring(BVirtualFile* file);
00323 virtual void startRetrieving(BVirtualFile* file);
00324 virtual void startSendingData(const std::string& data);
00325
00326 virtual bool handleStore();
00327 virtual bool handleRetrieve();
00328 virtual bool handleSend();
00329
00330 virtual void abort();
00331
00332 typedef enum {
00333 DCMODE_IDLE,
00334 DCMODE_STORING,
00335 DCMODE_RETRIEVING,
00336 DCMODE_SENDINGDATA
00337 } DCMode;
00338
00339 private:
00340 void finish(int code, const std::string& descr);
00341
00342 BFTPControlConn* master;
00343
00344 std::string data;
00345 BVirtualFile* file;
00346 DCMode mode;
00347
00348 char buf[8192];
00349 unsigned int buflen, bufindex, total;
00350 bool finished, remoteclosed, jobdone;
00351 int fcode; std::string fdescr;
00352 };
00353
00354 public:
00355 BFTPControlConn(BFTPServer* master, int conn,
00356 const struct sockaddr_in& lastaddr);
00357 virtual ~BFTPControlConn();
00358
00359 std::string userInfo();
00360 const BFTPUser& currentUser();
00361
00362 virtual void close();
00363 virtual void handle();
00364
00365 int createDataConnection();
00366 void destroyDataConnection();
00367 void updateActivityTime();
00368
00374 class Delegate {
00375 public:
00376 virtual ~Delegate() {}
00377 virtual void controlConnectionWillClose(BFTPControlConn *conn) {}
00378 virtual void controlConnectionDidClose(BFTPControlConn *conn) {}
00379
00381 virtual void activityOnControlConnection(BFTPControlConn *conn) {}
00382
00383 virtual bool handleUnknownCommand(BFTPControlConn *cconn,
00384 std::string& cmd, std::string& arg)
00385 {
00386 return false;
00387 }
00388
00389 };
00390
00391 void setDelegate(Delegate* deleg) { this->deleg = deleg; }
00392 Delegate* delegate() { return deleg; }
00393
00398 bool sendReply(int code, const char* format, ...);
00399 bool sendReply(int code, const std::string& reply);
00400
00402 std::string makeAbsoluteFilename(const std::string& fname);
00403
00404 BFTPServer* getMaster() { return master; }
00405
00406 protected:
00407 virtual bool handleInput(const unsigned char* buf, int buflen);
00408
00409 bool setLoginName(const std::string& name);
00410 bool setLoginPassword(const std::string& pass);
00411 bool setCurrentUserByName(const std::string& name);
00412
00413 bool changeWorkingDir(const std::string& newwd);
00414 bool listDir(BFTPDataConn* dc, const std::string& args,
00415 bool namesOnly = false);
00416 bool storeFile(BFTPDataConn* dc, const std::string& args);
00417 bool retrieveFile(BFTPDataConn* dc, const std::string& args);
00418
00419 void closeIfInactive();
00420
00421 BFTPDataConn* dc;
00422 BFTPServer* master;
00423 Delegate *deleg;
00424
00425 void dcHandleAccept(BFTPDataConn* dc);
00426 void dcReportFinish(BFTPDataConn* dc,
00427 BFTPDataConn::DCMode mode,
00428 bool remoteclosed);
00429
00430 std::string cwd, fullcwd;
00431 std::string lastcmd, lastarg;
00432 std::string renameFrom;
00433
00434 char buf[4096];
00435
00436 typedef enum {
00437 TYPE_ASCII,
00438 TYPE_IMAGE
00439 } TransferType;
00440 TransferType ttype;
00441
00442 BFTPUser user;
00443
00444 time_t lastActivityTime;
00445 };
00446
00447
00448 #endif