diff --git a/jslib b/jslib index 02774724..c2e434e3 160000 --- a/jslib +++ b/jslib @@ -1 +1 @@ -Subproject commit 027747246c9c15b976ad1aa0a1df563afaa9de21 +Subproject commit c2e434e33346a1bc791b50d6dddeb87f1349b0f3 diff --git a/src/app/accounts/update-temp-password.component.html b/src/app/accounts/update-temp-password.component.html new file mode 100644 index 00000000..59685dee --- /dev/null +++ b/src/app/accounts/update-temp-password.component.html @@ -0,0 +1,81 @@ +
+
+
+

{{'updateMasterPassword' | i18n}}

+
+
+ {{'updateMasterPasswordWarning' | i18n}} + +
+ + {{'masterPasswordPolicyInEffect' | i18n}} +
    +
  • + {{'policyInEffectMinComplexity' | i18n : getPasswordScoreAlertDisplay()}} +
  • +
  • + {{'policyInEffectMinLength' | i18n : enforcedPolicyOptions?.minLength.toString()}} +
  • +
  • + {{'policyInEffectUppercase' | i18n}}
  • +
  • + {{'policyInEffectLowercase' | i18n}}
  • +
  • + {{'policyInEffectNumbers' | i18n}}
  • +
  • + {{'policyInEffectSpecial' | i18n : '!@#$%^&*'}}
  • +
+
+ +
+
+ + + +
+
+ + +
+
+
+
+ +
+ + +
+
+
+ + + {{'masterPassHintDesc' | i18n}} +
+
+
+ + +
+
+
+
+
+
diff --git a/src/app/accounts/update-temp-password.component.ts b/src/app/accounts/update-temp-password.component.ts new file mode 100644 index 00000000..2ae67464 --- /dev/null +++ b/src/app/accounts/update-temp-password.component.ts @@ -0,0 +1,27 @@ +import { Component } from '@angular/core'; + +import { ApiService } from 'jslib-common/abstractions/api.service'; +import { CryptoService } from 'jslib-common/abstractions/crypto.service'; +import { I18nService } from 'jslib-common/abstractions/i18n.service'; +import { MessagingService } from 'jslib-common/abstractions/messaging.service'; +import { PasswordGenerationService } from 'jslib-common/abstractions/passwordGeneration.service'; +import { PlatformUtilsService } from 'jslib-common/abstractions/platformUtils.service'; +import { PolicyService } from 'jslib-common/abstractions/policy.service'; +import { UserService } from 'jslib-common/abstractions/user.service'; + +import { UpdateTempPasswordComponent as BaseUpdateTempPasswordComponent } from 'jslib-angular/components/update-temp-password.component'; + +@Component({ + selector: 'app-update-temp-password', + templateUrl: 'update-temp-password.component.html', +}) + +export class UpdateTempPasswordComponent extends BaseUpdateTempPasswordComponent { + constructor(i18nService: I18nService, platformUtilsService: PlatformUtilsService, + passwordGenerationService: PasswordGenerationService, policyService: PolicyService, + cryptoService: CryptoService, userService: UserService, + messagingService: MessagingService, apiService: ApiService) { + super(i18nService, platformUtilsService, passwordGenerationService, policyService, cryptoService, + userService, messagingService, apiService); + } +} diff --git a/src/app/oss-routing.module.ts b/src/app/oss-routing.module.ts index eb712de2..85e47a41 100644 --- a/src/app/oss-routing.module.ts +++ b/src/app/oss-routing.module.ts @@ -19,6 +19,7 @@ import { RegisterComponent } from './accounts/register.component'; import { SetPasswordComponent } from './accounts/set-password.component'; import { SsoComponent } from './accounts/sso.component'; import { TwoFactorComponent } from './accounts/two-factor.component'; +import { UpdateTempPasswordComponent } from './accounts/update-temp-password.component'; import { VerifyEmailTokenComponent } from './accounts/verify-email-token.component'; import { VerifyRecoverDeleteComponent } from './accounts/verify-recover-delete.component'; @@ -163,6 +164,12 @@ const routes: Routes = [ component: AccessComponent, data: { title: 'Bitwarden Send' }, }, + { + path: 'update-temp-password', + component: UpdateTempPasswordComponent, + canActivate: [AuthGuardService], + data: { titleId: 'updateTempPassword' }, + }, ], }, { diff --git a/src/app/oss.module.ts b/src/app/oss.module.ts index 26c20258..2c926bdd 100644 --- a/src/app/oss.module.ts +++ b/src/app/oss.module.ts @@ -35,6 +35,7 @@ import { SetPasswordComponent } from './accounts/set-password.component'; import { SsoComponent } from './accounts/sso.component'; import { TwoFactorOptionsComponent } from './accounts/two-factor-options.component'; import { TwoFactorComponent } from './accounts/two-factor.component'; +import { UpdateTempPasswordComponent } from './accounts/update-temp-password.component'; import { VerifyEmailTokenComponent } from './accounts/verify-email-token.component'; import { VerifyRecoverDeleteComponent } from './accounts/verify-recover-delete.component'; @@ -426,6 +427,7 @@ registerLocaleData(localeZhTw, 'zh-TW'); UnsecuredWebsitesReportComponent, UpdateKeyComponent, UpdateLicenseComponent, + UpdateTempPasswordComponent, UserBillingComponent, UserLayoutComponent, UserSubscriptionComponent, diff --git a/src/app/services/event.service.ts b/src/app/services/event.service.ts index 7a6bef3f..75e1de83 100644 --- a/src/app/services/event.service.ts +++ b/src/app/services/event.service.ts @@ -71,6 +71,9 @@ export class EventService { case EventType.User_ClientExportedVault: msg = humanReadableMsg = this.i18nService.t('exportedVault'); break; + case EventType.User_UpdatedTempPassword: + msg = humanReadableMsg = this.i18nService.t('updatedMasterPassword'); + break; // Cipher case EventType.Cipher_Created: msg = this.i18nService.t('createdItemId', this.formatCipherId(ev, options)); diff --git a/src/app/vault/vault.component.ts b/src/app/vault/vault.component.ts index c60d293a..157307d4 100644 --- a/src/app/vault/vault.component.ts +++ b/src/app/vault/vault.component.ts @@ -88,6 +88,10 @@ export class VaultComponent implements OnInit, OnDestroy { const queryParamsSub = this.route.queryParams.subscribe(async params => { await this.syncService.fullSync(false); + if (await this.userService.getForcePasswordReset()) { + this.router.navigate(['update-temp-password']); + } + this.showUpdateKey = !(await this.cryptoService.hasEncKey()); const canAccessPremium = await this.userService.canAccessPremium(); this.showPremiumCallout = !this.showVerifyEmail && !canAccessPremium && diff --git a/src/locales/en/messages.json b/src/locales/en/messages.json index 925bd977..3025961e 100644 --- a/src/locales/en/messages.json +++ b/src/locales/en/messages.json @@ -4180,5 +4180,14 @@ }, "add": { "message": "Add" + }, + "updatedMasterPassword": { + "message": "Updated Master Password" + }, + "updateMasterPassword": { + "message": "Update Master Password" + }, + "updateMasterPasswordWarning": { + "message": "Your Master Password was recently changed by an administrator in your organization. In order to access the vault, you must update your Master Password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour." } }