V10: Fix foreign key constraints when using external login provider for members (#12872)

* Move role saving out of UpdateMemberProperties

* Add missing delete clauses

* Fix token for users too

* Fix deleting user
This commit is contained in:
Mole
2022-08-22 15:18:12 +02:00
committed by GitHub
parent d63e7277cb
commit f8e20a9db9
3 changed files with 26 additions and 10 deletions

View File

@@ -490,8 +490,7 @@ public class MemberRepository : ContentRepositoryBase<int, IMember, MemberReposi
GetBaseQuery(isCount ? QueryType.Count : QueryType.Single);
protected override string GetBaseWhereClause() // TODO: can we kill / refactor this?
=>
"umbracoNode.id = @id";
=> "umbracoNode.id = @id";
// TODO: document/understand that one
protected Sql<ISqlContext> GetNodeIdQueryWithPropertyData() =>
@@ -526,6 +525,8 @@ public class MemberRepository : ContentRepositoryBase<int, IMember, MemberReposi
"DELETE FROM " + Constants.DatabaseSchema.Tables.PropertyData +
" WHERE versionId IN (SELECT id FROM " + Constants.DatabaseSchema.Tables.ContentVersion +
" WHERE nodeId = @id)",
$"DELETE FROM {Constants.DatabaseSchema.Tables.ExternalLoginToken} WHERE externalLoginId = (SELECT id FROM {Constants.DatabaseSchema.Tables.ExternalLogin} WHERE userOrMemberKey = (SELECT uniqueId from {Constants.DatabaseSchema.Tables.Node} where id = @id))",
$"DELETE FROM {Constants.DatabaseSchema.Tables.ExternalLogin} WHERE userOrMemberKey = (SELECT uniqueId from {Constants.DatabaseSchema.Tables.Node} where id = @id)",
"DELETE FROM cmsMember2MemberGroup WHERE Member = @id",
"DELETE FROM cmsMember WHERE nodeId = @id",
"DELETE FROM " + Constants.DatabaseSchema.Tables.ContentVersion + " WHERE nodeId = @id",

View File

@@ -526,11 +526,22 @@ SELECT 4 AS [Key], COUNT(id) AS [Value] FROM umbracoUser WHERE userDisabled = 0
$"DELETE FROM {Constants.DatabaseSchema.Tables.User2UserGroup} WHERE userId = @id",
$"DELETE FROM {Constants.DatabaseSchema.Tables.User2NodeNotify} WHERE userId = @id",
$"DELETE FROM {Constants.DatabaseSchema.Tables.UserStartNode} WHERE userId = @id",
$"DELETE FROM {Constants.DatabaseSchema.Tables.ExternalLoginToken} WHERE externalLoginId = (SELECT id FROM {Constants.DatabaseSchema.Tables.ExternalLogin} WHERE userOrMemberKey = @key)",
$"DELETE FROM {Constants.DatabaseSchema.Tables.ExternalLogin} WHERE userOrMemberKey = @key",
$"DELETE FROM {Constants.DatabaseSchema.Tables.User} WHERE id = @id",
$"DELETE FROM {Constants.DatabaseSchema.Tables.ExternalLogin} WHERE id = @id"
};
return list;
}
protected override void PersistDeletedItem(IUser entity)
{
IEnumerable<string> deletes = GetDeleteClauses();
foreach (var delete in deletes)
{
Database.Execute(delete, new { id = GetEntityId(entity), key = entity.Key });
}
entity.DeleteDate = DateTime.Now;
}
protected override void PersistNewItem(IUser entity)
{

View File

@@ -107,7 +107,7 @@ public class MemberUserStore : UmbracoUserStore<MemberIdentityUser, UmbracoIdent
? Constants.Security.DefaultMemberTypeAlias
: user.MemberTypeAlias!);
UpdateMemberProperties(memberEntity, user);
UpdateMemberProperties(memberEntity, user, out bool _);
// create the member
_memberService.Save(memberEntity);
@@ -188,9 +188,15 @@ public class MemberUserStore : UmbracoUserStore<MemberIdentityUser, UmbracoIdent
var isLoginsPropertyDirty = user.IsPropertyDirty(nameof(MemberIdentityUser.Logins));
var isTokensPropertyDirty = user.IsPropertyDirty(nameof(MemberIdentityUser.LoginTokens));
if (UpdateMemberProperties(found, user))
if (UpdateMemberProperties(found, user, out var updateRoles))
{
_memberService.Save(found);
if (updateRoles)
{
var identityUserRoles = user.Roles.Select(x => x.RoleId).ToArray();
_memberService.ReplaceRoles(new[] { found.Id }, identityUserRoles);
}
}
if (isLoginsPropertyDirty)
@@ -673,9 +679,10 @@ public class MemberUserStore : UmbracoUserStore<MemberIdentityUser, UmbracoIdent
return user;
}
private bool UpdateMemberProperties(IMember member, MemberIdentityUser identityUser)
private bool UpdateMemberProperties(IMember member, MemberIdentityUser identityUser, out bool updateRoles)
{
var anythingChanged = false;
updateRoles = false;
// don't assign anything if nothing has changed as this will trigger the track changes of the model
if (identityUser.IsPropertyDirty(nameof(MemberIdentityUser.LastLoginDateUtc))
@@ -787,10 +794,7 @@ public class MemberUserStore : UmbracoUserStore<MemberIdentityUser, UmbracoIdent
if (identityUser.IsPropertyDirty(nameof(MemberIdentityUser.Roles)))
{
anythingChanged = true;
var identityUserRoles = identityUser.Roles.Select(x => x.RoleId).ToArray();
_memberService.ReplaceRoles(new[] { member.Id }, identityUserRoles);
updateRoles = true;
}
// reset all changes