コード例 #1
0
        public async Task Run(Subscription subscription, bool simulateCancellation)
        {
            HubValidationOutcome validationOutcome = simulateCancellation ? HubValidationOutcome.Canceled : HubValidationOutcome.Valid;
            var validationResult = await this.validator.ValidateSubscription(subscription, validationOutcome);

            if (validationResult == ClientValidationOutcome.Verified)
            {
                if (subscription.Mode == SubscriptionMode.subscribe)
                {
                    this.logger.LogInformation($"Adding verified subscription: {subscription}.");
                    this.subscriptions.AddSubscription(subscription);
                }
                else if (subscription.Mode == SubscriptionMode.unsubscribe)
                {
                    this.logger.LogInformation($"Removing verified subscription: {subscription}.");
                    this.subscriptions.RemoveSubscription(subscription);
                }
            }
            else
            {
                var addingOrRemoving = subscription.Mode == SubscriptionMode.subscribe ? "adding" : "removing";
                this.logger.LogInformation($"Not {addingOrRemoving} unverified subscription: {subscription}.");
            }
        }
コード例 #2
0
        public async Task <ClientValidationOutcome> ValidateSubscription(Subscription subscription, HubValidationOutcome outcome)
        {
            if (subscription == null)
            {
                throw new ArgumentNullException(nameof(subscription));
            }

            SubscriptionBase callbackParameters = null;

            if (outcome == HubValidationOutcome.Canceled)
            {
                logger.LogDebug("Simulating canceled subscription.");

                callbackParameters = new SubscriptionCancelled
                {
                    Reason = $"The subscription {subscription} was canceled for testing purposes.",
                };
            }
            else
            {
                logger.LogDebug("Verifying subscription.");

                callbackParameters = new SubscriptionVerification
                {
                    // Note that this is not necessarily cryptographically random/secure.
                    Challenge     = Guid.NewGuid().ToString("n"),
                    Lease_Seconds = subscription.Lease_Seconds
                };
            }

            // Default parametres for both cancel/verify.
            callbackParameters.Callback = subscription.Callback;
            callbackParameters.Events   = subscription.Events;
            callbackParameters.Mode     = subscription.Mode;
            callbackParameters.Topic    = subscription.Topic;

            logger.LogDebug($"Calling callback url: {subscription.Callback}");
            var callbackUri = new SubscriptionCallback().GetCallbackUri(subscription, callbackParameters);
            var response    = await new HttpClient().GetAsync(callbackUri);

            if (!response.IsSuccessStatusCode)
            {
                logger.LogInformation($"Status code was not success but instead {response.StatusCode}");
                return(ClientValidationOutcome.NotVerified);
            }
            if (outcome == HubValidationOutcome.Valid)
            {
                var challenge    = ((SubscriptionVerification)callbackParameters).Challenge;
                var responseBody = (await response.Content.ReadAsStringAsync());
                if (responseBody != challenge)
                {
                    logger.LogInformation($"Callback result for verification request was not equal to challenge. Response body: '{responseBody}', Challenge: '{challenge}'.");
                    return(ClientValidationOutcome.NotVerified);
                }

                return(ClientValidationOutcome.Verified);
            }

            return(ClientValidationOutcome.NotVerified);
        }