Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: add handling shared vault invites via websockets #2475

Merged
merged 2 commits into from Sep 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Binary file not shown.
@@ -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
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
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
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
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
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
@@ -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
@@ -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
@@ -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
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
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