mirror of
https://github.com/bitwarden/web
synced 2025-12-11 13:53:17 +00:00
Admin config for master password policy (#463)
* Admin config for master password policy * UI cleanup and master pass options improvements * ui tweaks
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
|
<i class="fa fa-spinner fa-spin text-muted" title="{{'loading' | i18n}}" aria-hidden="true"></i>
|
||||||
<span class="sr-only">{{'loading' | i18n}}</span>
|
<span class="sr-only">{{'loading' | i18n}}</span>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<table class="table table-hover table-list">
|
<table class="table table-hover table-list" *ngIf="!loading">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr *ngFor="let p of policies">
|
<tr *ngFor="let p of policies">
|
||||||
<td>
|
<td>
|
||||||
|
|||||||
@@ -21,27 +21,68 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<ng-container *ngIf="type === policyType.MasterPassword">
|
<ng-container *ngIf="type === policyType.MasterPassword">
|
||||||
<div class="form-group">
|
<div class="row">
|
||||||
<label for="masterPassMinLength">{{'minLength' | i18n}}</label>
|
<div class="col-6 form-group">
|
||||||
<input id="masterPassMinLength" class="form-control" type="number" name="MasterPassMinLength"
|
<label for="masterPassMinComplexity">{{'minComplexityScore' | i18n}}</label>
|
||||||
[(ngModel)]="masterPassMinLength">
|
<input id="masterPassMinComplexity" class="form-control" type="number"
|
||||||
|
name="MasterPassMinComplexity" [(ngModel)]="masterPassMinComplexity" min="0" max="4">
|
||||||
|
</div>
|
||||||
|
<div class="col-6 form-group">
|
||||||
|
<label for="masterPassMinLength">{{'minLength' | i18n}}</label>
|
||||||
|
<input id="masterPassMinLength" class="form-control" type="number"
|
||||||
|
name="MasterPassMinLength" [(ngModel)]="masterPassMinLength">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" id="masterPassRequireUpper"
|
||||||
|
[(ngModel)]="masterPassRequireUpper" name="MasterPassRequireUpper">
|
||||||
|
<label class="form-check-label" for="masterPassRequireUpper">A-Z</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" id="masterPassRequireLower"
|
||||||
|
[(ngModel)]="masterPassRequireLower" name="MasterPassRequireLower">
|
||||||
|
<label class="form-check-label" for="masterPassRequireLower">a-z</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" id="masterPassRequireNumbers"
|
||||||
|
[(ngModel)]="masterPassRequireNumbers" name="MasterPassRequireNumbers">
|
||||||
|
<label class="form-check-label" for="masterPassRequireNumbers">0-9</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" id="masterPassRequireSpecial"
|
||||||
|
[(ngModel)]="masterPassRequireSpecial" name="MasterPassRequireSpecial">
|
||||||
|
<label class="form-check-label" for="masterPassRequireSpecial">!@#$%^&*</label>
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngIf="type === policyType.PasswordGenerator">
|
<ng-container *ngIf="type === policyType.PasswordGenerator">
|
||||||
<div class="form-group">
|
<div class="row">
|
||||||
<label for="passGenMinLength">{{'minLength' | i18n}}</label>
|
<div class="col-6 form-group">
|
||||||
<input id="passGenMinLength" class="form-control" type="number" name="PassGenMinLength"
|
<label for="passGenMinLength">{{'minLength' | i18n}}</label>
|
||||||
[(ngModel)]="passGenMinLength">
|
<input id="passGenMinLength" class="form-control" type="number" name="PassGenMinLength"
|
||||||
|
[(ngModel)]="passGenMinLength">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="row">
|
||||||
<label for="passGenMinNumbers">{{'minNumbers' | i18n}}</label>
|
<div class="col-6 form-group">
|
||||||
<input id="passGenMinNumbers" class="form-control" type="number" name="PassGenMinNumbers"
|
<label for="passGenMinNumbers">{{'minNumbers' | i18n}}</label>
|
||||||
[(ngModel)]="passGenMinNumbers">
|
<input id="passGenMinNumbers" class="form-control" type="number" name="PassGenMinNumbers"
|
||||||
|
[(ngModel)]="passGenMinNumbers">
|
||||||
|
</div>
|
||||||
|
<div class="col-6 form-group">
|
||||||
|
<label for="passGenMinSpecial">{{'minSpecial' | i18n}}</label>
|
||||||
|
<input id="passGenMinSpecial" class="form-control" type="number" name="PassGenMinSpecial"
|
||||||
|
[(ngModel)]="passGenMinSpecial">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-check">
|
||||||
<label for="passGenMinSpecial">{{'minSpecial' | i18n}}</label>
|
<input class="form-check-input" type="checkbox" id="passGenUseUpper"
|
||||||
<input id="passGenMinSpecial" class="form-control" type="number" name="PassGenMinSpecial"
|
[(ngModel)]="passGenUseUpper" name="PassGenUseUpper">
|
||||||
[(ngModel)]="passGenMinSpecial">
|
<label class="form-check-label" for="passGenUseUpper">A-Z</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" id="passGenUseLower"
|
||||||
|
[(ngModel)]="passGenUseLower" name="PassGenUseLower">
|
||||||
|
<label class="form-check-label" for="passGenUseLower">a-z</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input" type="checkbox" id="passGenUseNumbers"
|
<input class="form-check-input" type="checkbox" id="passGenUseNumbers"
|
||||||
@@ -53,16 +94,6 @@
|
|||||||
[(ngModel)]="passGenUseSpecial" name="PassGenUseSpecial">
|
[(ngModel)]="passGenUseSpecial" name="PassGenUseSpecial">
|
||||||
<label class="form-check-label" for="passGenUseSpecial">!@#$%^&*</label>
|
<label class="form-check-label" for="passGenUseSpecial">!@#$%^&*</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="checkbox" id="passGenUseLower"
|
|
||||||
[(ngModel)]="passGenUseLower" name="PassGenUseLower">
|
|
||||||
<label class="form-check-label" for="passGenUseLower">a-z</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check">
|
|
||||||
<input class="form-check-input" type="checkbox" id="passGenUseUpper"
|
|
||||||
[(ngModel)]="passGenUseUpper" name="PassGenUseUpper">
|
|
||||||
<label class="form-check-label" for="passGenUseUpper">A-Z</label>
|
|
||||||
</div>
|
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
@@ -75,4 +106,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,9 +10,7 @@ import { ToasterService } from 'angular2-toaster';
|
|||||||
import { Angulartics2 } from 'angulartics2';
|
import { Angulartics2 } from 'angulartics2';
|
||||||
|
|
||||||
import { ApiService } from 'jslib/abstractions/api.service';
|
import { ApiService } from 'jslib/abstractions/api.service';
|
||||||
import { CollectionService } from 'jslib/abstractions/collection.service';
|
|
||||||
import { I18nService } from 'jslib/abstractions/i18n.service';
|
import { I18nService } from 'jslib/abstractions/i18n.service';
|
||||||
import { PlatformUtilsService } from 'jslib/abstractions/platformUtils.service';
|
|
||||||
|
|
||||||
import { PolicyType } from 'jslib/enums/policyType';
|
import { PolicyType } from 'jslib/enums/policyType';
|
||||||
|
|
||||||
@@ -38,25 +36,27 @@ export class PolicyEditComponent implements OnInit {
|
|||||||
|
|
||||||
// Master password
|
// Master password
|
||||||
|
|
||||||
|
masterPassMinComplexity?: number;
|
||||||
masterPassMinLength?: number;
|
masterPassMinLength?: number;
|
||||||
|
masterPassRequireUpper?: number;
|
||||||
// TODO
|
masterPassRequireLower?: number;
|
||||||
|
masterPassRequireNumbers?: number;
|
||||||
|
masterPassRequireSpecial?: number;
|
||||||
|
|
||||||
// Password generator
|
// Password generator
|
||||||
|
|
||||||
passGenMinLength?: number;
|
passGenMinLength?: number;
|
||||||
passGenMinNumbers?: number;
|
|
||||||
passGenMinSpecial?: number;
|
|
||||||
passGenUseNumbers?: boolean;
|
|
||||||
passGenUseSpecial?: boolean;
|
|
||||||
passGenUseUpper?: boolean;
|
passGenUseUpper?: boolean;
|
||||||
passGenUseLower?: boolean;
|
passGenUseLower?: boolean;
|
||||||
|
passGenUseNumbers?: boolean;
|
||||||
|
passGenUseSpecial?: boolean;
|
||||||
|
passGenMinNumbers?: number;
|
||||||
|
passGenMinSpecial?: number;
|
||||||
|
|
||||||
private policy: PolicyResponse;
|
private policy: PolicyResponse;
|
||||||
|
|
||||||
constructor(private apiService: ApiService, private i18nService: I18nService,
|
constructor(private apiService: ApiService, private i18nService: I18nService,
|
||||||
private analytics: Angulartics2, private toasterService: ToasterService,
|
private analytics: Angulartics2, private toasterService: ToasterService) { }
|
||||||
private collectionService: CollectionService, private platformUtilsService: PlatformUtilsService) { }
|
|
||||||
|
|
||||||
async ngOnInit() {
|
async ngOnInit() {
|
||||||
await this.load();
|
await this.load();
|
||||||
@@ -73,15 +73,20 @@ export class PolicyEditComponent implements OnInit {
|
|||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case PolicyType.PasswordGenerator:
|
case PolicyType.PasswordGenerator:
|
||||||
this.passGenMinLength = this.policy.data.minLength;
|
this.passGenMinLength = this.policy.data.minLength;
|
||||||
|
this.passGenUseUpper = this.policy.data.useUpper;
|
||||||
|
this.passGenUseLower = this.policy.data.useLower;
|
||||||
|
this.passGenUseNumbers = this.policy.data.useNumbers;
|
||||||
|
this.passGenUseSpecial = this.policy.data.useSpecial;
|
||||||
this.passGenMinNumbers = this.policy.data.minNumbers;
|
this.passGenMinNumbers = this.policy.data.minNumbers;
|
||||||
this.passGenMinSpecial = this.policy.data.minSpecial;
|
this.passGenMinSpecial = this.policy.data.minSpecial;
|
||||||
this.passGenUseLower = this.policy.data.useLower;
|
|
||||||
this.passGenUseUpper = this.policy.data.useUpper;
|
|
||||||
this.passGenUseSpecial = this.policy.data.useSpecial;
|
|
||||||
this.passGenUseNumbers = this.policy.data.useNumbers;
|
|
||||||
break;
|
break;
|
||||||
case PolicyType.MasterPassword:
|
case PolicyType.MasterPassword:
|
||||||
|
this.masterPassMinComplexity = this.policy.data.minComplexity;
|
||||||
this.masterPassMinLength = this.policy.data.minLength;
|
this.masterPassMinLength = this.policy.data.minLength;
|
||||||
|
this.masterPassRequireUpper = this.policy.data.requireUpper;
|
||||||
|
this.masterPassRequireLower = this.policy.data.requireLower;
|
||||||
|
this.masterPassRequireNumbers = this.policy.data.requireNumbers;
|
||||||
|
this.masterPassRequireSpecial = this.policy.data.requireSpecial;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -105,18 +110,23 @@ export class PolicyEditComponent implements OnInit {
|
|||||||
switch (this.type) {
|
switch (this.type) {
|
||||||
case PolicyType.PasswordGenerator:
|
case PolicyType.PasswordGenerator:
|
||||||
request.data = {
|
request.data = {
|
||||||
minLength: this.passGenMinLength,
|
minLength: this.passGenMinLength || null,
|
||||||
minNumbers: this.passGenMinNumbers,
|
useUpper: this.passGenUseUpper,
|
||||||
minSpecial: this.passGenMinSpecial,
|
useLower: this.passGenUseLower,
|
||||||
useNumbers: this.passGenUseNumbers,
|
useNumbers: this.passGenUseNumbers,
|
||||||
useSpecial: this.passGenUseSpecial,
|
useSpecial: this.passGenUseSpecial,
|
||||||
useLower: this.passGenUseLower,
|
minNumbers: this.passGenMinNumbers || null,
|
||||||
useUpper: this.passGenUseUpper,
|
minSpecial: this.passGenMinSpecial || null,
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case PolicyType.MasterPassword:
|
case PolicyType.MasterPassword:
|
||||||
request.data = {
|
request.data = {
|
||||||
minLength: this.masterPassMinLength,
|
minComplexity: this.masterPassMinComplexity || null,
|
||||||
|
minLength: this.masterPassMinLength || null,
|
||||||
|
requireUpper: this.masterPassRequireUpper,
|
||||||
|
requireLower: this.masterPassRequireLower,
|
||||||
|
requireNumbers: this.masterPassRequireNumbers,
|
||||||
|
requireSpecial: this.masterPassRequireSpecial,
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -805,6 +805,9 @@
|
|||||||
"passwordGenerator": {
|
"passwordGenerator": {
|
||||||
"message": "Password Generator"
|
"message": "Password Generator"
|
||||||
},
|
},
|
||||||
|
"minComplexityScore": {
|
||||||
|
"message": "Minimum Complexity Score"
|
||||||
|
},
|
||||||
"minNumbers": {
|
"minNumbers": {
|
||||||
"message": "Minimum Numbers"
|
"message": "Minimum Numbers"
|
||||||
},
|
},
|
||||||
@@ -2960,4 +2963,4 @@
|
|||||||
"clone": {
|
"clone": {
|
||||||
"message": "Clone"
|
"message": "Clone"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user