1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-12-04 13:44:00 +01:00
bitwarden-browser/src/angular/components/password-generator.component.ts

96 lines
3.3 KiB
TypeScript
Raw Normal View History

2018-04-06 04:21:18 +02:00
import {
Directive,
2018-04-06 04:21:18 +02:00
EventEmitter,
Input,
OnInit,
Output,
} from '@angular/core';
import { I18nService } from '../../abstractions/i18n.service';
import { PasswordGenerationService } from '../../abstractions/passwordGeneration.service';
import { PlatformUtilsService } from '../../abstractions/platformUtils.service';
import { PasswordGeneratorPolicyOptions } from '../../models/domain/passwordGeneratorPolicyOptions';
@Directive()
2018-04-06 04:21:18 +02:00
export class PasswordGeneratorComponent implements OnInit {
@Input() showSelect: boolean = false;
@Output() onSelected = new EventEmitter<string>();
options: any = {};
password: string = '-';
showOptions = false;
avoidAmbiguous = false;
enforcedPolicyOptions: PasswordGeneratorPolicyOptions;
2018-04-06 04:21:18 +02:00
constructor(protected passwordGenerationService: PasswordGenerationService,
2018-04-06 04:21:18 +02:00
protected platformUtilsService: PlatformUtilsService, protected i18nService: I18nService,
2018-10-03 05:09:19 +02:00
private win: Window) { }
2018-04-06 04:21:18 +02:00
async ngOnInit() {
const optionsResponse = await this.passwordGenerationService.getOptions();
this.options = optionsResponse[0];
this.enforcedPolicyOptions = optionsResponse[1];
2018-04-06 04:21:18 +02:00
this.avoidAmbiguous = !this.options.ambiguous;
2018-10-09 04:06:06 +02:00
this.options.type = this.options.type === 'passphrase' ? 'passphrase' : 'password';
2018-04-23 19:03:47 +02:00
this.password = await this.passwordGenerationService.generatePassword(this.options);
2018-04-06 04:21:18 +02:00
await this.passwordGenerationService.addHistory(this.password);
}
async sliderChanged() {
this.saveOptions(false);
await this.passwordGenerationService.addHistory(this.password);
}
async sliderInput() {
this.normalizeOptions();
2018-04-23 19:03:47 +02:00
this.password = await this.passwordGenerationService.generatePassword(this.options);
2018-04-06 04:21:18 +02:00
}
async saveOptions(regenerate: boolean = true) {
this.normalizeOptions();
await this.passwordGenerationService.saveOptions(this.options);
if (regenerate) {
await this.regenerate();
}
}
async regenerate() {
2018-04-23 19:03:47 +02:00
this.password = await this.passwordGenerationService.generatePassword(this.options);
2018-04-06 04:21:18 +02:00
await this.passwordGenerationService.addHistory(this.password);
}
copy() {
2018-08-17 18:24:56 +02:00
const copyOptions = this.win != null ? { window: this.win } : null;
2018-04-19 14:00:54 +02:00
this.platformUtilsService.copyToClipboard(this.password, copyOptions);
2018-10-03 05:09:19 +02:00
this.platformUtilsService.showToast('info', null,
this.i18nService.t('valueCopied', this.i18nService.t('password')));
2018-04-06 04:21:18 +02:00
}
select() {
this.onSelected.emit(this.password);
}
toggleOptions() {
this.showOptions = !this.showOptions;
}
private normalizeOptions() {
// Application level normalize options depedent on class variables
2018-04-06 04:21:18 +02:00
this.options.ambiguous = !this.avoidAmbiguous;
2018-04-06 04:21:18 +02:00
if (!this.options.uppercase && !this.options.lowercase && !this.options.number && !this.options.special) {
this.options.lowercase = true;
2018-10-09 04:06:06 +02:00
if (this.win != null) {
const lowercase = this.win.document.querySelector('#lowercase') as HTMLInputElement;
if (lowercase) {
lowercase.checked = true;
}
2018-04-06 04:21:18 +02:00
}
}
this.passwordGenerationService.normalizeOptions(this.options, this.enforcedPolicyOptions);
2018-04-06 04:21:18 +02:00
}
}