From 8eac41b6339bff812f34eacb93624a715086857b Mon Sep 17 00:00:00 2001 From: estevez Date: Fri, 21 Sep 2018 00:39:49 +0300 Subject: [PATCH] [#38] Add access token support --- lib/data_model.dart | 6 ++++-- lib/main.dart | 18 ++++++++++++------ lib/settings.dart | 19 ++++++++++++++++++- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/data_model.dart b/lib/data_model.dart index d54c5fb..6e85742 100644 --- a/lib/data_model.dart +++ b/lib/data_model.dart @@ -15,6 +15,7 @@ class SettingsChangedEvent { class HassioDataModel { String _hassioAPIEndpoint; String _hassioPassword; + String _hassioAuthType; IOWebSocketChannel _hassioChannel; int _currentMssageId = 0; int _statesMessageId = 0; @@ -36,9 +37,10 @@ class HassioDataModel { Map get uiStructure => _uiStructure; Map get instanceConfig => _instanceConfig; - HassioDataModel(String url, String password) { + HassioDataModel(String url, String password, String authType) { _hassioAPIEndpoint = url; _hassioPassword = password; + _hassioAuthType = authType; } Future fetch() { @@ -112,7 +114,7 @@ class HassioDataModel { var data = json.decode(message); debugPrint("[Received]Message type: ${data['type']}"); if (data["type"] == "auth_required") { - _sendMessageRaw('{"type": "auth","api_password": "$_hassioPassword"}'); + _sendMessageRaw('{"type": "auth","$_hassioAuthType": "$_hassioPassword"}'); } else if (data["type"] == "auth_ok") { _sendSubscribe(); connectionCompleter.complete(); diff --git a/lib/main.dart b/lib/main.dart index da7b96a..172cd25 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -54,6 +54,7 @@ class _MainPageState extends State with WidgetsBindingObserver { int _errorCodeToBeShown = 0; String _lastErrorMessage = ""; StreamSubscription _stateSubscription; + StreamSubscription _settingsSubscription; bool _isLoading = true; Map _stateIconColors = { "on": Colors.amber, @@ -67,7 +68,7 @@ class _MainPageState extends State with WidgetsBindingObserver { void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); - eventBus.on().listen((event) { + _settingsSubscription = eventBus.on().listen((event) { debugPrint("Settings change event: reconnect=${event.reconnect}"); setState(() { _errorCodeToBeShown = 0; @@ -92,19 +93,20 @@ class _MainPageState extends State with WidgetsBindingObserver { _instanceHost = "$domain:$port"; String apiEndpoint = "${prefs.getString('hassio-protocol')}://$domain:$port/api/websocket"; String apiPassword = prefs.getString('hassio-password'); - if ((domain == null) || (port == null) || (apiEndpoint == null) || (apiPassword == null) || - (domain.length == 0) || (port.length == 0) || (apiEndpoint.length == 0) || (apiPassword.length == 0)) { + String authType = prefs.getString('hassio-auth-type'); + if ((domain == null) || (port == null) || (apiPassword == null) || + (domain.length == 0) || (port.length == 0) || (apiPassword.length == 0)) { setState(() { _errorCodeToBeShown = 5; }); } else { if (_dataModel != null) _dataModel.closeConnection(); - _createConnection(apiEndpoint, apiPassword); + _createConnection(apiEndpoint, apiPassword, authType); } } - _createConnection(String apiEndpoint, String apiPassword) { - _dataModel = HassioDataModel(apiEndpoint, apiPassword); + _createConnection(String apiEndpoint, String apiPassword, String authType) { + _dataModel = HassioDataModel(apiEndpoint, apiPassword, authType); _refreshData(); if (_stateSubscription != null) _stateSubscription.cancel(); _stateSubscription = eventBus.on().listen((event) { @@ -406,6 +408,8 @@ class _MainPageState extends State with WidgetsBindingObserver { ) ); }); + } else { + _scaffoldKey?.currentState?.hideCurrentSnackBar(); } } @@ -479,6 +483,8 @@ class _MainPageState extends State with WidgetsBindingObserver { @override void dispose() { WidgetsBinding.instance.removeObserver(this); + if (_stateSubscription != null) _stateSubscription.cancel(); + if (_settingsSubscription != null) _settingsSubscription.cancel(); _dataModel.closeConnection(); super.dispose(); } diff --git a/lib/settings.dart b/lib/settings.dart index 22542c0..7603773 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -14,6 +14,7 @@ class _ConnectionSettingsPageState extends State { String _hassioPort = "8123"; String _hassioPassword = ""; String _socketProtocol = "wss"; + String _authType = "access_token"; @override void initState() { @@ -29,6 +30,7 @@ class _ConnectionSettingsPageState extends State { _hassioPort = prefs.getString("hassio-port") ?? '8123'; _hassioPassword = prefs.getString("hassio-password"); _socketProtocol = prefs.getString("hassio-protocol") ?? 'wss'; + _authType = prefs.getString("hassio-auth-type") ?? 'access_token'; }); } @@ -38,6 +40,7 @@ class _ConnectionSettingsPageState extends State { prefs.setString("hassio-port", _hassioPort); prefs.setString("hassio-password", _hassioPassword); prefs.setString("hassio-protocol", _socketProtocol); + prefs.setString("hassio-auth-type", _authType); } @override @@ -95,9 +98,23 @@ class _ConnectionSettingsPageState extends State { _saveSettings(); }, ), + new Row( + children: [ + Text("Login with access token (HA >= 0.78.0)"), + Switch( + value: (_authType == "access_token"), + onChanged: (value) { + setState(() { + _authType = value ? "access_token" : "api_password"; + }); + _saveSettings(); + }, + ) + ], + ), new TextField( decoration: InputDecoration( - labelText: "Home Assistant password" + labelText: _authType == "access_token" ? "Access token" : "API password" ), controller: TextEditingController( text: _hassioPassword