Esempio n. 1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ReinCommandHandler"/> class.
 /// </summary>
 /// <param name="portOptions">The PORT command options.</param>
 /// <param name="serverMessages">The FTP server messages.</param>
 /// <param name="logger">The logger.</param>
 public ReinCommandHandler(
     IOptions <PortCommandOptions> portOptions,
     IFtpServerMessages serverMessages,
     ILogger <ReinCommandHandler>?logger = null)
 {
     _dataPort       = portOptions.Value.DataPort;
     _serverMessages = serverMessages;
     _logger         = logger;
 }
Esempio n. 2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ReinCommandHandler"/> class.
 /// </summary>
 /// <param name="portOptions">The PORT command options.</param>
 /// <param name="serverMessages">The FTP server messages.</param>
 /// <param name="logger">The logger.</param>
 public ReinCommandHandler(
     [NotNull] IOptions <PortCommandOptions> portOptions,
     [NotNull] IFtpServerMessages serverMessages,
     [CanBeNull] ILogger <ReinCommandHandler> logger = null)
 {
     _dataPort       = portOptions.Value.DataPort;
     _serverMessages = serverMessages;
     _logger         = logger;
 }
Esempio n. 3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PasswordAuthorization"/> class.
 /// </summary>
 /// <param name="connection">The required FTP connection.</param>
 /// <param name="membershipProviders">The membership providers for password authorization.</param>
 /// <param name="authorizationActions">Actions to be executed upon authorization.</param>
 /// <param name="serverMessages">The FTP server messages.</param>
 public PasswordAuthorization(
     [NotNull] IFtpConnection connection,
     [NotNull, ItemNotNull] IEnumerable <IMembershipProvider> membershipProviders,
     [NotNull, ItemNotNull] IEnumerable <IAuthorizationAction> authorizationActions,
     [NotNull] IFtpServerMessages serverMessages)
     : base(connection)
 {
     _serverMessages       = serverMessages;
     _authorizationActions = authorizationActions.OrderByDescending(x => x.Level).ToList();
     _membershipProviders  = membershipProviders.ToList();
 }
Esempio n. 4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="FtpConnection"/> class.
        /// </summary>
        /// <param name="socket">The socket to use to communicate with the client.</param>
        /// <param name="options">The options for the FTP connection.</param>
        /// <param name="portOptions">The <c>PORT</c> command options.</param>
        /// <param name="connectionAccessor">The accessor to get the connection that is active during the <see cref="FtpCommandHandler.Process"/> method execution.</param>
        /// <param name="catalogLoader">The catalog loader for the FTP server.</param>
        /// <param name="serverCommandExecutor">The executor for server commands.</param>
        /// <param name="serviceProvider">The service provider for the connection.</param>
        /// <param name="secureDataConnectionWrapper">Wraps a data connection into an SSL stream.</param>
        /// <param name="serverMessages">The server messages.</param>
        /// <param name="sslStreamWrapperFactory">The SSL stream wrapper factory.</param>
        /// <param name="logger">The logger for the FTP connection.</param>
        public FtpConnection(
            [NotNull] TcpClient socket,
            [NotNull] IOptions <FtpConnectionOptions> options,
            [NotNull] IOptions <PortCommandOptions> portOptions,
            [NotNull] IFtpConnectionAccessor connectionAccessor,
            [NotNull] IFtpCatalogLoader catalogLoader,
            [NotNull] IServerCommandExecutor serverCommandExecutor,
            [NotNull] IServiceProvider serviceProvider,
            [NotNull] SecureDataConnectionWrapper secureDataConnectionWrapper,
            [NotNull] IFtpServerMessages serverMessages,
            [NotNull] ISslStreamWrapperFactory sslStreamWrapperFactory,
            [CanBeNull] ILogger <FtpConnection> logger = null)
        {
            ConnectionServices = serviceProvider;

            ConnectionId = "FTP-" + Guid.NewGuid().ToString("N");

            _dataPort = portOptions.Value.DataPort;
            var endpoint      = (IPEndPoint)socket.Client.RemoteEndPoint;
            var remoteAddress = _remoteAddress = new Address(endpoint.Address.ToString(), endpoint.Port);

            var properties = new Dictionary <string, object>
            {
                ["RemoteAddress"] = remoteAddress.ToString(true),
                ["RemoteIp"]      = remoteAddress.IPAddress?.ToString(),
                ["RemotePort"]    = remoteAddress.Port,
                ["ConnectionId"]  = ConnectionId,
            };

            _loggerScope = logger?.BeginScope(properties);

            _socket                      = socket;
            _connectionAccessor          = connectionAccessor;
            _serverCommandExecutor       = serverCommandExecutor;
            _secureDataConnectionWrapper = secureDataConnectionWrapper;
            _serverMessages              = serverMessages;
            _serverCommandChannel        = Channel.CreateBounded <IServerCommand>(new BoundedChannelOptions(3));

            _logger = logger;

            var parentFeatures    = new FeatureCollection();
            var connectionFeature = new ConnectionFeature(
                (IPEndPoint)socket.Client.LocalEndPoint,
                remoteAddress);
            var secureConnectionFeature = new SecureConnectionFeature(socket);

            var applicationInputPipe  = new Pipe();
            var applicationOutputPipe = new Pipe();
            var socketPipe            = new DuplexPipe(_socketCommandPipe.Reader, _socketResponsePipe.Writer);
            var connectionPipe        = new DuplexPipe(applicationOutputPipe.Reader, applicationInputPipe.Writer);

            _networkStreamFeature = new NetworkStreamFeature(
                new SecureConnectionAdapter(
                    socketPipe,
                    connectionPipe,
                    sslStreamWrapperFactory,
                    _cancellationTokenSource.Token),
                new ConnectionClosingNetworkStreamReader(
                    secureConnectionFeature.OriginalStream,
                    _socketCommandPipe.Writer,
                    _cancellationTokenSource),
                new StreamPipeWriterService(
                    secureConnectionFeature.OriginalStream,
                    _socketResponsePipe.Reader,
                    _cancellationTokenSource.Token),
                applicationOutputPipe.Writer);

            parentFeatures.Set <IConnectionFeature>(connectionFeature);
            parentFeatures.Set <ISecureConnectionFeature>(secureConnectionFeature);
            parentFeatures.Set <IServerCommandFeature>(new ServerCommandFeature(_serverCommandChannel));
            parentFeatures.Set <INetworkStreamFeature>(_networkStreamFeature);

            var features = new FeatureCollection(parentFeatures);

#pragma warning disable 618
            Data = new FtpConnectionData(
                options.Value.DefaultEncoding ?? Encoding.ASCII,
                features,
                catalogLoader);
#pragma warning restore 618

            Features = features;

            _commandReader = ReadCommandsFromPipeline(
                applicationInputPipe.Reader,
                _ftpCommandChannel.Writer,
                _cancellationTokenSource.Token);
        }