mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-21 23:56:54 +02:00
Add FTPS (FTP over explicit SSL) implementation (#1866)
* FTPSClientSession Add class to support FTPS (explicit FTP over SSL). Testcase done but just TestSuite_x64_vs140.vcxproj modified * FTPS project file Added FTPS files to v140 project * FTPS makefile Added FTPS file to makefile * testsuit compile Fix compile of testsuite * comment misspelled checked misspelled comment, and re-add WebSocket testsuite * remove warning reorder constructor inizializzations in order to remove gcc -Wreorder warning * testsuite compile Correct Makefile in testsuite * Makefile testsuite add DialogServer to testsuite makefile * test build fix build of testsuite * add FTPSStreamFactory * vs140 32bit * build and test for vs150
This commit is contained in:

committed by
Aleksandar Fabijanic

parent
96ca6e865d
commit
dd573b98d8
66
NetSSL_OpenSSL/include/Poco/Net/FTPSClientSession.h
Normal file
66
NetSSL_OpenSSL/include/Poco/Net/FTPSClientSession.h
Normal file
@@ -0,0 +1,66 @@
|
||||
#pragma once
|
||||
#include "Poco/Net/FTPClientSession.h"
|
||||
|
||||
namespace Poco {
|
||||
namespace Net {
|
||||
|
||||
class FTPSClientSession :
|
||||
public Poco::Net::FTPClientSession
|
||||
{
|
||||
public:
|
||||
FTPSClientSession();
|
||||
/// Creates an FTPSClientSession.
|
||||
///
|
||||
/// Passive mode will be used for data transfers.
|
||||
|
||||
explicit FTPSClientSession(const StreamSocket& socket);
|
||||
/// Creates an FTPSClientSession using the given
|
||||
/// connected socket for the control connection.
|
||||
///
|
||||
/// Passive mode will be used for data transfers.
|
||||
|
||||
FTPSClientSession(const std::string& host,
|
||||
Poco::UInt16 port = FTP_PORT,
|
||||
const std::string& username = "",
|
||||
const std::string& password = "");
|
||||
/// Creates an FTPSClientSession using a socket connected
|
||||
/// to the given host and port. If username is supplied,
|
||||
/// login is attempted.
|
||||
///
|
||||
/// Passive mode will be used for data transfers.
|
||||
|
||||
virtual ~FTPSClientSession();
|
||||
|
||||
void tryFTPSmode(bool bTryFTPS);
|
||||
/// avoid or require TLS mode
|
||||
|
||||
bool isSecure() const;
|
||||
/// Returns true if the session is FTPS.
|
||||
|
||||
protected:
|
||||
virtual StreamSocket establishDataConnection(const std::string& command, const std::string& arg);
|
||||
/// Create secure data connection
|
||||
|
||||
virtual void receiveServerReadyReply();
|
||||
/// Function that read server welcome message after connetion and set and make secure socket
|
||||
|
||||
private:
|
||||
bool _bTryFTPS = true;
|
||||
|
||||
void beforeCreateDataSocket();
|
||||
///Send commands to check if we can encrypt data socket
|
||||
|
||||
void afterCreateControlSocket();
|
||||
///Send commands to make SSL negotiating of control channel
|
||||
|
||||
bool _bSecureDataConnection = false;
|
||||
};
|
||||
|
||||
inline bool FTPSClientSession::isSecure() const
|
||||
{
|
||||
if (_pControlSocket != nullptr)
|
||||
return _pControlSocket->secure();
|
||||
return false;
|
||||
}
|
||||
|
||||
}} // namespace Poco::Net
|
122
NetSSL_OpenSSL/include/Poco/Net/FTPSStreamFactory.h
Normal file
122
NetSSL_OpenSSL/include/Poco/Net/FTPSStreamFactory.h
Normal file
@@ -0,0 +1,122 @@
|
||||
//
|
||||
// FTPSStreamFactory.h
|
||||
//
|
||||
// $Id: //poco/1.4/Net/include/Poco/Net/FTPSStreamFactory.h#1 $
|
||||
//
|
||||
// Library: Net
|
||||
// Package: FTP
|
||||
// Module: FTPSStreamFactory
|
||||
//
|
||||
// Definition of the FTPSStreamFactory class.
|
||||
//
|
||||
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
//
|
||||
|
||||
|
||||
#ifndef Net_FTPSStreamFactory_INCLUDED
|
||||
#define Net_FTPSStreamFactory_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Net/Net.h"
|
||||
#include "Poco/Net/HTTPSession.h"
|
||||
#include "Poco/URIStreamFactory.h"
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Net {
|
||||
|
||||
|
||||
class Net_API FTPPasswordProvider
|
||||
/// The base class for all password providers.
|
||||
/// An instance of a subclass of this class can be
|
||||
/// registered with the FTPSStreamFactory to
|
||||
/// provide a password
|
||||
{
|
||||
public:
|
||||
virtual std::string password(const std::string& username, const std::string& host) = 0;
|
||||
/// Provide the password for the given user on the given host.
|
||||
|
||||
protected:
|
||||
FTPPasswordProvider();
|
||||
virtual ~FTPPasswordProvider();
|
||||
};
|
||||
|
||||
|
||||
class Net_API FTPSStreamFactory: public Poco::URIStreamFactory
|
||||
/// An implementation of the URIStreamFactory interface
|
||||
/// that handles File Transfer Protocol (ftp) URIs.
|
||||
///
|
||||
/// The URI's path may end with an optional type specification
|
||||
/// in the form (;type=<typecode>), where <typecode> is
|
||||
/// one of a, i or d. If type=a, the file identified by the path
|
||||
/// is transferred in ASCII (text) mode. If type=i, the file
|
||||
/// is transferred in Image (binary) mode. If type=d, a directory
|
||||
/// listing (in NLST format) is returned. This corresponds with
|
||||
/// the FTP URL format specified in RFC 1738.
|
||||
///
|
||||
/// If the URI does not contain a username and password, the
|
||||
/// username "anonymous" and the password "
|
||||
{
|
||||
public:
|
||||
FTPSStreamFactory();
|
||||
/// Creates the FTPSStreamFactory.
|
||||
|
||||
~FTPSStreamFactory();
|
||||
/// Destroys the FTPSStreamFactory.
|
||||
|
||||
std::istream* open(const Poco::URI& uri);
|
||||
/// Creates and opens a HTTP stream for the given URI.
|
||||
/// The URI must be a ftp://... URI.
|
||||
///
|
||||
/// Throws a NetException if anything goes wrong.
|
||||
|
||||
static void setAnonymousPassword(const std::string& password);
|
||||
/// Sets the password used for anonymous FTP.
|
||||
///
|
||||
/// WARNING: Setting the anonymous password is not
|
||||
/// thread-safe, so it's best to call this method
|
||||
/// during application initialization, before the
|
||||
/// FTPSStreamFactory is used for the first time.
|
||||
|
||||
static const std::string& getAnonymousPassword();
|
||||
/// Returns the password used for anonymous FTP.
|
||||
|
||||
static void setPasswordProvider(FTPPasswordProvider* pProvider);
|
||||
/// Sets the FTPPasswordProvider. If NULL is given,
|
||||
/// no password provider is used.
|
||||
///
|
||||
/// WARNING: Setting the password provider is not
|
||||
/// thread-safe, so it's best to call this method
|
||||
/// during application initialization, before the
|
||||
/// FTPSStreamFactory is used for the first time.
|
||||
|
||||
static FTPPasswordProvider* getPasswordProvider();
|
||||
/// Returns the FTPPasswordProvider currently in use,
|
||||
/// or NULL if no one has been set.
|
||||
|
||||
static void registerFactory();
|
||||
/// Registers the FTPSStreamFactory with the
|
||||
/// default URIStreamOpener instance.
|
||||
|
||||
static void unregisterFactory();
|
||||
/// Unregisters the FTPSStreamFactory with the
|
||||
/// default URIStreamOpener instance.
|
||||
|
||||
protected:
|
||||
static void splitUserInfo(const std::string& userInfo, std::string& username, std::string& password);
|
||||
static void getUserInfo(const Poco::URI& uri, std::string& username, std::string& password);
|
||||
static void getPathAndType(const Poco::URI& uri, std::string& path, char& type);
|
||||
|
||||
private:
|
||||
static std::string _anonymousPassword;
|
||||
static FTPPasswordProvider* _pPasswordProvider;
|
||||
};
|
||||
|
||||
|
||||
} } // namespace Poco::Net
|
||||
|
||||
|
||||
#endif // Net_FTPSStreamFactory_INCLUDED
|
Reference in New Issue
Block a user