Beispiel #1
0
        /// <summary>
        /// Check all member properties are equal
        /// </summary>
        /// <param name="memberDisplay"></param>
        /// <param name="resultValue"></param>
        private void AssertMemberDisplayPropertiesAreEqual(MemberDisplay memberDisplay, MemberDisplay resultValue)
        {
            Assert.AreNotSame(memberDisplay, resultValue);
            Assert.AreEqual(memberDisplay.Id, resultValue.Id);
            Assert.AreEqual(memberDisplay.Alias, resultValue.Alias);
            Assert.AreEqual(memberDisplay.Username, resultValue.Username);
            Assert.AreEqual(memberDisplay.Email, resultValue.Email);
            Assert.AreEqual(memberDisplay.AdditionalData, resultValue.AdditionalData);
            Assert.AreEqual(memberDisplay.ContentApps, resultValue.ContentApps);
            Assert.AreEqual(memberDisplay.ContentType.Alias, resultValue.ContentType.Alias);
            Assert.AreEqual(memberDisplay.ContentTypeAlias, resultValue.ContentTypeAlias);
            Assert.AreEqual(memberDisplay.ContentTypeName, resultValue.ContentTypeName);
            Assert.AreEqual(memberDisplay.ContentTypeId, resultValue.ContentTypeId);
            Assert.AreEqual(memberDisplay.Icon, resultValue.Icon);
            Assert.AreEqual(memberDisplay.Errors, resultValue.Errors);
            Assert.AreEqual(memberDisplay.Key, resultValue.Key);
            Assert.AreEqual(memberDisplay.Name, resultValue.Name);
            Assert.AreEqual(memberDisplay.Path, resultValue.Path);
            Assert.AreEqual(memberDisplay.SortOrder, resultValue.SortOrder);
            Assert.AreEqual(memberDisplay.Trashed, resultValue.Trashed);
            Assert.AreEqual(memberDisplay.TreeNodeUrl, resultValue.TreeNodeUrl);

            //TODO: can we check create/update dates when saving?
            //Assert.AreEqual(memberDisplay.CreateDate, resultValue.CreateDate);
            //Assert.AreEqual(memberDisplay.UpdateDate, resultValue.UpdateDate);

            //TODO: check all properties
            Assert.AreEqual(memberDisplay.Properties.Count(), resultValue.Properties.Count());
            Assert.AreNotSame(memberDisplay.Properties, resultValue.Properties);
            for (var index = 0; index < resultValue.Properties.Count(); index++)
            {
                Assert.AreNotSame(memberDisplay.Properties.GetItemByIndex(index), resultValue.Properties.GetItemByIndex(index));
                //Assert.AreEqual(memberDisplay.Properties.GetItemByIndex(index), resultValue.Properties.GetItemByIndex(index));
            }
        }
Beispiel #2
0
        public void PostSaveMember_WhenModelStateIsNotValid_ExpectFailureResponse(
            [Frozen] IMemberManager umbracoMembersUserManager,
            IMemberService memberService,
            IMemberTypeService memberTypeService,
            IMemberGroupService memberGroupService,
            IDataTypeService dataTypeService,
            IBackOfficeSecurityAccessor backOfficeSecurityAccessor,
            IPasswordChanger <MemberIdentityUser> passwordChanger,
            IOptions <GlobalSettings> globalSettings,
            IUser user)
        {
            // arrange
            Member           member = SetupMemberTestData(out MemberSave fakeMemberData, out MemberDisplay memberDisplay, ContentSaveAction.SaveNew);
            MemberController sut    = CreateSut(memberService, memberTypeService, memberGroupService, umbracoMembersUserManager, dataTypeService, backOfficeSecurityAccessor, passwordChanger, globalSettings, user);

            sut.ModelState.AddModelError("key", "Invalid model state");

            Mock.Get(umbracoMembersUserManager)
            .Setup(x => x.CreateAsync(It.IsAny <MemberIdentityUser>(), It.IsAny <string>()))
            .ReturnsAsync(() => IdentityResult.Success);
            Mock.Get(umbracoMembersUserManager)
            .Setup(x => x.ValidatePasswordAsync(It.IsAny <string>()))
            .ReturnsAsync(() => IdentityResult.Success);

            var value = new MemberDisplay();

            // act
            ActionResult <MemberDisplay> result = sut.PostSave(fakeMemberData).Result;
            var validation = result.Result as ValidationErrorResult;

            // assert
            Assert.IsNotNull(result.Result);
            Assert.IsNull(result.Value);
            Assert.AreEqual(StatusCodes.Status400BadRequest, validation?.StatusCode);
        }
 private void Map(MembershipUser source, MemberDisplay target, MapperContext context)
 {
     //first convert to IMember
     var member = context.Map<IMember>(source);
     //then convert to MemberDisplay
     context.Map<IMember, MemberDisplay>(member);
 }
 // Umbraco.Code.MapAll -Properties -Errors -Edited -Updater -Alias -IsChildOfListView
 // Umbraco.Code.MapAll -Trashed -IsContainer -VariesByCulture
 private void Map(IMember source, MemberDisplay target, MapperContext context)
 {
     target.ContentApps = _commonMapper.GetContentApps(source);
     target.ContentType = _commonMapper.GetContentType(source, context);
     target.ContentTypeId = source.ContentType.Id;
     target.ContentTypeAlias = source.ContentType.Alias;
     target.ContentTypeName = source.ContentType.Name;
     target.CreateDate = source.CreateDate;
     target.Email = source.Email;
     target.Icon = source.ContentType.Icon;
     target.Id = source.Id;
     target.Key = source.Key;
     target.MemberProviderFieldMapping = GetMemberProviderFieldMapping();
     target.MembershipScenario = GetMembershipScenario();
     target.Name = source.Name;
     target.Owner = _commonMapper.GetOwner(source, context);
     target.ParentId = source.ParentId;
     target.Path = source.Path;
     target.SortOrder = source.SortOrder;
     target.State = null;
     target.Tabs = _tabsAndPropertiesMapper.Map(source, context);
     target.TreeNodeUrl = _commonMapper.GetMemberTreeNodeUrl(source);
     target.Udi = Udi.Create(Constants.UdiEntityType.Member, source.Key);
     target.UpdateDate = source.UpdateDate;
     target.Username = source.Username;
 }
Beispiel #5
0
        // Umbraco.Code.MapAll -Properties -Errors -Edited -Updater -Alias -IsChildOfListView
        // Umbraco.Code.MapAll -Trashed -IsContainer -VariesByCulture
        private void Map(IMember source, MemberDisplay target, MapperContext context)
        {
            target.ContentApps      = _commonMapper.GetContentAppsForEntity(source);
            target.ContentType      = _commonMapper.GetContentType(source, context);
            target.ContentTypeId    = source.ContentType.Id;
            target.ContentTypeAlias = source.ContentType.Alias;
            target.ContentTypeName  = source.ContentType.Name;
            target.CreateDate       = source.CreateDate;
            target.Icon             = source.ContentType.Icon;
            target.Id          = source.Id;
            target.Key         = source.Key;
            target.Name        = source.Name;
            target.Owner       = _commonMapper.GetOwner(source, context);
            target.ParentId    = source.ParentId;
            target.Path        = source.Path;
            target.SortOrder   = source.SortOrder;
            target.State       = null;
            target.Tabs        = _tabsAndPropertiesMapper.Map(source, context);
            target.TreeNodeUrl = _commonTreeNodeMapper.GetTreeNodeUrl <MemberTreeController>(source);
            target.Udi         = Udi.Create(Constants.UdiEntityType.Member, source.Key);
            target.UpdateDate  = source.UpdateDate;

            //Membership
            target.Username             = source.Username;
            target.Email                = source.Email;
            target.IsLockedOut          = source.IsLockedOut;
            target.IsApproved           = source.IsApproved;
            target.MembershipProperties = _tabsAndPropertiesMapper.MapMembershipProperties(source, context);
        }
    /// <summary>
    /// 创建单位
    /// </summary>
    public void CreateMember()
    {
        // -----------------------------数据初始化-----------------------------
        // 初始化单位
        RandomPacker.Single.SetSeed((int)DateTime.Now.Ticks);
        var memberDisplay = new MemberDisplay(GameObject.CreatePrimitive(PrimitiveType.Sphere));

        controlMember         = new Member(MemberManager.Single.FrameCount, memberDisplay, MemberManager.Single, RandomPacker.Single.GetRangeI(0, 10000));
        controlMember.Hp      = 100;
        controlMember.Speed   = 1;
        controlMember.IsLocal = true;
        Debug.Log("单位Id" + controlMember.Id);
        MemberManager.Single.Add(controlMember);
    }
    /// <summary>
    /// 启动
    /// </summary>
    void Start()
    {
        // 设置游戏帧率
        Application.targetFrameRate = 45;
        RandomPacker.Single.SetSeed(RandomSeed);
        // 初始化地图
        var mapBase = MapManager.Single.GetMapBase(MapId, MapCenter, UnitWidth);

        // 设置显示模式
        MemberManager.Single.ShowMode     = ShowMode;
        DisplayCmdManager.Single.ShowMode = ShowMode;
        // 初始化数据黑板
        BlackBoard.Single.MapBase = mapBase;

        MemberManager.Single.Reset();

        for (var i = 0; i < MemberCount; i++)
        {
            // 初始化单位
            var memberDisplay = new MemberDisplay(GameObject.CreatePrimitive(PrimitiveType.Capsule));
            var member        = new Member(MemberManager.Single.FrameCount, memberDisplay, MemberManager.Single);
            member.Hp = 100;
            MemberManager.Single.Add(member);
        }

        // 设置战斗结束检测
        MemberManager.Single.SetCheckFightEndFunc((memberList) =>
        {
            if (memberList.Count == 0)
            {
                // 战斗结束
                Debug.Log("战斗结束");
                return(false);
            }
            // 战斗继续
            return(true);
        });
    }
Beispiel #8
0
        /// <summary>
        /// Setup all standard member data for test
        /// </summary>
        private Member SetupMemberTestData(
            out MemberSave fakeMemberData,
            out MemberDisplay memberDisplay,
            ContentSaveAction contentAction)
        {
            // arrange
            MemberType memberType = MemberTypeBuilder.CreateSimpleMemberType();
            Member     member     = MemberBuilder.CreateSimpleMember(memberType, "Test Member", "*****@*****.**", "123", "test");
            var        memberId   = 123;

            member.Id = memberId;

            // TODO: replace with builder for MemberSave and MemberDisplay
            fakeMemberData = new MemberSave()
            {
                Id            = memberId,
                SortOrder     = member.SortOrder,
                ContentTypeId = memberType.Id,
                Key           = member.Key,
                Password      = new ChangingPasswordModel()
                {
                    Id          = 456,
                    NewPassword = member.RawPasswordValue,
                    OldPassword = null
                },
                Name                  = member.Name,
                Email                 = member.Email,
                Username              = member.Username,
                PersistedContent      = member,
                PropertyCollectionDto = new ContentPropertyCollectionDto()
                {
                },
                Groups = new List <string>(),
                //Alias = "fakeAlias",
                ContentTypeAlias = member.ContentTypeAlias,
                Action           = contentAction,
                Icon             = "icon-document",
                Path             = member.Path
            };

            memberDisplay = new MemberDisplay()
            {
                Id            = memberId,
                SortOrder     = member.SortOrder,
                ContentTypeId = memberType.Id,
                Key           = member.Key,
                Name          = member.Name,
                Email         = member.Email,
                Username      = member.Username,
                //Alias = "fakeAlias",
                ContentTypeAlias = member.ContentTypeAlias,
                ContentType      = new ContentTypeBasic(),
                ContentTypeName  = member.ContentType.Name,
                Icon             = fakeMemberData.Icon,
                Path             = member.Path,
                Tabs             = new List <Tab <ContentPropertyDisplay> >()
                {
                    new Tab <ContentPropertyDisplay>()
                    {
                        Alias      = "test",
                        Id         = 77,
                        Properties = new List <ContentPropertyDisplay>()
                        {
                            new ContentPropertyDisplay()
                            {
                                Alias = "_umb_id",
                                View  = "idwithguid",
                                Value = new []
                                {
                                    "123",
                                    "guid"
                                }
                            },
                            new ContentPropertyDisplay()
                            {
                                Alias = "_umb_doctype"
                            },
                            new ContentPropertyDisplay()
                            {
                                Alias = "_umb_login"
                            },
                            new ContentPropertyDisplay()
                            {
                                Alias = "_umb_email"
                            },
                            new ContentPropertyDisplay()
                            {
                                Alias = "_umb_password"
                            },
                            new ContentPropertyDisplay()
                            {
                                Alias = "_umb_membergroup"
                            }
                        }
                    }
                }
            };

            return(member);
        }
 public SendingMemberNotification(MemberDisplay member, IUmbracoContext umbracoContext)
 {
     Member         = member;
     UmbracoContext = umbracoContext;
 }
Beispiel #10
0
        /// <summary>
        /// Returns the login property display field
        /// </summary>
        /// <param name="memberService"></param>
        /// <param name="member"></param>
        /// <param name="display"></param>
        /// <returns></returns>
        /// <remarks>
        /// If the membership provider installed is the umbraco membership provider, then we will allow changing the username, however if
        /// the membership provider is a custom one, we cannot allow chaning the username because MembershipProvider's do not actually natively
        /// allow that.
        /// </remarks>
        internal static ContentPropertyDisplay GetLoginProperty(IMemberService memberService, IMember member, MemberDisplay display)
        {
            var prop = new ContentPropertyDisplay
            {
                Alias = string.Format("{0}login", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                Label = ui.Text("login"),
                Value = display.Username
            };

            var scenario = memberService.GetMembershipScenario();

            //only allow editing if this is a new member, or if the membership provider is the umbraco one
            if (member.HasIdentity == false || scenario == MembershipScenario.NativeUmbraco)
            {
                prop.View = "textbox";
                prop.Validation.Mandatory = true;
            }
            else
            {
                prop.View = "readonlyvalue";
            }
            return(prop);
        }
Beispiel #11
0
        /// <summary>
        /// Maps the generic tab with custom properties for content
        /// </summary>
        /// <param name="memberService"></param>
        /// <param name="member"></param>
        /// <param name="display"></param>
        /// <remarks>
        /// If this is a new entity and there is an approved field then we'll set it to true by default.
        /// </remarks>
        private static void MapGenericCustomProperties(IMemberService memberService, IMember member, MemberDisplay display)
        {
            var membersProvider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider();

            //map the tree node url
            if (HttpContext.Current != null)
            {
                var urlHelper = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()));
                var url       = urlHelper.GetUmbracoApiService <MemberTreeController>(controller => controller.GetTreeNode(display.Key.ToString("N"), null));
                display.TreeNodeUrl = url;
            }

            var genericProperties = new List <ContentPropertyDisplay>
            {
                GetLoginProperty(memberService, member, display),
                new ContentPropertyDisplay
                {
                    Alias      = string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label      = ui.Text("general", "email"),
                    Value      = display.Email,
                    View       = "email",
                    Validation = { Mandatory = true }
                },
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}password", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = ui.Text("password"),
                    //NOTE: The value here is a json value - but the only property we care about is the generatedPassword one if it exists, the newPassword exists
                    // only when creating a new member and we want to have a generated password pre-filled.
                    Value = new Dictionary <string, object>
                    {
                        { "generatedPassword", member.GetAdditionalDataValueIgnoreCase("GeneratedPassword", null) },
                        { "newPassword", member.GetAdditionalDataValueIgnoreCase("NewPassword", null) },
                    },
                    //TODO: Hard coding this because the changepassword doesn't necessarily need to be a resolvable (real) property editor
                    View = "changepassword",
                    //initialize the dictionary with the configuration from the default membership provider
                    Config = new Dictionary <string, object>(membersProvider.GetConfiguration())
                    {
                        //the password change toggle will only be displayed if there is already a password assigned.
                        { "hasPassword", member.RawPasswordValue.IsNullOrWhiteSpace() == false }
                    }
                },
                new ContentPropertyDisplay
                {
                    Alias  = string.Format("{0}membergroup", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label  = ui.Text("content", "membergroup"),
                    Value  = GetMemberGroupValue(display.Username),
                    View   = "membergroups",
                    Config = new Dictionary <string, object> {
                        { "IsRequired", true }
                    }
                }
            };

            TabsAndPropertiesResolver.MapGenericProperties(member, display, genericProperties);

            //check if there's an approval field
            var provider = membersProvider as global::umbraco.providers.members.UmbracoMembershipProvider;

            if (member.HasIdentity == false && provider != null)
            {
                var approvedField = provider.ApprovedPropertyTypeAlias;
                var prop          = display.Properties.FirstOrDefault(x => x.Alias == approvedField);
                if (prop != null)
                {
                    prop.Value = 1;
                }
            }
        }
        /// <summary>
        /// Create a member from the supplied member content data
        ///
        /// All member password processing and creation is done via the identity manager
        /// </summary>
        /// <param name="contentItem">Member content data</param>
        /// <returns>The identity result of the created member</returns>
        private async Task <ActionResult <bool> > CreateMemberAsync(MemberSave contentItem)
        {
            IMemberType memberType = _memberTypeService.Get(contentItem.ContentTypeAlias);

            if (memberType == null)
            {
                throw new InvalidOperationException($"No member type found with alias {contentItem.ContentTypeAlias}");
            }

            var identityMember = MemberIdentityUser.CreateNew(
                contentItem.Username,
                contentItem.Email,
                memberType.Alias,
                contentItem.IsApproved,
                contentItem.Name);

            IdentityResult created = await _memberManager.CreateAsync(identityMember, contentItem.Password.NewPassword);

            if (created.Succeeded == false)
            {
                MemberDisplay forDisplay = _umbracoMapper.Map <MemberDisplay>(contentItem.PersistedContent);
                foreach (IdentityError error in created.Errors)
                {
                    switch (error.Code)
                    {
                    case nameof(IdentityErrorDescriber.InvalidUserName):
                        ModelState.AddPropertyError(
                            new ValidationResult(error.Description, new[] { "value" }),
                            string.Format("{0}login", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                        break;

                    case nameof(IdentityErrorDescriber.PasswordMismatch):
                    case nameof(IdentityErrorDescriber.PasswordRequiresDigit):
                    case nameof(IdentityErrorDescriber.PasswordRequiresLower):
                    case nameof(IdentityErrorDescriber.PasswordRequiresNonAlphanumeric):
                    case nameof(IdentityErrorDescriber.PasswordRequiresUniqueChars):
                    case nameof(IdentityErrorDescriber.PasswordRequiresUpper):
                    case nameof(IdentityErrorDescriber.PasswordTooShort):
                        ModelState.AddPropertyError(
                            new ValidationResult(error.Description, new[] { "value" }),
                            string.Format("{0}password", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                        break;

                    case nameof(IdentityErrorDescriber.InvalidEmail):
                        ModelState.AddPropertyError(
                            new ValidationResult(error.Description, new[] { "value" }),
                            string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                        break;

                    case nameof(IdentityErrorDescriber.DuplicateUserName):
                        ModelState.AddPropertyError(
                            new ValidationResult(error.Description, new[] { "value" }),
                            string.Format("{0}login", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                        break;

                    case nameof(IdentityErrorDescriber.DuplicateEmail):
                        ModelState.AddPropertyError(
                            new ValidationResult(error.Description, new[] { "value" }),
                            string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                        break;
                    }
                }
                return(ValidationProblem(forDisplay, ModelState));
            }

            // now re-look up the member, which will now exist
            IMember member = _memberService.GetByEmail(contentItem.Email);

            // map the save info over onto the user
            member = _umbracoMapper.Map <MemberSave, IMember>(contentItem, member);

            int creatorId = _backOfficeSecurityAccessor.BackOfficeSecurity.CurrentUser.Id;

            member.CreatorId = creatorId;

            // assign the mapped property values that are not part of the identity properties
            string[] builtInAliases = ConventionsHelper.GetStandardPropertyTypeStubs(_shortStringHelper).Select(x => x.Key).ToArray();
            foreach (ContentPropertyBasic property in contentItem.Properties)
            {
                if (builtInAliases.Contains(property.Alias) == false)
                {
                    member.Properties[property.Alias].SetValue(property.Value);
                }
            }

            // now the member has been saved via identity, resave the member with mapped content properties
            _memberService.Save(member);
            contentItem.PersistedContent = member;

            ActionResult <bool> rolesChanged = await AddOrUpdateRoles(contentItem.Groups, identityMember);

            if (!rolesChanged.Value && rolesChanged.Result != null)
            {
                return(rolesChanged.Result);
            }

            return(true);
        }
        public async Task <ActionResult <MemberDisplay> > PostSave([ModelBinder(typeof(MemberBinder))] MemberSave contentItem)
        {
            if (contentItem == null)
            {
                throw new ArgumentNullException("The member content item was null");
            }

            // If we've reached here it means:
            // * Our model has been bound
            // * and validated
            // * any file attachments have been saved to their temporary location for us to use
            // * we have a reference to the DTO object and the persisted object
            // * Permissions are valid

            // map the properties to the persisted entity
            MapPropertyValues(contentItem);

            await ValidateMemberDataAsync(contentItem);

            // Unlike content/media - if there are errors for a member, we do NOT proceed to save them, we cannot so return the errors
            if (ModelState.IsValid == false)
            {
                MemberDisplay forDisplay = _umbracoMapper.Map <MemberDisplay>(contentItem.PersistedContent);
                return(ValidationProblem(forDisplay, ModelState));
            }

            // Create a scope here which will wrap all child data operations in a single transaction.
            // We'll complete this at the end of this method if everything succeeeds, else
            // all data operations will roll back.
            using IScope scope = _scopeProvider.CreateScope();

            // Depending on the action we need to first do a create or update using the membership manager
            // this ensures that passwords are formatted correctly and also performs the validation on the provider itself.
            switch (contentItem.Action)
            {
            case ContentSaveAction.Save:
                ActionResult <bool> updateSuccessful = await UpdateMemberAsync(contentItem);

                if (!(updateSuccessful.Result is null))
                {
                    return(updateSuccessful.Result);
                }

                break;

            case ContentSaveAction.SaveNew:
                ActionResult <bool> createSuccessful = await CreateMemberAsync(contentItem);

                if (!(createSuccessful.Result is null))
                {
                    return(createSuccessful.Result);
                }

                break;

            default:
                // we don't support anything else for members
                return(NotFound());
            }

            // return the updated model
            MemberDisplay display = _umbracoMapper.Map <MemberDisplay>(contentItem.PersistedContent);

            // lastly, if it is not valid, add the model state to the outgoing object and throw a 403
            if (!ModelState.IsValid)
            {
                return(ValidationProblem(display, ModelState, StatusCodes.Status403Forbidden));
            }

            // put the correct messages in
            switch (contentItem.Action)
            {
            case ContentSaveAction.Save:
            case ContentSaveAction.SaveNew:
                display.AddSuccessNotification(
                    _localizedTextService.Localize("speechBubbles", "editMemberSaved"),
                    _localizedTextService.Localize("speechBubbles", "editMemberSaved"));
                break;
            }

            // Mark transaction to commit all changes
            scope.Complete();

            return(display);
        }
Beispiel #14
0
    /// <summary>
    ///     Setup all standard member data for test
    /// </summary>
    private Member SetupMemberTestData(
        out MemberSave fakeMemberData,
        out MemberDisplay memberDisplay,
        ContentSaveAction contentAction)
    {
        // arrange
        var memberType = MemberTypeBuilder.CreateSimpleMemberType();
        var member     = MemberBuilder.CreateSimpleMember(memberType, "Test Member", "*****@*****.**", "123", "test");
        var memberId   = 123;

        member.Id = memberId;

        // TODO: replace with builder for MemberSave and MemberDisplay
        fakeMemberData = new MemberSave
        {
            Id            = memberId,
            SortOrder     = member.SortOrder,
            ContentTypeId = memberType.Id,
            Key           = member.Key,
            Password      = new ChangingPasswordModel {
                Id = 456, NewPassword = member.RawPasswordValue, OldPassword = null
            },
            Name                  = member.Name,
            Email                 = member.Email,
            Username              = member.Username,
            PersistedContent      = member,
            PropertyCollectionDto = new ContentPropertyCollectionDto(),
            Groups                = new List <string>(),

            // Alias = "fakeAlias",
            ContentTypeAlias = member.ContentTypeAlias,
            Action           = contentAction,
            Icon             = "icon-document",
            Path             = member.Path,
        };

        memberDisplay = new MemberDisplay
        {
            Id            = memberId,
            SortOrder     = member.SortOrder,
            ContentTypeId = memberType.Id,
            Key           = member.Key,
            Name          = member.Name,
            Email         = member.Email,
            Username      = member.Username,

            // Alias = "fakeAlias",
            ContentTypeAlias = member.ContentTypeAlias,
            ContentType      = new ContentTypeBasic(),
            ContentTypeName  = member.ContentType.Name,
            Icon             = fakeMemberData.Icon,
            Path             = member.Path,
            Tabs             = new List <Tab <ContentPropertyDisplay> >
            {
                new()
                {
                    Alias      = "test",
                    Id         = 77,
                    Properties = new List <ContentPropertyDisplay>
                    {
                        new() { Alias = $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login" },
                        new() { Alias = $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}email" },
                        new()
                        {
                            Alias =
                                $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}password",
                        },
                        new()
                        {
                            Alias =
                                $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}membergroup",
                        },
                        new()
                        {
                            Alias =
                                $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}failedPasswordAttempts",
                        },
                        new()
                        {
                            Alias =
                                $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}approved",
                        },
                        new()
                        {
                            Alias =
                                $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}lockedOut",
                        },
                        new()
                        {
                            Alias =
                                $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}lastLockoutDate",
                        },
                        new()
                        {
                            Alias =
                                $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}lastLoginDate",
                        },
                        new()
                        {
                            Alias =
                                $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}lastPasswordChangeDate",
                        },
                    },
                },
            },
        };

        return(member);
    }
Beispiel #15
0
        /// <summary>
        /// Maps the generic tab with custom properties for content
        /// </summary>
        /// <param name="memberService"></param>
        /// <param name="userService"></param>
        /// <param name="member"></param>
        /// <param name="display"></param>
        /// <param name="localizedText"></param>
        /// <remarks>
        /// If this is a new entity and there is an approved field then we'll set it to true by default.
        /// </remarks>
        private static void MapGenericCustomProperties(IMemberService memberService, IUserService userService, IMember member, MemberDisplay display, ILocalizedTextService localizedText)
        {
            var membersProvider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider();

            //map the tree node url
            if (HttpContext.Current != null)
            {
                var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
                var url       = urlHelper.GetUmbracoApiService <MemberTreeController>(controller => controller.GetTreeNode(display.Key.ToString("N"), null));
                display.TreeNodeUrl = url;
            }

            var genericProperties = new List <ContentPropertyDisplay>
            {
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("content/membertype"),
                    Value = localizedText.UmbracoDictionaryTranslate(display.ContentTypeName),
                    View  = PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
                },
                GetLoginProperty(memberService, member, display, localizedText),
                new ContentPropertyDisplay
                {
                    Alias      = string.Format("{0}email", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label      = localizedText.Localize("general/email"),
                    Value      = display.Email,
                    View       = "email",
                    Validation = { Mandatory = true }
                },
                new ContentPropertyDisplay
                {
                    Alias = string.Format("{0}password", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label = localizedText.Localize("password"),
                    //NOTE: The value here is a json value - but the only property we care about is the generatedPassword one if it exists, the newPassword exists
                    // only when creating a new member and we want to have a generated password pre-filled.
                    Value = new Dictionary <string, object>
                    {
                        { "generatedPassword", member.GetAdditionalDataValueIgnoreCase("GeneratedPassword", null) },
                        { "newPassword", member.GetAdditionalDataValueIgnoreCase("NewPassword", null) },
                    },
                    //TODO: Hard coding this because the changepassword doesn't necessarily need to be a resolvable (real) property editor
                    View = "changepassword",
                    //initialize the dictionary with the configuration from the default membership provider
                    Config = new Dictionary <string, object>(membersProvider.GetConfiguration(userService))
                    {
                        //the password change toggle will only be displayed if there is already a password assigned.
                        { "hasPassword", member.RawPasswordValue.IsNullOrWhiteSpace() == false }
                    }
                },
                new ContentPropertyDisplay
                {
                    Alias  = string.Format("{0}membergroup", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
                    Label  = localizedText.Localize("content/membergroup"),
                    Value  = GetMemberGroupValue(display.Username),
                    View   = "membergroups",
                    Config = new Dictionary <string, object> {
                        { "IsRequired", true }
                    }
                }
            };

            TabsAndPropertiesResolver.MapGenericProperties(member, display, localizedText, genericProperties, properties =>
            {
                if (HttpContext.Current != null && UmbracoContext.Current != null && UmbracoContext.Current.Security.CurrentUser != null &&
                    UmbracoContext.Current.Security.CurrentUser.AllowedSections.Any(x => x.Equals(Constants.Applications.Settings)))
                {
                    var memberTypeLink = string.Format("#/member/memberTypes/edit/{0}", member.ContentTypeId);

                    //Replace the doctype property
                    var docTypeProperty   = properties.First(x => x.Alias == string.Format("{0}doctype", Constants.PropertyEditors.InternalGenericPropertiesPrefix));
                    docTypeProperty.Value = new List <object>
                    {
                        new
                        {
                            linkText = member.ContentType.Name,
                            url      = memberTypeLink,
                            target   = "_self",
                            icon     = "icon-item-arrangement"
                        }
                    };
                    docTypeProperty.View = "urllist";
                }
            });

            //check if there's an approval field
            var provider = membersProvider as global::umbraco.providers.members.UmbracoMembershipProvider;

            if (member.HasIdentity == false && provider != null)
            {
                var approvedField = provider.ApprovedPropertyTypeAlias;
                var prop          = display.Properties.FirstOrDefault(x => x.Alias == approvedField);
                if (prop != null)
                {
                    prop.Value = 1;
                }
            }
        }