Skip to content

Encryption doesn't seem to work on Dendrite #333

@LunaSquee

Description

@LunaSquee

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions