From a6e58ee8806533390bce22603040c9a956949007 Mon Sep 17 00:00:00 2001 From: LD-Reborn Date: Sun, 16 Nov 2025 21:07:15 +0100 Subject: [PATCH] Fixed username update or user delete does not cause asset ownership update --- src/Controllers/UsersController.cs | 6 ++++++ src/Helpers/SynchronizationHelper.cs | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/Helpers/SynchronizationHelper.cs diff --git a/src/Controllers/UsersController.cs b/src/Controllers/UsersController.cs index 4a2a22d..8b3f85f 100644 --- a/src/Controllers/UsersController.cs +++ b/src/Controllers/UsersController.cs @@ -51,7 +51,9 @@ public class UsersController : Controller { try { + var syncAssetOwnership = SynchronizationHelper.SyncAssetOwnership(_ldap, uid, ""); await _ldap.DeleteUserAsync(uid); + await syncAssetOwnership; return new UsersDeleteRequestModel(true); } catch (Exception ex) @@ -122,8 +124,10 @@ public class UsersController : Controller UserModel? user = null; if (requestModel.NewUid is not null && requestModel.NewUid.Length > 0) { + var syncAssetOwnership = SynchronizationHelper.SyncAssetOwnership(_ldap, uid, requestModel.NewUid); await _ldap.UpdateUser(uid, "uid", requestModel.NewUid); uid = requestModel.NewUid; + await syncAssetOwnership; } if (requestModel.Title is not null) { @@ -166,8 +170,10 @@ public class UsersController : Controller } if (newUid != uid) { + var syncAssetOwnership = SynchronizationHelper.SyncAssetOwnership(_ldap, uid, newUid); await _ldap.UpdateUser(uid, "uid", newUid); uid = newUid; + await syncAssetOwnership; } return new() { Success = true, NewUid = uid }; } catch (Exception ex) diff --git a/src/Helpers/SynchronizationHelper.cs b/src/Helpers/SynchronizationHelper.cs new file mode 100644 index 0000000..39e2c18 --- /dev/null +++ b/src/Helpers/SynchronizationHelper.cs @@ -0,0 +1,25 @@ +using Berufsschule_HAM.Models; +using Berufsschule_HAM.Services; + +namespace Berufsschule_HAM.Helpers; +public static class SynchronizationHelper +{ + public static async Task SyncAssetOwnership(LdapService ldap, string oldName, string newName) + { + bool remove = string.IsNullOrEmpty(newName); + string uidString = $"uid={newName}"; + IEnumerable assets = await ldap.ListDeviceAsync(); + var tasks = assets.Where(asset => asset.Owner == $"uid={oldName}").ToList().Select(async asset => + { + if (remove) + { + await ldap.DeleteAttribute(ldap.AssetsBaseDn, "cn", asset.Cn, "owner"); + } + else + { + await ldap.UpdateAsset(asset.Cn, "owner", uidString); + } + }); + await Task.WhenAll(tasks); + } +} \ No newline at end of file