From d040429575db755d55c80ed451f66acba996b151 Mon Sep 17 00:00:00 2001 From: Mo Date: Tue, 6 Jun 2023 13:27:31 -0500 Subject: [PATCH] feat(wip): signing keypair --- .../UseCase/ChangeCredentials/ChangeCredentials.ts | 14 ++++++++++---- .../mysql/1684503299320-create_contacts.ts | 6 ++++++ .../src/Domain/Contact/Model/Contact.ts | 5 +++++ .../Handler/UserCredentialsChangedEventHandler.ts | 5 +++++ packages/syncing-server/src/Domain/Item/Item.ts | 2 +- .../syncing-server/src/Domain/Item/ItemFactory.ts | 8 ++------ .../syncing-server/src/Domain/Item/ItemHash.ts | 1 - .../syncing-server/src/Domain/Item/ItemService.ts | 6 ++---- 8 files changed, 31 insertions(+), 16 deletions(-) diff --git a/packages/auth/src/Domain/UseCase/ChangeCredentials/ChangeCredentials.ts b/packages/auth/src/Domain/UseCase/ChangeCredentials/ChangeCredentials.ts index 294b5bff9..994e29bb7 100644 --- a/packages/auth/src/Domain/UseCase/ChangeCredentials/ChangeCredentials.ts +++ b/packages/auth/src/Domain/UseCase/ChangeCredentials/ChangeCredentials.ts @@ -67,11 +67,21 @@ export class ChangeCredentials implements UseCaseInterface { } let userCredentialsChangedEvent: UserCredentialsChangedEvent | undefined = undefined + if (dto.publicKey && dto.user.publicKey !== dto.publicKey) { + if (!dto.signingPublicKey) { + return { + success: false, + errorMessage: 'Signing public key is required', + } + } + dto.user.publicKey = dto.publicKey + dto.user.signingPublicKey = dto.signingPublicKey userCredentialsChangedEvent = this.domainEventFactory.createUserCredentialsChangedEvent( dto.user.uuid, dto.publicKey, + dto.signingPublicKey, ) } @@ -79,10 +89,6 @@ export class ChangeCredentials implements UseCaseInterface { dto.user.encryptedPrivateKey = dto.encryptedPrivateKey } - if (dto.signingPublicKey) { - dto.user.signingPublicKey = dto.signingPublicKey - } - if (dto.encryptedSigningPrivateKey) { dto.user.encryptedSigningPrivateKey = dto.encryptedSigningPrivateKey } diff --git a/packages/syncing-server/migrations/mysql/1684503299320-create_contacts.ts b/packages/syncing-server/migrations/mysql/1684503299320-create_contacts.ts index 832bb4b9c..b56550285 100644 --- a/packages/syncing-server/migrations/mysql/1684503299320-create_contacts.ts +++ b/packages/syncing-server/migrations/mysql/1684503299320-create_contacts.ts @@ -31,6 +31,12 @@ export class CreateContacts1684503299320 implements MigrationInterface { length: '255', isNullable: false, }), + new TableColumn({ + name: 'contact_signing_public_key', + type: 'varchar', + length: '255', + isNullable: false, + }), new TableColumn({ name: 'created_at_timestamp', type: 'bigint', diff --git a/packages/syncing-server/src/Domain/Contact/Model/Contact.ts b/packages/syncing-server/src/Domain/Contact/Model/Contact.ts index 83240fcbb..522efeab5 100644 --- a/packages/syncing-server/src/Domain/Contact/Model/Contact.ts +++ b/packages/syncing-server/src/Domain/Contact/Model/Contact.ts @@ -22,6 +22,11 @@ export class Contact { }) declare contactPublicKey: string + @Column({ + name: 'contact_signing_public_key', + }) + declare contactSigningPublicKey: string + @Column({ name: 'created_at_timestamp', type: 'bigint', diff --git a/packages/syncing-server/src/Domain/Handler/UserCredentialsChangedEventHandler.ts b/packages/syncing-server/src/Domain/Handler/UserCredentialsChangedEventHandler.ts index 20275bc48..bca7e1c5b 100644 --- a/packages/syncing-server/src/Domain/Handler/UserCredentialsChangedEventHandler.ts +++ b/packages/syncing-server/src/Domain/Handler/UserCredentialsChangedEventHandler.ts @@ -16,6 +16,7 @@ export class UserCredentialsChangedEventHandler implements DomainEventHandlerInt async handle(event: UserCredentialsChangedEvent): Promise { await this.updatePublicKeyOfAllContacts(event.payload) + await this.nullifyPendingInboundSharedVaultInvites(event.payload) } @@ -25,8 +26,12 @@ export class UserCredentialsChangedEventHandler implements DomainEventHandlerInt if (contact.contactPublicKey === payload.newPublicKey) { continue } + contact.contactPublicKey = payload.newPublicKey + contact.contactSigningPublicKey = payload.newSigningPublicKey + contact.updatedAtTimestamp = this.timer.getTimestampInMicroseconds() + await this.contactRepository.save(contact) } } diff --git a/packages/syncing-server/src/Domain/Item/Item.ts b/packages/syncing-server/src/Domain/Item/Item.ts index e9040531a..051d8053c 100644 --- a/packages/syncing-server/src/Domain/Item/Item.ts +++ b/packages/syncing-server/src/Domain/Item/Item.ts @@ -103,7 +103,7 @@ export class Item { name: 'last_edited_by_uuid', length: 36, }) - declare lastEditedByUuid: string + declare lastEditedByUuid: string | null @Column({ name: 'created_at', diff --git a/packages/syncing-server/src/Domain/Item/ItemFactory.ts b/packages/syncing-server/src/Domain/Item/ItemFactory.ts index a68d3aef1..649adb3c0 100644 --- a/packages/syncing-server/src/Domain/Item/ItemFactory.ts +++ b/packages/syncing-server/src/Domain/Item/ItemFactory.ts @@ -30,21 +30,17 @@ export class ItemFactory implements ItemFactoryInterface { create(dto: { userUuid: string; itemHash: ItemHash; sessionUuid: string | null }): Item { const newItem = new Item() newItem.uuid = dto.itemHash.uuid + newItem.contentType = dto.itemHash.content_type newItem.updatedWithSession = dto.sessionUuid newItem.contentSize = 0 newItem.userUuid = dto.userUuid newItem.keySystemIdentifier = dto.itemHash.key_system_identifier newItem.sharedVaultUuid = dto.itemHash.shared_vault_uuid + newItem.lastEditedByUuid = dto.userUuid if (dto.itemHash.content) { newItem.content = dto.itemHash.content } - if (dto.itemHash.last_edited_by_uuid) { - newItem.lastEditedByUuid = dto.itemHash.last_edited_by_uuid - } - if (dto.itemHash.content_type) { - newItem.contentType = dto.itemHash.content_type - } if (dto.itemHash.enc_item_key) { newItem.encItemKey = dto.itemHash.enc_item_key } diff --git a/packages/syncing-server/src/Domain/Item/ItemHash.ts b/packages/syncing-server/src/Domain/Item/ItemHash.ts index 1074a7b2b..5188a819c 100644 --- a/packages/syncing-server/src/Domain/Item/ItemHash.ts +++ b/packages/syncing-server/src/Domain/Item/ItemHash.ts @@ -12,7 +12,6 @@ export type ItemHash = { items_key_id?: string key_system_identifier: string | null shared_vault_uuid: string | null - last_edited_by_uuid?: string | null created_at?: string created_at_timestamp?: number updated_at?: string diff --git a/packages/syncing-server/src/Domain/Item/ItemService.ts b/packages/syncing-server/src/Domain/Item/ItemService.ts index 54d11ac69..60da94179 100644 --- a/packages/syncing-server/src/Domain/Item/ItemService.ts +++ b/packages/syncing-server/src/Domain/Item/ItemService.ts @@ -216,18 +216,16 @@ export class ItemService implements ItemServiceInterface { userUuid: dto.userUuid, }) + dto.existingItem.contentType = dto.itemHash.content_type dto.existingItem.updatedWithSession = dto.sessionUuid dto.existingItem.contentSize = 0 - dto.existingItem.lastEditedByUuid = dto.userUuid dto.existingItem.keySystemIdentifier = dto.itemHash.key_system_identifier dto.existingItem.sharedVaultUuid = dto.itemHash.shared_vault_uuid + dto.existingItem.lastEditedByUuid = dto.userUuid if (dto.itemHash.content) { dto.existingItem.content = dto.itemHash.content } - if (dto.itemHash.content_type) { - dto.existingItem.contentType = dto.itemHash.content_type - } if (dto.itemHash.deleted !== undefined) { dto.existingItem.deleted = dto.itemHash.deleted }