public ActionResult ProductData(int id)
        {
            var context = new ShopConnectorRequestContext
            {
                ActionMethod = "About"
            };

            try
            {
                if (!_connectorService.SendRequest(context, id))
                {
                    return(new ShopConnectorOperationResult(context));
                }

                var model = new ProductDataModel {
                    Id = id
                };
                model.FetchFromDate       = _connectorService.ConvertDateTime(context.Connection.LastProductCallUtc, true);
                model.AvailableCategories = new List <SelectListItem>();

                if (System.IO.File.Exists(context.ResponsePath))
                {
                    var doc     = new XPathDocument(context.ResponsePath);
                    var content = doc.GetContent();
                    var manus   = new List <SelectListItem>();

                    foreach (XPathNavigator manu in content.Select("Manufacturers/Manufacturer"))
                    {
                        manus.Add(new SelectListItem
                        {
                            Text  = manu.GetString("Name"),
                            Value = manu.GetString("Id")
                        });
                    }
                    model.AvailableManufacturers = new MultiSelectList(manus, "Value", "Text");

                    foreach (XPathNavigator category in content.Select("Categories/Category"))
                    {
                        model.AvailableCategories.Add(new SelectListItem
                        {
                            Text  = category.GetString("Name"),
                            Value = category.GetString("Id")
                        });
                    }
                }

                ViewData["pickTimeFieldIds"] = new List <string> {
                    "FetchFromDate"
                };

                return(PartialView(model));
            }
            catch (Exception ex)
            {
                context.ResponseModel = new OperationResultModel(ex);
            }

            return(new ShopConnectorOperationResult(context));
        }
        public ActionResult About(int id)
        {
            var context = new ShopConnectorRequestContext
            {
                ActionMethod = "About"
            };

            try
            {
                if (!_connectorService.SendRequest(context, id))
                {
                    return(new ShopConnectorOperationResult(context));
                }

                var model = new AboutModel();

                if (System.IO.File.Exists(context.ResponsePath))
                {
                    var doc     = new XPathDocument(context.ResponsePath);
                    var content = doc.GetContent();

                    model.AppVersion           = content.GetString("AppVersion");
                    model.UtcTime              = content.GetString("UtcTime").ToDateTimeIso8601() ?? DateTime.UtcNow;
                    model.ConnectorVersion     = content.GetString("ConnectorVersion");
                    model.StoreName            = content.GetString("StoreName");
                    model.StoreUrl             = content.GetString("StoreUrl");
                    model.StoreCount           = content.GetValue("StoreCount", 1);
                    model.CompanyName          = content.GetString("CompanyName");
                    model.StoreLogoUrl         = content.GetString("StoreLogoUrl");
                    model.UpdatedProductsCount = content.GetString("UpdatedProductsCount", "".NaIfEmpty());
                }
                return(PartialView(model));
            }
            catch (Exception ex)
            {
                context.ResponseModel = new OperationResultModel(ex);
            }

            return(new ShopConnectorOperationResult(context));
        }
        public ActionResult ProductData(ProductDataModel model)
        {
            string val;
            var    fetchFrom = _connectorService.ConvertDateTime(model.FetchFromDate, false);

            var context = new ShopConnectorRequestContext
            {
                ActionMethod = "ProductData"
            };

            try
            {
                if (model.DataFileName.IsEmpty())
                {
                    var controllingData = ConnectionCache.ControllingData();
                    var connection      = controllingData.Connections.FirstOrDefault(x => x.Id == model.Id);

                    model.DataFileName = connection.Url.EmptyNull().Replace("https://", "").Replace("http://", "").Replace("/", "");
                }

                context.RequestContent.Add("FetchFrom", fetchFrom.HasValue ? fetchFrom.Value.ToString("o") : "");
                context.RequestContent.Add("FilterManufacturerIds", string.Join(",", model.FilterManufacturerIds ?? new int[0]));
                context.RequestContent.Add("FilterCategoryId", model.FilterCategoryId.EmptyNull());
                context.RequestContent.Add("DataFileName", model.DataFileName.EmptyNull());

                if (!_connectorService.SendRequest(context, model.Id))
                {
                    return(new ShopConnectorOperationResult(context));
                }

                var cStats = context.Headers.TryGetValue("Sm-ShopConnector-Category", out val)
                    ? val.ToIntArray()
                    : new int[] { 0, 0, 0 };

                var pStats = context.Headers.TryGetValue("Sm-ShopConnector-Product", out val)
                    ? val.ToIntArray()
                    : new int[] { 0, 0, 0 };

                string message = null;

                if ((cStats[0] == 0 && pStats[0] == 0) || ShopConnectorFileSystem.GetFileSize(context.ResponsePath) == 0)
                {
                    // Avoid empty files.
                    FileSystemHelper.DeleteFile(context.ResponsePath);

                    message = T("Plugins.SmartStore.ShopConnector.NoContent");
                }
                else
                {
                    message = T("Plugins.SmartStore.ShopConnector.ProcessingResult",
                                cStats[2].ToString("N0"), cStats[0].ToString("N0"), cStats[1].ToString("N0"),
                                pStats[2].ToString("N0"), pStats[0].ToString("N0"), pStats[1].ToString("N0"));

                    var stats = new ShopConnectorImportStats("Product");
                    stats.Add(new ImportStats.FileStats
                    {
                        Name          = Path.GetFileName(context.ResponsePath),
                        CategoryCount = cStats[0],
                        ProductCount  = pStats[0]
                    });
                }

                context.ResponseModel = new OperationResultModel(message, false);
            }
            catch (Exception ex)
            {
                context.ResponseModel = new OperationResultModel(ex);
            }

            return(new ShopConnectorOperationResult(context));
        }
Example #4
0
        protected virtual ShopConnectorAuthResult IsAuthenticated(HttpContextBase httpContext, DateTime now, ShopConnectorControllingData controllingData)
        {
            var      request = httpContext.Request;
            DateTime headDateTime;

            if (request == null)
            {
                return(ShopConnectorAuthResult.FailedForUnknownReason);
            }

            if (controllingData.ConnectorUnavailable)
            {
                return(ShopConnectorAuthResult.ConnectorUnavailable);
            }

            if (!controllingData.IsExportEnabled)
            {
                return(ShopConnectorAuthResult.ExportDeactivated);
            }

            //string headContentMd5 = request.Headers["Content-Md5"] ?? request.Headers["Content-MD5"];
            string headTimestamp = request.Headers[ShopConnectorCore.Header.Date];
            string headPublicKey = request.Headers[ShopConnectorCore.Header.PublicKey];
            string action        = request.RequestContext.RouteData.GetRequiredString("action");
            bool   forExport     = !action.IsCaseInsensitiveEqual("Notification");

            string[] authorization = request.Headers["Authorization"].SplitSafe(" ");

            if (string.IsNullOrWhiteSpace(headPublicKey))
            {
                return(ShopConnectorAuthResult.ConnectionInvalid);
            }

            if (authorization.Length != 2 || !_hmac.IsAuthorizationHeaderValid(authorization[0], authorization[1]))
            {
                return(ShopConnectorAuthResult.InvalidAuthorizationHeader);
            }

            if (!_hmac.ParseTimestamp(headTimestamp, out headDateTime))
            {
                return(ShopConnectorAuthResult.InvalidTimestamp);
            }

            int maxMinutes = (controllingData.ValidMinutePeriod <= 0 ? ShopConnectorCore.DefaultTimePeriodMinutes : controllingData.ValidMinutePeriod);

            if (Math.Abs((headDateTime - now).TotalMinutes) > maxMinutes)
            {
                return(ShopConnectorAuthResult.TimestampOutOfPeriod);
            }

            var connection = controllingData.Connections.FirstOrDefault(x => x.IsForExport == forExport && x.PublicKey == headPublicKey);

            if (connection == null)
            {
                return(ShopConnectorAuthResult.ConnectionUnknown);
            }

            if (!connection.IsActive)
            {
                return(ShopConnectorAuthResult.ConnectionDisabled);
            }

            if (connection.LastRequestUtc.HasValue && headDateTime <= connection.LastRequestUtc.Value)
            {
                return(ShopConnectorAuthResult.TimestampOlderThanLastRequest);
            }

            var context = new ShopConnectorRequestContext()
            {
                HttpMethod     = request.HttpMethod,
                HttpAcceptType = request.Headers["Accept"],
                PublicKey      = headPublicKey,
                SecretKey      = connection.SecretKey,
                Url            = HttpUtility.UrlDecode(request.Url.AbsoluteUri.ToLower())
            };

            string contentMd5 = CreateContentMd5Hash(httpContext.Request);

            string messageRepresentation = _hmac.CreateMessageRepresentation(context, contentMd5, headTimestamp);

            if (string.IsNullOrEmpty(messageRepresentation))
            {
                return(ShopConnectorAuthResult.MissingMessageRepresentationParameter);
            }

            string signatureProvider = _hmac.CreateSignature(connection.SecretKey, messageRepresentation);

            if (signatureProvider != authorization[1])
            {
                return(ShopConnectorAuthResult.InvalidSignature);
            }

            controllingData.ConnectionsUpdated = true;
            connection.LastRequestUtc          = now;

            if (connection.RequestCount < long.MaxValue)
            {
                ++connection.RequestCount;
            }

            return(ShopConnectorAuthResult.Success);
        }