From af971b7b834bec982d0459a875739f01e4f9bac9 Mon Sep 17 00:00:00 2001 From: SysAdmin Date: Wed, 25 Feb 2026 22:32:11 +0000 Subject: [PATCH] fix(sync): normalize username to lowercase for Mattermost and Gitea password sync Mattermost and Gitea store usernames as lowercase but SilverDESK passes the original case (e.g. "Merlin" instead of "merlin"), causing 404/400 errors on case-sensitive API lookups. Co-Authored-By: Claude Opus 4.6 --- BlazorApp/Services/ProvisioningService.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/BlazorApp/Services/ProvisioningService.cs b/BlazorApp/Services/ProvisioningService.cs index 73d36f7..647164e 100644 --- a/BlazorApp/Services/ProvisioningService.cs +++ b/BlazorApp/Services/ProvisioningService.cs @@ -193,26 +193,29 @@ public class ProvisioningService public async Task<(bool Success, string Message)> SyncPasswordAsync(string username, string newPassword) { + // Normalize username to lowercase - Mattermost and Gitea store usernames as lowercase + // and their API lookups are case-sensitive + var normalizedUsername = username.ToLowerInvariant(); var results = new List(); var allSuccess = true; // 1. Mattermost - need to look up user ID first - var (mmOk, mmMsg) = await UpdateMattermostPasswordAsync(username, newPassword); + var (mmOk, mmMsg) = await UpdateMattermostPasswordAsync(normalizedUsername, newPassword); results.Add($"Mattermost: {mmMsg}"); if (!mmOk) allSuccess = false; // 2. Mailcow - var (mailOk, mailMsg) = await UpdateMailcowPasswordAsync(username, newPassword); + var (mailOk, mailMsg) = await UpdateMailcowPasswordAsync(normalizedUsername, newPassword); results.Add($"Mailcow: {mailMsg}"); if (!mailOk) allSuccess = false; // 3. Gitea - var (giteaOk, giteaMsg) = await UpdateGiteaPasswordAsync(username, newPassword); + var (giteaOk, giteaMsg) = await UpdateGiteaPasswordAsync(normalizedUsername, newPassword); results.Add($"Gitea: {giteaMsg}"); if (!giteaOk) allSuccess = false; var summary = string.Join("; ", results); - _logger.LogInformation("Password sync for {Username}: {Summary}", username, summary); + _logger.LogInformation("Password sync for {Username} (normalized: {NormalizedUsername}): {Summary}", username, normalizedUsername, summary); return (allSuccess, summary); }