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
@@ -86,7 +84,7 @@ export class EncryptionManager implements IEncryptionManager {
86
84
private mediaTrailerKeyIndexInUse = - 1 ;
87
85
private latestGeneratedKeyIndex = - 1 ;
88
86
private joinConfig : EncryptionConfig | undefined ;
89
-
87
+ private logger : Logger ;
90
88
public constructor (
91
89
private userId : string ,
92
90
private deviceId : string ,
@@ -98,7 +96,10 @@ export class EncryptionManager implements IEncryptionManager {
98
96
encryptionKeyIndex : number ,
99
97
participantId : string ,
100
98
) => void ,
101
- ) { }
99
+ parentLogger ?: Logger ,
100
+ ) {
101
+ this . logger = ( parentLogger ?? rootLogger ) . getChild ( `[EncryptionManager]` ) ;
102
+ }
102
103
103
104
public getEncryptionKeys ( ) : Map < string , Array < { key : Uint8Array ; timestamp : number } > > {
104
105
return this . encryptionKeys ;
@@ -166,11 +167,11 @@ export class EncryptionManager implements IEncryptionManager {
166
167
if ( this . makeNewKeyTimeout ) {
167
168
// existing rotation in progress, so let it complete
168
169
} else {
169
- logger . debug ( `Member(s) have left: queueing sender key rotation` ) ;
170
+ this . logger . debug ( `Member(s) have left: queueing sender key rotation` ) ;
170
171
this . makeNewKeyTimeout = setTimeout ( this . onRotateKeyTimeout , this . makeKeyDelay ) ;
171
172
}
172
173
} else if ( anyJoined ) {
173
- logger . debug ( `New member(s) have joined: re-sending keys` ) ;
174
+ this . logger . debug ( `New member(s) have joined: re-sending keys` ) ;
174
175
this . requestSendCurrentKey ( ) ;
175
176
} else if ( oldFingerprints ) {
176
177
// does it look like any of the members have updated their memberships?
@@ -182,7 +183,7 @@ export class EncryptionManager implements IEncryptionManager {
182
183
Array . from ( oldFingerprints ) . some ( ( x ) => ! newFingerprints . has ( x ) ) ||
183
184
Array . from ( newFingerprints ) . some ( ( x ) => ! oldFingerprints . has ( x ) ) ;
184
185
if ( candidateUpdates ) {
185
- logger . debug ( `Member(s) have updated/reconnected: re-sending keys to everyone` ) ;
186
+ this . logger . debug ( `Member(s) have updated/reconnected: re-sending keys to everyone` ) ;
186
187
this . requestSendCurrentKey ( ) ;
187
188
}
188
189
}
@@ -198,7 +199,7 @@ export class EncryptionManager implements IEncryptionManager {
198
199
private makeNewSenderKey ( delayBeforeUse = false ) : number {
199
200
const encryptionKey = secureRandomBase64Url ( 16 ) ;
200
201
const encryptionKeyIndex = this . getNewEncryptionKeyIndex ( ) ;
201
- logger . info ( "Generated new key at index " + encryptionKeyIndex ) ;
202
+ this . logger . info ( "Generated new key at index " + encryptionKeyIndex ) ;
202
203
this . setEncryptionKey (
203
204
this . userId ,
204
205
this . deviceId ,
@@ -221,7 +222,7 @@ export class EncryptionManager implements IEncryptionManager {
221
222
this . lastEncryptionKeyUpdateRequest &&
222
223
this . lastEncryptionKeyUpdateRequest + this . updateEncryptionKeyThrottle > Date . now ( )
223
224
) {
224
- logger . info ( "Last encryption key event sent too recently: postponing" ) ;
225
+ this . logger . info ( "Last encryption key event sent too recently: postponing" ) ;
225
226
if ( this . keysEventUpdateTimeout === undefined ) {
226
227
this . keysEventUpdateTimeout = setTimeout (
227
228
( ) => void this . sendEncryptionKeysEvent ( ) ,
@@ -260,47 +261,47 @@ export class EncryptionManager implements IEncryptionManager {
260
261
const myKeys = this . getKeysForParticipant ( this . userId , this . deviceId ) ;
261
262
262
263
if ( ! myKeys ) {
263
- logger . warn ( "Tried to send encryption keys event but no keys found!" ) ;
264
+ this . logger . warn ( "Tried to send encryption keys event but no keys found!" ) ;
264
265
return ;
265
266
}
266
267
267
268
if ( typeof indexToSend !== "number" && this . latestGeneratedKeyIndex === - 1 ) {
268
- logger . warn ( "Tried to send encryption keys event but no current key index found!" ) ;
269
+ this . logger . warn ( "Tried to send encryption keys event but no current key index found!" ) ;
269
270
return ;
270
271
}
271
272
272
273
const keyIndexToSend = indexToSend ?? this . latestGeneratedKeyIndex ;
273
274
// TODO remove this debug log. it just shows then when sending mediaTrailerKeyIndexInUse contained the wrong index.
274
- logger . debug (
275
+ this . logger . debug (
275
276
`Compare key in use to last generated key\n` ,
276
277
`latestGeneratedKeyIndex: ${ this . latestGeneratedKeyIndex } \n` ,
277
278
`mediaTrailerKeyIndexInUse: ${ this . mediaTrailerKeyIndexInUse } ` ,
278
279
) ;
279
- logger . info (
280
+ this . logger . info (
280
281
`Try sending encryption keys event. keyIndexToSend=${ keyIndexToSend } (method parameter: ${ indexToSend } )` ,
281
282
) ;
282
283
const keyToSend = myKeys [ keyIndexToSend ] ;
283
284
284
285
try {
285
286
this . statistics . counters . roomEventEncryptionKeysSent += 1 ;
286
287
await this . transport . sendKey ( encodeUnpaddedBase64 ( keyToSend ) , keyIndexToSend , this . getMemberships ( ) ) ;
287
- logger . debug (
288
+ this . logger . debug (
288
289
`sendEncryptionKeysEvent participantId=${ this . userId } :${ this . deviceId } numKeys=${ myKeys . length } currentKeyIndex=${ this . latestGeneratedKeyIndex } keyIndexToSend=${ keyIndexToSend } ` ,
289
290
this . encryptionKeys ,
290
291
) ;
291
292
} catch ( error ) {
292
293
if ( this . keysEventUpdateTimeout === undefined ) {
293
294
const resendDelay = safeGetRetryAfterMs ( error , 5000 ) ;
294
- logger . warn ( `Failed to send m.call.encryption_key, retrying in ${ resendDelay } ` , error ) ;
295
+ this . logger . warn ( `Failed to send m.call.encryption_key, retrying in ${ resendDelay } ` , error ) ;
295
296
this . keysEventUpdateTimeout = setTimeout ( ( ) => void this . sendEncryptionKeysEvent ( ) , resendDelay ) ;
296
297
} else {
297
- logger . info ( "Not scheduling key resend as another re-send is already pending" ) ;
298
+ this . logger . info ( "Not scheduling key resend as another re-send is already pending" ) ;
298
299
}
299
300
}
300
301
} ;
301
302
302
303
public onNewKeyReceived : KeyTransportEventListener = ( userId , deviceId , keyBase64Encoded , index , timestamp ) => {
303
- logger . debug ( `Received key over key transport ${ userId } :${ deviceId } at index ${ index } ` ) ;
304
+ this . logger . debug ( `Received key over key transport ${ userId } :${ deviceId } at index ${ index } ` ) ;
304
305
this . setEncryptionKey ( userId , deviceId , index , keyBase64Encoded , timestamp ) ;
305
306
} ;
306
307
@@ -343,7 +344,7 @@ export class EncryptionManager implements IEncryptionManager {
343
344
timestamp : number ,
344
345
delayBeforeUse = false ,
345
346
) : void {
346
- logger . debug ( `Setting encryption key for ${ userId } :${ deviceId } at index ${ encryptionKeyIndex } ` ) ;
347
+ this . logger . debug ( `Setting encryption key for ${ userId } :${ deviceId } at index ${ encryptionKeyIndex } ` ) ;
347
348
const keyBin = decodeBase64 ( encryptionKeyString ) ;
348
349
349
350
const participantId = getParticipantId ( userId , deviceId ) ;
@@ -356,7 +357,7 @@ export class EncryptionManager implements IEncryptionManager {
356
357
357
358
if ( existingKeyAtIndex ) {
358
359
if ( existingKeyAtIndex . timestamp > timestamp ) {
359
- logger . info (
360
+ this . logger . info (
360
361
`Ignoring new key at index ${ encryptionKeyIndex } for ${ participantId } as it is older than existing known key` ,
361
362
) ;
362
363
return ;
@@ -385,7 +386,7 @@ export class EncryptionManager implements IEncryptionManager {
385
386
if ( delayBeforeUse ) {
386
387
const useKeyTimeout = setTimeout ( ( ) => {
387
388
this . setNewKeyTimeouts . delete ( useKeyTimeout ) ;
388
- logger . info ( `Delayed-emitting key changed event for ${ participantId } index ${ encryptionKeyIndex } ` ) ;
389
+ this . logger . info ( `Delayed-emitting key changed event for ${ participantId } index ${ encryptionKeyIndex } ` ) ;
389
390
if ( userId === this . userId && deviceId === this . deviceId ) {
390
391
this . mediaTrailerKeyIndexInUse = encryptionKeyIndex ;
391
392
}
@@ -404,7 +405,7 @@ export class EncryptionManager implements IEncryptionManager {
404
405
if ( ! this . manageMediaKeys ) return ;
405
406
406
407
this . makeNewKeyTimeout = undefined ;
407
- logger . info ( "Making new sender key for key rotation" ) ;
408
+ this . logger . info ( "Making new sender key for key rotation" ) ;
408
409
const newKeyIndex = this . makeNewSenderKey ( true ) ;
409
410
// send immediately: if we're about to start sending with a new key, it's
410
411
// important we get it out to others as soon as we can.
0 commit comments