Merge branch 'main' into 8702-refreshing-organization-report-page-displays-reports-list

This commit is contained in:
Thomas Rittson 2024-04-18 13:24:28 +10:00 committed by GitHub
commit 7a3ed89fcb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
274 changed files with 20303 additions and 1786 deletions

View File

@ -160,9 +160,9 @@ jobs:
run: npm run dist run: npm run dist
working-directory: browser-source/apps/browser working-directory: browser-source/apps/browser
# - name: Build Manifest v3 - name: Build Manifest v3
# run: npm run dist:mv3 run: npm run dist:mv3
# working-directory: browser-source/apps/browser working-directory: browser-source/apps/browser
- name: Gulp - name: Gulp
run: gulp ci run: gulp ci
@ -189,12 +189,12 @@ jobs:
path: browser-source/apps/browser/dist/dist-chrome.zip path: browser-source/apps/browser/dist/dist-chrome.zip
if-no-files-found: error if-no-files-found: error
# - name: Upload Chrome MV3 artifact - name: Upload Chrome MV3 artifact (DO NOT USE FOR PROD)
# uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
# with: with:
# name: dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip name: DO-NOT-USE-FOR-PROD-dist-chrome-MV3-${{ env._BUILD_NUMBER }}.zip
# path: browser-source/apps/browser/dist/dist-chrome-mv3.zip path: browser-source/apps/browser/dist/dist-chrome-mv3.zip
# if-no-files-found: error if-no-files-found: error
- name: Upload Firefox artifact - name: Upload Firefox artifact
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Parol silindi" "message": "Parol silindi"
},
"unassignedItemsBanner": {
"message": "Bildiriş: Təyin edilməmiş təşkilat elementləri artıq Bütün Anbarlar görünüşündə görünməyəndir və yalnız Admin Konsolu vasitəsilə əlçatandır. Bu elementləri görünən etmək üçün Admin Konsolundan bir kolleksiyaya təyin edin."
},
"unassignedItemsBannerSelfHost": {
"message": "Bildiriş: 2 May 2024-cü ildən etibarən təyin edilməmiş təşkilat elementləri artıq Bütün Anbarlar görünüşündə görünməyən və yalnız Admin Konsolu vasitəsilə əlçatan olacaq. Bu elementləri görünən etmək üçün Admin Konsolundan bir kolleksiyaya təyin edin."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Секретният ключ е премахнат" "message": "Секретният ключ е премахнат"
},
"unassignedItemsBanner": {
"message": "Известие: неразпределените елементи на организацията вече не се виждат в изгледа с „Всички трезори“, а са достъпни само през Административната конзола. Добавете тези елементи към някоя колекция в Административната конзола, за да станат видими."
},
"unassignedItemsBannerSelfHost": {
"message": "Известие: от 2 май 2024г. неразпределените елементи на организациите вече няма се виждат в изгледа с „Всички трезори“, а ще бъдат достъпни само през Административната конзола. Добавете тези елементи към някоя колекция в Административната конзола, за да станат видими."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3001,9 +3001,15 @@
"description": "Notification message for when saving credentials has failed." "description": "Notification message for when saving credentials has failed."
}, },
"removePasskey": { "removePasskey": {
"message": "Remove passkey" "message": "Suprimeix la clau de pas"
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Clau de pas suprimida"
},
"unassignedItemsBanner": {
"message": "Nota: els elements de l'organització sense assignar ja no es veuran a la vista \"Totes les caixes fortes\" i només es veuran des de la consola d'administració. Assigneu-los-hi una col·lecció des de la consola per fer-los visibles."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Přístupový klíč byl odebrán" "message": "Přístupový klíč byl odebrán"
},
"unassignedItemsBanner": {
"message": "Upozornění: Nepřiřazené položky organizace již nejsou viditelné ve Vašem zobrazení všech trezorů a jsou nyní přístupné jen v konzoli správce. Přiřaďte tyto položky do kolekce z konzole pro správce, aby byly viditelné."
},
"unassignedItemsBannerSelfHost": {
"message": "Upozornění: Dne 2. května 2024 již nebudou nepřiřazené položky organizace viditelné v zobrazení Všechny trezory a budou přístupné jen prostřednictvím konzoly správce. Přiřaďte tyto položky do kolekce z konzoly pro správce, aby byly viditelné."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Adgangsnøgle fjernet" "message": "Adgangsnøgle fjernet"
},
"unassignedItemsBanner": {
"message": "Bemærk: Utildelte organisationsemner er ikke længere synlige i Alle Bokse-visningen og er kun tilgængelige via Adminkonsollen. Føj disse emner til en samling fra Adminkonsollen for at gøre dem synlige."
},
"unassignedItemsBannerSelfHost": {
"message": "Bemærk: Pr. 2. maj 2024 vil utildelte organisationsemner ikke længere være synlige i Alle Bokse-visningen og vil kun være tilgængelige via Admin-konsollen. Tildel disse emner til en samling via Admin-konsollen for at gøre dem synlige."
} }
} }

View File

@ -2706,7 +2706,7 @@
"message": "Für dein Konto ist die Duo Zwei-Faktor-Authentifizierung erforderlich." "message": "Für dein Konto ist die Duo Zwei-Faktor-Authentifizierung erforderlich."
}, },
"popoutTheExtensionToCompleteLogin": { "popoutTheExtensionToCompleteLogin": {
"message": "Popout the extension to complete login." "message": "Koppel die Erweiterung ab, um die Anmeldung abzuschließen."
}, },
"popoutExtension": { "popoutExtension": {
"message": "Popout-Erweiterung" "message": "Popout-Erweiterung"
@ -3001,9 +3001,15 @@
"description": "Notification message for when saving credentials has failed." "description": "Notification message for when saving credentials has failed."
}, },
"removePasskey": { "removePasskey": {
"message": "Passkey löschen" "message": "Passkey entfernen"
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey gelöscht" "message": "Passkey entfernt"
},
"unassignedItemsBanner": {
"message": "Hinweis: Nicht zugeordnete Organisationseinträge sind nicht mehr in der Ansicht aller Tresore sichtbar und nur über die Administrator-Konsole zugänglich. Weise diese Einträge einer Sammlung aus der Administrator-Konsole zu, um sie sichtbar zu machen."
},
"unassignedItemsBannerSelfHost": {
"message": "Hinweis: Ab dem 2. Mai 2024 werden nicht zugewiesene Organisationseinträge nicht mehr in der Ansicht aller Tresore sichtbar sein und sind nur über die Administrator-Konsole zugänglich. Weise diese Elemente einer Sammlung aus der Administrator-Konsole zu, um sie sichtbar zu machen."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -172,6 +172,12 @@
"changeMasterPassword": { "changeMasterPassword": {
"message": "Change master password" "message": "Change master password"
}, },
"continueToWebApp": {
"message": "Continue to web app?"
},
"changeMasterPasswordOnWebConfirmation": {
"message": "You can change your master password on the Bitwarden web app."
},
"fingerprintPhrase": { "fingerprintPhrase": {
"message": "Fingerprint phrase", "message": "Fingerprint phrase",
"description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing." "description": "A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing."
@ -557,12 +563,6 @@
"addedFolder": { "addedFolder": {
"message": "Folder added" "message": "Folder added"
}, },
"changeMasterPass": {
"message": "Change master password"
},
"changeMasterPasswordConfirmation": {
"message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?"
},
"twoStepLoginConfirmation": { "twoStepLoginConfirmation": {
"message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?" "message": "Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be set up on the bitwarden.com web vault. Do you want to visit the website now?"
}, },
@ -3006,7 +3006,27 @@
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
}, },
"unassignedItemsBanner": { "unassignedItemsBannerNotice": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible." "message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console."
},
"unassignedItemsBannerSelfHostNotice": {
"message": "Notice: On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console."
},
"unassignedItemsBannerCTAPartOne": {
"message": "Assign these items to a collection from the",
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerCTAPartTwo": {
"message": "to make them visible.",
"description": "This will be part of a larger sentence, which will read like so: Assign these items to a collection from the Admin Console to make them visible."
},
"adminConsole": {
"message": "Admin Console"
},
"errorAssigningTargetCollection": {
"message": "Error assigning target collection."
},
"errorAssigningTargetFolder": {
"message": "Error assigning target folder."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organisation items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organisation items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3001,9 +3001,15 @@
"description": "Notification message for when saving credentials has failed." "description": "Notification message for when saving credentials has failed."
}, },
"removePasskey": { "removePasskey": {
"message": "Remove passkey" "message": "Eemalda pääsuvõti"
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Pääsuvõti on eemaldatud"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Suojausavain poistettiin" "message": "Suojausavain poistettiin"
},
"unassignedItemsBanner": {
"message": "Huomautus: Organisaatioiden kokoelmiin määrittämättömät kohteet eivät enää näy laitteiden \"Kaikki holvit\" -näkymissä, vaan ne ovat nähtävissä vain Hallintapaneelista. Määritä kohteet kokoelmiin Hallintapaneelista, jotta ne ovat jatkossakin käytettävissä kaikilta laitteilta."
},
"unassignedItemsBannerSelfHost": {
"message": "Huomautus: 2.5.2024 alkaen kokoelmiin määrittämättömät organisaatioiden kohteet eivät enää näy laitteiden \"Kaikki holvit\" -näkymissä, vaan ne ovat nähtävissä vain Hallintapaneelista. Määritä kohteet kokoelmiin Hallintapaneelista, jotta ne ovat jatkossakin käytettävissä kaikilta laitteilta."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Clé d'identification (passkey) retirée" "message": "Clé d'identification (passkey) retirée"
},
"unassignedItemsBanner": {
"message": "Notice : les éléments d'organisation non assignés ne sont plus visibles dans la vue Tous les coffres et sont uniquement accessibles via la console d'administration. Assignez ces éléments à une collection à partir de la console d'administration pour les rendre visibles."
},
"unassignedItemsBannerSelfHost": {
"message": "Remarque : au 2 mai 2024, les éléments d'organisation non assignés ne sont plus visibles dans votre vue Tous les coffres sur tous les appareils et sont uniquement accessibles via la Console d'administration. Assignez ces éléments à une collection à partir de la Console d'administration pour les rendre visibles."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "A jelszó eltávolításra került." "message": "A jelszó eltávolításra került."
},
"unassignedItemsBanner": {
"message": "Megjegyzés: A nem hozzá nem rendelt szervezeti elemek már nem láthatók az Összes széf nézetben és csak az Adminisztrátori konzolon keresztül érhetők el. Rendeljük ezeket az elemeket egy gyűjteményhez az Adminisztrátor konzolból, hogy láthatóvá tegyük azokat."
},
"unassignedItemsBannerSelfHost": {
"message": "Figyelmeztetés: 2024. május 2-án a nem hozzá rendelt szervezeti elemek többé nem lesznek láthatók az Összes széf nézetben a különböző eszközökön és csak a Felügyeleti konzolon keresztül lesznek elérhetők. Rendeljük ezeket az elemeket egy gyűjteményhez az Adminisztrátori konzolból, hogy láthatóvá tegyük azokat."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey rimossa" "message": "Passkey rimossa"
},
"unassignedItemsBanner": {
"message": "Avviso: gli elementi dell'organizzazione non assegnati non sono più visibili nella visualizzazione Tutte le Cassaforti su tutti i dispositivi e sono ora accessibili solo tramite la Console di amministrazione. Assegna questi elementi ad una raccolta dalla Console di amministrazione per renderli visibili."
},
"unassignedItemsBannerSelfHost": {
"message": "Avviso: dal 2 maggio 2024, gli elementi dell'organizzazione non assegnati non saranno più visibili nella visualizzazione Tutte le Cassaforti su tutti i dispositivi e saranno accessibili solo tramite la Console di amministrazione. Assegna questi elementi ad una raccolta dalla Console di amministrazione per renderli visibili."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "パスキーを削除しました" "message": "パスキーを削除しました"
},
"unassignedItemsBanner": {
"message": "注意: 割り当てられていない組織項目は、すべての保管庫のビューでは表示されなくなり、管理コンソールからのみアクセスできます。 管理コンソールからコレクションにこれらのアイテムを割り当てると、表示するようにできます。"
},
"unassignedItemsBannerSelfHost": {
"message": "お知らせ2024年5月2日に、 割り当てられていない組織アイテムはデバイス間のすべての保管庫ビューに表示されなくなり、管理コンソールからのみアクセス可能になります。 管理コンソールからコレクションにこれらのアイテムを割り当てると、表示できるようになります。"
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Pašalintas slaptaraktis" "message": "Pašalintas slaptaraktis"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Piekļuves atslēga noņemta" "message": "Piekļuves atslēga noņemta"
},
"unassignedItemsBanner": {
"message": "Jāņem vērā: nepiešķirti apvienības vienumi vairs nav redzami skatā \"Visas glabātavas\" un ir sasniedzami tikai no pārvaldības konsoles, kur šie vienumi jāpiešķir krājumam, lai padarītu tos redzamus."
},
"unassignedItemsBannerSelfHost": {
"message": "Jāņem vērā: 2024. gada 2. maijā nepiešķirti apvienības vienumi vairs nebūs redzami skatā \"Visas glabātavas\" un būs sasniedzami tikai no pārvaldības konsoles, kur šie vienumi jāpiešķir krājumam, lai padarītu tos redzamus."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey verwijderd" "message": "Passkey verwijderd"
},
"unassignedItemsBanner": {
"message": "Let op: Niet-toegewezen organisatie-items zijn niet langer zichtbaar in de weergave van alle kluisjes en zijn alleen toegankelijk via de Admin Console. Om deze items zichtbaar te maken, moet je ze toewijzen aan een collectie via de Admin Console."
},
"unassignedItemsBannerSelfHost": {
"message": "Kennisgeving: Vanaf 2 mei 2024 zijn niet-toegewezen organisatie-items op geen enkel apparaat meer zichtbaar in de weergave van alle kluisjes en alleen toegankelijk via de Admin Console. Je kunt deze items in het Admin Console aan een collectie toewijzen om ze zichtbaar te maken."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey został usunięty" "message": "Passkey został usunięty"
},
"unassignedItemsBanner": {
"message": "Uwaga: Nieprzypisane elementy w organizacji nie są już widoczne w widoku Wszystkie sejfy i są dostępne tylko przez Konsolę Administracyjną. Przypisz te elementy do kolekcji z konsoli administracyjnej, aby były one widoczne."
},
"unassignedItemsBannerSelfHost": {
"message": "Uwaga: 2 maja 2024 r. nieprzypisane elementy w organizacji nie będą już widoczne w widoku Wszystkie sejfy i będą dostępne tylko przez Konsolę Administracyjną. Przypisz te elementy do kolekcji z konsoli administracyjnej, aby były one widoczne."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Chave de acesso removida" "message": "Chave de acesso removida"
},
"unassignedItemsBanner": {
"message": "Aviso: Os itens da organização não atribuídos já não são visíveis na vista Todos os cofres e só são acessíveis através da consola de administração. Atribua estes itens a uma coleção a partir da Consola de administração para os tornar visíveis."
},
"unassignedItemsBannerSelfHost": {
"message": "Aviso: A 2 de maio de 2024, os itens da organização não atribuídos deixarão de ser visíveis na vista Todos os cofres e só estarão acessíveis através da Consola de administração. Atribua estes itens a uma coleção a partir da Consola de administração para os tornar visíveis."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -688,10 +688,10 @@
"message": "Запрос на обновление пароля логина при обнаружении изменений на сайте. Применяется ко всем авторизованным аккаунтам." "message": "Запрос на обновление пароля логина при обнаружении изменений на сайте. Применяется ко всем авторизованным аккаунтам."
}, },
"enableUsePasskeys": { "enableUsePasskeys": {
"message": "Запрос на сохранение и использование ключей доступа" "message": "Запрос на сохранение и использование passkey"
}, },
"usePasskeysDesc": { "usePasskeysDesc": {
"message": "Запрос на сохранение новых ключей или в авторизация с ключами, хранящимися в вашем хранилище. Применяется ко всем авторизованным аккаунтам." "message": "Запрос на сохранение новых passkey или в авторизация с passkey, хранящимися в вашем хранилище. Применяется ко всем авторизованным аккаунтам."
}, },
"notificationChangeDesc": { "notificationChangeDesc": {
"message": "Обновить этот пароль в Bitwarden?" "message": "Обновить этот пароль в Bitwarden?"
@ -2786,25 +2786,25 @@
"message": "Подтвердите пароль к файлу" "message": "Подтвердите пароль к файлу"
}, },
"typePasskey": { "typePasskey": {
"message": "Ключ доступа" "message": "Passkey"
}, },
"passkeyNotCopied": { "passkeyNotCopied": {
"message": "Ключ доступа не будет скопирован" "message": "Passkey не будет скопирован"
}, },
"passkeyNotCopiedAlert": { "passkeyNotCopiedAlert": {
"message": "Ключ доступа не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" "message": "Passkey не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?"
}, },
"passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": { "passkeyFeatureIsNotImplementedForAccountsWithoutMasterPassword": {
"message": "Необходима верификация со стороны инициирующего сайта. Для аккаунтов без мастер-пароля эта возможность пока не реализована." "message": "Необходима верификация со стороны инициирующего сайта. Для аккаунтов без мастер-пароля эта возможность пока не реализована."
}, },
"logInWithPasskey": { "logInWithPasskey": {
"message": "Войти с ключом доступа?" "message": "Войти с passkey?"
}, },
"passkeyAlreadyExists": { "passkeyAlreadyExists": {
"message": "Для данного приложения уже существует ключ доступа." "message": "Для данного приложения уже существует passkey."
}, },
"noPasskeysFoundForThisApplication": { "noPasskeysFoundForThisApplication": {
"message": "Для данного приложения ключей доступа не найдено." "message": "Для данного приложения не найден passkey."
}, },
"noMatchingPasskeyLogin": { "noMatchingPasskeyLogin": {
"message": "У вас нет подходящего логина для этого сайта." "message": "У вас нет подходящего логина для этого сайта."
@ -2813,28 +2813,28 @@
"message": "Подтвердить" "message": "Подтвердить"
}, },
"savePasskey": { "savePasskey": {
"message": "Сохранить ключ доступа" "message": "Сохранить passkey"
}, },
"savePasskeyNewLogin": { "savePasskeyNewLogin": {
"message": "Сохранить ключ доступа как новый логин" "message": "Сохранить passkey как новый логин"
}, },
"choosePasskey": { "choosePasskey": {
"message": "Выберите логин, для которого будет сохранен данный ключ доступа" "message": "Выберите логин, для которого будет сохранен данный passkey"
}, },
"passkeyItem": { "passkeyItem": {
"message": "Ключ доступа элемента" "message": "Элемент passkey"
}, },
"overwritePasskey": { "overwritePasskey": {
"message": "Перезаписать ключ доступа?" "message": "Перезаписать passkey?"
}, },
"overwritePasskeyAlert": { "overwritePasskeyAlert": {
"message": "Этот элемент уже содержит ключ доступа. Вы уверены, что хотите перезаписать текущий ключ?" "message": "Этот элемент уже содержит passkey. Вы уверены, что хотите перезаписать текущий passkey?"
}, },
"featureNotSupported": { "featureNotSupported": {
"message": "Функция пока не поддерживается" "message": "Функция пока не поддерживается"
}, },
"yourPasskeyIsLocked": { "yourPasskeyIsLocked": {
"message": "Для использования ключа доступа необходима аутентификация. Для продолжения работы подтвердите свою личность." "message": "Для использования passkey необходима аутентификация. Для продолжения работы подтвердите свою личность."
}, },
"multifactorAuthenticationCancelled": { "multifactorAuthenticationCancelled": {
"message": "Многофакторная аутентификация отменена" "message": "Многофакторная аутентификация отменена"
@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey удален" "message": "Passkey удален"
},
"unassignedItemsBanner": {
"message": "Обратите внимание: неприсвоенные элементы организации больше не видны в представлении \"Все хранилища\" и доступны только через консоль администратора. Назначьте эти элементы коллекции в консоли администратора, чтобы сделать их видимыми."
},
"unassignedItemsBannerSelfHost": {
"message": "Уведомление: 2 мая 2024 года неприсвоенные элементы организации больше не будут видны в представлении \"Все хранилища\" и будут доступны только через консоль администратора. Назначьте эти элементы коллекции в консоли администратора, чтобы сделать их видимыми."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Prístupový kľúč bol odstránený" "message": "Prístupový kľúč bol odstránený"
},
"unassignedItemsBanner": {
"message": "Upozornenie: Nepriradené položky organizácie už nie sú viditeľné v zobrazení Všetky Trezory a sú prístupné len cez administrátorskú konzolu. Aby boli viditeľné, priraďte tieto položky do kolekcie z konzoly administrátora."
},
"unassignedItemsBannerSelfHost": {
"message": "Upozornenie: 2. mája nepriradené položky organizácie už nebudú viditeľné v zobrazení Všetky Trezory a budú prístupné len cez administrátorskú konzolu. Aby boli viditeľné, priraďte tieto položky do kolekcie z konzoly administrátora."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Приступачни кључ је уклоњен" "message": "Приступачни кључ је уклоњен"
},
"unassignedItemsBanner": {
"message": "Напомена: Недодељене ставке организације више нису видљиве у приказу Сви сефови и доступне су само преко Админ конзоле. Доделите ове ставке колекцији са Админ конзолом да бисте их учинили видљивим."
},
"unassignedItemsBannerSelfHost": {
"message": "Обавештење: 2. маја 2024. недодељене ставке организације више неће бити видљиве у приказу Сви сефови и биће доступне само преко Админ конзоле. Доделите ове ставке колекцији са Админ конзолом да бисте их учинили видљивим."
} }
} }

View File

@ -2931,7 +2931,7 @@
"message": "active" "message": "active"
}, },
"locked": { "locked": {
"message": "locked" "message": "låst"
}, },
"unlocked": { "unlocked": {
"message": "unlocked" "message": "unlocked"
@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Ключ доступу вилучено" "message": "Ключ доступу вилучено"
},
"unassignedItemsBanner": {
"message": "Увага: непризначені елементи організації більше не видимі у поданні \"Усі сховища\" і доступні лише в консолі адміністратора. Щоб зробити їх видимими, призначте ці елементи збірці в консолі адміністратора."
},
"unassignedItemsBannerSelfHost": {
"message": "Сповіщення: 2 травня 2024 року, непризначені елементи організації більше не будуть видимі в поданні \"Усі сховища\", і будуть доступні лише через консоль адміністратора. Щоб зробити їх видимими, призначте ці елементи збірці в консолі адміністратора."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "通行密钥已移除" "message": "通行密钥已移除"
},
"unassignedItemsBanner": {
"message": "注意:未分配的组织项目在「所有密码库」视图中不再可见,只能通过管理控制台访问。通过管理控制台将这些项目分配给集合以使其可见。"
},
"unassignedItemsBannerSelfHost": {
"message": "注意:从 2024 年 5 月 2 日起,未分配的组织项目在「所有密码库」视图中将不再可见,只能通过管理控制台访问。通过管理控制台将这些项目分配给集合以使其可见。"
} }
} }

View File

@ -3005,5 +3005,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"unassignedItemsBanner": {
"message": "Notice: Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
},
"unassignedItemsBannerSelfHost": {
"message": "Notice: On May 2, 2024, unassigned organization items will no longer be visible in the All Vaults view and will only be accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible."
} }
} }

View File

@ -17,6 +17,10 @@ import {
FactoryOptions, FactoryOptions,
factory, factory,
} from "../../../platform/background/service-factories/factory-options"; } from "../../../platform/background/service-factories/factory-options";
import {
stateProviderFactory,
StateProviderInitOptions,
} from "../../../platform/background/service-factories/state-provider.factory";
import { accountServiceFactory, AccountServiceInitOptions } from "./account-service.factory"; import { accountServiceFactory, AccountServiceInitOptions } from "./account-service.factory";
import { import {
@ -31,7 +35,8 @@ export type AuthRequestServiceInitOptions = AuthRequestServiceFactoryOptions &
AccountServiceInitOptions & AccountServiceInitOptions &
MasterPasswordServiceInitOptions & MasterPasswordServiceInitOptions &
CryptoServiceInitOptions & CryptoServiceInitOptions &
ApiServiceInitOptions; ApiServiceInitOptions &
StateProviderInitOptions;
export function authRequestServiceFactory( export function authRequestServiceFactory(
cache: { authRequestService?: AuthRequestServiceAbstraction } & CachedServices, cache: { authRequestService?: AuthRequestServiceAbstraction } & CachedServices,
@ -48,6 +53,7 @@ export function authRequestServiceFactory(
await internalMasterPasswordServiceFactory(cache, opts), await internalMasterPasswordServiceFactory(cache, opts),
await cryptoServiceFactory(cache, opts), await cryptoServiceFactory(cache, opts),
await apiServiceFactory(cache, opts), await apiServiceFactory(cache, opts),
await stateProviderFactory(cache, opts),
), ),
); );
} }

View File

@ -720,7 +720,7 @@ describe("NotificationBackground", () => {
); );
tabSendMessageSpy = jest.spyOn(BrowserApi, "tabSendMessage").mockImplementation(); tabSendMessageSpy = jest.spyOn(BrowserApi, "tabSendMessage").mockImplementation();
editItemSpy = jest.spyOn(notificationBackground as any, "editItem"); editItemSpy = jest.spyOn(notificationBackground as any, "editItem");
setAddEditCipherInfoSpy = jest.spyOn(stateService, "setAddEditCipherInfo"); setAddEditCipherInfoSpy = jest.spyOn(cipherService, "setAddEditCipherInfo");
openAddEditVaultItemPopoutSpy = jest.spyOn( openAddEditVaultItemPopoutSpy = jest.spyOn(
notificationBackground as any, notificationBackground as any,
"openAddEditVaultItemPopout", "openAddEditVaultItemPopout",

View File

@ -600,14 +600,14 @@ export default class NotificationBackground {
} }
/** /**
* Sets the add/edit cipher info in the state service * Sets the add/edit cipher info in the cipher service
* and opens the add/edit vault item popout. * and opens the add/edit vault item popout.
* *
* @param cipherView - The cipher to edit * @param cipherView - The cipher to edit
* @param senderTab - The tab that the message was sent from * @param senderTab - The tab that the message was sent from
*/ */
private async editItem(cipherView: CipherView, senderTab: chrome.tabs.Tab) { private async editItem(cipherView: CipherView, senderTab: chrome.tabs.Tab) {
await this.stateService.setAddEditCipherInfo({ await this.cipherService.setAddEditCipherInfo({
cipher: cipherView, cipher: cipherView,
collectionIds: cipherView.collectionIds, collectionIds: cipherView.collectionIds,
}); });

View File

@ -592,7 +592,7 @@ describe("OverlayBackground", () => {
beforeEach(() => { beforeEach(() => {
sender = mock<chrome.runtime.MessageSender>({ tab: { id: 1 } }); sender = mock<chrome.runtime.MessageSender>({ tab: { id: 1 } });
jest jest
.spyOn(overlayBackground["stateService"], "setAddEditCipherInfo") .spyOn(overlayBackground["cipherService"], "setAddEditCipherInfo")
.mockImplementation(); .mockImplementation();
jest.spyOn(overlayBackground as any, "openAddEditVaultItemPopout").mockImplementation(); jest.spyOn(overlayBackground as any, "openAddEditVaultItemPopout").mockImplementation();
}); });
@ -600,7 +600,7 @@ describe("OverlayBackground", () => {
it("will not open the add edit popout window if the message does not have a login cipher provided", () => { it("will not open the add edit popout window if the message does not have a login cipher provided", () => {
sendExtensionRuntimeMessage({ command: "autofillOverlayAddNewVaultItem" }, sender); sendExtensionRuntimeMessage({ command: "autofillOverlayAddNewVaultItem" }, sender);
expect(overlayBackground["stateService"].setAddEditCipherInfo).not.toHaveBeenCalled(); expect(overlayBackground["cipherService"].setAddEditCipherInfo).not.toHaveBeenCalled();
expect(overlayBackground["openAddEditVaultItemPopout"]).not.toHaveBeenCalled(); expect(overlayBackground["openAddEditVaultItemPopout"]).not.toHaveBeenCalled();
}); });
@ -621,7 +621,7 @@ describe("OverlayBackground", () => {
); );
await flushPromises(); await flushPromises();
expect(overlayBackground["stateService"].setAddEditCipherInfo).toHaveBeenCalled(); expect(overlayBackground["cipherService"].setAddEditCipherInfo).toHaveBeenCalled();
expect(BrowserApi.sendMessage).toHaveBeenCalledWith( expect(BrowserApi.sendMessage).toHaveBeenCalledWith(
"inlineAutofillMenuRefreshAddEditCipher", "inlineAutofillMenuRefreshAddEditCipher",
); );

View File

@ -636,7 +636,7 @@ class OverlayBackground implements OverlayBackgroundInterface {
cipherView.type = CipherType.Login; cipherView.type = CipherType.Login;
cipherView.login = loginView; cipherView.login = loginView;
await this.stateService.setAddEditCipherInfo({ await this.cipherService.setAddEditCipherInfo({
cipher: cipherView, cipher: cipherView,
collectionIds: cipherView.collectionIds, collectionIds: cipherView.collectionIds,
}); });

View File

@ -342,11 +342,11 @@ export default class MainBackground {
private syncTimeout: any; private syncTimeout: any;
private isSafari: boolean; private isSafari: boolean;
private nativeMessagingBackground: NativeMessagingBackground; private nativeMessagingBackground: NativeMessagingBackground;
popupOnlyContext: boolean;
constructor(public isPrivateMode: boolean = false) {
this.popupOnlyContext = isPrivateMode || BrowserApi.isManifestVersion(3);
constructor(
public isPrivateMode: boolean = false,
public popupOnlyContext: boolean = false,
) {
// Services // Services
const lockedCallback = async (userId?: string) => { const lockedCallback = async (userId?: string) => {
if (this.notificationsService != null) { if (this.notificationsService != null) {
@ -596,6 +596,7 @@ export default class MainBackground {
this.masterPasswordService, this.masterPasswordService,
this.cryptoService, this.cryptoService,
this.apiService, this.apiService,
this.stateProvider,
); );
this.authService = new AuthService( this.authService = new AuthService(
@ -662,12 +663,12 @@ export default class MainBackground {
this.encryptService, this.encryptService,
this.cipherFileUploadService, this.cipherFileUploadService,
this.configService, this.configService,
this.stateProvider,
); );
this.folderService = new FolderService( this.folderService = new FolderService(
this.cryptoService, this.cryptoService,
this.i18nService, this.i18nService,
this.cipherService, this.cipherService,
this.stateService,
this.stateProvider, this.stateProvider,
); );
this.folderApiService = new FolderApiService(this.folderService, this.apiService); this.folderApiService = new FolderApiService(this.folderService, this.apiService);
@ -844,6 +845,7 @@ export default class MainBackground {
logoutCallback, logoutCallback,
this.stateService, this.stateService,
this.authService, this.authService,
this.authRequestService,
this.messagingService, this.messagingService,
); );
@ -887,82 +889,83 @@ export default class MainBackground {
this.isSafari = this.platformUtilsService.isSafari(); this.isSafari = this.platformUtilsService.isSafari();
// Background // Background
this.runtimeBackground = new RuntimeBackground(
this,
this.autofillService,
this.platformUtilsService as BrowserPlatformUtilsService,
this.i18nService,
this.notificationsService,
this.stateService,
this.autofillSettingsService,
this.systemService,
this.environmentService,
this.messagingService,
this.logService,
this.configService,
this.fido2Service,
);
this.nativeMessagingBackground = new NativeMessagingBackground(
this.accountService,
this.masterPasswordService,
this.cryptoService,
this.cryptoFunctionService,
this.runtimeBackground,
this.messagingService,
this.appIdService,
this.platformUtilsService,
this.stateService,
this.logService,
this.authService,
this.biometricStateService,
);
this.commandsBackground = new CommandsBackground(
this,
this.passwordGenerationService,
this.platformUtilsService,
this.vaultTimeoutService,
this.authService,
);
this.notificationBackground = new NotificationBackground(
this.autofillService,
this.cipherService,
this.authService,
this.policyService,
this.folderService,
this.stateService,
this.userNotificationSettingsService,
this.domainSettingsService,
this.environmentService,
this.logService,
themeStateService,
this.configService,
);
this.overlayBackground = new OverlayBackground(
this.cipherService,
this.autofillService,
this.authService,
this.environmentService,
this.domainSettingsService,
this.stateService,
this.autofillSettingsService,
this.i18nService,
this.platformUtilsService,
themeStateService,
);
this.filelessImporterBackground = new FilelessImporterBackground(
this.configService,
this.authService,
this.policyService,
this.notificationBackground,
this.importService,
this.syncService,
);
this.tabsBackground = new TabsBackground(
this,
this.notificationBackground,
this.overlayBackground,
);
if (!this.popupOnlyContext) { if (!this.popupOnlyContext) {
this.runtimeBackground = new RuntimeBackground(
this,
this.autofillService,
this.platformUtilsService as BrowserPlatformUtilsService,
this.i18nService,
this.notificationsService,
this.stateService,
this.autofillSettingsService,
this.systemService,
this.environmentService,
this.messagingService,
this.logService,
this.configService,
this.fido2Service,
);
this.nativeMessagingBackground = new NativeMessagingBackground(
this.accountService,
this.masterPasswordService,
this.cryptoService,
this.cryptoFunctionService,
this.runtimeBackground,
this.messagingService,
this.appIdService,
this.platformUtilsService,
this.stateService,
this.logService,
this.authService,
this.biometricStateService,
);
this.commandsBackground = new CommandsBackground(
this,
this.passwordGenerationService,
this.platformUtilsService,
this.vaultTimeoutService,
this.authService,
);
this.notificationBackground = new NotificationBackground(
this.autofillService,
this.cipherService,
this.authService,
this.policyService,
this.folderService,
this.stateService,
this.userNotificationSettingsService,
this.domainSettingsService,
this.environmentService,
this.logService,
themeStateService,
this.configService,
);
this.overlayBackground = new OverlayBackground(
this.cipherService,
this.autofillService,
this.authService,
this.environmentService,
this.domainSettingsService,
this.stateService,
this.autofillSettingsService,
this.i18nService,
this.platformUtilsService,
themeStateService,
);
this.filelessImporterBackground = new FilelessImporterBackground(
this.configService,
this.authService,
this.policyService,
this.notificationBackground,
this.importService,
this.syncService,
);
this.tabsBackground = new TabsBackground(
this,
this.notificationBackground,
this.overlayBackground,
);
const contextMenuClickedHandler = new ContextMenuClickedHandler( const contextMenuClickedHandler = new ContextMenuClickedHandler(
(options) => this.platformUtilsService.copyToClipboard(options.text), (options) => this.platformUtilsService.copyToClipboard(options.text),
async (_tab) => { async (_tab) => {
@ -1004,11 +1007,6 @@ export default class MainBackground {
this.notificationsService, this.notificationsService,
this.accountService, this.accountService,
); );
this.webRequestBackground = new WebRequestBackground(
this.platformUtilsService,
this.cipherService,
this.authService,
);
this.usernameGenerationService = new UsernameGenerationService( this.usernameGenerationService = new UsernameGenerationService(
this.cryptoService, this.cryptoService,
@ -1030,34 +1028,40 @@ export default class MainBackground {
this.authService, this.authService,
this.cipherService, this.cipherService,
); );
if (BrowserApi.isManifestVersion(2)) {
this.webRequestBackground = new WebRequestBackground(
this.platformUtilsService,
this.cipherService,
this.authService,
);
}
} }
} }
async bootstrap() { async bootstrap() {
this.containerService.attachToGlobal(self); this.containerService.attachToGlobal(self);
await this.stateService.init(); await this.stateService.init({ runMigrations: !this.isPrivateMode });
await this.vaultTimeoutService.init(true);
await (this.i18nService as I18nService).init(); await (this.i18nService as I18nService).init();
await (this.eventUploadService as EventUploadService).init(true); (this.eventUploadService as EventUploadService).init(true);
await this.runtimeBackground.init();
await this.notificationBackground.init();
this.filelessImporterBackground.init();
await this.commandsBackground.init();
this.twoFactorService.init(); this.twoFactorService.init();
await this.overlayBackground.init();
await this.tabsBackground.init();
if (!this.popupOnlyContext) { if (!this.popupOnlyContext) {
await this.vaultTimeoutService.init(true);
await this.runtimeBackground.init();
await this.notificationBackground.init();
this.filelessImporterBackground.init();
await this.commandsBackground.init();
await this.overlayBackground.init();
await this.tabsBackground.init();
this.contextMenusBackground?.init(); this.contextMenusBackground?.init();
await this.idleBackground.init();
if (BrowserApi.isManifestVersion(2)) {
await this.webRequestBackground.init();
}
} }
await this.idleBackground.init();
await this.webRequestBackground.init();
await this.fido2Service.init();
if (this.platformUtilsService.isFirefox() && !this.isPrivateMode) { if (this.platformUtilsService.isFirefox() && !this.isPrivateMode) {
// Set Private Mode windows to the default icon - they do not share state with the background page // Set Private Mode windows to the default icon - they do not share state with the background page
@ -1080,9 +1084,7 @@ export default class MainBackground {
if (!this.isPrivateMode) { if (!this.isPrivateMode) {
await this.refreshBadge(); await this.refreshBadge();
} }
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. await this.fullSync(true);
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.fullSync(true);
setTimeout(() => this.notificationsService.init(), 2500); setTimeout(() => this.notificationsService.init(), 2500);
resolve(); resolve();
}, 500); }, 500);
@ -1203,7 +1205,7 @@ export default class MainBackground {
BrowserApi.sendMessage("updateBadge"); BrowserApi.sendMessage("updateBadge");
} }
await this.refreshBadge(); await this.refreshBadge();
await this.mainContextMenuHandler.noAccess(); await this.mainContextMenuHandler?.noAccess();
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
// eslint-disable-next-line @typescript-eslint/no-floating-promises // eslint-disable-next-line @typescript-eslint/no-floating-promises
this.notificationsService.updateConnection(false); this.notificationsService.updateConnection(false);

View File

@ -1,5 +1,3 @@
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { SendType } from "@bitwarden/common/tools/send/enums/send-type";
import { SendView } from "@bitwarden/common/tools/send/models/view/send.view"; import { SendView } from "@bitwarden/common/tools/send/models/view/send.view";
import { DeepJsonify } from "@bitwarden/common/types/deep-jsonify"; import { DeepJsonify } from "@bitwarden/common/types/deep-jsonify";
@ -7,13 +5,6 @@ import { BrowserComponentState } from "./browserComponentState";
export class BrowserSendComponentState extends BrowserComponentState { export class BrowserSendComponentState extends BrowserComponentState {
sends: SendView[]; sends: SendView[];
typeCounts: Map<SendType, number>;
toJSON() {
return Utils.merge(this, {
typeCounts: Utils.mapToRecord(this.typeCounts),
});
}
static fromJSON(json: DeepJsonify<BrowserSendComponentState>) { static fromJSON(json: DeepJsonify<BrowserSendComponentState>) {
if (json == null) { if (json == null) {
@ -22,7 +13,6 @@ export class BrowserSendComponentState extends BrowserComponentState {
return Object.assign(new BrowserSendComponentState(), json, { return Object.assign(new BrowserSendComponentState(), json, {
sends: json.sends?.map((s) => SendView.fromJSON(s)), sends: json.sends?.map((s) => SendView.fromJSON(s)),
typeCounts: Utils.recordToMap(json.typeCounts),
}); });
} }
} }

View File

@ -7,6 +7,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status"; import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { DialogService, SimpleDialogOptions } from "@bitwarden/components"; import { DialogService, SimpleDialogOptions } from "@bitwarden/components";
import { BrowserApi } from "../platform/browser/browser-api"; import { BrowserApi } from "../platform/browser/browser-api";
@ -42,6 +43,7 @@ export class AppComponent implements OnInit, OnDestroy {
private stateService: BrowserStateService, private stateService: BrowserStateService,
private browserSendStateService: BrowserSendStateService, private browserSendStateService: BrowserSendStateService,
private vaultBrowserStateService: VaultBrowserStateService, private vaultBrowserStateService: VaultBrowserStateService,
private cipherService: CipherService,
private changeDetectorRef: ChangeDetectorRef, private changeDetectorRef: ChangeDetectorRef,
private ngZone: NgZone, private ngZone: NgZone,
private platformUtilsService: ForegroundPlatformUtilsService, private platformUtilsService: ForegroundPlatformUtilsService,
@ -161,7 +163,7 @@ export class AppComponent implements OnInit, OnDestroy {
await this.clearComponentStates(); await this.clearComponentStates();
} }
if (url.startsWith("/tabs/")) { if (url.startsWith("/tabs/")) {
await this.stateService.setAddEditCipherInfo(null); await this.cipherService.setAddEditCipherInfo(null);
} }
(window as any).previousPopupUrl = url; (window as any).previousPopupUrl = url;

View File

@ -120,7 +120,7 @@ const mainBackground: MainBackground = needsBackgroundInit
: BrowserApi.getBackgroundPage().bitwardenMain; : BrowserApi.getBackgroundPage().bitwardenMain;
function createLocalBgService() { function createLocalBgService() {
const localBgService = new MainBackground(isPrivateMode); const localBgService = new MainBackground(isPrivateMode, true);
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
// eslint-disable-next-line @typescript-eslint/no-floating-promises // eslint-disable-next-line @typescript-eslint/no-floating-promises
localBgService.bootstrap(); localBgService.bootstrap();

View File

@ -153,7 +153,7 @@
*ngIf="showChangeMasterPass" *ngIf="showChangeMasterPass"
> >
<div class="row-main">{{ "changeMasterPassword" | i18n }}</div> <div class="row-main">{{ "changeMasterPassword" | i18n }}</div>
<i class="bwi bwi-angle-right bwi-lg row-sub-icon" aria-hidden="true"></i> <i class="bwi bwi-external-link bwi-lg row-sub-icon" aria-hidden="true"></i>
</button> </button>
<button <button
type="button" type="button"

View File

@ -441,9 +441,10 @@ export class SettingsComponent implements OnInit {
async changePassword() { async changePassword() {
const confirmed = await this.dialogService.openSimpleDialog({ const confirmed = await this.dialogService.openSimpleDialog({
title: { key: "changeMasterPassword" }, title: { key: "continueToWebApp" },
content: { key: "changeMasterPasswordConfirmation" }, content: { key: "changeMasterPasswordOnWebConfirmation" },
type: "info", type: "info",
acceptButtonText: { key: "continue" },
}); });
if (confirmed) { if (confirmed) {
const env = await firstValueFrom(this.environmentService.environment$); const env = await firstValueFrom(this.environmentService.environment$);

View File

@ -1,6 +1,7 @@
import { Location } from "@angular/common"; import { Location } from "@angular/common";
import { Component } from "@angular/core"; import { Component } from "@angular/core";
import { ActivatedRoute } from "@angular/router"; import { ActivatedRoute } from "@angular/router";
import { firstValueFrom } from "rxjs";
import { GeneratorComponent as BaseGeneratorComponent } from "@bitwarden/angular/tools/generator/components/generator.component"; import { GeneratorComponent as BaseGeneratorComponent } from "@bitwarden/angular/tools/generator/components/generator.component";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
@ -9,6 +10,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl
import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username"; import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { AddEditCipherInfo } from "@bitwarden/common/vault/types/add-edit-cipher-info"; import { AddEditCipherInfo } from "@bitwarden/common/vault/types/add-edit-cipher-info";
@ -19,6 +21,7 @@ import { AddEditCipherInfo } from "@bitwarden/common/vault/types/add-edit-cipher
export class GeneratorComponent extends BaseGeneratorComponent { export class GeneratorComponent extends BaseGeneratorComponent {
private addEditCipherInfo: AddEditCipherInfo; private addEditCipherInfo: AddEditCipherInfo;
private cipherState: CipherView; private cipherState: CipherView;
private cipherService: CipherService;
constructor( constructor(
passwordGenerationService: PasswordGenerationServiceAbstraction, passwordGenerationService: PasswordGenerationServiceAbstraction,
@ -26,6 +29,7 @@ export class GeneratorComponent extends BaseGeneratorComponent {
platformUtilsService: PlatformUtilsService, platformUtilsService: PlatformUtilsService,
i18nService: I18nService, i18nService: I18nService,
stateService: StateService, stateService: StateService,
cipherService: CipherService,
route: ActivatedRoute, route: ActivatedRoute,
logService: LogService, logService: LogService,
private location: Location, private location: Location,
@ -40,10 +44,11 @@ export class GeneratorComponent extends BaseGeneratorComponent {
route, route,
window, window,
); );
this.cipherService = cipherService;
} }
async ngOnInit() { async ngOnInit() {
this.addEditCipherInfo = await this.stateService.getAddEditCipherInfo(); this.addEditCipherInfo = await firstValueFrom(this.cipherService.addEditCipherInfo$);
if (this.addEditCipherInfo != null) { if (this.addEditCipherInfo != null) {
this.cipherState = this.addEditCipherInfo.cipher; this.cipherState = this.addEditCipherInfo.cipher;
} }
@ -64,7 +69,7 @@ export class GeneratorComponent extends BaseGeneratorComponent {
this.addEditCipherInfo.cipher = this.cipherState; this.addEditCipherInfo.cipher = this.cipherState;
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling. // FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
// eslint-disable-next-line @typescript-eslint/no-floating-promises // eslint-disable-next-line @typescript-eslint/no-floating-promises
this.stateService.setAddEditCipherInfo(this.addEditCipherInfo); this.cipherService.setAddEditCipherInfo(this.addEditCipherInfo);
this.close(); this.close();
} }

View File

@ -61,7 +61,7 @@
<div class="icon"><i class="bwi bwi-fw bwi-lg bwi-file-text"></i></div> <div class="icon"><i class="bwi bwi-fw bwi-lg bwi-file-text"></i></div>
<span class="text">{{ "sendTypeText" | i18n }}</span> <span class="text">{{ "sendTypeText" | i18n }}</span>
</div> </div>
<span class="row-sub-label">{{ typeCounts.get(sendType.Text) || 0 }}</span> <span class="row-sub-label">{{ getSendCount(sends, sendType.Text) }}</span>
<span><i class="bwi bwi-angle-right bwi-lg row-sub-icon"></i></span> <span><i class="bwi bwi-angle-right bwi-lg row-sub-icon"></i></span>
</button> </button>
<button <button
@ -74,7 +74,7 @@
<div class="icon"><i class="bwi bwi-fw bwi-lg bwi-file"></i></div> <div class="icon"><i class="bwi bwi-fw bwi-lg bwi-file"></i></div>
<span class="text">{{ "sendTypeFile" | i18n }}</span> <span class="text">{{ "sendTypeFile" | i18n }}</span>
</div> </div>
<span class="row-sub-label">{{ typeCounts.get(sendType.File) || 0 }}</span> <span class="row-sub-label">{{ getSendCount(sends, sendType.File) }}</span>
<span><i class="bwi bwi-angle-right bwi-lg row-sub-icon"></i></span> <span><i class="bwi bwi-angle-right bwi-lg row-sub-icon"></i></span>
</button> </button>
</div> </div>

View File

@ -29,8 +29,6 @@ const ComponentId = "SendComponent";
export class SendGroupingsComponent extends BaseSendComponent { export class SendGroupingsComponent extends BaseSendComponent {
// Header // Header
showLeftHeader = true; showLeftHeader = true;
// Send Type Calculations
typeCounts = new Map<SendType, number>();
// State Handling // State Handling
state: BrowserSendComponentState; state: BrowserSendComponentState;
private loadedTimeout: number; private loadedTimeout: number;
@ -65,7 +63,6 @@ export class SendGroupingsComponent extends BaseSendComponent {
dialogService, dialogService,
); );
super.onSuccessfulLoad = async () => { super.onSuccessfulLoad = async () => {
this.calculateTypeCounts();
this.selectAll(); this.selectAll();
}; };
} }
@ -174,17 +171,8 @@ export class SendGroupingsComponent extends BaseSendComponent {
return this.hasSearched || (!this.searchPending && this.isSearchable); return this.hasSearched || (!this.searchPending && this.isSearchable);
} }
private calculateTypeCounts() { getSendCount(sends: SendView[], type: SendType): number {
// Create type counts return sends.filter((s) => s.type === type).length;
const typeCounts = new Map<SendType, number>();
this.sends.forEach((s) => {
if (typeCounts.has(s.type)) {
typeCounts.set(s.type, typeCounts.get(s.type) + 1);
} else {
typeCounts.set(s.type, 1);
}
});
this.typeCounts = typeCounts;
} }
private async saveState() { private async saveState() {
@ -192,7 +180,6 @@ export class SendGroupingsComponent extends BaseSendComponent {
scrollY: BrowserPopupUtils.getContentScrollY(window), scrollY: BrowserPopupUtils.getContentScrollY(window),
searchText: this.searchText, searchText: this.searchText,
sends: this.sends, sends: this.sends,
typeCounts: this.typeCounts,
}); });
await this.stateService.setBrowserSendComponentState(this.state); await this.stateService.setBrowserSendComponentState(this.state);
} }
@ -206,9 +193,6 @@ export class SendGroupingsComponent extends BaseSendComponent {
if (this.state.sends != null) { if (this.state.sends != null) {
this.sends = this.state.sends; this.sends = this.state.sends;
} }
if (this.state.typeCounts != null) {
this.typeCounts = this.state.typeCounts;
}
return true; return true;
} }

View File

@ -6,7 +6,6 @@ import { FakeStateProvider } from "@bitwarden/common/../spec/fake-state-provider
import { awaitAsync } from "@bitwarden/common/../spec/utils"; import { awaitAsync } from "@bitwarden/common/../spec/utils";
import { Utils } from "@bitwarden/common/platform/misc/utils"; import { Utils } from "@bitwarden/common/platform/misc/utils";
import { SendType } from "@bitwarden/common/tools/send/enums/send-type";
import { UserId } from "@bitwarden/common/types/guid"; import { UserId } from "@bitwarden/common/types/guid";
import { BrowserComponentState } from "../../../models/browserComponentState"; import { BrowserComponentState } from "../../../models/browserComponentState";
@ -33,7 +32,6 @@ describe("Browser Send State Service", () => {
const state = new BrowserSendComponentState(); const state = new BrowserSendComponentState();
state.scrollY = 0; state.scrollY = 0;
state.searchText = "test"; state.searchText = "test";
state.typeCounts = new Map<SendType, number>().set(SendType.File, 1);
await stateService.setBrowserSendComponentState(state); await stateService.setBrowserSendComponentState(state);

View File

@ -42,7 +42,7 @@ export class BrowserSendStateService {
} }
/** Set the active user's browser send component state /** Set the active user's browser send component state
* @param { BrowserSendComponentState } value sets the sends and type counts along with the scroll position and search text for * @param { BrowserSendComponentState } value sets the sends along with the scroll position and search text for
* the send component on the browser * the send component on the browser
*/ */
async setBrowserSendComponentState(value: BrowserSendComponentState): Promise<void> { async setBrowserSendComponentState(value: BrowserSendComponentState): Promise<void> {

View File

@ -1,7 +1,5 @@
import { Jsonify } from "type-fest"; import { Jsonify } from "type-fest";
import { SendType } from "@bitwarden/common/tools/send/enums/send-type";
import { BrowserSendComponentState } from "../../../models/browserSendComponentState"; import { BrowserSendComponentState } from "../../../models/browserSendComponentState";
import { BROWSER_SEND_COMPONENT, BROWSER_SEND_TYPE_COMPONENT } from "./key-definitions"; import { BROWSER_SEND_COMPONENT, BROWSER_SEND_TYPE_COMPONENT } from "./key-definitions";
@ -12,7 +10,8 @@ describe("Key definitions", () => {
const keyDef = BROWSER_SEND_COMPONENT; const keyDef = BROWSER_SEND_COMPONENT;
const expectedState = { const expectedState = {
typeCounts: new Map<SendType, number>(), scrollY: 0,
searchText: "test",
}; };
const result = keyDef.deserializer( const result = keyDef.deserializer(

View File

@ -42,6 +42,7 @@ import {
i18nServiceFactory, i18nServiceFactory,
I18nServiceInitOptions, I18nServiceInitOptions,
} from "../../../platform/background/service-factories/i18n-service.factory"; } from "../../../platform/background/service-factories/i18n-service.factory";
import { stateProviderFactory } from "../../../platform/background/service-factories/state-provider.factory";
import { import {
stateServiceFactory, stateServiceFactory,
StateServiceInitOptions, StateServiceInitOptions,
@ -81,6 +82,7 @@ export function cipherServiceFactory(
await encryptServiceFactory(cache, opts), await encryptServiceFactory(cache, opts),
await cipherFileUploadServiceFactory(cache, opts), await cipherFileUploadServiceFactory(cache, opts),
await configServiceFactory(cache, opts), await configServiceFactory(cache, opts),
await stateProviderFactory(cache, opts),
), ),
); );
} }

View File

@ -14,11 +14,10 @@ import {
i18nServiceFactory, i18nServiceFactory,
I18nServiceInitOptions, I18nServiceInitOptions,
} from "../../../platform/background/service-factories/i18n-service.factory"; } from "../../../platform/background/service-factories/i18n-service.factory";
import { stateProviderFactory } from "../../../platform/background/service-factories/state-provider.factory";
import { import {
stateServiceFactory as stateServiceFactory, stateProviderFactory,
StateServiceInitOptions, StateProviderInitOptions,
} from "../../../platform/background/service-factories/state-service.factory"; } from "../../../platform/background/service-factories/state-provider.factory";
import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory"; import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory";
@ -28,7 +27,7 @@ export type FolderServiceInitOptions = FolderServiceFactoryOptions &
CryptoServiceInitOptions & CryptoServiceInitOptions &
CipherServiceInitOptions & CipherServiceInitOptions &
I18nServiceInitOptions & I18nServiceInitOptions &
StateServiceInitOptions; StateProviderInitOptions;
export function folderServiceFactory( export function folderServiceFactory(
cache: { folderService?: AbstractFolderService } & CachedServices, cache: { folderService?: AbstractFolderService } & CachedServices,
@ -43,7 +42,6 @@ export function folderServiceFactory(
await cryptoServiceFactory(cache, opts), await cryptoServiceFactory(cache, opts),
await i18nServiceFactory(cache, opts), await i18nServiceFactory(cache, opts),
await cipherServiceFactory(cache, opts), await cipherServiceFactory(cache, opts),
await stateServiceFactory(cache, opts),
await stateProviderFactory(cache, opts), await stateProviderFactory(cache, opts),
), ),
); );

View File

@ -304,7 +304,7 @@ export class AddEditComponent extends BaseAddEditComponent {
} }
private saveCipherState() { private saveCipherState() {
return this.stateService.setAddEditCipherInfo({ return this.cipherService.setAddEditCipherInfo({
cipher: this.cipher, cipher: this.cipher,
collectionIds: collectionIds:
this.collections == null this.collections == null

View File

@ -39,12 +39,23 @@
<app-callout <app-callout
*ngIf=" *ngIf="
(unassignedItemsBannerEnabled$ | async) && (unassignedItemsBannerEnabled$ | async) &&
(unassignedItemsBannerService.showBanner$ | async) (unassignedItemsBannerService.showBanner$ | async) &&
!(unassignedItemsBannerService.loading$ | async)
" "
type="info" type="info"
> >
<p> <p>
{{ "unassignedItemsBanner" | i18n }} {{ unassignedItemsBannerService.bannerText$ | async | i18n }}
{{ "unassignedItemsBannerCTAPartOne" | i18n }}
<a
[href]="unassignedItemsBannerService.adminConsoleUrl$ | async"
bitLink
linkType="contrast"
target="_blank"
rel="noreferrer"
>{{ "adminConsole" | i18n }}</a
>
{{ "unassignedItemsBannerCTAPartTwo" | i18n }}
<a <a
href="https://bitwarden.com/help/unassigned-vault-items-moved-to-admin-console" href="https://bitwarden.com/help/unassigned-vault-items-moved-to-admin-console"
bitLink bitLink

View File

@ -18,11 +18,13 @@ import { EventUploadService as EventUploadServiceAbstraction } from "@bitwarden/
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction"; import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
import { OrganizationUserService } from "@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service"; import { OrganizationUserService } from "@bitwarden/common/admin-console/abstractions/organization-user/organization-user.service";
import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction"; import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction";
import { ProviderApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/provider/provider-api.service.abstraction";
import { OrganizationApiService } from "@bitwarden/common/admin-console/services/organization/organization-api.service"; import { OrganizationApiService } from "@bitwarden/common/admin-console/services/organization/organization-api.service";
import { OrganizationService } from "@bitwarden/common/admin-console/services/organization/organization.service"; import { OrganizationService } from "@bitwarden/common/admin-console/services/organization/organization.service";
import { OrganizationUserServiceImplementation } from "@bitwarden/common/admin-console/services/organization-user/organization-user.service.implementation"; import { OrganizationUserServiceImplementation } from "@bitwarden/common/admin-console/services/organization-user/organization-user.service.implementation";
import { PolicyApiService } from "@bitwarden/common/admin-console/services/policy/policy-api.service"; import { PolicyApiService } from "@bitwarden/common/admin-console/services/policy/policy-api.service";
import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service"; import { PolicyService } from "@bitwarden/common/admin-console/services/policy/policy.service";
import { ProviderApiService } from "@bitwarden/common/admin-console/services/provider/provider-api.service";
import { ProviderService } from "@bitwarden/common/admin-console/services/provider.service"; import { ProviderService } from "@bitwarden/common/admin-console/services/provider.service";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service"; import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { AvatarService as AvatarServiceAbstraction } from "@bitwarden/common/auth/abstractions/avatar.service"; import { AvatarService as AvatarServiceAbstraction } from "@bitwarden/common/auth/abstractions/avatar.service";
@ -35,6 +37,7 @@ import { AvatarService } from "@bitwarden/common/auth/services/avatar.service";
import { DeviceTrustCryptoService } from "@bitwarden/common/auth/services/device-trust-crypto.service.implementation"; import { DeviceTrustCryptoService } from "@bitwarden/common/auth/services/device-trust-crypto.service.implementation";
import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation"; import { DevicesApiServiceImplementation } from "@bitwarden/common/auth/services/devices-api.service.implementation";
import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service"; import { KeyConnectorService } from "@bitwarden/common/auth/services/key-connector.service";
import { MasterPasswordService } from "@bitwarden/common/auth/services/master-password/master-password.service";
import { TokenService } from "@bitwarden/common/auth/services/token.service"; import { TokenService } from "@bitwarden/common/auth/services/token.service";
import { TwoFactorService } from "@bitwarden/common/auth/services/two-factor.service"; import { TwoFactorService } from "@bitwarden/common/auth/services/two-factor.service";
import { UserVerificationApiService } from "@bitwarden/common/auth/services/user-verification/user-verification-api.service"; import { UserVerificationApiService } from "@bitwarden/common/auth/services/user-verification/user-verification-api.service";
@ -231,6 +234,7 @@ export class Main {
stateEventRunnerService: StateEventRunnerService; stateEventRunnerService: StateEventRunnerService;
biometricStateService: BiometricStateService; biometricStateService: BiometricStateService;
billingAccountProfileStateService: BillingAccountProfileStateService; billingAccountProfileStateService: BillingAccountProfileStateService;
providerApiService: ProviderApiServiceAbstraction;
constructor() { constructor() {
let p = null; let p = null;
@ -353,6 +357,8 @@ export class Main {
migrationRunner, migrationRunner,
); );
this.masterPasswordService = new MasterPasswordService(this.stateProvider);
this.cryptoService = new CryptoService( this.cryptoService = new CryptoService(
this.masterPasswordService, this.masterPasswordService,
this.keyGenerationService, this.keyGenerationService,
@ -480,6 +486,7 @@ export class Main {
this.masterPasswordService, this.masterPasswordService,
this.cryptoService, this.cryptoService,
this.apiService, this.apiService,
this.stateProvider,
); );
this.billingAccountProfileStateService = new DefaultBillingAccountProfileStateService( this.billingAccountProfileStateService = new DefaultBillingAccountProfileStateService(
@ -540,13 +547,13 @@ export class Main {
this.encryptService, this.encryptService,
this.cipherFileUploadService, this.cipherFileUploadService,
this.configService, this.configService,
this.stateProvider,
); );
this.folderService = new FolderService( this.folderService = new FolderService(
this.cryptoService, this.cryptoService,
this.i18nService, this.i18nService,
this.cipherService, this.cipherService,
this.stateService,
this.stateProvider, this.stateProvider,
); );
@ -688,6 +695,8 @@ export class Main {
this.eventUploadService, this.eventUploadService,
this.authService, this.authService,
); );
this.providerApiService = new ProviderApiService(this.apiService);
} }
async run() { async run() {

View File

@ -49,5 +49,14 @@
}, },
"unsupportedEncryptedImport": { "unsupportedEncryptedImport": {
"message": "Importing encrypted files is currently not supported." "message": "Importing encrypted files is currently not supported."
},
"importUnassignedItemsError": {
"message": "File contains unassigned items."
},
"errorAssigningTargetCollection": {
"message": "Error assigning target collection."
},
"errorAssigningTargetFolder": {
"message": "Error assigning target folder."
} }
} }

View File

@ -1,7 +1,7 @@
{ {
"name": "@bitwarden/desktop", "name": "@bitwarden/desktop",
"description": "A secure and free password manager for all of your devices.", "description": "A secure and free password manager for all of your devices.",
"version": "2024.4.1", "version": "2024.4.2",
"keywords": [ "keywords": [
"bitwarden", "bitwarden",
"password", "password",

View File

@ -3,6 +3,7 @@ import { FormBuilder } from "@angular/forms";
import { BehaviorSubject, firstValueFrom, Observable, Subject } from "rxjs"; import { BehaviorSubject, firstValueFrom, Observable, Subject } from "rxjs";
import { concatMap, debounceTime, filter, map, switchMap, takeUntil, tap } from "rxjs/operators"; import { concatMap, debounceTime, filter, map, switchMap, takeUntil, tap } from "rxjs/operators";
import { AuthRequestServiceAbstraction } from "@bitwarden/auth/common";
import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service"; import { VaultTimeoutSettingsService } from "@bitwarden/common/abstractions/vault-timeout/vault-timeout-settings.service";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums"; import { PolicyType } from "@bitwarden/common/admin-console/enums";
@ -20,6 +21,7 @@ import { BiometricStateService } from "@bitwarden/common/platform/biometrics/bio
import { ThemeType, KeySuffixOptions } from "@bitwarden/common/platform/enums"; import { ThemeType, KeySuffixOptions } from "@bitwarden/common/platform/enums";
import { Utils } from "@bitwarden/common/platform/misc/utils"; import { Utils } from "@bitwarden/common/platform/misc/utils";
import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service"; import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
import { UserId } from "@bitwarden/common/types/guid";
import { DialogService } from "@bitwarden/components"; import { DialogService } from "@bitwarden/components";
import { SetPinComponent } from "../../auth/components/set-pin.component"; import { SetPinComponent } from "../../auth/components/set-pin.component";
@ -60,6 +62,7 @@ export class SettingsComponent implements OnInit {
showAppPreferences = true; showAppPreferences = true;
currentUserEmail: string; currentUserEmail: string;
currentUserId: UserId;
availableVaultTimeoutActions$: Observable<VaultTimeoutAction[]>; availableVaultTimeoutActions$: Observable<VaultTimeoutAction[]>;
vaultTimeoutPolicyCallout: Observable<{ vaultTimeoutPolicyCallout: Observable<{
@ -122,6 +125,7 @@ export class SettingsComponent implements OnInit {
private desktopSettingsService: DesktopSettingsService, private desktopSettingsService: DesktopSettingsService,
private biometricStateService: BiometricStateService, private biometricStateService: BiometricStateService,
private desktopAutofillSettingsService: DesktopAutofillSettingsService, private desktopAutofillSettingsService: DesktopAutofillSettingsService,
private authRequestService: AuthRequestServiceAbstraction,
) { ) {
const isMac = this.platformUtilsService.getDevice() === DeviceType.MacOsDesktop; const isMac = this.platformUtilsService.getDevice() === DeviceType.MacOsDesktop;
@ -207,6 +211,7 @@ export class SettingsComponent implements OnInit {
return; return;
} }
this.currentUserEmail = await this.stateService.getEmail(); this.currentUserEmail = await this.stateService.getEmail();
this.currentUserId = (await this.stateService.getUserId()) as UserId;
this.availableVaultTimeoutActions$ = this.refreshTimeoutSettings$.pipe( this.availableVaultTimeoutActions$ = this.refreshTimeoutSettings$.pipe(
switchMap(() => this.vaultTimeoutSettingsService.availableVaultTimeoutActions$()), switchMap(() => this.vaultTimeoutSettingsService.availableVaultTimeoutActions$()),
@ -249,7 +254,8 @@ export class SettingsComponent implements OnInit {
requirePasswordOnStart: await firstValueFrom( requirePasswordOnStart: await firstValueFrom(
this.biometricStateService.requirePasswordOnStart$, this.biometricStateService.requirePasswordOnStart$,
), ),
approveLoginRequests: (await this.stateService.getApproveLoginRequests()) ?? false, approveLoginRequests:
(await this.authRequestService.getAcceptAuthRequests(this.currentUserId)) ?? false,
clearClipboard: await firstValueFrom(this.autofillSettingsService.clearClipboardDelay$), clearClipboard: await firstValueFrom(this.autofillSettingsService.clearClipboardDelay$),
minimizeOnCopyToClipboard: await this.stateService.getMinimizeOnCopyToClipboard(), minimizeOnCopyToClipboard: await this.stateService.getMinimizeOnCopyToClipboard(),
enableFavicons: await firstValueFrom(this.domainSettingsService.showFavicons$), enableFavicons: await firstValueFrom(this.domainSettingsService.showFavicons$),
@ -665,7 +671,10 @@ export class SettingsComponent implements OnInit {
} }
async updateApproveLoginRequests() { async updateApproveLoginRequests() {
await this.stateService.setApproveLoginRequests(this.form.value.approveLoginRequests); await this.authRequestService.setAcceptAuthRequests(
this.form.value.approveLoginRequests,
this.currentUserId,
);
} }
ngOnDestroy() { ngOnDestroy() {

View File

@ -10,6 +10,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl
import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password"; import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username"; import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { GeneratorComponent } from "./generator.component"; import { GeneratorComponent } from "./generator.component";
@ -54,6 +55,10 @@ describe("GeneratorComponent", () => {
provide: LogService, provide: LogService,
useValue: mock<LogService>(), useValue: mock<LogService>(),
}, },
{
provide: CipherService,
useValue: mock<CipherService>(),
},
], ],
schemas: [NO_ERRORS_SCHEMA], schemas: [NO_ERRORS_SCHEMA],
}).compileComponents(); }).compileComponents();

View File

@ -2698,9 +2698,9 @@
"message": "Activeu l'acceleració i reinicieu el maquinari" "message": "Activeu l'acceleració i reinicieu el maquinari"
}, },
"removePasskey": { "removePasskey": {
"message": "Remove passkey" "message": "Suprimeix la clau de pas"
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Clau de pas suprimida"
} }
} }

View File

@ -2698,9 +2698,9 @@
"message": "Hardwarebeschleunigung aktivieren und neu starten" "message": "Hardwarebeschleunigung aktivieren und neu starten"
}, },
"removePasskey": { "removePasskey": {
"message": "Passkey löschen" "message": "Passkey entfernen"
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey gelöscht" "message": "Passkey entfernt"
} }
} }

View File

@ -800,8 +800,11 @@
"changeMasterPass": { "changeMasterPass": {
"message": "Change master password" "message": "Change master password"
}, },
"changeMasterPasswordConfirmation": { "continueToWebApp": {
"message": "You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?" "message": "Continue to web app?"
},
"changeMasterPasswordOnWebConfirmation": {
"message": "You can change your master password on the Bitwarden web app."
}, },
"fingerprintPhrase": { "fingerprintPhrase": {
"message": "Fingerprint phrase", "message": "Fingerprint phrase",
@ -2702,5 +2705,11 @@
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Passkey removed"
},
"errorAssigningTargetCollection": {
"message": "Error assigning target collection."
},
"errorAssigningTargetFolder": {
"message": "Error assigning target folder."
} }
} }

View File

@ -2689,7 +2689,7 @@
"description": "Label indicating the most common import formats" "description": "Label indicating the most common import formats"
}, },
"troubleshooting": { "troubleshooting": {
"message": "Vianselvitys" "message": "Vianetsintä"
}, },
"disableHardwareAccelerationRestart": { "disableHardwareAccelerationRestart": {
"message": "Poista laitteistokiihdytys käytöstä ja käynnistä sovellus uudelleen" "message": "Poista laitteistokiihdytys käytöstä ja käynnistä sovellus uudelleen"

View File

@ -2480,13 +2480,13 @@
"message": "Перейти к содержимому" "message": "Перейти к содержимому"
}, },
"typePasskey": { "typePasskey": {
"message": "Ключ доступа" "message": "Passkey"
}, },
"passkeyNotCopied": { "passkeyNotCopied": {
"message": "Ключ доступа не будет скопирован" "message": "Passkey не будет скопирован"
}, },
"passkeyNotCopiedAlert": { "passkeyNotCopiedAlert": {
"message": "Ключ доступа не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?" "message": "Passkey не будет скопирован в клонированный элемент. Продолжить клонирование этого элемента?"
}, },
"aliasDomain": { "aliasDomain": {
"message": "Псевдоним домена" "message": "Псевдоним домена"

View File

@ -2689,7 +2689,7 @@
"description": "Label indicating the most common import formats" "description": "Label indicating the most common import formats"
}, },
"troubleshooting": { "troubleshooting": {
"message": "Troubleshooting" "message": "Felsökning"
}, },
"disableHardwareAccelerationRestart": { "disableHardwareAccelerationRestart": {
"message": "Disable hardware acceleration and restart" "message": "Disable hardware acceleration and restart"
@ -2698,9 +2698,9 @@
"message": "Enable hardware acceleration and restart" "message": "Enable hardware acceleration and restart"
}, },
"removePasskey": { "removePasskey": {
"message": "Remove passkey" "message": "Ta bort nyckel"
}, },
"passkeyRemoved": { "passkeyRemoved": {
"message": "Passkey removed" "message": "Nyckel borttagen"
} }
} }

View File

@ -1907,7 +1907,7 @@
"message": "无法完成生物识别。" "message": "无法完成生物识别。"
}, },
"needADifferentMethod": { "needADifferentMethod": {
"message": "Need a different method?" "message": "使用其他方式?"
}, },
"useMasterPassword": { "useMasterPassword": {
"message": "使用主密码" "message": "使用主密码"

View File

@ -65,10 +65,10 @@ export class AccountMenu implements IMenubarMenu {
id: "changeMasterPass", id: "changeMasterPass",
click: async () => { click: async () => {
const result = await dialog.showMessageBox(this._window, { const result = await dialog.showMessageBox(this._window, {
title: this.localize("changeMasterPass"), title: this.localize("continueToWebApp"),
message: this.localize("changeMasterPass"), message: this.localize("continueToWebApp"),
detail: this.localize("changeMasterPasswordConfirmation"), detail: this.localize("changeMasterPasswordOnWebConfirmation"),
buttons: [this.localize("yes"), this.localize("no")], buttons: [this.localize("continue"), this.localize("cancel")],
cancelId: 1, cancelId: 1,
defaultId: 0, defaultId: 0,
noLink: true, noLink: true,

View File

@ -1,12 +1,12 @@
{ {
"name": "@bitwarden/desktop", "name": "@bitwarden/desktop",
"version": "2024.4.1", "version": "2024.4.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@bitwarden/desktop", "name": "@bitwarden/desktop",
"version": "2024.4.1", "version": "2024.4.2",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@bitwarden/desktop-native": "file:../desktop_native", "@bitwarden/desktop-native": "file:../desktop_native",

View File

@ -2,7 +2,7 @@
"name": "@bitwarden/desktop", "name": "@bitwarden/desktop",
"productName": "Bitwarden", "productName": "Bitwarden",
"description": "A secure and free password manager for all of your devices.", "description": "A secure and free password manager for all of your devices.",
"version": "2024.4.1", "version": "2024.4.2",
"author": "Bitwarden Inc. <hello@bitwarden.com> (https://bitwarden.com)", "author": "Bitwarden Inc. <hello@bitwarden.com> (https://bitwarden.com)",
"homepage": "https://bitwarden.com", "homepage": "https://bitwarden.com",
"license": "GPL-3.0", "license": "GPL-3.0",

View File

@ -75,6 +75,7 @@ export class AddEditComponent extends BaseAddEditComponent implements OnChanges,
async ngOnInit() { async ngOnInit() {
await super.ngOnInit(); await super.ngOnInit();
await this.load();
this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => { this.broadcasterService.subscribe(BroadcasterSubscriptionId, async (message: any) => {
this.ngZone.run(() => { this.ngZone.run(() => {
switch (message.command) { switch (message.command) {

View File

@ -8,7 +8,7 @@ import {
ViewContainerRef, ViewContainerRef,
} from "@angular/core"; } from "@angular/core";
import { ActivatedRoute, Router } from "@angular/router"; import { ActivatedRoute, Router } from "@angular/router";
import { Subject, takeUntil } from "rxjs"; import { firstValueFrom, Subject, takeUntil } from "rxjs";
import { first } from "rxjs/operators"; import { first } from "rxjs/operators";
import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref"; import { ModalRef } from "@bitwarden/angular/components/modal/modal.ref";
@ -16,13 +16,13 @@ import { ModalService } from "@bitwarden/angular/services/modal.service";
import { VaultFilter } from "@bitwarden/angular/vault/vault-filter/models/vault-filter.model"; import { VaultFilter } from "@bitwarden/angular/vault/vault-filter/models/vault-filter.model";
import { ApiService } from "@bitwarden/common/abstractions/api.service"; import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service"; import { EventCollectionService } from "@bitwarden/common/abstractions/event/event-collection.service";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service"; import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
import { EventType } from "@bitwarden/common/enums"; import { EventType } from "@bitwarden/common/enums";
import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service"; import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service"; import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction";
import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service"; import { TotpService } from "@bitwarden/common/vault/abstractions/totp.service";
import { CipherType } from "@bitwarden/common/vault/enums"; import { CipherType } from "@bitwarden/common/vault/enums";
@ -32,6 +32,7 @@ import { FolderView } from "@bitwarden/common/vault/models/view/folder.view";
import { DialogService } from "@bitwarden/components"; import { DialogService } from "@bitwarden/components";
import { PasswordRepromptService } from "@bitwarden/vault"; import { PasswordRepromptService } from "@bitwarden/vault";
import { AuthRequestServiceAbstraction } from "../../../../../../libs/auth/src/common/abstractions";
import { SearchBarService } from "../../../app/layout/search/search-bar.service"; import { SearchBarService } from "../../../app/layout/search/search-bar.service";
import { GeneratorComponent } from "../../../app/tools/generator.component"; import { GeneratorComponent } from "../../../app/tools/generator.component";
import { invokeMenu, RendererMenuItem } from "../../../utils"; import { invokeMenu, RendererMenuItem } from "../../../utils";
@ -102,11 +103,12 @@ export class VaultComponent implements OnInit, OnDestroy {
private eventCollectionService: EventCollectionService, private eventCollectionService: EventCollectionService,
private totpService: TotpService, private totpService: TotpService,
private passwordRepromptService: PasswordRepromptService, private passwordRepromptService: PasswordRepromptService,
private stateService: StateService,
private searchBarService: SearchBarService, private searchBarService: SearchBarService,
private apiService: ApiService, private apiService: ApiService,
private dialogService: DialogService, private dialogService: DialogService,
private billingAccountProfileStateService: BillingAccountProfileStateService, private billingAccountProfileStateService: BillingAccountProfileStateService,
private authRequestService: AuthRequestServiceAbstraction,
private accountService: AccountService,
) {} ) {}
async ngOnInit() { async ngOnInit() {
@ -224,7 +226,8 @@ export class VaultComponent implements OnInit, OnDestroy {
this.searchBarService.setEnabled(true); this.searchBarService.setEnabled(true);
this.searchBarService.setPlaceholderText(this.i18nService.t("searchVault")); this.searchBarService.setPlaceholderText(this.i18nService.t("searchVault"));
const approveLoginRequests = await this.stateService.getApproveLoginRequests(); const userId = (await firstValueFrom(this.accountService.activeAccount$)).id;
const approveLoginRequests = await this.authRequestService.getAcceptAuthRequests(userId);
if (approveLoginRequests) { if (approveLoginRequests) {
const authRequest = await this.apiService.getLastAuthRequest(); const authRequest = await this.apiService.getLastAuthRequest();
if (authRequest != null) { if (authRequest != null) {

Some files were not shown because too many files have changed in this diff Show More