From f48b3664b2779e5e6d954bd7b22e72c03d1c1de7 Mon Sep 17 00:00:00 2001
From: Tulir Asokan <tulir@maunium.net>
Date: Mon, 31 Aug 2020 18:53:25 +0300
Subject: [PATCH] Store messenger url in db

---
 ...3c59aa2a3af9_add_messenger_domain_to_db.py | 32 +++++++++++++++++++
 mautrix_facebook/db/user.py                   |  1 +
 mautrix_facebook/user.py                      | 16 +++++++---
 mautrix_facebook/web/public.py                |  8 ++++-
 4 files changed, 51 insertions(+), 6 deletions(-)
 create mode 100644 alembic/versions/3c59aa2a3af9_add_messenger_domain_to_db.py

diff --git a/alembic/versions/3c59aa2a3af9_add_messenger_domain_to_db.py b/alembic/versions/3c59aa2a3af9_add_messenger_domain_to_db.py
new file mode 100644
index 0000000..c7dcb43
--- /dev/null
+++ b/alembic/versions/3c59aa2a3af9_add_messenger_domain_to_db.py
@@ -0,0 +1,32 @@
+"""Add messenger domain to db
+
+Revision ID: 3c59aa2a3af9
+Revises: 2162f7ae5365
+Create Date: 2020-08-31 18:48:20.989464
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+# revision identifiers, used by Alembic.
+revision = '3c59aa2a3af9'
+down_revision = '2162f7ae5365'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('user', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('fb_domain', sa.String(length=255), nullable=False,
+                                      server_default="messenger.com"))
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('user', schema=None) as batch_op:
+        batch_op.drop_column('fb_domain')
+
+    # ### end Alembic commands ###
diff --git a/mautrix_facebook/db/user.py b/mautrix_facebook/db/user.py
index 92aadc3..2936561 100644
--- a/mautrix_facebook/db/user.py
+++ b/mautrix_facebook/db/user.py
@@ -29,6 +29,7 @@ class User(Base):
     fbid: str = Column(String(255), nullable=True)
     notice_room: RoomID = Column(String(255), nullable=True)
     user_agent: str = Column(String(255), nullable=True)
+    fb_domain: str = Column(String(255), nullable=False, server_default="messenger.com")
 
     @classmethod
     def all(cls) -> Iterable['User']:
diff --git a/mautrix_facebook/user.py b/mautrix_facebook/user.py
index b03fedd..1ffca33 100644
--- a/mautrix_facebook/user.py
+++ b/mautrix_facebook/user.py
@@ -58,6 +58,7 @@ class User(BaseUser):
     notice_room: RoomID
     _notice_room_lock: asyncio.Lock
     _notice_send_lock: asyncio.Lock
+    fb_domain: str
     user_agent: Optional[str]
     is_admin: bool
     permission_level: str
@@ -78,13 +79,14 @@ class User(BaseUser):
 
     def __init__(self, mxid: UserID, session: Optional[Dict[str, str]] = None,
                  notice_room: Optional[RoomID] = None, user_agent: Optional[str] = None,
-                 db_instance: Optional[DBUser] = None) -> None:
+                 fb_domain: str = "messenger.com", db_instance: Optional[DBUser] = None) -> None:
         self.mxid = mxid
         self.by_mxid[mxid] = self
         self.notice_room = notice_room
         self._notice_room_lock = asyncio.Lock()
         self._notice_send_lock = asyncio.Lock()
         self.user_agent = user_agent
+        self.fb_domain = fb_domain
         self.command_status = None
         self.is_whitelisted, self.is_admin, self.permission_level = config.get_permissions(mxid)
         self._is_logged_in = None
@@ -145,20 +147,22 @@ class User(BaseUser):
     def db_instance(self) -> DBUser:
         if not self._db_instance:
             self._db_instance = DBUser(mxid=self.mxid, session=self._session_data, fbid=self.fbid,
-                                       notice_room=self.notice_room, user_agent=self.user_agent)
+                                       notice_room=self.notice_room, user_agent=self.user_agent,
+                                       fb_domain=self.fb_domain)
         return self._db_instance
 
     def save(self, _update_session_data: bool = True) -> None:
         self.log.debug("Saving session")
         if _update_session_data and self.session:
             self._session_data = self.session.get_cookies()
-        self.db_instance.edit(session=self._session_data, fbid=self.fbid,
+        self.db_instance.edit(session=self._session_data, fbid=self.fbid, fb_domain=self.fb_domain,
                               notice_room=self.notice_room, user_agent=self.user_agent)
 
     @classmethod
     def from_db(cls, db_user: DBUser) -> 'User':
         return User(mxid=db_user.mxid, session=db_user.session, user_agent=db_user.user_agent,
-                    notice_room=db_user.notice_room, db_instance=db_user)
+                    notice_room=db_user.notice_room, fb_domain=db_user.fb_domain,
+                    db_instance=db_user)
 
     @classmethod
     def get_all(cls) -> Iterator['User']:
@@ -205,7 +209,8 @@ class User(BaseUser):
             return False
         try:
             session = await fbchat.Session.from_cookies(self._session_data,
-                                                        user_agent=self.user_agent)
+                                                        user_agent=self.user_agent,
+                                                        domain=self.fb_domain)
             logged_in = await session.is_logged_in()
         except ProxyError:
             self.log.exception("ProxyError while trying to restore session, "
@@ -575,6 +580,7 @@ class User(BaseUser):
 
     async def on_logged_in(self, session: fbchat.Session) -> None:
         self.session = session
+        self.fb_domain = session.domain
         self.client = fbchat.Client(session=session)
         self.save()
         self.stop_listening()
diff --git a/mautrix_facebook/web/public.py b/mautrix_facebook/web/public.py
index 926301e..e9481ff 100644
--- a/mautrix_facebook/web/public.py
+++ b/mautrix_facebook/web/public.py
@@ -122,7 +122,13 @@ class PublicBridgeWebsite:
             raise web.HTTPBadRequest(body='{"error": "Malformed JSON"}', headers=self._headers)
 
         try:
-            session = await fbchat.Session.from_cookies(data, user_agent=user.user_agent)
+            domain = data.pop("domain")
+        except KeyError:
+            domain = "messenger.com"
+
+        try:
+            session = await fbchat.Session.from_cookies(data, user_agent=user.user_agent,
+                                                        domain=domain)
         except fbchat.FacebookError:
             self.log.debug("Failed to log in", exc_info=True)
             raise web.HTTPUnauthorized(body='{"error": "Facebook authorization failed"}',
-- 
GitLab