public static void UpdatePersistedConnections(this ShopConnectorControllingData controllingData) { try { if (controllingData != null && controllingData.ConnectionsUpdated) { var dataToStore = controllingData.Connections.Where(x => x.LastRequestUtc.HasValue); if (dataToStore.Count() > 0) { if (DataSettings.Current.IsValid()) { // Note: IOC objects are not available here! var now = DateTime.UtcNow; var dbContext = new ShopConnectorObjectContext(DataSettings.Current.DataConnectionString); foreach (var connection in dataToStore) { try { dbContext.Execute("Update ShopConnectorConnection Set LastRequestUtc = {1}, RequestCount = {2}, LastProductCallUtc = {3}, UpdatedOnUtc = {4} Where Id = {0}", connection.Id, connection.LastRequestUtc, connection.RequestCount, connection.LastProductCallUtc, now); } catch (Exception exc) { exc.Dump(); } } } } controllingData.ConnectionsUpdated = false; } } catch (Exception exc) { exc.Dump(); } }
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); }