__init__.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import jwt
  2. import os
  3. import requests
  4. from datetime import datetime, timedelta, UTC
  5. from openpilot.system.hardware.hw import Paths
  6. from openpilot.system.version import get_version
  7. API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com')
  8. class Api:
  9. def __init__(self, dongle_id):
  10. self.dongle_id = dongle_id
  11. with open(Paths.persist_root()+'/comma/id_rsa') as f:
  12. self.private_key = f.read()
  13. def get(self, *args, **kwargs):
  14. return self.request('GET', *args, **kwargs)
  15. def post(self, *args, **kwargs):
  16. return self.request('POST', *args, **kwargs)
  17. def request(self, method, endpoint, timeout=None, access_token=None, **params):
  18. return api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params)
  19. def get_token(self, expiry_hours=1):
  20. now = datetime.now(UTC).replace(tzinfo=None)
  21. payload = {
  22. 'identity': self.dongle_id,
  23. 'nbf': now,
  24. 'iat': now,
  25. 'exp': now + timedelta(hours=expiry_hours)
  26. }
  27. token = jwt.encode(payload, self.private_key, algorithm='RS256')
  28. if isinstance(token, bytes):
  29. token = token.decode('utf8')
  30. return token
  31. def api_get(endpoint, method='GET', timeout=None, access_token=None, **params):
  32. headers = {}
  33. if access_token is not None:
  34. headers['Authorization'] = "JWT " + access_token
  35. headers['User-Agent'] = "openpilot-" + get_version()
  36. return requests.request(method, API_HOST + "/" + endpoint, timeout=timeout, headers=headers, params=params)