diff --git a/src/Core/GlobalSettings.cs b/src/Core/GlobalSettings.cs index 26fb622afe..1d7cd52bb8 100644 --- a/src/Core/GlobalSettings.cs +++ b/src/Core/GlobalSettings.cs @@ -48,6 +48,7 @@ namespace Bit.Core public class SqlServerSettings { private string _connectionString; + private string _readOnlyConnectionString; public string ConnectionString { @@ -57,6 +58,16 @@ namespace Bit.Core _connectionString = value.Trim('"'); } } + + public string ReadOnlyConnectionString + { + get => string.IsNullOrWhiteSpace(_readOnlyConnectionString) ? + _connectionString : _readOnlyConnectionString; + set + { + _readOnlyConnectionString = value.Trim('"'); + } + } } public class StorageSettings diff --git a/src/Core/Repositories/SqlServer/BaseRepository.cs b/src/Core/Repositories/SqlServer/BaseRepository.cs index e02885c442..b86a78e647 100644 --- a/src/Core/Repositories/SqlServer/BaseRepository.cs +++ b/src/Core/Repositories/SqlServer/BaseRepository.cs @@ -10,16 +10,22 @@ namespace Bit.Core.Repositories.SqlServer SqlMapper.AddTypeHandler(new DateTimeHandler()); } - public BaseRepository(string connectionString) + public BaseRepository(string connectionString, string readOnlyConnectionString) { if(string.IsNullOrWhiteSpace(connectionString)) { throw new ArgumentNullException(nameof(connectionString)); } + if(string.IsNullOrWhiteSpace(readOnlyConnectionString)) + { + throw new ArgumentNullException(nameof(readOnlyConnectionString)); + } ConnectionString = connectionString; + ReadOnlyConnectionString = readOnlyConnectionString; } protected string ConnectionString { get; private set; } + protected string ReadOnlyConnectionString { get; private set; } } } diff --git a/src/Core/Repositories/SqlServer/CipherRepository.cs b/src/Core/Repositories/SqlServer/CipherRepository.cs index f6d5677281..d0320a15c9 100644 --- a/src/Core/Repositories/SqlServer/CipherRepository.cs +++ b/src/Core/Repositories/SqlServer/CipherRepository.cs @@ -16,11 +16,11 @@ namespace Bit.Core.Repositories.SqlServer public class CipherRepository : Repository, ICipherRepository { public CipherRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public CipherRepository(string connectionString) - : base(connectionString) + public CipherRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task GetByIdAsync(Guid id, Guid userId) diff --git a/src/Core/Repositories/SqlServer/CollectionCipherRepository.cs b/src/Core/Repositories/SqlServer/CollectionCipherRepository.cs index fd77453d28..f04eace954 100644 --- a/src/Core/Repositories/SqlServer/CollectionCipherRepository.cs +++ b/src/Core/Repositories/SqlServer/CollectionCipherRepository.cs @@ -13,11 +13,11 @@ namespace Bit.Core.Repositories.SqlServer public class CollectionCipherRepository : BaseRepository, ICollectionCipherRepository { public CollectionCipherRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public CollectionCipherRepository(string connectionString) - : base(connectionString) + public CollectionCipherRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task> GetManyByUserIdAsync(Guid userId) diff --git a/src/Core/Repositories/SqlServer/CollectionRepository.cs b/src/Core/Repositories/SqlServer/CollectionRepository.cs index d4b5eb4422..120c0243b2 100644 --- a/src/Core/Repositories/SqlServer/CollectionRepository.cs +++ b/src/Core/Repositories/SqlServer/CollectionRepository.cs @@ -15,11 +15,11 @@ namespace Bit.Core.Repositories.SqlServer public class CollectionRepository : Repository, ICollectionRepository { public CollectionRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public CollectionRepository(string connectionString) - : base(connectionString) + public CollectionRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task GetCountByOrganizationIdAsync(Guid organizationId) diff --git a/src/Core/Repositories/SqlServer/DeviceRepository.cs b/src/Core/Repositories/SqlServer/DeviceRepository.cs index ecfb683529..3c21f6487a 100644 --- a/src/Core/Repositories/SqlServer/DeviceRepository.cs +++ b/src/Core/Repositories/SqlServer/DeviceRepository.cs @@ -12,11 +12,11 @@ namespace Bit.Core.Repositories.SqlServer public class DeviceRepository : Repository, IDeviceRepository { public DeviceRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public DeviceRepository(string connectionString) - : base(connectionString) + public DeviceRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task GetByIdAsync(Guid id, Guid userId) diff --git a/src/Core/Repositories/SqlServer/EventRepository.cs b/src/Core/Repositories/SqlServer/EventRepository.cs index e345ee9c1a..f8ec8545ec 100644 --- a/src/Core/Repositories/SqlServer/EventRepository.cs +++ b/src/Core/Repositories/SqlServer/EventRepository.cs @@ -13,11 +13,11 @@ namespace Bit.Core.Repositories.SqlServer public class EventRepository : Repository, IEventRepository { public EventRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public EventRepository(string connectionString) - : base(connectionString) + public EventRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task> GetManyByUserAsync(Guid userId, DateTime startDate, DateTime endDate, diff --git a/src/Core/Repositories/SqlServer/FolderRepository.cs b/src/Core/Repositories/SqlServer/FolderRepository.cs index d3898fe67f..a8c3b202c9 100644 --- a/src/Core/Repositories/SqlServer/FolderRepository.cs +++ b/src/Core/Repositories/SqlServer/FolderRepository.cs @@ -12,11 +12,11 @@ namespace Bit.Core.Repositories.SqlServer public class FolderRepository : Repository, IFolderRepository { public FolderRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public FolderRepository(string connectionString) - : base(connectionString) + public FolderRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task GetByIdAsync(Guid id, Guid userId) diff --git a/src/Core/Repositories/SqlServer/GrantRepository.cs b/src/Core/Repositories/SqlServer/GrantRepository.cs index 53fee674ad..8ffe86a19b 100644 --- a/src/Core/Repositories/SqlServer/GrantRepository.cs +++ b/src/Core/Repositories/SqlServer/GrantRepository.cs @@ -12,11 +12,11 @@ namespace Bit.Core.Repositories.SqlServer public class GrantRepository : BaseRepository, IGrantRepository { public GrantRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public GrantRepository(string connectionString) - : base(connectionString) + public GrantRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task GetByKeyAsync(string key) diff --git a/src/Core/Repositories/SqlServer/GroupRepository.cs b/src/Core/Repositories/SqlServer/GroupRepository.cs index 30657bea70..5c9ab0a20b 100644 --- a/src/Core/Repositories/SqlServer/GroupRepository.cs +++ b/src/Core/Repositories/SqlServer/GroupRepository.cs @@ -15,11 +15,11 @@ namespace Bit.Core.Repositories.SqlServer public class GroupRepository : Repository, IGroupRepository { public GroupRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public GroupRepository(string connectionString) - : base(connectionString) + public GroupRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task>> GetByIdWithCollectionsAsync(Guid id) diff --git a/src/Core/Repositories/SqlServer/InstallationRepository.cs b/src/Core/Repositories/SqlServer/InstallationRepository.cs index 12d61c3ccc..ed86b0bcc3 100644 --- a/src/Core/Repositories/SqlServer/InstallationRepository.cs +++ b/src/Core/Repositories/SqlServer/InstallationRepository.cs @@ -6,11 +6,11 @@ namespace Bit.Core.Repositories.SqlServer public class InstallationRepository : Repository, IInstallationRepository { public InstallationRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public InstallationRepository(string connectionString) - : base(connectionString) + public InstallationRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } } } diff --git a/src/Core/Repositories/SqlServer/MaintenanceRepository.cs b/src/Core/Repositories/SqlServer/MaintenanceRepository.cs index 9436dbc67e..98187b84c4 100644 --- a/src/Core/Repositories/SqlServer/MaintenanceRepository.cs +++ b/src/Core/Repositories/SqlServer/MaintenanceRepository.cs @@ -8,11 +8,11 @@ namespace Bit.Core.Repositories.SqlServer public class MaintenanceRepository : BaseRepository, IMaintenanceRepository { public MaintenanceRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public MaintenanceRepository(string connectionString) - : base(connectionString) + public MaintenanceRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task UpdateStatisticsAsync() diff --git a/src/Core/Repositories/SqlServer/OrganizationRepository.cs b/src/Core/Repositories/SqlServer/OrganizationRepository.cs index a00efdce43..c9b0273cfe 100644 --- a/src/Core/Repositories/SqlServer/OrganizationRepository.cs +++ b/src/Core/Repositories/SqlServer/OrganizationRepository.cs @@ -13,11 +13,11 @@ namespace Bit.Core.Repositories.SqlServer public class OrganizationRepository : Repository, IOrganizationRepository { public OrganizationRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public OrganizationRepository(string connectionString) - : base(connectionString) + public OrganizationRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task> GetManyByEnabledAsync() @@ -48,7 +48,7 @@ namespace Bit.Core.Repositories.SqlServer public async Task> SearchAsync(string name, string userEmail, bool? paid, int skip, int take) { - using(var connection = new SqlConnection(ConnectionString)) + using(var connection = new SqlConnection(ReadOnlyConnectionString)) { var results = await connection.QueryAsync( "[dbo].[Organization_Search]", diff --git a/src/Core/Repositories/SqlServer/OrganizationUserRepository.cs b/src/Core/Repositories/SqlServer/OrganizationUserRepository.cs index 6ebe35e67d..b552a61c13 100644 --- a/src/Core/Repositories/SqlServer/OrganizationUserRepository.cs +++ b/src/Core/Repositories/SqlServer/OrganizationUserRepository.cs @@ -16,11 +16,11 @@ namespace Bit.Core.Repositories.SqlServer public class OrganizationUserRepository : Repository, IOrganizationUserRepository { public OrganizationUserRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public OrganizationUserRepository(string connectionString) - : base(connectionString) + public OrganizationUserRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task GetCountByOrganizationIdAsync(Guid organizationId) diff --git a/src/Core/Repositories/SqlServer/Repository.cs b/src/Core/Repositories/SqlServer/Repository.cs index f8d4d7f919..b6100f28bb 100644 --- a/src/Core/Repositories/SqlServer/Repository.cs +++ b/src/Core/Repositories/SqlServer/Repository.cs @@ -12,8 +12,9 @@ namespace Bit.Core.Repositories.SqlServer where TId : IEquatable where T : class, ITableObject { - public Repository(string connectionString, string schema = null, string table = null) - : base(connectionString) + public Repository(string connectionString, string readOnlyConnectionString, + string schema = null, string table = null) + : base(connectionString, readOnlyConnectionString) { if(!string.IsNullOrWhiteSpace(table)) { diff --git a/src/Core/Repositories/SqlServer/U2fRepository.cs b/src/Core/Repositories/SqlServer/U2fRepository.cs index b5b5cd62a7..cd8570461d 100644 --- a/src/Core/Repositories/SqlServer/U2fRepository.cs +++ b/src/Core/Repositories/SqlServer/U2fRepository.cs @@ -12,11 +12,11 @@ namespace Bit.Core.Repositories.SqlServer public class U2fRepository : Repository, IU2fRepository { public U2fRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public U2fRepository(string connectionString) - : base(connectionString) + public U2fRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public async Task> GetManyByUserIdAsync(Guid userId) diff --git a/src/Core/Repositories/SqlServer/UserRepository.cs b/src/Core/Repositories/SqlServer/UserRepository.cs index fb56bc10e9..14f6f000a1 100644 --- a/src/Core/Repositories/SqlServer/UserRepository.cs +++ b/src/Core/Repositories/SqlServer/UserRepository.cs @@ -13,11 +13,11 @@ namespace Bit.Core.Repositories.SqlServer public class UserRepository : Repository, IUserRepository { public UserRepository(GlobalSettings globalSettings) - : this(globalSettings.SqlServer.ConnectionString) + : this(globalSettings.SqlServer.ConnectionString, globalSettings.SqlServer.ReadOnlyConnectionString) { } - public UserRepository(string connectionString) - : base(connectionString) + public UserRepository(string connectionString, string readOnlyConnectionString) + : base(connectionString, readOnlyConnectionString) { } public override async Task GetByIdAsync(Guid id) @@ -53,7 +53,7 @@ namespace Bit.Core.Repositories.SqlServer public async Task> SearchAsync(string email, int skip, int take) { - using(var connection = new SqlConnection(ConnectionString)) + using(var connection = new SqlConnection(ReadOnlyConnectionString)) { var results = await connection.QueryAsync( $"[{Schema}].[{Table}_Search]",