/// <inheritdoc /> public FtpCommandSelection?Create(FtpCommandHandlerContext context) { var result = ActivateCommandHandler(context); if (result != null) { ActivateProperty(result.Handler, context); } return(result); }
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); } }
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)); }
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)); } }
private void ActivateProperty(object handler, FtpCommandHandlerContext context) { var property = GetCommandContextProperty(handler.GetType()); property?.SetValue(handler, context); }