📄 ftpsrvr.cxx
字号:
if (values[i] < 0 || values[i] > 255)
break;
}
if (i < 6)
OnSyntaxError(PORT);
else {
PIPSocket * socket = GetSocket();
if (socket == NULL)
OnError(590, PORT, "not available on non-TCP transport.");
else {
remoteHost = PIPSocket::Address((BYTE)values[0],
(BYTE)values[1], (BYTE)values[2], (BYTE)values[3]);
remotePort = (WORD)(values[4]*256 + values[5]);
if (remotePort < 1024 && remotePort != socket->GetPort()-1)
OnError(590, PORT, "cannot access privileged port number.");
else {
PIPSocket::Address controlHost;
GetSocket()->GetPeerAddress(controlHost);
if (thirdPartyPort || remoteHost == controlHost)
OnCommandSuccessful(PORT);
else
OnError(591, PORT, "three way transfer not allowed.");
}
}
}
return TRUE;
}
BOOL PFTPServer::OnPASV(const PCaselessString &)
{
if (passiveSocket != NULL)
delete passiveSocket;
passiveSocket = new PTCPSocket;
passiveSocket->Listen();
WORD portNo = passiveSocket->GetPort();
PIPSocket::Address ourAddr;
PIPSocket * socket = GetSocket();
if (socket != NULL)
socket->GetLocalAddress(ourAddr);
PString str(PString::Printf,
"Entering Passive Mode (%i,%i,%i,%i,%i,%i)",
ourAddr.Byte1(),
ourAddr.Byte2(),
ourAddr.Byte3(),
ourAddr.Byte4(),
portNo/256, portNo%256);
return WriteResponse(227, str);
}
BOOL PFTPServer::OnTYPE(const PCaselessString & args)
{
if (args.IsEmpty())
OnSyntaxError(TYPE);
else {
switch (toupper(args[0])) {
case 'A':
type = 'A';
break;
case 'I':
type = 'I';
break;
case 'E':
case 'L':
WriteResponse(504, PString("TYPE not implemented for parameter ") + args);
return TRUE;
default:
OnSyntaxError(TYPE);
return TRUE;
}
}
OnCommandSuccessful(TYPE);
return TRUE;
}
BOOL PFTPServer::OnMODE(const PCaselessString & args)
{
if (args.IsEmpty())
OnSyntaxError(MODE);
else {
switch (toupper(args[0])) {
case 'S':
structure = 'S';
break;
case 'B':
case 'C':
WriteResponse(504, PString("MODE not implemented for parameter ") + args);
return TRUE;
default:
OnSyntaxError(MODE);
return TRUE;
}
}
OnCommandSuccessful(MODE);
return TRUE;
}
BOOL PFTPServer::OnSTRU(const PCaselessString & args)
{
if (args.IsEmpty())
OnSyntaxError(STRU);
else {
switch (toupper(args[0])) {
case 'F':
structure = 'F';
break;
case 'R':
case 'P':
WriteResponse(504, PString("STRU not implemented for parameter ") + args);
return TRUE;
default:
OnSyntaxError(STRU);
return TRUE;
}
}
OnCommandSuccessful(STRU);
return TRUE;
}
BOOL PFTPServer::OnNOOP(const PCaselessString &)
{
OnCommandSuccessful(NOOP);
return TRUE;
}
// mandatory commands that cannot be performed without logging in
BOOL PFTPServer::OnRETR(const PCaselessString &)
{
OnNotImplemented(RETR);
return TRUE;
}
BOOL PFTPServer::OnSTOR(const PCaselessString &)
{
OnNotImplemented(STOR);
return TRUE;
}
BOOL PFTPServer::OnACCT(const PCaselessString &)
{
WriteResponse(532, "Need account for storing files");
return TRUE;
}
BOOL PFTPServer::OnCWD(const PCaselessString &)
{
OnNotImplemented(CWD);
return TRUE;
}
BOOL PFTPServer::OnCDUP(const PCaselessString &)
{
OnNotImplemented(CDUP);
return TRUE;
}
BOOL PFTPServer::OnSMNT(const PCaselessString &)
{
OnNotImplemented(SMNT);
return TRUE;
}
BOOL PFTPServer::OnREIN(const PCaselessString &)
{
OnNotImplemented(REIN);
return TRUE;
}
BOOL PFTPServer::OnSTOU(const PCaselessString &)
{
OnNotImplemented(STOU);
return TRUE;
}
BOOL PFTPServer::OnAPPE(const PCaselessString &)
{
OnNotImplemented(APPE);
return TRUE;
}
BOOL PFTPServer::OnALLO(const PCaselessString &)
{
OnNotImplemented(ALLO);
return TRUE;
}
BOOL PFTPServer::OnREST(const PCaselessString &)
{
OnNotImplemented(REST);
return TRUE;
}
BOOL PFTPServer::OnRNFR(const PCaselessString &)
{
OnNotImplemented(RNFR);
return TRUE;
}
BOOL PFTPServer::OnRNTO(const PCaselessString &)
{
OnNotImplemented(RNTO);
return TRUE;
}
BOOL PFTPServer::OnABOR(const PCaselessString &)
{
OnNotImplemented(ABOR);
return TRUE;
}
BOOL PFTPServer::OnDELE(const PCaselessString &)
{
OnNotImplemented(DELE);
return TRUE;
}
BOOL PFTPServer::OnRMD(const PCaselessString &)
{
OnNotImplemented(RMD);
return TRUE;
}
BOOL PFTPServer::OnMKD(const PCaselessString &)
{
OnNotImplemented(MKD);
return TRUE;
}
BOOL PFTPServer::OnPWD(const PCaselessString &)
{
OnNotImplemented(PWD);
return TRUE;
}
BOOL PFTPServer::OnLIST(const PCaselessString &)
{
OnNotImplemented(LIST);
return TRUE;
}
BOOL PFTPServer::OnNLST(const PCaselessString &)
{
OnNotImplemented(NLST);
return TRUE;
}
BOOL PFTPServer::OnSITE(const PCaselessString &)
{
OnNotImplemented(SITE);
return TRUE;
}
BOOL PFTPServer::OnSYST(const PCaselessString &)
{
WriteResponse(215, GetSystemTypeString());
return TRUE;
}
BOOL PFTPServer::OnSTAT(const PCaselessString &)
{
OnNotImplemented(STAT);
return TRUE;
}
BOOL PFTPServer::OnHELP(const PCaselessString &)
{
OnNotImplemented(HELP);
return TRUE;
}
void PFTPServer::SendToClient(const PFilePath & filename)
{
if (!PFile::Exists(filename))
WriteResponse(450, filename + ": file not found");
else {
PTCPSocket * dataSocket;
if (passiveSocket != NULL) {
dataSocket = new PTCPSocket(*passiveSocket);
delete passiveSocket;
passiveSocket = NULL;
} else
dataSocket = new PTCPSocket(remoteHost, remotePort);
if (!dataSocket->IsOpen())
WriteResponse(425, "Cannot open data connection");
else {
if (type == 'A') {
PTextFile file(filename, PFile::ReadOnly);
if (!file.IsOpen())
WriteResponse(450, filename + ": cannot open file");
else {
PString fileSize(PString::Unsigned, file.GetLength());
WriteResponse(150, PString("Opening ASCII data connection for " + filename.GetFileName() + "(" + fileSize + " bytes)"));
PString line;
BOOL ok = TRUE;
while (ok && file.ReadLine(line)) {
if (!dataSocket->Write((const char *)line, line.GetLength())) {
WriteResponse(426, "Connection closed - transfer aborted");
ok = FALSE;
}
}
file.Close();
}
} else {
PFile file(filename, PFile::ReadOnly);
if (!file.IsOpen())
WriteResponse(450, filename + ": cannot open file");
else {
PString fileSize(PString::Unsigned, file.GetLength());
WriteResponse(150, PString("Opening BINARY data connection for " + filename.GetFileName() + "(" + fileSize + " bytes)"));
BYTE buffer[2048];
BOOL ok = TRUE;
while (ok && file.Read(buffer, 2048)) {
if (!dataSocket->Write(buffer, file.GetLastReadCount())) {
WriteResponse(426, "Connection closed - transfer aborted");
ok = FALSE;
}
}
file.Close();
}
}
delete dataSocket;
WriteResponse(226, "Transfer complete");
}
}
}
// End of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -