From fde6eef6b9f081effb2bbda9ac3b17826be9c40e Mon Sep 17 00:00:00 2001 From: Andrew Ma Date: Mon, 5 Apr 2010 22:36:30 -0700 Subject: [PATCH] Fix for issue [workitem:16371] Removing FollowReturnUrl filter because it always gets executed and does not allow actions to return other view or redirect to other locations. Replacing filter with a Controller extension method called ReturnUrlRedirect which parses the ReturnUrl in the querystring and returns a RedirectFilter action with that Url. --- .../Controllers/BlogPostAdminController.cs | 3 +- .../Controllers/AdminController.cs | 3 +- .../Controllers/AccountController.cs | 9 ++-- .../Mvc/Extensions/ControllerExtensions.cs | 39 +++++++++++++++++ .../FollowReturnUrlAttribute.cs | 8 ---- .../FollowReturnUrl/FollowReturnUrlFilter.cs | 42 ------------------- src/Orchard/Orchard.csproj | 4 +- 7 files changed, 47 insertions(+), 61 deletions(-) create mode 100644 src/Orchard/Mvc/Extensions/ControllerExtensions.cs delete mode 100644 src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlAttribute.cs delete mode 100644 src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlFilter.cs diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogPostAdminController.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogPostAdminController.cs index 81e476a89..ade28607a 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogPostAdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogPostAdminController.cs @@ -7,7 +7,6 @@ using Orchard.Blogs.ViewModels; using Orchard.ContentManagement; using Orchard.Localization; using Orchard.Mvc.AntiForgery; -using Orchard.Mvc.FollowReturnUrl; using Orchard.Mvc.Results; using Orchard.UI.Admin; using Orchard.UI.Notify; @@ -101,7 +100,7 @@ namespace Orchard.Blogs.Controllers { return View(model); } - [HttpPost, ActionName("Edit"), FollowReturnUrl] + [HttpPost, ActionName("Edit")] public ActionResult EditPOST(string blogSlug, int postId) { if (!Services.Authorizer.Authorize(Permissions.EditBlogPost, T("Couldn't edit blog post"))) return new HttpUnauthorizedResult(); diff --git a/src/Orchard.Web/Modules/Orchard.Pages/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Pages/Controllers/AdminController.cs index dc5a3b9c2..f9969f0da 100644 --- a/src/Orchard.Web/Modules/Orchard.Pages/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Pages/Controllers/AdminController.cs @@ -7,7 +7,6 @@ using JetBrains.Annotations; using Orchard.Localization; using Orchard.ContentManagement; using Orchard.Mvc.AntiForgery; -using Orchard.Mvc.FollowReturnUrl; using Orchard.Mvc.Results; using Orchard.Pages.Drivers; using Orchard.Pages.Models; @@ -174,7 +173,7 @@ namespace Orchard.Pages.Controllers { return View(model); } - [HttpPost, ActionName("Edit"), FollowReturnUrl] + [HttpPost, ActionName("Edit")] public ActionResult EditPOST(int id) { var page = _pageService.GetPageOrDraft(id); if (page == null) diff --git a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs index ee32a9988..5975abe20 100644 --- a/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs +++ b/src/Orchard.Web/Modules/Orchard.Users/Controllers/AccountController.cs @@ -5,7 +5,7 @@ using System.Security.Principal; using System.Web.Mvc; using System.Web.Security; using Orchard.Logging; -using Orchard.Mvc.FollowReturnUrl; +using Orchard.Mvc.Extensions; using Orchard.Mvc.ViewModels; using Orchard.Security; using Orchard.Users.Services; @@ -52,7 +52,7 @@ namespace Orchard.Users.Controllers { return View("LogOn", new LogOnViewModel {Title = "Log On"}); } - [HttpPost, FollowReturnUrl] + [HttpPost] [SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", Justification = "Needs to take same parameter type as Controller.Redirect()")] public ActionResult LogOn(string userName, string password, bool rememberMe) { @@ -63,14 +63,13 @@ namespace Orchard.Users.Controllers { _authenticationService.SignIn(user, rememberMe); - return Redirect("~/"); + return this.ReturnUrlRedirect(); } - [FollowReturnUrl] public ActionResult LogOff() { _authenticationService.SignOut(); - return Redirect("~/"); + return this.ReturnUrlRedirect(); } int MinPasswordLength { diff --git a/src/Orchard/Mvc/Extensions/ControllerExtensions.cs b/src/Orchard/Mvc/Extensions/ControllerExtensions.cs new file mode 100644 index 000000000..3110612a4 --- /dev/null +++ b/src/Orchard/Mvc/Extensions/ControllerExtensions.cs @@ -0,0 +1,39 @@ +using System; +using System.Web.Mvc; +using Orchard.Mvc.Results; + +namespace Orchard.Mvc.Extensions { + public static class ControllerExtensions { + public static RedirectResult ReturnUrlRedirect(this Controller controller) { + var request = controller.HttpContext.Request; + Uri returnUrl = null; + try + { + returnUrl = new Uri(request.QueryString["ReturnUrl"]); + } + catch + { + try + { + returnUrl = + new Uri(string.Format("{0}://{1}{2}{3}", request.Url.Scheme, request.Url.Host, + request.Url.Port != 80 ? ":" + request.Url.Port : "", + request.QueryString["ReturnUrl"])); + } + catch { } + } + + if (returnUrl != null && + returnUrl.Scheme == request.Url.Scheme && + returnUrl.Port == request.Url.Port && + returnUrl.Host == request.Url.Host) + { + return new RedirectResult(returnUrl.ToString()); + } + else + { + return new RedirectResult("~/"); + } + } + } +} diff --git a/src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlAttribute.cs b/src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlAttribute.cs deleted file mode 100644 index 98c6860a7..000000000 --- a/src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlAttribute.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; -using System.Web.Mvc; - -namespace Orchard.Mvc.FollowReturnUrl { - [AttributeUsage(AttributeTargets.Method)] - public class FollowReturnUrlAttribute : FilterAttribute { - } -} \ No newline at end of file diff --git a/src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlFilter.cs b/src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlFilter.cs deleted file mode 100644 index cd5bb31a5..000000000 --- a/src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlFilter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Web.Mvc; -using Orchard.Mvc.Filters; - -namespace Orchard.Mvc.FollowReturnUrl { - public class FollowReturnUrlFilter : FilterProvider, IActionFilter { - public void OnActionExecuting(ActionExecutingContext filterContext) { - } - - public void OnActionExecuted(ActionExecutedContext filterContext) { - var attributes = - (FollowReturnUrlAttribute[]) - filterContext.ActionDescriptor.GetCustomAttributes(typeof (FollowReturnUrlAttribute), false); - - if (attributes.Length <= 0) { - return; - } - - var request = filterContext.HttpContext.Request; - Uri returnUrl = null; - try { - returnUrl = new Uri(request.QueryString["ReturnUrl"]); - } - catch { - try { - returnUrl = - new Uri(string.Format("{0}://{1}{2}{3}", request.Url.Scheme, request.Url.Host, - request.Url.Port != 80 ? ":" + request.Url.Port : "", - request.QueryString["ReturnUrl"])); - } - catch {} - } - - if (returnUrl != null && - returnUrl.Scheme == request.Url.Scheme && - returnUrl.Port == request.Url.Port && - returnUrl.Host == request.Url.Host) { - filterContext.Result = new RedirectResult(returnUrl.ToString()); - } - } - } -} \ No newline at end of file diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index f20ebe744..be6263833 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -156,10 +156,9 @@ - + - ASPXCodeBehind @@ -366,6 +365,7 @@ +