Skip to content

Commit 788eaa6

Browse files
authored
feat(server): add Gov cloud region (#7730)
Adds the Gov cloud region across three layers. Enum: Gov = 2 in Bit.Core.Enums.CloudRegion. Config: Gov entry in CloudRegionConfig.All (bitwarden-gov.com domain, API, identity, vault, and SSO-callback URLs). Because Constants.BitwardenCloudDomains and BitwardenMobileSsoCallbackUris derive from CloudRegionConfig.All, and ServiceCollectionExtensions iterates All for Swagger server registration, Gov flows into HTTPS-redirect allowlists, mobile SSO callback validation, and OpenAPI server definitions without further code changes. Tests: first coverage for BitwardenCloudDomains and BitwardenMobileSsoCallbackUris membership and for GetCloudVaultSubscriptionUrl URL resolution, parametrized over US/EU/Gov. Server-side foundation for the Bitwarden Gov cloud environment, independent of any feature flag. Stacked on PM-38015's consolidation work; adding Gov required only one enum value and one CloudRegionConfig.All entry. Refs: PM-38016
1 parent 9b3e01e commit 788eaa6

4 files changed

Lines changed: 49 additions & 0 deletions

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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ private CloudRegionConfig(
5353
"https://identity.bitwarden.eu",
5454
"https://vault.bitwarden.eu",
5555
"https://bitwarden.eu/sso-callback"),
56+
new(
57+
CloudRegion.Gov,
58+
"bitwarden-gov.com",
59+
"https://api.bitwarden-gov.com",
60+
"https://identity.bitwarden-gov.com",
61+
"https://vault.bitwarden-gov.com",
62+
"https://bitwarden-gov.com/sso-callback"),
5663
];
5764

5865
public static CloudRegionConfig FindByDomain(string domain) =>

test/Core.Test/ConstantsTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using Xunit;
2+
3+
namespace Bit.Core.Test;
4+
5+
public class ConstantsTests
6+
{
7+
[Theory]
8+
[InlineData("bitwarden.com")]
9+
[InlineData("bitwarden.eu")]
10+
[InlineData("bitwarden-gov.com")]
11+
public void BitwardenCloudDomains_ContainsAllProductionDomains(string domain)
12+
{
13+
Assert.Contains(domain, Constants.BitwardenCloudDomains);
14+
}
15+
16+
[Theory]
17+
[InlineData("https://bitwarden.com/sso-callback")]
18+
[InlineData("https://bitwarden.eu/sso-callback")]
19+
[InlineData("https://bitwarden-gov.com/sso-callback")]
20+
public void BitwardenMobileSsoCallbackUris_ContainsAllRegionCallbacks(string uri)
21+
{
22+
Assert.Contains(uri, Constants.BitwardenMobileSsoCallbackUris);
23+
}
24+
}

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)