1
0
mirror of https://github.com/bitwarden/desktop.git synced 2024-11-24 11:55:50 +01:00

Merge pull request #458 from Hinton/feature/hide-passwords

Add support for hidden password
This commit is contained in:
Chad Scharf 2020-06-11 15:01:07 -04:00 committed by GitHub
commit 5ea459a347
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 12 deletions

2
jslib

@ -1 +1 @@
Subproject commit 212a2e3745e6e0e2b3057ed308c47daf6aeefbc8 Subproject commit 2b6657a293e7be107271ad080c64ccd3f005afb7

View File

@ -28,9 +28,9 @@
<label for="loginPassword">{{'password' | i18n}}</label> <label for="loginPassword">{{'password' | i18n}}</label>
<input id="loginPassword" class="monospaced" <input id="loginPassword" class="monospaced"
type="{{showPassword ? 'text' : 'password'}}" name="Login.Password" type="{{showPassword ? 'text' : 'password'}}" name="Login.Password"
[(ngModel)]="cipher.login.password"> [(ngModel)]="cipher.login.password" [disabled]="!cipher.viewPassword">
</div> </div>
<div class="action-buttons"> <div class="action-buttons" *ngIf=cipher.viewPassword>
<button type="button" #checkPasswordBtn class="row-btn btn" appBlurClick <button type="button" #checkPasswordBtn class="row-btn btn" appBlurClick
appA11yTitle="{{'checkPassword' | i18n}}" (click)="checkPassword()" appA11yTitle="{{'checkPassword' | i18n}}" (click)="checkPassword()"
[appApiAction]="checkPasswordPromise" [disabled]="checkPasswordBtn.loading"> [appApiAction]="checkPasswordPromise" [disabled]="checkPasswordBtn.loading">
@ -52,8 +52,8 @@
</div> </div>
<div class="box-content-row" appBoxRow> <div class="box-content-row" appBoxRow>
<label for="loginTotp">{{'authenticatorKeyTotp' | i18n}}</label> <label for="loginTotp">{{'authenticatorKeyTotp' | i18n}}</label>
<input id="loginTotp" type="text" name="Login.Totp" class="monospaced" <input id="loginTotp" type="{{cipher.viewPassword ? 'text' : 'password'}}" name="Login.Totp"
[(ngModel)]="cipher.login.totp"> class="monospaced" [(ngModel)]="cipher.login.totp" [disabled]="!cipher.viewPassword">
</div> </div>
</div> </div>
<!-- Card --> <!-- Card -->
@ -281,12 +281,14 @@
*ngIf="f.type === fieldType.Text" placeholder="{{'value' | i18n}}"> *ngIf="f.type === fieldType.Text" placeholder="{{'value' | i18n}}">
<input id="fieldValue{{i}}" type="{{f.showValue ? 'text' : 'password'}}" <input id="fieldValue{{i}}" type="{{f.showValue ? 'text' : 'password'}}"
name="Field.Value{{i}}" [(ngModel)]="f.value" class="monospaced" name="Field.Value{{i}}" [(ngModel)]="f.value" class="monospaced"
*ngIf="f.type === fieldType.Hidden" placeholder="{{'value' | i18n}}"> *ngIf="f.type === fieldType.Hidden" placeholder="{{'value' | i18n}}"
[disabled]="!cipher.viewPassword && !f.newField">
</div> </div>
<input id="fieldValue{{i}}" name="Field.Value{{i}}" type="checkbox" [(ngModel)]="f.value" <input id="fieldValue{{i}}" name="Field.Value{{i}}" type="checkbox" [(ngModel)]="f.value"
*ngIf="f.type === fieldType.Boolean" appTrueFalseValue trueValue="true" *ngIf="f.type === fieldType.Boolean" appTrueFalseValue trueValue="true"
falseValue="false"> falseValue="false">
<div class="action-buttons" *ngIf="f.type === fieldType.Hidden"> <div class="action-buttons"
*ngIf="f.type === fieldType.Hidden && (cipher.viewPassword || f.newField)">
<a class="row-btn" href="#" appStopClick appBlurClick role="button" <a class="row-btn" href="#" appStopClick appBlurClick role="button"
appA11yTitle="{{'toggleVisibility' | i18n}}" (click)="toggleFieldValue(f)"> appA11yTitle="{{'toggleVisibility' | i18n}}" (click)="toggleFieldValue(f)">
<i class="fa fa-lg" aria-hidden="true" <i class="fa fa-lg" aria-hidden="true"

View File

@ -166,7 +166,7 @@ export class VaultComponent implements OnInit, OnDestroy {
const pComponent = this.addEditComponent == null ? this.viewComponent : this.addEditComponent; const pComponent = this.addEditComponent == null ? this.viewComponent : this.addEditComponent;
const pCipher = pComponent != null ? pComponent.cipher : null; const pCipher = pComponent != null ? pComponent.cipher : null;
if (this.cipherId != null && pCipher != null && pCipher.id === this.cipherId && if (this.cipherId != null && pCipher != null && pCipher.id === this.cipherId &&
pCipher.login != null && pCipher.login.password != null) { pCipher.login != null && pCipher.login.password != null && pCipher.viewPassword) {
this.copyValue(pCipher.login.password, 'password'); this.copyValue(pCipher.login.password, 'password');
} }
break; break;
@ -299,7 +299,7 @@ export class VaultComponent implements OnInit, OnDestroy {
click: () => this.copyValue(cipher.login.username, 'username'), click: () => this.copyValue(cipher.login.username, 'username'),
})); }));
} }
if (cipher.login.password != null) { if (cipher.login.password != null && cipher.viewPassword) {
menu.append(new remote.MenuItem({ menu.append(new remote.MenuItem({
label: this.i18nService.t('copyPassword'), label: this.i18nService.t('copyPassword'),
click: () => { click: () => {

View File

@ -33,7 +33,7 @@
<div [hidden]="!showPassword" class="monospaced password-wrapper" appSelectCopy <div [hidden]="!showPassword" class="monospaced password-wrapper" appSelectCopy
[innerHTML]="cipher.login.password | colorPassword"></div> [innerHTML]="cipher.login.password | colorPassword"></div>
</div> </div>
<div class="action-buttons"> <div class="action-buttons" *ngIf=cipher.viewPassword>
<button type="button" #checkPasswordBtn class="row-btn btn" appBlurClick <button type="button" #checkPasswordBtn class="row-btn btn" appBlurClick
appA11yTitle="{{'checkPassword' | i18n}}" (click)="checkPassword()" appA11yTitle="{{'checkPassword' | i18n}}" (click)="checkPassword()"
[appApiAction]="checkPasswordPromise" [disabled]="checkPasswordBtn.loading"> [appApiAction]="checkPasswordPromise" [disabled]="checkPasswordBtn.loading">
@ -221,12 +221,13 @@
</div> </div>
<div class="action-buttons"> <div class="action-buttons">
<a class="row-btn" href="#" appStopClick appA11yTitle="{{'toggleVisibility' | i18n}}" <a class="row-btn" href="#" appStopClick appA11yTitle="{{'toggleVisibility' | i18n}}"
*ngIf="field.type === fieldType.Hidden" (click)="toggleFieldValue(field)" role="button"> *ngIf="field.type === fieldType.Hidden && cipher.viewPassword"
(click)="toggleFieldValue(field)" role="button">
<i class="fa fa-lg" aria-hidden="true" <i class="fa fa-lg" aria-hidden="true"
[ngClass]="{'fa-eye': !field.showValue, 'fa-eye-slash': field.showValue}"></i> [ngClass]="{'fa-eye': !field.showValue, 'fa-eye-slash': field.showValue}"></i>
</a> </a>
<a class="row-btn" href="#" appStopClick appA11yTitle="{{'copyValue' | i18n}}" <a class="row-btn" href="#" appStopClick appA11yTitle="{{'copyValue' | i18n}}"
*ngIf="field.value && field.type !== fieldType.Boolean" *ngIf="field.value && field.type !== fieldType.Boolean && !(field.type === fieldType.Hidden && !cipher.viewPassword)"
(click)="copy(field.value, 'value', field.type === fieldType.Hidden ? 'H_Field' : 'Field')" (click)="copy(field.value, 'value', field.type === fieldType.Hidden ? 'H_Field' : 'Field')"
role="button"> role="button">
<i class="fa fa-lg fa-clipboard" aria-hidden="true"></i> <i class="fa fa-lg fa-clipboard" aria-hidden="true"></i>