diff --git a/umbraco/businesslogic/User.cs b/umbraco/businesslogic/User.cs index bc0ac091eb..9ae56fc223 100644 --- a/umbraco/businesslogic/User.cs +++ b/umbraco/businesslogic/User.cs @@ -633,12 +633,19 @@ namespace umbraco.BusinessLogic if (!_crudsInitialized) initCruds(); - foreach (string nodeId in Path.Split(',')) + // NH 4.7.1 changing default permission behavior to default to User Type permissions IF no specific permissions has been + // set for the current node + int nodeId = Path.Contains(",") ? int.Parse(Path.Substring(Path.LastIndexOf(",")+1)) : int.Parse(Path); + if (_cruds.ContainsKey(nodeId)) { - if (_cruds.ContainsKey(int.Parse(nodeId))) - cruds = _cruds[int.Parse(nodeId)].ToString(); + return _cruds[int.Parse(Path.Substring(Path.LastIndexOf(",")+1))].ToString(); } + // exception to everything. If default cruds is empty and we're on root node; allow browse of root node + if (String.IsNullOrEmpty(cruds) && Path == "-1") + cruds = "F"; + + // else return default user type cruds return cruds; } @@ -854,7 +861,7 @@ namespace umbraco.BusinessLogic /// /// Flushes the user from cache. /// - protected void FlushFromCache() + public void FlushFromCache() { OnFlushingFromCache(EventArgs.Empty); diff --git a/umbraco/cms/businesslogic/CMSNode.cs b/umbraco/cms/businesslogic/CMSNode.cs index 3b792597d9..c9ea1453b8 100644 --- a/umbraco/cms/businesslogic/CMSNode.cs +++ b/umbraco/cms/businesslogic/CMSNode.cs @@ -55,7 +55,7 @@ namespace umbraco.cms.businesslogic #endregion #region Private static - + private static readonly string m_DefaultIconCssFile = IOHelper.MapPath(SystemDirectories.Umbraco_client + "/Tree/treeIcons.css"); private static List m_DefaultIconClasses = new List(); private static void initializeIconClasses() @@ -229,7 +229,7 @@ namespace umbraco.cms.businesslogic #endregion #region Protected static - + /// /// Given the protected modifier the CMSNode.MakeNew method can only be accessed by @@ -244,7 +244,7 @@ namespace umbraco.cms.businesslogic /// protected static CMSNode MakeNew(int parentId, Guid objectType, int userId, int level, string text, Guid uniqueID) { - CMSNode parent; + CMSNode parent = null; string path = ""; int sortOrder = 0; @@ -276,6 +276,17 @@ namespace umbraco.cms.businesslogic CMSNode retVal = new CMSNode(uniqueID); retVal.Path = path + "," + retVal.Id.ToString(); + // NH 4.7.1 duplicate permissions because of refactor + if (parent != null) + { + IEnumerable permissions = Permission.GetNodePermissions(parent); + foreach (Permission p in permissions) + { + Permission.MakeNew(User.GetUser(p.UserId), retVal, p.PermissionId); + } + + } + //event NewEventArgs e = new NewEventArgs(); retVal.FireAfterNew(e); @@ -311,7 +322,7 @@ namespace umbraco.cms.businesslogic protected static ISqlHelper SqlHelper { get { return Application.SqlHelper; } - } + } #endregion #region Constructors @@ -361,7 +372,7 @@ namespace umbraco.cms.businesslogic public CMSNode(Guid uniqueID, bool noSetup) { _id = SqlHelper.ExecuteScalar("SELECT id FROM umbracoNode WHERE uniqueID = @uniqueId", SqlHelper.CreateParameter("@uniqueId", uniqueID)); - + if (!noSetup) setupNode(); } @@ -370,8 +381,8 @@ namespace umbraco.cms.businesslogic { _id = reader.GetInt("id"); PopulateCMSNodeFromReader(reader); - } - + } + #endregion #region Public Methods @@ -468,9 +479,9 @@ order by level,sortOrder"; } return base.ToString(); - } + } - private void Move(CMSNode parent) + private void Move(CMSNode parent) { MoveEventArgs e = new MoveEventArgs(); FireBeforeMove(e); @@ -624,7 +635,7 @@ order by level,sortOrder"; var node = new CMSNode(dr.GetInt("id"), true); node.PopulateCMSNodeFromReader(dr); descendants.Add(node); - } + } } return descendants; } @@ -809,7 +820,7 @@ order by level,sortOrder"; { System.Collections.ArrayList tmp = new System.Collections.ArrayList(); using (IRecordsReader dr = SqlHelper.ExecuteReader("SELECT id, createDate, trashed, parentId, nodeObjectType, nodeUser, level, path, sortOrder, uniqueID, text FROM umbracoNode WHERE ParentID = @ParentID AND nodeObjectType = @type order by sortOrder", - SqlHelper.CreateParameter("@type", this.nodeObjectType), + SqlHelper.CreateParameter("@type", this.nodeObjectType), SqlHelper.CreateParameter("ParentID", this.Id))) { while (dr.Read()) @@ -817,7 +828,7 @@ order by level,sortOrder"; tmp.Add(new CMSNode(dr)); } } - + CMSNode[] retval = new CMSNode[tmp.Count]; for (int i = 0; i < tmp.Count; i++) @@ -937,7 +948,7 @@ order by level,sortOrder"; protected virtual void setupNode() { using (IRecordsReader dr = SqlHelper.ExecuteReader(m_SQLSingle, - SqlHelper.CreateParameter("@id",this.Id))) + SqlHelper.CreateParameter("@id", this.Id))) { if (dr.Read()) { @@ -996,7 +1007,7 @@ order by level,sortOrder"; { xmlDoc.Load(xmlRdr); } - + return xd.ImportNode(xmlDoc.FirstChild, true); } @@ -1192,6 +1203,6 @@ order by level,sortOrder"; } #endregion - + } } \ No newline at end of file diff --git a/umbraco/cms/businesslogic/Permission.cs b/umbraco/cms/businesslogic/Permission.cs index 41291aa995..773231ce14 100644 --- a/umbraco/cms/businesslogic/Permission.cs +++ b/umbraco/cms/businesslogic/Permission.cs @@ -40,9 +40,12 @@ namespace umbraco.BusinessLogic // Method is synchronized so exists remains consistent (avoiding race condition) bool exists = SqlHelper.ExecuteScalar("SELECT COUNT(userId) FROM umbracoUser2nodePermission WHERE userId = @userId AND nodeId = @nodeId AND permission = @permission", parameters) > 0; - if (!exists) + if (!exists) { SqlHelper.ExecuteNonQuery("INSERT INTO umbracoUser2nodePermission (userId, nodeId, permission) VALUES (@userId, @nodeId, @permission)", parameters); + // clear user cache to ensure permissions are re-loaded + User.GetUser(User.Id).FlushFromCache(); + } } ///