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
#ifndef _PFTPSOCKET
00083
#define _PFTPSOCKET
00084
00085
#ifdef P_USE_PRAGMA
00086
#pragma interface
00087
#endif
00088
00089
#include <ptclib/inetprot.h>
00090
#include "ptlib/sockets.h"
00091
00092
00096 class PFTP :
public PInternetProtocol
00097 {
00098
PCLASSINFO(
PFTP,
PInternetProtocol);
00099
public:
00101 enum Commands {
00102
USER,
PASS,
ACCT,
CWD,
CDUP,
SMNT,
QUIT,
REIN,
PORT,
PASV,
TYPE,
00103
STRU,
MODE,
RETR,
STOR,
STOU,
APPE,
ALLO,
REST,
RNFR,
RNTO,
ABOR,
00104
DELE,
RMD,
MKD,
PWD,
LIST,
NLST,
SITE,
SYST,
STATcmd,
HELP,
NOOP,
00105
NumCommands
00106 };
00107
00109 enum RepresentationType {
00110
ASCII,
00111
EBCDIC,
00112
Image
00113 };
00114
00116 enum DataChannelType {
00117
NormalPort,
00118
Passive
00119 };
00120
00122 enum NameTypes {
00123
ShortNames,
00124
DetailedNames
00125 };
00126
00130 BOOL SendPORT(
00131
const PIPSocket::Address & addr,
00134 WORD port
00135 );
00136
00137
00138
protected:
00140
PFTP();
00141 };
00142
00143
00147 class PFTPClient :
public PFTP
00148 {
00149
PCLASSINFO(
PFTPClient,
PFTP);
00150
public:
00152
PFTPClient();
00153
00155
~PFTPClient();
00156
00157
00165
virtual BOOL
Close();
00166
00168
00176 BOOL
LogIn(
00177
const PString & username,
00178
const PString & password
00179 );
00180
00186
PString GetSystemType();
00187
00193 BOOL
SetType(
00194 RepresentationType type
00195 );
00196
00202 BOOL
ChangeDirectory(
00203
const PString & dirPath
00204 );
00205
00211
PString GetCurrentDirectory();
00212
00219
PStringArray GetDirectoryNames(
00220 NameTypes type = ShortNames,
00221 DataChannelType channel = Passive
00222 );
00229
PStringArray GetDirectoryNames(
00230
const PString & path,
00231 NameTypes type = ShortNames,
00232 DataChannelType channel = Passive
00233 );
00234
00240
PString GetFileStatus(
00241
const PString & path,
00242 DataChannelType channel = Passive
00243 );
00244
00253
PTCPSocket *
GetFile(
00254
const PString & filename,
00255 DataChannelType channel = NormalPort
00256 );
00257
00266
PTCPSocket *
PutFile(
00267
const PString & filename,
00268 DataChannelType channel = NormalPort
00269 );
00270
00272
00273
protected:
00275
virtual BOOL
OnOpen();
00276
00277
PTCPSocket *
NormalClientTransfer(
00278 Commands cmd,
00279
const PString & args
00280 );
00281
PTCPSocket *
PassiveClientTransfer(
00282 Commands cmd,
00283
const PString & args
00284 );
00285
00287 WORD
remotePort;
00288 };
00289
00290
00294 class PFTPServer :
public PFTP
00295 {
00296
PCLASSINFO(
PFTPServer,
PFTP);
00297
public:
00298
enum {
MaxIllegalPasswords = 3 };
00299
00301
PFTPServer();
00302
PFTPServer(
00303
const PString &
readyString
00304 );
00305
00307
~PFTPServer();
00308
00309
00310
00315
virtual PString GetHelloString(
const PString & user)
const;
00316
00318
virtual PString GetGoodbyeString(
const PString & user)
const;
00319
00321
virtual PString GetSystemTypeString()
const;
00322
00324 BOOL
GetAllowThirdPartyPort()
const {
return thirdPartyPort; }
00325
00327 void SetAllowThirdPartyPort(BOOL state) {
thirdPartyPort = state; }
00328
00336 BOOL
ProcessCommand();
00337
00345
virtual BOOL DispatchCommand(
00346 PINDEX code,
00347
const PString & args
00348 );
00349
00350
00357
virtual BOOL CheckLoginRequired(
00358 PINDEX cmd
00359 );
00360
00369
virtual BOOL AuthoriseUser(
00370
const PString & user,
00371
const PString & password,
00372 BOOL & replied
00373 );
00374
00381
virtual BOOL OnUnknown(
00382
const PCaselessString & command
00383 );
00384
00391
virtual void OnError(
00392 PINDEX errorCode,
00393 PINDEX cmdNum,
00394
const char * msg
00395 );
00396
00398
virtual void OnSyntaxError(
00399 PINDEX cmdNum
00400 );
00401
00403
virtual void OnNotImplemented(
00404 PINDEX cmdNum
00405 );
00406
00408
virtual void OnCommandSuccessful(
00409 PINDEX cmdNum
00410 );
00411
00412
00413
00414
00415
virtual BOOL OnUSER(
const PCaselessString & args);
00416
virtual BOOL OnPASS(
const PCaselessString & args);
00417
virtual BOOL OnQUIT(
const PCaselessString & args);
00418
virtual BOOL OnPORT(
const PCaselessString & args);
00419
virtual BOOL OnSTRU(
const PCaselessString & args);
00420
virtual BOOL OnMODE(
const PCaselessString & args);
00421
virtual BOOL OnTYPE(
const PCaselessString & args);
00422
virtual BOOL OnNOOP(
const PCaselessString & args);
00423
virtual BOOL OnSYST(
const PCaselessString & args);
00424
virtual BOOL OnSTAT(
const PCaselessString & args);
00425
00426
00427
00428
virtual BOOL OnRETR(
const PCaselessString & args);
00429
virtual BOOL OnSTOR(
const PCaselessString & args);
00430
virtual BOOL OnACCT(
const PCaselessString & args);
00431
virtual BOOL OnAPPE(
const PCaselessString & args);
00432
virtual BOOL OnRNFR(
const PCaselessString & args);
00433
virtual BOOL OnRNTO(
const PCaselessString & args);
00434
virtual BOOL OnDELE(
const PCaselessString & args);
00435
virtual BOOL OnCWD(
const PCaselessString & args);
00436
virtual BOOL OnCDUP(
const PCaselessString & args);
00437
virtual BOOL OnRMD(
const PCaselessString & args);
00438
virtual BOOL OnMKD(
const PCaselessString & args);
00439
virtual BOOL OnPWD(
const PCaselessString & args);
00440
virtual BOOL OnLIST(
const PCaselessString & args);
00441
virtual BOOL OnNLST(
const PCaselessString & args);
00442
virtual BOOL OnPASV(
const PCaselessString & args);
00443
00444
00445
00446
virtual BOOL OnHELP(
const PCaselessString & args);
00447
virtual BOOL OnSITE(
const PCaselessString & args);
00448
virtual BOOL OnABOR(
const PCaselessString & args);
00449
00450
00451
00452
virtual BOOL OnSMNT(
const PCaselessString & args);
00453
virtual BOOL OnREIN(
const PCaselessString & args);
00454
virtual BOOL OnSTOU(
const PCaselessString & args);
00455
virtual BOOL OnALLO(
const PCaselessString & args);
00456
virtual BOOL OnREST(
const PCaselessString & args);
00457
00458
00460
void SendToClient(
00461
const PFilePath & filename
00462 );
00463
00464
00465
protected:
00467 BOOL
OnOpen();
00468
void Construct();
00469
00470 PString readyString;
00471 BOOL
thirdPartyPort;
00472
00473
enum {
00474
NotConnected,
00475
NeedUser,
00476
NeedPassword,
00477
Connected,
00478
ClientConnect
00479 } state;
00480
00481 PIPSocket::Address remoteHost;
00482 WORD
remotePort;
00483
00484 PTCPSocket *
passiveSocket;
00485
00486 char type;
00487 char structure;
00488 char mode;
00489 PString userName;
00490 int illegalPasswordCount;
00491 };
00492
00493
00494
#endif
00495
00496
00497