Fixes: #U4-2071 and cleans up some code.

This commit is contained in:
Shannon Deminick
2013-04-10 01:42:15 +06:00
parent 0430e7966c
commit bb70bee6ae
2 changed files with 174 additions and 185 deletions

View File

@@ -9,11 +9,11 @@ using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Xml;
using Umbraco.Core.IO;
using umbraco.cms.helpers;
using umbraco.BasePages;
using umbraco.presentation;
using umbraco.cms.businesslogic.media;
using umbraco.IO;
using System.Linq;
using umbraco.cms.businesslogic;
using umbraco.cms.presentation.user;
@@ -28,7 +28,14 @@ namespace umbraco.dialogs
public partial class moveOrCopy : UmbracoEnsuredPage
{
protected void Page_Load(object sender, System.EventArgs e)
protected override void OnInit(EventArgs e)
{
CurrentApp = Request["app"];
base.OnInit(e);
}
protected void Page_Load(object sender, EventArgs e)
{
JTree.DataBind();
@@ -37,41 +44,36 @@ namespace umbraco.dialogs
{
pp_relate.Text = ui.Text("moveOrCopy", "relateToOriginal");
//Document Type copy Hack...
string app = helper.Request("app");
//Document Type copy Hack...
if (app == "settings") {
if (CurrentApp == "settings")
{
pane_form.Visible = false;
pane_form_notice.Visible = false;
pane_settings.Visible = true;
ok.Text = ui.Text("general", "ok", this.getUser());
ok.Attributes.Add("style", "width: 60px");
cms.businesslogic.web.DocumentType dt = new umbraco.cms.businesslogic.web.DocumentType(int.Parse(helper.Request("id")));
var dt = new cms.businesslogic.web.DocumentType(int.Parse(helper.Request("id")));
//Load master types...
masterType.Attributes.Add("style", "width: 350px;");
masterType.Items.Add(new ListItem(ui.Text("none") + "...", "0"));
foreach (cms.businesslogic.web.DocumentType docT in cms.businesslogic.web.DocumentType.GetAllAsList()) {
foreach (cms.businesslogic.web.DocumentType docT in cms.businesslogic.web.DocumentType.GetAllAsList())
{
masterType.Items.Add(new ListItem(docT.Text, docT.Id.ToString()));
}
masterType.SelectedValue = dt.MasterContentType.ToString();
//hack to close window if not a doctype...
if (dt == null) {
Response.Write("<script type=\"text/javascript\">javascript:parent.window.close()</script>");
} else {
rename.Text = dt.Text + " (copy)";
pane_settings.Text = "Make a copy of the document type '" + dt.Text + "' and save it under a new name";
}
rename.Text = dt.Text + " (copy)";
pane_settings.Text = "Make a copy of the document type '" + dt.Text + "' and save it under a new name";
} else {
}
else
{
pane_form.Visible = true;
pane_form_notice.Visible = true;
@@ -83,28 +85,30 @@ namespace umbraco.dialogs
ok.Attributes.Add("style", "width: 60px");
ok.Attributes.Add("disabled", "true");
string currentPath = "";
CMSNode d = new CMSNode(int.Parse(helper.Request("id")));
foreach (string s in d.Path.Split(',')) {
var currentPath = "";
var d = new CMSNode(int.Parse(helper.Request("id")));
foreach (var s in d.Path.Split(','))
{
if (int.Parse(s) > 0)
currentPath += "/" + new CMSNode(int.Parse(s)).Text;
}
//
bool validAction = true;
var validAction = true;
// only validate permissions in content
if (app == "content" && d.HasChildren)
if (CurrentApp == "content" && d.HasChildren)
{
validAction = ValidAction(helper.Request("mode") == "cut" ? 'M' : 'O');
}
if (helper.Request("mode") == "cut") {
if (helper.Request("mode") == "cut")
{
pane_form.Text = ui.Text("moveOrCopy", "moveTo", d.Text, base.getUser());
pp_relate.Visible = false;
} else {
}
else
{
pane_form.Text = ui.Text("moveOrCopy", "copyTo", d.Text, base.getUser());
pp_relate.Visible = true;
}
@@ -119,192 +123,194 @@ namespace umbraco.dialogs
}
private bool ValidAction(char actionLetter)
private static bool ValidAction(char actionLetter)
{
CMSNode d = new CMSNode(int.Parse(helper.Request("id")));
IAction currentAction = umbraco.BusinessLogic.Actions.Action.GetPermissionAssignable().Where(a => a.Letter == actionLetter).First();
var d = new CMSNode(int.Parse(helper.Request("id")));
var currentAction = BusinessLogic.Actions.Action.GetPermissionAssignable().First(a => a.Letter == actionLetter);
return CheckPermissions(d, currentAction,actionLetter);
}
private bool CheckPermissions(CMSNode node, IAction currentAction, char actionLetter)
{
UserPermissions currUserPermissions = new UserPermissions(UmbracoEnsuredPage.CurrentUser);
List<IAction> lstCurrUserActions = currUserPermissions.GetExistingNodePermission(node.Id);
private static bool CheckPermissions(CMSNode node, IAction currentAction, char actionLetter)
{
var currUserPermissions = new UserPermissions(CurrentUser);
var lstCurrUserActions = currUserPermissions.GetExistingNodePermission(node.Id);
if (!lstCurrUserActions.Contains(currentAction))
return false;
if (node.HasChildren)
{
foreach (CMSNode c in node.Children)
if (!CheckPermissions(c,currentAction,actionLetter))
return false;
return node.Children.Cast<CMSNode>().All(c => CheckPermissions(c, currentAction, actionLetter));
}
return true;
}
//PPH moving multiple nodes and publishing them aswell.
private void handleChildNodes(cms.businesslogic.web.Document d) {
//store children array here because iterating over an Array object is very inneficient.
var c = d.Children;
foreach (cms.businesslogic.web.Document cd in c)
private static void HandleChildNodes(cms.businesslogic.web.Document d)
{
var c = d.Children;
foreach (var cd in c)
{
if (cd.Published)
{
cd.Publish(new BusinessLogic.User(0));
//using library.publish to support load balancing.
library.UpdateDocumentCache(cd);
if (cd.HasChildren)
{
HandleChildNodes(cd);
}
}
}
}
//PPH Handle doctype copies..
private void HandleDocumentTypeCopy()
{
var eDt = new cms.businesslogic.web.DocumentType(int.Parse(helper.Request("id")));
var alias = rename.Text;
var dt = cms.businesslogic.web.DocumentType.MakeNew(getUser(), alias.Replace("'", "''"));
dt.IconUrl = eDt.IconUrl;
dt.Thumbnail = eDt.Thumbnail;
dt.Description = eDt.Description;
dt.allowedTemplates = eDt.allowedTemplates;
dt.DefaultTemplate = eDt.DefaultTemplate;
dt.AllowedChildContentTypeIDs = eDt.AllowedChildContentTypeIDs;
dt.MasterContentType = int.Parse(masterType.SelectedValue);
var oldNewTabIds = new Hashtable();
foreach (var tab in eDt.getVirtualTabs.ToList())
{
if (cd.Published) {
cd.Publish(new umbraco.BusinessLogic.User(0));
//using library.publish to support load balancing.
umbraco.library.UpdateDocumentCache(cd);
if (tab.ContentType == eDt.Id)
{
var tId = dt.AddVirtualTab(tab.Caption);
oldNewTabIds.Add(tab.Id, tId);
}
}
foreach (var pt in eDt.PropertyTypes)
{
if (pt.ContentTypeId == eDt.Id)
{
var nPt = cms.businesslogic.propertytype.PropertyType.MakeNew(pt.DataTypeDefinition, dt, pt.Name, pt.Alias);
nPt.ValidationRegExp = pt.ValidationRegExp;
nPt.SortOrder = pt.SortOrder;
nPt.Mandatory = pt.Mandatory;
nPt.Description = pt.Description;
if (cd.HasChildren) {
handleChildNodes(cd);
if (pt.TabId > 0 && oldNewTabIds[pt.TabId] != null)
{
var newTabId = (int)oldNewTabIds[pt.TabId];
nPt.TabId = newTabId;
}
}
}
}
//PPH Handle doctype copies..
private void HandleDocumentTypeCopy() {
var returnUrl = SystemDirectories.Umbraco + "/settings/editNodeTypeNew.aspx?id=" + dt.Id.ToString();
cms.businesslogic.web.DocumentType eDt = new umbraco.cms.businesslogic.web.DocumentType(int.Parse(helper.Request("id")));
//Documentype exists.. create new doc type...
if (eDt != null) {
string Alias = rename.Text;
cms.businesslogic.web.DocumentType dt = cms.businesslogic.web.DocumentType.MakeNew(base.getUser(), Alias.Replace("'", "''"));
dt.IconUrl = eDt.IconUrl;
dt.Thumbnail = eDt.Thumbnail;
dt.Description = eDt.Description;
dt.allowedTemplates = eDt.allowedTemplates;
dt.DefaultTemplate = eDt.DefaultTemplate;
dt.AllowedChildContentTypeIDs = eDt.AllowedChildContentTypeIDs;
dt.MasterContentType = int.Parse(masterType.SelectedValue);
Hashtable oldNewTabIds = new Hashtable();
foreach (cms.businesslogic.web.DocumentType.TabI tab in eDt.getVirtualTabs.ToList())
{
if (tab.ContentType == eDt.Id)
{
int tId = dt.AddVirtualTab(tab.Caption);
oldNewTabIds.Add(tab.Id, tId);
}
}
foreach (cms.businesslogic.propertytype.PropertyType pt in eDt.PropertyTypes) {
if (pt.ContentTypeId == eDt.Id)
{
cms.businesslogic.propertytype.PropertyType nPt = umbraco.cms.businesslogic.propertytype.PropertyType.MakeNew(pt.DataTypeDefinition, dt, pt.Name, pt.Alias);
nPt.ValidationRegExp = pt.ValidationRegExp;
nPt.SortOrder = pt.SortOrder;
nPt.Mandatory = pt.Mandatory;
nPt.Description = pt.Description;
if (pt.TabId > 0 && oldNewTabIds[pt.TabId] != null)
{
int newTabId = (int)oldNewTabIds[pt.TabId];
nPt.TabId = newTabId;
}
}
}
string returnUrl = SystemDirectories.Umbraco + "/settings/editNodeTypeNew.aspx?id=" + dt.Id.ToString();
dt.Save();
dt.Save();
pane_settings.Visible = false;
panel_buttons.Visible = false;
pane_settings.Visible = false;
panel_buttons.Visible = false;
feedback.Text = "Document type copied";
feedback.type = umbraco.uicontrols.Feedback.feedbacktype.success;
feedback.Text = "Document type copied";
feedback.type = uicontrols.Feedback.feedbacktype.success;
ClientTools.ChangeContentFrameUrl(returnUrl);
}
}
public void HandleMoveOrCopy(object sender, EventArgs e) {
if (UmbracoContext.Current.Request["app"] == "settings")
HandleDocumentTypeCopy();
else
HandleDocumentMoveOrCopy();
}
ClientTools.ChangeContentFrameUrl(returnUrl);
}
protected override void OnPreRender(EventArgs e) {
base.OnPreRender(e);
public void HandleMoveOrCopy(object sender, EventArgs e)
{
if (Request["app"] == "settings")
HandleDocumentTypeCopy();
else
HandleDocumentMoveOrCopy();
}
ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("../webservices/cmsnode.asmx"));
ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("../webservices/legacyAjaxCalls.asmx"));
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("../webservices/cmsnode.asmx"));
ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("../webservices/legacyAjaxCalls.asmx"));
}
private void HandleDocumentMoveOrCopy()
private void HandleDocumentMoveOrCopy()
{
if (helper.Request("copyTo") != "" && helper.Request("id") != "")
{
// Check if the current node is allowed at new position
bool nodeAllowed = false;
var nodeAllowed = false;
cms.businesslogic.Content currentNode = new cms.businesslogic.Content(int.Parse(helper.Request("id")));
int oldParent = -1;
var currentNode = new cms.businesslogic.Content(int.Parse(helper.Request("id")));
var oldParent = -1;
if (currentNode.Level > 1)
oldParent = currentNode.Parent.Id;
cms.businesslogic.Content newNode = new cms.businesslogic.Content(int.Parse(helper.Request("copyTo")));
var newNode = new cms.businesslogic.Content(int.Parse(helper.Request("copyTo")));
// Check on contenttypes
if (int.Parse(helper.Request("copyTo")) == -1)
nodeAllowed = true;
else
{
foreach (int i in newNode.ContentType.AllowedChildContentTypeIDs.ToList())
if (i == currentNode.ContentType.Id)
{
nodeAllowed = true;
break;
}
if (!nodeAllowed) {
feedback.Text = ui.Text("moveOrCopy", "notAllowedByContentType", base.getUser());
feedback.type = umbraco.uicontrols.Feedback.feedbacktype.error;
} else {
// Check on paths
if (((string)("," + newNode.Path + ",")).IndexOf("," + currentNode.Id + ",") > -1) {
nodeAllowed = false;
feedback.Text = ui.Text("moveOrCopy", "notAllowedByPath", base.getUser());
feedback.type = umbraco.uicontrols.Feedback.feedbacktype.error;
}
}
}
if (int.Parse(helper.Request("copyTo")) == -1)
{
nodeAllowed = true;
}
else
{
if (newNode.ContentType.AllowedChildContentTypeIDs.ToList().Any(i => i == currentNode.ContentType.Id))
{
nodeAllowed = true;
}
if (!nodeAllowed)
{
feedback.Text = ui.Text("moveOrCopy", "notAllowedByContentType", base.getUser());
feedback.type = uicontrols.Feedback.feedbacktype.error;
}
else
{
// Check on paths
if (("," + newNode.Path + ",").IndexOf("," + currentNode.Id + ",") > -1)
{
nodeAllowed = false;
feedback.Text = ui.Text("moveOrCopy", "notAllowedByPath", getUser());
feedback.type = uicontrols.Feedback.feedbacktype.error;
}
}
}
if (nodeAllowed)
if (nodeAllowed)
{
pane_form.Visible = false;
pane_form_notice.Visible = false;
panel_buttons.Visible = false;
string newNodeCaption = newNode.Id == -1 ? ui.Text(helper.Request("app")) : newNode.Text;
var newNodeCaption = newNode.Id == -1 ? ui.Text(helper.Request("app")) : newNode.Text;
string[] nodes = {currentNode.Text, newNodeCaption };
if (UmbracoContext.Current.Request["mode"] == "cut")
if (Request["mode"] == "cut")
{
if (UmbracoContext.Current.Request["app"] == "content")
if (Request["app"] == "content")
{
//PPH changed this to document instead of cmsNode to handle republishing.
cms.businesslogic.web.Document d = new umbraco.cms.businesslogic.web.Document(int.Parse(helper.Request("id")));
var d = new cms.businesslogic.web.Document(int.Parse(helper.Request("id")));
d.Move(int.Parse(helper.Request("copyTo")));
if (d.Published)
{
d.Publish(new umbraco.BusinessLogic.User(0));
d.Publish(new BusinessLogic.User(0));
//using library.publish to support load balancing.
//umbraco.library.PublishSingleNode(d.Id);
umbraco.library.UpdateDocumentCache(d);
library.UpdateDocumentCache(d);
//PPH added handling of load balanced moving of multiple nodes...
if (d.HasChildren)
{
handleChildNodes(d);
HandleChildNodes(d);
}
//Using the general Refresh content method instead as it supports load balancing.
@@ -315,14 +321,14 @@ namespace umbraco.dialogs
}
else
{
Media m = new Media(int.Parse(UmbracoContext.Current.Request["id"]));
m.Move(int.Parse(UmbracoContext.Current.Request["copyTo"]));
var m = new Media(int.Parse(Request["id"]));
m.Move(int.Parse(Request["copyTo"]));
m.XmlGenerate(new XmlDocument());
library.ClearLibraryCacheForMedia(m.Id);
}
feedback.Text = ui.Text("moveOrCopy", "moveDone", nodes, base.getUser()) + "</p><p><a href='#' onclick='" + ClientTools.Scripts.CloseModalWindow() + "'>" + ui.Text("closeThisWindow") + "</a>";
feedback.type = umbraco.uicontrols.Feedback.feedbacktype.success;
feedback.Text = ui.Text("moveOrCopy", "moveDone", nodes, getUser()) + "</p><p><a href='#' onclick='" + ClientTools.Scripts.CloseModalWindow() + "'>" + ui.Text("closeThisWindow") + "</a>";
feedback.type = uicontrols.Feedback.feedbacktype.success;
// refresh tree
ClientTools.MoveNode(currentNode.Id.ToString(), newNode.Path);
@@ -330,33 +336,15 @@ namespace umbraco.dialogs
}
else
{
cms.businesslogic.web.Document d = new cms.businesslogic.web.Document(int.Parse(helper.Request("id")));
d.Copy(int.Parse(helper.Request("copyTo")), this.getUser(), RelateDocuments.Checked);
feedback.Text = ui.Text("moveOrCopy", "copyDone", nodes, base.getUser()) + "</p><p><a href='#' onclick='" + ClientTools.Scripts.CloseModalWindow() + "'>" + ui.Text("closeThisWindow") + "</a>";
feedback.type = umbraco.uicontrols.Feedback.feedbacktype.success;
var d = new cms.businesslogic.web.Document(int.Parse(helper.Request("id")));
d.Copy(int.Parse(helper.Request("copyTo")), getUser(), RelateDocuments.Checked);
feedback.Text = ui.Text("moveOrCopy", "copyDone", nodes, getUser()) + "</p><p><a href='#' onclick='" + ClientTools.Scripts.CloseModalWindow() + "'>" + ui.Text("closeThisWindow") + "</a>";
feedback.type = uicontrols.Feedback.feedbacktype.success;
ClientTools.CopyNode(currentNode.Id.ToString(), newNode.Path);
}
}
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
}
#endregion
}
}

View File

@@ -1,8 +1,9 @@
using System;
using System.Linq;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using umbraco.BusinessLogic;
using umbraco.businesslogic.Exceptions;
using umbraco.IO;
namespace umbraco.BasePages
{
@@ -54,7 +55,7 @@ namespace umbraco.BasePages
if (permissions.IndexOf(Action) > -1 && (Path.Contains("-20") || ("," + Path + ",").Contains("," + getUser().StartNodeId.ToString() + ",")))
return true;
Log.Add(LogTypes.LoginFailure, getUser(), -1, "Insufficient permissions in UmbracoEnsuredPage: '" + Path + "', '" + permissions + "', '" + Action + "'");
LogHelper.Info<UmbracoEnsuredPage>("Insufficient permissions in UmbracoEnsuredPage: '" + Path + "', '" + permissions + "', '" + Action + "'");
return false;
}
@@ -81,7 +82,7 @@ namespace umbraco.BasePages
{
ensureContext();
if (!String.IsNullOrEmpty(CurrentApp))
if (!string.IsNullOrEmpty(CurrentApp))
{
if (!ValidateUserApp(CurrentApp))
throw new UserAuthorizationException(String.Format("The current user doesn't have access to the section/app '{0}'", CurrentApp));
@@ -89,7 +90,7 @@ namespace umbraco.BasePages
}
catch (UserAuthorizationException)
{
Log.Add(LogTypes.Error, CurrentUser, -1, String.Format("Tried to access '{0}'", CurrentApp));
LogHelper.Warn<UmbracoEnsuredPage>(string.Format("{0} tried to access '{1}'", CurrentUser.Id, CurrentApp));
throw;
}
catch