public string DownloadFile() { var downloadConfigs = new SftpConfiguration(); try { using (SftpClient sftp = new SftpClient(downloadConfigs.Host, downloadConfigs.UserName, downloadConfigs.Password)) { sftp.Connect(); // logger.LogDebug($"Connected to host {downloadConfigs.Host} file using Sftp"); using (Stream fileStream = File.OpenWrite(Path.Combine(downloadConfigs.localFilePath, downloadConfigs.fileName))) { sftp.DownloadFile(Path.Combine(downloadConfigs.RemoteFileLocation, downloadConfigs.fileName), fileStream); } sftp.Disconnect(); //logger.LogDebug($"Download successful for file {downloadConfigs.fileName} using Sftp to local location {downloadConfigs.localFilePath}"); } return(string.Empty); } catch (Exception e) { } return(string.Empty); }
public SftpHealthCheckOptions AddHost(SftpConfiguration sftpConfiguration) { ConfiguredHosts.Add(sftpConfiguration.Host, sftpConfiguration); return(this); }
private async Task PrepareUserForSftp(string username) { _logger.LogDebug("Configuring session for user '{user}'", username); _config = await _mediator.Send(new SftpConfigurationRequest()); var user = _config.Users.FirstOrDefault(s => s.Username == username) ?? new UserDefinition { Username = username, Chroot = _config.Global.Chroot, Directories = _config.Global.Directories }; var homeDirPath = Path.Combine(HomeBasePath, username); var chroot = user.Chroot ?? _config.Global.Chroot; //Parse chroot path by replacing markers var chrootPath = string.Join("%%h", chroot.Directory.Split("%%h") .Select(s => s.Replace("%h", homeDirPath)).ToList()); chrootPath = string.Join("%%u", chrootPath.Split("%%u") .Select(s => s.Replace("%u", username)).ToList()); //Create chroot directory and set owner to root and correct permissions var chrootDirectory = Directory.CreateDirectory(chrootPath); await ProcessUtil.QuickRun("chown", $"root:root {chrootDirectory.FullName}"); await ProcessUtil.QuickRun("chmod", $"755 {chrootDirectory.FullName}"); var directories = new List <string>(); directories.AddRange(_config.Global.Directories); directories.AddRange(user.Directories); foreach (var directory in directories.Distinct().OrderBy(s => s).ToList()) { var dirInfo = new DirectoryInfo(Path.Combine(chrootDirectory.FullName, directory)); if (!dirInfo.Exists) { _logger.LogDebug("Creating directory '{dir}' for user '{user}'", dirInfo.FullName, username); Directory.CreateDirectory(dirInfo.FullName); } try { if (dirInfo.IsDescendentOf(chrootDirectory)) { //Set the user as owner for directory and all parents until chroot path var dir = dirInfo; while (dir.FullName != chrootDirectory.FullName) { await ProcessUtil.QuickRun("chown", $"{username}:{SftpUserInventoryGroup} {dir.FullName}"); dir = dir.Parent ?? chrootDirectory; } } else { _logger.LogWarning( "Directory '{dir}' is not within chroot path '{chroot}'. Setting direct permissions.", dirInfo.FullName, chrootDirectory.FullName); await ProcessUtil.QuickRun("chown", $"{username}:{SftpUserInventoryGroup} {dirInfo.FullName}"); } } catch (Exception exception) { _logger.LogWarning(exception, "Exception occured while setting permissions for '{dir}' ", dirInfo.FullName); } } _logger.LogInformation("Session ready for user '{user}'", username); }
private Task PrepareAndValidateConfiguration() { _logger.LogDebug("Preparing and validating configuration"); var config = _sftpOptionsMonitor.CurrentValue ?? new SftpConfiguration(); config.Global ??= new GlobalConfiguration(); config.Global.Directories ??= new List <string>(); config.Global.Logging ??= new LoggingDefinition(); config.Global.Chroot ??= new ChrootDefinition(); config.Global.HostKeys ??= new HostKeyDefinition(); if (string.IsNullOrWhiteSpace(config.Global.Chroot.Directory)) { config.Global.Chroot.Directory = "%h"; } if (string.IsNullOrWhiteSpace(config.Global.Chroot.StartPath)) { config.Global.Chroot.StartPath = null; } config.Users ??= new List <UserDefinition>(); var validUsers = new List <UserDefinition>(); for (var index = 0; index < config.Users.Count; index++) { var userDefinition = config.Users[index]; if (string.IsNullOrWhiteSpace(userDefinition.Username)) { _logger.LogWarning("Users[index] has a null or whitespace username. Skipping user.", index); continue; } userDefinition.Chroot ??= new ChrootDefinition(); if (string.IsNullOrWhiteSpace(userDefinition.Chroot.Directory)) { userDefinition.Chroot.Directory = config.Global.Chroot.Directory; } if (string.IsNullOrWhiteSpace(userDefinition.Chroot.StartPath)) { userDefinition.Chroot.StartPath = config.Global.Chroot.StartPath; } if (userDefinition.Chroot.Directory == config.Global.Chroot.Directory && userDefinition.Chroot.StartPath == config.Global.Chroot.StartPath) { userDefinition.Chroot = null; } userDefinition.Directories ??= new List <string>(); validUsers.Add(userDefinition); } config.Users = validUsers; _logger.LogInformation("Configuration contains '{userCount}' user(s)", config.Users.Count); _config = config; return(Task.CompletedTask); }
public SftpLivenessOptions AddHost(SftpConfiguration sftpConfiguration) { ConfiguredHosts.Add(sftpConfiguration.Host, sftpConfiguration); return(this); }