FtpClient.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 /* DEBUG: section 09 File Transfer Protocol (FTP) */
10 
11 #ifndef SQUID_SRC_CLIENTS_FTPCLIENT_H
12 #define SQUID_SRC_CLIENTS_FTPCLIENT_H
13 
14 #include "clients/Client.h"
15 #include "error/Detail.h"
16 
17 class String;
18 namespace Ftp
19 {
20 
21 extern const char *const crlf;
22 
27 class ErrorDetail: public ::ErrorDetail {
29 
30 public:
31  explicit ErrorDetail(const int code): completionCode(code) {}
32 
33  /* ErrorDetail API */
34  SBuf brief() const override;
35  SBuf verbose(const HttpRequestPointer &) const override;
36 
37 private:
39 };
40 
43 class Channel
44 {
45 public:
47  void opened(const Comm::ConnectionPointer &conn, const AsyncCall::Pointer &aCloser);
48 
52  void close();
53 
54  void forget();
55 
56  void clear();
57 
59 
66 
67 private:
69 };
70 
74 {
75 public:
76  CtrlChannel();
77  ~CtrlChannel();
78 
79  char *buf;
80  size_t size;
81  size_t offset;
83  char *last_command;
84  char *last_reply;
85  int replycode;
86 
87 private:
88  CtrlChannel(const CtrlChannel &); // not implemented
89  CtrlChannel &operator =(const CtrlChannel &); // not implemented
90 };
91 
95 {
96 public:
97  DataChannel();
98  ~DataChannel();
99 
100  void addr(const Ip::Address &addr);
101 
102 public:
104  char *host;
105  unsigned short port;
107 };
108 
110 class Client: public ::Client
111 {
113 
114 public:
115  explicit Client(FwdState *fwdState);
116  ~Client() override;
117 
119  virtual void failed(err_type error = ERR_NONE, int xerrno = 0,
120  ErrorState *ftperr = nullptr);
121 
123  virtual void timeout(const CommTimeoutCbParams &io);
124 
125  /* Client API */
126  void maybeReadVirginBody() override;
127 
128  void writeCommand(const char *buf);
129 
132  bool handlePasvReply(Ip::Address &remoteAddr);
133  bool handleEpsvReply(Ip::Address &remoteAddr);
134 
135  bool sendEprt();
136  bool sendPort();
137  bool sendPassive();
138  void connectDataChannel();
139  bool openListenSocket();
141 
144 
145  enum {
171  SENT_DATA_REQUEST, // LIST, NLST or RETR requests..
172  SENT_COMMAND, // General command
174  } ftp_state_t;
175 
176  int state;
177  char *old_request;
178  char *old_reply;
179 
180 protected:
181  /* AsyncJob API */
182  void start() override;
183 
184  /* Client API */
185  void closeServer() override;
186  bool doneWithServer() const override;
187  const Comm::ConnectionPointer & dataConnection() const override;
188  void abortAll(const char *reason) override;
189  void noteDelayAwareReadChance() override;
190 
192  void ctrlClosed(const CommCloseCbParams &io);
193  void scheduleReadControlReply(int buffered_ok);
194  void readControlReply(const CommIoCbParams &io);
195  virtual void handleControlReply();
196  void writeCommandCallback(const CommIoCbParams &io);
197  virtual void dataChannelConnected(const CommConnectCbParams &io) = 0;
198  void dataRead(const CommIoCbParams &io);
199  void dataComplete();
201  virtual void dataClosed(const CommCloseCbParams &io);
202  void initReadBuf();
203 
204  // sending of the request body to the server
205  void sentRequestBody(const CommIoCbParams &io) override;
206  void doneSendingRequestBody() override;
207 
211 
212 private:
213  bool parseControlReply(size_t &bytesUsed);
214 
218 };
219 
220 } // namespace Ftp
221 
222 #endif /* SQUID_SRC_CLIENTS_FTPCLIENT_H */
223 
SBuf verbose(const HttpRequestPointer &) const override
Definition: FtpClient.cc:81
bool sendEprt()
Definition: FtpClient.cc:607
bool sendPort()
Definition: FtpClient.cc:646
void opened(const Comm::ConnectionPointer &conn, const AsyncCall::Pointer &aCloser)
called after the socket is opened, sets up close handler
Definition: FtpClient.cc:90
SBuf brief() const override
Definition: FtpClient.cc:75
void maybeReadVirginBody() override
read response data from the network
Definition: FtpClient.cc:917
void connectDataChannel()
Definition: FtpClient.cc:762
const char *const crlf
Definition: FtpClient.cc:40
void writeCommand(const char *buf)
Definition: FtpClient.cc:823
void sentRequestBody(const CommIoCbParams &io) override
Definition: FtpClient.cc:1078
void error(char *format,...)
~Client() override
Definition: FtpClient.cc:205
Definition: SBuf.h:93
CtrlChannel & operator=(const CtrlChannel &)
bool sendPassive()
Definition: FtpClient.cc:653
void abortAll(const char *reason) override
abnormal transaction termination; reason is for debugging only
Definition: FtpClient.cc:1055
void initReadBuf()
Definition: FtpClient.cc:221
MemBuf * readBuf
Definition: FtpClient.h:103
virtual void failed(err_type error=ERR_NONE, int xerrno=0, ErrorState *ftperr=nullptr)
handle a fatal transaction error, closing the control connection
Definition: FtpClient.cc:262
@ ERR_NONE
Definition: forward.h:15
StatusCode
Definition: StatusCode.h:20
err_type
Definition: forward.h:14
enum Ftp::Client::@37 ftp_state_t
FTP client functionality shared among FTP Gateway and Relay clients.
Definition: FtpClient.h:110
Definition: forward.h:23
virtual void dataChannelConnected(const CommConnectCbParams &io)=0
bool openListenSocket()
Definition: FtpClient.cc:795
bool handlePasvReply(Ip::Address &remoteAddr)
Definition: FtpClient.cc:455
wordlist * message
Definition: FtpClient.h:82
void start() override
called by AsyncStart; do not call directly
Definition: FtpClient.cc:215
void noteDelayAwareReadChance() override
Definition: FtpClient.cc:908
virtual void handleControlReply()
Definition: FtpClient.cc:419
char * last_command
Definition: FtpClient.h:83
virtual void dataClosed(const CommCloseCbParams &io)
handler called by Comm when FTP data channel is closed unexpectedly
Definition: FtpClient.cc:810
@ SENT_DATA_REQUEST
Definition: FtpClient.h:171
void dataComplete()
Definition: FtpClient.cc:1026
Definition: MemBuf.h:23
bool handleEpsvReply(Ip::Address &remoteAddr)
Definition: FtpClient.cc:491
AsyncCall::Pointer dataCloser()
creates a data channel Comm close callback
Definition: FtpClient.cc:802
void scheduleReadControlReply(int buffered_ok)
Definition: FtpClient.cc:325
bool doneWithServer() const override
Definition: FtpClient.cc:256
void close()
planned close: removes the close handler and calls comm_close
Definition: FtpClient.cc:107
void doneSendingRequestBody() override
Definition: FtpClient.cc:1089
int completionCode
FTP reply completion code.
Definition: FtpClient.h:38
MEMPROXY_CLASS(Ftp::ErrorDetail)
bool shortenReadTimeout
Definition: FtpClient.h:217
void closeServer() override
Definition: FtpClient.cc:233
Comm::ConnectionPointer conn
channel descriptor
Definition: FtpClient.h:58
int code
Definition: smb-errors.c:145
DataChannel data
FTP data channel state.
Definition: FtpClient.h:143
JobWait< Comm::ConnOpener > dataConnWait
Definition: FtpClient.h:210
Client(FwdState *fwdState)
Definition: FtpClient.cc:184
void dataRead(const CommIoCbParams &io)
Definition: FtpClient.cc:957
void clear()
remove the close handler, leave connection open
Definition: FtpClient.cc:128
Comm::ConnectionPointer listenConn
Definition: FtpClient.h:65
virtual Http::StatusCode failedHttpStatus(err_type &error)
Definition: FtpClient.cc:311
bool parseControlReply(size_t &bytesUsed)
Definition: FtpClient.cc:1103
void addr(const Ip::Address &addr)
import host and port
Definition: FtpClient.cc:173
char * last_reply
Definition: FtpClient.h:84
const Comm::ConnectionPointer & dataConnection() const override
Definition: FtpClient.cc:902
char * old_request
Definition: FtpClient.h:177
void ctrlClosed(const CommCloseCbParams &io)
handler called by Comm when FTP control channel is closed unexpectedly
Definition: FtpClient.cc:879
void readControlReply(const CommIoCbParams &io)
Definition: FtpClient.cc:362
CtrlChannel ctrl
FTP control channel state.
Definition: FtpClient.h:142
void forget()
Definition: FtpClient.cc:118
void writeCommandCallback(const CommIoCbParams &io)
Definition: FtpClient.cc:855
virtual void timeout(const CommTimeoutCbParams &io)
read timeout handler
Definition: FtpClient.cc:890
ErrorDetail(const int code)
Definition: FtpClient.h:31
unsigned short port
Definition: FtpClient.h:105
char * old_reply
Definition: FtpClient.h:178
void switchTimeoutToDataChannel()
Definition: FtpClient.cc:1067
AsyncCall::Pointer closer
Comm close handler callback.
Definition: FtpClient.h:68

 

Introduction

Documentation

Support

Miscellaneous