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); }
internal IDisposable Subscribe <T>(SubscriptionBase <T> subscription) where T : class { if (_database is null) { throw new InvalidOperationException("notification service is not initialized"); } subscription.LiteCollection = _database.GetCollection <T>(subscription.Collection); _subscriptions.TryAdd(subscription, default); return(new Unsubscriber(_subscriptions, subscription)); }
public Uri GetCallbackUri(Subscription subscription, SubscriptionBase parameters) { var properties = parameters.GetType().GetProperties() .Where(x => x.GetValue(parameters, null) != null) .Select(x => this.GetFieldName(x) + "=" + HttpUtility.UrlEncode(x.GetValue(parameters, null).ToString())); var addedParamteres = String.Join("&", properties.ToArray()); var newUri = new UriBuilder(subscription.Callback); newUri.Query += addedParamteres; return(newUri.Uri); }
private void CreateSubscription() { var ids = new FolderId[2] { new FolderId(WellKnownFolderName.Root), new FolderId(WellKnownFolderName.Inbox) }; var events = new List <EventType>(); events.Add(EventType.NewMail); if (_subscription != null) { ((StreamingSubscription)_subscription).Unsubscribe(); _connection.RemoveSubscription((StreamingSubscription)_subscription); } _subscription = _exchange.SubscribeToStreamingNotifications(ids, events.ToArray()); _connection.AddSubscription((StreamingSubscription)_subscription); }
internal IDisposable Subscribe <T>(SubscriptionBase <T> subscription) where T : class { _subscriptions.TryAdd(subscription, default); return(new Unsubscriber(_subscriptions, subscription)); }
private void OnSubscriptionChanged() { // Consider also defining an event and raising it here this._subscription = SubscriptionBase.GetSubscription(this.IsSubscribed); }