Skip to content
This repository was archived by the owner on Dec 21, 2021. It is now read-only.

Commit 6c56fe2

Browse files
authored
Merge pull request #204 from streamr-dev/NET-156-persist-groupkeys
Persist GroupKeys
2 parents ad2db70 + 3b58f50 commit 6c56fe2

28 files changed

+2716
-1616
lines changed

package-lock.json

Lines changed: 515 additions & 122 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,9 @@
151151
"@ethersproject/wallet": "^5.1.0",
152152
"@ethersproject/web": "^5.1.0",
153153
"debug": "^4.3.2",
154+
"env-paths": "^2.2.1",
154155
"eventemitter3": "^4.0.7",
156+
"idb-keyval": "^5.0.5",
155157
"lodash": "^4.17.21",
156158
"mem": "^8.1.1",
157159
"node-abort-controller": "^1.2.1",
@@ -165,6 +167,8 @@
165167
"qs": "^6.10.1",
166168
"quick-lru": "^6.0.0",
167169
"readable-stream": "^3.6.0",
170+
"sqlite": "^4.0.21",
171+
"sqlite3": "^5.0.2",
168172
"streamr-client-protocol": "^8.0.2",
169173
"streamr-test-utils": "^1.3.2",
170174
"ts-toolbelt": "^9.6.0",

src/Connection.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ export default class Connection extends EventEmitter {
425425
}
426426
}
427427

428-
enableAutoDisconnect(autoDisconnect = true) {
428+
enableAutoDisconnect(autoDisconnect: boolean | number = true) {
429429
let delay
430430
if (typeof autoDisconnect === 'number') {
431431
delay = autoDisconnect
@@ -443,7 +443,7 @@ export default class Connection extends EventEmitter {
443443
}
444444
}
445445

446-
enableAutoConnect(autoConnect = true) {
446+
enableAutoConnect(autoConnect: boolean | number = true) {
447447
autoConnect = !!autoConnect // eslint-disable-line no-param-reassign
448448
if (this.options.autoConnect && !autoConnect) {
449449
this.didDisableAutoConnect = true

src/StreamrClient.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ import { DataUnion, DataUnionDeployOptions } from './dataunion/DataUnion'
2222
import { BigNumber } from '@ethersproject/bignumber'
2323
import { getAddress } from '@ethersproject/address'
2424
import { Contract } from '@ethersproject/contracts'
25-
import { StreamPartDefinition } from './stream'
26-
import type { GroupKey } from './stream/Encryption'
25+
import { StreamPartDefinition, GroupKey } from './stream'
2726

2827
// TODO get metadata type from streamr-protocol-js project (it doesn't export the type definitions yet)
2928
export type OnMessageCallback = MaybeAsync<(message: any, metadata: any) => void>

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { StreamrClient } from './StreamrClient'
1010
export * from './StreamrClient'
1111
export * from './Config'
1212
export * from './stream'
13-
export * from './stream/Encryption'
13+
export * from './stream/encryption/Encryption'
1414
export * from './stream/StreamPart'
1515
export * from './stream/StorageNode'
1616
export * from './subscribe'

src/publish/Encrypt.ts

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
import { MessageLayer } from 'streamr-client-protocol'
22

3-
import EncryptionUtil from '../stream/Encryption'
3+
import EncryptionUtil from '../stream/encryption/Encryption'
44
import { Stream } from '../stream'
55
import { StreamrClient } from '../StreamrClient'
6-
import { PublisherKeyExhange } from '../stream/KeyExchange'
6+
import { PublisherKeyExhange } from '../stream/encryption/KeyExchangePublisher'
77

88
const { StreamMessage } = MessageLayer
99

10-
type PublisherKeyExhangeAPI = ReturnType<typeof PublisherKeyExhange>
11-
1210
export default function Encrypt(client: StreamrClient) {
13-
let publisherKeyExchange: ReturnType<typeof PublisherKeyExhange>
11+
let publisherKeyExchange: PublisherKeyExhange
1412

1513
function getPublisherKeyExchange() {
1614
if (!publisherKeyExchange) {
17-
publisherKeyExchange = PublisherKeyExhange(client, {
15+
publisherKeyExchange = new PublisherKeyExhange(client, {
1816
groupKeys: {
1917
...client.options.groupKeys,
2018
}
@@ -28,9 +26,19 @@ export default function Encrypt(client: StreamrClient) {
2826
return
2927
}
3028

29+
const { messageType } = streamMessage
30+
if (
31+
messageType === StreamMessage.MESSAGE_TYPES.GROUP_KEY_RESPONSE
32+
|| messageType === StreamMessage.MESSAGE_TYPES.GROUP_KEY_REQUEST
33+
|| messageType === StreamMessage.MESSAGE_TYPES.GROUP_KEY_ERROR_RESPONSE
34+
) {
35+
// never encrypt
36+
return
37+
}
38+
3139
if (
3240
!stream.requireEncryptedData
33-
&& !getPublisherKeyExchange().hasAnyGroupKey(stream.id)
41+
&& !(await (getPublisherKeyExchange().hasAnyGroupKey(stream.id)))
3442
) {
3543
// not needed
3644
return
@@ -41,17 +49,21 @@ export default function Encrypt(client: StreamrClient) {
4149
}
4250

4351
const [groupKey, nextGroupKey] = await getPublisherKeyExchange().useGroupKey(stream.id)
52+
if (!groupKey) {
53+
throw new Error(`Tried to use group key but no group key found for stream: ${stream.id}`)
54+
}
55+
4456
await EncryptionUtil.encryptStreamMessage(streamMessage, groupKey, nextGroupKey)
4557
}
4658

4759
return Object.assign(encrypt, {
48-
setNextGroupKey(...args: Parameters<PublisherKeyExhangeAPI['setNextGroupKey']>) {
60+
setNextGroupKey(...args: Parameters<PublisherKeyExhange['setNextGroupKey']>) {
4961
return getPublisherKeyExchange().setNextGroupKey(...args)
5062
},
51-
rotateGroupKey(...args: Parameters<PublisherKeyExhangeAPI['rotateGroupKey']>) {
63+
rotateGroupKey(...args: Parameters<PublisherKeyExhange['rotateGroupKey']>) {
5264
return getPublisherKeyExchange().rotateGroupKey(...args)
5365
},
54-
rekey(...args: Parameters<PublisherKeyExhangeAPI['rekey']>) {
66+
rekey(...args: Parameters<PublisherKeyExhange['rekey']>) {
5567
return getPublisherKeyExchange().rekey(...args)
5668
},
5769
start() {

src/rest/StreamEndpoints.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { getEndpointUrl } from '../utils'
88
import { validateOptions } from '../stream/utils'
99
import { Stream, StreamOperation, StreamProperties } from '../stream'
1010
import { StreamPart } from '../stream/StreamPart'
11-
import { isKeyExchangeStream } from '../stream/KeyExchange'
11+
import { isKeyExchangeStream } from '../stream/encryption/KeyExchangeUtils'
1212

1313
import authFetch, { ErrorCode, NotFoundError } from './authFetch'
1414
import { EthereumAddress } from '../types'

0 commit comments

Comments
 (0)