diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 8ac65d257c6..8170f1eef00 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -738,7 +738,7 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json - "### MacOS GitHub build number: $env:BUILD_NUMBER" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append + Write-Output "### MacOS GitHub build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci @@ -879,6 +879,13 @@ jobs: with: creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} + - name: Retrieve Slack secret + id: retrieve-slack-secret + uses: bitwarden/gh-actions/get-keyvault-secrets@main + with: + keyvault: bitwarden-ci + secrets: "slack-bot-token" + - name: Download Provisioning Profiles secrets env: ACCOUNT_NAME: bitwardenci @@ -955,7 +962,7 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json - "### MacOS App Store build number: $env:BUILD_NUMBER" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append + Write-Output "### MacOS App Store build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci @@ -1016,16 +1023,60 @@ jobs: if-no-files-found: error - name: Deploy to TestFlight + id: testflight-deploy if: | (github.ref == 'refs/heads/main' - && needs.setup.outputs.rc_branch_exists == 0 - && needs.setup.outputs.hotfix_branch_exists == 0) - || (github.ref == 'refs/heads/rc' && needs.setup.outputs.hotfix_branch_exists == 0) - || github.ref == 'refs/heads/hotfix-rc-desktop' + || github.ref == 'refs/heads/rc' + || github.ref == 'refs/heads/hotfix-rc-desktop') env: APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} APP_STORE_CONNECT_AUTH_KEY: 6TV9MKN3GP - run: npm run upload:mas + run: | + xcrun altool \ + --upload-app \ + --type macos \ + --file "$(find ./dist/mas-universal/Bitwarden*.pkg)" \ + --apiKey $APP_STORE_CONNECT_AUTH_KEY \ + --apiIssuer $APP_STORE_CONNECT_TEAM_ISSUER \ + &> output.txt + + UUID=$(cat output.txt | grep "Delivery UUID" | sed -E 's/Delivery UUID: (.*)/\1/') + echo "uuid=$UUID" >> $GITHUB_OUTPUT + + - name: Post message to a Slack channel + id: slack-message + if: | + (github.ref == 'refs/heads/main' + || github.ref == 'refs/heads/rc' + || github.ref == 'refs/heads/hotfix-rc-desktop') + uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 + with: + channel-id: C074F5UESQ0 + payload: | + { + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Desktop client v${{ env._PACKAGE_VERSION }} <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|build> success on *${{ github.ref_name }}*" + }, + "accessory": { + "type": "button", + "text": { + "type": "plain_text", + "text": "TestFlight Build", + "emoji": true + }, + "url": "https://appstoreconnect.apple.com/teams/${{ env.APP_STORE_CONNECT_TEAM_ISSUER }}/apps/1352778147/testflight/macos/${{ env.BUILD_UUID }}" + } + } + ] + } + env: + APP_STORE_CONNECT_TEAM_ISSUER: ${{ secrets.APP_STORE_CONNECT_TEAM_ISSUER }} + SLACK_BOT_TOKEN: ${{ steps.retrieve-slack-secret.outputs.slack-bot-token }} + BUILD_UUID: ${{ steps.testflight-deploy.outputs.uuid }} macos-package-dev: @@ -1158,7 +1209,7 @@ jobs: $package = Get-Content -Raw -Path electron-builder.json | ConvertFrom-Json $package | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER" $package | ConvertTo-Json -Depth 32 | Set-Content -Path electron-builder.json - "### MacOS Dev build number: $env:BUILD_NUMBER" | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Append + Write-Output "### MacOS Dev build number: $env:BUILD_NUMBER" - name: Install Node dependencies run: npm ci diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index fc30996e850..71e7d3c10aa 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -83,8 +83,7 @@ jobs: with: keyvault: "bitwarden-ci" secrets: "github-gpg-private-key, - github-gpg-private-key-passphrase, - github-pat-bitwarden-devops-bot-repo-scope" + github-gpg-private-key-passphrase" - name: Import GPG key uses: crazy-max/ghaction-import-gpg@01dd5d3ca463c7f10f7f4f7b4f177225ac661ee4 # v6.1.0 @@ -447,11 +446,19 @@ jobs: echo "$MESSAGE" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV + - name: Generate GH App token + uses: actions/create-github-app-token@3378cda945da322a8db4b193e19d46352ebe2de5 # v1.10.4 + id: app-token + with: + app-id: ${{ secrets.BW_GHAPP_ID }} + private-key: ${{ secrets.BW_GHAPP_KEY }} + owner: ${{ github.repository_owner }} + - name: Create Version PR if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} id: create-pr env: - GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} + GH_TOKEN: ${{ steps.app-token.outputs.token }} PR_BRANCH: ${{ steps.create-branch.outputs.name }} TITLE: "Bump client(s) version" run: | @@ -483,7 +490,7 @@ jobs: - name: Merge PR if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} env: - GH_TOKEN: ${{ steps.retrieve-secrets.outputs.github-pat-bitwarden-devops-bot-repo-scope }} + GH_TOKEN: ${{ steps.app-token.outputs.token }} PR_NUMBER: ${{ steps.create-pr.outputs.pr_number }} run: gh pr merge $PR_NUMBER --squash --auto --delete-branch diff --git a/apps/browser/src/_locales/en/messages.json b/apps/browser/src/_locales/en/messages.json index b8d3a2d47cd..764b8b5611c 100644 --- a/apps/browser/src/_locales/en/messages.json +++ b/apps/browser/src/_locales/en/messages.json @@ -328,7 +328,7 @@ "createFoldersToOrganize": { "message": "Create folders to organize your vault items" }, - "deleteFolderPermanently":{ + "deleteFolderPermanently": { "message": "Are you sure you want to permanently delete this folder?" }, "deleteFolder": { @@ -561,6 +561,9 @@ "sessionTimeoutHeader": { "message": "Session timeout" }, + "vaultTimeoutHeader": { + "message": "Vault timeout" + }, "otherOptions": { "message": "Other options" }, @@ -601,6 +604,9 @@ "vaultTimeout": { "message": "Vault timeout" }, + "vaultTimeout1": { + "message": "Timeout" + }, "lockNow": { "message": "Lock now" }, @@ -801,6 +807,12 @@ "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?" }, + "twoStepLoginConfirmationContent": { + "message": "Make your account more secure by setting up two-step login in the Bitwarden web app." + }, + "twoStepLoginConfirmationTitle": { + "message": "Continue to web app?" + }, "editedFolder": { "message": "Folder saved" }, @@ -1875,9 +1887,18 @@ "unlockWithPin": { "message": "Unlock with PIN" }, + "setYourPinTitle": { + "message": "Set PIN" + }, + "setYourPinButton": { + "message": "Set PIN" + }, "setYourPinCode": { "message": "Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application." }, + "setYourPinCode1": { + "message": "Your PIN will be used to unlock Bitwarden instead of your master password. Your PIN will reset if you ever fully log out of Bitwarden." + }, "pinRequired": { "message": "PIN code is required." }, @@ -1899,6 +1920,9 @@ "lockWithMasterPassOnRestart": { "message": "Lock with master password on browser restart" }, + "lockWithMasterPassOnRestart1": { + "message": "Require master password on browser restart" + }, "selectOneCollection": { "message": "You must select at least one collection." }, @@ -1921,7 +1945,7 @@ "message": "Use this password" }, "useThisUsername": { - "message": "Use this username" + "message": "Use this username" }, "securePasswordGenerated": { "message": "Secure password generated! Don't forget to also update your password on the website." @@ -1937,6 +1961,9 @@ "vaultTimeoutAction": { "message": "Vault timeout action" }, + "vaultTimeoutAction1": { + "message": "Timeout action" + }, "lock": { "message": "Lock", "description": "Verb form: to make secure or inaccessible by" @@ -2131,12 +2158,12 @@ "nativeMessagingWrongUserTitle": { "message": "Account missmatch" }, - "nativeMessagingWrongUserKeyDesc": { - "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." - }, "nativeMessagingWrongUserKeyTitle": { "message": "Biometric key missmatch" }, + "nativeMessagingWrongUserKeyDesc": { + "message": "Biometric unlock failed. The biometric secret key failed to unlock the vault. Please try to set up biometrics again." + }, "biometricsNotEnabledTitle": { "message": "Biometrics not set up" }, @@ -2522,6 +2549,9 @@ "minutes": { "message": "Minutes" }, + "vaultTimeoutPolicyAffectingOptions": { + "message": "Enterprise policy requirements have been applied to your timeout options" + }, "vaultTimeoutPolicyInEffect": { "message": "Your organization policies have set your maximum allowed vault timeout to $HOURS$ hour(s) and $MINUTES$ minute(s).", "placeholders": { @@ -2535,6 +2565,32 @@ } } }, + "vaultTimeoutPolicyInEffect1": { + "message": "$HOURS$ hour(s) and $MINUTES$ minute(s) maximum.", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, + "vaultTimeoutPolicyMaximumError": { + "message": "Timeout exceeds the restriction set by your organization: $HOURS$ hour(s) and $MINUTES$ minute(s) maximum", + "placeholders": { + "hours": { + "content": "$1", + "example": "5" + }, + "minutes": { + "content": "$2", + "example": "5" + } + } + }, "vaultTimeoutPolicyWithActionInEffect": { "message": "Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is $HOURS$ hour(s) and $MINUTES$ minute(s). Your vault timeout action is set to $ACTION$.", "placeholders": { @@ -3264,7 +3320,7 @@ "message": "Unlock your account, opens in a new window", "description": "Screen reader text (aria-label) for unlock account button in overlay" }, - "fillCredentialsFor": { + "fillCredentialsFor": { "message": "Fill credentials for", "description": "Screen reader text for when overlay item is in focused" }, @@ -4321,6 +4377,15 @@ "enterprisePolicyRequirementsApplied": { "message": "Enterprise policy requirements have been applied to this setting" }, + "retry": { + "message": "Retry" + }, + "vaultCustomTimeoutMinimum": { + "message": "Minimum custom timeout is 1 minute." + }, + "additionalContentAvailable": { + "message": "Additional content is available" + }, "fileSavedToDevice": { "message": "File saved to device. Manage from your device downloads." }, diff --git a/apps/browser/src/auth/popup/components/set-pin.component.html b/apps/browser/src/auth/popup/components/set-pin.component.html index 50e7aca75f3..80e1b63c7d7 100644 --- a/apps/browser/src/auth/popup/components/set-pin.component.html +++ b/apps/browser/src/auth/popup/components/set-pin.component.html @@ -1,11 +1,11 @@