00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 #ifndef _PFTPSOCKET
00086 #define _PFTPSOCKET
00087
00088 #ifdef P_USE_PRAGMA
00089 #pragma interface
00090 #endif
00091
00092 #include <ptclib/inetprot.h>
00093 #include <ptlib/sockets.h>
00094
00095
00099 class PFTP : public PInternetProtocol
00100 {
00101 PCLASSINFO(PFTP, PInternetProtocol);
00102 public:
00104 enum Commands {
00105 USER, PASS, ACCT, CWD, CDUP, SMNT, QUIT, REIN, PORT, PASV, TYPE,
00106 STRU, MODE, RETR, STOR, STOU, APPE, ALLO, REST, RNFR, RNTO, ABOR,
00107 DELE, RMD, MKD, PWD, LIST, NLST, SITE, SYST, STATcmd, HELP, NOOP,
00108 NumCommands
00109 };
00110
00112 enum RepresentationType {
00113 ASCII,
00114 EBCDIC,
00115 Image
00116 };
00117
00119 enum DataChannelType {
00120 NormalPort,
00121 Passive
00122 };
00123
00125 enum NameTypes {
00126 ShortNames,
00127 DetailedNames
00128 };
00129
00133 BOOL SendPORT(
00134 const PIPSocket::Address & addr,
00137 WORD port
00138 );
00139
00140
00141 protected:
00143 PFTP();
00144 };
00145
00146
00150 class PFTPClient : public PFTP
00151 {
00152 PCLASSINFO(PFTPClient, PFTP);
00153 public:
00155 PFTPClient();
00156
00158 ~PFTPClient();
00159
00160
00168 virtual BOOL Close();
00169
00171
00179 BOOL LogIn(
00180 const PString & username,
00181 const PString & password
00182 );
00183
00189 PString GetSystemType();
00190
00196 BOOL SetType(
00197 RepresentationType type
00198 );
00199
00205 BOOL ChangeDirectory(
00206 const PString & dirPath
00207 );
00208
00214 PString GetCurrentDirectory();
00215
00222 PStringArray GetDirectoryNames(
00223 NameTypes type = ShortNames,
00224 DataChannelType channel = Passive
00225 );
00232 PStringArray GetDirectoryNames(
00233 const PString & path,
00234 NameTypes type = ShortNames,
00235 DataChannelType channel = Passive
00236 );
00237
00243 PString GetFileStatus(
00244 const PString & path,
00245 DataChannelType channel = Passive
00246 );
00247
00256 PTCPSocket * GetFile(
00257 const PString & filename,
00258 DataChannelType channel = NormalPort
00259 );
00260
00269 PTCPSocket * PutFile(
00270 const PString & filename,
00271 DataChannelType channel = NormalPort
00272 );
00273
00275
00276 protected:
00278 virtual BOOL OnOpen();
00279
00280 PTCPSocket * NormalClientTransfer(
00281 Commands cmd,
00282 const PString & args
00283 );
00284 PTCPSocket * PassiveClientTransfer(
00285 Commands cmd,
00286 const PString & args
00287 );
00288
00290 WORD remotePort;
00291 };
00292
00293
00297 class PFTPServer : public PFTP
00298 {
00299 PCLASSINFO(PFTPServer, PFTP);
00300 public:
00301 enum { MaxIllegalPasswords = 3 };
00302
00304 PFTPServer();
00305 PFTPServer(
00306 const PString & readyString
00307 );
00308
00310 ~PFTPServer();
00311
00312
00313
00318 virtual PString GetHelloString(const PString & user) const;
00319
00321 virtual PString GetGoodbyeString(const PString & user) const;
00322
00324 virtual PString GetSystemTypeString() const;
00325
00327 BOOL GetAllowThirdPartyPort() const { return thirdPartyPort; }
00328
00330 void SetAllowThirdPartyPort(BOOL state) { thirdPartyPort = state; }
00331
00339 BOOL ProcessCommand();
00340
00348 virtual BOOL DispatchCommand(
00349 PINDEX code,
00350 const PString & args
00351 );
00352
00353
00360 virtual BOOL CheckLoginRequired(
00361 PINDEX cmd
00362 );
00363
00372 virtual BOOL AuthoriseUser(
00373 const PString & user,
00374 const PString & password,
00375 BOOL & replied
00376 );
00377
00384 virtual BOOL OnUnknown(
00385 const PCaselessString & command
00386 );
00387
00394 virtual void OnError(
00395 PINDEX errorCode,
00396 PINDEX cmdNum,
00397 const char * msg
00398 );
00399
00401 virtual void OnSyntaxError(
00402 PINDEX cmdNum
00403 );
00404
00406 virtual void OnNotImplemented(
00407 PINDEX cmdNum
00408 );
00409
00411 virtual void OnCommandSuccessful(
00412 PINDEX cmdNum
00413 );
00414
00415
00416
00417
00418 virtual BOOL OnUSER(const PCaselessString & args);
00419 virtual BOOL OnPASS(const PCaselessString & args);
00420 virtual BOOL OnQUIT(const PCaselessString & args);
00421 virtual BOOL OnPORT(const PCaselessString & args);
00422 virtual BOOL OnSTRU(const PCaselessString & args);
00423 virtual BOOL OnMODE(const PCaselessString & args);
00424 virtual BOOL OnTYPE(const PCaselessString & args);
00425 virtual BOOL OnNOOP(const PCaselessString & args);
00426 virtual BOOL OnSYST(const PCaselessString & args);
00427 virtual BOOL OnSTAT(const PCaselessString & args);
00428
00429
00430
00431 virtual BOOL OnRETR(const PCaselessString & args);
00432 virtual BOOL OnSTOR(const PCaselessString & args);
00433 virtual BOOL OnACCT(const PCaselessString & args);
00434 virtual BOOL OnAPPE(const PCaselessString & args);
00435 virtual BOOL OnRNFR(const PCaselessString & args);
00436 virtual BOOL OnRNTO(const PCaselessString & args);
00437 virtual BOOL OnDELE(const PCaselessString & args);
00438 virtual BOOL OnCWD(const PCaselessString & args);
00439 virtual BOOL OnCDUP(const PCaselessString & args);
00440 virtual BOOL OnRMD(const PCaselessString & args);
00441 virtual BOOL OnMKD(const PCaselessString & args);
00442 virtual BOOL OnPWD(const PCaselessString & args);
00443 virtual BOOL OnLIST(const PCaselessString & args);
00444 virtual BOOL OnNLST(const PCaselessString & args);
00445 virtual BOOL OnPASV(const PCaselessString & args);
00446
00447
00448
00449 virtual BOOL OnHELP(const PCaselessString & args);
00450 virtual BOOL OnSITE(const PCaselessString & args);
00451 virtual BOOL OnABOR(const PCaselessString & args);
00452
00453
00454
00455 virtual BOOL OnSMNT(const PCaselessString & args);
00456 virtual BOOL OnREIN(const PCaselessString & args);
00457 virtual BOOL OnSTOU(const PCaselessString & args);
00458 virtual BOOL OnALLO(const PCaselessString & args);
00459 virtual BOOL OnREST(const PCaselessString & args);
00460
00461
00463 void SendToClient(
00464 const PFilePath & filename
00465 );
00466
00467
00468 protected:
00470 BOOL OnOpen();
00471 void Construct();
00472
00473 PString readyString;
00474 BOOL thirdPartyPort;
00475
00476 enum {
00477 NotConnected,
00478 NeedUser,
00479 NeedPassword,
00480 Connected,
00481 ClientConnect
00482 } state;
00483
00484 PIPSocket::Address remoteHost;
00485 WORD remotePort;
00486
00487 PTCPSocket * passiveSocket;
00488
00489 char type;
00490 char structure;
00491 char mode;
00492 PString userName;
00493 int illegalPasswordCount;
00494 };
00495
00496
00497 #endif
00498
00499
00500