mirror of
https://github.com/bitwarden/server.git
synced 2025-06-18 10:03:50 -05:00

* [SG-549] Commit Initial AuthRequest Repository (#2174) * Model Passwordless * Scaffold database for Passwordless * Implement SQL Repository * [SG-167] Base Passwordless API (#2185) * Implement Passwordless notifications * Implement Controller * Add documentation to BaseRequestValidator * Register AuthRequestRepo * Remove ExpirationDate from the AuthRequest table * [SG-407] Create job to delete expired requests (#2187) * chore: init * remove exp date * fix: log name * [SG-167] Added fingerprint phrase to response model. (#2233) * Remove FailedLoginAttempt logic * Block unknown devices * Add EF Support for passwordless * Got SignalR working for responses * Added delete job method to EF repo * Implement a GetMany API endpoint for AuthRequests * Ran dotnet format * Fix a merge issues * Redated migration scripts * tried sorting sqlproj * Remove FailedLoginAttempts from SQL * Groom Postgres script * Remove extra commas from migration script * Correct isSpent() * [SG-167] Adde identity validation for passwordless requests. Registered IAuthRepository. * [SG-167] Added origin of the request to response model * Use display name for device identifier in response * Add datetime conversions back to postgres migration script * [SG-655] Add anonymous endpoint for checking if a device & user combo match * [review] Consolidate error conditions Co-authored-by: Brandon Maharaj <107377945+BrandonM-Bitwarden@users.noreply.github.com> Co-authored-by: André Filipe da Silva Bispo <andrefsbispo@hotmail.com> Co-authored-by: André Bispo <abispo@bitwarden.com>
96 lines
3.4 KiB
C#
96 lines
3.4 KiB
C#
using Azure.Storage.Queues;
|
|
using Bit.Core.Settings;
|
|
using Bit.Core.Utilities;
|
|
using Microsoft.AspNetCore.SignalR;
|
|
|
|
namespace Bit.Notifications;
|
|
|
|
public class AzureQueueHostedService : IHostedService, IDisposable
|
|
{
|
|
private readonly ILogger _logger;
|
|
private readonly IHubContext<NotificationsHub> _hubContext;
|
|
private readonly IHubContext<AnonymousNotificationsHub> _anonymousHubContext;
|
|
private readonly GlobalSettings _globalSettings;
|
|
|
|
private Task _executingTask;
|
|
private CancellationTokenSource _cts;
|
|
private QueueClient _queueClient;
|
|
|
|
public AzureQueueHostedService(
|
|
ILogger<AzureQueueHostedService> logger,
|
|
IHubContext<NotificationsHub> hubContext,
|
|
IHubContext<AnonymousNotificationsHub> anonymousHubContext,
|
|
GlobalSettings globalSettings)
|
|
{
|
|
_logger = logger;
|
|
_hubContext = hubContext;
|
|
_globalSettings = globalSettings;
|
|
_anonymousHubContext = anonymousHubContext;
|
|
}
|
|
|
|
public Task StartAsync(CancellationToken cancellationToken)
|
|
{
|
|
_cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
|
|
_executingTask = ExecuteAsync(_cts.Token);
|
|
return _executingTask.IsCompleted ? _executingTask : Task.CompletedTask;
|
|
}
|
|
|
|
public async Task StopAsync(CancellationToken cancellationToken)
|
|
{
|
|
if (_executingTask == null)
|
|
{
|
|
return;
|
|
}
|
|
_logger.LogWarning("Stopping service.");
|
|
_cts.Cancel();
|
|
await Task.WhenAny(_executingTask, Task.Delay(-1, cancellationToken));
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
}
|
|
|
|
public void Dispose()
|
|
{ }
|
|
|
|
private async Task ExecuteAsync(CancellationToken cancellationToken)
|
|
{
|
|
_queueClient = new QueueClient(_globalSettings.Notifications.ConnectionString, "notifications");
|
|
while (!cancellationToken.IsCancellationRequested)
|
|
{
|
|
try
|
|
{
|
|
var messages = await _queueClient.ReceiveMessagesAsync(32);
|
|
if (messages.Value?.Any() ?? false)
|
|
{
|
|
foreach (var message in messages.Value)
|
|
{
|
|
try
|
|
{
|
|
await HubHelpers.SendNotificationToHubAsync(
|
|
message.DecodeMessageText(), _hubContext, _anonymousHubContext, cancellationToken);
|
|
await _queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_logger.LogError("Error processing dequeued message: " +
|
|
$"{message.MessageId} x{message.DequeueCount}. {e.Message}", e);
|
|
if (message.DequeueCount > 2)
|
|
{
|
|
await _queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_logger.LogError("Error processing messages.", e);
|
|
}
|
|
}
|
|
|
|
_logger.LogWarning("Done processing.");
|
|
}
|
|
}
|