protected override DriverResult Editor(AuditTrailSettingsPart part, IUpdateModel updater, dynamic shapeHelper)
        {
            if (!_authorizer.Authorize(Permissions.ManageAuditTrailSettings))
            {
                return(null);
            }

            return(ContentShape("Parts_AuditTrailSettings_Edit", () => {
                var descriptors = _auditTrailManager.DescribeCategories();
                var eventSettings = part.EventSettings.ToList();
                var categoriesQuery =
                    from categoryDescriptor in descriptors
                    let eventsQuery =
                        from eventDescriptor in categoryDescriptor.Events
                        let eventSetting = GetOrCreate(eventSettings, eventDescriptor)
                                           select new AuditTrailEventSettingsViewModel {
                    Event = eventDescriptor.Event,
                    Name = eventDescriptor.Name,
                    Description = eventDescriptor.Description,
                    IsEnabled = eventDescriptor.IsMandatory || eventSetting.IsEnabled,
                    IsMandatory = eventDescriptor.IsMandatory
                }
                select new AuditTrailCategorySettingsViewModel {
                    Category = categoryDescriptor.Category,
                    Name = categoryDescriptor.Name,
                    Events = eventsQuery.ToList()
                };

                var viewModel = new AuditTrailSettingsViewModel {
                    Categories = categoriesQuery.ToList(),
                    EnableClientIpAddressLogging = part.EnableClientIpAddressLogging
                };

                // Update the settings as we may have added new settings.
                part.EventSettings = eventSettings;

                if (updater != null)
                {
                    var eventsDictionary = _auditTrailManager.DescribeProviders().Describe().SelectMany(x => x.Events).ToDictionary(x => x.Event);
                    if (updater.TryUpdateModel(viewModel, Prefix, null, null))
                    {
                        foreach (var eventSettingViewModel in viewModel.Categories.SelectMany(x => x.Events))
                        {
                            var eventSetting = eventSettings.First(x => x.EventName == eventSettingViewModel.Event);
                            var descriptor = eventsDictionary[eventSetting.EventName];

                            eventSetting.IsEnabled = eventSettingViewModel.IsEnabled || descriptor.IsMandatory;
                        }
                        part.EventSettings = eventSettings;
                        part.EnableClientIpAddressLogging = viewModel.EnableClientIpAddressLogging;
                    }
                }

                return shapeHelper.EditorTemplate(TemplateName: "Parts.AuditTrailSettings", Model: viewModel, Prefix: Prefix);
            }).OnGroup("Audit Trail"));
        }
        public async Task <ActionResult> Index(PagerParameters pagerParameters, AuditTrailOrderBy?orderBy = null)
        {
            if (!await _authorizationService.AuthorizeAsync(User, AuditTrailPermissions.ViewAuditTrail))
            {
                return(Forbid());
            }

            var siteSettings = await _siteService.GetSiteSettingsAsync();

            var pager        = new Pager(pagerParameters, siteSettings.PageSize);
            var filters      = Filters.From(QueryHelpers.ParseQuery(Request.QueryString.Value), _updateModelAccessor.ModelUpdater);
            var searchResult =
                await _auditTrailManager.GetAuditTrailEventsAsync(pager.Page, pager.PageSize, filters, orderBy ?? AuditTrailOrderBy.DateDescending);

            if (!_updateModelAccessor.ModelUpdater.ModelState.IsValid)
            {
                searchResult.AuditTrailEvents = Enumerable.Empty <AuditTrailEvent>();
            }

            var pagerShape = (await _shapeFactory.New.Pager(pager)).TotalItemCount(searchResult.TotalCount);

            var eventDescriptors = _auditTrailManager.DescribeCategories()
                                   .SelectMany(categoryDescriptor => categoryDescriptor.Events)
                                   .ToDictionary(eventDescriptor => eventDescriptor.FullEventName);

            var auditTrailEventsSummaryViewModel = searchResult.AuditTrailEvents.Select(auditTrailEvent =>
            {
                var eventDescriptor = eventDescriptors.ContainsKey(auditTrailEvent.FullEventName) ?
                                      eventDescriptors[auditTrailEvent.FullEventName] : AuditTrailEventDescriptor.Basic(auditTrailEvent);
                return(new AuditTrailEventSummaryViewModel
                {
                    AuditTrailEvent = auditTrailEvent,
                    EventDescriptor = eventDescriptor,
                    CategoryDescriptor = eventDescriptor.CategoryDescriptor,
                    AdditionalColumnsShapes = _auditTrailEventDisplayManager.BuildAdditionalColumnsShapesAsync(auditTrailEvent),
                    SummaryShape = _auditTrailEventDisplayManager.BuildDisplayAsync(auditTrailEvent, "SummaryAdmin"),
                    ActionsShape = _auditTrailEventDisplayManager.BuildActionsAsync(auditTrailEvent, "SummaryAdmin")
                });
            });

            return(View(new AuditTrailViewModel
            {
                AuditTrailEvents = auditTrailEventsSummaryViewModel,
                AdditionalColumnNames = await _auditTrailEventDisplayManager.BuildAdditionalColumnNamesShapesAsync(),
                Pager = pagerShape,
                OrderBy = orderBy ?? AuditTrailOrderBy.DateDescending,
                FilterDisplay = await _auditTrailEventDisplayManager.BuildFilterDisplayAsync(filters)
            }));
        }
Example #3
0
        public override async Task <IDisplayResult> EditAsync(AuditTrailSettings settings, BuildEditorContext context) =>
        !await IsAuthorizedToManageAuditTrailSettingsAsync()
                ? null
                : Initialize <AuditTrailSettingsViewModel>($"{nameof(AuditTrailSettings)}_Edit", model =>
        {
            var descriptors   = _auditTrailManager.DescribeCategories();
            var eventSettings = settings.EventSettings;

            var categories = descriptors.GroupBy(categoryDescriptor => categoryDescriptor.Category)
                             .Select(categoryDescriptor =>
                                     new
            {
                Category = categoryDescriptor.Key,
                Name     = categoryDescriptor.Select(categoryDescriptor => categoryDescriptor.LocalizedName),
                Events   = categoryDescriptor.SelectMany(categoryDescriptor => categoryDescriptor.Events)
            })
                             .Select(categoryDescriptor =>
                                     new AuditTrailCategorySettingsViewModel
            {
                Category = categoryDescriptor.Category,
                Name     = categoryDescriptor.Name.First(),
                Events   = categoryDescriptor.Events.Select(eventDescriptor =>
                {
                    var eventSetting = GetOrCreate(eventSettings.ToList(), eventDescriptor);

                    return(new AuditTrailEventSettingsViewModel
                    {
                        Event = eventDescriptor.FullEventName,
                        Name = eventDescriptor.LocalizedName,
                        Description = eventDescriptor.Description,
                        IsEnabled = eventDescriptor.IsMandatory || eventSetting.IsEnabled,
                        IsMandatory = eventDescriptor.IsMandatory
                    });
                }).ToList()
            }).ToList();

            model.Categories = categories;
            model.EnableClientIpAddressLogging = settings.EnableClientIpAddressLogging;
            model.BlacklistedContentTypes      = _contentDefitinionManager.ListTypeDefinitions()
                                                 .Select(contentTypeDefiniton =>
                                                         new BlacklistedContentTypesViewModel
            {
                Name        = contentTypeDefiniton.Name,
                DisplayName = contentTypeDefiniton.DisplayName,
                Selected    = settings.BlacklistedContentTypeNames.Contains(contentTypeDefiniton.Name)
            }).OrderBy(contentTypeDefinition => contentTypeDefinition.DisplayName).ToList();
        }).Location("Content:1").OnGroup(AuditTrailSettingsGroupId);
Example #4
0
        public override async Task <IDisplayResult> EditAsync(AuditTrailSettings settings, BuildEditorContext context)
        {
            if (!await _authorizationService.AuthorizeAsync(_httpContextAccessor.HttpContext?.User, AuditTrailPermissions.ManageAuditTrailSettings))
            {
                return(null);
            }

            return(Initialize <AuditTrailSettingsViewModel>("AuditTrailSettings_Edit", model =>
            {
                var categories = _auditTrailManager.DescribeCategories();

                var settingsGroups = settings.Categories
                                     .ToLookup(category => category.Events
                                               .FirstOrDefault()?.Category ?? "");

                var categoriesViewModel = categories
                                          .Select(category => new AuditTrailCategorySettingsViewModel()
                {
                    Name = category.Name,
                    LocalizedName = category.LocalizedName(_serviceProvider),
                    Events = category.Events.Values
                             .Select(auditTrailEvent =>
                    {
                        var settings = settingsGroups[auditTrailEvent.Category]
                                       .FirstOrDefault()?.Events
                                       .FirstOrDefault(settings => settings.Name == auditTrailEvent.Name);

                        return new AuditTrailEventSettingsViewModel()
                        {
                            Name = auditTrailEvent.Name,
                            Category = auditTrailEvent.Category,
                            LocalizedName = auditTrailEvent.LocalizedName(_serviceProvider),
                            Description = auditTrailEvent.Description(_serviceProvider),
                            IsEnabled = auditTrailEvent.IsMandatory || (settings?.IsEnabled ?? auditTrailEvent.IsEnabledByDefault),
                            IsMandatory = auditTrailEvent.IsMandatory
                        };
                    })
                             .ToArray()
                })
                                          .ToArray();

                model.Categories = categoriesViewModel;
                model.ClientIpAddressAllowed = settings.ClientIpAddressAllowed;
            }).Location("Content:1#Events").OnGroup(AuditTrailSettingsGroup.Id));
        }
        public ActionResult Index(PagerParameters pagerParameters, AuditTrailOrderBy?orderBy = null)
        {
            if (!_authorizer.Authorize(Permissions.ViewAuditTrail))
            {
                return(new HttpUnauthorizedResult());
            }

            var pager      = new Pager(_services.WorkContext.CurrentSite, pagerParameters);
            var filters    = Filters.From(Request.QueryString, this);
            var pageOfData = _auditTrailManager.GetRecords(pager.Page, pager.PageSize, filters, orderBy ?? AuditTrailOrderBy.DateDescending);

            // If there's a filter validation error, clear the results.
            if (!ModelState.IsValid)
            {
                pageOfData = new PageOfItems <AuditTrailEventRecord>(Enumerable.Empty <AuditTrailEventRecord>());
            }

            var pagerShape            = New.Pager(pager).TotalItemCount(pageOfData.TotalItemCount);
            var filterDisplay         = _auditTrailManager.BuildFilterDisplay(filters);
            var eventDescriptorsQuery =
                from c in _auditTrailManager.DescribeCategories()
                from e in c.Events
                select e;
            var eventDescriptors      = eventDescriptorsQuery.ToDictionary(x => x.Event);
            var recordViewModelsQuery =
                from record in pageOfData
                let descriptor = eventDescriptors.ContainsKey(record.FullEventName) ? eventDescriptors[record.FullEventName] : AuditTrailEventDescriptor.Basic(record)
                                 select new AuditTrailEventSummaryViewModel {
                Record             = record,
                EventDescriptor    = descriptor,
                CategoryDescriptor = descriptor.CategoryDescriptor,
                SummaryShape       = _displayBuilder.BuildDisplay(record, "SummaryAdmin"),
                ActionsShape       = _displayBuilder.BuildActions(record, "SummaryAdmin"),
            };

            var viewModel = new AuditTrailViewModel {
                Records       = recordViewModelsQuery.ToArray(),
                Pager         = pagerShape,
                OrderBy       = orderBy ?? AuditTrailOrderBy.DateDescending,
                FilterDisplay = filterDisplay
            };

            return(View(viewModel));
        }
Example #6
0
        public async Task <AuditTrailEventQueryResult> QueryAsync(int page, int pageSize, AuditTrailIndexOptions options)
        {
            // Because admin filters can add a different index to the query this must be added as a Query<AuditTrailEvent>()
            var query = _session.Query <AuditTrailEvent>(collection: AuditTrailEvent.Collection);

            query = await options.FilterResult.ExecuteAsync(new AuditTrailQueryContext(_serviceProvider, query));

            var totalCount = await query.CountAsync();

            if (pageSize > 0)
            {
                if (page > 1)
                {
                    query = query.Skip((page - 1) * pageSize);
                }

                query = query.Take(pageSize);
            }

            var events = await query.ListAsync();

            var result = new AuditTrailEventQueryResult
            {
                Events     = events,
                TotalCount = totalCount
            };

            options.AuditTrailSorts = _adminListOptions.SortOptions.Values.Where(x => x.SelectListItem != null).Select(opt => opt.SelectListItem(_serviceProvider, opt, options)).ToList();

            var categories = _auditTrailManager.DescribeCategories();

            options.Categories = categories
                                 .Select(category => new SelectListItem(category.LocalizedName(_serviceProvider), category.Name, category.Name == options.Category))
                                 .ToList();

            options.Categories.Insert(0, new SelectListItem(S["All categories"], String.Empty, String.IsNullOrEmpty(options.Category)));

            if (options.CorrelationIdFromRoute)
            {
                var firstEvent = result.Events.FirstOrDefault();
                if (firstEvent != null)
                {
                    var currentCategory = categories.FirstOrDefault(x => x.Name == firstEvent.Category);
                    if (currentCategory != null)
                    {
                        options.Events = currentCategory.Events.Values.Select(category =>
                                                                              new SelectListItem(category.LocalizedName(_serviceProvider), category.Name, category.Name == options.Category)).ToList();
                    }
                }
            }

            var localNow    = await _localClock.LocalNowAsync;
            var startOfWeek = CultureInfo.CurrentUICulture.DateTimeFormat.FirstDayOfWeek;

            options.AuditTrailDates = new List <SelectListItem>()
            {
                new SelectListItem(S["Any date"], String.Empty, options.Date == String.Empty),
            };

            var dateTimeValue = ">@now-1";

            options.AuditTrailDates.Add(new SelectListItem(S["Last 24 hours"], dateTimeValue, options.Date == dateTimeValue));

            dateTimeValue = "@now-2..@now-1";
            options.AuditTrailDates.Add(new SelectListItem(S["Previous 48 hours"], dateTimeValue, options.Date == dateTimeValue));

            dateTimeValue = $">{localNow.StartOfWeek(CultureInfo.CurrentUICulture.DateTimeFormat.FirstDayOfWeek).LocalDateTime.ToString(DateFormat)}";
            options.AuditTrailDates.Add(new SelectListItem(S["This week"], dateTimeValue, options.Date == dateTimeValue));

            var start = localNow.StartOfWeek(CultureInfo.CurrentUICulture.DateTimeFormat.FirstDayOfWeek).AddDays(-7).LocalDateTime;
            var end   = start.AddDays(7);

            dateTimeValue = $"{start.ToString(DateFormat)}..{end.ToString(DateFormat)}";
            options.AuditTrailDates.Add(new SelectListItem(S["Last week"], dateTimeValue, options.Date == dateTimeValue));

            start         = new DateTime(localNow.LocalDateTime.Year, localNow.LocalDateTime.Month, 1);
            dateTimeValue = $">{start.ToString(DateFormat)}";
            options.AuditTrailDates.Add(new SelectListItem(S["This month"], dateTimeValue, options.Date == dateTimeValue));

            start         = new DateTime(localNow.LocalDateTime.Year, localNow.LocalDateTime.Month, 1).AddMonths(-1);
            end           = start.AddMonths(1);
            dateTimeValue = $"{start.ToString(DateFormat)}..{end.ToString(DateFormat)}";
            options.AuditTrailDates.Add(new SelectListItem(S["Last month"], dateTimeValue, options.Date == dateTimeValue));
            options.AuditTrailDates.Add(new SelectListItem(S["Custom date range"], dateTimeValue, options.Date == dateTimeValue));

            dateTimeValue = $">{localNow.AddHours(-1).ToString("o")}";
            options.AuditTrailDates.Add(new SelectListItem(S["Last hour"], dateTimeValue, options.Date == dateTimeValue));

            dateTimeValue = $"{localNow.AddHours(-2).ToString("o")}..{localNow.AddHours(-1).ToString("o")}";
            options.AuditTrailDates.Add(new SelectListItem(S["Previous hour"], dateTimeValue, options.Date == dateTimeValue));
            options.AuditTrailDates.Add(new SelectListItem(S["Custom time range"], dateTimeValue, options.Date == dateTimeValue));

            return(result);
        }
        protected override DriverResult Editor(AuditTrailPart part, IUpdateModel updater, dynamic shapeHelper)
        {
            var settings = part.Settings.GetModel <AuditTrailPartSettings>();
            var results  = new List <DriverResult>();

            if (settings.ShowAuditTrailCommentInput)
            {
                results.Add(ContentShape("Parts_AuditTrail_Comment", () => {
                    var viewModel = new AuditTrailCommentViewModel();

                    if (part.ShowComment)
                    {
                        viewModel.Comment = part.Comment;
                    }

                    if (updater != null)
                    {
                        if (updater.TryUpdateModel(viewModel, Prefix, null, null))
                        {
                            part.Comment = viewModel.Comment;
                        }
                    }
                    return(shapeHelper.EditorTemplate(Model: viewModel, TemplateName: "Parts.AuditTrail.Comment", Prefix: Prefix));
                }));
            }
            if (_services.Authorizer.Authorize(Permissions.ViewAuditTrail))
            {
                if (settings.ShowAuditTrailLink)
                {
                    results.Add(ContentShape("Parts_AuditTrail_Link", () => shapeHelper.Parts_AuditTrail_Link()));
                }

                if (settings.ShowAuditTrail)
                {
                    results.Add(ContentShape("Parts_AuditTrail", () => {
                        var pager                 = new Pager(_services.WorkContext.CurrentSite, null, null);
                        var pageOfData            = _auditTrailManager.GetRecords(pager.Page, pager.PageSize, ContentAuditTrailEventProvider.CreateFilters(part.Id, updater));
                        var pagerShape            = shapeHelper.Pager(pager).TotalItemCount(pageOfData.TotalItemCount);
                        var eventDescriptorsQuery =
                            from c in _auditTrailManager.DescribeCategories()
                            from e in c.Events
                            select e;
                        var eventDescriptors      = eventDescriptorsQuery.ToArray();
                        var recordViewModelsQuery =
                            from record in pageOfData
                            let descriptor = eventDescriptors.FirstOrDefault(x => x.Event == record.FullEventName)
                                             where descriptor != null
                                             select new AuditTrailEventSummaryViewModel {
                            Record             = record,
                            EventDescriptor    = descriptor,
                            CategoryDescriptor = descriptor.CategoryDescriptor,
                            SummaryShape       = _displayBuilder.BuildDisplay(record, "SummaryAdmin"),
                            ActionsShape       = _displayBuilder.BuildActions(record, "SummaryAdmin")
                        };
                        var recordViewModels = recordViewModelsQuery.ToArray();
                        return(shapeHelper.Parts_AuditTrail(Records: recordViewModels, Pager: pagerShape));
                    }));
                }
            }

            return(Combined(results.ToArray()));
        }