diff --git a/src/abstractions/api.service.ts b/src/abstractions/api.service.ts index b3fb8512dc9..ffb6ecb2796 100644 --- a/src/abstractions/api.service.ts +++ b/src/abstractions/api.service.ts @@ -35,6 +35,7 @@ import { TwoFactorEmailRequest } from '../models/request/twoFactorEmailRequest'; import { TwoFactorProviderRequest } from '../models/request/twoFactorProviderRequest'; import { TwoFactorRecoveryRequest } from '../models/request/twoFactorRecoveryRequest'; import { UpdateDomainsRequest } from '../models/request/updateDomainsRequest'; +import { UpdateKeyRequest } from '../models/request/updateKeyRequest'; import { UpdateProfileRequest } from '../models/request/updateProfileRequest'; import { UpdateTwoFactorAuthenticatorRequest } from '../models/request/updateTwoFactorAuthenticatorRequest'; import { UpdateTwoFactorDuoRequest } from '../models/request/updateTwoFactorDuoRequest'; @@ -106,6 +107,7 @@ export abstract class ApiService { postAccountStorage: (request: StorageRequest) => Promise; postAccountPayment: (request: PaymentRequest) => Promise; postAccountLicense: (data: FormData) => Promise; + postAccountKey: (request: UpdateKeyRequest) => Promise; postAccountKeys: (request: KeysRequest) => Promise; postAccountVerifyEmail: () => Promise; postAccountVerifyEmailToken: (request: VerifyEmailRequest) => Promise; diff --git a/src/abstractions/cipher.service.ts b/src/abstractions/cipher.service.ts index 39176d12048..10460776594 100644 --- a/src/abstractions/cipher.service.ts +++ b/src/abstractions/cipher.service.ts @@ -14,7 +14,7 @@ export abstract class CipherService { decryptedCipherCache: CipherView[]; clearCache: () => void; - encrypt: (model: CipherView) => Promise; + encrypt: (model: CipherView, key?: SymmetricCryptoKey) => Promise; encryptFields: (fieldsModel: FieldView[], key: SymmetricCryptoKey) => Promise; encryptField: (fieldModel: FieldView, key: SymmetricCryptoKey) => Promise; get: (id: string) => Promise; diff --git a/src/abstractions/folder.service.ts b/src/abstractions/folder.service.ts index 381bc013171..1fec203798e 100644 --- a/src/abstractions/folder.service.ts +++ b/src/abstractions/folder.service.ts @@ -1,6 +1,7 @@ import { FolderData } from '../models/data/folderData'; import { Folder } from '../models/domain/folder'; +import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey'; import { FolderView } from '../models/view/folderView'; @@ -8,7 +9,7 @@ export abstract class FolderService { decryptedFolderCache: FolderView[]; clearCache: () => void; - encrypt: (model: FolderView) => Promise; + encrypt: (model: FolderView, key?: SymmetricCryptoKey) => Promise; get: (id: string) => Promise; getAll: () => Promise; getAllDecrypted: () => Promise; diff --git a/src/models/request/folderWithIdRequest.ts b/src/models/request/folderWithIdRequest.ts new file mode 100644 index 00000000000..a97ad6d813f --- /dev/null +++ b/src/models/request/folderWithIdRequest.ts @@ -0,0 +1,12 @@ +import { FolderRequest } from './folderRequest'; + +import { Folder } from '../domain/folder'; + +export class FolderWithIdRequest extends FolderRequest { + id: string; + + constructor(folder: Folder) { + super(folder); + this.id = folder.id; + } +} diff --git a/src/models/request/updateKeyRequest.ts b/src/models/request/updateKeyRequest.ts new file mode 100644 index 00000000000..0464e5ce534 --- /dev/null +++ b/src/models/request/updateKeyRequest.ts @@ -0,0 +1,10 @@ +import { CipherWithIdRequest } from './cipherWithIdRequest'; +import { FolderWithIdRequest } from './folderWithIdRequest'; + +export class UpdateKeyRequest { + ciphers: CipherWithIdRequest[] = []; + folders: FolderWithIdRequest[] = []; + masterPasswordHash: string; + privateKey: string; + key: string; +} diff --git a/src/services/api.service.ts b/src/services/api.service.ts index 12e40e0df51..f035ad0aecd 100644 --- a/src/services/api.service.ts +++ b/src/services/api.service.ts @@ -41,6 +41,7 @@ import { TwoFactorEmailRequest } from '../models/request/twoFactorEmailRequest'; import { TwoFactorProviderRequest } from '../models/request/twoFactorProviderRequest'; import { TwoFactorRecoveryRequest } from '../models/request/twoFactorRecoveryRequest'; import { UpdateDomainsRequest } from '../models/request/updateDomainsRequest'; +import { UpdateKeyRequest } from '../models/request/updateKeyRequest'; import { UpdateProfileRequest } from '../models/request/updateProfileRequest'; import { UpdateTwoFactorAuthenticatorRequest } from '../models/request/updateTwoFactorAuthenticatorRequest'; import { UpdateTwoFactorDuoRequest } from '../models/request/updateTwoFactorDuoRequest'; @@ -256,6 +257,10 @@ export class ApiService implements ApiServiceAbstraction { return this.send('POST', '/accounts/keys', request, true, false); } + postAccountKey(request: UpdateKeyRequest): Promise { + return this.send('POST', '/accounts/key', request, true, false); + } + postAccountVerifyEmail(): Promise { return this.send('POST', '/accounts/verify-email', null, true, false); } diff --git a/src/services/cipher.service.ts b/src/services/cipher.service.ts index 54cc1517b8d..b7b82eece94 100644 --- a/src/services/cipher.service.ts +++ b/src/services/cipher.service.ts @@ -60,7 +60,7 @@ export class CipherService implements CipherServiceAbstraction { this.decryptedCipherCache = null; } - async encrypt(model: CipherView): Promise { + async encrypt(model: CipherView, key?: SymmetricCryptoKey): Promise { const cipher = new Cipher(); cipher.id = model.id; cipher.folderId = model.folderId; @@ -69,7 +69,9 @@ export class CipherService implements CipherServiceAbstraction { cipher.type = model.type; cipher.collectionIds = model.collectionIds; - const key = await this.cryptoService.getOrgKey(cipher.organizationId); + if (key == null && cipher.organizationId != null) { + key = await this.cryptoService.getOrgKey(cipher.organizationId); + } await Promise.all([ this.encryptObjProperty(model, cipher, { name: null, diff --git a/src/services/folder.service.ts b/src/services/folder.service.ts index 955cc2387a6..c03cb0c2986 100644 --- a/src/services/folder.service.ts +++ b/src/services/folder.service.ts @@ -1,6 +1,7 @@ import { FolderData } from '../models/data/folderData'; import { Folder } from '../models/domain/folder'; +import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey'; import { FolderRequest } from '../models/request/folderRequest'; @@ -35,10 +36,10 @@ export class FolderService implements FolderServiceAbstraction { this.decryptedFolderCache = null; } - async encrypt(model: FolderView): Promise { + async encrypt(model: FolderView, key?: SymmetricCryptoKey): Promise { const folder = new Folder(); folder.id = model.id; - folder.name = await this.cryptoService.encrypt(model.name); + folder.name = await this.cryptoService.encrypt(model.name, key); return folder; }