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();
            }
        }
Exemple #2
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);
        }