PTLib
Version 2.10.4
|
00001 /* 00002 * ftp.h 00003 * 00004 * File Transfer Protocol Server/Client channel classes 00005 * As per RFC 959 and RFC 1123 00006 * 00007 * Portable Windows Library 00008 * 00009 * Copyright (c) 1993-2002 Equivalence Pty. Ltd. 00010 * 00011 * The contents of this file are subject to the Mozilla Public License 00012 * Version 1.0 (the "License"); you may not use this file except in 00013 * compliance with the License. You may obtain a copy of the License at 00014 * http://www.mozilla.org/MPL/ 00015 * 00016 * Software distributed under the License is distributed on an "AS IS" 00017 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 00018 * the License for the specific language governing rights and limitations 00019 * under the License. 00020 * 00021 * The Original Code is Portable Windows Library. 00022 * 00023 * The Initial Developer of the Original Code is Equivalence Pty. Ltd. 00024 * 00025 * Contributor(s): ______________________________________. 00026 * 00027 * $Revision: 25012 $ 00028 * $Author: rjongbloed $ 00029 * $Date: 2011-01-06 01:01:23 -0600 (Thu, 06 Jan 2011) $ 00030 */ 00031 00032 #ifndef PTLIB_FTP_H 00033 #define PTLIB_FTP_H 00034 00035 #ifdef P_USE_PRAGMA 00036 #pragma interface 00037 #endif 00038 00039 #include <ptclib/inetprot.h> 00040 #include <ptlib/sockets.h> 00041 00042 00043 class PURL; 00044 00045 00049 class PFTP : public PInternetProtocol 00050 { 00051 PCLASSINFO(PFTP, PInternetProtocol); 00052 public: 00054 enum Commands { 00055 USER, PASS, ACCT, CWD, CDUP, SMNT, QUIT, REIN, PORT, PASV, TYPE, 00056 STRU, MODE, RETR, STOR, STOU, APPE, ALLO, REST, RNFR, RNTO, ABOR, 00057 DELE, RMD, MKD, PWD, LIST, NLST, SITE, SYST, STATcmd, HELP, NOOP, 00058 NumCommands 00059 }; 00060 00062 enum RepresentationType { 00063 ASCII, 00064 EBCDIC, 00065 Image 00066 }; 00067 00069 enum DataChannelType { 00070 NormalPort, 00071 Passive 00072 }; 00073 00075 enum NameTypes { 00076 ShortNames, 00077 DetailedNames 00078 }; 00079 00080 enum { 00081 DefaultPort = 21 00082 }; 00083 00087 PBoolean SendPORT( 00088 const PIPSocket::Address & addr, 00089 WORD port 00090 ); 00091 00092 00093 protected: 00095 PFTP(); 00096 }; 00097 00098 00102 class PFTPClient : public PFTP 00103 { 00104 PCLASSINFO(PFTPClient, PFTP); 00105 public: 00107 PFTPClient(); 00108 00110 ~PFTPClient(); 00111 00112 00120 virtual PBoolean Close(); 00121 00123 00128 bool OpenHost( 00129 const PString & host, 00130 WORD port = DefaultPort 00131 ); 00132 00138 PBoolean LogIn( 00139 const PString & username, 00140 const PString & password 00141 ); 00142 00148 PString GetSystemType(); 00149 00155 PBoolean SetType( 00156 RepresentationType type 00157 ); 00158 00164 PBoolean ChangeDirectory( 00165 const PString & dirPath 00166 ); 00167 00173 PString GetCurrentDirectory(); 00174 00181 PStringArray GetDirectoryNames( 00182 NameTypes type = ShortNames, 00183 DataChannelType channel = Passive 00184 ); 00191 PStringArray GetDirectoryNames( 00192 const PString & path, 00193 NameTypes type = ShortNames, 00194 DataChannelType channel = Passive 00195 ); 00196 00202 PBoolean CreateDirectory( 00203 const PString & path 00204 ); 00205 00211 PString GetFileStatus( 00212 const PString & path, 00213 DataChannelType channel = Passive 00214 ); 00215 00224 PTCPSocket * GetFile( 00225 const PString & filename, 00226 DataChannelType channel = Passive 00227 ); 00228 00237 PTCPSocket * PutFile( 00238 const PString & filename, 00239 DataChannelType channel = Passive 00240 ); 00241 00250 PTCPSocket * GetURL( 00251 const PURL & url, 00252 RepresentationType type, 00253 DataChannelType channel = Passive 00254 ); 00255 00257 00258 protected: 00260 virtual PBoolean OnOpen(); 00261 00262 PTCPSocket * NormalClientTransfer( 00263 Commands cmd, 00264 const PString & args 00265 ); 00266 PTCPSocket * PassiveClientTransfer( 00267 Commands cmd, 00268 const PString & args 00269 ); 00270 00272 WORD remotePort; 00273 }; 00274 00275 00279 class PFTPServer : public PFTP 00280 { 00281 PCLASSINFO(PFTPServer, PFTP); 00282 public: 00283 enum { MaxIllegalPasswords = 3 }; 00284 00286 PFTPServer(); 00287 PFTPServer( 00288 const PString & readyString 00289 ); 00290 00292 ~PFTPServer(); 00293 00294 00295 // New functions for class 00300 virtual PString GetHelloString(const PString & user) const; 00301 00303 virtual PString GetGoodbyeString(const PString & user) const; 00304 00306 virtual PString GetSystemTypeString() const; 00307 00309 PBoolean GetAllowThirdPartyPort() const { return thirdPartyPort; } 00310 00312 void SetAllowThirdPartyPort(PBoolean state) { thirdPartyPort = state; } 00313 00321 PBoolean ProcessCommand(); 00322 00330 virtual PBoolean DispatchCommand( 00331 PINDEX code, 00332 const PString & args 00333 ); 00334 00335 00342 virtual PBoolean CheckLoginRequired( 00343 PINDEX cmd 00344 ); 00345 00354 virtual PBoolean AuthoriseUser( 00355 const PString & user, 00356 const PString & password, 00357 PBoolean & replied 00358 ); 00359 00366 virtual PBoolean OnUnknown( 00367 const PCaselessString & command 00368 ); 00369 00376 virtual void OnError( 00377 PINDEX errorCode, 00378 PINDEX cmdNum, 00379 const char * msg 00380 ); 00381 00383 virtual void OnSyntaxError( 00384 PINDEX cmdNum 00385 ); 00386 00388 virtual void OnNotImplemented( 00389 PINDEX cmdNum 00390 ); 00391 00393 virtual void OnCommandSuccessful( 00394 PINDEX cmdNum 00395 ); 00396 00397 00398 // the following commands must be implemented by all servers 00399 // and can be performed without logging in 00400 virtual PBoolean OnUSER(const PCaselessString & args); 00401 virtual PBoolean OnPASS(const PCaselessString & args); // officially optional, but should be done 00402 virtual PBoolean OnQUIT(const PCaselessString & args); 00403 virtual PBoolean OnPORT(const PCaselessString & args); 00404 virtual PBoolean OnSTRU(const PCaselessString & args); 00405 virtual PBoolean OnMODE(const PCaselessString & args); 00406 virtual PBoolean OnTYPE(const PCaselessString & args); 00407 virtual PBoolean OnNOOP(const PCaselessString & args); 00408 virtual PBoolean OnSYST(const PCaselessString & args); 00409 virtual PBoolean OnSTAT(const PCaselessString & args); 00410 00411 // the following commands must be implemented by all servers 00412 // and cannot be performed without logging in 00413 virtual PBoolean OnRETR(const PCaselessString & args); 00414 virtual PBoolean OnSTOR(const PCaselessString & args); 00415 virtual PBoolean OnACCT(const PCaselessString & args); 00416 virtual PBoolean OnAPPE(const PCaselessString & args); 00417 virtual PBoolean OnRNFR(const PCaselessString & args); 00418 virtual PBoolean OnRNTO(const PCaselessString & args); 00419 virtual PBoolean OnDELE(const PCaselessString & args); 00420 virtual PBoolean OnCWD(const PCaselessString & args); 00421 virtual PBoolean OnCDUP(const PCaselessString & args); 00422 virtual PBoolean OnRMD(const PCaselessString & args); 00423 virtual PBoolean OnMKD(const PCaselessString & args); 00424 virtual PBoolean OnPWD(const PCaselessString & args); 00425 virtual PBoolean OnLIST(const PCaselessString & args); 00426 virtual PBoolean OnNLST(const PCaselessString & args); 00427 virtual PBoolean OnPASV(const PCaselessString & args); 00428 00429 // the following commands are optional and can be performed without 00430 // logging in 00431 virtual PBoolean OnHELP(const PCaselessString & args); 00432 virtual PBoolean OnSITE(const PCaselessString & args); 00433 virtual PBoolean OnABOR(const PCaselessString & args); 00434 00435 // the following commands are optional and cannot be performed 00436 // without logging in 00437 virtual PBoolean OnSMNT(const PCaselessString & args); 00438 virtual PBoolean OnREIN(const PCaselessString & args); 00439 virtual PBoolean OnSTOU(const PCaselessString & args); 00440 virtual PBoolean OnALLO(const PCaselessString & args); 00441 virtual PBoolean OnREST(const PCaselessString & args); 00442 00443 00445 void SendToClient( 00446 const PFilePath & filename 00447 ); 00448 00449 00450 protected: 00452 PBoolean OnOpen(); 00453 void Construct(); 00454 00455 PString readyString; 00456 PBoolean thirdPartyPort; 00457 00458 enum { 00459 NotConnected, 00460 NeedUser, 00461 NeedPassword, 00462 Connected, 00463 ClientConnect 00464 } state; 00465 00466 PIPSocket::Address remoteHost; 00467 WORD remotePort; 00468 00469 PTCPSocket * passiveSocket; 00470 00471 char type; 00472 char structure; 00473 char mode; 00474 PString userName; 00475 int illegalPasswordCount; 00476 }; 00477 00478 00479 PFACTORY_LOAD(PURL_FtpLoader); 00480 00481 00482 #endif // PTLIB_FTP_H 00483 00484 00485 // End of File ///////////////////////////////////////////////////////////////