[PM-8280] email forwarders
đī¸ Tracking
https://bitwarden.atlassian.net/browse/PM-8280
đ Objective
Add forwarder support to credential generator
- Extends the
UserStateSubjectwith classifier & encryptor support- Move generalized rx helpers to common so they can be used by
UserStateSubject - Introduce
ObjectKeyto support encryption to POJOs in state storage
- Move generalized rx helpers to common so they can be used by
- Extend
CredentialGeneratorServicewith forwarder integration support:- Introduce
{ forwarder: IntegrationId }algorithm Id to model service integration - Include forwarder integration metadata in algorithms lists
- Introduce
ForwarderEngineto invoke RPCs in response to generator requests. - Introduce
AlgorithmInfoto model localized credential generation metadata.
- Introduce
- Add forwarder list and generation features to v2 generator components
đ Remaining tasks
- [x] Define forwarder subject keys
- [x] Add encryptor injection to credential generator service
- ~~Use import configuration for settings migration~~ split to PM-13733
- [x] Implement forwarder settings component(s)
- [x] Address TODOs
- [x] Unit test "classified" format support in
UserStateSubject
đĻ System Evolution
Switching to { 'engine': EngineId } for built-in generators could improve cohesion throughout the generator system. It also eliminates confusion between the 'username' category and the { engine: 'username' } engineId.
Promote ObjectKey to a class. Several of the methods in UserStateSubject, particularly those used before classification, properly belong in ObjectKey. ObjectKey should also provide an optional serializer for parity with its deserializer.
đ¸ Screenshots
đĻŽ Reviewer guidelines
- đ (
:+1:) or similar for great changes - đ (
:memo:) or âšī¸ (:information_source:) for notes or general info - â (
:question:) for questions - đ¤ (
:thinking:) or đ (:thought_balloon:) for more open inquiry that's not quite a confirmed issue and could potentially benefit from discussion - đ¨ (
:art:) for suggestions / improvements - â (
:x:) or â ī¸ (:warning:) for more significant problems or concerns needing attention - đą (
:seedling:) or âģī¸ (:recycle:) for future improvements or indications of technical debt - â (
:pick:) for minor or nitpick changes
Codecov Report
Attention: Patch coverage is 70.49689% with 95 lines in your changes missing coverage. Please review.
Project coverage is 33.37%. Comparing base (
c4fcd53) to head (f8310d7). Report is 3 commits behind head on main.
:white_check_mark: All tests successful. No failed tests found.
Additional details and impacted files
@@ Coverage Diff @@
## main #11563 +/- ##
==========================================
+ Coverage 33.30% 33.37% +0.07%
==========================================
Files 2788 2794 +6
Lines 86639 86852 +213
Branches 16527 16560 +33
==========================================
+ Hits 28852 28985 +133
- Misses 55484 55554 +70
- Partials 2303 2313 +10
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
Checkmarx One â Scan Summary & Details â b80aa2d6-0fc9-4c8d-85ba-8bdfcd9136ca
New Issues
| Severity | Issue | Source File / Package | Checkmarx Insight |
|---|---|---|---|
![]() |
Client_Privacy_Violation | /apps/browser/src/vault/popup/components/vault/add-edit.component.ts: 69 | Attack Vector |
![]() |
Client_Privacy_Violation | /apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html: 14 | Attack Vector |
Fixed Issues
| Severity | Issue | Source File / Package |
|---|---|---|
![]() |
Client_Privacy_Violation | /apps/browser/src/vault/popup/components/vault-v2/vault-list-items-container/vault-list-items-container.component.html: 15 |
![]() |
Client_Privacy_Violation | /apps/browser/src/autofill/popup/settings/autofill-v1.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/desktop/src/vault/app/vault/view.component.html: 212 |
![]() |
Client_Privacy_Violation | /apps/desktop/src/vault/app/vault/view.component.html: 209 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.html: 3 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html: 31 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.html: 53 |
![]() |
Client_Privacy_Violation | /apps/browser/src/autofill/popup/settings/autofill-v1.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 101 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /apps/web/src/app/vault/individual-vault/view.component.ts: 76 |
![]() |
Client_Privacy_Violation | /libs/tools/generator/components/src/username-generator.component.html: 3 |
