1
0
mirror of https://github.com/bitwarden/server.git synced 2025-04-14 01:28:14 -05:00

Add distributed cache to the phishing domain

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>
This commit is contained in:
Cy Okeke 2025-03-12 15:01:25 +01:00
parent e56b71abf2
commit f1dde5bab1
No known key found for this signature in database
GPG Key ID: 88B341B55C84B45C

View File

@ -1,32 +1,58 @@
using System.Data;
using System.Text.Json;
using Bit.Core.Repositories;
using Bit.Core.Settings;
using Dapper;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Caching.Distributed;
namespace Bit.Infrastructure.Dapper.Repositories;
public class PhishingDomainRepository : IPhishingDomainRepository
{
private readonly string _connectionString;
private readonly IDistributedCache _cache;
private const string CacheKey = "PhishingDomains";
private static readonly DistributedCacheEntryOptions _cacheOptions = new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(24) // Cache for 24 hours
};
public PhishingDomainRepository(GlobalSettings globalSettings)
: this(globalSettings.SqlServer.ConnectionString)
public PhishingDomainRepository(GlobalSettings globalSettings, IDistributedCache cache)
: this(globalSettings.SqlServer.ConnectionString, cache)
{ }
public PhishingDomainRepository(string connectionString)
public PhishingDomainRepository(string connectionString, IDistributedCache cache)
{
_connectionString = connectionString;
_cache = cache;
}
public async Task<ICollection<string>> GetActivePhishingDomainsAsync()
{
// Try to get from cache first
var cachedDomains = await _cache.GetStringAsync(CacheKey);
if (!string.IsNullOrEmpty(cachedDomains))
{
return JsonSerializer.Deserialize<ICollection<string>>(cachedDomains) ?? new List<string>();
}
// If not in cache, get from database
using (var connection = new SqlConnection(_connectionString))
{
var results = await connection.QueryAsync<string>(
"[dbo].[PhishingDomain_ReadAll]",
commandType: CommandType.StoredProcedure);
return results.AsList();
var domains = results.AsList();
// Store in cache
await _cache.SetStringAsync(
CacheKey,
JsonSerializer.Serialize(domains),
_cacheOptions);
return domains;
}
}
@ -52,5 +78,11 @@ public class PhishingDomainRepository : IPhishingDomainRepository
commandType: CommandType.StoredProcedure);
}
}
// Update cache with new domains
await _cache.SetStringAsync(
CacheKey,
JsonSerializer.Serialize(domains),
_cacheOptions);
}
}