Skip to content

Commit 36eeb98

Browse files
committed
Add validation to reject empty key names
- KeySyncService: Validate key name in ApplyEntryChangeAsync, skip with warning - ResourceService: Validate key name in CreateResourceKeyAsync, return error - CreateResourceKeyRequest: Add [MinLength(1)] attribute for API validation
1 parent c7bb314 commit 36eeb98

3 files changed

Lines changed: 21 additions & 0 deletions

File tree

cloud/src/LrmCloud.Api/Services/KeySyncService.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ public async Task<KeySyncPushResponse> PushAsync(
6565
{
6666
var result = await ApplyEntryChangeAsync(projectId, entry, ct);
6767

68+
if (result.Error != null)
69+
{
70+
// Skip invalid entries (e.g., empty key names)
71+
_logger.LogWarning("Skipping entry due to validation error: {Error}", result.Error);
72+
continue;
73+
}
74+
6875
if (result.IsConflict)
6976
{
7077
response.Conflicts.Add(result.Conflict!);
@@ -371,6 +378,12 @@ private async Task<EntryChangeResult> ApplyEntryChangeAsync(
371378
EntryChangeDto entry,
372379
CancellationToken ct)
373380
{
381+
// Validate key name
382+
if (string.IsNullOrWhiteSpace(entry.Key))
383+
{
384+
return new EntryChangeResult { Error = "Key name cannot be empty" };
385+
}
386+
374387
// Find or create the resource key
375388
var resourceKey = await _db.ResourceKeys
376389
.Include(k => k.Translations)
@@ -625,6 +638,7 @@ private class EntryChangeResult
625638
public string? BeforeValue { get; set; }
626639
public string? BeforeHash { get; set; }
627640
public string? BeforeComment { get; set; }
641+
public string? Error { get; set; }
628642
}
629643

630644
private async Task<EntryDeletionResult> ApplyEntryDeletionAsync(

cloud/src/LrmCloud.Api/Services/ResourceService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ public async Task<PagedResult<ResourceKeyDetailDto>> GetResourceKeysPagedAsync(
160160
return (false, null, "You don't have permission to manage resources in this project");
161161
}
162162

163+
// Validate key name
164+
if (string.IsNullOrWhiteSpace(request.KeyName))
165+
{
166+
return (false, null, "Key name cannot be empty");
167+
}
168+
163169
// Check if key already exists
164170
var exists = await _db.ResourceKeys
165171
.AnyAsync(k => k.ProjectId == projectId && k.KeyName == request.KeyName);

cloud/src/LrmCloud.Shared/DTOs/Resources/CreateResourceKeyRequest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace LrmCloud.Shared.DTOs.Resources;
88
public class CreateResourceKeyRequest
99
{
1010
[Required(ErrorMessage = "Key name is required")]
11+
[MinLength(1, ErrorMessage = "Key name cannot be empty")]
1112
[MaxLength(500, ErrorMessage = "Key name must not exceed 500 characters")]
1213
public required string KeyName { get; set; }
1314

0 commit comments

Comments
 (0)