/// <summary> /// Initializes a new instance of the <see cref="DotNetFileSystem"/> class. /// </summary> /// <param name="rootPath">The path to use as root.</param> /// <param name="allowNonEmptyDirectoryDelete">Defines whether the deletion of non-empty directories is allowed.</param> /// <param name="streamBufferSize">Buffer size to be used in async IO methods.</param> /// <param name="flushStream">Flush the stream after every write operation.</param> public ServerManagerFileSystem(IAccountInformation account, IServiceProvider serviceProvider, string rootPath, bool allowNonEmptyDirectoryDelete, int streamBufferSize, bool flushStream) { _account = account; _serviceProvider = serviceProvider; //_userManager = _serviceProvider.GetService<UserManager<MonitorUser>>(); FileSystemEntryComparer = StringComparer.OrdinalIgnoreCase; Root = new ServerManagerDirectoryEntry(Directory.CreateDirectory(rootPath), allowNonEmptyDirectoryDelete); SupportsNonEmptyDirectoryDelete = allowNonEmptyDirectoryDelete; _streamBufferSize = streamBufferSize; _flushStream = flushStream; }
/// <inheritdoc/> public async Task <IUnixFileSystemEntry?> GetEntryByNameAsync(IUnixDirectoryEntry directoryEntry, string name, CancellationToken cancellationToken) { var managerDirEntry = (ServerManagerDirectoryEntry)directoryEntry; IUnixFileSystemEntry?result = null; if (managerDirEntry.IsRoot || managerDirEntry.Info == null) { using (var scope = _serviceProvider.CreateScope()) using (var db = scope.ServiceProvider.GetService <MonitorDBContext>()) using (var userManager = scope.ServiceProvider.GetService <UserManager <MonitorUser> >()) { IQueryable <Server> serversQuery = db.Servers; var User = _account.FtpUser; var user = await userManager.GetUserAsync(User); if (!User.IsInRole("Admin")) { serversQuery = serversQuery.Where((server) => user == server.Owner || (server.Group != null ? server.Group.Members.Any((group) => group.User == user) : false) ); } var server = await serversQuery.FirstOrDefaultAsync(s => s.Name == name, cancellationToken); if (server != null) { result = new ServerManagerDirectoryEntry(server, new DirectoryInfo(server.Path), SupportsNonEmptyDirectoryDelete, true); } } } else { var searchDirInfo = managerDirEntry.Info; var fullPath = Path.Combine(searchDirInfo.FullName, name); if (File.Exists(fullPath)) { result = new ServerManagerFileEntry(managerDirEntry.Server, new FileInfo(fullPath)); } else if (Directory.Exists(fullPath)) { result = new ServerManagerDirectoryEntry(managerDirEntry.Server, new DirectoryInfo(fullPath), SupportsNonEmptyDirectoryDelete, false); } } return(result); }