/// <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; }
/// <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; }
/// <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(); }
/// <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); }