Skip to content

Commit 0282e19

Browse files
[+] Logo Upload CactuseSecurity#2696
1 parent d465bd7 commit 0282e19

File tree

6 files changed

+131
-49
lines changed

6 files changed

+131
-49
lines changed

roles/lib/files/FWO.Basics/GlobalConstants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public struct GlobalConst
4848
public const string ChromeBinPathLinux = "/usr/local/fworch/bin";
4949
public const string TestPDFFilePath = "pdffile.pdf";
5050
public const string TestPDFHtmlTemplate = "<html><body><h1>test</h1><h2>test mit puppteer</h2></body></html>";
51+
52+
public const string CustomLogoPath = "/usr/local/fworch/ui/files/FWO.UI/wwwroot/images";
5153
}
5254

5355
public struct PageName
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
namespace FWO.Ui.Data
1+
namespace FWO.Ui.Data
22
{
33
public enum FileUploadCase
44
{
55
Undefined,
6-
ImportAppServerFromCSV
6+
ImportAppServerFromCSV,
7+
CustomLogoUpload
78
}
89
}

roles/ui/files/FWO.UI/Pages/Settings/SettingsDefaults.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
<div class="form-group row" data-toggle="tooltip" title="">
6666
<label class="col-form-label col-sm-4">asdasdasd:</label>
6767
<div class="col-sm-4">
68-
<FileUpload TImportResult="ErrorBaseModel" SupportedFileFormats=".png|.jpg" AuthorizedRoles="@Roles.Admin"></FileUpload>
68+
<FileUpload UploadCase="FileUploadCase.CustomLogoUpload" TUploadResult="ErrorBaseModel" SupportedFileFormats=".png|.jpg" AuthorizedRoles="@Roles.Admin"></FileUpload>
6969
</div>
7070
</div>
7171
<hr />

roles/ui/files/FWO.UI/Pages/Settings/SettingsModelling.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
<div class="form-group row mt-4" data-toggle="tooltip" title="@(userConfig.PureLine("H9055"))">
8484
<label class="col-form-label col-sm-4">@userConfig.GetText("import_app_server"):</label>
8585
<div class="row col-sm-6">
86-
<FileUpload SupportedFileFormats=".csv" AuthorizedRoles="@Roles.Admin" OnImportSuccess="OnAppServerImportSuccess" OnAddAppServerError="OnAddAppServerError" TImportResult="CSVFileUploadErrorModel" OnAfterImportResults="OnAfterImportResults"></FileUpload>
86+
<FileUpload SupportedFileFormats=".csv" AuthorizedRoles="@Roles.Admin" TUploadResult="ErrorBaseModel" UploadCase="FileUploadCase.CustomLogoUpload"></FileUpload>
8787
</div>
8888
</div>
8989
<hr />

roles/ui/files/FWO.UI/Services/FileUploadService.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,20 @@ public async Task ReadFileToBytes(InputFileChangeEventArgs args)
5151
List<TError>? importErrors = errors is not null ? [.. errors.Cast<TError>()] : default;
5252

5353
return (success, importErrors);
54+
}
55+
throw new NotImplementedException();
56+
}
57+
58+
public async Task<(bool success, TError? error)> ImportCustomLogo<TError>(FileUploadCase fileUploadCase, string filename)
59+
where TError : ErrorBaseModel
60+
{
61+
if(fileUploadCase == FileUploadCase.CustomLogoUpload)
62+
{
63+
(bool success, ErrorBaseModel? error) = await SaveCustomLogo(filename);
64+
65+
TError? logoUploadError = error is not null ? (TError)error : default;
66+
67+
return (success, logoUploadError);
5468
}
5569

5670
throw new NotImplementedException();
@@ -175,5 +189,27 @@ private static bool IsHeader(string[] columns)
175189
return (false, exception);
176190
}
177191
}
192+
193+
private async Task<(bool success, ErrorBaseModel? error)> SaveCustomLogo(string filename)
194+
{
195+
string extension = Path.GetExtension(filename);
196+
string path = Path.Combine(GlobalConst.CustomLogoPath, "CustomLogo" + extension);
197+
198+
try
199+
{
200+
if(!Directory.Exists(GlobalConst.CustomLogoPath))
201+
{
202+
Directory.CreateDirectory(GlobalConst.CustomLogoPath);
203+
}
204+
205+
await File.WriteAllBytesAsync(path, UploadedData);
206+
207+
return (true, default);
208+
}
209+
catch(Exception ex)
210+
{
211+
return (false, new ErrorBaseModel() { InternalException = ex, MessageType = MessageType.Error, Message = ex.Message});
212+
}
213+
}
178214
}
179215
}

roles/ui/files/FWO.UI/Shared/FileUpload.razor

Lines changed: 88 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,71 +9,87 @@
99

1010
<div class="row">
1111
<div class="col-sm-8">
12-
<AuthorizeView Roles="@AuthorizedRoles">
13-
<Authorized>
14-
<label class="btn btn-sm @(ImportDisabled ? "btn-primary" : "btn-success")" for="fileUpload">
15-
@(ModellingHandlerBase.DisplayButton(userConfig, "select_file", Icons.Add, "select_file"))
16-
</label>
17-
<InputFile id="fileUpload" hidden accept="@SupportedFileFormats" OnChange="@SingleUpload" />
18-
@if (InputFileChangeEventArgs is not null && !string.IsNullOrEmpty(InputFileChangeEventArgs.File.Name))
19-
{
20-
<label class="d-inline">@InputFileChangeEventArgs.File.Name</label>
21-
}
22-
<button type="button" disabled="@(Loading || ImportDisabled)" class="btn btn-sm @(ImportDisabled ? "btn-primary" : "btn-success") mt-2 w-100" @onclick="ImportCSV">
23-
@if (Loading)
12+
@if (UploadCase == FileUploadCase.ImportAppServerFromCSV)
13+
{
14+
<AuthorizeView Roles="@AuthorizedRoles">
15+
<Authorized>
16+
<label class="btn btn-sm @(UploadDisabled ? "btn-primary" : "btn-success")" for="fileUpload">
17+
@(ModellingHandlerBase.DisplayButton(userConfig, "select_file", Icons.Add, "select_file"))
18+
</label>
19+
<InputFile id="fileUpload" hidden accept="@SupportedFileFormats" OnChange="@SingleUpload" />
20+
@if(InputFileChangeEventArgs is not null && !string.IsNullOrEmpty(InputFileChangeEventArgs.File.Name))
2421
{
25-
<div class="spinner-border spinner-border-sm" role="status">
26-
<span class="visually-hidden">@(userConfig.GetText("loading"))</span>
27-
</div>
22+
<label class="d-inline">@InputFileChangeEventArgs.File.Name</label>
2823
}
29-
<span class="ms-1">@(userConfig.GetText("import"))</span>
30-
</button>
31-
@if (ShowAlert)
32-
{
33-
<div class="alert alert-warning mt-2" role="alert">
34-
<span>@userConfig.GetText("E7014")</span>
35-
</div>
36-
}
37-
</Authorized>
38-
<NotAuthorized>
39-
<button type="button" disabled class="btn btn-sm btn-primary">
40-
<span class="ms-2">
24+
<button type="button" disabled="@(Loading || UploadDisabled)" class="btn btn-sm @(UploadDisabled ? "btn-primary" : "btn-success") mt-2 w-100" @onclick="ImportCSV">
25+
@if(Loading)
26+
{
27+
<div class="spinner-border spinner-border-sm" role="status">
28+
<span class="visually-hidden">@(userConfig.GetText("loading"))</span>
29+
</div>
30+
}
31+
<span class="ms-1">@(userConfig.GetText("import"))</span>
32+
</button>
33+
</Authorized>
34+
<NotAuthorized>
35+
<button type="button" disabled class="btn btn-sm btn-primary">
36+
<span class="ms-2">
37+
@(ModellingHandlerBase.DisplayButton(userConfig, "select_file", Icons.Add, "select_file"))
38+
</span>
39+
</button>
40+
<button type="button" disabled class="btn btn-sm btn-primary mt-2 w-100">
41+
@(ModellingHandlerBase.DisplayButton(userConfig, "import", Icons.Import, "import"))
42+
</button>
43+
</NotAuthorized>
44+
</AuthorizeView>
45+
}else if (UploadCase == FileUploadCase.CustomLogoUpload)
46+
{
47+
<AuthorizeView Roles="@AuthorizedRoles">
48+
<Authorized>
49+
<label class="btn btn-sm @(UploadDisabled ? "btn-primary" : "btn-success")" for="fileUpload">
4150
@(ModellingHandlerBase.DisplayButton(userConfig, "select_file", Icons.Add, "select_file"))
42-
</span>
43-
</button>
44-
<button type="button" disabled class="btn btn-sm btn-primary mt-2 w-100">
45-
@(ModellingHandlerBase.DisplayButton(userConfig, "import", Icons.Import, "import"))
46-
</button>
47-
</NotAuthorized>
48-
</AuthorizeView>
51+
</label>
52+
<InputFile id="fileUpload" hidden accept="@SupportedFileFormats" OnChange="@SingleUpload" />
53+
@if(InputFileChangeEventArgs is not null && !string.IsNullOrEmpty(InputFileChangeEventArgs.File.Name))
54+
{
55+
<label class="d-inline">@InputFileChangeEventArgs.File.Name</label>
56+
}
57+
</Authorized>
58+
<NotAuthorized>
59+
</NotAuthorized>
60+
</AuthorizeView>
61+
}
4962
</div>
5063
</div>
5164
@code {
52-
private bool ShowAlert { get; set; }
5365
InputFileChangeEventArgs? InputFileChangeEventArgs;
5466

55-
private bool ImportDisabled { get; set; } = true;
67+
private bool UploadDisabled { get; set; } = true;
5668
private bool Loading { get; set; }
5769

5870
[Parameter, EditorRequired]
5971
public string? AuthorizedRoles { get; set; }
6072

6173
[Parameter]
62-
public EventCallback<(Exception, string?)> OnAddAppServerError { get; set; }
74+
public EventCallback<(Exception, string?)> OnError { get; set; }
6375

6476
[Parameter]
6577
public EventCallback OnImportSuccess { get; set; }
6678

67-
@typeparam TImportResult
79+
@typeparam TUploadResult
80+
6881
[Parameter]
69-
public EventCallback<(List<string>? success, List<TImportResult>? errors)> OnAfterImportResults { get; set; }
82+
public EventCallback<(List<string>? success, List<TUploadResult>? errors)> OnAfterImportResults { get; set; }
7083

7184
/// <summary>
7285
/// Defines a set of supported file formats. E.g.: '.csv,.pdf'
7386
/// </summary>
7487
[Parameter, EditorRequired]
7588
public string SupportedFileFormats { get; set; } = "";
7689

90+
[Parameter, EditorRequired]
91+
public FileUploadCase UploadCase { get; set; } = FileUploadCase.Undefined;
92+
7793
private List<AppServerType> AppServerTypes = new();
7894

7995
protected override void OnParametersSet()
@@ -105,19 +121,18 @@
105121

106122
private void SingleUpload(InputFileChangeEventArgs e)
107123
{
108-
ImportDisabled = true;
124+
UploadDisabled = true;
109125
InputFileChangeEventArgs = e;
110-
ShowAlert = false;
111126

112127
if (InputFileChangeEventArgs.FileCount == 0)
113128
return;
114129

115-
ImportDisabled = false;
130+
UploadDisabled = false;
116131
}
117132

118133
private async Task ImportCSV()
119134
{
120-
if (ImportDisabled || InputFileChangeEventArgs is null)
135+
if(UploadDisabled || InputFileChangeEventArgs is null)
121136
return;
122137

123138
if (InputFileChangeEventArgs.File is null)
@@ -133,7 +148,7 @@
133148
catch (Exception ex)
134149
{
135150
Loading = false;
136-
await OnAddAppServerError.InvokeAsync((ex, $"{userConfig.GetText("file_upload_failed")} {ex.Message}"));
151+
await OnError.InvokeAsync((ex, $"{userConfig.GetText("file_upload_failed")} {ex.Message}"));
137152
return;
138153
}
139154

@@ -145,10 +160,38 @@
145160
}
146161
else
147162
{
148-
List<TImportResult> importErrors = errors.Cast<TImportResult>().ToList();
163+
List<TUploadResult> importErrors = errors.Cast<TUploadResult>().ToList();
149164
await OnAfterImportResults.InvokeAsync((success, importErrors));
150165
}
151166

152167
Loading = false;
153168
}
169+
170+
private async Task UploadCustomLogo()
171+
{
172+
if(UploadDisabled || InputFileChangeEventArgs is null)
173+
return;
174+
175+
if(InputFileChangeEventArgs.File is null)
176+
return;
177+
178+
Loading = true;
179+
180+
FileUploadService fileUploadService = new(apiConnection, userConfig);
181+
182+
try
183+
{
184+
await fileUploadService.ReadFileToBytes(InputFileChangeEventArgs);
185+
}
186+
catch(Exception ex)
187+
{
188+
Loading = false;
189+
await OnError.InvokeAsync((ex, $"{userConfig.GetText("file_upload_failed")} {ex.Message}"));
190+
return;
191+
}
192+
193+
var bla = await fileUploadService.ImportCustomLogo<ErrorBaseModel>(UploadCase, InputFileChangeEventArgs.File.Name);
194+
195+
Loading = false;
196+
}
154197
}

0 commit comments

Comments
 (0)