📄 ftpsrvr.cxx
字号:
PINDEX i; for (i = 0; i < len; i++) { values[i] = tokens[i].AsInteger(); 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 inBOOL 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(STATcmd); 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 + -