public User SaveStandardUserFormDetails(AjaxFormSubmittedValues form, string blockName, bool?enabled)
        {
            AjaxFormSubmittedValues.Block block = form.Blocks[blockName];
            string pw;

            if (block.Fields.ContainsKey("Password1"))
            {
                pw = block.Fields["Password1"].Value;
            }
            else
            {
                pw = block.Fields["Password"].Value;
            }
            if (pw.Length == 0)
            {
                pw = null;
            }

            User user;

            if (form.RecordID == null)
            {
                user = new User(
                    SecurityProvider.ClientSpaceID,
                    block.Fields["Username"].Value,
                    pw,
                    block.Fields["FirstName"].Value,
                    block.Fields["Surname"].Value,
                    block.Fields["Email"].Value,
                    enabled == null ? (block.Fields["Enabled"].Value == "True") : enabled.Value,
                    false, false, 0);
                if (OnBeforeSaveUser != null)
                {
                    OnBeforeSaveUser(form, user);
                }
                SecurityProvider.DataLayer.Store(user);
                form.RecordID = user.UserID;
            }
            else
            {
                long myuserid = SecurityProvider.CurrentUser.UserID;
                // string myoldusername = CurrentUser.Username;
                user = User.Select(form.RecordID.Value);
                // user.Username = block.Fields["Username"].Value;
                if (pw != null)
                {
                    user.Password = pw;
                }
                user.FirstName = block.Fields["FirstName"].Value;
                user.Surname   = block.Fields["Surname"].Value;
                user.Email     = block.Fields["Email"].Value;
                user.Enabled   = enabled == null ? (block.Fields["Enabled"].Value == "True") : enabled.Value;
                if (OnBeforeSaveUser != null)
                {
                    OnBeforeSaveUser(form, user);
                }
                SecurityProvider.DataLayer.Store(user);

                /* we're not going to allow the user to change their username, so this code is commented out
                 * if (myuserid == user.UserID && (pw != null || user.Username != myoldusername)) // changing username or password causes login cookie to become invalid
                 *      WebAuthentication.Instance.WriteAuthenticationCookie(
                 *              user.Username,
                 *              pw != null ? Crypto.EncryptOneWay(pw) : user.PasswordHash,
                 *              WebAuthentication.Instance.StoreAjaxAuthKey(user.Username),
                 *              1440); */
            }
            return(user);
        }
        void OnSaveForm(AjaxFormSubmittedValues form)
        {
            List <string> roleCodes = new List <string>(), permissionTypeCodes = new List <string>();

            switch (form.FormName)
            {
            case "UserEditForm":
                if (!WebAuthentication.VerifyAccess(PermissionType.UserAdministrator))
                {
                    return;
                }
                AjaxFormSubmittedValues.Block block = form.Blocks["MainUserFields"];
                string pw      = block.Fields["Password"].Value;
                bool   enabled = block.Fields["Enabled"].Value == "True";
                if (pw.Length == 0)
                {
                    pw = null;
                }
                User user;

                if (form.RecordID == null)
                {
                    user = new User(
                        SecurityProvider.ClientSpaceID,
                        block.Fields["Username"].Value,
                        pw,
                        block.Fields["FirstName"].Value,
                        block.Fields["Surname"].Value,
                        block.Fields["Email"].Value,
                        enabled, false, false, 0);
                    Result result = SecurityProvider.DataLayer.Store(user);
                    if (!result.Succeeded)
                    {
                        throw new AjaxException(result.Message);
                    }
                    if (OnUserSaved != null)
                    {
                        OnUserSaved(form, user);
                    }

                    form.RecordID = user.UserID;
                }
                else
                {
                    user = User.Select(form.RecordID.Value);
                    //if (!CurrentUser.CanModifyUser(user))
                    //    throw new AjaxException("You don't have access to modify that user.");
                    user.Username = block.Fields["Username"].Value;
                    if (pw != null)
                    {
                        user.Password = pw;
                    }
                    user.FirstName = block.Fields["FirstName"].Value;
                    user.Surname   = block.Fields["Surname"].Value;
                    user.Email     = block.Fields["Email"].Value;
                    user.Enabled   = enabled;
                    SecurityProvider.DataLayer.Store(user);
                    //user.Save();
                    if (OnUserSaved != null)
                    {
                        OnUserSaved(form, user);
                    }

                    if (user.Locked)
                    {
                        return;                                          // don't muck with permissions/roles
                    }
                }

                if (user.Username != SecurityProvider.CurrentUser.Username)                         // users can't alter their own permissions
                {
                    if (form.Blocks.ContainsKey("Roles"))
                    {
                        foreach (KeyValuePair <string, AjaxFormSubmittedValues.Field> kvp in form.Blocks["Roles"].Fields)
                        {
                            if (SecurityProvider.CurrentUser.HasRole(kvp.Value.Name))                                     //make sure the logged in user has the right to assign this role
                            {
                                if (kvp.Value.Value == "True")
                                {
                                    roleCodes.Add(kvp.Value.Name);
                                }
                            }
                        }
                    }
                    //sql.AppendFormat("exec AssignUserToRole '{0}', '{1}'\r\n", user.UserID, kvp.Value.Name.Replace("'", "''"));
                    if (form.Blocks.ContainsKey("Permissions"))
                    {
                        foreach (KeyValuePair <string, AjaxFormSubmittedValues.Field> kvp in form.Blocks["Permissions"].Fields)
                        {
                            if (SecurityProvider.CurrentUser.HasRole(kvp.Value.Name))                                     //make sure the logged in user has the right to assign this role
                            {
                                if (kvp.Value.Value == "True")
                                {
                                    permissionTypeCodes.Add(kvp.Value.Name);
                                }
                            }
                        }
                    }
                    //sql.AppendFormat("exec AssignPermission '{0}', null, '{1}'\r\n", kvp.Value.Name.Replace("'", "''"), user.UserID);
                    //if (sql.Length == 0) return;

                    SecurityProvider.DataLayer.SetRolesAndPermissionsForUser(user.UserID, roleCodes, permissionTypeCodes);
                    //user.RevokeRolesAndPermissions(); // revoke any pre-existing permissions/roles before we assign the new ones
                    //Database.Main.CreateCommand(sql.ToString(), CommandType.Text).ExecuteNonQuery();
                }
                break;

            case "RoleEditForm":
                if (!WebAuthentication.VerifyAccess(PermissionType.RoleAdministrator))
                {
                    return;
                }
                block = form.Blocks["RoleDetails"];
                string name = block.Fields["Name"].Value;
                enabled = block.Fields["Enabled"].Value == "True";
                Role role;
                if (form.RecordID == null)
                {
                    role               = new Role();
                    role.RoleID        = DatabaseManager.GetUniqueID();
                    role.RoleCode      = role.RoleID.ToString();                        // role codes are only used by system roles
                    role.ClientSpaceID = SecurityProvider.ClientSpaceID;
                }
                else
                {
                    role = Role.Select(form.RecordID.Value);
                    if (role == null)
                    {
                        return;
                    }
                    if (role.Locked)
                    {
                        return;                                          // locked roles aren't supposed to be edited by users
                    }
                }
                role.Name    = name;
                role.Enabled = enabled;
                SecurityProvider.DataLayer.Store(role);
                //((SecurityProvider)Core.Instance["SecurityProvider"]).SaveRole(role);

                //sql = new StringBuilder();
                if (form.Blocks.ContainsKey("Roles"))
                {
                    foreach (KeyValuePair <string, AjaxFormSubmittedValues.Field> kvp in form.Blocks["Roles"].Fields)
                    {
                        if (SecurityProvider.CurrentUser.HasRole(kvp.Value.Name))                                 //make sure the logged in user has the right to assign this role
                        {
                            if (kvp.Value.Value == "True")
                            {
                                roleCodes.Add(kvp.Value.Name);
                            }
                        }
                    }
                }
                //sql.AppendFormat("exec InheritRoleFrom '{0}', '{1}'\r\n", role.RoleID, kvp.Value.Name.Replace("'", "''"));
                if (form.Blocks.ContainsKey("Permissions"))
                {
                    foreach (KeyValuePair <string, AjaxFormSubmittedValues.Field> kvp in form.Blocks["Permissions"].Fields)
                    {
                        if (SecurityProvider.CurrentUser.HasRole(kvp.Value.Name))                                 //make sure the logged in user has the right to assign this role
                        {
                            if (kvp.Value.Value == "True")
                            {
                                permissionTypeCodes.Add(kvp.Value.Name);
                            }
                        }
                    }
                }
                //sql.AppendFormat("exec AssignPermission '{0}', null, '{1}'\r\n", kvp.Value.Name.Replace("'", "''"), role.RoleID);

                SecurityProvider.DataLayer.SetRolesAndPermissionsForRole(role.RoleID, roleCodes, permissionTypeCodes);
                //role.RevokeRolesAndPermissions(); // revoke any pre-existing permissions/roles before we assign the new ones
                //if (sql.Length == 0) return;
                //Database.Main.CreateCommand(sql.ToString(), CommandType.Text).ExecuteNonQuery();
                break;
            }
        }
        public void ValidateStandardUserFormBlock(AjaxFormSubmittedValues.Block block, long?userID, bool multilingual, bool requireFullName)
        {
            foreach (AjaxFormSubmittedValues.Field fld in block.Fields.Values)
            {
                switch (fld.Name)
                {
                case "Username":
                    if (fld.Value.Trim().Length == 0)
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-require-username?}" : "A username is required";
                    }
                    else if (SecurityProvider.DataLayer.IsUsernameTaken(SecurityProvider.ClientSpaceID, fld.Value, userID))
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-username-already-exists?}" : "That username is already in use";
                    }
                    break;

                case "Password":
                    if (userID == null && fld.Value.Length == 0)
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-require-password?}" : "A password is required";
                    }
                    break;

                case "Password1":
                    if (block.Fields["Password2"].Value != fld.Value)
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-different-passwords?}" : "The passwords entered must match.";
                    }
                    else if (fld.Value.Length == 0 && userID == null)
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-require-password?}" : "A password is required.";
                    }
                    break;

                case "FirstName":
                    if (fld.Value.Trim().Length == 0 && requireFullName)
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-require-firstname?}" : "A first name is required";
                    }
                    break;

                case "Surname":
                    if (fld.Value.Trim().Length == 0 && requireFullName)
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-require-surname?}" : "A surname is required";
                    }
                    break;

                case "Email":
                    if (fld.Value.Trim().Length == 0)
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-require-email?}" : "An email address is required";
                    }
                    else if (!StringUtilities.Validation.IsEmailAddress(fld.Value))
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-emailaddress-invalid?}" : "That is not an email address";
                    }
                    else if (SecurityProvider.DataLayer.IsEmailAddressTaken(SecurityProvider.ClientSpaceID, fld.Value, userID))
                    {
                        fld.ErrorMessage = multilingual ? "{?form-error-emailaddress-already-exists?}" : "That email address is already in use";
                    }
                    break;
                }
            }
        }