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;
}