mirror of
https://github.com/bitwarden/browser.git
synced 2024-11-30 13:03:53 +01:00
make keypair on login if missing
This commit is contained in:
parent
3454d93fef
commit
af43232567
@ -12,6 +12,7 @@ import { FolderRequest } from '../models/request/folderRequest';
|
|||||||
import { ImportCiphersRequest } from '../models/request/importCiphersRequest';
|
import { ImportCiphersRequest } from '../models/request/importCiphersRequest';
|
||||||
import { ImportDirectoryRequest } from '../models/request/importDirectoryRequest';
|
import { ImportDirectoryRequest } from '../models/request/importDirectoryRequest';
|
||||||
import { ImportOrganizationCiphersRequest } from '../models/request/importOrganizationCiphersRequest';
|
import { ImportOrganizationCiphersRequest } from '../models/request/importOrganizationCiphersRequest';
|
||||||
|
import { KeysRequest } from '../models/request/keysRequest';
|
||||||
import { OrganizationCreateRequest } from '../models/request/organizationCreateRequest';
|
import { OrganizationCreateRequest } from '../models/request/organizationCreateRequest';
|
||||||
import { PasswordHintRequest } from '../models/request/passwordHintRequest';
|
import { PasswordHintRequest } from '../models/request/passwordHintRequest';
|
||||||
import { PasswordRequest } from '../models/request/passwordRequest';
|
import { PasswordRequest } from '../models/request/passwordRequest';
|
||||||
@ -74,6 +75,7 @@ export abstract class ApiService {
|
|||||||
postAccountStorage: (request: StorageRequest) => Promise<any>;
|
postAccountStorage: (request: StorageRequest) => Promise<any>;
|
||||||
postAccountPayment: (request: PaymentRequest) => Promise<any>;
|
postAccountPayment: (request: PaymentRequest) => Promise<any>;
|
||||||
postAccountLicense: (data: FormData) => Promise<any>;
|
postAccountLicense: (data: FormData) => Promise<any>;
|
||||||
|
postAccountKeys: (request: KeysRequest) => Promise<any>;
|
||||||
postFolder: (request: FolderRequest) => Promise<FolderResponse>;
|
postFolder: (request: FolderRequest) => Promise<FolderResponse>;
|
||||||
putFolder: (id: string, request: FolderRequest) => Promise<FolderResponse>;
|
putFolder: (id: string, request: FolderRequest) => Promise<FolderResponse>;
|
||||||
deleteFolder: (id: string) => Promise<any>;
|
deleteFolder: (id: string) => Promise<any>;
|
||||||
|
@ -3,10 +3,8 @@ import { Router } from '@angular/router';
|
|||||||
import { ToasterService } from 'angular2-toaster';
|
import { ToasterService } from 'angular2-toaster';
|
||||||
import { Angulartics2 } from 'angulartics2';
|
import { Angulartics2 } from 'angulartics2';
|
||||||
|
|
||||||
import {
|
import { KeysRequest } from '../../models/request/keysRequest';
|
||||||
RegisterKeysRequest,
|
import { RegisterRequest } from '../../models/request/registerRequest';
|
||||||
RegisterRequest,
|
|
||||||
} from '../../models/request/registerRequest';
|
|
||||||
|
|
||||||
import { ApiService } from '../../abstractions/api.service';
|
import { ApiService } from '../../abstractions/api.service';
|
||||||
import { AuthService } from '../../abstractions/auth.service';
|
import { AuthService } from '../../abstractions/auth.service';
|
||||||
@ -64,7 +62,7 @@ export class RegisterComponent {
|
|||||||
const keys = await this.cryptoService.makeKeyPair(encKey[0]);
|
const keys = await this.cryptoService.makeKeyPair(encKey[0]);
|
||||||
const request = new RegisterRequest(this.email, this.name, hashedPassword,
|
const request = new RegisterRequest(this.email, this.name, hashedPassword,
|
||||||
this.hint, encKey[1].encryptedString);
|
this.hint, encKey[1].encryptedString);
|
||||||
request.keys = new RegisterKeysRequest(keys[0], keys[1].encryptedString);
|
request.keys = new KeysRequest(keys[0], keys[1].encryptedString);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.formPromise = this.apiService.postRegister(request);
|
this.formPromise = this.apiService.postRegister(request);
|
||||||
|
9
src/models/request/keysRequest.ts
Normal file
9
src/models/request/keysRequest.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
export class KeysRequest {
|
||||||
|
publicKey: string;
|
||||||
|
encryptedPrivateKey: string;
|
||||||
|
|
||||||
|
constructor(publicKey: string, encryptedPrivateKey: string) {
|
||||||
|
this.publicKey = publicKey;
|
||||||
|
this.encryptedPrivateKey = encryptedPrivateKey;
|
||||||
|
}
|
||||||
|
}
|
@ -1,10 +1,12 @@
|
|||||||
|
import { KeysRequest } from './keysRequest';
|
||||||
|
|
||||||
export class RegisterRequest {
|
export class RegisterRequest {
|
||||||
name: string;
|
name: string;
|
||||||
email: string;
|
email: string;
|
||||||
masterPasswordHash: string;
|
masterPasswordHash: string;
|
||||||
masterPasswordHint: string;
|
masterPasswordHint: string;
|
||||||
key: string;
|
key: string;
|
||||||
keys: RegisterKeysRequest;
|
keys: KeysRequest;
|
||||||
token: string;
|
token: string;
|
||||||
organizationUserId: string;
|
organizationUserId: string;
|
||||||
|
|
||||||
@ -16,13 +18,3 @@ export class RegisterRequest {
|
|||||||
this.key = key;
|
this.key = key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class RegisterKeysRequest {
|
|
||||||
publicKey: string;
|
|
||||||
encryptedPrivateKey: string;
|
|
||||||
|
|
||||||
constructor(publicKey: string, encryptedPrivateKey: string) {
|
|
||||||
this.publicKey = publicKey;
|
|
||||||
this.encryptedPrivateKey = encryptedPrivateKey;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -18,6 +18,7 @@ import { FolderRequest } from '../models/request/folderRequest';
|
|||||||
import { ImportCiphersRequest } from '../models/request/importCiphersRequest';
|
import { ImportCiphersRequest } from '../models/request/importCiphersRequest';
|
||||||
import { ImportDirectoryRequest } from '../models/request/importDirectoryRequest';
|
import { ImportDirectoryRequest } from '../models/request/importDirectoryRequest';
|
||||||
import { ImportOrganizationCiphersRequest } from '../models/request/importOrganizationCiphersRequest';
|
import { ImportOrganizationCiphersRequest } from '../models/request/importOrganizationCiphersRequest';
|
||||||
|
import { KeysRequest } from '../models/request/keysRequest';
|
||||||
import { OrganizationCreateRequest } from '../models/request/organizationCreateRequest';
|
import { OrganizationCreateRequest } from '../models/request/organizationCreateRequest';
|
||||||
import { PasswordHintRequest } from '../models/request/passwordHintRequest';
|
import { PasswordHintRequest } from '../models/request/passwordHintRequest';
|
||||||
import { PasswordRequest } from '../models/request/passwordRequest';
|
import { PasswordRequest } from '../models/request/passwordRequest';
|
||||||
@ -218,6 +219,10 @@ export class ApiService implements ApiServiceAbstraction {
|
|||||||
return this.send('POST', '/accounts/license', data, true, false);
|
return this.send('POST', '/accounts/license', data, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
postAccountKeys(request: KeysRequest): Promise<any> {
|
||||||
|
return this.send('POST', '/accounts/keys', request, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
// Folder APIs
|
// Folder APIs
|
||||||
|
|
||||||
async postFolder(request: FolderRequest): Promise<FolderResponse> {
|
async postFolder(request: FolderRequest): Promise<FolderResponse> {
|
||||||
|
@ -4,6 +4,7 @@ import { AuthResult } from '../models/domain/authResult';
|
|||||||
import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey';
|
import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey';
|
||||||
|
|
||||||
import { DeviceRequest } from '../models/request/deviceRequest';
|
import { DeviceRequest } from '../models/request/deviceRequest';
|
||||||
|
import { KeysRequest } from '../models/request/keysRequest';
|
||||||
import { TokenRequest } from '../models/request/tokenRequest';
|
import { TokenRequest } from '../models/request/tokenRequest';
|
||||||
|
|
||||||
import { IdentityTokenResponse } from '../models/response/identityTokenResponse';
|
import { IdentityTokenResponse } from '../models/response/identityTokenResponse';
|
||||||
@ -239,6 +240,19 @@ export class AuthService {
|
|||||||
await this.cryptoService.setKey(key);
|
await this.cryptoService.setKey(key);
|
||||||
await this.cryptoService.setKeyHash(hashedPassword);
|
await this.cryptoService.setKeyHash(hashedPassword);
|
||||||
await this.cryptoService.setEncKey(tokenResponse.key);
|
await this.cryptoService.setEncKey(tokenResponse.key);
|
||||||
|
|
||||||
|
// User doesn't have a key pair yet (old account), let's generate one for them
|
||||||
|
if (tokenResponse.privateKey == null) {
|
||||||
|
try {
|
||||||
|
const keyPair = await this.cryptoService.makeKeyPair();
|
||||||
|
await this.apiService.postAccountKeys(new KeysRequest(keyPair[0], keyPair[1].encryptedString));
|
||||||
|
tokenResponse.privateKey = keyPair[1].encryptedString;
|
||||||
|
} catch (e) {
|
||||||
|
// tslint:disable-next-line
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await this.cryptoService.setEncPrivateKey(tokenResponse.privateKey);
|
await this.cryptoService.setEncPrivateKey(tokenResponse.privateKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user