Skip to content

Commit 11903ad

Browse files
committed
Merge of #1127. Thanks @plamber
1 parent 3082217 commit 11903ad

11 files changed

+191
-39
lines changed

src/sdk/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
2929
- Support for listing, approving and denying api access requests after installing an app #1100 [mloitzl - Martin Loitzl]
3030
- Added `Rename` methods on `IFile` to make it easier to rename a file #1109 [jansenbe - Bert Jansen]
3131
- Added feature to enable or disable the SharePoint service principal #1117 [mloitzl - Martin Loitzl]
32+
- Method to ensure the 'Everyone except external users' user for any site language #1127 [plamber - Patrick Lamber]
3233

3334
### Changed
3435

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"IsSuccessStatusCode":true,"StatusCode":200,"Headers":{"SPRequestGuid":"b4d19ba0-a05f-6000-4f5e-2fd5bf30d1a0","SPClientServiceRequestDuration":"9","X-SharePointHealthScore":"0","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022RegionalSettings\u0022:{\u0022TimeZone\u0022:{\u0022Description\u0022:\u0022(UTC-08:00) Pacific Time (US and Canada)\u0022,\u0022Id\u0022:13,\u0022Information\u0022:{\u0022Bias\u0022:480,\u0022DaylightBias\u0022:-60,\u0022StandardBias\u0022:0}},\u0022AdjustHijriDays\u0022:0,\u0022AlternateCalendarType\u0022:0,\u0022AM\u0022:\u0022AM\u0022,\u0022CalendarType\u0022:1,\u0022Collation\u0022:25,\u0022CollationLCID\u0022:2070,\u0022DateFormat\u0022:0,\u0022DateSeparator\u0022:\u0022/\u0022,\u0022DecimalSeparator\u0022:\u0022.\u0022,\u0022DigitGrouping\u0022:\u00223;0\u0022,\u0022FirstDayOfWeek\u0022:0,\u0022FirstWeekOfYear\u0022:0,\u0022IsEastAsia\u0022:false,\u0022IsRightToLeft\u0022:false,\u0022IsUIRightToLeft\u0022:false,\u0022ListSeparator\u0022:\u0022,\u0022,\u0022LocaleId\u0022:1033,\u0022NegativeSign\u0022:\u0022-\u0022,\u0022NegNumberMode\u0022:1,\u0022PM\u0022:\u0022PM\u0022,\u0022PositiveSign\u0022:\u0022\u0022,\u0022ShowWeeks\u0022:false,\u0022ThousandSeparator\u0022:\u0022,\u0022,\u0022Time24\u0022:false,\u0022TimeMarkerPosition\u0022:0,\u0022TimeSeparator\u0022:\u0022:\u0022,\u0022WorkDayEndHour\u0022:1020,\u0022WorkDays\u0022:62,\u0022WorkDayStartHour\u0022:480},\u0022Id\u0022:\u002272b351a9-34df-4337-9fb9-c20079fd2b9c\u0022,\u0022Url\u0022:\u0022https://nuborocks.sharepoint.com/sites/pnpcoresdktestgroup\u0022}"}
1+
{"IsSuccessStatusCode":true,"StatusCode":200,"Headers":{"SPRequestGuid":"0ae79ba0-10eb-6000-4c2d-fa9110b0c168","SPClientServiceRequestDuration":"20","X-SharePointHealthScore":"1","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022RegionalSettings\u0022:{\u0022TimeZone\u0022:{\u0022Description\u0022:\u0022(UTC-08:00) Pacific Time (US and Canada)\u0022,\u0022Id\u0022:13,\u0022Information\u0022:{\u0022Bias\u0022:480,\u0022DaylightBias\u0022:-60,\u0022StandardBias\u0022:0}},\u0022AdjustHijriDays\u0022:0,\u0022AlternateCalendarType\u0022:0,\u0022AM\u0022:\u0022AM\u0022,\u0022CalendarType\u0022:1,\u0022Collation\u0022:25,\u0022CollationLCID\u0022:2070,\u0022DateFormat\u0022:0,\u0022DateSeparator\u0022:\u0022/\u0022,\u0022DecimalSeparator\u0022:\u0022.\u0022,\u0022DigitGrouping\u0022:\u00223;0\u0022,\u0022FirstDayOfWeek\u0022:0,\u0022FirstWeekOfYear\u0022:0,\u0022IsEastAsia\u0022:false,\u0022IsRightToLeft\u0022:false,\u0022IsUIRightToLeft\u0022:false,\u0022ListSeparator\u0022:\u0022,\u0022,\u0022LocaleId\u0022:1033,\u0022NegativeSign\u0022:\u0022-\u0022,\u0022NegNumberMode\u0022:1,\u0022PM\u0022:\u0022PM\u0022,\u0022PositiveSign\u0022:\u0022\u0022,\u0022ShowWeeks\u0022:false,\u0022ThousandSeparator\u0022:\u0022,\u0022,\u0022Time24\u0022:false,\u0022TimeMarkerPosition\u0022:0,\u0022TimeSeparator\u0022:\u0022:\u0022,\u0022WorkDayEndHour\u0022:1020,\u0022WorkDays\u0022:62,\u0022WorkDayStartHour\u0022:480},\u0022Id\u0022:\u00222c99a486-d6c9-4a4b-8d6f-a9faa364c92c\u0022,\u0022Url\u0022:\u0022https://bertonline.sharepoint.com/sites/prov-2\u0022}"}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"IsSuccessStatusCode":true,"StatusCode":200,"Headers":{"SPRequestGuid":"b4d19ba0-b085-6000-4f5e-28783cac69a0","SPClientServiceRequestDuration":"10","X-SharePointHealthScore":"2","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022GroupId\u0022:\u0022e4770f8b-cddd-4f62-9cc5-11777e538653\u0022,\u0022Id\u0022:\u0022157a9fac-e4d3-4a7c-ab7f-b90b29012a5c\u0022}"}
1+
{"IsSuccessStatusCode":true,"StatusCode":200,"Headers":{"SPRequestGuid":"0ae79ba0-60fa-6000-3b3d-9fd1177e8312","SPClientServiceRequestDuration":"8","X-SharePointHealthScore":"1","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022GroupId\u0022:\u0022d40d729b-df60-4b57-ac8f-102595090e0a\u0022,\u0022Id\u0022:\u0022f92f9e40-1110-43ef-aa0e-0822e13fb7ba\u0022}"}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"IsSuccessStatusCode":true,"StatusCode":200,"Headers":{"SPRequestGuid":"b7d19ba0-0016-6000-4f5e-28c00fb1822a","SPClientServiceRequestDuration":"15","X-SharePointHealthScore":"0","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022Id\u0022:8,\u0022IsHiddenInUI\u0022:false,\u0022LoginName\u0022:\u0022c:0-.f|rolemanager|spo-grid-all-users/1840b34e-6fe7-4a56-9ad3-0b7b58c49dc7\u0022,\u0022Title\u0022:\u0022Everyone except external users\u0022,\u0022PrincipalType\u0022:4,\u0022Email\u0022:\u0022\u0022,\u0022Expiration\u0022:\u0022\u0022,\u0022IsEmailAuthenticationGuestUser\u0022:false,\u0022IsShareByEmailGuestUser\u0022:false,\u0022IsSiteAdmin\u0022:false,\u0022UserId\u0022:null,\u0022UserPrincipalName\u0022:null}"}
1+
{"IsSuccessStatusCode":false,"StatusCode":400,"Headers":{"SPRequestGuid":"0ce79ba0-e081-6000-3b3d-9c22f8ea25a7","SPClientServiceRequestDuration":"83","X-SharePointHealthScore":"3","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022odata.error\u0022:{\u0022code\u0022:\u0022-2146232832, Microsoft.SharePoint.SPException\u0022,\u0022message\u0022:{\u0022lang\u0022:\u0022en-US\u0022,\u0022value\u0022:\u0022The specified user c:0-.f|rolemanager|spo-grid-all-users/d8623c9e-30c7-473a-83bc-d907df44a26e could not be found.\u0022}}}"}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"IsSuccessStatusCode":true,"StatusCode":200,"Headers":{"SPRequestGuid":"45d09ba0-60cd-6000-4f5e-2437a59729df","SPClientServiceRequestDuration":"14","X-SharePointHealthScore":"1","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022Id\u0022:9,\u0022IsHiddenInUI\u0022:false,\u0022LoginName\u0022:\u0022i:0#.f|membership|[email protected]\u0022,\u0022Title\u0022:\u0022Patrick Lamber\u0022,\u0022PrincipalType\u0022:1,\u0022Email\u0022:\u0022[email protected]\u0022,\u0022Expiration\u0022:\u0022\u0022,\u0022IsEmailAuthenticationGuestUser\u0022:false,\u0022IsShareByEmailGuestUser\u0022:false,\u0022IsSiteAdmin\u0022:false,\u0022UserId\u0022:{\u0022NameId\u0022:\u00221003200270f8c6bb\u0022,\u0022NameIdIssuer\u0022:\u0022urn:federation:microsoftonline\u0022},\u0022UserPrincipalName\u0022:\u0022[email protected]\u0022}"}
1+
{"IsSuccessStatusCode":true,"StatusCode":200,"Headers":{"SPRequestGuid":"0de79ba0-b009-6000-4c2d-f5e0264bc418","SPClientServiceRequestDuration":"11","X-SharePointHealthScore":"1","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022Id\u0022:\u00222c99a486-d6c9-4a4b-8d6f-a9faa364c92c\u0022,\u0022Language\u0022:1033}"}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"IsSuccessStatusCode":true,"StatusCode":200,"Headers":{"SPRequestGuid":"0de79ba0-40f9-6000-3b3d-91d5339cba2c","SPClientServiceRequestDuration":"151","X-SharePointHealthScore":"1","X-SP-SERVERSTATE":"ReadOnly=0"},"Response":"{\u0022Id\u0022:8,\u0022IsHiddenInUI\u0022:false,\u0022LoginName\u0022:\u0022c:0-.f|rolemanager|spo-grid-all-users/6492ece7-7f5d-4499-8130-50e761e25bd9\u0022,\u0022Title\u0022:\u0022Everyone except external users\u0022,\u0022PrincipalType\u0022:4,\u0022Email\u0022:\u0022\u0022,\u0022Expiration\u0022:\u0022\u0022,\u0022IsEmailAuthenticationGuestUser\u0022:false,\u0022IsShareByEmailGuestUser\u0022:false,\u0022IsSiteAdmin\u0022:false,\u0022UserId\u0022:null,\u0022UserPrincipalName\u0022:null}"}

src/sdk/PnP.Core.Test/SharePoint/WebTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,7 @@ public async Task EnsuresEveryoneExceptExternalUsersTest()
10161016
//TestCommon.Instance.Mocking = false;
10171017
using (var context = await TestCommon.Instance.GetContextAsync(TestCommon.TestSite))
10181018
{
1019-
var ensuredUser = await context.Web.GetEveryoneExceptExternalUsersAsync();
1019+
var ensuredUser = await context.Web.EnsureEveryoneExceptExternalUsersAsync();
10201020

10211021
Assert.IsTrue(ensuredUser.Requested);
10221022
Assert.IsTrue(ensuredUser is Model.Security.ISharePointUser);

src/sdk/PnP.Core/Model/SharePoint/Core/Internal/Web.cs

Lines changed: 170 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using System.Linq.Expressions;
1414
using System.Net;
1515
using System.Net.Http;
16+
using System.Runtime.InteropServices;
1617
using System.Text;
1718
using System.Text.Json;
1819
using System.Threading.Tasks;
@@ -729,49 +730,186 @@ public bool IsNoScriptSite()
729730

730731
private async Task<Guid> GetTenantIdAsync()
731732
{
732-
// in case telemetry is configured, return the tenant id from the globaloptions
733-
if (this.PnPContext.GlobalOptions.AADTenantId != Guid.Empty)
734-
return this.PnPContext.GlobalOptions.AADTenantId;
735-
736-
await EnsurePropertiesAsync(p => p.Url).ConfigureAwait(false);
737-
WebRequest request = WebRequest.Create(this.Url + "/_vti_bin/client.svc");
738-
request.Headers.Add("Authorization: Bearer ");
733+
// in case telemetry is configured, the globaloptions already has a populated tenantid value
734+
if (PnPContext.GlobalOptions.AADTenantId == Guid.Empty)
735+
{
736+
var useOpenIdConfiguration = false;
737+
#if NET5_0_OR_GREATER
738+
useOpenIdConfiguration = RuntimeInformation.RuntimeIdentifier == "browser-wasm";
739+
#endif
740+
await PnPContext.SetAADTenantId(useOpenIdConfiguration).ConfigureAwait(false);
741+
}
739742

740-
try
743+
if (PnPContext.GlobalOptions.AADTenantId != Guid.Empty)
741744
{
742-
await request.GetResponseAsync().ConfigureAwait(false);
745+
return PnPContext.GlobalOptions.AADTenantId;
743746
}
744-
catch (WebException e)
747+
else
745748
{
746-
var bearerResponseHeader = e.Response.Headers["WWW-Authenticate"];
747-
748-
const string bearer = "Bearer realm=\"";
749-
var bearerIndex = bearerResponseHeader.IndexOf(bearer, StringComparison.Ordinal);
750-
751-
var realmIndex = bearerIndex + bearer.Length;
752-
753-
if (bearerResponseHeader.Length >= realmIndex + 36)
754-
{
755-
if (Guid.TryParse(bearerResponseHeader.Substring(realmIndex, 36), out Guid realmGuid))
756-
{
757-
return realmGuid;
758-
}
759-
}
749+
return Guid.Empty;
760750
}
761-
return Guid.Empty;
762751
}
763752

764-
765-
public ISharePointUser GetEveryoneExceptExternalUsers()
753+
public ISharePointUser EnsureEveryoneExceptExternalUsers()
766754
{
767-
return GetEveryoneExceptExternalUsersAsync().GetAwaiter().GetResult();
755+
return EnsureEveryoneExceptExternalUsersAsync().GetAwaiter().GetResult();
768756
}
769757

770-
public async Task<ISharePointUser> GetEveryoneExceptExternalUsersAsync()
758+
public async Task<ISharePointUser> EnsureEveryoneExceptExternalUsersAsync()
771759
{
772-
var tenantId = await this.GetTenantIdAsync().ConfigureAwait(false);
773-
var loginName = $"c:0-.f|rolemanager|spo-grid-all-users/{tenantId}";
774-
return await this.EnsureUserAsync(loginName).ConfigureAwait(false);
760+
try
761+
{
762+
var tenantId = await GetTenantIdAsync().ConfigureAwait(false);
763+
var loginName = $"c:0-.f|rolemanager|spo-grid-all-users/{tenantId}";
764+
return await EnsureUserAsync(loginName).ConfigureAwait(false);
765+
}
766+
catch(SharePointRestServiceException ex) when (ex.HResult == -2146233088)
767+
{
768+
var web = await GetAsync(p=>p.Language).ConfigureAwait(false);
769+
string userIdentity = null;
770+
switch (web.Language)
771+
{
772+
case 1025: // Arabic
773+
userIdentity = "الجميع باستثناء المستخدمين الخارجيين";
774+
break;
775+
case 1069: // Basque
776+
userIdentity = "Guztiak kanpoko erabiltzaileak izan ezik";
777+
break;
778+
case 1026: // Bulgarian
779+
userIdentity = "Всички освен външни потребители";
780+
break;
781+
case 1027: // Catalan
782+
userIdentity = "Tothom excepte els usuaris externs";
783+
break;
784+
case 2052: // Chinese (Simplified)
785+
userIdentity = "除外部用户外的任何人";
786+
break;
787+
case 1028: // Chinese (Traditional)
788+
userIdentity = "外部使用者以外的所有人";
789+
break;
790+
case 1050: // Croatian
791+
userIdentity = "Svi osim vanjskih korisnika";
792+
break;
793+
case 1029: // Czech
794+
userIdentity = "Všichni kromě externích uživatelů";
795+
break;
796+
case 1030: // Danish
797+
userIdentity = "Alle undtagen eksterne brugere";
798+
break;
799+
case 1043: // Dutch
800+
userIdentity = "Iedereen behalve externe gebruikers";
801+
break;
802+
case 1033: // English
803+
userIdentity = "Everyone except external users";
804+
break;
805+
case 1061: // Estonian
806+
userIdentity = "Kõik peale väliskasutajate";
807+
break;
808+
case 1035: // Finnish
809+
userIdentity = "Kaikki paitsi ulkoiset käyttäjät";
810+
break;
811+
case 1036: // French
812+
userIdentity = "Tout le monde sauf les utilisateurs externes";
813+
break;
814+
case 1110: // Galician
815+
userIdentity = "Todo o mundo excepto os usuarios externos";
816+
break;
817+
case 1031: // German
818+
userIdentity = "Jeder, außer externen Benutzern";
819+
break;
820+
case 1032: // Greek
821+
userIdentity = "Όλοι εκτός από εξωτερικούς χρήστες";
822+
break;
823+
case 1037: // Hebrew
824+
userIdentity = "כולם פרט למשתמשים חיצוניים";
825+
break;
826+
case 1081: // Hindi
827+
userIdentity = "बाह्य उपयोगकर्ताओं को छोड़कर सभी";
828+
break;
829+
case 1038: // Hungarian
830+
userIdentity = "Mindenki, kivéve külső felhasználók";
831+
break;
832+
case 1057: // Indonesian
833+
userIdentity = "Semua orang kecuali pengguna eksternal";
834+
break;
835+
case 1040: // Italian
836+
userIdentity = "Tutti tranne gli utenti esterni";
837+
break;
838+
case 1041: // Japanese
839+
userIdentity = "外部ユーザー以外のすべてのユーザー";
840+
break;
841+
case 1087: // Kazakh
842+
userIdentity = "Сыртқы пайдаланушылардан басқасының барлығы";
843+
break;
844+
case 1042: // Korean
845+
userIdentity = "외부 사용자를 제외한 모든 사람";
846+
break;
847+
case 1062: // Latvian
848+
userIdentity = "Visi, izņemot ārējos lietotājus";
849+
break;
850+
case 1063: // Lithuanian
851+
userIdentity = "Visi, išskyrus išorinius vartotojus";
852+
break;
853+
case 1086: // Malay
854+
userIdentity = "Semua orang kecuali pengguna luaran";
855+
break;
856+
case 1044: // Norwegian (Bokmål)
857+
userIdentity = "Alle bortsett fra eksterne brukere";
858+
break;
859+
case 1045: // Polish
860+
userIdentity = "Wszyscy oprócz użytkowników zewnętrznych";
861+
break;
862+
case 1046: // Portuguese (Brazil)
863+
userIdentity = "Todos exceto os usuários externos";
864+
break;
865+
case 2070: // Portuguese (Portugal)
866+
userIdentity = "Todos exceto os utilizadores externos";
867+
break;
868+
case 1048: // Romanian
869+
userIdentity = "Toată lumea, cu excepția utilizatorilor externi";
870+
break;
871+
case 1049: // Russian
872+
userIdentity = "Все, кроме внешних пользователей";
873+
break;
874+
case 10266: // Serbian (Cyrillic, Serbia)
875+
userIdentity = "Сви осим спољних корисника";
876+
break;
877+
case 2074:// Serbian (Latin)
878+
userIdentity = "Svi osim spoljnih korisnika";
879+
break;
880+
case 1051:// Slovak
881+
userIdentity = "Všetci okrem externých používateľov";
882+
break;
883+
case 1060: // Slovenian
884+
userIdentity = "Vsi razen zunanji uporabniki";
885+
break;
886+
case 3082: // Spanish
887+
userIdentity = "Todos excepto los usuarios externos";
888+
break;
889+
case 1053: // Swedish
890+
userIdentity = "Alla utom externa användare";
891+
break;
892+
case 1054: // Thai
893+
userIdentity = "ทุกคนยกเว้นผู้ใช้ภายนอก";
894+
break;
895+
case 1055: // Turkish
896+
userIdentity = "Dış kullanıcılar hariç herkes";
897+
break;
898+
case 1058: // Ukranian
899+
userIdentity = "Усі, крім зовнішніх користувачів";
900+
break;
901+
case 1066: // Vietnamese
902+
userIdentity = "Tất cả mọi người trừ người dùng bên ngoài";
903+
break;
904+
}
905+
906+
if (!string.IsNullOrEmpty(userIdentity))
907+
{
908+
return await EnsureUserAsync(userIdentity).ConfigureAwait(false);
909+
}
910+
}
911+
912+
throw new ClientException(ErrorType.Unsupported, PnPCoreResources.Exception_Web_EveyoneExceptUsersCouldNotBeEnsured);
775913
}
776914

777915
public ISharePointUser EnsureUser(string userPrincipalName)

0 commit comments

Comments
 (0)