@@ -222,48 +222,49 @@ func (g Graph) GetUsers(w http.ResponseWriter, r *http.Request) {
222222 }
223223
224224 ctxHasFullPerms := g .contextUserHasFullAccountPerms (r .Context ())
225- searchHasAcceptableLength := false
226- if odataReq .Query != nil && odataReq .Query .Search != nil {
227- minSearchLength := g .config .API .IdentitySearchMinLength
228- if strings .HasPrefix (odataReq .Query .Search .RawValue , "\" " ) {
229- // if search starts with double quotes then it must finish with double quotes
230- // add +2 to the minimum search length in this case
231- minSearchLength += 2
232- }
233- searchHasAcceptableLength = len (odataReq .Query .Search .RawValue ) >= minSearchLength
234- }
235- if ! searchHasAcceptableLength {
225+ hasMFA := mfa .Has (r .Context ())
226+ if ! hasAcceptableSearch (odataReq .Query , g .config .API .IdentitySearchMinLength ) {
236227 if ! ctxHasFullPerms {
237228 // for regular user the search term must have a minimum length
238229 logger .Debug ().Interface ("query" , r .URL .Query ()).Msgf ("search with less than %d chars for a regular user" , g .config .API .IdentitySearchMinLength )
239230 errorcode .AccessDenied .Render (w , r , http .StatusForbidden , "search term too short" )
240231 return
241232 }
242- if ! mfa . EnsureOrReject ( r . Context (), w ) {
233+ if ! hasMFA {
243234 logger .Error ().Str ("path" , r .URL .Path ).Msg ("MFA required but not satisfied" )
235+ mfa .SetRequiredStatus (w )
244236 return
245237 }
246238 }
247239
248- if ! ctxHasFullPerms && odataReq .Query .Filter != nil {
249- // regular users are allowed to filter only by userType
250- filter := odataReq .Query .Filter
251- switch {
252- case filter .Tree .Token .Type != godata .ExpressionTokenLogical :
253- fallthrough
254- case filter .Tree .Token .Value != "eq" :
255- fallthrough
256- case filter .Tree .Children [0 ].Token .Value != "userType" :
240+ if ! hasAcceptableFilter (odataReq .Query ) {
241+ if ! ctxHasFullPerms {
242+ // regular users are allowed to filter only by userType
257243 logger .Debug ().Interface ("query" , r .URL .Query ()).Msg ("forbidden filter for a regular user" )
258244 errorcode .AccessDenied .Render (w , r , http .StatusForbidden , "filter has forbidden elements for regular users" )
259245 return
260246 }
247+
248+ if ! hasMFA {
249+ logger .Error ().Str ("path" , r .URL .Path ).Msg ("MFA required but not satisfied" )
250+ mfa .SetRequiredStatus (w )
251+ return
252+ }
261253 }
262- if ! ctxHasFullPerms && (odataReq .Query .Apply != nil || odataReq .Query .Expand != nil || odataReq .Query .Compute != nil ) {
263- // regular users can't use filter, apply, expand and compute
264- logger .Debug ().Interface ("query" , r .URL .Query ()).Msg ("forbidden query elements for a regular user" )
265- errorcode .AccessDenied .Render (w , r , http .StatusForbidden , "query has forbidden elements for regular users" )
266- return
254+
255+ if ! hasAcceptableQuery (odataReq .Query ) {
256+ if ! ctxHasFullPerms {
257+ // regular users can't use filter, apply, expand and compute
258+ logger .Debug ().Interface ("query" , r .URL .Query ()).Msg ("forbidden query elements for a regular user" )
259+ errorcode .AccessDenied .Render (w , r , http .StatusForbidden , "query has forbidden elements for regular users" )
260+ return
261+ }
262+
263+ if ! hasMFA {
264+ logger .Error ().Str ("path" , r .URL .Path ).Msg ("MFA required but not satisfied" )
265+ mfa .SetRequiredStatus (w )
266+ return
267+ }
267268 }
268269
269270 logger .Debug ().Interface ("query" , r .URL .Query ()).Msg ("calling get users on backend" )
0 commit comments