Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 public SftpHealthCheckOptions AddHost(SftpConfiguration sftpConfiguration)
 {
     ConfiguredHosts.Add(sftpConfiguration.Host, sftpConfiguration);
     return(this);
 }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 public SftpLivenessOptions AddHost(SftpConfiguration sftpConfiguration)
 {
     ConfiguredHosts.Add(sftpConfiguration.Host, sftpConfiguration);
     return(this);
 }