Move to OTP auth (#190)

* Rebuild app OTP authentication

* Adding OTP readme

* Fix error message // Remove duplicated scopes

* Add dynamic header building including latest app version

* Fix missing startupcheck if using token from file

* Change version
This commit is contained in:
Linus Dietz
2024-05-27 08:17:52 +02:00
committed by GitHub
parent 19aafa3b21
commit 89bd76e981
7 changed files with 210 additions and 41 deletions
+36 -8
View File
@@ -10,7 +10,7 @@ from datetime import datetime
from babel.dates import format_datetime
from config import settings
from const import CLIMATE_START_URL, CLIMATE_STOP_URL, CAR_LOCK_URL, \
CAR_UNLOCK_URL, availability_topic, icon_states, old_entity_ids
CAR_UNLOCK_URL, availability_topic, icon_states, old_entity_ids, otp_mqtt_topic
mqtt_client: mqtt.Client
subscribed_topics = []
@@ -20,7 +20,7 @@ climate_timer = {}
engine_status = {}
devices = {}
active_schedules = {}
otp_code = None
def connect():
client = mqtt.Client("volvoAAOS2mqtt") if os.environ.get("IS_HA_ADDON") \
@@ -37,6 +37,7 @@ def connect():
port = settings["mqtt"]["port"]
client.connect(settings["mqtt"]["broker"], port)
client.loop_start()
client.subscribe("volvoAAOS2mqtt/otp_code")
client.on_message = on_message
client.on_disconnect = on_disconnect
client.on_connect = on_connect
@@ -45,6 +46,28 @@ def connect():
mqtt_client = client
def create_otp_input():
config = {
"name": "Volvo OTP",
"object_id": f"volvo_otp",
"schema": "state",
"command_topic": otp_mqtt_topic,
"unique_id": f"volvoAAOS2mqtt_otp",
"pattern": "\d{6}",
"icon": "mdi:two-factor-authentication"
}
mqtt_client.publish(
f"homeassistant/text/volvoAAOS2mqtt/volvo_otp/config",
json.dumps(config),
retain=True
)
def delete_otp_input():
topic = "homeassistant/text/volvoAAOS2mqtt/volvo_otp/config"
mqtt_client.publish(topic, payload="", retain=True)
def send_car_images(vin, data, device):
if util.keys_exists(data, "images"):
for entity in [{"name": "Exterior Image", "id": "exterior_image"},
@@ -94,13 +117,18 @@ def on_disconnect(client, userdata, rc):
def on_message(client, userdata, msg):
try:
vin = msg.topic.split('/')[2].split('_')[0]
except IndexError:
logging.error("Error - Cannot get vin from MQTT topic!")
return None
payload = msg.payload.decode("UTF-8")
if msg.topic == otp_mqtt_topic:
global otp_code
otp_code = payload
return None
else:
try:
vin = msg.topic.split('/')[2].split('_')[0]
except IndexError:
logging.error("Error - Cannot get vin from MQTT topic!")
return None
if "climate_status" in msg.topic:
if payload == "ON":
start_climate(vin)