diff --git a/Moonlight/App/Models/Files/Accesses/HostFileAccess.cs b/Moonlight/App/Models/Files/Accesses/HostFileAccess.cs deleted file mode 100644 index ef0a66e..0000000 --- a/Moonlight/App/Models/Files/Accesses/HostFileAccess.cs +++ /dev/null @@ -1,145 +0,0 @@ -using Logging.Net; -using Moonlight.App.Exceptions; -using Moonlight.App.Helpers; - -namespace Moonlight.App.Models.Files.Accesses; - -public class HostFileAccess : IFileAccess -{ - private readonly string BasePath; - private string RealPath => BasePath + Path; - private string Path = "/"; - - public HostFileAccess(string bp) - { - BasePath = bp; - } - - public Task GetDirectoryContent() - { - var x = new List(); - - foreach (var directory in Directory.EnumerateDirectories(RealPath)) - { - x.Add(new () - { - Name = System.IO.Path.GetFileName(directory)!, - CreatedAt = DateTime.UtcNow, - UpdatedAt = DateTime.UtcNow, - Size = 0, - IsFile = false - }); - } - - foreach (var file in Directory.GetFiles(RealPath)) - { - x.Add(new () - { - Name = System.IO.Path.GetFileName(file)!, - CreatedAt = File.GetCreationTimeUtc(file), - UpdatedAt = File.GetLastWriteTimeUtc(file), - Size = new System.IO.FileInfo(file).Length, - IsFile = File.Exists(file) - }); - } - - return Task.FromResult(x.ToArray()); - } - - public Task ChangeDirectory(string s) - { - var x = System.IO.Path.Combine(Path, s).Replace("\\", "/") + "/"; - x = x.Replace("//", "/"); - Path = x; - - return Task.CompletedTask; - } - - public Task SetDirectory(string s) - { - Path = s; - return Task.CompletedTask; - } - - public Task GoUp() - { - Path = System.IO.Path.GetFullPath(System.IO.Path.Combine(Path, "..")).Replace("\\", "/").Replace("C:", ""); - return Task.CompletedTask; - } - - public Task ReadFile(FileManagerObject fileManagerObject) - { - return Task.FromResult(File.ReadAllText(RealPath + fileManagerObject.Name)); - } - - public Task WriteFile(FileManagerObject fileManagerObject, string content) - { - File.WriteAllText(RealPath + fileManagerObject.Name, content); - return Task.CompletedTask; - } - - public async Task UploadFile(string name, Stream stream, Action? progressUpdated = null) - { - var fs = File.OpenWrite(RealPath + name); - - var dataStream = new StreamProgressHelper(stream) - { - Progress = i => - { - if (progressUpdated != null) - progressUpdated.Invoke(i); - } - }; - - await dataStream.CopyToAsync(fs); - await fs.FlushAsync(); - fs.Close(); - } - - public Task CreateDirectory(string name) - { - Directory.CreateDirectory(RealPath + name); - return Task.CompletedTask; - } - - public Task GetCurrentPath() - { - return Task.FromResult(Path); - } - - public Task GetDownloadStream(FileManagerObject managerObject) - { - var stream = new FileStream(RealPath + managerObject.Name, FileMode.Open, FileAccess.Read); - return Task.FromResult(stream); - } - - public Task GetDownloadUrl(FileManagerObject managerObject) - { - throw new NotImplementedException(); - } - - public Task Delete(FileManagerObject managerObject) - { - if(managerObject.IsFile) - File.Delete(RealPath + managerObject.Name); - else - Directory.Delete(RealPath + managerObject.Name, true); - - return Task.CompletedTask; - } - - public Task Move(FileManagerObject managerObject, string newPath) - { - if(managerObject.IsFile) - File.Move(RealPath + managerObject.Name, BasePath + newPath); - else - Directory.Move(RealPath + managerObject.Name, BasePath + newPath); - - return Task.CompletedTask; - } - - public Task GetLaunchUrl() - { - throw new DisplayException("WinSCP cannot be launched here"); - } -} \ No newline at end of file diff --git a/Moonlight/App/Models/Files/Accesses/WingsFileAccess.cs b/Moonlight/App/Models/Files/Accesses/WingsFileAccess.cs deleted file mode 100644 index 1d64ab8..0000000 --- a/Moonlight/App/Models/Files/Accesses/WingsFileAccess.cs +++ /dev/null @@ -1,205 +0,0 @@ -using System.Security.Cryptography; -using System.Text; -using System.Web; -using JWT.Algorithms; -using JWT.Builder; -using Moonlight.App.Database.Entities; -using Moonlight.App.Helpers; -using Moonlight.App.Models.Wings.Requests; -using Moonlight.App.Models.Wings.Resources; -using RestSharp; - -namespace Moonlight.App.Models.Files.Accesses; - -public class WingsFileAccess : IFileAccess -{ - private readonly WingsApiHelper WingsApiHelper; - private readonly WingsJwtHelper WingsJwtHelper; - private readonly Database.Entities.Node Node; - private readonly Server Server; - private readonly User User; - private readonly string AppUrl; - - private string Path { get; set; } = "/"; - - public WingsFileAccess( - WingsApiHelper wingsApiHelper, - Server server, - User user, - WingsJwtHelper wingsJwtHelper, - string appUrl) - { - WingsApiHelper = wingsApiHelper; - Node = server.Node; - Server = server; - User = user; - WingsJwtHelper = wingsJwtHelper; - AppUrl = appUrl; - } - - public async Task GetDirectoryContent() - { - var res = await WingsApiHelper.Get(Node, - $"api/servers/{Server.Uuid}/files/list-directory?directory={Path}"); - - var x = new List(); - - foreach (var response in res) - { - x.Add(new() - { - Name = response.Name, - Size = response.File ? response.Size : 0, - CreatedAt = response.Created.Date, - IsFile = response.File, - UpdatedAt = response.Modified.Date - }); - } - - return x.ToArray(); - } - - public Task ChangeDirectory(string s) - { - var x = System.IO.Path.Combine(Path, s).Replace("\\", "/") + "/"; - x = x.Replace("//", "/"); - Path = x; - - return Task.CompletedTask; - } - - public Task SetDirectory(string s) - { - Path = s; - return Task.CompletedTask; - } - - public Task GoUp() - { - Path = System.IO.Path.GetFullPath(System.IO.Path.Combine(Path, "..")).Replace("\\", "/").Replace("C:", ""); - return Task.CompletedTask; - } - - public async Task ReadFile(FileManagerObject fileManagerObject) - { - return await WingsApiHelper.GetRaw(Node, - $"api/servers/{Server.Uuid}/files/contents?file={Path}{fileManagerObject.Name}"); - } - - public async Task WriteFile(FileManagerObject fileManagerObject, string content) - { - await WingsApiHelper.PostRaw(Node, - $"api/servers/{Server.Uuid}/files/write?file={Path}{fileManagerObject.Name}", content); - } - - public async Task UploadFile(string name, Stream dataStream, Action onProgress) - { - var token = WingsJwtHelper.Generate(Node.Token, - claims => { claims.Add("server_uuid", Server.Uuid.ToString()); }); - - var client = new RestClient(); - var request = new RestRequest(); - - if (Node.Ssl) - request.Resource = $"https://{Node.Fqdn}:{Node.HttpPort}/upload/file?token={token}&directory={Path}"; - else - request.Resource = $"http://{Node.Fqdn}:{Node.HttpPort}/upload/file?token={token}&directory={Path}"; - - request.AddParameter("name", "files"); - request.AddParameter("filename", name); - request.AddHeader("Content-Type", "multipart/form-data"); - request.AddHeader("Origin", AppUrl); - request.AddFile("files", () => - { - return new StreamProgressHelper(dataStream) - { - Progress = i => - { - if (onProgress != null) - onProgress.Invoke(i); - } - }; - }, name); - - await client.ExecutePostAsync(request); - - client.Dispose(); - dataStream.Close(); - } - - public async Task CreateDirectory(string name) - { - await WingsApiHelper.Post(Node, $"api/servers/{Server.Uuid}/files/create-directory", - new CreateDirectory() - { - Name = name, - Path = Path - }); - } - - public Task GetCurrentPath() - { - return Task.FromResult(Path); - } - - public Task GetDownloadStream(FileManagerObject managerObject) - { - throw new NotImplementedException(); - } - - public Task GetDownloadUrl(FileManagerObject managerObject) - { - var token = WingsJwtHelper.Generate(Node.Token, claims => - { - claims.Add("server_uuid", Server.Uuid.ToString()); - claims.Add("file_path", HttpUtility.UrlDecode(Path + "/" + managerObject.Name)); - }); - - if (Node.Ssl) - { - return Task.FromResult( - $"https://{Node.Fqdn}:{Node.HttpPort}/download/file?token={token}" - ); - } - else - { - return Task.FromResult( - $"http://{Node.Fqdn}:{Node.HttpPort}/download/file?token={token}" - ); - } - } - - public async Task Delete(FileManagerObject managerObject) - { - await WingsApiHelper.Post(Node, $"api/servers/{Server.Uuid}/files/delete", new DeleteFiles() - { - Root = Path, - Files = new() - { - managerObject.Name - } - }); - } - - public async Task Move(FileManagerObject managerObject, string newPath) - { - await WingsApiHelper.Put(Node, $"api/servers/{Server.Uuid}/files/rename", new RenameFiles() - { - Root = "/", - Files = new[] - { - new RenameFilesData() - { - From = Path + managerObject.Name, - To = newPath - } - } - }); - } - - public Task GetLaunchUrl() - { - return Task.FromResult( - $"sftp://{User.Id}.{StringHelper.IntToStringWithLeadingZeros(Server.Id, 8)}@{Node.Fqdn}:{Node.SftpPort}"); - } -} \ No newline at end of file diff --git a/Moonlight/App/Models/Files/FileContextAction.cs b/Moonlight/App/Models/Files/FileContextAction.cs deleted file mode 100644 index 7570013..0000000 --- a/Moonlight/App/Models/Files/FileContextAction.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Moonlight.App.Models.Files; - -public class FileContextAction -{ - public string Id { get; set; } - public string Name { get; set; } - public Action Action { get; set; } -} \ No newline at end of file diff --git a/Moonlight/App/Models/Files/FileManagerObject.cs b/Moonlight/App/Models/Files/FileManagerObject.cs deleted file mode 100644 index 063d556..0000000 --- a/Moonlight/App/Models/Files/FileManagerObject.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Moonlight.App.Models.Files; - -public class FileManagerObject -{ - public string Name { get; set; } - public bool IsFile { get; set; } - public long Size { get; set; } - public DateTime CreatedAt { get; set; } - public DateTime UpdatedAt { get; set; } -} \ No newline at end of file diff --git a/Moonlight/App/Models/Files/IFileAccess.cs b/Moonlight/App/Models/Files/IFileAccess.cs deleted file mode 100644 index 6792d40..0000000 --- a/Moonlight/App/Models/Files/IFileAccess.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Moonlight.App.Models.Files; - -public interface IFileAccess -{ - public Task GetDirectoryContent(); - public Task ChangeDirectory(string s); - public Task SetDirectory(string s); - public Task GoUp(); - public Task ReadFile(FileManagerObject fileManagerObject); - public Task WriteFile(FileManagerObject fileManagerObject, string content); - public Task UploadFile(string name, Stream stream, Action progressUpdated); - public Task CreateDirectory(string name); - public Task GetCurrentPath(); - public Task GetDownloadStream(FileManagerObject managerObject); - public Task GetDownloadUrl(FileManagerObject managerObject); - public Task Delete(FileManagerObject managerObject); - public Task Move(FileManagerObject managerObject, string newPath); - public Task GetLaunchUrl(); -} \ No newline at end of file diff --git a/Moonlight/Shared/Components/FileManagerPartials/FileManager2.razor b/Moonlight/Shared/Components/FileManagerPartials/FileManager2.razor deleted file mode 100644 index cf8c13b..0000000 --- a/Moonlight/Shared/Components/FileManagerPartials/FileManager2.razor +++ /dev/null @@ -1,529 +0,0 @@ -@using Moonlight.App.Helpers -@using BlazorContextMenu -@using BlazorDownloadFile -@using Logging.Net -@using Moonlight.App.Models.Files -@using Moonlight.App.Services -@using Moonlight.App.Services.Interop - -@inject AlertService AlertService -@inject ToastService ToastService -@inject NavigationManager NavigationManager -@inject SmartTranslateService TranslationService -@inject IBlazorDownloadFileService FileService - -
-@if (Editing == null) -{ -
-
-
- - - - - - - -
-
-
- @if (SelectedFiles.Count == 0) - { -
- - - - -
- } - else - { -
-
- - @(SelectedFiles.Count) - - Selected -
- - -
- } -
-
-
-
-
-
- @{ - var vx = "/"; - } - / - - - - - - @{ - var cp = "/"; - var lp = "/"; - var pathParts = CurrentPath.Replace("\\", "/").Split('/', StringSplitOptions.RemoveEmptyEntries); - foreach (var path in pathParts) - { - lp = cp; - @(path) - - - - - - - cp += path + "/"; - } - } -
-
-
- -
-} -else -{ - if (Loading) - { -
- - Loading - -
- } - else - { - - } -} -
- - - Rename - Move - Archive - Unarchive - Download - Delete - - -@code -{ - [Parameter] - public IFileAccess FileAccess { get; set; } - - // Data - - private List SelectedFiles { get; set; } = new(); - private List Objects { get; set; } = new(); - private string CurrentPath = ""; - - // Search - private string SearchValue = ""; - - private string Search - { - get { return SearchValue; } - set - { - SearchValue = value; - InvokeAsync(StateHasChanged); - } - } - - // States - private bool Loading = false; - - // States - Editor - private FileManagerObject? Editing = null; - private string InitialEditorData = ""; - private string Language = "plaintext"; - - // States - File Upload - private bool Uploading = false; - private int Percent = 0; - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - await RefreshActive(); - } - } - - private async Task RefreshActive() - { - Loading = true; - await InvokeAsync(StateHasChanged); - - await Refresh(false); - - Loading = false; - await InvokeAsync(StateHasChanged); - } - - private async Task Refresh(bool rerender = true) - { - SelectedFiles.Clear(); - Objects.Clear(); - CurrentPath = await FileAccess.GetCurrentPath(); - - var data = await FileAccess.GetDirectoryContent(); - Objects = data.ToList(); - - if (rerender) - await InvokeAsync(StateHasChanged); - } - - private async Task CdPath(string path) - { - await FileAccess.ChangeDirectory(path); - await RefreshActive(); - } - - private async Task SetPath(string path) - { - await FileAccess.SetDirectory(path); - await RefreshActive(); - } - - private async Task OnContextMenuClick(ItemClickEventArgs e) - { - var data = e.Data as FileManagerObject; - - if (data == null) - return; - - switch (e.MenuItem.Id) - { - case "delete": - await FileAccess.Delete(data); - break; - case "download": - if (data.IsFile) - { - try - { - var stream = await FileAccess.GetDownloadStream(data); - await ToastService.Info(TranslationService.Translate("Starting download")); - await FileService.AddBuffer(stream); - await FileService.DownloadBinaryBuffers(data.Name); - } - catch (NotImplementedException) - { - try - { - var url = await FileAccess.GetDownloadUrl(data); - NavigationManager.NavigateTo(url, true); - await ToastService.Info(TranslationService.Translate("Starting download")); - } - catch (Exception exception) - { - await ToastService.Error(TranslationService.Translate("Error starting download")); - Logger.Error("Error downloading file"); - Logger.Error(exception.Message); - } - } - catch (Exception exception) - { - await ToastService.Error(TranslationService.Translate("Error starting download")); - Logger.Error("Error downloading file stream"); - Logger.Error(exception.Message); - } - } - break; - case "rename": - var newName = await AlertService.Text(TranslationService.Translate("Rename"), TranslationService.Translate("Enter a new name"), data.Name); - var path = await FileAccess.GetCurrentPath(); - await FileAccess.Move(data, path + "/" + newName); - break; - } - - await Refresh(false); - } - - private async Task OnFileToggle(ChangeEventArgs obj, FileManagerObject o) - { - if ((bool)obj.Value) - { - if (SelectedFiles.Contains(o)) - return; - - SelectedFiles.Add(o); - await InvokeAsync(StateHasChanged); - } - else - { - if (!SelectedFiles.Contains(o)) - return; - - SelectedFiles.Remove(o); - await InvokeAsync(StateHasChanged); - } - } - - private async Task OnAllFileToggle(ChangeEventArgs obj) - { - if ((bool)obj.Value) - { - foreach (var o in Objects) - { - if (SelectedFiles.Contains(o)) - continue; - - SelectedFiles.Add(o); - } - - await InvokeAsync(StateHasChanged); - } - else - { - foreach (var o in Objects) - { - if (!SelectedFiles.Contains(o)) - continue; - - SelectedFiles.Remove(o); - } - - - await InvokeAsync(StateHasChanged); - } - } - - private async Task CreateFolder() - { - var name = await AlertService.Text(TranslationService.Translate("Create a new folder"), TranslationService.Translate("Enter a name"), ""); - - if (string.IsNullOrEmpty(name)) - return; - - await FileAccess.CreateDirectory(name); - await Refresh(); - } - - private async void SaveFile(string data) - { - if (Editing == null) - return; - - await FileAccess.WriteFile(Editing, data); - Editing = null; - await Refresh(); - } - - private async Task OpenFile(FileManagerObject o) - { - Editing = o; - Loading = true; - await InvokeAsync(StateHasChanged); - - InitialEditorData = await FileAccess.ReadFile(Editing); - Language = MonacoTypeHelper.GetEditorType(Editing.Name); - - Loading = false; - await InvokeAsync(StateHasChanged); - } - - private async void CloseFile() - { - Editing = null; - await InvokeAsync(StateHasChanged); - } - - private async Task Launch() - { - NavigationManager.NavigateTo(await FileAccess.GetLaunchUrl()); - } - - private async Task OnFileChanged(InputFileChangeEventArgs arg) - { - Uploading = true; - await InvokeAsync(StateHasChanged); - - foreach (var browserFile in arg.GetMultipleFiles()) - { - if (browserFile.Size < 1024 * 1024 * 100) - { - Percent = 0; - - try - { - await FileAccess.UploadFile( - browserFile.Name, - browserFile.OpenReadStream(1024 * 1024 * 100), - async (i) => - { - Percent = i; - - Task.Run(() => { InvokeAsync(StateHasChanged); }); - }); - - await Refresh(); - } - catch (Exception e) - { - await ToastService.Error(TranslationService.Translate("An unknown error occured while uploading a file")); - Logger.Error("Error uploading file"); - Logger.Error(e); - } - } - else - { - await ToastService.Error(TranslationService.Translate("The uploaded file should not be bigger than 100MB")); - } - } - - Uploading = false; - await InvokeAsync(StateHasChanged); - - await ToastService.Success(TranslationService.Translate("File upload complete")); - } -} \ No newline at end of file