1313 /// </summary>
1414 internal class RscConfigurationSynthesizer
1515 {
16- internal const string MicrosoftCreatedPermissionGrantPolicyForChatRscPreApproval = "ManagePermissionGrantsForOwnedResource.microsoft-pre-approval-apps-for-chat " ;
16+ internal const string GroupConsentSettingsTemplateId = "dffd5d46-495d-40a9-8e21-954ff55e198a " ;
1717
18- internal const string MicrosoftCreatedPermissionGrantPolicyForTeamRscPreApproval = "ManagePermissionGrantsForOwnedResource.microsoft-pre-approval-apps-for-group " ;
18+ internal const string MicrosoftCreatedPermissionGrantPolicyEnabledForPreapprovedAppsForChats = "ManagePermissionGrantsForOwnedResource.microsoft-pre-approval-apps-for-chat " ;
1919
20- internal const string MicrosoftCreatedPermissionGrantPolicyForUserConsentLegacy = "ManagePermissionGrantsForSelf .microsoft-user-default-legacy " ;
20+ internal const string MicrosoftCreatedPermissionGrantPolicyEnabledForAllAppsForChats = "ManagePermissionGrantsForOwnedResource .microsoft-all-application-permissions-for-chat " ;
2121
22- internal const string GroupConsentSettingsTemplateId = "dffd5d46-495d-40a9-8e21-954ff55e198a " ;
22+ internal const string MicrosoftCreatedPermissionGrantPolicyManagedByMicrosoftForChats = "ManagePermissionGrantsForOwnedResource.microsoft-dynamically-managed-permissions-for-chat " ;
2323
24- internal const string EnableGroupSpecificConsentKey = "EnableGroupSpecificConsent " ;
24+ internal const string MicrosoftCreatedPermissionGrantPolicyEnabledForPreapprovedAppsForTeams = "ManagePermissionGrantsForOwnedResource.microsoft-pre-approval-apps-for-team " ;
2525
26- internal const string ConstrainGroupSpecificConsentToMembersOfGroupIdKey = "ConstrainGroupSpecificConsentToMembersOfGroupId" ;
26+ internal const string MicrosoftCreatedPermissionGrantPolicyEnabledForAllAppsForTeams = "ManagePermissionGrantsForOwnedResource.microsoft-all-application-permissions-for-team" ;
27+
28+ internal const string MicrosoftCreatedPermissionGrantPolicyManagedByMicrosoftForTeams = "ManagePermissionGrantsForOwnedResource.microsoft-dynamically-managed-permissions-for-team" ;
2729
2830 /// <summary>
2931 /// Initializes a new instance of the <see cref="RscConfigurationSynthesizer"/> class.
@@ -82,33 +84,54 @@ internal MicrosoftGraphRscConfiguration ConvertToChatRscConfiguration(
8284
8385 if ( teamsAppSettings . IsChatResourceSpecificConsentEnabled == true )
8486 {
85- if ( assignedPermissionGrantPoliciesApplicableToChatScope . Any ( ) )
86- {
87- this . LogVerbose (
88- "Chat RSC is enabled in Teams App Settings and chat scoped permission grant policies are enabled. Not a supported scenario." ,
89- eventListener ) ;
90- microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . Custom ;
91- }
92- else
93- {
94- this . LogVerbose ( "Chat RSC is enabled in Teams App Settings." , eventListener ) ;
95- microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForAllApps ;
96- }
87+ this . LogVerbose ( "Chat RSC is enabled in Teams App Settings." , eventListener ) ;
88+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForAllApps ;
9789 }
9890 else if ( assignedPermissionGrantPoliciesApplicableToChatScope . Any ( ) )
9991 {
100- if ( assignedPermissionGrantPoliciesApplicableToChatScope . Any ( pgp => ! string . Equals (
101- pgp . ManagePermissionGrantsForOwnedResourcePrefixedId ,
102- RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyForChatRscPreApproval ,
103- StringComparison . OrdinalIgnoreCase ) ) )
92+ int interestingPermissionGrantPolicyCount = assignedPermissionGrantPoliciesApplicableToChatScope . Count ( ) ;
93+
94+ if ( interestingPermissionGrantPolicyCount > 1 )
10495 {
105- this . LogVerbose ( "Unknown chat scoped permission grant policies are enabled. Not a supported scenario." , eventListener ) ;
96+ this . LogVerbose ( "Multiple chat scoped permission grant policies are enabled. Not a supported scenario." , eventListener ) ;
10697 microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . Custom ;
10798 }
99+ else if ( interestingPermissionGrantPolicyCount == 0 )
100+ {
101+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . DisabledForAllApps ;
102+ }
108103 else
109104 {
110- this . LogVerbose ( "Authorization policy contains permission grant policy for chat RSC preapprovals." , eventListener ) ;
111- microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForPreApprovedAppsOnly ;
105+ MGTeamsInternalPermissionGrantPolicy interestingPermissionGrantPolicy =
106+ assignedPermissionGrantPoliciesApplicableToChatScope . Single ( ) ;
107+
108+ if ( string . Equals (
109+ interestingPermissionGrantPolicy . ManagePermissionGrantsForOwnedResourcePrefixedId ,
110+ RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyEnabledForAllAppsForChats ,
111+ StringComparison . OrdinalIgnoreCase ) )
112+ {
113+ this . LogVerbose ( "Authorization policy contains permission grant policy for all chat RSC applications." , eventListener ) ;
114+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForAllApps ;
115+ }
116+ else if ( string . Equals (
117+ interestingPermissionGrantPolicy . ManagePermissionGrantsForOwnedResourcePrefixedId ,
118+ RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyEnabledForPreapprovedAppsForChats ,
119+ StringComparison . OrdinalIgnoreCase ) )
120+ {
121+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForPreApprovedAppsOnly ;
122+ }
123+ else if ( string . Equals (
124+ interestingPermissionGrantPolicy . ManagePermissionGrantsForOwnedResourcePrefixedId ,
125+ RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyManagedByMicrosoftForChats ,
126+ StringComparison . OrdinalIgnoreCase ) )
127+ {
128+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . ManagedByMicrosoft ;
129+ }
130+ else
131+ {
132+ this . LogVerbose ( "Unknown chat scoped permission grant policies are enabled. Not a supported scenario." , eventListener ) ;
133+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . Custom ;
134+ }
112135 }
113136 }
114137 else
@@ -124,12 +147,10 @@ internal MicrosoftGraphRscConfiguration ConvertToChatRscConfiguration(
124147 /// Convert the given tenant settings to Team RSC configuration.
125148 /// </summary>
126149 /// <param name="permissionGrantPolicyCollection">Permission grant policy collection.</param>
127- /// <param name="tenantConsentSettingCollection">Tenant consent setting collection.</param>
128150 /// <param name="authorizationPolicy">Authorization policy.</param>
129151 /// <returns>Rsc configuration.</returns>
130152 internal IMicrosoftGraphRscConfiguration ConvertToTeamRscConfiguration (
131153 MGTeamsInternalPermissionGrantPolicyCollection permissionGrantPolicyCollection ,
132- MGTeamsInternalTenantConsentSettingsCollection tenantConsentSettingCollection ,
133154 MGTeamsInternalAuthorizationPolicy authorizationPolicy ,
134155 Runtime . IEventListener eventListener )
135156 {
@@ -140,13 +161,6 @@ internal IMicrosoftGraphRscConfiguration ConvertToTeamRscConfiguration(
140161 "Permission grant policies were not found." ) ;
141162 }
142163
143- if ( tenantConsentSettingCollection ? . Value == null )
144- {
145- throw new MGTeamsInternalException (
146- MGTeamsInternalErrorType . ResourceNotFound ,
147- "Tenant consent settings were not found." ) ;
148- }
149-
150164 if ( authorizationPolicy == null )
151165 {
152166 throw new MGTeamsInternalException (
@@ -161,58 +175,53 @@ internal IMicrosoftGraphRscConfiguration ConvertToTeamRscConfiguration(
161175 State = MicrosoftGraphRscConfigurationState . Custom
162176 } ;
163177
164- ( string isGroupConsentSettingEnabled , string groupConsentConstrainedToGroupId ) projectedGroupConsentSettings = this . GetProjectedGroupConsentSettings (
165- tenantConsentSettingCollection ,
166- authorizationPolicy ,
167- eventListener ) ;
168-
169178 IEnumerable < MGTeamsInternalPermissionGrantPolicy > assignedPermissionGrantPoliciesApplicableToGroupScope =
170179 this . GetAssignedPermissionGrantPoliciesApplicableToGivenScopeType (
171180 permissionGrantPolicyCollection ,
172181 authorizationPolicy ,
173182 MicrosoftGraphRscConfigurationScopeType . Team ) ;
174183
175- if ( string . Equals ( projectedGroupConsentSettings . isGroupConsentSettingEnabled , true . ToString ( ) , StringComparison . OrdinalIgnoreCase ) )
184+ int interestingPermissionGrantPolicyCount = assignedPermissionGrantPoliciesApplicableToGroupScope . Count ( ) ;
185+
186+ if ( interestingPermissionGrantPolicyCount > 1 )
176187 {
177- if ( assignedPermissionGrantPoliciesApplicableToGroupScope . Any ( ) )
178- {
179- this . LogVerbose (
180- "Projected group consent setting value is enabled and group scoped permission grant policies are enabled. Not a supported scenario." ,
181- eventListener ) ;
182- microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . Custom ;
183- }
184- else if ( string . IsNullOrWhiteSpace ( projectedGroupConsentSettings . groupConsentConstrainedToGroupId ) )
188+ this . LogVerbose ( "Multiple group scoped permission grant policies are enabled. Not a supported scenario." , eventListener ) ;
189+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . Custom ;
190+ }
191+ else if ( interestingPermissionGrantPolicyCount == 0 )
192+ {
193+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . DisabledForAllApps ;
194+ }
195+ else
196+ {
197+ MGTeamsInternalPermissionGrantPolicy interestingPermissionGrantPolicy = assignedPermissionGrantPoliciesApplicableToGroupScope . Single ( ) ;
198+ if ( string . Equals (
199+ interestingPermissionGrantPolicy . ManagePermissionGrantsForOwnedResourcePrefixedId ,
200+ RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyEnabledForAllAppsForTeams ,
201+ StringComparison . OrdinalIgnoreCase ) )
185202 {
186- this . LogVerbose ( "Projected group consent setting value is enabled. No constraints on users able to grant consent." , eventListener ) ;
187203 microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForAllApps ;
188204 }
189- else
205+ else if ( string . Equals (
206+ interestingPermissionGrantPolicy . ManagePermissionGrantsForOwnedResourcePrefixedId ,
207+ RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyEnabledForPreapprovedAppsForTeams ,
208+ StringComparison . OrdinalIgnoreCase ) )
190209 {
191- this . LogVerbose ( $ "Projected group consent setting value is enabled. Consent is constrained to users belonging to group '{ projectedGroupConsentSettings . groupConsentConstrainedToGroupId } '.", eventListener ) ;
192- microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForSelectedGroupOfUsers ;
210+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForPreApprovedAppsOnly ;
193211 }
194- }
195- else if ( assignedPermissionGrantPoliciesApplicableToGroupScope . Any ( ) )
196- {
197- if ( assignedPermissionGrantPoliciesApplicableToGroupScope . Any ( pgp => ! string . Equals (
198- pgp . ManagePermissionGrantsForOwnedResourcePrefixedId ,
199- RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyForTeamRscPreApproval ,
200- StringComparison . OrdinalIgnoreCase ) ) )
212+ else if ( string . Equals (
213+ interestingPermissionGrantPolicy . ManagePermissionGrantsForOwnedResourcePrefixedId ,
214+ RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyManagedByMicrosoftForTeams ,
215+ StringComparison . OrdinalIgnoreCase ) )
201216 {
202- this . LogVerbose ( "Unknown group scoped permission grant policies are enabled. Not a supported scenario." , eventListener ) ;
203- microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . Custom ;
217+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . ManagedByMicrosoft ;
204218 }
205219 else
206220 {
207- this . LogVerbose ( "Authorization policy contains permission grant policy for team RSC preapprovals ." , eventListener ) ;
208- microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . EnabledForPreApprovedAppsOnly ;
221+ this . LogVerbose ( "Unknown group scoped permission grant policies are enabled. Not a supported scenario ." , eventListener ) ;
222+ microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . Custom ;
209223 }
210224 }
211- else
212- {
213- this . LogVerbose ( "Team RSC is disabled." , eventListener ) ;
214- microsoftGraphRscConfiguration . State = MicrosoftGraphRscConfigurationState . DisabledForAllApps ;
215- }
216225
217226 return microsoftGraphRscConfiguration ;
218227 }
@@ -233,7 +242,7 @@ internal IEnumerable<MGTeamsInternalPermissionGrantPolicy> GetAssignedPermission
233242 switch ( rscConfigurationScopeType )
234243 {
235244 case MicrosoftGraphRscConfigurationScopeType . Team :
236- identitySpecificScopeType = "group " ;
245+ identitySpecificScopeType = "team " ;
237246 break ;
238247
239248 case MicrosoftGraphRscConfigurationScopeType . Chat :
@@ -262,51 +271,6 @@ internal IEnumerable<MGTeamsInternalPermissionGrantPolicy> GetAssignedPermission
262271 return assignedPermissionGrantPoliciesApplicableToGivenScope ;
263272 }
264273
265- /// <summary>
266- /// Get the projected value of group consent settings. i.e.
267- /// 1. Whether group consent is enabled. This is derived from group consent and user consent settings.
268- /// 2. Specific groups that group consent is restricted to.
269- /// </summary>
270- /// <param name="tenantConsentSettingCollection">Tenant consent setting collection.</param>
271- /// <param name="authorizationPolicy">The authorization policy.</param>
272- /// <param name="eventListener">The event listener.</param>
273- /// <returns>Projected value of group consent settings.</returns>
274- private ( string isGroupConsentSettingEnabled , string groupConsentConstrainedToGroupId ) GetProjectedGroupConsentSettings (
275- MGTeamsInternalTenantConsentSettingsCollection tenantConsentSettingCollection ,
276- MGTeamsInternalAuthorizationPolicy authorizationPolicy ,
277- IEventListener eventListener )
278- {
279- MGTeamsInternalTenantConsentSettings groupConsentSettings = tenantConsentSettingCollection . Value ? . FirstOrDefault (
280- v => string . Equals ( v . TemplateId , RscConfigurationSynthesizer . GroupConsentSettingsTemplateId , StringComparison . OrdinalIgnoreCase ) ) ;
281-
282- if ( groupConsentSettings == null )
283- {
284- this . LogVerbose ( "Group Consent settings were not found." , eventListener ) ;
285-
286- if ( authorizationPolicy
287- ? . DefaultUserRolePermissions
288- ? . PermissionGrantPoliciesAssigned
289- ? . Contains (
290- RscConfigurationSynthesizer . MicrosoftCreatedPermissionGrantPolicyForUserConsentLegacy , StringComparer . OrdinalIgnoreCase ) == true )
291- {
292- this . LogVerbose ( "Legacy policy for user consent was found in default user role permissions. Projecting group consent to be true." , eventListener ) ;
293- return ( isGroupConsentSettingEnabled : true . ToString ( ) , groupConsentConstrainedToGroupId : null ) ;
294- }
295-
296- return ( isGroupConsentSettingEnabled : false . ToString ( ) , groupConsentConstrainedToGroupId : null ) ;
297- }
298-
299- MGTeamsInternalTenantConsentSettingValue isGroupConsentEnabledSettingValue = groupConsentSettings . Values ? . SingleOrDefault (
300- v => string . Equals ( v . Name , RscConfigurationSynthesizer . EnableGroupSpecificConsentKey , StringComparison . OrdinalIgnoreCase ) ) ;
301-
302- MGTeamsInternalTenantConsentSettingValue groupConsentConstrainedToGroupId = groupConsentSettings . Values ? . SingleOrDefault (
303- v => string . Equals ( v . Name , RscConfigurationSynthesizer . ConstrainGroupSpecificConsentToMembersOfGroupIdKey , StringComparison . OrdinalIgnoreCase ) ) ;
304-
305- return
306- ( isGroupConsentSettingEnabled : isGroupConsentEnabledSettingValue ? . Value ,
307- groupConsentConstrainedToGroupId : groupConsentConstrainedToGroupId ? . Value ) ;
308- }
309-
310274 /// <summary>
311275 /// Log verbose.
312276 /// </summary>
0 commit comments