public async Task Kafka( [KafkaTrigger( "notification.services.tonlabs.io:29092", "notifications-9", ConsumerGroup = "$Default", Protocol = BrokerProtocol.SaslPlaintext, AuthenticationMode = BrokerAuthenticationMode.ScramSha512, Username = "******", Password = "******")] KafkaEventData <string> kafkaEvent, ILogger log) { var hash = string.Empty; var nonce = string.Empty; var encrypted = string.Empty; try { var input = kafkaEvent.Value.Split(' '); hash = input[0]; nonce = input[1].Base64ToHex(); encrypted = input[2]; var eventReceiver = _eventReceivers .Query <EventReceiver>($"PartitionKey eq '{hash}'") .Single(); if (eventReceiver.Url != "https://freeton.org" && !eventReceiver.IsVerified) { return; } var context = new Context().WithLogger(log); var client = _httpClientFactory.CreateClient("pollyClient"); var request = new HttpRequestMessage(HttpMethod.Post, eventReceiver.Url); request.Content = new StringContent(encrypted, Encoding.UTF8, "text/plain"); request.SetPolicyExecutionContext(context); var response = await client.SendAsync(request); log.LogInformation(nameof(Kafka), new[] { new { hash, statusCode = response.StatusCode } }); await _kafkaMessages.AddEntityAsync(new KafkaMessage { PartitionKey = hash, RowKey = hash, Nonce = nonce, Encrypted = encrypted }); } catch (Exception ex) { log.LogError( ex, nameof(Kafka), new[] { new { hash, nonce, encrypted } }); throw; } }
public async Task <IActionResult> Register( [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req, ILogger log) { var query = string.Empty; try { var responseMessage = string.Empty; var token = Guid.NewGuid().ToString().Replace("-", ""); query = await req.ReadAsStringAsync(); var queryString = HttpUtility.ParseQueryString(query); var hash = queryString["hash"]; var url = queryString["data"].Base64ToUtf8(); log.LogInformation( nameof(Register), new[] { new { hash, url, token } }); if (!Uri.TryCreate(url, UriKind.Absolute, out Uri _)) { return(new OkObjectResult("Please provide absolute URL.")); } var entity = _eventReceivers .Query <EventReceiver>($"PartitionKey eq '{hash }'") .SingleOrDefault(); if (entity == null) { var response = await _eventReceivers.AddEntityAsync(new EventReceiver { PartitionKey = hash, RowKey = hash, Url = url, Token = token }); responseMessage += $"URL '{url}' successfully added.\n\n"; } else if (entity.Url != url) { entity.Url = url; entity.IsVerified = false; entity.Token = token; var response = await _eventReceivers.UpdateEntityAsync(entity, entity.ETag); responseMessage += "URL '{url}' successfully updated.\n\n"; } if (entity == null || !entity.IsVerified) { responseMessage += $"Your token is: {token}\n\n" + $"Please confirm ownership of entered domain.\n" + $"You can verify it with one of the options:\n" + $" - respond to HTTP GET request with a token\n" + $" - add token TXT record to your DNS configuration with\n\n" + $"After you will complete this step you can " + $"proceed with domain verification by navigating " + $"to: https://ton.azurewebsites.net/api/verify/{token}\n\n"; } return(new OkObjectResult(responseMessage)); } catch (Exception ex) { log.LogError( ex, nameof(Register), new[] { new { query } }); throw; } }