From fbd56ea54056905256ee686ef54a46cc80dbe4c4 Mon Sep 17 00:00:00 2001 From: JJTech0130 Date: Tue, 2 Jul 2024 16:29:55 -0400 Subject: [PATCH] remove store in favor of serializing into login metadata --- pkg/connector/client.go | 35 ++++++++------ pkg/connector/connector.go | 8 +--- pkg/connector/login.go | 72 ++++++----------------------- pkg/store/container.go | 29 ------------ pkg/store/session_store.go | 78 -------------------------------- pkg/store/upgrades/00-latest.sql | 12 ----- pkg/store/upgrades/upgrades.go | 16 ------- 7 files changed, 37 insertions(+), 213 deletions(-) delete mode 100644 pkg/store/container.go delete mode 100644 pkg/store/session_store.go delete mode 100644 pkg/store/upgrades/00-latest.sql delete mode 100644 pkg/store/upgrades/upgrades.go diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 214fa1e..044692b 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -2,36 +2,43 @@ package connector import ( "context" - "strconv" "go.mau.fi/mautrix-meta/messagix" - //"go.mau.fi/mautrix-meta/pkg/store" + "go.mau.fi/mautrix-meta/messagix/cookies" + "go.mau.fi/mautrix-meta/messagix/types" + "maunium.net/go/mautrix/bridgev2" "maunium.net/go/mautrix/bridgev2/networkid" ) type MetaClient struct { - Main *MetaConnector - //session *store.MetaSession + Main *MetaConnector client *messagix.Client } -func NewMetaClient(ctx context.Context, main *MetaConnector, login *bridgev2.UserLogin) (*MetaClient, error) { - FBID, err := strconv.ParseInt(string(login.ID), 10, 64) - if err != nil { - return nil, err +func cookiesFromMetadata(metadata map[string]interface{}) *cookies.Cookies { + platform := types.Platform(metadata["platform"].(float64)) + + m := make(map[string]string) + for k, v := range metadata["cookies"].(map[string]interface{}) { + m[k] = v.(string) } - session, err := main.store.GetSessionQuery().GetByMetaID(ctx, FBID) - if err != nil { - return nil, err + + c := &cookies.Cookies{ + Platform: platform, } + c.UpdateValues(m) + return c +} + +func NewMetaClient(ctx context.Context, main *MetaConnector, login *bridgev2.UserLogin) (*MetaClient, error) { + cookies := cookiesFromMetadata(login.Metadata.Extra) log := login.User.Log.With().Str("component", "messagix").Logger() - client := messagix.NewClient(session.Cookies, log) + client := messagix.NewClient(cookies, log) return &MetaClient{ - Main: main, - //session: session, + Main: main, client: client, }, nil } diff --git a/pkg/connector/connector.go b/pkg/connector/connector.go index 48533aa..ef96859 100644 --- a/pkg/connector/connector.go +++ b/pkg/connector/connector.go @@ -3,17 +3,12 @@ package connector import ( "context" - "go.mau.fi/util/dbutil" "maunium.net/go/mautrix/bridgev2" - - "go.mau.fi/mautrix-meta/pkg/store" ) type MetaConnector struct { Bridge *bridgev2.Bridge Config *MetaConfig - - store *store.Container } func NewConnector() *MetaConnector { @@ -74,12 +69,11 @@ func (s *MetaConnector) GetName() bridgev2.BridgeName { } func (m *MetaConnector) Init(bridge *bridgev2.Bridge) { - m.store = store.NewStore(bridge.DB.Database, dbutil.ZeroLogger(bridge.Log.With().Str("db_section", "meta").Logger())) m.Bridge = bridge } func (m *MetaConnector) Start(ctx context.Context) error { - return m.store.Upgrade(ctx) + return nil } func (m *MetaConnector) LoadUserLogin(ctx context.Context, login *bridgev2.UserLogin) error { diff --git a/pkg/connector/login.go b/pkg/connector/login.go index 3fd5989..841aee6 100644 --- a/pkg/connector/login.go +++ b/pkg/connector/login.go @@ -13,9 +13,10 @@ import ( "go.mau.fi/mautrix-meta/messagix" "go.mau.fi/mautrix-meta/messagix/cookies" - "go.mau.fi/mautrix-meta/messagix/table" + + //"go.mau.fi/mautrix-meta/messagix/table" "go.mau.fi/mautrix-meta/messagix/types" - "go.mau.fi/mautrix-meta/pkg/store" + //"go.mau.fi/mautrix-meta/pkg/store" ) const FlowIDFacebookCookies = "cookies-facebook" @@ -95,27 +96,6 @@ func (m *MetaCookieLogin) Start(ctx context.Context) (*bridgev2.LoginStep, error func (m *MetaCookieLogin) Cancel() {} -func (m *MetaCookieLogin) getFBID(currentUser types.UserInfo, tbl *table.LSTable) int64 { - var newFBID int64 - // TODO figure out why the contact IDs for self is different than the fbid in the ready event - for _, row := range tbl.LSVerifyContactRowExists { - if row.IsSelf && row.ContactId != newFBID { - if newFBID != 0 { - // Hopefully this won't happen - m.User.Log.Warn().Int64("prev_fbid", newFBID).Int64("new_fbid", row.ContactId).Msg("Got multiple fbids for self") - } else { - m.User.Log.Debug().Int64("fbid", row.ContactId).Msg("Found own fbid") - } - newFBID = row.ContactId - } - } - if newFBID == 0 { - newFBID = currentUser.GetFBID() - m.User.Log.Warn().Int64("fbid", newFBID).Msg("Own contact entry not found, falling back to fbid in current user object") - } - return newFBID -} - func (m *MetaCookieLogin) SubmitCookies(ctx context.Context, strCookies map[string]string) (*bridgev2.LoginStep, error) { c := &cookies.Cookies{ Platform: types.Instagram, @@ -123,10 +103,8 @@ func (m *MetaCookieLogin) SubmitCookies(ctx context.Context, strCookies map[stri if m.Flow == FlowIDFacebookCookies { c.Platform = types.Facebook } - c.UpdateValues(strCookies) - // Check if the cookies are valid if !c.IsLoggedIn() { return nil, fmt.Errorf("invalid cookies") } @@ -134,40 +112,17 @@ func (m *MetaCookieLogin) SubmitCookies(ctx context.Context, strCookies map[stri log := m.User.Log.With().Str("component", "messagix").Logger() client := messagix.NewClient(c, log) - currentUser, initialTable, err := client.LoadMessagesPage() - if err != nil { - return nil, err - } - - FBID := m.getFBID(currentUser, initialTable) - - // Store the cookies in the database - - q := m.Main.store.GetSessionQuery() - session, err := q.GetByMetaID(ctx, FBID) + user, _, err := client.LoadMessagesPage() if err != nil { - return nil, fmt.Errorf("failed to get existing session: %w", err) - } - if session != nil { - log.Debug().Int64("fbid", FBID).Msg("Deleting existing session") - err := q.Delete(ctx, FBID) - if err != nil { - return nil, fmt.Errorf("failed to delete existing session: %w", err) - } + return nil, fmt.Errorf("failed to load messages page: %w", err) } - newSession := store.MetaSession{ - MetaID: FBID, - Cookies: c, - } - err = q.Insert(ctx, &newSession) + id, err := client.FetchFBID() if err != nil { - return nil, fmt.Errorf("failed to save new session: %w", err) + return nil, fmt.Errorf("failed to fetch FBID: %w", err) } - // Store the association between the Matrix user and the cookies - - login_id := networkid.UserLoginID(fmt.Sprint(FBID)) + login_id := networkid.UserLoginID(fmt.Sprint(id)) ul, err := m.Main.Bridge.GetExistingUserLoginByID(ctx, login_id) if err != nil { @@ -183,8 +138,11 @@ func (m *MetaCookieLogin) SubmitCookies(ctx context.Context, strCookies map[stri ID: login_id, Metadata: database.UserLoginMetadata{ StandardUserLoginMetadata: database.StandardUserLoginMetadata{ - // TODO: Is this the correct metadata? Any extra? - RemoteName: currentUser.GetName(), + RemoteName: user.GetName(), + }, + Extra: map[string]interface{}{ + "platform": c.Platform, + "cookies": c, }, }, }, nil) @@ -192,7 +150,7 @@ func (m *MetaCookieLogin) SubmitCookies(ctx context.Context, strCookies map[stri return nil, fmt.Errorf("failed to save new login: %w", err) } } else { - ul.Metadata.RemoteName = currentUser.GetName() + ul.Metadata.RemoteName = user.GetName() err := ul.Save(ctx) if err != nil { return nil, fmt.Errorf("failed to update existing login: %w", err) @@ -208,6 +166,6 @@ func (m *MetaCookieLogin) SubmitCookies(ctx context.Context, strCookies map[stri return &bridgev2.LoginStep{ Type: bridgev2.LoginStepTypeComplete, StepID: "fi.mau.meta.complete", - Instructions: fmt.Sprintf("Logged in as %s (%d)", currentUser.GetName(), FBID), + Instructions: fmt.Sprintf("Logged in as %s (%d)", user.GetName(), id), }, nil } diff --git a/pkg/store/container.go b/pkg/store/container.go deleted file mode 100644 index 0033190..0000000 --- a/pkg/store/container.go +++ /dev/null @@ -1,29 +0,0 @@ -package store - -import ( - "context" - - "go.mau.fi/util/dbutil" - - "go.mau.fi/mautrix-meta/pkg/store/upgrades" -) - -type Container struct { - db *dbutil.Database -} - -func NewStore(db *dbutil.Database, log dbutil.DatabaseLogger) *Container { - return &Container{db: db.Child("meta_version", upgrades.Table, log)} -} - -func (c *Container) Upgrade(ctx context.Context) error { - return c.db.Upgrade(ctx) -} - -func newMetaSession(qh *dbutil.QueryHelper[*MetaSession]) *MetaSession { - return &MetaSession{} -} - -func (c *Container) GetSessionQuery() *MetaSessionQuery { - return &MetaSessionQuery{dbutil.MakeQueryHelper(c.db, newMetaSession)} -} diff --git a/pkg/store/session_store.go b/pkg/store/session_store.go deleted file mode 100644 index 42e2c96..0000000 --- a/pkg/store/session_store.go +++ /dev/null @@ -1,78 +0,0 @@ -package store - -import ( - "context" - "database/sql" - "fmt" - - "go.mau.fi/util/dbutil" - - "go.mau.fi/mautrix-meta/messagix/cookies" - "go.mau.fi/mautrix-meta/messagix/types" -) - -type MetaSession struct { - MetaID int64 - WADeviceID uint16 - Cookies *cookies.Cookies -} - -func (s *MetaSession) Scan(row dbutil.Scannable) (*MetaSession, error) { - var metaID sql.NullInt64 - var waDeviceID sql.NullInt32 - var platform sql.NullString - var newCookies cookies.Cookies - - err := row.Scan( - &metaID, - &platform, - &waDeviceID, - &dbutil.JSON{Data: &newCookies}, - ) - if err != nil { - return nil, err - } - - if platform.String == "instagram" { - newCookies.Platform = types.Instagram - } else if platform.String == "facebook" { - newCookies.Platform = types.Facebook - } else { - // TODO: Fix this err - return nil, fmt.Errorf("unknown platform %s", platform.String) - } - - if newCookies.IsLoggedIn() { - s.Cookies = &newCookies - } - - s.MetaID = metaID.Int64 - s.WADeviceID = uint16(waDeviceID.Int32) - - return s, nil -} - -const ( - getUserByMetaIDQuery = `SELECT meta_id, platform, wa_device_id, cookies FROM "meta_session" WHERE meta_id=$1` - insertUserQuery = `INSERT INTO "meta_session" (meta_id, platform, wa_device_id, cookies) VALUES ($1, $2, $3, $4)` -) - -type MetaSessionQuery struct { - *dbutil.QueryHelper[*MetaSession] -} - -func (q *MetaSessionQuery) GetByMetaID(ctx context.Context, metaID int64) (*MetaSession, error) { - return q.QueryOne(ctx, getUserByMetaIDQuery, metaID) -} - -func (q *MetaSessionQuery) Insert(ctx context.Context, session *MetaSession) error { - platform := "instagram" - if session.Cookies.Platform == types.Facebook { - platform = "facebook" - } - return q.Exec(ctx, insertUserQuery, session.MetaID, platform, session.WADeviceID, dbutil.JSON{Data: &session.Cookies}) -} - -func (q *MetaSessionQuery) Delete(ctx context.Context, metaID int64) error { - return q.Exec(ctx, `DELETE FROM "meta_session" WHERE meta_id=$1`, metaID) -} diff --git a/pkg/store/upgrades/00-latest.sql b/pkg/store/upgrades/00-latest.sql deleted file mode 100644 index 4f26ce0..0000000 --- a/pkg/store/upgrades/00-latest.sql +++ /dev/null @@ -1,12 +0,0 @@ --- v0 -> v1: Latest revision - -CREATE TABLE meta_session ( - meta_id BIGINT PRIMARY KEY, - platform TEXT NOT NULL, - wa_device_id INTEGER, - cookies jsonb, - - -- platform must be "instagram" or "facebook" - CONSTRAINT platform_check CHECK (platform = 'instagram' OR platform = 'facebook'), - CONSTRAINT user_meta_id_unique UNIQUE(meta_id) -); diff --git a/pkg/store/upgrades/upgrades.go b/pkg/store/upgrades/upgrades.go deleted file mode 100644 index 22c5414..0000000 --- a/pkg/store/upgrades/upgrades.go +++ /dev/null @@ -1,16 +0,0 @@ -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) -}