From 230c849b600857e40e4a150299247664f001684d Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Wed, 26 Jun 2019 23:04:07 +0200 Subject: [PATCH] Always create the State object in a valid state --- fbchat/_client.py | 18 +++++------------- fbchat/_state.py | 10 ++-------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/fbchat/_client.py b/fbchat/_client.py index 6ff03a7..9c99d81 100644 --- a/fbchat/_client.py +++ b/fbchat/_client.py @@ -78,9 +78,7 @@ class Client(object): :raises: FBchatException on failed login """ self._sticky, self._pool = (None, None) - self._state = State.with_user_agent(user_agent=user_agent) self._seq = "0" - self._uid = None self._client_id = hex(int(random() * 2 ** 31))[2:] self._default_thread_id = None self._default_thread_type = None @@ -93,7 +91,7 @@ class Client(object): # If session cookies aren't set, not properly loaded or gives us an invalid session, then do the login if ( not session_cookies - or not self.setSession(session_cookies) + or not self.setSession(session_cookies, user_agent=user_agent) or not self.isLoggedIn() ): self.login(email, password, max_tries, user_agent=user_agent) @@ -247,7 +245,7 @@ class Client(object): """ return self._state.get_cookies() - def setSession(self, session_cookies): + def setSession(self, session_cookies, user_agent=None): """Loads session cookies :param session_cookies: A dictionay containing session cookies @@ -255,23 +253,17 @@ class Client(object): :return: False if `session_cookies` does not contain proper cookies :rtype: bool """ - # Quick check to see if session_cookies is formatted properly - if not session_cookies or "c_user" not in session_cookies: - return False - try: # Load cookies into current session - self._state = State.from_cookies( - session_cookies, user_agent=self._state._session.headers["User-Agent"] - ) + state = State.from_cookies(session_cookies, user_agent=user_agent) except Exception as e: log.exception("Failed loading session") - self._state = State() return False - uid = self._state.get_user_id() + uid = state.get_user_id() if uid is None: log.warning("Could not find c_user cookie") return False + self._state = state self._uid = uid return True diff --git a/fbchat/_state.py b/fbchat/_state.py index 75b9dff..d758156 100644 --- a/fbchat/_state.py +++ b/fbchat/_state.py @@ -82,8 +82,8 @@ class State(object): """Stores and manages state required for most Facebook requests.""" _session = attr.ib(factory=session_factory) - fb_dtsg = attr.ib(None) - _revision = attr.ib(None) + fb_dtsg = attr.ib() + _revision = attr.ib() _counter = attr.ib(0) _logout_h = attr.ib(None) @@ -94,8 +94,6 @@ class State(object): return str(rtn) def get_params(self): - if self.fb_dtsg is None: - return {} self._counter += 1 # TODO: Make this operation atomic / thread-safe return { "__a": 1, @@ -185,7 +183,3 @@ class State(object): session = session_factory(user_agent=user_agent) session.cookies = requests.cookies.merge_cookies(session.cookies, cookies) return cls.from_session(session=session) - - @classmethod - def with_user_agent(cls, user_agent=None, **kwargs): - return cls(session=session_factory(user_agent=user_agent), **kwargs)