From 33599a15a298e1bf58aea997e110e464206b1c08 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 30 Sep 2013 16:06:56 +1000 Subject: [PATCH] Fixes: U4-2952 Preview mode causes ysod - null reference --- src/Umbraco.Web/UmbracoContext.cs | 11 +++++++--- src/Umbraco.Web/UmbracoModule.cs | 35 ++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web/UmbracoContext.cs b/src/Umbraco.Web/UmbracoContext.cs index 756b1abfcd..2959209040 100644 --- a/src/Umbraco.Web/UmbracoContext.cs +++ b/src/Umbraco.Web/UmbracoContext.cs @@ -23,6 +23,8 @@ namespace Umbraco.Web private bool _replacing; private PreviewContent _previewContent; + //explicit flag during ctor + private bool? _isPreviewing; /// /// Used if not running in a web application (no real HttpContext) @@ -198,8 +200,8 @@ namespace Umbraco.Web ContentCache = publishedCaches.CreateContextualContentCache(this); MediaCache = publishedCaches.CreateContextualMediaCache(this); - InPreviewMode = preview ?? DetectInPreviewModeFromRequest(); - + _isPreviewing = preview; + // set the urls... //original request url //NOTE: The request will not be available during app startup so we can only set this to an absolute URL of localhost, this @@ -399,7 +401,10 @@ namespace Umbraco.Web /// /// Determines whether the current user is in a preview mode and browsing the site (ie. not in the admin UI) /// - public bool InPreviewMode { get; private set; } + public bool InPreviewMode + { + get { return _isPreviewing ?? DetectInPreviewModeFromRequest(); } + } private bool DetectInPreviewModeFromRequest() { diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs index 8a43d34dc3..8a33b2449a 100644 --- a/src/Umbraco.Web/UmbracoModule.cs +++ b/src/Umbraco.Web/UmbracoModule.cs @@ -168,9 +168,9 @@ namespace Umbraco.Web if (http.Request.Url.IsClientSideRequest()) return; - if (app.Request.Url.IsBackOfficeRequest() - || app.Request.Url.IsInstallerRequest() - || BaseRest.BaseRestHandler.IsBaseRestRequest(UmbracoContext.Current.OriginalRequestUrl)) + var req = new HttpRequestWrapper(app.Request); + + if (ShouldAuthenticateRequest(req, UmbracoContext.Current.OriginalRequestUrl)) { var ticket = http.GetUmbracoAuthTicket(); if (ticket != null && !ticket.Expired && http.RenewUmbracoAuthTicket()) @@ -220,6 +220,35 @@ namespace Umbraco.Web #region Methods + /// + /// Determines if we should authenticate the request + /// + /// + /// + /// + /// + /// We auth the request when: + /// * it is a back office request + /// * it is an installer request + /// * it is a /base request + /// * it is a preview request + /// + internal static bool ShouldAuthenticateRequest(HttpRequestBase request, Uri originalRequestUrl) + { + if (//check back office + request.Url.IsBackOfficeRequest() + //check installer + || request.Url.IsInstallerRequest() + //detect in preview + || (request.HasPreviewCookie() && request.Url != null && request.Url.AbsolutePath.StartsWith(IOHelper.ResolveUrl(SystemDirectories.Umbraco)) == false) + //check for base + || BaseRest.BaseRestHandler.IsBaseRestRequest(originalRequestUrl)) + { + return true; + } + return false; + } + /// /// Checks the current request and ensures that it is routable based on the structure of the request and URI ///