Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

BFTPServer.h

00001 // BFTPServer.h (this is -*- C++ -*-)
00002 // 
00003 // \author: Bjoern Giesler <bjoern@giesler.de>
00004 // 
00005 // \mainpage
00006 // 
00007 // $Author: giesler $
00008 // $Locker$
00009 // $Revision$
00010 // $Date: 2002-08-19 10:41:28 +0200 (Mon, 19 Aug 2002) $
00011 
00113 #ifndef BFTPSERVER_H
00114 #define BFTPSERVER_H
00115 
00116 /* system includes */
00117 #include <deque>
00118 #include <netinet/in.h>
00119 #include <stdio.h>
00120 #include <fat.h>
00121 #include <DSGUI/BVirtualFile.h>
00122 
00123 /* my includes */
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 /* BFTPSERVER_H */

Generated on Thu Feb 14 08:32:14 2008 for libDSFTP by doxygen1.3-rc3