Skip to content

Commit 9205b80

Browse files
committed
Fixed an issue where viewing the stack page as an admin filtered to a project was causing results to be returned incorrectly.
1 parent d427bdd commit 9205b80

File tree

5 files changed

+35
-19
lines changed

5 files changed

+35
-19
lines changed

Source/Api/Controllers/Base/ExceptionlessApiController.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Exceptionless.Api.Utility.Results;
1212
using Exceptionless.Core.Repositories;
1313
using Exceptionless.Core.Models;
14+
using Exceptionless.Core.Repositories.Queries;
1415
using Exceptionless.DateTimeExtensions;
1516
using Foundatio.Repositories.Models;
1617
using Foundatio.Utility;
@@ -142,11 +143,22 @@ public async Task<IReadOnlyCollection<Organization>> GetAssociatedActiveOrganiza
142143
return organizations.Where(o => !o.IsSuspended).ToList().AsReadOnly();
143144
}
144145

145-
protected bool ShouldApplySystemFilter(string filter) {
146+
protected bool ShouldApplySystemFilter(IExceptionlessSystemFilterQuery sf, string filter) {
147+
// Apply filter to non admin user.
148+
if (!Request.IsGlobalAdmin())
149+
return true;
150+
151+
// Apply filter as it's scoped via a controller action.
152+
if (!sf.IsUserOrganizationsFilter)
153+
return true;
154+
155+
// Empty user filter
146156
if (String.IsNullOrEmpty(filter))
147157
return true;
148158

149-
return !(Request.IsGlobalAdmin() && (filter.Contains("organization:") || filter.Contains("project:") || filter.Contains("stack:")));
159+
// Used for impersonating a user. Only skip the filter if it contains an org, project or stack.
160+
bool hasOrganizationOrProjectOrStackFilter = filter.Contains("organization:") || filter.Contains("project:") || filter.Contains("stack:");
161+
return !hasOrganizationOrProjectOrStackFilter;
150162
}
151163

152164
protected StatusCodeActionResult StatusCodeWithMessage(HttpStatusCode statusCode, string message, string reason = null) {

Source/Api/Controllers/EventController.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public async Task<IHttpActionResult> GetAsync(string filter = null, string sort
129129
return Ok(EmptyModels);
130130

131131
var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff());
132-
var sf = new ExceptionlessSystemFilterQuery(organizations);
132+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
133133
return await GetInternalAsync(sf, ti, filter, sort, mode, page, limit);
134134
}
135135

@@ -151,7 +151,7 @@ private async Task<IHttpActionResult> GetInternalAsync(IExceptionlessSystemFilte
151151

152152
FindResults<PersistentEvent> events;
153153
try {
154-
events = await _repository.GetByFilterAsync(ShouldApplySystemFilter(filter) ? sf : null, pr.ExpandedQuery, sortBy, ti.Field, ti.UtcRange.Start, ti.UtcRange.End, options);
154+
events = await _repository.GetByFilterAsync(ShouldApplySystemFilter(sf, filter) ? sf : null, pr.ExpandedQuery, sortBy, ti.Field, ti.UtcRange.Start, ti.UtcRange.End, options);
155155
} catch (ApplicationException ex) {
156156
_logger.Error().Exception(ex)
157157
.Message("An error has occurred. Please check your search filter.")
@@ -264,7 +264,7 @@ public async Task<IHttpActionResult> GetByStackAsync(string stackId, string filt
264264
var stack = await GetStackAsync(stackId);
265265
if (stack == null)
266266
return NotFound();
267-
267+
268268
var organization = await GetOrganizationAsync(stack.OrganizationId);
269269
if (organization == null)
270270
return NotFound();
@@ -295,7 +295,7 @@ public async Task<IHttpActionResult> GetByReferenceIdAsync(string referenceId, s
295295
return Ok(EmptyModels);
296296

297297
var ti = GetTimeInfo(null, offset, organizations.GetRetentionUtcCutoff());
298-
var sf = new ExceptionlessSystemFilterQuery(organizations);
298+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
299299
return await GetInternalAsync(sf, ti, String.Concat("reference:", referenceId), null, mode, page, limit);
300300
}
301301

@@ -352,7 +352,7 @@ public async Task<IHttpActionResult> GetBySessionIdAsync(string sessionId, strin
352352
return Ok(EmptyModels);
353353

354354
var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff());
355-
var sf = new ExceptionlessSystemFilterQuery(organizations);
355+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
356356
return await GetInternalAsync(sf, ti, $"(reference:{sessionId} OR ref.session:{sessionId}) {filter}", sort, mode, page, limit, true);
357357
}
358358

@@ -411,7 +411,7 @@ public async Task<IHttpActionResult> GetBySessionAsync(string filter = null, str
411411
return Ok(EmptyModels);
412412

413413
var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff());
414-
var sf = new ExceptionlessSystemFilterQuery(organizations);
414+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
415415
return await GetInternalAsync(sf, ti, $"type:{Event.KnownTypes.Session} {filter}", sort, mode, page, limit, true);
416416
}
417417

Source/Api/Controllers/StackController.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ public async Task<IHttpActionResult> GetAsync(string filter = null, string sort
506506
return Ok(EmptyModels);
507507

508508
var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff());
509-
var sf = new ExceptionlessSystemFilterQuery(organizations);
509+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
510510
return await GetInternalAsync(sf, ti, filter, sort, mode, page, limit);
511511
}
512512

@@ -527,7 +527,7 @@ private async Task<IHttpActionResult> GetInternalAsync(IExceptionlessSystemFilte
527527
var options = new PagingOptions { Page = page, Limit = limit };
528528

529529
try {
530-
var results = await _repository.GetByFilterAsync(ShouldApplySystemFilter(filter) ? sf : null, filter, sortBy, ti.Field, ti.UtcRange.Start, ti.UtcRange.End, options);
530+
var results = await _repository.GetByFilterAsync(ShouldApplySystemFilter(sf, filter) ? sf : null, filter, sortBy, ti.Field, ti.UtcRange.Start, ti.UtcRange.End, options);
531531

532532
var stacks = results.Documents.Select(s => s.ApplyOffset(ti.Offset)).ToList();
533533
if (!String.IsNullOrEmpty(mode) && String.Equals(mode, "summary", StringComparison.OrdinalIgnoreCase))
@@ -597,7 +597,7 @@ public async Task<IHttpActionResult> NewAsync(string filter = null, string time
597597
return Ok(EmptyModels);
598598

599599
var ti = GetTimeInfo(String.Concat("first|", time), offset, organizations.GetRetentionUtcCutoff());
600-
var sf = new ExceptionlessSystemFilterQuery(organizations);
600+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
601601
return await GetInternalAsync(sf, ti, filter, "-first", mode, page, limit);
602602
}
603603

@@ -653,7 +653,7 @@ public async Task<IHttpActionResult> RecentAsync(string filter = null, string ti
653653
return Ok(EmptyModels);
654654

655655
var ti = GetTimeInfo(String.Concat("last|", time), offset, organizations.GetRetentionUtcCutoff());
656-
var sf = new ExceptionlessSystemFilterQuery(organizations);
656+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
657657
return await GetInternalAsync(sf, ti, filter, "-last", mode, page, limit);
658658
}
659659

@@ -709,7 +709,7 @@ public async Task<IHttpActionResult> FrequentAsync(string filter = null, string
709709
return Ok(EmptyModels);
710710

711711
var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff());
712-
var sf = new ExceptionlessSystemFilterQuery(organizations);
712+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
713713
return await GetAllByTermsAsync(_distinctUsersFields, sf, ti, filter, mode, page, limit);
714714
}
715715

@@ -765,7 +765,7 @@ public async Task<IHttpActionResult> UsersAsync(string filter = null, string tim
765765
return Ok(EmptyModels);
766766

767767
var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff());
768-
var sf = new ExceptionlessSystemFilterQuery(organizations);
768+
var sf = new ExceptionlessSystemFilterQuery(organizations) { IsUserOrganizationsFilter = true };
769769
return await GetAllByTermsAsync(_distinctUsersFieldsWithSort, sf, ti, filter, mode, page, limit);
770770
}
771771

@@ -816,7 +816,7 @@ private async Task<IHttpActionResult> GetAllByTermsAsync(ICollection<FieldAggreg
816816
sf.UsesPremiumFeatures = pr.UsesPremiumFeatures;
817817

818818
try {
819-
var ntsr = await _eventStats.GetNumbersTermsStatsAsync("stack_id", fields, ti.UtcRange.Start, ti.UtcRange.End, ShouldApplySystemFilter(filter) ? sf : null, filter, ti.Offset, GetSkip(page + 1, limit) + 1);
819+
var ntsr = await _eventStats.GetNumbersTermsStatsAsync("stack_id", fields, ti.UtcRange.Start, ti.UtcRange.End, ShouldApplySystemFilter(sf, filter) ? sf : null, filter, ti.Offset, GetSkip(page + 1, limit) + 1);
820820
if (ntsr.Terms.Count == 0)
821821
return Ok(EmptyModels);
822822

Source/Api/Controllers/StatsController.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,13 @@ public async Task<IHttpActionResult> GetAsync(string fields = null, string filte
5050

5151
var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff());
5252
var sf = new ExceptionlessSystemFilterQuery(organizations) {
53-
UsesPremiumFeatures = far.UsesPremiumFeatures || pr.UsesPremiumFeatures
53+
UsesPremiumFeatures = far.UsesPremiumFeatures || pr.UsesPremiumFeatures,
54+
IsUserOrganizationsFilter = true
5455
};
5556

5657
NumbersStatsResult result;
5758
try {
58-
result = await _stats.GetNumbersStatsAsync(far.Aggregations, ti.UtcRange.Start, ti.UtcRange.End, ShouldApplySystemFilter(filter) ? sf : null, pr.ExpandedQuery, ti.Offset);
59+
result = await _stats.GetNumbersStatsAsync(far.Aggregations, ti.UtcRange.Start, ti.UtcRange.End, ShouldApplySystemFilter(sf, filter) ? sf : null, pr.ExpandedQuery, ti.Offset);
5960
} catch (ApplicationException ex) {
6061
_logger.Error().Exception(ex)
6162
.Message("An error has occurred. Please check your search filter.")
@@ -96,12 +97,13 @@ public async Task<IHttpActionResult> GetTimelineAsync(string fields = null, stri
9697

9798
var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff());
9899
var sf = new ExceptionlessSystemFilterQuery(organizations) {
99-
UsesPremiumFeatures = far.UsesPremiumFeatures || pr.UsesPremiumFeatures
100+
UsesPremiumFeatures = far.UsesPremiumFeatures || pr.UsesPremiumFeatures,
101+
IsUserOrganizationsFilter = true
100102
};
101103

102104
NumbersTimelineStatsResult result;
103105
try {
104-
result = await _stats.GetNumbersTimelineStatsAsync(far.Aggregations, ti.UtcRange.Start, ti.UtcRange.End, ShouldApplySystemFilter(filter) ? sf : null, pr.ExpandedQuery, ti.Offset);
106+
result = await _stats.GetNumbersTimelineStatsAsync(far.Aggregations, ti.UtcRange.Start, ti.UtcRange.End, ShouldApplySystemFilter(sf, filter) ? sf : null, pr.ExpandedQuery, ti.Offset);
105107
} catch (ApplicationException ex) {
106108
_logger.Error().Exception(ex)
107109
.Message("An error has occurred. Please check your search filter.")

Source/Core/Repositories/Queries/ExceptionlessSystemFilterQuery.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ public ExceptionlessSystemFilterQuery(Stack stack, Organization organization) :
4848
public IReadOnlyCollection<Project> Projects { get; }
4949
public Stack Stack { get; }
5050
public bool UsesPremiumFeatures { get; set; }
51+
public bool IsUserOrganizationsFilter { get; set; }
5152
}
5253

5354
public interface IExceptionlessSystemFilterQuery : IRepositoryQuery {
5455
IReadOnlyCollection<Organization> Organizations { get; }
5556
IReadOnlyCollection<Project> Projects { get; }
5657
Stack Stack { get; }
5758
bool UsesPremiumFeatures { get; set; }
59+
bool IsUserOrganizationsFilter { get; set; }
5860
}
5961

6062
public class ExceptionlessSystemFilterQueryBuilder : IElasticQueryBuilder {

0 commit comments

Comments
 (0)