Ticket #10912: Filezilla Server +CPFR CPTO commands.patch

File Filezilla Server +CPFR CPTO commands.patch, 3.2 KB (added by Julien Blitte, 8 years ago)

Filezilla Server +CPFR CPTO commands (not tested yet)

  • source/ControlSocket.cpp

     
    400400    CLNT,
    401401    MFMT,
    402402    HASH
     403#ifndef FTP_STRICT
     404    ,
     405    CPFR,   // non-normalized FTP
     406    CPTO
     407#endif // FTP_STRICT
    403408};
    404409
    405410std::map<CStdString, t_command> const command_map = {
     
    452457    {_T("STRU"), {commands::STRU, true, false}},
    453458    {_T("CLNT"), {commands::CLNT, true, true}},
    454459    {_T("MFMT"), {commands::MFMT, true, false}},
    455     {_T("HASH"), {commands::HASH, true, false}}
     460    {_T("HASH"), {commands::HASH, true, false}},
     461    {_T("CPFR"), {commands::CPFR, true,  false}},
     462    {_T("CPTO"), {commands::CPTO, true,  false}}
    456463};
    457464
    458465t_command CControlSocket::MapCommand(CStdString const& command, CStdString const& args)
     
    534541                break;
    535542            }
    536543            RenName = _T("");
     544            CopyName = _T("");
    537545            args.MakeLower();
    538546            m_status.username = args;
    539547            UpdateUser();
     
    19341942            }
    19351943        }
    19361944        break;
     1945    case commands::CPFR:
     1946        {
     1947            //Unquote args
     1948            if (!UnquoteArgs(args)) {
     1949                Send( _T("501 Syntax error") );
     1950                break;
     1951            }
     1952
     1953            CopyName = _T("");
     1954
     1955            CStdString physicalFile, logicalFile;
     1956            int error = m_owner.m_pPermissions->CheckFilePermissions(m_status.user, args, m_CurrentServerDir, FOP_READ, physicalFile, logicalFile);
     1957            if (!error) {
     1958                CopyName = physicalFile;
     1959                Send(_T("350 File exists, ready for destination name."));
     1960                break;
     1961            }
     1962            else if (error & PERMISSION_DENIED)
     1963                Send(_T("550 Permission denied"));
     1964            else if (error & PERMISSION_INVALIDNAME)
     1965                Send(_T("550 Filename invalid."));
     1966            else if (error & PERMISSION_NOTFOUND)
     1967                Send(_T("550 file not found"));
     1968            else {
     1969                Send(_T("553 Copy of directory not supported."));
     1970                break;
     1971            }
     1972        }
     1973        break;
     1974    case commands::CPTO:
     1975        {
     1976            if (CopyName == _T(""))
     1977            {
     1978                Send(_T("503 Bad sequence of commands!"));
     1979                break;
     1980            }
     1981
     1982            //Unquote args
     1983            if (!UnquoteArgs(args)) {
     1984                Send( _T("501 Syntax error") );
     1985                break;
     1986            }
     1987
     1988            CStdString physicalFile, logicalFile;
     1989            int error = m_owner.m_pPermissions->CheckFilePermissions(m_status.user, args, m_CurrentServerDir, FOP_CREATENEW, physicalFile, logicalFile);
     1990            if (error)
     1991                CopyName = _T("");
     1992            if (error & PERMISSION_DENIED)
     1993                Send(_T("550 Permission denied"));
     1994            else if (error & PERMISSION_INVALIDNAME)
     1995                Send(_T("553 Filename invalid"));
     1996            else if (error & PERMISSION_DOESALREADYEXIST && (error & PERMISSION_DIRNOTFILE)!=PERMISSION_DIRNOTFILE)
     1997                Send(_T("553 File exists"));
     1998            else if (error)
     1999                Send(_T("553 Filename invalid"));
     2000            else
     2001            {
     2002                Send(_T("151 Copying the file"));
     2003                if (!CopyFile(RenName, physicalFile, TRUE))
     2004                    Send(_T("450 Internal error copying the file"));
     2005                else
     2006                    Send(_T("250 file copied successfully"));
     2007            }
     2008        }
     2009        break;
    19372010    default:
    19382011        Send(_T("502 Command not implemented."));
    19392012    }
  • source/ControlSocket.h

     
    142142
    143143    CStdString RenName;
    144144    bool bRenFile{};
     145    CStdString CopyName;
    145146
    146147    enum TransferMode
    147148    {