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