carconnectivity-connector-skoda 0.8.1a1__tar.gz → 0.8.1a3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of carconnectivity-connector-skoda might be problematic. Click here for more details.

Files changed (42) hide show
  1. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/.github/workflows/build.yml +3 -3
  2. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/.github/workflows/build_and_publish.yml +2 -2
  3. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/.github/workflows/codeql-analysis.yml +4 -4
  4. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/PKG-INFO +4 -3
  5. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/pyproject.toml +3 -2
  6. carconnectivity_connector_skoda-0.8.1a3/setup_requirements.txt +6 -0
  7. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connector_skoda.egg-info/PKG-INFO +4 -3
  8. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connector_skoda.egg-info/requires.txt +2 -2
  9. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/_version.py +3 -3
  10. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/auth/my_skoda_session.py +19 -13
  11. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/auth/openid_session.py +1 -1
  12. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/mqtt_client.py +13 -3
  13. carconnectivity_connector_skoda-0.8.1a1/setup_requirements.txt +0 -6
  14. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/.flake8 +0 -0
  15. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  16. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  17. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/.github/dependabot.yml +0 -0
  18. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/.gitignore +0 -0
  19. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/CHANGELOG.md +0 -0
  20. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/LICENSE +0 -0
  21. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/Makefile +0 -0
  22. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/README.md +0 -0
  23. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/doc/Config.md +0 -0
  24. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/setup.cfg +0 -0
  25. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connector_skoda.egg-info/SOURCES.txt +0 -0
  26. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connector_skoda.egg-info/dependency_links.txt +0 -0
  27. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connector_skoda.egg-info/top_level.txt +0 -0
  28. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/__init__.py +0 -0
  29. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/auth/__init__.py +0 -0
  30. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/auth/auth_util.py +0 -0
  31. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/auth/helpers/blacklist_retry.py +0 -0
  32. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/auth/session_manager.py +0 -0
  33. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/auth/skoda_web_session.py +0 -0
  34. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/capability.py +0 -0
  35. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/charging.py +0 -0
  36. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/climatization.py +0 -0
  37. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/command_impl.py +0 -0
  38. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/connector.py +0 -0
  39. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/error.py +0 -0
  40. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/ui/connector_ui.py +0 -0
  41. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/src/carconnectivity_connectors/skoda/vehicle.py +0 -0
  42. {carconnectivity_connector_skoda-0.8.1a1 → carconnectivity_connector_skoda-0.8.1a3}/test/integration_test/carConnectivity.json +0 -0
@@ -22,12 +22,12 @@ jobs:
22
22
  runs-on: ubuntu-latest
23
23
  strategy:
24
24
  matrix:
25
- python-version: ['3.9', '3.10', '3.11', '3.12', '3.13']
25
+ python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
26
26
 
27
27
  steps:
28
- - uses: actions/checkout@v4
28
+ - uses: actions/checkout@v5
29
29
  - name: Set up Python ${{ matrix.python-version }}
30
- uses: actions/setup-python@v5
30
+ uses: actions/setup-python@v6
31
31
  with:
32
32
  python-version: ${{ matrix.python-version }}
33
33
  - name: Install dependencies
@@ -15,11 +15,11 @@ jobs:
15
15
  id-token: write
16
16
 
17
17
  steps:
18
- - uses: actions/checkout@v4
18
+ - uses: actions/checkout@v5
19
19
  with:
20
20
  fetch-depth: 0
21
21
  - name: Set up Python
22
- uses: actions/setup-python@v5
22
+ uses: actions/setup-python@v6
23
23
  with:
24
24
  python-version: "3.x"
25
25
  - name: Install dependencies
@@ -26,11 +26,11 @@ jobs:
26
26
 
27
27
  steps:
28
28
  - name: Checkout repository
29
- uses: actions/checkout@v4
29
+ uses: actions/checkout@v5
30
30
 
31
31
  # Initializes the CodeQL tools for scanning.
32
32
  - name: Initialize CodeQL
33
- uses: github/codeql-action/init@v3
33
+ uses: github/codeql-action/init@v4
34
34
  with:
35
35
  languages: ${{ matrix.language }}
36
36
  # If you wish to specify custom queries, you can do so here or in a config file.
@@ -41,7 +41,7 @@ jobs:
41
41
  # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
42
42
  # If this step fails, then you should remove it and run the build manually (see below)
43
43
  - name: Autobuild
44
- uses: github/codeql-action/autobuild@v3
44
+ uses: github/codeql-action/autobuild@v4
45
45
 
46
46
  # ℹ️ Command-line programs to run using the OS shell.
47
47
  # 📚 https://git.io/JvXDl
@@ -55,4 +55,4 @@ jobs:
55
55
  # make release
56
56
 
57
57
  - name: Perform CodeQL Analysis
58
- uses: github/codeql-action/analyze@v3
58
+ uses: github/codeql-action/analyze@v4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: carconnectivity-connector-skoda
3
- Version: 0.8.1a1
3
+ Version: 0.8.1a3
4
4
  Summary: CarConnectivity connector for Skoda services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -33,13 +33,14 @@ Classifier: Programming Language :: Python :: 3.10
33
33
  Classifier: Programming Language :: Python :: 3.11
34
34
  Classifier: Programming Language :: Python :: 3.12
35
35
  Classifier: Programming Language :: Python :: 3.13
36
+ Classifier: Programming Language :: Python :: 3.14
36
37
  Classifier: Topic :: Software Development :: Libraries
37
38
  Requires-Python: >=3.8
38
39
  Description-Content-Type: text/markdown
39
40
  License-File: LICENSE
40
- Requires-Dist: carconnectivity>=0.7.1
41
+ Requires-Dist: carconnectivity>=0.8.1
41
42
  Requires-Dist: oauthlib~=3.3.1
42
- Requires-Dist: requests~=2.32.3
43
+ Requires-Dist: requests~=2.32.5
43
44
  Requires-Dist: pyjwt~=2.10
44
45
  Requires-Dist: paho-mqtt~=2.1.0
45
46
  Dynamic: license-file
@@ -14,9 +14,9 @@ authors = [
14
14
  { name = "Till Steinbach" }
15
15
  ]
16
16
  dependencies = [
17
- "carconnectivity>=0.7.1",
17
+ "carconnectivity>=0.8.1",
18
18
  "oauthlib~=3.3.1",
19
- "requests~=2.32.3",
19
+ "requests~=2.32.5",
20
20
  "pyjwt~=2.10",
21
21
  "paho-mqtt~=2.1.0",
22
22
  ]
@@ -31,6 +31,7 @@ classifiers = [
31
31
  "Programming Language :: Python :: 3.11",
32
32
  "Programming Language :: Python :: 3.12",
33
33
  "Programming Language :: Python :: 3.13",
34
+ "Programming Language :: Python :: 3.14",
34
35
  "Topic :: Software Development :: Libraries"
35
36
  ]
36
37
 
@@ -0,0 +1,6 @@
1
+ flake8~=7.3.0
2
+ pylint~=4.0.2
3
+ bandit~=1.8.6
4
+
5
+ # For UI only
6
+ Flask~=3.1.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: carconnectivity-connector-skoda
3
- Version: 0.8.1a1
3
+ Version: 0.8.1a3
4
4
  Summary: CarConnectivity connector for Skoda services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -33,13 +33,14 @@ Classifier: Programming Language :: Python :: 3.10
33
33
  Classifier: Programming Language :: Python :: 3.11
34
34
  Classifier: Programming Language :: Python :: 3.12
35
35
  Classifier: Programming Language :: Python :: 3.13
36
+ Classifier: Programming Language :: Python :: 3.14
36
37
  Classifier: Topic :: Software Development :: Libraries
37
38
  Requires-Python: >=3.8
38
39
  Description-Content-Type: text/markdown
39
40
  License-File: LICENSE
40
- Requires-Dist: carconnectivity>=0.7.1
41
+ Requires-Dist: carconnectivity>=0.8.1
41
42
  Requires-Dist: oauthlib~=3.3.1
42
- Requires-Dist: requests~=2.32.3
43
+ Requires-Dist: requests~=2.32.5
43
44
  Requires-Dist: pyjwt~=2.10
44
45
  Requires-Dist: paho-mqtt~=2.1.0
45
46
  Dynamic: license-file
@@ -1,5 +1,5 @@
1
- carconnectivity>=0.7.1
1
+ carconnectivity>=0.8.1
2
2
  oauthlib~=3.3.1
3
- requests~=2.32.3
3
+ requests~=2.32.5
4
4
  pyjwt~=2.10
5
5
  paho-mqtt~=2.1.0
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.8.1a1'
32
- __version_tuple__ = version_tuple = (0, 8, 1, 'a1')
31
+ __version__ = version = '0.8.1a3'
32
+ __version_tuple__ = version_tuple = (0, 8, 1, 'a3')
33
33
 
34
- __commit_id__ = commit_id = 'g1d80033cd'
34
+ __commit_id__ = commit_id = 'gf419ea019'
@@ -15,6 +15,7 @@ from urllib.parse import parse_qsl, urlparse
15
15
 
16
16
  import requests
17
17
  from requests.models import CaseInsensitiveDict
18
+ from requests.exceptions import ReadTimeout, ConnectionError
18
19
 
19
20
  from oauthlib.common import add_params_to_uri, generate_nonce, to_unicode
20
21
  from oauthlib.oauth2 import InsecureTransportError
@@ -58,17 +59,22 @@ class MySkodaSession(SkodaWebSession):
58
59
  def login(self):
59
60
  super(MySkodaSession, self).login()
60
61
 
61
- verifier = "".join(random.choices(string.ascii_uppercase + string.digits, k=16))
62
- verifier_hash = hashlib.sha256(verifier.encode("utf-8")).digest()
63
- code_challenge = base64.b64encode(verifier_hash).decode("utf-8").replace("+", "-").replace("/", "_").rstrip("=")
64
- # retrieve authorization URL
65
- authorization_url = self.authorization_url(url='https://identity.vwgroup.io/oidc/v1/authorize', prompt='login', code_challenge=code_challenge,
66
- code_challenge_method='s256')
67
- # perform web authentication
68
- response = self.do_web_auth(authorization_url)
69
- # fetch tokens from web authentication response
70
- self.fetch_tokens('https://mysmob.api.connect.skoda-auto.cz/api/v1/authentication/exchange-authorization-code?tokenType=CONNECT',
71
- authorization_response=response, verifier=verifier)
62
+ try:
63
+ verifier = "".join(random.choices(string.ascii_uppercase + string.digits, k=16))
64
+ verifier_hash = hashlib.sha256(verifier.encode("utf-8")).digest()
65
+ code_challenge = base64.b64encode(verifier_hash).decode("utf-8").replace("+", "-").replace("/", "_").rstrip("=")
66
+ # retrieve authorization URL
67
+ authorization_url = self.authorization_url(url='https://identity.vwgroup.io/oidc/v1/authorize', prompt='login', code_challenge=code_challenge,
68
+ code_challenge_method='s256')
69
+ # perform web authentication
70
+ response = self.do_web_auth(authorization_url)
71
+ # fetch tokens from web authentication response
72
+ self.fetch_tokens('https://mysmob.api.connect.skoda-auto.cz/api/v1/authentication/exchange-authorization-code?tokenType=CONNECT',
73
+ authorization_response=response, verifier=verifier)
74
+ except ReadTimeout as exc:
75
+ raise TemporaryAuthenticationError('Login timed out (Read timeout)') from exc
76
+ except ConnectionError as exc:
77
+ raise TemporaryAuthenticationError('Login failed due to connection error') from exc
72
78
 
73
79
  def refresh(self) -> None:
74
80
  # refresh tokens from refresh endpoint
@@ -118,7 +124,7 @@ class MySkodaSession(SkodaWebSession):
118
124
  token_response = self.post(token_url, headers=request_headers, data=body, allow_redirects=False,
119
125
  access_type=AccessType.NONE) # pyright: ignore reportCallIssue
120
126
  if token_response.status_code != requests.codes['ok']:
121
- raise TemporaryAuthenticationError(f'Token could not be fetched due to temporary WeConnect failure: {token_response.status_code}')
127
+ raise TemporaryAuthenticationError(f'Token could not be fetched due to temporary MySkoda failure: {token_response.status_code}')
122
128
  # parse token from response body
123
129
  token = self.parse_from_body(token_response.text)
124
130
  return token
@@ -132,7 +138,7 @@ class MySkodaSession(SkodaWebSession):
132
138
  # Tokens are in body of response in json format
133
139
  token = json.loads(token_response)
134
140
  except json.decoder.JSONDecodeError as err:
135
- raise TemporaryAuthenticationError('Token could not be refreshed due to temporary WeConnect failure: json could not be decoded') from err
141
+ raise TemporaryAuthenticationError('Token could not be refreshed due to temporary MySkoda failure: json could not be decoded') from err
136
142
  found_tokens: Set[str] = set()
137
143
  # Fix token keys, we want access_token instead of accessToken
138
144
  if 'accessToken' in token:
@@ -1,4 +1,4 @@
1
- """Implements a session class that handles OpenID authentication."""
1
+ """Implements a session class that handles OpenID authentication."""
2
2
  from __future__ import annotations
3
3
  from typing import TYPE_CHECKING
4
4
 
@@ -13,7 +13,7 @@ from datetime import timedelta, timezone
13
13
  from paho.mqtt.client import Client
14
14
  from paho.mqtt.enums import MQTTProtocolVersion, CallbackAPIVersion, MQTTErrorCode
15
15
 
16
- from carconnectivity.errors import CarConnectivityError
16
+ from carconnectivity.errors import CarConnectivityError, TemporaryAuthenticationError
17
17
  from carconnectivity.observable import Observable
18
18
  from carconnectivity.vehicle import GenericVehicle
19
19
 
@@ -100,7 +100,12 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
100
100
  del userdata
101
101
 
102
102
  if self._skoda_connector.session.expired or self._skoda_connector.session.access_token is None:
103
- self._skoda_connector.session.refresh()
103
+ try:
104
+ self._skoda_connector.session.refresh()
105
+ except ConnectionError as exc:
106
+ LOG.error('Token refresh failed due to connection error: %s', exc)
107
+ except TemporaryAuthenticationError as exc:
108
+ LOG.error('Token refresh failed due to temporary MySkoda error: %s', exc)
104
109
  if not self._skoda_connector.session.expired and self._skoda_connector.session.access_token is not None:
105
110
  # pylint: disable-next=attribute-defined-outside-init # this is a false positive, password has a setter in super class
106
111
  self._password = self._skoda_connector.session.access_token # This is a bit hacky but if password attribute is used here there is an Exception
@@ -344,7 +349,12 @@ class SkodaMQTTClient(Client): # pylint: disable=too-many-instance-attributes
344
349
  if self._retry_refresh_login_once == True:
345
350
  self._retry_refresh_login_once = False
346
351
  LOG.info('trying a relogin once to resolve the error')
347
- self._skoda_connector.session.login()
352
+ try:
353
+ self._skoda_connector.session.login()
354
+ except TemporaryAuthenticationError as exc:
355
+ LOG.error('Login failed due to temporary MySkoda error: %s', exc)
356
+ except ConnectionError as exc:
357
+ LOG.error('Login failed due to connection error: %s', exc)
348
358
  elif reason_code == 135:
349
359
  LOG.error('Could not connect (%s): Not authorized', reason_code)
350
360
  elif reason_code == 136:
@@ -1,6 +0,0 @@
1
- flake8~=7.3.0
2
- pylint~=3.3.7
3
- bandit~=1.8.5
4
-
5
- # For UI only
6
- Flask~=3.1.1