Fix FindSharedRooms for non-bridge sqlstatestores

This commit is contained in:
Tulir Asokan 2023-03-31 13:22:46 +03:00
commit e7df474b56
3 changed files with 15 additions and 5 deletions

View file

@ -492,7 +492,7 @@ func (br *Bridge) init() {
br.DB.IgnoreForeignTables = *ignoreForeignTables
br.ZLog.Debug().Msg("Initializing state store")
br.StateStore = sqlstatestore.NewSQLStateStore(br.DB, dbutil.ZeroLogger(br.ZLog.With().Str("db_section", "matrix_state").Logger()))
br.StateStore = sqlstatestore.NewSQLStateStore(br.DB, dbutil.ZeroLogger(br.ZLog.With().Str("db_section", "matrix_state").Logger()), true)
br.AS.StateStore = br.StateStore
br.ZLog.Debug().Msg("Initializing Matrix event processor")

View file

@ -86,7 +86,7 @@ func NewCryptoHelper(cli *mautrix.Client, pickleKey []byte, store any) (*CryptoH
}
log := cli.Log.With().Str("component", "crypto").Logger()
if cli.StateStore == nil && dbForManagedStores != nil {
managedStateStore = sqlstatestore.NewSQLStateStore(dbForManagedStores, dbutil.ZeroLogger(log.With().Str("db_section", "matrix_state").Logger()))
managedStateStore = sqlstatestore.NewSQLStateStore(dbForManagedStores, dbutil.ZeroLogger(log.With().Str("db_section", "matrix_state").Logger()), false)
cli.StateStore = managedStateStore
} else if _, isCryptoCompatible := cli.StateStore.(crypto.StateStore); !isCryptoCompatible {
return nil, fmt.Errorf("the client state store must implement crypto.StateStore")

View file

@ -32,11 +32,13 @@ const VersionTableName = "mx_version"
type SQLStateStore struct {
*dbutil.Database
IsBridge bool
}
func NewSQLStateStore(db *dbutil.Database, log dbutil.DatabaseLogger) *SQLStateStore {
func NewSQLStateStore(db *dbutil.Database, log dbutil.DatabaseLogger, isBridge bool) *SQLStateStore {
return &SQLStateStore{
Database: db.Child(VersionTableName, UpgradeTable, log),
IsBridge: isBridge,
}
}
@ -130,11 +132,19 @@ func (store *SQLStateStore) TryGetMember(roomID id.RoomID, userID id.UserID) (*e
}
func (store *SQLStateStore) FindSharedRooms(userID id.UserID) (rooms []id.RoomID) {
rows, err := store.Query(`
query := `
SELECT room_id FROM mx_user_profile
LEFT JOIN portal ON portal.mxid=mx_user_profile.room_id
WHERE mx_user_profile.user_id=$1 AND portal.encrypted=true
`, userID)
`
if !store.IsBridge {
query = `
SELECT room_id FROM mx_user_profile
LEFT JOIN mx_room_state ON mx_room_state.room_id=mx_user_profile.room_id
WHERE mx_user_profile.user_id=$1 AND mx_room_state.encryption IS NOT NULL
`
}
rows, err := store.Query(query, userID)
if err != nil {
store.Log.Warn("Failed to query shared rooms with %s: %v", userID, err)
return