Skip to content

Commit

Permalink
chore: add handling shared vault invites via websockets (#2475)
Browse files Browse the repository at this point in the history
  • Loading branch information
karolsojko committed Sep 1, 2023
1 parent 318a2ca commit 4ca2912
Show file tree
Hide file tree
Showing 12 changed files with 47 additions and 35 deletions.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import { AsymmetricMessageServerHash } from '../AsymmetricMessage/AsymmetricMessageServerHash'

export interface SharedVaultInviteServerHash extends AsymmetricMessageServerHash {
export interface SharedVaultInviteServerHash {
uuid: string
shared_vault_uuid: string
user_uuid: string
Expand Down
4 changes: 4 additions & 0 deletions packages/responses/src/Domain/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,7 @@ export * from './User/SettingData'
export * from './User/UpdateSettingResponse'

export * from './Notification/NotificationServerHash'

export * from './SharedVaults/SharedVaultInviteServerHash'
export * from './SharedVaults/SharedVaultServerHash'
export * from './SharedVaults/SharedVaultUserServerHash'
1 change: 1 addition & 0 deletions packages/services/src/Domain/Api/WebSocketsServiceEvent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ export enum WebSocketsServiceEvent {
UserRoleMessageReceived = 'WebSocketMessageReceived',
NotificationAddedForUser = 'NotificationAddedForUser',
MessageSentToUser = 'MessageSentToUser',
UserInvitedToSharedVault = 'UserInvitedToSharedVault',
}
3 changes: 3 additions & 0 deletions packages/services/src/Domain/Api/WebsocketsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ export class WebSocketsService extends AbstractService<WebSocketsServiceEvent, D
case 'MESSAGE_SENT_TO_USER':
void this.notifyEvent(WebSocketsServiceEvent.MessageSentToUser, eventData)
break
case 'USER_INVITED_TO_SHARED_VAULT':
void this.notifyEvent(WebSocketsServiceEvent.UserInvitedToSharedVault, eventData)
break
default:
break
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ export class AsymmetricMessageService

const result = this._getUntrustedPayload.execute({
privateKey: keys.getValue().encryption.privateKey,
message,
payload: message,
})

if (result.isFailed()) {
Expand All @@ -236,7 +236,7 @@ export class AsymmetricMessageService
privateKey: keys.getValue().encryption.privateKey,
sender: contact.getValue(),
ownUserUuid: this.sessions.userUuid,
message,
payload: message,
})

if (result.isFailed()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ describe('GetTrustedPayload', () => {
describe('execute', () => {
const mockDto = {
privateKey: 'test-private-key',
message: {} as AsymmetricMessageServerHash,
payload: {} as AsymmetricMessageServerHash,
sender: {} as TrustedContactInterface,
ownUserUuid: 'test-user-uuid',
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AsymmetricMessageServerHash } from '@standardnotes/responses'
import { AsymmetricMessageServerHash, SharedVaultInviteServerHash } from '@standardnotes/responses'
import { AsymmetricMessagePayload, TrustedContactInterface } from '@standardnotes/models'
import { DecryptMessage } from '../../Encryption/UseCase/Asymmetric/DecryptMessage'
import { Result, SyncUseCaseInterface } from '@standardnotes/domain-core'
Expand All @@ -8,12 +8,12 @@ export class GetTrustedPayload implements SyncUseCaseInterface<AsymmetricMessage

execute<M extends AsymmetricMessagePayload>(dto: {
privateKey: string
message: AsymmetricMessageServerHash
payload: AsymmetricMessageServerHash | SharedVaultInviteServerHash
sender: TrustedContactInterface
ownUserUuid: string
}): Result<M> {
const result = this.decryptMessage.execute<M>({
message: dto.message.encrypted_message,
message: dto.payload.encrypted_message,
sender: dto.sender,
privateKey: dto.privateKey,
})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AsymmetricMessageServerHash } from '@standardnotes/responses'
import { AsymmetricMessageServerHash, SharedVaultInviteServerHash } from '@standardnotes/responses'
import { AsymmetricMessagePayload } from '@standardnotes/models'
import { DecryptMessage } from '../../Encryption/UseCase/Asymmetric/DecryptMessage'
import { Result, SyncUseCaseInterface } from '@standardnotes/domain-core'
Expand All @@ -8,10 +8,10 @@ export class GetUntrustedPayload implements SyncUseCaseInterface<AsymmetricMessa

execute<M extends AsymmetricMessagePayload>(dto: {
privateKey: string
message: AsymmetricMessageServerHash
payload: AsymmetricMessageServerHash | SharedVaultInviteServerHash
}): Result<M> {
const result = this.decryptMessage.execute<M>({
message: dto.message.encrypted_message,
message: dto.payload.encrypted_message,
sender: undefined,
privateKey: dto.privateKey,
})
Expand Down
40 changes: 23 additions & 17 deletions packages/services/src/Domain/VaultInvite/VaultInviteService.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
import { UserInvitedToSharedVaultEvent } from '@standardnotes/domain-events'
import {
ClientDisplayableError,
SharedVaultInviteServerHash,
SharedVaultUserServerHash,
isClientDisplayableError,
isErrorResponse,
} from '@standardnotes/responses'
import { ContentType, Result } from '@standardnotes/domain-core'
import { SharedVaultInvitesServer } from '@standardnotes/api'
import {
AsymmetricMessageSharedVaultInvite,
PayloadEmitSource,
SharedVaultListingInterface,
TrustedContactInterface,
} from '@standardnotes/models'

import { AcceptVaultInvite } from './UseCase/AcceptVaultInvite'
import { SyncEvent, SyncEventReceivedSharedVaultInvitesData } from './../Event/SyncEvent'
import { InternalEventInterface } from './../Internal/InternalEventInterface'
Expand All @@ -15,26 +32,12 @@ import { SyncServiceInterface } from './../Sync/SyncServiceInterface'
import { InternalEventBusInterface } from './../Internal/InternalEventBusInterface'
import { SessionsClientInterface } from './../Session/SessionsClientInterface'
import { GetAllContacts } from './../Contacts/UseCase/GetAllContacts'
import {
AsymmetricMessageSharedVaultInvite,
PayloadEmitSource,
SharedVaultListingInterface,
TrustedContactInterface,
} from '@standardnotes/models'
import { VaultInviteServiceInterface } from './VaultInviteServiceInterface'
import {
ClientDisplayableError,
SharedVaultInviteServerHash,
SharedVaultUserServerHash,
isClientDisplayableError,
isErrorResponse,
} from '@standardnotes/responses'
import { AbstractService } from './../Service/AbstractService'
import { VaultInviteServiceEvent } from './VaultInviteServiceEvent'
import { ContentType, Result } from '@standardnotes/domain-core'
import { SharedVaultInvitesServer } from '@standardnotes/api'
import { GetKeyPairs } from '../Encryption/UseCase/GetKeyPairs'
import { DecryptErroredPayloads } from '../Encryption/UseCase/DecryptErroredPayloads'
import { WebSocketsServiceEvent } from '../Api/WebSocketsServiceEvent'

export class VaultInviteService
extends AbstractService<VaultInviteServiceEvent>
Expand Down Expand Up @@ -98,6 +101,9 @@ export class VaultInviteService
case SyncEvent.ReceivedSharedVaultInvites:
await this.processInboundInvites(event.payload as SyncEventReceivedSharedVaultInvitesData)
break
case WebSocketsServiceEvent.UserInvitedToSharedVault:
await this.processInboundInvites([(event as UserInvitedToSharedVaultEvent).payload.invite])
break
}
}

Expand Down Expand Up @@ -261,7 +267,7 @@ export class VaultInviteService
const sender = this._findContact.execute({ userUuid: invite.sender_uuid })
if (!sender.isFailed()) {
const trustedMessage = this._getTrustedPayload.execute<AsymmetricMessageSharedVaultInvite>({
message: invite,
payload: invite,
privateKey: keys.getValue().encryption.privateKey,
ownUserUuid: this.session.userUuid,
sender: sender.getValue(),
Expand All @@ -279,7 +285,7 @@ export class VaultInviteService
}

const untrustedMessage = this._getUntrustedPayload.execute<AsymmetricMessageSharedVaultInvite>({
message: invite,
payload: invite,
privateKey: keys.getValue().encryption.privateKey,
})

Expand Down
2 changes: 1 addition & 1 deletion packages/snjs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"@standardnotes/api": "workspace:*",
"@standardnotes/common": "^1.50.0",
"@standardnotes/domain-core": "^1.25.0",
"@standardnotes/domain-events": "^2.121.0",
"@standardnotes/domain-events": "^2.122.0",
"@standardnotes/encryption": "workspace:*",
"@standardnotes/features": "workspace:*",
"@standardnotes/files": "workspace:*",
Expand Down
10 changes: 5 additions & 5 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4349,13 +4349,13 @@ __metadata:
languageName: node
linkType: hard

"@standardnotes/domain-events@npm:^2.121.0":
version: 2.121.0
resolution: "@standardnotes/domain-events@npm:2.121.0"
"@standardnotes/domain-events@npm:^2.122.0":
version: 2.122.0
resolution: "@standardnotes/domain-events@npm:2.122.0"
dependencies:
"@standardnotes/predicates": 1.6.9
"@standardnotes/security": 1.12.0
checksum: 49d4a834212f24b4469487ce6126d554e50145dee665326e2fc0536a1890febbca4e8c07e37666bfced9d5bfd36d175edfeb1483876326a4c964805993dba7ec
checksum: 9dd2f02f1c9c91b3380d0db88dba3e504aaa14b7e58dcb519611dd8b15edb27c111805eb0e34f1612751fb59428296a216e39b5711892f6c8f1fc1f057e61c50
languageName: node
linkType: hard

Expand Down Expand Up @@ -4829,7 +4829,7 @@ __metadata:
"@standardnotes/api": "workspace:*"
"@standardnotes/common": ^1.50.0
"@standardnotes/domain-core": ^1.25.0
"@standardnotes/domain-events": ^2.121.0
"@standardnotes/domain-events": ^2.122.0
"@standardnotes/encryption": "workspace:*"
"@standardnotes/features": "workspace:*"
"@standardnotes/files": "workspace:*"
Expand Down

0 comments on commit 4ca2912

Please sign in to comment.