From fe506b08305804aebc4bfef74e9b77b337bace62 Mon Sep 17 00:00:00 2001 From: George Hotelling Date: Sat, 4 Mar 2023 17:19:31 -0500 Subject: [PATCH] Moving zoho auth into main file --- doors.py | 56 +++++++++++++++++++++++++++++++++++++++++++++-- test_zoho_auth.py | 2 +- zoho_auth.py | 48 ---------------------------------------- 3 files changed, 55 insertions(+), 51 deletions(-) delete mode 100644 zoho_auth.py diff --git a/doors.py b/doors.py index 26bc4d1..56d430f 100755 --- a/doors.py +++ b/doors.py @@ -91,11 +91,63 @@ def blink_leds(): lock_door() +import datetime +import json +from http import HTTPStatus +from urllib import request +from urllib.parse import urlencode +from urllib.error import HTTPError + +class ZohoToken: + """ + Provides fresh API access tokens from Zoho + """ + def __init__(self, client_id, client_secret, refresh_token): + self.client_id = client_id + self.client_secret = client_secret + self.refresh_token = refresh_token + self._access_token = None + self.expires_at = None + + def update_token(self): + url = "https://accounts.zoho.com/oauth/v2/token?%s" % urlencode({ + "refresh_token": self.refresh_token, + "client_id": self.client_id, + "client_secret": self.client_secret, + "grant_type": "refresh_token", + }) + req = request.Request(url, method="POST") + with request.urlopen(req) as f: + data = json.loads(f.read().decode()) + self._access_token = data["access_token"] + self.expires_at = datetime.datetime.now() + datetime.timedelta(seconds=int(data["expires_in"])) + + def get_token(self): + if self._access_token is None or self.expires_at <= datetime.datetime.now(): + self.update_token() + return self._access_token + +def authenticate(token, key): + """ + Authenticate a key against the ZOHO CRM API + """ + url = "https://www.zohoapis.com/crm/v2/Contacts/search?%s" % urlencode({ + "criteria": "(Key_ID:equals:%s)" % key, + }) + req = request.Request(url, method="GET", headers={ + "Authorization": "Zoho-oauthtoken %s" % token.get_token(), + }) + print("Pinging server with key: %s (%s)" % (key, url)) + try: + with request.urlopen(req) as response: + return response.status == HTTPStatus.OK + except HTTPError as e: + print("Error pinging server: %s" % e) + + return False import time -import datetime -from zoho_auth import ZohoToken, authenticate from slacker import Slacker ############################################# # # diff --git a/test_zoho_auth.py b/test_zoho_auth.py index 29b163c..3652212 100644 --- a/test_zoho_auth.py +++ b/test_zoho_auth.py @@ -3,7 +3,7 @@ import unittest from freezegun import freeze_time from unittest.mock import patch, MagicMock from urllib.error import HTTPError -from zoho_auth import ZohoToken, authenticate +from doors import ZohoToken, authenticate class TestZohoToken(unittest.TestCase): """Test the ZohoToken class""" diff --git a/zoho_auth.py b/zoho_auth.py deleted file mode 100644 index 9a244ea..0000000 --- a/zoho_auth.py +++ /dev/null @@ -1,48 +0,0 @@ -import datetime -import json -from http import HTTPStatus -from urllib import request -from urllib.parse import urlencode -from urllib.error import HTTPError - -class ZohoToken: - def __init__(self, client_id, client_secret, refresh_token): - self.client_id = client_id - self.client_secret = client_secret - self.refresh_token = refresh_token - self._access_token = None - self.expires_at = None - - def update_token(self): - url = "https://accounts.zoho.com/oauth/v2/token?%s" % urlencode({ - "refresh_token": self.refresh_token, - "client_id": self.client_id, - "client_secret": self.client_secret, - "grant_type": "refresh_token", - }) - req = request.Request(url, method="POST") - with request.urlopen(req) as f: - data = json.loads(f.read().decode()) - self._access_token = data["access_token"] - self.expires_at = datetime.datetime.now() + datetime.timedelta(seconds=int(data["expires_in"])) - - def get_token(self): - if self._access_token is None or self.expires_at <= datetime.datetime.now(): - self.update_token() - return self._access_token - -def authenticate(token, key): - url = "https://www.zohoapis.com/crm/v2/Contacts/search?%s" % urlencode({ - "criteria": "(Key_ID:equals:%s)" % key, - }) - req = request.Request(url, method="GET", headers={ - "Authorization": "Zoho-oauthtoken %s" % token.get_token(), - }) - print("Pinging server with key: %s (%s)" % (key, url)) - try: - with request.urlopen(req) as response: - return response.status == HTTPStatus.OK - except HTTPError as e: - print("Error pinging server: %s" % e) - - return False