cryptostore.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // Copyright (c) 2022 Tulir Asokan
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this
  5. // file, You can obtain one at http://mozilla.org/MPL/2.0/.
  6. //go:build cgo && !nocrypto
  7. package database
  8. import (
  9. "database/sql"
  10. "maunium.net/go/mautrix/crypto"
  11. "maunium.net/go/mautrix/id"
  12. )
  13. type SQLCryptoStore struct {
  14. *crypto.SQLCryptoStore
  15. UserID id.UserID
  16. GhostIDFormat string
  17. }
  18. var _ crypto.Store = (*SQLCryptoStore)(nil)
  19. func NewSQLCryptoStore(db *Database, userID id.UserID, ghostIDFormat string) *SQLCryptoStore {
  20. return &SQLCryptoStore{
  21. SQLCryptoStore: crypto.NewSQLCryptoStore(db.Database, "", "", []byte("maunium.net/go/mautrix-whatsapp")),
  22. UserID: userID,
  23. GhostIDFormat: ghostIDFormat,
  24. }
  25. }
  26. func (store *SQLCryptoStore) FindDeviceID() (deviceID id.DeviceID) {
  27. err := store.DB.QueryRow("SELECT device_id FROM crypto_account WHERE account_id=$1", store.AccountID).Scan(&deviceID)
  28. if err != nil && err != sql.ErrNoRows {
  29. store.Log.Warn("Failed to scan device ID: %v", err)
  30. }
  31. return
  32. }
  33. func (store *SQLCryptoStore) GetRoomMembers(roomID id.RoomID) (members []id.UserID, err error) {
  34. var rows *sql.Rows
  35. rows, err = store.DB.Query(`
  36. SELECT user_id FROM mx_user_profile
  37. WHERE room_id=$1
  38. AND (membership='join' OR membership='invite')
  39. AND user_id<>$2
  40. AND user_id NOT LIKE $3
  41. `, roomID, store.UserID, store.GhostIDFormat)
  42. if err != nil {
  43. return
  44. }
  45. for rows.Next() {
  46. var userID id.UserID
  47. err := rows.Scan(&userID)
  48. if err != nil {
  49. store.Log.Warn("Failed to scan member in %s: %v", roomID, err)
  50. } else {
  51. members = append(members, userID)
  52. }
  53. }
  54. return
  55. }