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)); }
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); }