Skip to content

Commit

Permalink
Downgrade app version (#453)
Browse files Browse the repository at this point in the history
* Downgrade app version

* Fix pytest
https://pylint.pycqa.org/en/v2.14.0/whatsnew/2/2.14/summary.html#removed-checkers

* Don't clear refresh tokens
  • Loading branch information
rikroe authored Jun 3, 2022
1 parent 1f8bf14 commit 3803bd8
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 11 deletions.
11 changes: 5 additions & 6 deletions bimmer_connected/api/authentication.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from Crypto.PublicKey import RSA
from Crypto.Util.Padding import pad

from bimmer_connected.api.regions import Regions, get_aes_keys, get_ocp_apim_key, get_server_url
from bimmer_connected.api.regions import Regions, get_aes_keys, get_app_version, get_ocp_apim_key, get_server_url
from bimmer_connected.api.utils import (
create_s256_code_challenge,
generate_token,
Expand Down Expand Up @@ -108,8 +108,6 @@ async def login(self) -> None:
if self.refresh_token:
token_data = await self._refresh_token_row_na()
if not token_data:
# clear refresh token as precaution
self.refresh_token = None
token_data = await self._login_row_na()
token_data["expires_at"] = token_data["expires_at"] - EXPIRES_AT_OFFSET

Expand All @@ -118,8 +116,6 @@ async def login(self) -> None:
if self.refresh_token:
token_data = await self._refresh_token_china()
if not token_data:
# clear refresh token as precaution
self.refresh_token = None
token_data = await self._login_china()
token_data["expires_at"] = token_data["expires_at"] - EXPIRES_AT_OFFSET

Expand Down Expand Up @@ -339,7 +335,10 @@ def __init__(self, *args, **kwargs):
# Set default values#
region = kwargs.pop("region")
kwargs["base_url"] = get_server_url(region)
kwargs["headers"] = {"user-agent": USER_AGENT, "x-user-agent": X_USER_AGENT.format("bmw", region.value)}
kwargs["headers"] = {
"user-agent": USER_AGENT,
"x-user-agent": X_USER_AGENT.format(brand="bmw", app_version=get_app_version(region), region=region.value),
}

# Register event hooks
kwargs["event_hooks"] = defaultdict(list, **kwargs.get("event_hooks", {}))
Expand Down
8 changes: 6 additions & 2 deletions bimmer_connected/api/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import httpx

from bimmer_connected.api.authentication import MyBMWAuthentication
from bimmer_connected.api.regions import get_server_url
from bimmer_connected.api.regions import get_app_version, get_server_url
from bimmer_connected.api.utils import get_correlation_id, log_to_to_file
from bimmer_connected.const import HTTPX_TIMEOUT, USER_AGENT, X_USER_AGENT, CarBrands
from bimmer_connected.models import GPSPosition
Expand Down Expand Up @@ -73,7 +73,11 @@ def generate_default_header(self, brand: CarBrands = None) -> Dict[str, str]:
"accept": "application/json",
"accept-language": "en",
"user-agent": USER_AGENT,
"x-user-agent": X_USER_AGENT.format((brand or CarBrands.BMW), self.config.authentication.region.value),
"x-user-agent": X_USER_AGENT.format(
brand=(brand or CarBrands.BMW),
app_version=get_app_version(self.config.authentication.region),
region=self.config.authentication.region.value,
),
**get_correlation_id(),
"bmw-units-preferences": "d=KM;v=L" if self.config.use_metric_units else "d=MI;v=G",
}
7 changes: 6 additions & 1 deletion bimmer_connected/api/regions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from base64 import b64decode
from typing import Dict, List

from bimmer_connected.const import AES_KEYS, OCP_APIM_KEYS, SERVER_URLS_MYBMW, Regions
from bimmer_connected.const import AES_KEYS, APP_VERSIONS, OCP_APIM_KEYS, SERVER_URLS_MYBMW, Regions


def valid_regions() -> List[str]:
Expand All @@ -26,6 +26,11 @@ def get_server_url(region: Regions) -> str:
return f"https://{SERVER_URLS_MYBMW[region]}"


def get_app_version(region: Regions) -> str:
"""Get the app version & build number for the region."""
return APP_VERSIONS[region]


def get_ocp_apim_key(region: Regions) -> str:
"""Get the authorization for OAuth settings."""
return b64decode(OCP_APIM_KEYS[region]).decode()
Expand Down
8 changes: 7 additions & 1 deletion bimmer_connected/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,16 @@ class Regions(str, Enum):
}
}

APP_VERSIONS = {
Regions.NORTH_AMERICA: "2.5.2(14945)",
Regions.REST_OF_WORLD: "2.5.2(14945)",
Regions.CHINA: "2.3.0(13603)",
}

HTTPX_TIMEOUT = 30.0

USER_AGENT = "Dart/2.14 (dart:io)"
X_USER_AGENT = "android(SP1A.210812.016.C1);{};2.5.2(14945);{}"
X_USER_AGENT = "android(SP1A.210812.016.C1);{brand};{app_version};{region}"


AUTH_CHINA_PUBLIC_KEY_URL = "/eadrax-coas/v1/cop/publickey"
Expand Down
1 change: 0 additions & 1 deletion bimmer_connected/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ def _parse_vehicle_data(cls, vehicle_data: Dict) -> Optional[Dict]:

def _update_after_parse(self, parsed: Dict) -> Dict:
"""Updates parsed vehicle data with attributes stored in class if needed."""
# pylint:disable=no-self-use
return parsed


Expand Down

0 comments on commit 3803bd8

Please sign in to comment.