64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package store
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
|
|
"maunium.net/go/mautrix/event"
|
|
"maunium.net/go/mautrix/id"
|
|
)
|
|
|
|
// NOTE: functions in that file are for crypto.StateStore implementation
|
|
// ref: https://pkg.go.dev/maunium.net/go/mautrix/crypto#StateStore
|
|
|
|
// GetEncryptionEvent returns the encryption event's content for an encrypted room.
|
|
func (s *Store) GetEncryptionEvent(roomID id.RoomID) *event.EncryptionEventContent {
|
|
if !s.encryption {
|
|
return nil
|
|
}
|
|
s.log.Debug("finding encryption event of %q", roomID)
|
|
query := "SELECT encryption_event FROM rooms WHERE room_id = $1"
|
|
row := s.db.QueryRow(query, roomID)
|
|
|
|
var encryptionEventJSON []byte
|
|
err := row.Scan(&encryptionEventJSON)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
s.log.Error("cannot find encryption event: %v", err)
|
|
return nil
|
|
}
|
|
var encryptionEvent event.EncryptionEventContent
|
|
if err := json.Unmarshal(encryptionEventJSON, &encryptionEvent); err != nil {
|
|
s.log.Debug("cannot unmarshal encryption event: %q", err)
|
|
return nil
|
|
}
|
|
|
|
return &encryptionEvent
|
|
}
|
|
|
|
// FindSharedRooms returns the encrypted rooms that another user is also in for a user ID.
|
|
func (s *Store) FindSharedRooms(userID id.UserID) []id.RoomID {
|
|
if !s.encryption {
|
|
return nil
|
|
}
|
|
s.log.Debug("loading shared rooms for %q", userID)
|
|
query := "SELECT room_id FROM room_members WHERE user_id = $1"
|
|
rows, queryErr := s.db.Query(query, userID)
|
|
rooms := make([]id.RoomID, 0)
|
|
if queryErr != nil {
|
|
s.log.Error("cannot load room members: %q", queryErr)
|
|
return rooms
|
|
}
|
|
defer rows.Close()
|
|
|
|
var roomID id.RoomID
|
|
for rows.Next() {
|
|
scanErr := rows.Scan(&roomID)
|
|
if scanErr != nil {
|
|
continue
|
|
}
|
|
rooms = append(rooms, roomID)
|
|
}
|
|
|
|
return rooms
|
|
}
|