mirror of
https://github.com/bitwarden/server
synced 2025-12-22 19:23:45 +00:00
* Auth/pm-48 (#2680) * PM-48 - add user's role as a claim and establish access control service * PM-48 - remove function unrelated to the role claim * PM-48 - fix whitespace issues * PM-48 - move registration of CustomClaimsPrincipalFactory, replace role claim type string with constant, streamline code that retrieves the user's role * Auth/pm-47 (#2699) * PM-48 - add user's role as a claim and establish access control service * PM-48 - remove function unrelated to the role claim * PM-48 - fix whitespace issues * PM-47 - add list of permission enums, role:permissions mapping, and function that determines if the logged in user has the given permission * PM-47 - remove unneeded service registration, set role to lowercase * PM-47 - fix code style issues * PM-46 - create permission filter attribute (#2753) * Auth/pm-54 add rbac for users (#2758) * PM-54 - add permission gates to User elements * PM-54 - fix formatting * PM-54 - remove unused function * PM-54 - fix variable reference, add permission to billing role * PM-54 - handle Upgrade Premium button functionality and fix spelling * PM-54 - change permission name to be more accurate * PM-49 - update role retrieval (#2779) * Auth/[PM-50] add rbac for logs (#2782) * PM-50 - add rbac for logs * PM-50 - remove unnecessary action filter * PM-51 - add RBAC for tools (#2799) * Auth/[pm-52] add rbac providers (#2818) * PM-52 add rbac for providers * PM-52 - update redirect action * PM-52 - add back edit functionality and permission * PM-52 - reverse changes around removing edit functionality * PM-52 - moved permission check to variable assignement * PM-53 - add rbac for organizations (#2798) * PM-52 - add missed permission to billing role (#2836) * Fixed merge conflicts. * [PM-1846] Updates to add RBAC back after merge conflicts (#2870) * Updates to add RBAC to changes from reseller. * Added back checks for delete and initiating a trial. * Removed extraneous Razor tag. --------- Co-authored-by: dgoodman-bw <109169446+dgoodman-bw@users.noreply.github.com> Co-authored-by: Danielle Goodman <dgoodman@bitwarden.com> Co-authored-by: Jacob Fink <jfink@bitwarden.com>
95 lines
3.1 KiB
C#
95 lines
3.1 KiB
C#
using Bit.Admin.Models;
|
|
using Bit.Admin.Utilities;
|
|
using Bit.Core.Settings;
|
|
using Bit.Core.Utilities;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.Azure.Cosmos;
|
|
using Microsoft.Azure.Cosmos.Linq;
|
|
using Serilog.Events;
|
|
|
|
namespace Bit.Admin.Controllers;
|
|
|
|
[Authorize]
|
|
[SelfHosted(NotSelfHostedOnly = true)]
|
|
[RequirePermission(Enums.Permission.Logs_View)]
|
|
public class LogsController : Controller
|
|
{
|
|
private const string Database = "Diagnostics";
|
|
private const string Container = "Logs";
|
|
|
|
private readonly GlobalSettings _globalSettings;
|
|
|
|
public LogsController(GlobalSettings globalSettings)
|
|
{
|
|
_globalSettings = globalSettings;
|
|
}
|
|
|
|
public async Task<IActionResult> Index(string cursor = null, int count = 50,
|
|
LogEventLevel? level = null, string project = null, DateTime? start = null, DateTime? end = null)
|
|
{
|
|
using (var client = new CosmosClient(_globalSettings.DocumentDb.Uri,
|
|
_globalSettings.DocumentDb.Key))
|
|
{
|
|
var cosmosContainer = client.GetContainer(Database, Container);
|
|
var query = cosmosContainer.GetItemLinqQueryable<LogModel>(
|
|
requestOptions: new QueryRequestOptions()
|
|
{
|
|
MaxItemCount = count
|
|
},
|
|
continuationToken: cursor
|
|
).AsQueryable();
|
|
|
|
if (level.HasValue)
|
|
{
|
|
query = query.Where(l => l.Level == level.Value.ToString());
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(project))
|
|
{
|
|
query = query.Where(l => l.Properties != null && l.Properties["Project"] == (object)project);
|
|
}
|
|
if (start.HasValue)
|
|
{
|
|
query = query.Where(l => l.Timestamp >= start.Value);
|
|
}
|
|
if (end.HasValue)
|
|
{
|
|
query = query.Where(l => l.Timestamp <= end.Value);
|
|
}
|
|
var feedIterator = query.OrderByDescending(l => l.Timestamp).ToFeedIterator();
|
|
var response = await feedIterator.ReadNextAsync();
|
|
|
|
return View(new LogsModel
|
|
{
|
|
Level = level,
|
|
Project = project,
|
|
Start = start,
|
|
End = end,
|
|
Items = response.ToList(),
|
|
Count = count,
|
|
Cursor = cursor,
|
|
NextCursor = response.ContinuationToken
|
|
});
|
|
}
|
|
}
|
|
|
|
public async Task<IActionResult> View(Guid id)
|
|
{
|
|
using (var client = new CosmosClient(_globalSettings.DocumentDb.Uri,
|
|
_globalSettings.DocumentDb.Key))
|
|
{
|
|
var cosmosContainer = client.GetContainer(Database, Container);
|
|
var query = cosmosContainer.GetItemLinqQueryable<LogDetailsModel>()
|
|
.AsQueryable()
|
|
.Where(l => l.Id == id.ToString());
|
|
|
|
var response = await query.ToFeedIterator().ReadNextAsync();
|
|
if (response == null || response.Count == 0)
|
|
{
|
|
return RedirectToAction("Index");
|
|
}
|
|
return View(response.First());
|
|
}
|
|
}
|
|
}
|