Skip to content

Commit 2f5e2c6

Browse files
committed
feat(server): add Gov CloudRegion enum value, bitwarden-gov.com domains, and Gov vault URL
Adds Gov region support across three layers: 1. Enum value: adds Gov=2 to src/Core/Enums/CloudRegion.cs (Bit.Core.Enums.CloudRegion). The Setup-layer enum was removed in the preceding commit; there is now a single canonical enum in Core. 2. CloudRegionConfig.All: appends Gov entry with bitwarden-gov.com domains (API, identity, vault, notifications, icons, events, SSO callback). Because BitwardenCloudDomains and BitwardenMobileSsoCallbackUris in Constants.cs already derive from CloudRegionConfig.All via LINQ spread, Gov is automatically included in both allowlists at no extra cost. 3. Tests: - ConstantsTests: BitwardenCloudDomains_ContainsAllProductionDomains and BitwardenMobileSsoCallbackUris_ContainsAllRegionCallbacks are parametrized over US/EU/Gov to assert domain and SSO-callback presence - HandlebarsMailServiceTests: GetCloudVaultSubscriptionUrl_ResolvesPerRegion parametrized over us/eu/gov to assert vault URL prefix resolution Implementation note: the prior coordinator's decision to create a new Bit.Core.Enums.CloudRegion (rather than keep it in Bit.Setup.Enums) was correct to avoid a circular project dependency (Core must not reference Setup). Now that the Setup enum is deleted, adding a new region requires only a single enum update in src/Core/Enums/CloudRegion.cs. Refs: PM-35089, PM-35087
1 parent 86852b4 commit 2f5e2c6

4 files changed

Lines changed: 47 additions & 1 deletion

File tree

src/Core/Enums/CloudRegion.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ public enum CloudRegion
88
US = 0,
99
[Display(Name = "EU")]
1010
EU = 1,
11+
[Display(Name = "Gov")]
12+
Gov = 2,
1113
}

src/Core/Settings/CloudRegionConfig.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ private CloudRegionConfig(
5858
"https://icons.bitwarden.eu",
5959
"https://events.bitwarden.eu",
6060
"https://bitwarden.eu/sso-callback"),
61+
new(
62+
CloudRegion.Gov,
63+
"bitwarden-gov.com",
64+
"https://api.bitwarden-gov.com",
65+
"https://identity.bitwarden-gov.com",
66+
"https://vault.bitwarden-gov.com",
67+
"https://notifications.bitwarden-gov.com",
68+
"https://icons.bitwarden-gov.com",
69+
"https://events.bitwarden-gov.com",
70+
"https://bitwarden-gov.com/sso-callback"),
6171
];
6272

6373
public static CloudRegionConfig FindByDomain(string domain) =>

test/Core.Test/ConstantsTests.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Xunit;
1+
using Xunit;
22

33
namespace Bit.Core.Test;
44

@@ -66,4 +66,22 @@ public void InsideRange_WithInvalidValues_ReturnsFalse(int number)
6666
Assert.False(result);
6767
}
6868
}
69+
70+
[Theory]
71+
[InlineData("bitwarden.com")]
72+
[InlineData("bitwarden.eu")]
73+
[InlineData("bitwarden-gov.com")]
74+
public void BitwardenCloudDomains_ContainsAllProductionDomains(string domain)
75+
{
76+
Assert.Contains(domain, Constants.BitwardenCloudDomains);
77+
}
78+
79+
[Theory]
80+
[InlineData("https://bitwarden.com/sso-callback")]
81+
[InlineData("https://bitwarden.eu/sso-callback")]
82+
[InlineData("https://bitwarden-gov.com/sso-callback")]
83+
public void BitwardenMobileSsoCallbackUris_ContainsAllRegionCallbacks(string uri)
84+
{
85+
Assert.Contains(uri, Constants.BitwardenMobileSsoCallbackUris);
86+
}
6987
}

test/Core.Test/Services/HandlebarsMailServiceTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,4 +364,20 @@ public async Task SendIndividualUserWelcomeEmailAsync_HandlesVariousEmailFormats
364364
await _mailDeliveryService.Received(1).SendEmailAsync(Arg.Is<MailMessage>(m =>
365365
m.ToEmails.Contains(email)));
366366
}
367+
368+
[Theory]
369+
[InlineData("us", "https://vault.bitwarden.com")]
370+
[InlineData("eu", "https://vault.bitwarden.eu")]
371+
[InlineData("gov", "https://vault.bitwarden-gov.com")]
372+
public void GetCloudVaultSubscriptionUrl_ResolvesPerRegion(string cloudRegion, string expectedVaultBase)
373+
{
374+
// Arrange
375+
_globalSettings.BaseServiceUri.CloudRegion = cloudRegion;
376+
377+
// Act
378+
var result = _sut.GetCloudVaultSubscriptionUrl(Guid.NewGuid());
379+
380+
// Assert
381+
Assert.StartsWith(expectedVaultBase, result);
382+
}
367383
}

0 commit comments

Comments
 (0)