login: reimplement login in connector interface

Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
Sumner Evans
2024-06-04 13:06:10 -06:00
parent f2219a1e06
commit 6511adc480
14 changed files with 661 additions and 25 deletions
+41
View File
@@ -0,0 +1,41 @@
// mautrix-telegram - A Matrix-Telegram puppeting bridge.
// Copyright (C) 2024 Sumner Evans
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package store
import (
"context"
"go.mau.fi/util/dbutil"
"go.mau.fi/mautrix-telegram/pkg/store/upgrades"
)
type Container struct {
db *dbutil.Database
}
func NewStore(db *dbutil.Database, log dbutil.DatabaseLogger) *Container {
return &Container{db: db.Child("telegram_version", upgrades.Table, log)}
}
func (c *Container) Upgrade(ctx context.Context) error {
return c.db.Upgrade(ctx)
}
func (c *Container) GetSessionStore(telegramUserID int64) *SessionStore {
return &SessionStore{c.db, telegramUserID}
}
+39
View File
@@ -0,0 +1,39 @@
package store
import (
"context"
"github.com/gotd/td/session"
"go.mau.fi/util/dbutil"
)
// SessionStore is a wrapper around a database that implements
// [session.Storage] scoped to a specific Telegram user ID.
type SessionStore struct {
db *dbutil.Database
telegramUserID int64
}
var _ session.Storage = (*SessionStore)(nil)
const (
loadSessionQuery = `SELECT session_data FROM telegram_session WHERE user_id=$1`
storeSessionQuery = `
INSERT INTO telegram_session (user_id, session_data)
VALUES ($1, $2)
ON CONFLICT (user_id) DO UPDATE SET session_data=excluded.session_data
`
)
// LoadSession loads session data from the database.
func (s *SessionStore) LoadSession(ctx context.Context) (sessionData []byte, err error) {
row := s.db.QueryRow(ctx, loadSessionQuery, s.telegramUserID)
err = row.Scan(&sessionData)
return
}
// StoreSession stores session data for a login into the database.
func (s *SessionStore) StoreSession(ctx context.Context, data []byte) error {
_, err := s.db.Exec(ctx, storeSessionQuery, s.telegramUserID, data)
return err
}
+7
View File
@@ -0,0 +1,7 @@
-- v0 -> v1: Latest revision
-- TODO do I need to have bridge ID here?
CREATE TABLE telegram_session (
user_id INTEGER PRIMARY KEY,
session_data BYTEA NOT NULL
);
+32
View File
@@ -0,0 +1,32 @@
// mautrix-telegram - A Matrix-Telegram puppeting bridge.
// Copyright (C) 2024 Sumner Evans
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package upgrades
import (
"embed"
"go.mau.fi/util/dbutil"
)
var Table dbutil.UpgradeTable
//go:embed *.sql
var rawUpgrades embed.FS
func init() {
Table.RegisterFS(rawUpgrades)
}