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:
@@ -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",
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user