Пример #1
0
        /// <summary>
        /// Executes the resource.
        /// </summary>
        /// <param name="resourceName">Name of the resource.</param>
        /// <param name="parameters">The parameters.</param>
        /// <exception cref="System.ArgumentNullException">Throws an exception if either parameter is <c>null</c>.</exception>
        public void ExecuteResource(string resourceName, ResourceParameters parameters)
        {
            if (string.IsNullOrEmpty(resourceName))
            {
                throw new ArgumentNullException("resourceName");
            }

            if (parameters == null)
            {
                throw new ArgumentNullException("parameters");
            }

            string message;
            var    logger  = Configuration.Logger;
            var    context = new ResourceResultContext(logger, Configuration.FrameworkProvider, Configuration.Serializer, Configuration.HtmlEncoder);

            // First we determine the current policy as it has been processed so far
            RuntimePolicy policy = DetermineAndStoreAccumulatedRuntimePolicy(RuntimeEvent.ExecuteResource);

            // It is possible that the policy now says Off, but if the requested resource is the default resource or one of it dependent resources,
            // then we need to make sure there is a good reason for not executing that resource, since the default resource (or one of it dependencies)
            // is the one we most likely need to set Glimpse On with in the first place.
            IDependOnResources defaultResourceDependsOnResources = Configuration.DefaultResource as IDependOnResources;

            if (resourceName.Equals(Configuration.DefaultResource.Name) || (defaultResourceDependsOnResources != null && defaultResourceDependsOnResources.DependsOn(resourceName)))
            {
                // To be clear we only do this for the default resource (or its dependencies), and we do this because it allows us to secure the default resource
                // the same way as any other resource, but for this we only rely on runtime policies that handle ExecuteResource runtime events and we ignore
                // ignore previously executed runtime policies (most likely during BeginRequest).
                // Either way, the default runtime policy is still our starting point and when it says Off, it remains Off
                policy = DetermineRuntimePolicy(RuntimeEvent.ExecuteResource, Configuration.DefaultRuntimePolicy);
            }

            if (policy == RuntimePolicy.Off)
            {
                string errorMessage = string.Format(Resources.ExecuteResourceInsufficientPolicy, resourceName);
                logger.Info(errorMessage);
                new StatusCodeResourceResult(403, errorMessage).Execute(context);
                return;
            }

            var resources =
                Configuration.Resources.Where(
                    r => r.Name.Equals(resourceName, StringComparison.InvariantCultureIgnoreCase));

            IResourceResult result;

            switch (resources.Count())
            {
            case 1:     // 200 - OK
                try
                {
                    var resource        = resources.First();
                    var resourceContext = new ResourceContext(parameters.GetParametersFor(resource), Configuration.PersistenceStore, logger);

                    var privilegedResource = resource as IPrivilegedResource;

                    if (privilegedResource != null)
                    {
                        result = privilegedResource.Execute(resourceContext, Configuration);
                    }
                    else
                    {
                        result = resource.Execute(resourceContext);
                    }
                }
                catch (Exception ex)
                {
                    logger.Error(Resources.GlimpseRuntimeExecuteResourceError, ex, resourceName);
                    result = new ExceptionResourceResult(ex);
                }

                break;

            case 0:     // 404 - File Not Found
                message = string.Format(Resources.ExecuteResourceMissingError, resourceName);
                logger.Warn(message);
                result = new StatusCodeResourceResult(404, message);
                break;

            default:     // 500 - Server Error
                message = string.Format(Resources.ExecuteResourceDuplicateError, resourceName);
                logger.Warn(message);
                result = new StatusCodeResourceResult(500, message);
                break;
            }

            try
            {
                result.Execute(context);
            }
            catch (Exception exception)
            {
                logger.Fatal(Resources.GlimpseRuntimeExecuteResourceResultError, exception, result.GetType());
            }
        }
Пример #2
0
        /// <summary>
        /// Executes the resource.
        /// </summary>
        /// <param name="resourceName">Name of the resource.</param>
        /// <param name="parameters">The parameters.</param>
        /// <exception cref="System.ArgumentNullException">Throws an exception if either parameter is <c>null</c>.</exception>
        public void ExecuteResource(string resourceName, ResourceParameters parameters)
        {
            if (string.IsNullOrEmpty(resourceName))
            {
                throw new ArgumentNullException("resourceName");
            }

            if (parameters == null)
            {
                throw new ArgumentNullException("parameters");
            }

            string          message;
            var             logger  = Configuration.Logger;
            var             context = new ResourceResultContext(logger, Configuration.FrameworkProvider, Configuration.Serializer, Configuration.HtmlEncoder);
            IResourceResult result;

            var policy = GetRuntimePolicy(RuntimeEvent.ExecuteResource);

            if (policy == RuntimePolicy.Off && !resourceName.Equals(Configuration.DefaultResource.Name))
            {
                message = string.Format(Resources.ExecuteResourceInsufficientPolicy, resourceName);
                logger.Info(message);
                new StatusCodeResourceResult(403, message).Execute(context);
                return;
            }

            var resources =
                Configuration.Resources.Where(
                    r => r.Name.Equals(resourceName, StringComparison.InvariantCultureIgnoreCase));

            switch (resources.Count())
            {
            case 1:     // 200 - OK
                try
                {
                    var resource        = resources.First();
                    var resourceContext = new ResourceContext(parameters.GetParametersFor(resource), Configuration.PersistenceStore, logger);

                    var privilegedResource = resource as IPrivilegedResource;

                    if (privilegedResource != null)
                    {
                        result = privilegedResource.Execute(resourceContext, Configuration);
                    }
                    else
                    {
                        result = resource.Execute(resourceContext);
                    }
                }
                catch (Exception ex)
                {
                    logger.Error(Resources.GlimpseRuntimeExecuteResourceError, ex, resourceName);
                    result = new ExceptionResourceResult(ex);
                }

                break;

            case 0:     // 404 - File Not Found
                message = string.Format(Resources.ExecuteResourceMissingError, resourceName);
                logger.Warn(message);
                result = new StatusCodeResourceResult(404, message);
                break;

            default:     // 500 - Server Error
                message = string.Format(Resources.ExecuteResourceDuplicateError, resourceName);
                logger.Warn(message);
                result = new StatusCodeResourceResult(500, message);
                break;
            }

            try
            {
                result.Execute(context);
            }
            catch (Exception exception)
            {
                logger.Fatal(Resources.GlimpseRuntimeExecuteResourceResultError, exception, result.GetType());
            }
        }