diff --git a/README.md b/README.md index 0f6db8a..3afc625 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ devices. ## Version History ```txt +2.6.6 Enable trust 2.6.5 Add logging 2.6.4 Handle "SYS_00004" response again (was removed in 2.6.3) 2.6.3 Differentiate response errors diff --git a/setup.py b/setup.py index 67dfe29..ef93d42 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ setup( name='vsure', - version='2.6.5', + version='2.6.6', description='Read and change status of verisure devices through mypages.', long_description='A python3 module for reading and changing status of ' + 'verisure devices through mypages.', diff --git a/verisure/session.py b/verisure/session.py index 3568f1c..f55489e 100644 --- a/verisure/session.py +++ b/verisure/session.py @@ -83,9 +83,9 @@ def __init__(self, username, password, self._password = password self._cookies = None self._cookie_file_name = os.path.expanduser(cookie_file_name) + self._trust_token = None self._giid = None self._base_url = None - self._stepup = None self._base_urls = ['https://automation01.verisure.com', 'https://automation02.verisure.com'] self._post = self._wrap_request(requests.post) @@ -195,10 +195,19 @@ def validate_mfa(self, code): 'Content-Type': 'application/json'}, cookies=self._cookies, data=json.dumps({"token": code})) - self._cookies = response.cookies + + trust_response = self._post( + url="/auth/trust", + headers={ + 'APPLICATION_ID': 'PS_PYTHON', + 'Accept': 'application/json', + }, + cookies=self._cookies) + self._cookies.update(trust_response.cookies) with open(self._cookie_file_name, 'wb') as cookie_file: pickle.dump(self._cookies, cookie_file) + self._trust_token = trust_response.json() installations = self.get_installations() if 'errors' not in installations: @@ -218,8 +227,19 @@ def login_cookie(self): except Exception as ex: raise LoginError("Failed to read cookie") from ex - # Update cookie - self.update_cookie() + # Login + cookie_jar = requests.sessions.RequestsCookieJar() + for name, value in self._cookies.items(): + if 'vs-trust' in name: + cookie_jar.set(name, value) + response = self._post( + url="/auth/login", + headers={'APPLICATION_ID': 'PS_PYTHON'}, + auth=(self._username, self._password), + cookies=cookie_jar) + self._cookies.update(response.cookies) + with open(self._cookie_file_name, 'wb') as f: + pickle.dump(self._cookies, f) installations = self.get_installations() if 'errors' not in installations: @@ -232,10 +252,15 @@ def update_cookie(self): Cookie can last 15 minutes before it needs to be updated. """ + cookie_jar = requests.sessions.RequestsCookieJar() + if self._cookies is not None: + for name, value in self._cookies.items(): + if name in ['vid', 'vs-refresh']: + cookie_jar[name] = value response = self._get( url="/auth/token", headers={'APPLICATION_ID': 'PS_PYTHON'}, - cookies=self._cookies) + cookies=cookie_jar) self._cookies.update(response.cookies) with open(self._cookie_file_name, 'wb') as cookie_file: @@ -245,6 +270,15 @@ def update_cookie(self): def logout(self): """ Log out from the verisure app api """ try: + if self._trust_token is not None: + token = self._trust_token['trustTokenValue'] + self._delete( + url=f"/auth/trust/{token}", + headers={ + 'APPLICATION_ID': 'PS_PYTHON', + 'Accept': 'application/json', + }, + cookies=self._cookies) self._delete( url="/auth/logout", headers={'APPLICATION_ID': 'PS_PYTHON'}, @@ -253,7 +287,7 @@ def logout(self): self._base_url = None self._giid = None self._cookies = None - self._stepup = None + self._trust_token = None if os.path.exists(self._cookie_file_name): os.remove(self._cookie_file_name)