1
- import { logger as rootLogger } from "../logger.ts" ;
1
+ import { type Logger , logger as rootLogger } from "../logger.ts" ;
2
2
import { type EncryptionConfig } from "./MatrixRTCSession.ts" ;
3
3
import { secureRandomBase64Url } from "../randomstring.ts" ;
4
4
import { decodeBase64 , encodeUnpaddedBase64 } from "../base64.ts" ;
@@ -7,8 +7,6 @@ import { type CallMembership } from "./CallMembership.ts";
7
7
import { type KeyTransportEventListener , KeyTransportEvents , type IKeyTransport } from "./IKeyTransport.ts" ;
8
8
import { isMyMembership , type Statistics } from "./types.ts" ;
9
9
10
- const logger = rootLogger . getChild ( "MatrixRTCSession" ) ;
11
-
12
10
/**
13
11
* This interface is for testing and for making it possible to interchange the encryption manager.
14
12
* @internal
@@ -78,7 +76,7 @@ export class EncryptionManager implements IEncryptionManager {
78
76
79
77
private latestGeneratedKeyIndex = - 1 ;
80
78
private joinConfig : EncryptionConfig | undefined ;
81
-
79
+ private logger : Logger ;
82
80
public constructor (
83
81
private userId : string ,
84
82
private deviceId : string ,
@@ -90,7 +88,10 @@ export class EncryptionManager implements IEncryptionManager {
90
88
encryptionKeyIndex : number ,
91
89
participantId : string ,
92
90
) => void ,
93
- ) { }
91
+ parentLogger ?: Logger ,
92
+ ) {
93
+ this . logger = ( parentLogger ?? rootLogger ) . getChild ( `[EncryptionManager]` ) ;
94
+ }
94
95
95
96
public getEncryptionKeys ( ) : Map < string , Array < { key : Uint8Array ; timestamp : number } > > {
96
97
return this . encryptionKeys ;
@@ -158,11 +159,11 @@ export class EncryptionManager implements IEncryptionManager {
158
159
if ( this . makeNewKeyTimeout ) {
159
160
// existing rotation in progress, so let it complete
160
161
} else {
161
- logger . debug ( `Member(s) have left: queueing sender key rotation` ) ;
162
+ this . logger . debug ( `Member(s) have left: queueing sender key rotation` ) ;
162
163
this . makeNewKeyTimeout = setTimeout ( this . onRotateKeyTimeout , this . makeKeyDelay ) ;
163
164
}
164
165
} else if ( anyJoined ) {
165
- logger . debug ( `New member(s) have joined: re-sending keys` ) ;
166
+ this . logger . debug ( `New member(s) have joined: re-sending keys` ) ;
166
167
this . requestSendCurrentKey ( ) ;
167
168
} else if ( oldFingerprints ) {
168
169
// does it look like any of the members have updated their memberships?
@@ -174,7 +175,7 @@ export class EncryptionManager implements IEncryptionManager {
174
175
Array . from ( oldFingerprints ) . some ( ( x ) => ! newFingerprints . has ( x ) ) ||
175
176
Array . from ( newFingerprints ) . some ( ( x ) => ! oldFingerprints . has ( x ) ) ;
176
177
if ( candidateUpdates ) {
177
- logger . debug ( `Member(s) have updated/reconnected: re-sending keys to everyone` ) ;
178
+ this . logger . debug ( `Member(s) have updated/reconnected: re-sending keys to everyone` ) ;
178
179
this . requestSendCurrentKey ( ) ;
179
180
}
180
181
}
@@ -190,7 +191,7 @@ export class EncryptionManager implements IEncryptionManager {
190
191
private makeNewSenderKey ( delayBeforeUse = false ) : number {
191
192
const encryptionKey = secureRandomBase64Url ( 16 ) ;
192
193
const encryptionKeyIndex = this . getNewEncryptionKeyIndex ( ) ;
193
- logger . info ( "Generated new key at index " + encryptionKeyIndex ) ;
194
+ this . logger . info ( "Generated new key at index " + encryptionKeyIndex ) ;
194
195
this . setEncryptionKey (
195
196
this . userId ,
196
197
this . deviceId ,
@@ -213,7 +214,7 @@ export class EncryptionManager implements IEncryptionManager {
213
214
this . lastEncryptionKeyUpdateRequest &&
214
215
this . lastEncryptionKeyUpdateRequest + this . updateEncryptionKeyThrottle > Date . now ( )
215
216
) {
216
- logger . info ( "Last encryption key event sent too recently: postponing" ) ;
217
+ this . logger . info ( "Last encryption key event sent too recently: postponing" ) ;
217
218
if ( this . keysEventUpdateTimeout === undefined ) {
218
219
this . keysEventUpdateTimeout = setTimeout (
219
220
( ) => void this . sendEncryptionKeysEvent ( ) ,
@@ -252,42 +253,42 @@ export class EncryptionManager implements IEncryptionManager {
252
253
const myKeys = this . getKeysForParticipant ( this . userId , this . deviceId ) ;
253
254
254
255
if ( ! myKeys ) {
255
- logger . warn ( "Tried to send encryption keys event but no keys found!" ) ;
256
+ this . logger . warn ( "Tried to send encryption keys event but no keys found!" ) ;
256
257
return ;
257
258
}
258
259
259
260
if ( typeof indexToSend !== "number" && this . latestGeneratedKeyIndex === - 1 ) {
260
- logger . warn ( "Tried to send encryption keys event but no current key index found!" ) ;
261
+ this . logger . warn ( "Tried to send encryption keys event but no current key index found!" ) ;
261
262
return ;
262
263
}
263
264
264
265
const keyIndexToSend = indexToSend ?? this . latestGeneratedKeyIndex ;
265
266
266
- logger . info (
267
+ this . logger . info (
267
268
`Try sending encryption keys event. keyIndexToSend=${ keyIndexToSend } (method parameter: ${ indexToSend } )` ,
268
269
) ;
269
270
const keyToSend = myKeys [ keyIndexToSend ] ;
270
271
271
272
try {
272
273
this . statistics . counters . roomEventEncryptionKeysSent += 1 ;
273
274
await this . transport . sendKey ( encodeUnpaddedBase64 ( keyToSend ) , keyIndexToSend , this . getMemberships ( ) ) ;
274
- logger . debug (
275
+ this . logger . debug (
275
276
`sendEncryptionKeysEvent participantId=${ this . userId } :${ this . deviceId } numKeys=${ myKeys . length } currentKeyIndex=${ this . latestGeneratedKeyIndex } keyIndexToSend=${ keyIndexToSend } ` ,
276
277
this . encryptionKeys ,
277
278
) ;
278
279
} catch ( error ) {
279
280
if ( this . keysEventUpdateTimeout === undefined ) {
280
281
const resendDelay = safeGetRetryAfterMs ( error , 5000 ) ;
281
- logger . warn ( `Failed to send m.call.encryption_key, retrying in ${ resendDelay } ` , error ) ;
282
+ this . logger . warn ( `Failed to send m.call.encryption_key, retrying in ${ resendDelay } ` , error ) ;
282
283
this . keysEventUpdateTimeout = setTimeout ( ( ) => void this . sendEncryptionKeysEvent ( ) , resendDelay ) ;
283
284
} else {
284
- logger . info ( "Not scheduling key resend as another re-send is already pending" ) ;
285
+ this . logger . info ( "Not scheduling key resend as another re-send is already pending" ) ;
285
286
}
286
287
}
287
288
} ;
288
289
289
290
public onNewKeyReceived : KeyTransportEventListener = ( userId , deviceId , keyBase64Encoded , index , timestamp ) => {
290
- logger . debug ( `Received key over key transport ${ userId } :${ deviceId } at index ${ index } ` ) ;
291
+ this . logger . debug ( `Received key over key transport ${ userId } :${ deviceId } at index ${ index } ` ) ;
291
292
this . setEncryptionKey ( userId , deviceId , index , keyBase64Encoded , timestamp ) ;
292
293
} ;
293
294
@@ -330,7 +331,7 @@ export class EncryptionManager implements IEncryptionManager {
330
331
timestamp : number ,
331
332
delayBeforeUse = false ,
332
333
) : void {
333
- logger . debug ( `Setting encryption key for ${ userId } :${ deviceId } at index ${ encryptionKeyIndex } ` ) ;
334
+ this . logger . debug ( `Setting encryption key for ${ userId } :${ deviceId } at index ${ encryptionKeyIndex } ` ) ;
334
335
const keyBin = decodeBase64 ( encryptionKeyString ) ;
335
336
336
337
const participantId = getParticipantId ( userId , deviceId ) ;
@@ -343,7 +344,7 @@ export class EncryptionManager implements IEncryptionManager {
343
344
344
345
if ( existingKeyAtIndex ) {
345
346
if ( existingKeyAtIndex . timestamp > timestamp ) {
346
- logger . info (
347
+ this . logger . info (
347
348
`Ignoring new key at index ${ encryptionKeyIndex } for ${ participantId } as it is older than existing known key` ,
348
349
) ;
349
350
return ;
@@ -372,7 +373,7 @@ export class EncryptionManager implements IEncryptionManager {
372
373
if ( delayBeforeUse ) {
373
374
const useKeyTimeout = setTimeout ( ( ) => {
374
375
this . setNewKeyTimeouts . delete ( useKeyTimeout ) ;
375
- logger . info ( `Delayed-emitting key changed event for ${ participantId } index ${ encryptionKeyIndex } ` ) ;
376
+ this . logger . info ( `Delayed-emitting key changed event for ${ participantId } index ${ encryptionKeyIndex } ` ) ;
376
377
377
378
this . onEncryptionKeysChanged ( keyBin , encryptionKeyIndex , participantId ) ;
378
379
} , this . useKeyDelay ) ;
@@ -386,7 +387,7 @@ export class EncryptionManager implements IEncryptionManager {
386
387
if ( ! this . manageMediaKeys ) return ;
387
388
388
389
this . makeNewKeyTimeout = undefined ;
389
- logger . info ( "Making new sender key for key rotation" ) ;
390
+ this . logger . info ( "Making new sender key for key rotation" ) ;
390
391
const newKeyIndex = this . makeNewSenderKey ( true ) ;
391
392
// send immediately: if we're about to start sending with a new key, it's
392
393
// important we get it out to others as soon as we can.
0 commit comments