turt2live / matrix-bot-sdk

TypeScript/JavaScript SDK for Matrix bots
MIT License
194 stars 68 forks source link

Encryption doesn't seem to work on Dendrite #333

Open LunaSquee opened 1 year ago

LunaSquee commented 1 year ago

Describe the bug When setting up a RustSdkCryptoStorageProvider on the MatrixClient, it keeps throwing the error user_id or device_id mismatch in the log and doesn't actually seem to synchronize beyond that point.

MatrixHttpClient (REQ-371) POST http://localhost/_matrix/client/v3/keys/upload
Trace: MatrixHttpClient (REQ-371) body = {"device_keys":null,"fallback_keys":{"signed_curve25519:AAAAAAAAAAA":{"fallback":true,"key":"redacted key","signatures":{"@bot:localhost":{"ed25519:p2ivEVrj":"redacted key"}}}},"one_time_keys":{}}
MatrixHttpClient (REQ-371) {                      
  '@bot:localhost': {               
    p2ivEVrj: {                                                                                                
      error: 'user_id or device_id mismatch: users:  - @bot:localhost, devices:  - p2ivEVrj'
    }
  }
}                                           

and also the following messages are thrown

MatrixHttpClient (REQ-432) GET http://localhost/_matrix/client/v3/rooms/<room id>/state/m.room.encryption/                                                                                 
MatrixHttpClient (REQ-432) {                                                                                   
  errcode: 'M_NOT_FOUND',                                                                                      
  error: 'Cannot find state event for "m.room.encryption"'                                                     
}                                                                                                              

and

MatrixClientLite Error handling sync [object Object]                
MatrixClientLite Backing off for 12581.64578790571ms

To Reproduce Steps to reproduce the behavior:

  1. Setup a dendrite server or use a public one.
  2. Connect to the server, the user must be in an encrypted room.
  3. Observe logs. No messages are coming through as sync seems to be failing.

Very minimal example code:

import {
  MatrixClient,
  SimpleFsStorageProvider,
  RustSdkCryptoStorageProvider,
  AutojoinRoomsMixin,
} from 'matrix-bot-sdk';
import { StoreType } from '@matrix-org/matrix-sdk-crypto-nodejs';

const storage = new SimpleFsStorageProvider('.matrix.db.json');
const cryptoStorage = new RustSdkCryptoStorageProvider('.matrix-sled', StoreType.Sled);    

const client = new MatrixClient('localhost', 'access token', storage, cryptoStorage);
AutojoinRoomsMixin.setupOnClient(client);

client.on('room.message', (...dargs) => console.log(...dargs));
client.start();

I also tried with password auth in code directly so that the room ID would immediately be associated with this crypto storage but that to also no avail (just using passwordLogin and taking the accessToken from the created MatrixClient)

Expected behavior It should handle encrypted rooms correctly.

Log snippet Dendrite log:

time="2023-08-01T18:45:51.815739336Z" level=error msg="Failed to upload one or more keys" key_errors="map[@bot:localhost:map[p2ivEVrj:user_id or device_id mismatch: users:  - @bot:localhost, devices:  - p2ivEVrj]]" req.id=mJFiUUqjzVpV req.method=POST req.path=/_matrix/client/v3/keys/upload user_id="@bot:localhost"

Additional context I could trace the error back to this request https://github.com/turt2live/matrix-bot-sdk/blob/main/src/e2ee/RustEngine.ts#L136 but im not exactly sure how to interpret this as im not familiar with "OlmMachine".

Dendrite source code I speculate the error might be from but im not absolutely sure about it: https://github.com/matrix-org/dendrite/blob/main/userapi/internal/key_api.go#L685-L695

turt2live commented 1 year ago

This is probably caused by device_keys: null in the request, which the spec doesn't clarify as being allowed to be null or not.

LunaSquee commented 1 year ago

Could this be an upstream rust-sdk issue then? I have no real way to test that

turt2live commented 1 year ago

it's most likely a bot-sdk bug, but it's arguable that Dendrite is overly strict here.

pix commented 8 months ago

I can confirm this is fixing the issue for me.