diff --git a/src/Umbraco.Core/Models/EntityBase/Entity.cs b/src/Umbraco.Core/Models/EntityBase/Entity.cs index 1551f29f86..315e2697c0 100644 --- a/src/Umbraco.Core/Models/EntityBase/Entity.cs +++ b/src/Umbraco.Core/Models/EntityBase/Entity.cs @@ -59,7 +59,7 @@ namespace Umbraco.Core.Models.EntityBase /// The key is currectly used to store the Unique Id from the /// umbracoNode table, which many of the entities are based on. [DataMember] - public virtual Guid Key + public Guid Key { get { diff --git a/src/Umbraco.Core/Models/PublicAccessEntry.cs b/src/Umbraco.Core/Models/PublicAccessEntry.cs index 9522710c53..27d1cd2121 100644 --- a/src/Umbraco.Core/Models/PublicAccessEntry.cs +++ b/src/Umbraco.Core/Models/PublicAccessEntry.cs @@ -32,6 +32,7 @@ namespace Umbraco.Core.Models public PublicAccessEntry(Guid id, int protectedNodeId, int loginNodeId, int noAccessNodeId, IEnumerable ruleCollection) { Key = id; + Id = Key.GetHashCode(); LoginNodeId = loginNodeId; NoAccessNodeId = noAccessNodeId; @@ -119,18 +120,6 @@ namespace Umbraco.Core.Models base.AddingEntity(); } - - [DataMember] - public sealed override Guid Key - { - get { return base.Key; } - set - { - base.Key = value; - Id = value.GetHashCode(); - } - } - [DataMember] public int LoginNodeId { diff --git a/src/Umbraco.Core/Models/PublicAccessRule.cs b/src/Umbraco.Core/Models/PublicAccessRule.cs index 584d6761db..484652e8bd 100644 --- a/src/Umbraco.Core/Models/PublicAccessRule.cs +++ b/src/Umbraco.Core/Models/PublicAccessRule.cs @@ -16,6 +16,7 @@ namespace Umbraco.Core.Models { AccessEntryId = accessEntryId; Key = id; + Id = Key.GetHashCode(); } public PublicAccessRule() @@ -24,17 +25,7 @@ namespace Umbraco.Core.Models private static readonly PropertyInfo RuleValueSelector = ExpressionHelper.GetPropertyInfo(x => x.RuleValue); private static readonly PropertyInfo RuleTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.RuleType); - - public sealed override Guid Key - { - get { return base.Key; } - set - { - base.Key = value; - Id = value.GetHashCode(); - } - } - + public Guid AccessEntryId { get; internal set; } /// @@ -43,7 +34,7 @@ namespace Umbraco.Core.Models internal override void AddingEntity() { if (Key == default(Guid)) - { + { Key = Guid.NewGuid(); } base.AddingEntity(); diff --git a/src/Umbraco.Core/Persistence/Relators/AccessRulesRelator.cs b/src/Umbraco.Core/Persistence/Relators/AccessRulesRelator.cs index 424c68a863..bcb33f3597 100644 --- a/src/Umbraco.Core/Persistence/Relators/AccessRulesRelator.cs +++ b/src/Umbraco.Core/Persistence/Relators/AccessRulesRelator.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Umbraco.Core.Models.Rdbms; namespace Umbraco.Core.Persistence.Relators @@ -19,7 +20,11 @@ namespace Umbraco.Core.Persistence.Relators if (Current != null && Current.Id == a.Id) { // Yes, just add this AccessRuleDto to the current AccessDto's collection - Current.Rules.Add(p); + if (p.Id != default(Guid)) + { + Current.Rules.Add(p); + } + // Return null to indicate we're not done with this AccessDto yet return null; @@ -34,7 +39,10 @@ namespace Umbraco.Core.Persistence.Relators // Setup the new current AccessDto Current = a; Current.Rules = new List(); - Current.Rules.Add(p); + if (p.Id != default(Guid)) + { + Current.Rules.Add(p); + } // Return the now populated previous AccessDto (or null if first time through) return prev; diff --git a/src/Umbraco.Core/Persistence/Repositories/PublicAccessRepository.cs b/src/Umbraco.Core/Persistence/Repositories/PublicAccessRepository.cs index e111451e84..542d85d42d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/PublicAccessRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/PublicAccessRepository.cs @@ -64,7 +64,7 @@ namespace Umbraco.Core.Persistence.Repositories var sql = new Sql(); sql.Select("*") .From(SqlSyntax) - .InnerJoin(SqlSyntax) + .LeftJoin(SqlSyntax) .On(SqlSyntax, left => left.Id, right => right.AccessId); return sql; @@ -122,6 +122,8 @@ namespace Umbraco.Core.Persistence.Repositories var dto = factory.BuildDto(entity); Database.Insert(dto); + //update the id so HasEntity is correct + entity.Id = entity.Key.GetHashCode(); foreach (var rule in dto.Rules) { @@ -147,18 +149,25 @@ namespace Umbraco.Core.Persistence.Repositories { if (rule.HasIdentity) { - Database.Update(dto.Rules.Single(x => x.Id == rule.Key)); + var count = Database.Update(dto.Rules.Single(x => x.Id == rule.Key)); + if (count == 0) + { + throw new InvalidOperationException("No rows were updated for the access rule"); + } } else { Database.Insert(new AccessRuleDto { + Id = rule.Key, AccessId = dto.Id, RuleValue = rule.RuleValue, RuleType = rule.RuleType, CreateDate = rule.CreateDate, UpdateDate = rule.UpdateDate }); + //update the id so HasEntity is correct + rule.Id = rule.Key.GetHashCode(); } } foreach (var removedRule in entity.RemovedRules) diff --git a/src/Umbraco.Core/Services/PublicAccessService.cs b/src/Umbraco.Core/Services/PublicAccessService.cs index a24f8db0c4..ead9d196c3 100644 --- a/src/Umbraco.Core/Services/PublicAccessService.cs +++ b/src/Umbraco.Core/Services/PublicAccessService.cs @@ -117,7 +117,7 @@ namespace Umbraco.Core.Services var entry = repo.GetAll().FirstOrDefault(x => x.ProtectedNodeId == content.Id); if (entry == null) return null; - var existingRule = entry.Rules.FirstOrDefault(x => x.RuleType == ruleType); + var existingRule = entry.Rules.FirstOrDefault(x => x.RuleType == ruleType && x.RuleValue == ruleValue); if (existingRule == null) { entry.AddRule(ruleValue, ruleType); diff --git a/src/Umbraco.Web.UI/umbraco/dialogs/protectPage.aspx b/src/Umbraco.Web.UI/umbraco/dialogs/protectPage.aspx index 196e9de51e..0a424f506f 100644 --- a/src/Umbraco.Web.UI/umbraco/dialogs/protectPage.aspx +++ b/src/Umbraco.Web.UI/umbraco/dialogs/protectPage.aspx @@ -148,7 +148,7 @@ - +
<%=umbraco.ui.Text("paLoginPageHelp")%> @@ -159,7 +159,7 @@ - +
<%=umbraco.ui.Text("paErrorPageHelp")%> diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/protectPage.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/protectPage.aspx.cs index b89091c017..ab88df2b4a 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/protectPage.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/protectPage.aspx.cs @@ -172,10 +172,10 @@ namespace umbraco.presentation.umbraco.dialogs protected void protect_Click(object sender, CommandEventArgs e) { - if (string.IsNullOrEmpty(errorPagePicker.Value)) + if (string.IsNullOrEmpty(errorPagePicker.Value) || errorPagePicker.Value == "-1") cv_errorPage.IsValid = false; - if (string.IsNullOrEmpty(loginPagePicker.Value)) + if (string.IsNullOrEmpty(loginPagePicker.Value) || loginPagePicker.Value == "-1") cv_loginPage.IsValid = false; //reset diff --git a/src/umbraco.cms/businesslogic/web/Access.cs b/src/umbraco.cms/businesslogic/web/Access.cs index dd90e8ae97..49978e0ad8 100644 --- a/src/umbraco.cms/businesslogic/web/Access.cs +++ b/src/umbraco.cms/businesslogic/web/Access.cs @@ -444,7 +444,7 @@ namespace umbraco.cms.businesslogic.web { var entry = ApplicationContext.Current.Services.PublicAccessService.GetEntryForContent(Path); if (entry == null) return -1; - var entity = ApplicationContext.Current.Services.EntityService.Get(entry.NoAccessNodeId, UmbracoObjectTypes.ContentItem, false); + var entity = ApplicationContext.Current.Services.EntityService.Get(entry.NoAccessNodeId, UmbracoObjectTypes.Document, false); return entity.Id; } @@ -453,7 +453,7 @@ namespace umbraco.cms.businesslogic.web { var entry = ApplicationContext.Current.Services.PublicAccessService.GetEntryForContent(Path); if (entry == null) return -1; - var entity = ApplicationContext.Current.Services.EntityService.Get(entry.LoginNodeId, UmbracoObjectTypes.ContentItem, false); + var entity = ApplicationContext.Current.Services.EntityService.Get(entry.LoginNodeId, UmbracoObjectTypes.Document, false); return entity.Id; }