Skip to content
Snippets Groups Projects
Commit f48b3664 authored by Tulir Asokan's avatar Tulir Asokan :cat2:
Browse files

Store messenger url in db

parent 0acc39ad
No related branches found
No related tags found
No related merge requests found
"""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 ###
...@@ -29,6 +29,7 @@ class User(Base): ...@@ -29,6 +29,7 @@ class User(Base):
fbid: str = Column(String(255), nullable=True) fbid: str = Column(String(255), nullable=True)
notice_room: RoomID = Column(String(255), nullable=True) notice_room: RoomID = Column(String(255), nullable=True)
user_agent: str = 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 @classmethod
def all(cls) -> Iterable['User']: def all(cls) -> Iterable['User']:
......
...@@ -58,6 +58,7 @@ class User(BaseUser): ...@@ -58,6 +58,7 @@ class User(BaseUser):
notice_room: RoomID notice_room: RoomID
_notice_room_lock: asyncio.Lock _notice_room_lock: asyncio.Lock
_notice_send_lock: asyncio.Lock _notice_send_lock: asyncio.Lock
fb_domain: str
user_agent: Optional[str] user_agent: Optional[str]
is_admin: bool is_admin: bool
permission_level: str permission_level: str
...@@ -78,13 +79,14 @@ class User(BaseUser): ...@@ -78,13 +79,14 @@ class User(BaseUser):
def __init__(self, mxid: UserID, session: Optional[Dict[str, str]] = None, def __init__(self, mxid: UserID, session: Optional[Dict[str, str]] = None,
notice_room: Optional[RoomID] = None, user_agent: Optional[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.mxid = mxid
self.by_mxid[mxid] = self self.by_mxid[mxid] = self
self.notice_room = notice_room self.notice_room = notice_room
self._notice_room_lock = asyncio.Lock() self._notice_room_lock = asyncio.Lock()
self._notice_send_lock = asyncio.Lock() self._notice_send_lock = asyncio.Lock()
self.user_agent = user_agent self.user_agent = user_agent
self.fb_domain = fb_domain
self.command_status = None self.command_status = None
self.is_whitelisted, self.is_admin, self.permission_level = config.get_permissions(mxid) self.is_whitelisted, self.is_admin, self.permission_level = config.get_permissions(mxid)
self._is_logged_in = None self._is_logged_in = None
...@@ -145,20 +147,22 @@ class User(BaseUser): ...@@ -145,20 +147,22 @@ class User(BaseUser):
def db_instance(self) -> DBUser: def db_instance(self) -> DBUser:
if not self._db_instance: if not self._db_instance:
self._db_instance = DBUser(mxid=self.mxid, session=self._session_data, fbid=self.fbid, 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 return self._db_instance
def save(self, _update_session_data: bool = True) -> None: def save(self, _update_session_data: bool = True) -> None:
self.log.debug("Saving session") self.log.debug("Saving session")
if _update_session_data and self.session: if _update_session_data and self.session:
self._session_data = self.session.get_cookies() 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) notice_room=self.notice_room, user_agent=self.user_agent)
@classmethod @classmethod
def from_db(cls, db_user: DBUser) -> 'User': def from_db(cls, db_user: DBUser) -> 'User':
return User(mxid=db_user.mxid, session=db_user.session, user_agent=db_user.user_agent, 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 @classmethod
def get_all(cls) -> Iterator['User']: def get_all(cls) -> Iterator['User']:
...@@ -205,7 +209,8 @@ class User(BaseUser): ...@@ -205,7 +209,8 @@ class User(BaseUser):
return False return False
try: try:
session = await fbchat.Session.from_cookies(self._session_data, 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() logged_in = await session.is_logged_in()
except ProxyError: except ProxyError:
self.log.exception("ProxyError while trying to restore session, " self.log.exception("ProxyError while trying to restore session, "
...@@ -575,6 +580,7 @@ class User(BaseUser): ...@@ -575,6 +580,7 @@ class User(BaseUser):
async def on_logged_in(self, session: fbchat.Session) -> None: async def on_logged_in(self, session: fbchat.Session) -> None:
self.session = session self.session = session
self.fb_domain = session.domain
self.client = fbchat.Client(session=session) self.client = fbchat.Client(session=session)
self.save() self.save()
self.stop_listening() self.stop_listening()
......
...@@ -122,7 +122,13 @@ class PublicBridgeWebsite: ...@@ -122,7 +122,13 @@ class PublicBridgeWebsite:
raise web.HTTPBadRequest(body='{"error": "Malformed JSON"}', headers=self._headers) raise web.HTTPBadRequest(body='{"error": "Malformed JSON"}', headers=self._headers)
try: 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: except fbchat.FacebookError:
self.log.debug("Failed to log in", exc_info=True) self.log.debug("Failed to log in", exc_info=True)
raise web.HTTPUnauthorized(body='{"error": "Facebook authorization failed"}', raise web.HTTPUnauthorized(body='{"error": "Facebook authorization failed"}',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment