public IDictionary<string, User> GetDirectoryUsers() {
            IDictionary<string, User> users = new Dictionary<string, User>();
            try {
                IList<DirectoryUser> directoryUsers = _directoryReader.GetUsers();

                logger.Info(directoryUsers.Count + " directory members retrieved.");
                
                //Get the Ldapuser data into a Provisioning.User collection.
                foreach (DirectoryUser directoryUser in directoryUsers) {
                    string userName = directoryUser.Username.ToLowerInvariant();

                    if (!users.ContainsKey(userName)) {
                        User user = new User();
                        user.Username = directoryUser.Username;
                        user.FullName = directoryUser.FullName;
                        user.Email = directoryUser.Email;
                        user.Nickname = directoryUser.Nickname;
                        users.Add(userName, user);

                        logger.Debug("Member retrieved from directory: " + user.Username);
                    } else {
                        logger.Error("Duplicate username found in directory: " + directoryUser.Username +
                                     "; ignoring user with duplicate username.");
                    }
                }
            } catch (Exception ex) {
                logger.ErrorException("Error retrieving users from Directory", ex);
                throw;
            }
            return users;
        }
        public void DeleteVersionOneMember(User userToDelete) {
            string uname = userToDelete.Username;

            try {
                Oid memberOid = userToDelete.V1MemberAsset.Oid;

                IOperation deleteMember = _model.GetOperation(V1Constants.DELETE);
                _services.ExecuteOperation(deleteMember, memberOid);

                logger.Info("Member with username '" + uname + "' has been DELETED in the VersionOne system.");
            } catch (Exception ex) {
                logger.ErrorException(
                    "Attempt to delete Member with username '" + uname + "' in the VersionOne system has FAILED.", ex);
            }
        }
        public void ReactivateVersionOneMember(User userToReactivate) {
            /***
             * Reactivation is subject to a few parameters set in configuration.  
             * These determine the user's Project Access, Default Role, and Password upon reactivation.
             ****/

            string username = userToReactivate.Username;
            Oid memberOid = userToReactivate.V1MemberAsset.Oid;

            try {
                Asset member = userToReactivate.V1MemberAsset;

                //Reactivate the user
                IOperation reactivateMember = _model.GetOperation(V1Constants.REACTIVATE);
                _services.ExecuteOperation(reactivateMember, memberOid);

                //Assign the user a new password
                IAttributeDefinition passwordAttribute = _model.GetAttributeDefinition(V1Constants.PASSWORD);
                string newPassword = GeneratePassword(username);
                member.SetAttributeValue(passwordAttribute, newPassword);
                _services.Save(member);


                _smtpAdapter.SendUserNotification(username, newPassword, userToReactivate.Email);
                logger.Info("Member with username '" + username + "' has been REACTIVATED in the VersionOne system.");
            } catch (Exception ex) {
                logger.ErrorException(
                    "Attempt to reactivate Member with username '" + username + "' in the VersionOne system has FAILED." +
                    ex, ex);
            }
        }
        private void NotifyUser(User user, string username, string password) {
            try {
                _smtpAdapter.SendUserNotification(username, password, user.Email);

            } catch (Exception error) {
                logger.Error("Failed to send notification to user: "******": " + error.Message);
            }
        }
        private void CreateNewVersionOneMember(User user) {
            string username = user.Username;
            string password = "";
            if (!UseIntegratedAuthorization()) {
                password = GeneratePassword(username);
            }

            try {
                IAssetType memberType = _model.GetAssetType(V1Constants.MEMBER);
                Asset newMember = _services.New(memberType, null);
                IAttributeDefinition usernameAttribute = memberType.GetAttributeDefinition("Username");
                IAttributeDefinition passwordAttribute = memberType.GetAttributeDefinition("Password");
                IAttributeDefinition nameAttribute = memberType.GetAttributeDefinition("Name");
                IAttributeDefinition nicknameAttribute = memberType.GetAttributeDefinition("Nickname");
                IAttributeDefinition emailAttribute = memberType.GetAttributeDefinition("Email");
                IAttributeDefinition defaultRoleAttribute = memberType.GetAttributeDefinition("DefaultRole");
                newMember.SetAttributeValue(usernameAttribute, username);
                newMember.SetAttributeValue(passwordAttribute, password);
                newMember.SetAttributeValue(nameAttribute, user.FullName);
                newMember.SetAttributeValue(nicknameAttribute, user.Nickname);
                newMember.SetAttributeValue(emailAttribute, user.Email);
                newMember.SetAttributeValue(defaultRoleAttribute, this._defaultRole);
                _services.Save(newMember);
                user.V1MemberAsset = newMember;


                logger.Info("Member with username '" + username + "' has been CREATED in the VersionOne system.");
                NotifyUser(user, username, password);
            } catch (Exception ex) {
                logger.ErrorException(
                    "Attempt to create Member with username '" + username + "' in the VersionOne system has FAILED.", ex);
            }
        }
        private void DeactivateVersionOneMember(User user) {
            string username = user.Username;

            try {
                IOperation inactivateMember = _model.GetOperation(V1Constants.INACTIVATE);
                Oid deactivatedOid = _services.ExecuteOperation(inactivateMember, user.V1MemberAsset.Oid);

                logger.Info("Member with username '" + username + "' has been DEACTIVATED in the VersionOne system.");
            } catch (Exception ex) {
                logger.ErrorException(
                    "Attempt to deactivate Member with username '" + username + "' in the VersionOne system has FAILED.",
                    ex);
            }
        }
        private IDictionary<string, User> BuildV1UsersList(AssetList versionOneUsers) {
            IDictionary<string, User> v1Usernames = new Dictionary<string, User>();
            IAttributeDefinition usernameAttribute = _model.GetAttributeDefinition(V1Constants.USERNAME);
            IAttributeDefinition isInactiveAttribute = _model.GetAttributeDefinition(V1Constants.ISINACTIVE);
            IAttributeDefinition ckInactivate = _model.GetAttributeDefinition(V1Constants.CHECKINACTIVATE);

            foreach (Asset userinV1 in versionOneUsers) {
                User v1User = new User();
                object usernameAttributeValue = userinV1.GetAttribute(usernameAttribute).Value;

                if (usernameAttributeValue != null) {
                    v1User.Username = usernameAttributeValue.ToString().Trim();
                    v1User.V1MemberAsset = userinV1;
                    v1User.CheckInactivate = bool.Parse(userinV1.GetAttribute(ckInactivate).Value.ToString());
                    v1User.IsInactive = bool.Parse(userinV1.GetAttribute(isInactiveAttribute).Value.ToString());
                    v1Usernames.Add(v1User.Username.ToLowerInvariant(), v1User);
                }
            }
            return v1Usernames;
        }