Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
f7ff5b2
PM-31923 adding the whole report endpoints v2
prograhamming Feb 25, 2026
cffbbe0
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Feb 25, 2026
5ca00bc
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Feb 25, 2026
c98183d
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Feb 26, 2026
24dd095
PM-31923 changing approach to match others in codebase
prograhamming Feb 26, 2026
b2bdd8c
Merge branch 'dirt/PM-31923-whole-report-data-v2-endpoints-access-int…
prograhamming Feb 26, 2026
0020254
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 1, 2026
f5947e2
31923 updating code to now use the ReportFile field
prograhamming Mar 4, 2026
81d53b6
Merge branch 'dirt/PM-31923-whole-report-data-v2-endpoints-access-int…
prograhamming Mar 4, 2026
9fced60
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 4, 2026
d4a3f07
add feature flag for welcome dialog no ext prompt (#7144)
jaasen-livefront Mar 4, 2026
ba8c1a8
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 4, 2026
f12da24
[PM-32249] Allow custom desktop protocol in CORS (#7080)
dani-garcia Mar 4, 2026
48ce27b
Disabling Claude attribution (#7146)
theMickster Mar 4, 2026
2d81562
[PM-33140] Correct Non-Seat Plan Intial Seat Setting for Upgrade (#7140)
sbrown-livefront Mar 4, 2026
8cd48f8
[PM-28531] Remove old proc and use new one (#7110)
voommen-livefront Mar 4, 2026
be34ff2
Update PoliciesController.Put to forward all behavior to VNext (#7130)
sven-bitwarden Mar 4, 2026
b58003c
PM-31923 adding request size attributes
prograhamming Mar 5, 2026
2463e26
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 5, 2026
2abe9b1
[deps]: Update actions/checkout action to v6.0.2 (#6904)
renovate[bot] Mar 5, 2026
7c6d506
Return WebAuthn credential record in create response (#7145)
iinuwa Mar 5, 2026
05ce54d
[PM-32594] Add authorization to admin-initiated sponsorship endpoints…
cturnbull-bitwarden Mar 5, 2026
2783f20
[PM-28519] Remove Emergency Access Contacts for AutoConfirm Org Flows…
sven-bitwarden Mar 5, 2026
76b702b
Add coupon support to invoice preview and subscription creation (#6994)
cyprain-okeke Mar 5, 2026
185a359
[PM-21925] Add MasterPasswordSalt Column to User Table (#6950)
ike-kottlowski Mar 5, 2026
c94cb46
PM-31923 fixing all the endpoints
prograhamming Mar 5, 2026
fa9e06e
PM-31923 remove claude change
prograhamming Mar 5, 2026
b73d339
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 5, 2026
cac69fb
PM-31923 fixing feature flag name
prograhamming Mar 5, 2026
1304ef2
Merge branch 'dirt/PM-31923-whole-report-data-v2-endpoints-access-int…
prograhamming Mar 5, 2026
a35ff69
PM-21720 - RegisterFinishResponseModel - clean up deprecated CaptchaB…
JaredSnider-Bitwarden Mar 5, 2026
0cc149d
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 5, 2026
3e518ef
chore(deps): Add Renovate ownership of MessagePack pinned transitive …
trmartin4 Mar 5, 2026
3e72e93
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 5, 2026
b60835f
PM-31923 fixing path traversal vuln and cleaned up null references
prograhamming Mar 6, 2026
de3ea38
PM-31923 fixing unit test
prograhamming Mar 6, 2026
d89cd8d
PM-31923 fixing issues found by reviewer
prograhamming Mar 6, 2026
fae1faa
PM-31923 addressing pr comments
prograhamming Mar 6, 2026
437f212
[PM-33219] Resolve silent auth removal on Sends (#7160)
harr1424 Mar 6, 2026
35aec44
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 6, 2026
36476bb
PM-31923 fixing issues based on review
prograhamming Mar 6, 2026
309f347
PM-31923 removing settings.json
prograhamming Mar 6, 2026
36c1696
Bumped version to 2026.3.0
actions-user Mar 9, 2026
0c37138
[PM-33091] Add optional Targeting Rules data resource configuration (…
jprusik Mar 9, 2026
ef96d03
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 9, 2026
c29927f
fix(feature-flag): [PM-27085] Account Register Uses New Data Types - …
Patrick-Pimentel-Bitwarden Mar 9, 2026
1f5c359
PM-31923 fixing unit tests
prograhamming Mar 9, 2026
3ff0b09
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 9, 2026
b16061c
Auth/PM-32416 - Add MultiClientPasswordManagement feature flag (#7169)
JaredSnider-Bitwarden Mar 9, 2026
e6e1785
chore(flags): [PM-32554] Remove pm-24579-prevent-sso-on-existing-non-…
trmartin4 Mar 9, 2026
f4c8ef4
[PM-25860] Rid of bulk delete error (#6925)
JaredScar Mar 9, 2026
2d4f3e0
[deps]: Update MarkDig to 0.45.0 (#7117)
renovate[bot] Mar 9, 2026
cc3759b
[PM-18236] - Use Single Org Requirement (#6999)
jrmccannon Mar 9, 2026
32e7ead
Auth/PM-32487 - Emergency Access - invite or update - require min val…
JaredSnider-Bitwarden Mar 9, 2026
f4af07d
Auth/PM-32821 - Finish cleaning up old registration endpoint (#7097)
JaredSnider-Bitwarden Mar 9, 2026
d69638f
Revert "Revert "refactor(IdentityTokenResponse): [Auth/PM-3287] Remov…
JaredSnider-Bitwarden Mar 9, 2026
0ea6e6f
[PM-32424] Send Access Enumeration protection (#7166)
ike-kottlowski Mar 9, 2026
8b527a0
[PM-27864] Add PQC TLS Support (#6547)
Warfields Mar 9, 2026
ded06cd
[PM-33061] Tax Id Should Be Added When Upgrading to Teams or Enterpri…
sbrown-livefront Mar 9, 2026
679de60
[PM-32581] Refactor organization subscription update process (#7132)
amorask-bitwarden Mar 9, 2026
6231dd2
remove flagged logic (#7179)
BTreston Mar 9, 2026
26a4a5d
Update UseMyItems to use dedicated plan feature (#7101)
eliykat Mar 9, 2026
a407296
Reorganize seeder presets into purpose-based folders and remove obsol…
theMickster Mar 10, 2026
f5ca678
PM-31923 fixing architecture to make it clean
prograhamming Mar 10, 2026
893d061
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 10, 2026
93f2dab
PM-31923 adding XML docs to controllers
prograhamming Mar 10, 2026
8bb25fa
Merge branch 'dirt/PM-31923-whole-report-data-v2-endpoints-access-int…
prograhamming Mar 10, 2026
3b41713
Existing device scene (#7155)
MGibson1 Mar 10, 2026
ca50a40
[deps]: Update MarkDig to v1 (#7120)
renovate[bot] Mar 10, 2026
4f88493
remove feature flag (#7180)
BTreston Mar 10, 2026
c8413e8
[PM-32666] Fixes endpoint issue where you can update another by provi…
JaredScar Mar 10, 2026
da9e4cc
fix(OrganizationsController): Remove unused GetPlanType method to str…
JaredScar Mar 10, 2026
69fc270
added pm-31697-premium-upgrade-path feature flag (#7162)
mpbw2 Mar 10, 2026
451ca9b
Seeder - Adding density distributions (#7191)
theMickster Mar 10, 2026
5794c3c
chore(flags): Remove pm-19394-send-access-control feature flag
trmartin4 Mar 10, 2026
222d938
[deps] Billing: Update coverlet.collector to v8 (#7118)
renovate[bot] Mar 10, 2026
27a772e
[PM-32597] - create short-lived signed attachment URL for self-hosted…
jaasen-livefront Mar 10, 2026
5f19538
[PM-30584] Add support for key-connector-migration setting key (#7136)
quexten Mar 11, 2026
d8592f4
[PM-33040] Add new interface methods to IApplicationCacheService (#7187)
JimmyVo16 Mar 11, 2026
7d5ff28
Refactor email confirmation logic to remove legacy mail service usage…
JaredScar Mar 11, 2026
01059fd
Fixes swagger authentication (#7197)
sven-bitwarden Mar 11, 2026
18956c9
Add 9 scale presets and consolidated seeder docs (#7193)
theMickster Mar 11, 2026
642bdf0
PM-31923 updated property names for metrics
voommen-livefront Mar 11, 2026
829e2e1
Restrict users from sending altered project name/value and it being s…
cd-bitwarden Mar 11, 2026
fec7ac9
chore(flags): Remove obsolete client flags
trmartin4 Mar 11, 2026
6aa0112
Add density profiles to Seeder CLI (#7205)
theMickster Mar 12, 2026
31fe66e
feat(emergency-access): [PM-29585] Prevent New EA Invitations or Acce…
Patrick-Pimentel-Bitwarden Mar 12, 2026
95fc7d8
[PM-31820] added a null check to the id/partial route (#7066)
Jingo88 Mar 12, 2026
3532a92
PM-31923 removed the file size validation check
voommen-livefront Mar 12, 2026
986f638
Fixed invalid syntax in OrganizationUser_UpdateMany (#6923)
mkincaid-bw Mar 12, 2026
3ecd15b
[PM-32665] Fix Cross-Organization IDOR in Bulk User Revoke (#7206)
JimmyVo16 Mar 13, 2026
d29fcff
Decouple seeder cipher encryption from internal vault crates (#7211)
theMickster Mar 13, 2026
2e3c71f
[deps] BRE: Update mariadb Docker tag to v12 (#7119)
renovate[bot] Mar 13, 2026
6d2acaf
[PM-19143] Refactor public API MembersController POST to use CommandR…
r-tome Mar 13, 2026
cc12eca
[PM-31657] Address Overwriting Attachments (#7053)
nick-livefront Mar 13, 2026
6c27487
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 13, 2026
f448cc1
SHOT-71: Migrate self-host ownership over to SHOT (#7213)
mimartin12 Mar 13, 2026
ced94d5
create new dockerfile for SeederApi (#7072)
AmyLGalles Mar 13, 2026
5bc720b
introduce feature flag pm-31885-send-controls (#7134)
harr1424 Mar 13, 2026
869ee0f
chore(flags:): [PM-30245] Remove locked and inactive notifications fe…
trmartin4 Mar 14, 2026
2412e74
pin image to sha (#7215)
aj-bw Mar 16, 2026
96792af
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 16, 2026
86e5e12
PM-33591 - Parallelize CreateUsersStep and GeneratePersonalCiphersSte…
theMickster Mar 16, 2026
5c7184a
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 16, 2026
276a218
[PM-31923] Remove Unused Sprocs (#7060)
sven-bitwarden Mar 16, 2026
2a9c5d6
Merge branch 'main' into dirt/PM-31923-whole-report-data-v2-endpoints…
prograhamming Mar 16, 2026
24d9065
PM-31923 fixing fileData validation check
prograhamming Mar 16, 2026
91c7972
Merge branch 'main' into dirt/pm-31923-whole-report-data-v2-endpoints…
prograhamming Mar 16, 2026
80e7aea
Merge branch 'main' into dirt/pm-31923-whole-report-data-v2-endpoints…
prograhamming Mar 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
524 changes: 399 additions & 125 deletions src/Api/Dirt/Controllers/OrganizationReportsController.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Text.Json.Serialization;
using Bit.Core.Dirt.Reports.ReportFeatures.Requests;

namespace Bit.Api.Dirt.Models.Request;

public class AddOrganizationReportRequestModel
{
public string? ReportData { get; set; }
public string? ContentEncryptionKey { get; set; }
public string? SummaryData { get; set; }
public string? ApplicationData { get; set; }
[JsonPropertyName("metrics")]
public OrganizationReportMetrics? ReportMetrics { get; set; }
public long? FileSize { get; set; }

public AddOrganizationReportRequest ToData(Guid organizationId)
{
return new AddOrganizationReportRequest
{
OrganizationId = organizationId,
ReportData = ReportData,
ContentEncryptionKey = ContentEncryptionKey,
SummaryData = SummaryData,
ApplicationData = ApplicationData,
ReportMetrics = ReportMetrics,
FileSize = FileSize
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using Bit.Core.Dirt.Reports.ReportFeatures.Requests;

namespace Bit.Api.Dirt.Models.Request;

public class UpdateOrganizationReportApplicationDataRequestModel
{
public string? ApplicationData { get; set; }

public UpdateOrganizationReportApplicationDataRequest ToData(Guid organizationId, Guid reportId)
{
return new UpdateOrganizationReportApplicationDataRequest
{
OrganizationId = organizationId,
Id = reportId,
ApplicationData = ApplicationData
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using Bit.Core.Dirt.Reports.ReportFeatures.Requests;

namespace Bit.Api.Dirt.Models.Request;

public class UpdateOrganizationReportDataRequestModel
{
public string? ReportData { get; set; }

public UpdateOrganizationReportDataRequest ToData(Guid organizationId, Guid reportId)
{
return new UpdateOrganizationReportDataRequest
{
OrganizationId = organizationId,
ReportId = reportId,
ReportData = ReportData
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System.Text.Json.Serialization;
using Bit.Core.Dirt.Reports.ReportFeatures.Requests;

namespace Bit.Api.Dirt.Models.Request;

public class UpdateOrganizationReportSummaryRequestModel
{
public string? SummaryData { get; set; }
[JsonPropertyName("metrics")]
public OrganizationReportMetrics? ReportMetrics { get; set; }

public UpdateOrganizationReportSummaryRequest ToData(Guid organizationId, Guid reportId)
{
return new UpdateOrganizationReportSummaryRequest
{
OrganizationId = organizationId,
ReportId = reportId,
SummaryData = SummaryData,
ReportMetrics = ReportMetrics
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Bit.Core.Dirt.Reports.ReportFeatures.Requests;

namespace Bit.Api.Dirt.Models.Request;

public class UpdateOrganizationReportV2RequestModel
{
public string? ReportData { get; set; }
public string? ContentEncryptionKey { get; set; }
public string? SummaryData { get; set; }
public string? ApplicationData { get; set; }
public OrganizationReportMetrics? ReportMetrics { get; set; }
public bool RequiresNewFileUpload { get; set; }
public long? FileSize { get; set; }

public UpdateOrganizationReportV2Request ToData(Guid organizationId, Guid reportId)
{
return new UpdateOrganizationReportV2Request
{
OrganizationId = organizationId,
ReportId = reportId,
ReportData = ReportData,
ContentEncryptionKey = ContentEncryptionKey,
SummaryData = SummaryData,
ApplicationData = ApplicationData,
ReportMetrics = ReportMetrics,
RequiresNewFileUpload = RequiresNewFileUpload,
FileSize = FileSize
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Bit.Core.Dirt.Models.Data;

namespace Bit.Api.Dirt.Models.Response;

public class OrganizationReportApplicationDataResponseModel
{
public OrganizationReportApplicationDataResponseModel(OrganizationReportApplicationDataResponse applicationDataResponse)
{
ApplicationData = applicationDataResponse.ApplicationData;
}

public string? ApplicationData { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Bit.Core.Dirt.Models.Data;

namespace Bit.Api.Dirt.Models.Response;

public class OrganizationReportDataResponseModel
{
public OrganizationReportDataResponseModel(OrganizationReportDataResponse reportDataResponse)
{
ReportData = reportDataResponse.ReportData;
}

public string? ReportData { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Bit.Core.Enums;

namespace Bit.Api.Dirt.Models.Response;

public class OrganizationReportFileResponseModel
{
public OrganizationReportFileResponseModel() { }

public string ReportFileUploadUrl { get; set; } = string.Empty;
public OrganizationReportResponseModel ReportResponse { get; set; } = null!;
public FileUploadType FileUploadType { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Bit.Core.Dirt.Entities;
using Bit.Core.Dirt.Models.Data;

namespace Bit.Api.Dirt.Models.Response;

Expand All @@ -10,11 +11,10 @@ public class OrganizationReportResponseModel
public string? ContentEncryptionKey { get; set; }
public string? SummaryData { get; set; }
public string? ApplicationData { get; set; }
public int? PasswordCount { get; set; }
public int? PasswordAtRiskCount { get; set; }
public int? MemberCount { get; set; }
public DateTime? CreationDate { get; set; } = null;
public DateTime? RevisionDate { get; set; } = null;
public ReportFile? ReportFile { get; set; }
public string? ReportFileDownloadUrl { get; set; }
public DateTime? CreationDate { get; set; }
public DateTime? RevisionDate { get; set; }

public OrganizationReportResponseModel(OrganizationReport organizationReport)
{
Expand All @@ -29,9 +29,7 @@ public OrganizationReportResponseModel(OrganizationReport organizationReport)
ContentEncryptionKey = organizationReport.ContentEncryptionKey;
SummaryData = organizationReport.SummaryData;
ApplicationData = organizationReport.ApplicationData;
PasswordCount = organizationReport.PasswordCount;
PasswordAtRiskCount = organizationReport.PasswordAtRiskCount;
MemberCount = organizationReport.MemberCount;
ReportFile = organizationReport.GetReportFile();
CreationDate = organizationReport.CreationDate;
RevisionDate = organizationReport.RevisionDate;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System.Text.Json.Serialization;
using Bit.Core.Dirt.Models.Data;

namespace Bit.Api.Dirt.Models.Response;

public class OrganizationReportSummaryDataResponseModel
{
public OrganizationReportSummaryDataResponseModel(OrganizationReportSummaryDataResponse summaryDataResponse)
{
EncryptedData = summaryDataResponse.SummaryData;
EncryptionKey = summaryDataResponse.ContentEncryptionKey;
Date = summaryDataResponse.RevisionDate;
}

[JsonPropertyName("encryptedData")]
public string EncryptedData { get; set; }

[JsonPropertyName("encryptionKey")]
public string EncryptionKey { get; set; }

[JsonPropertyName("date")]
public DateTime Date { get; set; }
}

This file was deleted.

1 change: 1 addition & 0 deletions src/Core/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ public static class FeatureFlagKeys
public const string ArchiveVaultItems = "pm-19148-innovation-archive";

/* DIRT Team */
public const string AccessIntelligenceVersion2 = "pm-31920-access-intelligence-azure-file-storage";
public const string EventManagementForDataDogAndCrowdStrike = "event-management-for-datadog-and-crowdstrike";
public const string EventDiagnosticLogging = "pm-27666-siem-event-log-debugging";
public const string EventManagementForHuntress = "event-management-for-huntress";
Expand Down
19 changes: 17 additions & 2 deletions src/Core/Dirt/Entities/OrganizationReport.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#nullable enable

using System.Text.Json;
using Bit.Core.Dirt.Models.Data;
using Bit.Core.Entities;
using Bit.Core.Utilities;

Expand Down Expand Up @@ -29,6 +29,21 @@ public class OrganizationReport : ITableObject<Guid>
public int? CriticalPasswordAtRiskCount { get; set; }
public string? ReportFile { get; set; }

public ReportFile? GetReportFile()
{
if (string.IsNullOrWhiteSpace(ReportFile))
{
return null;
}

return JsonSerializer.Deserialize<ReportFile>(ReportFile);
}

public void SetReportFile(ReportFile data)
{
ReportFile = JsonSerializer.Serialize(data, JsonHelpers.IgnoreWritingNull);
}

public void SetNewId()
{
Id = CoreHelpers.GenerateComb();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class OrganizationReportMetricsData
public int? CriticalPasswordCount { get; set; }
public int? CriticalPasswordAtRiskCount { get; set; }

public static OrganizationReportMetricsData From(Guid organizationId, OrganizationReportMetricsRequest? request)
public static OrganizationReportMetricsData From(Guid organizationId, OrganizationReportMetrics? request)
{
if (request == null)
{
Expand Down
6 changes: 2 additions & 4 deletions src/Core/Dirt/Models/Data/ReportFile.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
#nullable enable

using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json.Serialization;
using static System.Text.Json.Serialization.JsonNumberHandling;

Expand Down Expand Up @@ -28,5 +26,5 @@ public class ReportFile
/// <summary>
/// When true the uploaded file's length has been validated.
/// </summary>
public bool Validated { get; set; } = true;
public bool Validated { get; set; } = false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public async Task<OrganizationReport> AddOrganizationReportAsync(AddOrganization
throw new BadRequestException(errorMessage);
}

var requestMetrics = request.Metrics ?? new OrganizationReportMetricsRequest();
var requestMetrics = request.ReportMetrics ?? new OrganizationReportMetrics();

var organizationReport = new OrganizationReport
{
Expand Down
Loading
Loading