Compare commits

...
Author SHA1 Message Date
Kevin FronczakandGitHub 0fc74c3f82 Merge pull request #319 from fronzbot/login-fix
Changed the way the new login method switch is handled
2020-06-29 13:06:01 -04:00
Kevin Fronczak 7b150eb1af Changed the way the new login method switch is handled 2020-06-29 17:01:46 +00:00
Kevin FronczakandGitHub f8db8eb3b6 Merge pull request #318 from fronzbot/login-switch
Add option to use v3 login endpoint
2020-06-29 12:49:56 -04:00
Kevin FronczakandGitHub a34b6dec67 Merge pull request #315 from fronzbot/dependabot/pip/requests-approx-eq-2.24.0
Update requests requirement from ~=2.23.0 to ~=2.24.0
2020-06-29 11:54:10 -04:00
Kevin Fronczak bded3eb156 Add option to use v3 login endpoint 2020-06-29 15:46:43 +00:00
dependabot-preview[bot]andGitHub 9ca73934ce Update requests requirement from ~=2.23.0 to ~=2.24.0
Updates the requirements on [requests](https://github.com/psf/requests) to permit the latest version.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/master/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.23.0...v2.24.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-18 08:04:10 +00:00
4 changed files with 43 additions and 7 deletions
+13 -4
View File
@@ -12,7 +12,7 @@ _LOGGER = logging.getLogger(__name__)
class Auth:
"""Class to handle login communication."""
def __init__(self, login_data=None, no_prompt=False):
def __init__(self, login_data=None, no_prompt=False, login_method="v4"):
"""
Initialize auth handler.
@@ -22,6 +22,7 @@ class Auth:
- password
:param no_prompt: Should any user input prompts
be supressed? True/FALSE
:param login_method: Choose the login endpoint to use. Default: v4. v3 uses email verification rather than a 2FA code.
"""
if login_data is None:
login_data = {}
@@ -31,6 +32,7 @@ class Auth:
self.region_id = login_data.get("region_id", None)
self.client_id = login_data.get("client_id", None)
self.account_id = login_data.get("account_id", None)
self.login_method = login_method
self.login_response = None
self.is_errored = False
self.no_prompt = no_prompt
@@ -53,6 +55,13 @@ class Auth:
return None
return {"Host": self.host, "TOKEN_AUTH": self.token}
@property
def login_url(self):
"""Return login url."""
if self.login_method not in LOGIN_ENDPOINT:
return LOGIN_ENDPOINT["v4"]
return LOGIN_ENDPOINT[self.login_method]
def create_session(self):
"""Create a session for blink communication."""
sess = Session()
@@ -73,11 +82,11 @@ class Auth:
self.data = util.validate_login_data(self.data)
def login(self, login_url=LOGIN_ENDPOINT):
def login(self):
"""Attempt login to blink servers."""
self.validate_login()
_LOGGER.info("Attempting login with %s", login_url)
response = api.request_login(self, login_url, self.data, is_retry=False,)
_LOGGER.info("Attempting login with %s", self.login_url)
response = api.request_login(self, self.login_url, self.data, is_retry=False,)
try:
if response.status_code == 200:
return response.json()
+5 -2
View File
@@ -4,7 +4,7 @@ import os
MAJOR_VERSION = 0
MINOR_VERSION = 16
PATCH_VERSION = "0-rc8"
PATCH_VERSION = "0-rc10"
__version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}.{PATCH_VERSION}"
@@ -48,7 +48,10 @@ URLS
BLINK_URL = "immedia-semi.com"
DEFAULT_URL = f"rest-prod.{BLINK_URL}"
BASE_URL = f"https://{DEFAULT_URL}"
LOGIN_ENDPOINT = f"{BASE_URL}/api/v4/account/login"
LOGIN_ENDPOINT = {
"v4": f"{BASE_URL}/api/v4/account/login",
"v3": f"{BASE_URL}/api/v3/login",
}
"""
Dictionaries
+1 -1
View File
@@ -1,4 +1,4 @@
python-dateutil~=2.8.1
requests~=2.23.0
requests~=2.24.0
python-slugify~=4.0.0
testtools==2.4.0
+24
View File
@@ -144,6 +144,21 @@ class TestAuth(unittest.TestCase):
fake_resp = mresp.MockResponse({"foo": "bar"}, 200)
mock_req.return_value = fake_resp
self.assertEqual(self.auth.login(), {"foo": "bar"})
mock_req.assert_called_with(
self.auth, const.LOGIN_ENDPOINT["v4"], {}, is_retry=False
)
@mock.patch("blinkpy.auth.Auth.validate_login", return_value=None)
@mock.patch("blinkpy.auth.api.request_login")
def test_login_v3(self, mock_req, mock_validate):
"""Test login handling."""
auth_v3 = Auth(login_method="v3")
fake_resp = mresp.MockResponse({"foo": "bar"}, 200)
mock_req.return_value = fake_resp
self.assertEqual(auth_v3.login(), {"foo": "bar"})
mock_req.assert_called_with(
auth_v3, const.LOGIN_ENDPOINT["v3"], {}, is_retry=False
)
@mock.patch("blinkpy.auth.Auth.validate_login", return_value=None)
@mock.patch("blinkpy.auth.api.request_login")
@@ -239,6 +254,15 @@ class TestAuth(unittest.TestCase):
mock_validate.side_effect = [UnauthorizedError, TokenRefreshFailed]
self.assertEqual(self.auth.query(url="http://example.com"), None)
def test_login_methods(self):
"""Test correct login url returned."""
auth = Auth()
self.assertEqual(auth.login_url, const.LOGIN_ENDPOINT["v4"])
auth.login_method = "v3"
self.assertEqual(auth.login_url, const.LOGIN_ENDPOINT["v3"])
auth.login_method = "foobar"
self.assertEqual(auth.login_url, const.LOGIN_ENDPOINT["v4"])
class MockSession:
"""Object to mock a session."""