Exemplo n.º 1
0
        /// <inheritdoc />
        public FtpCommandSelection?Create(FtpCommandHandlerContext context)
        {
            var result = ActivateCommandHandler(context);

            if (result != null)
            {
                ActivateProperty(result.Handler, context);
            }

            return(result);
        }
Exemplo n.º 2
0
        private FtpCommandSelection?ActivateCommandHandler(FtpCommandHandlerContext context)
        {
            if (!_nameToHandlerInfo.TryGetValue(context.FtpContext.Command.Name, out var handlerInfo))
            {
                return(null);
            }

            if (_commandHandlers.TryGetValue(handlerInfo.Type, out var handler))
            {
                return(new FtpCommandSelection(handler, handlerInfo));
            }

#pragma warning disable 612
            if (handlerInfo is IFtpCommandHandlerInstanceInformation handlerInstanceInfo)
#pragma warning restore 612
            {
                handler = handlerInstanceInfo.Instance;
            }
            else
            {
                handler = (IFtpCommandHandler)ActivatorUtilities.CreateInstance(
                    _serviceProvider,
                    handlerInfo.Type);
            }

            IFtpCommandInformation commandInformation = handlerInfo;
            if (handlerInfo.IsExtensible && handler is IFtpCommandHandlerExtensionHost extensionHost)
            {
                var extensions     = ActivateExtensions(context, handlerInfo).ToList();
                var hostExtensions = extensions.ToDictionary(
                    x => x.Item2.Name,
                    x => Tuple.Create(x.Item1, x.Item2),
                    StringComparer.OrdinalIgnoreCase);
                extensionHost.Extensions = hostExtensions.ToDictionary(
                    x => x.Key,
                    x => x.Value.Item1);

                var argument = FtpCommand.Parse(context.FtpContext.Command.Argument);
                if (hostExtensions.TryGetValue(argument.Name, out var hostExtensionDictValue))
                {
                    commandInformation = hostExtensionDictValue.Item2;
                }
            }

            _commandHandlers.Add(handlerInfo.Type, handler);

            return(new FtpCommandSelection(handler, commandInformation));
        }
        /// <inheritdoc />
        public async Task DispatchAsync(FtpContext context, CancellationToken cancellationToken)
        {
            var loginStateMachine =
                _loginStateMachine
                ?? throw new InvalidOperationException("Login state machine not initialized.");

            var commandHandlerContext = new FtpCommandHandlerContext(context);
            var result = _commandActivator.Create(commandHandlerContext);

            if (result == null)
            {
                await SendResponseAsync(
                    new FtpResponse(500, T("Syntax error, command unrecognized.")),
                    cancellationToken)
                .ConfigureAwait(false);

                return;
            }

            var handler         = result.Handler;
            var isLoginRequired = result.Information.IsLoginRequired;

            if (isLoginRequired && loginStateMachine.Status != SecurityStatus.Authorized)
            {
                await SendResponseAsync(
                    new FtpResponse(530, T("Not logged in.")),
                    cancellationToken)
                .ConfigureAwait(false);

                return;
            }

            if (result.Information.IsAbortable)
            {
                await ExecuteBackgroundCommandAsync(context, handler, cancellationToken)
                .ConfigureAwait(false);
            }
            else
            {
                var executionContext = new FtpExecutionContext(context, handler, cancellationToken);
                await _executionDelegate(executionContext)
                .ConfigureAwait(false);
            }
        }
Exemplo n.º 4
0
        private FtpCommandSelection ActivateCommandHandler([NotNull] FtpCommandHandlerContext context)
        {
            if (!_nameToHandlerInfo.TryGetValue(context.FtpContext.Command.Name, out var handlerInfo))
            {
                return(null);
            }

            if (_commandHandlers.TryGetValue(handlerInfo.Type, out var handler))
            {
                return(new FtpCommandSelection(handler, handlerInfo));
            }

#pragma warning disable 612
            if (handlerInfo is IFtpCommandHandlerInstanceInformation handlerInstanceInfo)
#pragma warning restore 612
            {
                handler = handlerInstanceInfo.Instance;
            }
            else
            {
                handler = (IFtpCommandHandler)ActivatorUtilities.CreateInstance(
                    _serviceProvider,
                    handlerInfo.Type);
            }

            if (handler is IFtpCommandHandlerExtensionHost extensionHost)
            {
                var extensions = ActivateExtensions(context, handlerInfo).ToList();
                extensionHost.Extensions = extensions.ToDictionary(
                    x => x.Item2.Name,
                    x => x.Item1,
                    StringComparer.OrdinalIgnoreCase);
            }

            _commandHandlers.Add(handlerInfo.Type, handler);

            return(new FtpCommandSelection(handler, handlerInfo));
        }
Exemplo n.º 5
0
        private IEnumerable <Tuple <IFtpCommandHandlerExtension, IFtpCommandHandlerExtensionInformation> > ActivateExtensions(
            FtpCommandHandlerContext context,
            IFtpCommandHandlerInformation handlerInfo)
        {
            var extensionInfos = _hostToExtensionInfo[handlerInfo.Name].ToList();
            var typesToInfos   = extensionInfos.ToLookup(x => x.Type);
            var extensionTypes = extensionInfos.Select(x => x.Type).Distinct();

            foreach (var extensionType in extensionTypes)
            {
                var extensionInfo = typesToInfos[extensionType].First();

                if (!_commandHandlerExtensions.TryGetValue(extensionType, out var extension))
                {
#pragma warning disable 612
                    if (extensionInfo is IFtpCommandHandlerExtensionInstanceInformation extensionInstanceInfo)
#pragma warning restore 612
                    {
                        extension = extensionInstanceInfo.Instance;
                    }
                    else
                    {
                        extension = (IFtpCommandHandlerExtension)ActivatorUtilities.CreateInstance(
                            _serviceProvider,
                            extensionType);
                    }

                    ActivateProperty(extension, context);
                    extension.InitializeConnectionData();

                    _commandHandlerExtensions.Add(extensionType, extension);
                }

                yield return(Tuple.Create(extension, extensionInfo));
            }
        }
Exemplo n.º 6
0
        private void ActivateProperty(object handler, FtpCommandHandlerContext context)
        {
            var property = GetCommandContextProperty(handler.GetType());

            property?.SetValue(handler, context);
        }