tesla-fleet-api 0.8.1__py3-none-any.whl → 0.8.2__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
tesla_fleet_api/const.py CHANGED
@@ -3,7 +3,7 @@
3
3
  from enum import Enum
4
4
  import logging
5
5
 
6
- VERSION = "0.8.1"
6
+ VERSION = "0.8.2"
7
7
  LOGGER = logging.getLogger(__package__)
8
8
  SERVERS = {
9
9
  "na": "https://fleet-api.prd.na.vn.cloud.tesla.com",
@@ -4,11 +4,11 @@ from json import dumps
4
4
  from typing import Any, Awaitable
5
5
  from os.path import exists
6
6
  import aiohttp
7
+ import aiofiles
7
8
 
8
9
  # cryptography
9
- from cryptography.hazmat.primitives.ciphers.aead import AESGCM
10
10
  from cryptography.hazmat.primitives.asymmetric import ec
11
- from cryptography.hazmat.primitives import hashes, serialization
11
+ from cryptography.hazmat.primitives import serialization
12
12
  from cryptography.hazmat.backends import default_backend
13
13
 
14
14
  from .exceptions import raise_for_status, InvalidRegion, LibraryError, ResponseError
@@ -30,7 +30,7 @@ class TeslaFleetApi:
30
30
  session: aiohttp.ClientSession
31
31
  headers: dict[str, str]
32
32
  refresh_hook: Awaitable | None = None
33
- _private_key: ec.EllipticCurvePrivateKey
33
+ _private_key: ec.EllipticCurvePrivateKey | None = None
34
34
 
35
35
  def __init__(
36
36
  self,
@@ -161,8 +161,8 @@ class TeslaFleetApi:
161
161
  "api/1/products",
162
162
  )
163
163
 
164
- def private_key(self, path: str = "private_key.pem") -> ec.EllipticCurvePrivateKey:
165
- """Create or load the private key."""
164
+ async def get_private_key(self, path: str = "private_key.pem") -> ec.EllipticCurvePrivateKey:
165
+ """Get or create the private key."""
166
166
  if not exists(path):
167
167
  self._private_key = ec.generate_private_key(
168
168
  ec.SECP256R1(), default_backend()
@@ -173,16 +173,15 @@ class TeslaFleetApi:
173
173
  format=serialization.PrivateFormat.TraditionalOpenSSL,
174
174
  encryption_algorithm=serialization.NoEncryption(),
175
175
  )
176
- with open(path, "wb") as key_file:
177
- key_file.write(pem)
178
- return self._private_key
176
+ async with aiofiles.open(path, "wb") as key_file:
177
+ await key_file.write(pem)
179
178
  else:
180
179
  try:
181
- with open(path, "rb") as key_file:
182
- key_data = key_file.read()
183
- value = serialization.load_pem_private_key(
184
- key_data, password=None, backend=default_backend()
185
- )
180
+ async with aiofiles.open(path, "rb") as key_file:
181
+ key_data = await key_file.read()
182
+ value = serialization.load_pem_private_key(
183
+ key_data, password=None, backend=default_backend()
184
+ )
186
185
  except FileNotFoundError:
187
186
  raise FileNotFoundError(f"Private key file not found at {path}")
188
187
  except PermissionError:
@@ -191,4 +190,4 @@ class TeslaFleetApi:
191
190
  if not isinstance(value, ec.EllipticCurvePrivateKey):
192
191
  raise AssertionError("Loaded key is not an EllipticCurvePrivateKey")
193
192
  self._private_key = value
194
- return self._private_key
193
+ return self._private_key
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
  import base64
3
- from dataclasses import dataclass
4
3
  from random import randbytes
5
4
  from typing import Any, TYPE_CHECKING
6
5
  import time
@@ -155,7 +154,7 @@ class Session:
155
154
  class VehicleSigned(VehicleSpecific):
156
155
  """Class describing the Tesla Fleet API vehicle endpoints and commands for a specific vehicle with command signing."""
157
156
 
158
- _key: ec.EllipticCurvePrivateKey
157
+ _private_key: ec.EllipticCurvePrivateKey
159
158
  _public_key: bytes
160
159
  _from_destination: bytes
161
160
  _sessions: dict[int, Session]
@@ -165,13 +164,13 @@ class VehicleSigned(VehicleSpecific):
165
164
  ):
166
165
  super().__init__(parent, vin)
167
166
  if key:
168
- self._key = key
167
+ self._private_key = key
169
168
  elif parent._parent._private_key:
170
- self._key = parent._parent._private_key
169
+ self._private_key = parent._parent._private_key
171
170
  else:
172
171
  raise ValueError("No private key.")
173
172
 
174
- self._public_key = self._key.public_key().public_bytes(
173
+ self._public_key = self._private_key.public_key().public_bytes(
175
174
  encoding=Encoding.X962, format=PublicFormat.UncompressedPoint
176
175
  )
177
176
  self._from_destination = randbytes(16)
@@ -201,7 +200,7 @@ class VehicleSigned(VehicleSpecific):
201
200
  vehicle_public_key = info.publicKey
202
201
 
203
202
  # Derive shared key from private key _key and vehicle public key
204
- shared = self._key.exchange(
203
+ shared = self._private_key.exchange(
205
204
  ec.ECDH(),
206
205
  ec.EllipticCurvePublicKey.from_encoded_point(
207
206
  ec.SECP256R1(), vehicle_public_key
@@ -215,8 +214,6 @@ class VehicleSigned(VehicleSpecific):
215
214
  delta=int(time.time()) - info.clock_time,
216
215
  )
217
216
 
218
- print(self._sessions[domain])
219
-
220
217
  async def _sendVehicleSecurity(self, command: UnsignedMessage) -> dict[str, Any]:
221
218
  """Sign and send a message to Infotainment computer."""
222
219
  if DOMAIN_VEHICLE_SECURITY not in self._sessions:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tesla_fleet_api
3
- Version: 0.8.1
3
+ Version: 0.8.2
4
4
  Summary: Tesla Fleet API library for Python
5
5
  Home-page: https://github.com/Teslemetry/tesla_fleet_api
6
6
  Author: Brett Adams
@@ -1,19 +1,19 @@
1
1
  tesla_fleet_api/__init__.py,sha256=BVZUDsfaxT05tAfcMHHWiyFyXwmDOx_wP_IHZBscgho,729
2
2
  tesla_fleet_api/charging.py,sha256=N_mc8axrXj3iduqLj_jCt4Vx86tHqe3xqQT4R1R7HvU,1689
3
- tesla_fleet_api/const.py,sha256=RRtTIzywqjySxds6-WCDEWjV6f7xxIWYkXmC-yTUVA4,9577
3
+ tesla_fleet_api/const.py,sha256=UqD-Vof5Dv7VkJZ7Qe4DgwVYlhiEBzM1V-Qzxde_6Aw,9577
4
4
  tesla_fleet_api/energy.py,sha256=S7D75MPuMVsHgkyUcFfMqjGCLZBM5YVFlWLEHbaX-zw,5957
5
5
  tesla_fleet_api/energyspecific.py,sha256=UfeaGE59aoAa8UhpQCXUi0sOrNCA40xZlqwF73BXTVY,4254
6
6
  tesla_fleet_api/exceptions.py,sha256=zl8m4Z51ihVD5cKYSZ8e6heerArF0j5isQmX-gSdkwM,15456
7
7
  tesla_fleet_api/partner.py,sha256=1vIBUaxKLIfqcC0X6VXZN0dMAzj_CLNPUMjA6QVqZ1k,1223
8
8
  tesla_fleet_api/ratecalculator.py,sha256=4lz8yruUeouHXh_3ezsXX-CTpIegp1T1J4VuRV_qdHA,1791
9
- tesla_fleet_api/teslafleetapi.py,sha256=U8kAD3BFfA_ZPwB7Wp-fOK0JCfnxRYLHVeCtOIilwX0,7272
9
+ tesla_fleet_api/teslafleetapi.py,sha256=zEu47xLopPfkpqE5nx2rf9eqZuZFii1jjXsOgay6Q3A,7229
10
10
  tesla_fleet_api/teslafleetoauth.py,sha256=OY9yRQuokYo3ts0C8Qb6Z-o9NNAGHbX9F5mHfAh50fo,4121
11
11
  tesla_fleet_api/teslafleetopensource.py,sha256=TJfVPcqJlA1b3kMoGuLr-g5Gn8UDyYsTZhjvGY1MtIk,2007
12
12
  tesla_fleet_api/teslemetry.py,sha256=Rl73BWYYJk1UWIhCPwywcXGRlkATYZrPz3LP-Covppw,3272
13
13
  tesla_fleet_api/tessie.py,sha256=4dBYxe1G2v9JvJGRbb01wXrAmvWT4jOfV4f_VQE_vkE,2302
14
14
  tesla_fleet_api/user.py,sha256=TZE2oh-n5zrhKXmGRuiNL9voKVODD7rBhGE_IObYVGA,1179
15
15
  tesla_fleet_api/vehicle.py,sha256=W5Y_ok5PK7jtXsenWpMWJTS4RpLhRW-1AlTPv1a6R6A,31765
16
- tesla_fleet_api/vehiclesigned.py,sha256=CmN8HErR_U6gEQ_Cw8hFY5S46vHOPi-dDBQI8h5KTTg,39200
16
+ tesla_fleet_api/vehiclesigned.py,sha256=vQ5luKjfpFAjnLBpJhOrUfdDDa24AEwKLRrf82bRQWs,39167
17
17
  tesla_fleet_api/vehiclespecific.py,sha256=Nr4zZzfmIuw3RFYjQEX6c_xtYZgztMsN5ohVn-YEH0I,20600
18
18
  tesla_fleet_api/pb2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  tesla_fleet_api/pb2/__init__.pyi,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -25,8 +25,8 @@ tesla_fleet_api/pb2/signatures_pb2.py,sha256=5mdJUC8EC8kx1UxYrHK5XI3_7M6v7w2POH1
25
25
  tesla_fleet_api/pb2/universal_message_pb2.py,sha256=F6-SkYXSuzWDsBvnGMg9k2pAIZv13v609qCPx7NSrdw,7254
26
26
  tesla_fleet_api/pb2/vcsec_pb2.py,sha256=CMJ97e4Mm4p7NFcgybbCC2KJRcvtrcqmBy_pGycYhMo,26238
27
27
  tesla_fleet_api/pb2/vehicle_pb2.py,sha256=P1V7Dqg3BBGZwODxTpZqtxLP6fGS_FNBqJcz_Fp0crs,2482
28
- tesla_fleet_api-0.8.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
29
- tesla_fleet_api-0.8.1.dist-info/METADATA,sha256=9vj2I_M_fv_DqRT8sG35w7QSgBnidXlHOr-twsw2Gnc,3821
30
- tesla_fleet_api-0.8.1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
31
- tesla_fleet_api-0.8.1.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
32
- tesla_fleet_api-0.8.1.dist-info/RECORD,,
28
+ tesla_fleet_api-0.8.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
29
+ tesla_fleet_api-0.8.2.dist-info/METADATA,sha256=sNmh6uj5rzAIUbXzR5hoLenHTKsNy-xXgrMRwcrUmbc,3821
30
+ tesla_fleet_api-0.8.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
31
+ tesla_fleet_api-0.8.2.dist-info/top_level.txt,sha256=jeNbog_1saXBFrGpom9WyPWmilxsyP3szL_G7JLWQfM,16
32
+ tesla_fleet_api-0.8.2.dist-info/RECORD,,