ftp.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:15k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * ftp.h
  3.  *
  4.  * File Transfer Protocol Server/Client channel classes
  5.  *  As per RFC 959 and RFC 1123
  6.  *
  7.  * Portable Windows Library
  8.  *
  9.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  10.  *
  11.  * The contents of this file are subject to the Mozilla Public License
  12.  * Version 1.0 (the "License"); you may not use this file except in
  13.  * compliance with the License. You may obtain a copy of the License at
  14.  * http://www.mozilla.org/MPL/
  15.  *
  16.  * Software distributed under the License is distributed on an "AS IS"
  17.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  18.  * the License for the specific language governing rights and limitations
  19.  * under the License.
  20.  *
  21.  * The Original Code is Portable Windows Library.
  22.  *
  23.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  24.  *
  25.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  26.  * All Rights Reserved.
  27.  *
  28.  * Contributor(s): ______________________________________.
  29.  *
  30.  * $Log: ftp.h,v $
  31.  * Revision 1.12  2000/06/21 01:01:21  robertj
  32.  * AIX port, thanks Wolfgang Platzer (wolfgang.platzer@infonova.at).
  33.  *
  34.  * Revision 1.11  1999/03/09 08:01:46  robertj
  35.  * Changed comments for doc++ support (more to come).
  36.  *
  37.  * Revision 1.10  1999/02/16 08:07:10  robertj
  38.  * MSVC 6.0 compatibility changes.
  39.  *
  40.  * Revision 1.9  1998/11/30 02:50:45  robertj
  41.  * New directory structure
  42.  *
  43.  * Revision 1.8  1998/09/23 06:19:26  robertj
  44.  * Added open source copyright license.
  45.  *
  46.  * Revision 1.7  1996/10/26 01:39:41  robertj
  47.  * Added check for security breach using 3 way FTP transfer or use of privileged PORT.
  48.  *
  49.  * Revision 1.6  1996/09/14 13:09:08  robertj
  50.  * Major upgrade:
  51.  *   rearranged sockets to help support IPX.
  52.  *   added indirect channel class and moved all protocols to descend from it,
  53.  *   separating the protocol from the low level byte transport.
  54.  *
  55.  * Revision 1.5  1996/05/23 09:56:24  robertj
  56.  * Changed FTP so can do passive/active mode on all data transfers.
  57.  *
  58.  * Revision 1.4  1996/03/31 08:45:57  robertj
  59.  * Added QUIT command sent on FTP socket close.
  60.  *
  61.  * Revision 1.3  1996/03/26 00:50:28  robertj
  62.  * FTP Client Implementation.
  63.  *
  64.  * Revision 1.2  1996/03/18 13:33:10  robertj
  65.  * Fixed incompatibilities to GNU compiler where PINDEX != int.
  66.  *
  67.  * Revision 1.1  1996/03/04 12:14:18  robertj
  68.  * Initial revision
  69.  *
  70.  */
  71. #ifndef _PFTPSOCKET
  72. #define _PFTPSOCKET
  73. #ifdef __GNUC__
  74. #pragma interface
  75. #endif
  76. #include <ptclib/inetprot.h>
  77. #include <ptlib/sockets.h>
  78. /**
  79. File Transfer Protocol base class.
  80. */
  81. class PFTP : public PInternetProtocol
  82. {
  83.   PCLASSINFO(PFTP, PInternetProtocol);
  84.   public:
  85.     /// FTP commands
  86.     enum Commands { 
  87.       USER, PASS, ACCT, CWD, CDUP, SMNT, QUIT, REIN, PORT, PASV, TYPE,
  88.       STRU, MODE, RETR, STOR, STOU, APPE, ALLO, REST, RNFR, RNTO, ABOR,
  89.       DELE, RMD, MKD, PWD, LIST, NLST, SITE, SYST, STATcmd, HELP, NOOP,
  90.       NumCommands
  91.     };
  92.     /// Types for file transfer
  93.     enum RepresentationType {
  94.       ASCII,
  95.       EBCDIC,
  96.       Image
  97.     };
  98.     /// File transfer mode on data channel
  99.     enum DataChannelType {
  100.       NormalPort,
  101.       Passive
  102.     };
  103.     /// Listing types
  104.     enum NameTypes {
  105.       ShortNames,
  106.       DetailedNames
  107.     };
  108.     /** Send the PORT command for a transfer.
  109.      @return Boolean indicated PORT command was successful
  110.     */
  111.     BOOL SendPORT(
  112.       const PIPSocket::Address & addr,
  113.       /** Address for PORT connection.
  114.             IP address to connect back to */
  115.       WORD port /// Port number for PORT connection.
  116.     );
  117.   protected:
  118.     /// Construct an ineternal File Transfer Protocol channel.
  119.     PFTP();
  120. };
  121. /**
  122. File Transfer Protocol client channel class.
  123. */
  124. class PFTPClient : public PFTP
  125. {
  126.   PCLASSINFO(PFTPClient, PFTP);
  127.   public:
  128.     /// Declare an FTP client socket.
  129.     PFTPClient();
  130.     /// Delete and close the socket.
  131.     ~PFTPClient();
  132.   /**@name Overrides from class PSocket. */
  133.   //@{
  134.     /** Close the socket, and if connected as a client, QUITs from server.
  135.        @return
  136.        TRUE if the channel was closed and the QUIT accepted by the server.
  137.      */
  138.     virtual BOOL Close();
  139.   //@}
  140.   /**@name New functions for class */
  141.   //@{
  142.     /** Log in to the remote host for FTP.
  143.        @return
  144.        TRUE if the log in was successfull.
  145.      */
  146.     BOOL LogIn(
  147.       const PString & username,   /// User name for FTP log in.
  148.       const PString & password    /// Password for the specified user name.
  149.     );
  150.     /** Get the type of the remote FTP server system, eg Unix, WindowsNT etc.
  151.        @return
  152.        String for the type of system.
  153.      */
  154.     PString GetSystemType();
  155.     /** Set the transfer type.
  156.        @return
  157.        TRUE if transfer type set.
  158.      */
  159.     BOOL SetType(
  160.       RepresentationType type   /// RepresentationTypeof file to transfer
  161.     );
  162.     /** Change the current directory on the remote FTP host.
  163.        @return
  164.        TRUE if the log in was successfull.
  165.      */
  166.     BOOL ChangeDirectory(
  167.       const PString & dirPath     /// New directory
  168.     );
  169.     /** Get the current working directory on the remote FTP host.
  170.        @return
  171.        String for the directory path, or empty string if an error occurred.
  172.      */
  173.     PString GetCurrentDirectory();
  174.     /** Get a list of files from the current working directory on the remote
  175.        FTP host.
  176.        @return
  177.        String array for the files in the directory.
  178.      */
  179.     PStringArray GetDirectoryNames(
  180.       NameTypes type = ShortNames,        /// Detail level on a directory entry.
  181.       DataChannelType channel = Passive   /// Data channel type.
  182.     );
  183.     /** Get a list of files from the current working directory on the remote
  184.        FTP host.
  185.        @return
  186.        String array for the files in the directory.
  187.      */
  188.     PStringArray GetDirectoryNames(
  189.       const PString & path,               /// Name to get details for.
  190.       NameTypes type = ShortNames,        /// Detail level on a directory entry.
  191.       DataChannelType channel = Passive   /// Data channel type.
  192.     );
  193.     /** Get status information for the file path specified.
  194.        @return
  195.        String giving file status.
  196.      */
  197.     PString GetFileStatus(
  198.       const PString & path,                /// Path to get status for.
  199.       DataChannelType channel = Passive    /// Data channel type.
  200.     );
  201.     /**Begin retreiving a file from the remote FTP server. The second
  202.        parameter indicates that the transfer is on a normal or passive data
  203.        channel. In short, a normal transfer the server connects to the
  204.        client and in passive mode the client connects to the server.
  205.        @return
  206.        Socket to read data from, or NULL if an error occurred.
  207.      */
  208.     PTCPSocket * GetFile(
  209.       const PString & filename,            /// Name of file to get
  210.       DataChannelType channel = NormalPort /// Data channel type.
  211.     );
  212.     /**Begin storing a file to the remote FTP server. The second parameter
  213.        indicates that the transfer is on a normal or passive data channel.
  214.        In short, a normal transfer the server connects to the client and in
  215.        passive mode the client connects to the server.
  216.        @return
  217.        Socket to write data to, or NULL if an error occurred.
  218.      */
  219.     PTCPSocket * PutFile(
  220.       const PString & filename,   /// Name of file to get
  221.       DataChannelType channel = NormalPort /// Data channel type.
  222.     );
  223.   //@}
  224.   protected:
  225.     /// Call back to verify open succeeded in an PInternetProtocol class
  226.     virtual BOOL OnOpen();
  227.     PTCPSocket * NormalClientTransfer(
  228.       Commands cmd,
  229.       const PString & args
  230.     );
  231.     PTCPSocket * PassiveClientTransfer(
  232.       Commands cmd,
  233.       const PString & args
  234.     );
  235.     /// Port number on remote system
  236.     WORD remotePort;
  237. };
  238. /**
  239. File Transfer Protocol server channel class.
  240. */
  241. class PFTPServer : public PFTP
  242. {
  243.   PCLASSINFO(PFTPServer, PFTP);
  244.   public:
  245.     enum { MaxIllegalPasswords = 3 };
  246.     /// declare a server socket
  247.     PFTPServer();
  248.     PFTPServer(
  249.       const PString & readyString   /// Sign on string on connection ready.
  250.     );
  251.     /// Delete the server, cleaning up passive sockets.
  252.     ~PFTPServer();
  253.   // New functions for class
  254.     /**
  255.     Get the string printed when a user logs in default value is a string
  256.     giving the user name
  257.     */
  258.     virtual PString GetHelloString(const PString & user) const;
  259.     /// return the string printed just before exiting
  260.     virtual PString GetGoodbyeString(const PString & user) const;
  261.     /// return the string to be returned by the SYST command
  262.     virtual PString GetSystemTypeString() const;
  263.     /// return the thirdPartyPort flag, allowing 3 host put and get.
  264.     BOOL GetAllowThirdPartyPort() const { return thirdPartyPort; }
  265.     /// Set the thirdPartyPort flag.
  266.     void SetAllowThirdPartyPort(BOOL state) { thirdPartyPort = state; }
  267.     /** Process commands, dispatching to the appropriate virtual function. This
  268.        is used when the socket is acting as a server.
  269.        @return
  270.        TRUE if more processing may be done, FALSE if the QUIT command was
  271.        received or the #OnUnknown()# function returns FALSE.
  272.      */
  273.     BOOL ProcessCommand();
  274.     /** Dispatching to the appropriate virtual function. This is used when the
  275.        socket is acting as a server.
  276.        @return
  277.        TRUE if more processing may be done, FALSE if the QUIT command was
  278.        received or the #OnUnknown()# function returns FALSE.
  279.      */
  280.     virtual BOOL DispatchCommand(
  281.       PINDEX code,          /// Parsed command code.
  282.       const PString & args  /// Arguments to command.
  283.     );
  284.     /** Check to see if the command requires the server to be logged in before
  285.        it may be processed.
  286.        @return
  287.        TRUE if the command required the user to be logged in.
  288.      */
  289.     virtual BOOL CheckLoginRequired(
  290.       PINDEX cmd    /// Command to check if log in required.
  291.     );
  292.     /** Validate the user name and password for access. After three invalid
  293.        attempts, the socket will close and FALSE is returned.
  294.        Default implementation returns TRUE for all strings.
  295.        @return
  296.        TRUE if user can access, otherwise FALSE
  297.      */
  298.     virtual BOOL AuthoriseUser(
  299.       const PString & user,     /// User name to authorise.
  300.       const PString & password, /// Password supplied for the user.
  301.       BOOL & replied            /// Indication that a reply was sent to client.
  302.     );
  303.     /** Handle an unknown command.
  304.        @return
  305.        TRUE if more processing may be done, FALSE if the
  306.        #ProcessCommand()# function is to return FALSE.
  307.      */
  308.     virtual BOOL OnUnknown(
  309.       const PCaselessString & command  /// Complete command line received.
  310.     );
  311.     /** Handle an error in command.
  312.        @return
  313.        TRUE if more processing may be done, FALSE if the
  314.        #ProcessCommand()# function is to return FALSE.
  315.      */
  316.     virtual void OnError(
  317.       PINDEX errorCode, /// Error code to use
  318.       PINDEX cmdNum,    /// Command that had the error.
  319.       const char * msg  /// Error message.
  320.     );
  321.     /// Called for syntax errors in commands.
  322.     virtual void OnSyntaxError(
  323.       PINDEX cmdNum   /// Command that had the syntax error.
  324.     );
  325.     /// Called for unimplemented commands.
  326.     virtual void OnNotImplemented(
  327.       PINDEX cmdNum   /// Command that was not implemented.
  328.     );
  329.     /// Called for successful commands.
  330.     virtual void OnCommandSuccessful(
  331.       PINDEX cmdNum   /// Command that had was successful.
  332.     );
  333.     // the following commands must be implemented by all servers
  334.     // and can be performed without logging in
  335.     virtual BOOL OnUSER(const PCaselessString & args);
  336.     virtual BOOL OnPASS(const PCaselessString & args);  // officially optional, but should be done
  337.     virtual BOOL OnQUIT(const PCaselessString & args);
  338.     virtual BOOL OnPORT(const PCaselessString & args);
  339.     virtual BOOL OnSTRU(const PCaselessString & args);
  340.     virtual BOOL OnMODE(const PCaselessString & args);
  341.     virtual BOOL OnTYPE(const PCaselessString & args);
  342.     virtual BOOL OnNOOP(const PCaselessString & args);
  343.     virtual BOOL OnSYST(const PCaselessString & args);
  344.     virtual BOOL OnSTAT(const PCaselessString & args);
  345.     // the following commands must be implemented by all servers
  346.     // and cannot be performed without logging in
  347.     virtual BOOL OnRETR(const PCaselessString & args);
  348.     virtual BOOL OnSTOR(const PCaselessString & args);
  349.     virtual BOOL OnACCT(const PCaselessString & args);
  350.     virtual BOOL OnAPPE(const PCaselessString & args);
  351.     virtual BOOL OnRNFR(const PCaselessString & args);
  352.     virtual BOOL OnRNTO(const PCaselessString & args);
  353.     virtual BOOL OnDELE(const PCaselessString & args);
  354.     virtual BOOL OnCWD(const PCaselessString & args);
  355.     virtual BOOL OnCDUP(const PCaselessString & args);
  356.     virtual BOOL OnRMD(const PCaselessString & args);
  357.     virtual BOOL OnMKD(const PCaselessString & args);
  358.     virtual BOOL OnPWD(const PCaselessString & args);
  359.     virtual BOOL OnLIST(const PCaselessString & args);
  360.     virtual BOOL OnNLST(const PCaselessString & args);
  361.     virtual BOOL OnPASV(const PCaselessString & args);
  362.     // the following commands are optional and can be performed without
  363.     // logging in
  364.     virtual BOOL OnHELP(const PCaselessString & args);
  365.     virtual BOOL OnSITE(const PCaselessString & args);
  366.     virtual BOOL OnABOR(const PCaselessString & args);
  367.     // the following commands are optional and cannot be performed
  368.     // without logging in
  369.     virtual BOOL OnSMNT(const PCaselessString & args);
  370.     virtual BOOL OnREIN(const PCaselessString & args);
  371.     virtual BOOL OnSTOU(const PCaselessString & args);
  372.     virtual BOOL OnALLO(const PCaselessString & args);
  373.     virtual BOOL OnREST(const PCaselessString & args);
  374.     /// Send the specified file to the client.
  375.     void SendToClient(
  376.       const PFilePath & filename    /// File name to send.
  377.     );
  378.   protected:
  379.     /// Call back to verify open succeeded in an PInternetProtocol class
  380.     BOOL OnOpen();
  381.     void Construct();
  382.     PString readyString;
  383.     BOOL    thirdPartyPort;
  384.     enum {
  385.       NotConnected,
  386.       NeedUser,
  387.       NeedPassword,
  388.       Connected,
  389.       ClientConnect
  390.     } state;
  391.     PIPSocket::Address remoteHost;
  392.     WORD remotePort;
  393.     PTCPSocket * passiveSocket;
  394.     char    type;
  395.     char    structure;
  396.     char    mode;
  397.     PString userName;
  398.     int     illegalPasswordCount;
  399. };
  400. #endif
  401. // End of File ///////////////////////////////////////////////////////////////