From c70e9b3ea0b648315df9a45fc21cf24370638c92 Mon Sep 17 00:00:00 2001 From: Jan Gustafsson Date: Mon, 16 Aug 2021 14:06:16 +0200 Subject: [PATCH] Fix for #10982 - Binding not working properly HANDLER_REGISTERING_ERROR (#11108) Signed-off-by: Jan Gustafsson --- .../verisure/internal/VerisureSession.java | 38 +++++++++++++------ .../handler/VerisureBridgeHandler.java | 2 + 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/VerisureSession.java b/bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/VerisureSession.java index feb094b95aac0..bc87dcc232389 100644 --- a/bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/VerisureSession.java +++ b/bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/VerisureSession.java @@ -117,8 +117,11 @@ public boolean initialize(@Nullable String authstring, @Nullable String pinCode, public boolean refresh() { try { if (logIn()) { - updateStatus(); - return true; + if (updateStatus()) { + return true; + } else { + return false; + } } else { return false; } @@ -246,13 +249,20 @@ public void configureInstallationInstance(BigDecimal installationId) } public @Nullable String getPinCode(BigDecimal installationId) { - return verisureInstallations.get(installationId).getPinCode(); + VerisureInstallation inst = verisureInstallations.get(installationId); + if (inst != null) { + return inst.getPinCode(); + } else { + logger.debug("Installation is null!"); + return null; + } } private void setPasswordFromCookie() { CookieStore c = httpClient.getCookieStore(); List cookies = c.getCookies(); - cookies.forEach(cookie -> { + final List unmodifiableList = List.of(cookies.toArray(new HttpCookie[] {})); + unmodifiableList.forEach(cookie -> { logger.trace("Response Cookie: {}", cookie); if (cookie.getName().equals(PASSWORD_NAME)) { password = cookie.getValue(); @@ -347,6 +357,9 @@ private T postJSONVerisureAPI(String url, String data, Class jsonClass) // Maybe Verisure has switched API server in use? logger.debug("Changed API server! Response: {}", content); setApiServerInUse(getNextApiServer()); + } else if (content.contains("\"message\":\"Request Failed") + && content.contains("Invalid session cookie")) { + throw new PostToAPIException("Invalid session cookie"); } else { String contentChomped = content.trim(); logger.trace("Response body: {}", content); @@ -515,9 +528,10 @@ private void notifyListenersIfChanged(VerisureThingDTO thing, VerisureInstallati } } - private void updateStatus() { + private boolean updateStatus() { logger.debug("Update status"); - verisureInstallations.forEach((installationId, installation) -> { + for (Map.Entry verisureInstallations : verisureInstallations.entrySet()) { + VerisureInstallation installation = verisureInstallations.getValue(); try { configureInstallationInstance(installation.getInstallationId()); int httpResultCode = setSessionCookieAuthLogin(); @@ -534,11 +548,14 @@ private void updateStatus() { updateGatewayStatus(installation); } else { logger.debug("Failed to set session cookie and auth login, HTTP result code: {}", httpResultCode); + return false; } - } catch (ExecutionException | InterruptedException | TimeoutException e) { + } catch (ExecutionException | InterruptedException | TimeoutException | PostToAPIException e) { logger.debug("Failed to update status {}", e.getMessage()); + return false; } - }); + } + return true; } private String createOperationJSON(String operation, VariablesDTO variables, String query) { @@ -549,7 +566,7 @@ private String createOperationJSON(String operation, VariablesDTO variables, Str return gson.toJson(Collections.singletonList(operationJSON)); } - private synchronized void updateAlarmStatus(VerisureInstallation installation) { + private synchronized void updateAlarmStatus(VerisureInstallation installation) throws PostToAPIException { BigDecimal installationId = installation.getInstallationId(); String url = START_GRAPHQL; String operation = "ArmState"; @@ -567,8 +584,7 @@ private synchronized void updateAlarmStatus(VerisureInstallation installation) { String deviceId = "alarm" + installationId; thing.setDeviceId(deviceId); notifyListenersIfChanged(thing, installation, deviceId); - } catch (ExecutionException | InterruptedException | TimeoutException | JsonSyntaxException - | PostToAPIException e) { + } catch (ExecutionException | InterruptedException | TimeoutException | JsonSyntaxException e) { logger.warn("Failed to send a POST to the API {}", e.getMessage()); } } diff --git a/bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/handler/VerisureBridgeHandler.java b/bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/handler/VerisureBridgeHandler.java index a5e68c43419be..5530a131cc78d 100644 --- a/bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/handler/VerisureBridgeHandler.java +++ b/bundles/org.openhab.binding.verisure/src/main/java/org/openhab/binding/verisure/internal/handler/VerisureBridgeHandler.java @@ -129,6 +129,8 @@ public void initialize() { logger.warn("Failed to initialize bridge, please check your credentials!"); updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.HANDLER_REGISTERING_ERROR, "Failed to login to Verisure, please check your credentials!"); + dispose(); + initialize(); return; } startAutomaticRefresh();