diff --git a/src/sdk/PnP.Core.Auth/PnP.Core.Auth.csproj b/src/sdk/PnP.Core.Auth/PnP.Core.Auth.csproj index e2d93ea40c..92549d9ea8 100644 --- a/src/sdk/PnP.Core.Auth/PnP.Core.Auth.csproj +++ b/src/sdk/PnP.Core.Auth/PnP.Core.Auth.csproj @@ -47,7 +47,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/sdk/PnP.Core.Test/Misc/CloudManagerTests.cs b/src/sdk/PnP.Core.Test/Misc/CloudManagerTests.cs index ceac6a2864..2f1084ae24 100644 --- a/src/sdk/PnP.Core.Test/Misc/CloudManagerTests.cs +++ b/src/sdk/PnP.Core.Test/Misc/CloudManagerTests.cs @@ -21,7 +21,7 @@ public static void TestFixtureSetup(TestContext context) [TestMethod()] [DataRow("https://bertonline.sharepoint.com/sites/prov-2", Microsoft365Environment.Production)] - [DataRow("https://bertonline.sharepoint.de/sites/prov-2", Microsoft365Environment.Germany)] + [DataRow("https://bertonline.sharepoint.de/sites/prov-2", Microsoft365Environment.DelosCloud)] [DataRow("https://bertonline.sharepoint.cn/sites/prov-2", Microsoft365Environment.China)] [DataRow("https://bertonline.sharepoint.us/sites/prov-2", Microsoft365Environment.USGovernment)] [DataRow("https://bertonline.sharepoint.oops/sites/prov-2", Microsoft365Environment.Production)] @@ -33,11 +33,13 @@ public void UriToMicrosoft365Environment(string url, Microsoft365Environment exp [TestMethod()] [DataRow("graph.microsoft.com", Microsoft365Environment.Production)] [DataRow("graph.microsoft.com", Microsoft365Environment.PreProduction)] - [DataRow("graph.microsoft.com", Microsoft365Environment.USGovernment)] - [DataRow("graph.microsoft.de", Microsoft365Environment.Germany)] + [DataRow("graph.microsoft.com", Microsoft365Environment.USGovernment)] [DataRow("microsoftgraph.chinacloudapi.cn", Microsoft365Environment.China)] [DataRow("graph.microsoft.us", Microsoft365Environment.USGovernmentHigh)] [DataRow("dod-graph.microsoft.us", Microsoft365Environment.USGovernmentDoD)] + [DataRow("graph.svc.sovcloud.fr", Microsoft365Environment.BleuCloud)] + [DataRow("graph.svc.sovcloud.de", Microsoft365Environment.DelosCloud)] + [DataRow("graph.svc.sovcloud.sg", Microsoft365Environment.GovSGCloud)] public void Microsoft365EnvironmentToGraph(string graph, Microsoft365Environment env) { Assert.AreEqual(graph, CloudManager.GetMicrosoftGraphAuthority(env)); @@ -46,11 +48,13 @@ public void Microsoft365EnvironmentToGraph(string graph, Microsoft365Environment [TestMethod()] [DataRow("login.microsoftonline.com", Microsoft365Environment.Production)] [DataRow("login.windows-ppe.net", Microsoft365Environment.PreProduction)] - [DataRow("login.microsoftonline.com", Microsoft365Environment.USGovernment)] - [DataRow("login.microsoftonline.de", Microsoft365Environment.Germany)] + [DataRow("login.microsoftonline.com", Microsoft365Environment.USGovernment)] [DataRow("login.chinacloudapi.cn", Microsoft365Environment.China)] [DataRow("login.microsoftonline.us", Microsoft365Environment.USGovernmentHigh)] [DataRow("login.microsoftonline.us", Microsoft365Environment.USGovernmentDoD)] + [DataRow("login.sovcloud-identity.fr", Microsoft365Environment.BleuCloud)] + [DataRow("login.sovcloud-identity.de", Microsoft365Environment.DelosCloud)] + [DataRow("login.sovcloud-identity.sg", Microsoft365Environment.GovSGCloud)] public void Microsoft365EnvironmentToAzureADLogin(string azureADLogin, Microsoft365Environment env) { Assert.AreEqual(azureADLogin, CloudManager.GetAzureADLoginAuthority(env)); @@ -73,10 +77,7 @@ public async Task Microsoft365EnvironmentToGraphUri() Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://graph.microsoft.com")); context.Environment = Microsoft365Environment.USGovernment; - Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://graph.microsoft.com")); - - context.Environment = Microsoft365Environment.Germany; - Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://graph.microsoft.de")); + Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://graph.microsoft.com")); context.Environment = Microsoft365Environment.China; Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://microsoftgraph.chinacloudapi.cn")); @@ -87,6 +88,15 @@ public async Task Microsoft365EnvironmentToGraphUri() context.Environment = Microsoft365Environment.USGovernmentDoD; Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://dod-graph.microsoft.us")); + context.Environment = Microsoft365Environment.BleuCloud; + Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://graph.svc.sovcloud.fr")); + + context.Environment = Microsoft365Environment.DelosCloud; + Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://graph.svc.sovcloud.de")); + + context.Environment = Microsoft365Environment.GovSGCloud; + Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://graph.svc.sovcloud.sg")); + context.Environment = Microsoft365Environment.Custom; context.MicrosoftGraphAuthority = "graph.microsoft.be"; Assert.AreEqual(CloudManager.GetGraphBaseUri(context), new Uri($"https://graph.microsoft.be")); diff --git a/src/sdk/PnP.Core.Test/PnP.Core.Test.csproj b/src/sdk/PnP.Core.Test/PnP.Core.Test.csproj index a874ec2a3d..0b86652b9c 100644 --- a/src/sdk/PnP.Core.Test/PnP.Core.Test.csproj +++ b/src/sdk/PnP.Core.Test/PnP.Core.Test.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/sdk/PnP.Core/Services/Core/CloudManager.cs b/src/sdk/PnP.Core/Services/Core/CloudManager.cs index 206c7bbbf0..149fb51e0c 100644 --- a/src/sdk/PnP.Core/Services/Core/CloudManager.cs +++ b/src/sdk/PnP.Core/Services/Core/CloudManager.cs @@ -12,8 +12,10 @@ internal static Microsoft365Environment GetEnvironmentFromUri(Uri url) { "com" => Microsoft365Environment.Production, "us" => Microsoft365Environment.USGovernment, - "de" => Microsoft365Environment.Germany, + "de" => Microsoft365Environment.DelosCloud, "cn" => Microsoft365Environment.China, + "fr" => Microsoft365Environment.BleuCloud, + "sg" => Microsoft365Environment.GovSGCloud, _ => Microsoft365Environment.Production, }; } @@ -32,9 +34,11 @@ internal static string GetMicrosoftGraphAuthority(Microsoft365Environment enviro Microsoft365Environment.PreProduction => "graph.microsoft.com", Microsoft365Environment.USGovernment => "graph.microsoft.com", Microsoft365Environment.USGovernmentHigh => "graph.microsoft.us", - Microsoft365Environment.USGovernmentDoD => "dod-graph.microsoft.us", - Microsoft365Environment.Germany => "graph.microsoft.de", + Microsoft365Environment.USGovernmentDoD => "dod-graph.microsoft.us", Microsoft365Environment.China => "microsoftgraph.chinacloudapi.cn", + Microsoft365Environment.BleuCloud => "graph.svc.sovcloud.fr", + Microsoft365Environment.DelosCloud => "graph.svc.sovcloud.de", + Microsoft365Environment.GovSGCloud => "graph.svc.sovcloud.sg", _ => "graph.microsoft.com" }; } @@ -53,9 +57,11 @@ internal static string GetAzureADLoginAuthority(Microsoft365Environment environm Microsoft365Environment.PreProduction => "login.windows-ppe.net", Microsoft365Environment.USGovernment => "login.microsoftonline.com", Microsoft365Environment.USGovernmentHigh => "login.microsoftonline.us", - Microsoft365Environment.USGovernmentDoD => "login.microsoftonline.us", - Microsoft365Environment.Germany => "login.microsoftonline.de", + Microsoft365Environment.USGovernmentDoD => "login.microsoftonline.us", Microsoft365Environment.China => "login.chinacloudapi.cn", + Microsoft365Environment.BleuCloud => "login.sovcloud-identity.fr", + Microsoft365Environment.DelosCloud => "login.sovcloud-identity.de", + Microsoft365Environment.GovSGCloud => "login.sovcloud-identity.sg", _ => "login.microsoftonline.com" }; } diff --git a/src/sdk/PnP.Core/Services/Core/Microsoft365Environment.cs b/src/sdk/PnP.Core/Services/Core/Microsoft365Environment.cs index 0b74c4a644..af09c27382 100644 --- a/src/sdk/PnP.Core/Services/Core/Microsoft365Environment.cs +++ b/src/sdk/PnP.Core/Services/Core/Microsoft365Environment.cs @@ -40,6 +40,21 @@ public enum Microsoft365Environment /// USGovernmentDoD = 6, + /// + /// French sovereign cloud environment. A joint venture between Orange and Capgemini, designed to meet SecNumCloud requirements. See https://learn.microsoft.com/en-us/industry/sovereign-cloud/national-partner-clouds/overview-national-partner-clouds + /// + BleuCloud = 7, + + /// + /// Represents the Delos Cloud environment option. Operated by an SAP subsidiary and aligned with German Cloud Platform Requirements. See https://learn.microsoft.com/en-us/industry/sovereign-cloud/national-partner-clouds/overview-national-partner-clouds + /// + DelosCloud = 8, + + /// + /// Represents the GovSG Cloud environment option. Operated by a Singaporean government-owned company and aligned with Singapore's Sovereign Cloud Framework. See https://learn.microsoft.com/en-us/industry/sovereign-cloud/national-partner-clouds/overview-national-partner-clouds + /// + GovSGCloud = 9, + /// /// Custom cloud configuration, specify the endpoints manually ///