private async Task SyncRoles(User user)
        {
            var adminRole = await SecurityRole.SelectByCode("Admins");

            var dwUserToRole = await SecurityUserToSecurityRole.SelectByUser(user.WorkflowUserId.Value);

            if (user.HasRole(RoleName.SuperAdmin))
            {
                // Make sure User is in "Admins" Role
                if (!dwUserToRole.Any(utr => utr.SecurityRoleId == adminRole.Id))
                {
                    var newAdmin = new SecurityUserToSecurityRole
                    {
                        Id             = Guid.NewGuid(),
                        SecurityRoleId = adminRole.Id,
                        SecurityUserId = user.WorkflowUserId.Value
                    };

                    await SecurityUserToSecurityRole.ApplyAsync(newAdmin);
                }
            }
            else
            {
                // Make sure User is not "Admins" Role
                var userAdminRole = dwUserToRole.FirstOrDefault(dtr => dtr.SecurityRoleId == adminRole.Id);
                if (userAdminRole != null)
                {
                    await SecurityUserToSecurityRole.DeleteAsync(userAdminRole.Id);
                }
            }
        }
        private Dictionary <Guid, SecurityUserToSecurityRole> GetHashDwAdmins(List <Guid> userids)
        {
            var adminRole         = SecurityRole.SelectByCode("Admins").Result;
            var usersToAdminRoles = SecurityUserToSecurityRole.SelectByRole(adminRole.Id).Result;
            var hash = usersToAdminRoles
                       .Where(ur => ur.SecurityRoleId == adminRole.Id && userids.Any(uid => uid == ur.SecurityUserId))
                       .ToDictionary(ur => ur.SecurityUserId, ur => ur);

            return(hash);
        }
Esempio n. 3
0
        public IEnumerable <string> RoleGet(ProcessInstance processInstance, WorkflowRuntime runtime, string parameter)
        {
            var role = SecurityRole.SelectByCode(parameter).Result;

            if (role == null)
            {
                return(new List <string>());
            }
            var roleUserModel = SecurityUserToSecurityRole.SelectByRole(role.Id).Result;

            return(roleUserModel.Select(r => r.SecurityUserId.ToString()).Distinct());
        }
Esempio n. 4
0
        public static async Task CheckDefaultRole(Guid userId, string roleCode)
        {
            if (await SecurityUserToSecurityRole.HasUserRole(userId, roleCode))
            {
                return;
            }

            var role = await SecurityRole.SelectByCode(roleCode);

            if (role != null)
            {
                var suroles = new SecurityUserToSecurityRole()
                {
                    Id             = Guid.NewGuid(),
                    SecurityRoleId = role.Id,
                    SecurityUserId = userId
                };
                await suroles.ApplyAsync();
            }
        }
        private async Task SyncDatabaseTablesAsync()
        {
            // Remove DWUsers that are not in Users
            var users = UserRepository
                        .Get()
                        .Include(u => u.UserRoles)
                        .ThenInclude(ur => ur.Role)
                        .ToList();
            var dwusers     = SecurityUser.SelectAsync().Result;
            var hashUsers   = GetHashUsers(users);
            var hashDwUsers = GetHashDwUsers(dwusers);
            var removeUsers = hashDwUsers.Keys.Except(hashUsers.Keys).ToList();

            if (removeUsers.Any())
            {
                try
                {
                    // Must remove SecurityUserToSecurityRole first or there
                    // would be an exception attempting to delete the user where
                    // the relationship is still there
                    var removeAdmins = GetHashDwAdmins(removeUsers);
                    await SecurityUserToSecurityRole.DeleteAsync(removeAdmins.Values.ToList());

                    await SecurityUser.DeleteAsync(removeUsers);

                    hashDwUsers = hashDwUsers
                                  .Where(kvp => !removeUsers.Contains(kvp.Key))
                                  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
                }
                catch (Exception ex)
                {
                    // TODO: SendNotification
                    Log.Error(ex, $"Failed to Delete DwSecurityUsers: {String.Join(", ", removeUsers.ToArray())}");
                }
            }

            // Add DWUsers where User.WorkflowUserId is null
            foreach (var user in users.Where(user => !user.WorkflowUserId.HasValue))
            {
                try
                {
                    var dwuser = await CreateDwUser(user);

                    hashDwUsers.Add(dwuser.Id, dwuser);
                    hashUsers.Add(user.WorkflowUserId.Value, user);
                }
                catch (Exception ex)
                {
                    // TODO: SendNotification
                    Log.Error(ex, $"Failed to Create DwSecurityUser for User: id={user.Id}, name={user.Name}");
                }
            }

            // Sync properties
            foreach (var user in users)
            {
                try
                {
                    var dwuser = hashDwUsers[user.WorkflowUserId.Value];
                    dwuser.StartTracking();
                    SyncUserToDwUser(user, dwuser);
                    await dwuser.ApplyAsync();
                    await EnsureSecurityCredentials(user, dwuser);
                    await SyncRoles(user);
                }
                catch (Exception ex)
                {
                    // TODO: SendNotification
                    Log.Error(ex, $"Failed to Sync DwSecurityUser To User: id={user.Id}, name={user.Name}, WorkflowUserId={user.WorkflowUserId.GetValueOrDefault()}");
                }
            }
        }