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 0000000000000000000000000000000000000000..c7dcb438fbdc4e7b53d16e3503fbd5ea84580d4e --- /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 92aadc3ffec07b07165997b177dc5a2a2c6e5137..2936561b66cc2af11ad544a7872a6b298f37e229 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 b03fedd42152fb830b3b76b7a557458449e24d6a..1ffca339a34039bf160c84e319a4bf6976f837f3 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 926301e02e41e41068e936c7d4133cdae9739cea..e9481ffe312f515cd75ca9b59d940382238903d0 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"}',