|
13 | 13 | using System.Linq.Expressions; |
14 | 14 | using System.Net; |
15 | 15 | using System.Net.Http; |
| 16 | +using System.Runtime.InteropServices; |
16 | 17 | using System.Text; |
17 | 18 | using System.Text.Json; |
18 | 19 | using System.Threading.Tasks; |
@@ -729,49 +730,186 @@ public bool IsNoScriptSite() |
729 | 730 |
|
730 | 731 | private async Task<Guid> GetTenantIdAsync() |
731 | 732 | { |
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 | + } |
739 | 742 |
|
740 | | - try |
| 743 | + if (PnPContext.GlobalOptions.AADTenantId != Guid.Empty) |
741 | 744 | { |
742 | | - await request.GetResponseAsync().ConfigureAwait(false); |
| 745 | + return PnPContext.GlobalOptions.AADTenantId; |
743 | 746 | } |
744 | | - catch (WebException e) |
| 747 | + else |
745 | 748 | { |
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; |
760 | 750 | } |
761 | | - return Guid.Empty; |
762 | 751 | } |
763 | 752 |
|
764 | | - |
765 | | - public ISharePointUser GetEveryoneExceptExternalUsers() |
| 753 | + public ISharePointUser EnsureEveryoneExceptExternalUsers() |
766 | 754 | { |
767 | | - return GetEveryoneExceptExternalUsersAsync().GetAwaiter().GetResult(); |
| 755 | + return EnsureEveryoneExceptExternalUsersAsync().GetAwaiter().GetResult(); |
768 | 756 | } |
769 | 757 |
|
770 | | - public async Task<ISharePointUser> GetEveryoneExceptExternalUsersAsync() |
| 758 | + public async Task<ISharePointUser> EnsureEveryoneExceptExternalUsersAsync() |
771 | 759 | { |
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); |
775 | 913 | } |
776 | 914 |
|
777 | 915 | public ISharePointUser EnsureUser(string userPrincipalName) |
|
0 commit comments