protected virtual void SetDefaultQueryOptions(HttpActionExecutedContext actionExecutedContext)
        {
            try
            {
                if (MaxTop == 0)
                {
                    var controllingData = WebApiCachingControllingData.Data();

                    MaxTop            = controllingData.MaxTop;
                    MaxExpansionDepth = controllingData.MaxExpansionDepth;
                }

                var content = actionExecutedContext?.Response?.Content as ObjectContent;
                if (content?.Value is HttpError || content?.Value is SingleResult)
                {
                    // Paging not required.
                    return;
                }

                var hasClientPaging = actionExecutedContext?.Request?.RequestUri?.Query?.Contains("$top=") ?? false;
                if (!hasClientPaging)
                {
                    // If paging is required and there is no $top sent by client then force the page size specified by merchant.
                    PageSize = MaxTop;
                }
            }
            catch (Exception ex)
            {
                ex.Dump();
            }
        }
예제 #2
0
        public override void Uninstall()
        {
            WebApiCachingControllingData.Remove();
            WebApiCachingUserData.Remove();

            _settingService.DeleteSetting <WebApiSettings>();

            base.Uninstall();
        }
예제 #3
0
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            System.Net.Http.Headers.AuthenticationHeaderValue authorizationHeader = actionContext.Request.Headers.Authorization;
            var      result          = HmacResult.FailedForUnknownReason;
            var      controllingData = WebApiCachingControllingData.Data();
            var      dependencyScope = actionContext.Request.GetDependencyScope();
            var      utcNow          = DateTime.UtcNow;
            Customer customer        = null;

            try
            {
                result = IsAuthenticated(actionContext, dependencyScope, controllingData, utcNow, out customer);
            }
            catch (Exception exception)
            {
                exception.Dump();
            }

            if (result == HmacResult.Success)
            {
                // Inform core about the authentication. Note, you cannot use IWorkContext.set_CurrentCustomer here.
                HttpContext.Current.User = new SmartStorePrincipal(customer, HmacAuthentication.Scheme1);

                var response = HttpContext.Current.Response;

                response.AddHeader(WebApiGlobal.Header.AppVersion, SmartStoreVersion.CurrentFullVersion);
                response.AddHeader(WebApiGlobal.Header.Version, controllingData.Version);
                response.AddHeader(WebApiGlobal.Header.MaxTop, controllingData.MaxTop.ToString());
                response.AddHeader(WebApiGlobal.Header.Date, utcNow.ToString("o"));
                response.AddHeader(WebApiGlobal.Header.CustomerId, customer.Id.ToString());

                response.Cache.SetCacheability(HttpCacheability.NoCache);
            }
            else
            {
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);

                var headers       = actionContext.Response.Headers;
                var authorization = actionContext.Request.Headers.Authorization;

                // See RFC-2616
                var scheme = _hmac.GetWwwAuthenticateScheme(authorization != null ? authorization.Scheme : null);
                headers.WwwAuthenticate.Add(new AuthenticationHeaderValue(scheme));

                headers.Add(WebApiGlobal.Header.AppVersion, SmartStoreVersion.CurrentFullVersion);
                headers.Add(WebApiGlobal.Header.Version, controllingData.Version);
                headers.Add(WebApiGlobal.Header.MaxTop, controllingData.MaxTop.ToString());
                headers.Add(WebApiGlobal.Header.Date, utcNow.ToString("o"));
                headers.Add(WebApiGlobal.Header.HmacResultId, ((int)result).ToString());
                headers.Add(WebApiGlobal.Header.HmacResultDescription, result.ToString());

                if (controllingData.LogUnauthorized)
                {
                    LogUnauthorized(actionContext, dependencyScope, result, customer);
                }
            }
        }
예제 #4
0
        public override void Install()
        {
            _settingService.SaveSetting(new WebApiSettings());
            _localizationService.ImportPluginResourcesFromXml(PluginDescriptor);

            base.Install();

            WebApiCachingControllingData.Remove();
            WebApiCachingUserData.Remove();
        }
예제 #5
0
        private CatalogSearchQuery NormalizeQuery(CatalogSearchQuery query)
        {
            var controllingData = WebApiCachingControllingData.Data();

            query = query
                    .BuildFacetMap(false)
                    .Slice(query.Skip, Math.Min(query.Take, controllingData.MaxTop));

            return(query);
        }
예제 #6
0
        public override void Uninstall()
        {
            WebApiCachingControllingData.Remove();
            WebApiCachingUserData.Remove();

            _settingService.DeleteSetting <WebApiSettings>();

            _permissionService.UninstallPermissions(new WebApiPermissionProvider());

            base.Uninstall();
        }
예제 #7
0
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            var      result = HmacResult.FailedForUnknownReason;
            var      cacheControllingData = WebApiCachingControllingData.Data();
            var      now      = DateTime.UtcNow;
            Customer customer = null;

            try
            {
                result = IsAuthenticated(actionContext, now, cacheControllingData, out customer);
            }
            catch (Exception exc)
            {
                exc.Dump();
            }

            if (result == HmacResult.Success)
            {
                // inform core about the authentication. note you cannot use IWorkContext.set_CurrentCustomer here.
                HttpContext.Current.User = new cloudCommercePrincipal(customer, HmacAuthentication.Scheme1);

                var response = HttpContext.Current.Response;

                response.AddHeader(WebApiGlobal.Header.Version, cacheControllingData.Version);
                response.AddHeader(WebApiGlobal.Header.MaxTop, WebApiGlobal.MaxTop.ToString());
                response.AddHeader(WebApiGlobal.Header.Date, now.ToString("o"));
                response.AddHeader(WebApiGlobal.Header.CustomerId, customer.Id.ToString());

                response.Cache.SetCacheability(HttpCacheability.NoCache);
            }
            else
            {
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);

                var headers = actionContext.Response.Headers;

                var scheme = _hmac.GetWwwAuthenticateScheme(actionContext.Request.Headers.Authorization.Scheme);
                headers.WwwAuthenticate.Add(new AuthenticationHeaderValue(scheme));                             // see RFC-2616

                headers.Add(WebApiGlobal.Header.Version, cacheControllingData.Version);
                headers.Add(WebApiGlobal.Header.MaxTop, WebApiGlobal.MaxTop.ToString());
                headers.Add(WebApiGlobal.Header.Date, now.ToString("o"));
                headers.Add(WebApiGlobal.Header.HmacResultId, ((int)result).ToString());
                headers.Add(WebApiGlobal.Header.HmacResultDescription, result.ToString());

                if (cacheControllingData.LogUnauthorized)
                {
                    LogUnauthorized(actionContext, result, customer);
                }
            }
        }
        public ActionResult SaveGeneralSettings(WebApiConfigModel model)
        {
            if (!ModelState.IsValid)
            {
                return(Configure());
            }

            model.Copy(_webApiSettings, false);
            Services.Settings.SaveSetting(_webApiSettings);

            WebApiCachingControllingData.Remove();

            return(Configure());
        }
예제 #9
0
        public override void Uninstall()
        {
            WebApiCachingControllingData.Remove();
            WebApiCachingUserData.Remove();

            _settingService.DeleteSetting <WebApiSettings>();

            _permissionService.UninstallPermissions(new WebApiPermissionProvider());

            _localizationService.DeleteLocaleStringResources(this.PluginDescriptor.ResourceRootKey);
            _localizationService.DeleteLocaleStringResources("Plugins.FriendlyName.Api.WebApi", false);

            base.Uninstall();
        }
예제 #10
0
        protected virtual bool MissingClientPaging(HttpActionExecutedContext actionExecutedContext)
        {
            if (PagingOptional)
            {
                return(false);
            }

            try
            {
                var content = actionExecutedContext.Response.Content as ObjectContent;

                if (MaxTop == 0)
                {
                    var controllingData = WebApiCachingControllingData.Data();

                    MaxTop            = controllingData.MaxTop;
                    MaxExpansionDepth = controllingData.MaxExpansionDepth;
                }

                if (content != null)
                {
                    if (content.Value is HttpError)
                    {
                        return(false);
                    }

                    if (content.Value is SingleResult)
                    {
                        return(false);                          // 'true' would result in a 500 'internal server error'
                    }
                }

                var query = actionExecutedContext.Request.RequestUri.Query;
                var missingClientPaging = query.IsEmpty() || !query.Contains("$top=");

                if (missingClientPaging)
                {
                    actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest,
                                                                                                       $"Missing client paging. Please specify odata $top query option. Maximum value is {MaxTop}.");

                    return(true);
                }
            }
            catch (Exception exception)
            {
                exception.Dump();
            }

            return(false);
        }
        public async Task <IHttpActionResult> SearchFiles(ODataActionParameters parameters)
        {
            MediaSearchResult result = null;

            await this.ProcessEntityAsync(async() =>
            {
                var maxTop = WebApiCachingControllingData.Data().MaxTop;
                var query  = parameters.GetValueSafe <MediaSearchQuery>("Query") ?? new MediaSearchQuery {
                    PageSize = maxTop
                };

                query.PageSize = Math.Min(query.PageSize, maxTop);

                result = await Service.SearchFilesAsync(query, _defaultLoadFlags);
            });

            return(Ok(result.Select(x => Convert(x)).AsQueryable()));
        }
예제 #12
0
        public override void Install()
        {
            _permissionService.InstallPermissions(new WebApiPermissionProvider());

            var apiSettings = new WebApiSettings
            {
                LogUnauthorized   = true,
                ValidMinutePeriod = WebApiGlobal.DefaultTimePeriodMinutes
            };

            _settingService.SaveSetting <WebApiSettings>(apiSettings);

            _localizationService.ImportPluginResourcesFromXml(this.PluginDescriptor);

            base.Install();

            WebApiCachingControllingData.Remove();
            WebApiCachingUserData.Remove();
        }
예제 #13
0
        public ActionResult SaveGeneralSettings(WebApiConfigModel model)
        {
            if (!ModelState.IsValid)
            {
                return(Configure());
            }

            if (!HasPermission(false))
            {
                return(AccessDeniedPartialView());
            }

            model.Copy(_webApiSettings, false);
            _commonServices.Settings.SaveSetting(_webApiSettings);

            WebApiCachingControllingData.Remove();

            return(Configure());
        }