diff --git a/pom.xml b/pom.xml index c297b46..48102ef 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.bwssystems.HABridge ha-bridge - 4.5.0rc2 + 4.5.0rc3 jar HA Bridge diff --git a/src/main/java/com/bwssystems/HABridge/BridgeSecurity.java b/src/main/java/com/bwssystems/HABridge/BridgeSecurity.java index 5b61025..08a4496 100644 --- a/src/main/java/com/bwssystems/HABridge/BridgeSecurity.java +++ b/src/main/java/com/bwssystems/HABridge/BridgeSecurity.java @@ -5,6 +5,12 @@ import java.io.UnsupportedEncodingException; import java.security.GeneralSecurityException; import java.util.Base64; import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.UUID; +import java.util.Map.Entry; import javax.crypto.Cipher; import javax.crypto.SecretKey; @@ -15,6 +21,9 @@ import javax.crypto.spec.PBEParameterSpec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.bwssystems.HABridge.api.hue.HueError; +import com.bwssystems.HABridge.api.hue.HueErrorResponse; +import com.bwssystems.HABridge.api.hue.WhitelistEntry; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; @@ -23,6 +32,8 @@ import spark.Request; public class BridgeSecurity { private static final Logger log = LoggerFactory.getLogger(BridgeSecurity.class); private static final String USER_SESSION_ID = "user"; + private static final String DEPRACATED_INTERNAL_USER = "thehabridgeuser"; + private static final String TEST_USER_TYPE = "test_ha_bridge"; private static final byte[] SALT = { (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, @@ -191,6 +202,91 @@ public class BridgeSecurity { this.settingsChanged = settingsChanged; } + public HueError[] validateWhitelistUser(String aUser, String userDescription, boolean strict) { + String validUser = null; + boolean found = false; + if (aUser != null && !aUser.equalsIgnoreCase("undefined") && !aUser.equalsIgnoreCase("null") + && !aUser.equalsIgnoreCase("")) { + if (securityDescriptor.getWhitelist() != null) { + Set theUserIds = securityDescriptor.getWhitelist().keySet(); + Iterator userIterator = theUserIds.iterator(); + while (userIterator.hasNext()) { + validUser = userIterator.next(); + if (validUser.equals(aUser)) + found = true; + } + } + } + + if(!found && !strict) { + newWhitelistUser(aUser, userDescription); + + found = true; + } + + if (!found) { + return HueErrorResponse.createResponse("1", "/api/" + aUser, "unauthorized user", null, null, null).getTheErrors(); + } + + Object anUser = securityDescriptor.getWhitelist().remove(DEPRACATED_INTERNAL_USER); + if(anUser != null) + setSettingsChanged(true); + + return null; + } + + public void newWhitelistUser(String aUser, String userDescription) { + if(aUser.equals(DEPRACATED_INTERNAL_USER)) + return; + if (securityDescriptor.getWhitelist() == null) { + securityDescriptor.setWhitelist(new HashMap<>()); + } + if(userDescription == null) + userDescription = "auto insert user"; + + securityDescriptor.getWhitelist().put(aUser, WhitelistEntry.createEntry(userDescription)); + setSettingsChanged(true); + } + + public String createWhitelistUser(String userDescription) { + String aUser = getNewUserID(); + newWhitelistUser(aUser, userDescription); + return aUser; + } + + public void convertWhitelist(Map whitelist) { + securityDescriptor.setWhitelist(whitelist); + } + + private String getNewUserID() { + UUID uid = UUID.randomUUID(); + StringTokenizer st = new StringTokenizer(uid.toString(), "-"); + String newUser = ""; + while (st.hasMoreTokens()) { + newUser = newUser + st.nextToken(); + } + + return newUser; + } + + public void removeTestUsers() { + if (securityDescriptor.getWhitelist() != null) { + Object anUser = securityDescriptor.getWhitelist().remove(DEPRACATED_INTERNAL_USER); + if(anUser != null) + setSettingsChanged(true); + + Iterator> it = securityDescriptor.getWhitelist().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + it.remove(); // avoids a ConcurrentModificationException + if(pair.getValue().getName().equals(TEST_USER_TYPE)) { + securityDescriptor.getWhitelist().remove(pair.getKey()); + setSettingsChanged(true); + } + } + } + } + private String encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(habridgeKey)); diff --git a/src/main/java/com/bwssystems/HABridge/BridgeSecurityDescriptor.java b/src/main/java/com/bwssystems/HABridge/BridgeSecurityDescriptor.java index 380f46a..19bf17b 100644 --- a/src/main/java/com/bwssystems/HABridge/BridgeSecurityDescriptor.java +++ b/src/main/java/com/bwssystems/HABridge/BridgeSecurityDescriptor.java @@ -1,12 +1,14 @@ package com.bwssystems.HABridge; import java.util.Map; +import com.bwssystems.HABridge.api.hue.WhitelistEntry; public class BridgeSecurityDescriptor { private Map users; private boolean useLinkButton; private String execGarden; private boolean secureHueApi; + private Map whitelist; public BridgeSecurityDescriptor() { super(); @@ -44,6 +46,12 @@ public class BridgeSecurityDescriptor { public void setSecureHueApi(boolean secureHueApi) { this.secureHueApi = secureHueApi; } + public Map getWhitelist() { + return whitelist; + } + public void setWhitelist(Map whitelist) { + this.whitelist = whitelist; + } public boolean isSecure() { boolean secureFlag = false; diff --git a/src/main/java/com/bwssystems/HABridge/BridgeSettings.java b/src/main/java/com/bwssystems/HABridge/BridgeSettings.java index 6c4d63f..9365f9d 100644 --- a/src/main/java/com/bwssystems/HABridge/BridgeSettings.java +++ b/src/main/java/com/bwssystems/HABridge/BridgeSettings.java @@ -12,6 +12,8 @@ import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.nio.file.attribute.PosixFilePermission; import java.security.GeneralSecurityException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; @@ -29,6 +31,7 @@ public class BridgeSettings extends BackupHandler { private BridgeSettingsDescriptor theBridgeSettings; private BridgeControlDescriptor bridgeControl; private BridgeSecurity bridgeSecurity; + private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); public BridgeSettings() { super(); @@ -55,6 +58,10 @@ public class BridgeSettings extends BackupHandler { public BridgeSecurity getBridgeSecurity() { return bridgeSecurity; } + public static String getCurrentDate() { + return dateFormat.format(new Date()); + } + public void buildSettings() { String addressString = null; String theVeraAddress = null; @@ -140,7 +147,7 @@ public class BridgeSettings extends BackupHandler { theBridgeSettings.setNestpwd(System.getProperty("nest.pwd")); } - if(theBridgeSettings.getUpnpConfigAddress() == null || theBridgeSettings.getUpnpConfigAddress().equals("")) { + if(theBridgeSettings.getUpnpConfigAddress() == null || theBridgeSettings.getUpnpConfigAddress().trim().equals("") || theBridgeSettings.getUpnpConfigAddress().trim().equals("0.0.0.0")) { addressString = checkIpAddress(null, true); if(addressString != null) { theBridgeSettings.setUpnpConfigAddress(addressString); @@ -187,6 +194,11 @@ public class BridgeSettings extends BackupHandler { setupParams(Paths.get(theBridgeSettings.getConfigfile()), ".cfgbk", "habridge.config-"); bridgeSecurity.setSecurityData(theBridgeSettings.getSecurityData()); + if(theBridgeSettings.getWhitelist() != null) { + bridgeSecurity.convertWhitelist(theBridgeSettings.getWhitelist()); + theBridgeSettings.removeWhitelist(); + updateConfigFile(); + } } public void loadConfig() { @@ -219,11 +231,11 @@ public class BridgeSettings extends BackupHandler { try { newBridgeSettings.setSecurityData(bridgeSecurity.getSecurityDescriptorData()); } catch (UnsupportedEncodingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + log.warn("could not get encoded security data: " + e.getMessage()); + return; } catch (GeneralSecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + log.warn("could not get encoded security data: " + e.getMessage()); + return; } bridgeSecurity.setSettingsChanged(false); } @@ -237,6 +249,18 @@ public class BridgeSettings extends BackupHandler { log.debug("Save HA Bridge settings."); Path configPath = Paths.get(theBridgeSettings.getConfigfile()); JsonTransformer aRenderer = new JsonTransformer(); + if(bridgeSecurity.isSettingsChanged()) { + try { + theBridgeSettings.setSecurityData(bridgeSecurity.getSecurityDescriptorData()); + } catch (UnsupportedEncodingException e) { + log.warn("could not get encoded security data: " + e.getMessage()); + return; + } catch (GeneralSecurityException e) { + log.warn("could not get encoded security data: " + e.getMessage()); + return; + } + bridgeSecurity.setSettingsChanged(false); + } String jsonValue = aRenderer.render(theBridgeSettings); configWriter(jsonValue, configPath); _loadConfig(configPath); @@ -260,7 +284,7 @@ public class BridgeSettings extends BackupHandler { try { Path target = null; if(Files.exists(filePath)) { - target = FileSystems.getDefault().getPath(filePath.getParent().toString(), "habridge.config.old"); + target = FileSystems.getDefault().getPath(filePath.getParent().toString(), "habridge.config.old." + getCurrentDate()); Files.move(filePath, target); } Files.write(filePath, content.getBytes(), StandardOpenOption.CREATE); @@ -310,6 +334,7 @@ public class BridgeSettings extends BackupHandler { log.error("checkIpAddress cannot get ip address of this host, Exiting with message: " + e.getMessage(), e); return null; } + String addressString = null; InetAddress address = null; while (ifs.hasMoreElements() && addressString == null) { diff --git a/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java b/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java index 593d08f..319f5c0 100644 --- a/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java +++ b/src/main/java/com/bwssystems/HABridge/BridgeSettingsDescriptor.java @@ -1,59 +1,105 @@ package com.bwssystems.HABridge; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.UUID; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; import com.bwssystems.HABridge.api.hue.HueConstants; -import com.bwssystems.HABridge.api.hue.HueError; -import com.bwssystems.HABridge.api.hue.HueErrorResponse; import com.bwssystems.HABridge.api.hue.WhitelistEntry; public class BridgeSettingsDescriptor { - private static final String DEPRACATED_INTERNAL_USER = "thehabridgeuser"; - private static final String TEST_USER_TYPE = "test_ha_bridge"; + @SerializedName("upnpconfigaddress") + @Expose private String upnpconfigaddress; + @SerializedName("serverport") + @Expose private Integer serverport; + @SerializedName("upnpresponseport") + @Expose private Integer upnpresponseport; + @SerializedName("upnpdevicedb") + @Expose private String upnpdevicedb; + @SerializedName("veraaddress") + @Expose private IpList veraaddress; + @SerializedName("harmonyaddress") + @Expose private IpList harmonyaddress; + @SerializedName("buttonsleep") + @Expose private Integer buttonsleep; + @SerializedName("upnpstrict") + @Expose private boolean upnpstrict; + @SerializedName("traceupnp") + @Expose private boolean traceupnp; + @SerializedName("nestuser") + @Expose private String nestuser; + @SerializedName("nestpwd") + @Expose private String nestpwd; + @SerializedName("farenheit") + @Expose + private boolean farenheit; + @SerializedName("configfile") + @Expose + private String configfile; + @SerializedName("numberoflogmessages") + @Expose + private Integer numberoflogmessages; + @SerializedName("hueaddress") + @Expose + private IpList hueaddress; + @SerializedName("haladdress") + @Expose + private IpList haladdress; + @SerializedName("haltoken") + @Expose + private String haltoken; + @SerializedName("whitelist") + @Expose + private Map whitelist; + @SerializedName("myechourl") + @Expose + private String myechourl; + @SerializedName("webaddress") + @Expose + private String webaddress; + @SerializedName("mqttaddress") + @Expose + private IpList mqttaddress; + @SerializedName("hassaddress") + @Expose + private IpList hassaddress; + @SerializedName("domoticzaddress") + @Expose + private IpList domoticzaddress; + @SerializedName("somfyaddress") + @Expose + private IpList somfyaddress; + @SerializedName("hubversion") + @Expose + private String hubversion; + @SerializedName("securityData") + @Expose + private String securityData; + + + private boolean settingsChanged; private boolean veraconfigured; private boolean harmonyconfigured; - private boolean nestconfigured; - private boolean farenheit; - private String configfile; - private Integer numberoflogmessages; - private IpList hueaddress; private boolean hueconfigured; - private IpList haladdress; - private String haltoken; + private boolean nestconfigured; private boolean halconfigured; - private Map whitelist; - private boolean settingsChanged; - private String myechourl; - private String webaddress; - private IpList mqttaddress; private boolean mqttconfigured; - private IpList hassaddress; private boolean hassconfigured; - private String hubversion; - private IpList domoticzaddress; private boolean domoticzconfigured; - private IpList somfyaddress; private boolean somfyconfigured; private boolean lifxconfigured; - private String securityData; public BridgeSettingsDescriptor() { super(); @@ -227,8 +273,8 @@ public class BridgeSettingsDescriptor { public Map getWhitelist() { return whitelist; } - public void setWhitelist(Map whitelist) { - this.whitelist = whitelist; + protected void removeWhitelist() { + whitelist = null; } public boolean isSettingsChanged() { return settingsChanged; @@ -378,85 +424,4 @@ public class BridgeSettingsDescriptor { public Boolean isValidLifx() { return this.isLifxconfigured(); } - - public HueError[] validateWhitelistUser(String aUser, String userDescription, boolean strict) { - String validUser = null; - boolean found = false; - if (aUser != null && !aUser.equalsIgnoreCase("undefined") && !aUser.equalsIgnoreCase("null") - && !aUser.equalsIgnoreCase("")) { - if (whitelist != null) { - Set theUserIds = whitelist.keySet(); - Iterator userIterator = theUserIds.iterator(); - while (userIterator.hasNext()) { - validUser = userIterator.next(); - if (validUser.equals(aUser)) - found = true; - } - } - } - - if(!found && !strict) { - newWhitelistUser(aUser, userDescription); - - found = true; - } - - if (!found) { - return HueErrorResponse.createResponse("1", "/api/" + aUser, "unauthorized user", null, null, null).getTheErrors(); - } - - Object anUser = whitelist.remove(DEPRACATED_INTERNAL_USER); - if(anUser != null) - setSettingsChanged(true); - - return null; - } - - public void newWhitelistUser(String aUser, String userDescription) { - if(aUser.equals(DEPRACATED_INTERNAL_USER)) - return; - if (whitelist == null) { - whitelist = new HashMap<>(); - } - if(userDescription == null) - userDescription = "auto insert user"; - - whitelist.put(aUser, WhitelistEntry.createEntry(userDescription)); - setSettingsChanged(true); - } - - public String createWhitelistUser(String userDescription) { - String aUser = getNewUserID(); - newWhitelistUser(aUser, userDescription); - return aUser; - } - - private String getNewUserID() { - UUID uid = UUID.randomUUID(); - StringTokenizer st = new StringTokenizer(uid.toString(), "-"); - String newUser = ""; - while (st.hasMoreTokens()) { - newUser = newUser + st.nextToken(); - } - - return newUser; - } - - public void removeTestUsers() { - if (whitelist != null) { - Object anUser = whitelist.remove(DEPRACATED_INTERNAL_USER); - if(anUser != null) - setSettingsChanged(true); - - Iterator> it = whitelist.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry pair = it.next(); - it.remove(); // avoids a ConcurrentModificationException - if(pair.getValue().getName().equals(TEST_USER_TYPE)) { - whitelist.remove(pair.getKey()); - setSettingsChanged(true); - } - } - } - } } diff --git a/src/main/java/com/bwssystems/HABridge/HABridge.java b/src/main/java/com/bwssystems/HABridge/HABridge.java index 5f1be45..8a0f9fb 100644 --- a/src/main/java/com/bwssystems/HABridge/HABridge.java +++ b/src/main/java/com/bwssystems/HABridge/HABridge.java @@ -102,8 +102,8 @@ public class HABridge { } } } - bridgeSettings.getBridgeSettingsDescriptor().removeTestUsers(); - if(bridgeSettings.getBridgeSettingsDescriptor().isSettingsChanged()) + bridgeSettings.getBridgeSecurity().removeTestUsers(); + if(bridgeSettings.getBridgeSecurity().isSettingsChanged()) bridgeSettings.updateConfigFile(); log.info("HA Bridge (v" + theVersion.getVersion() + ") exiting...."); System.exit(0); diff --git a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java index 2c15b9f..6af7e85 100644 --- a/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java +++ b/src/main/java/com/bwssystems/HABridge/hue/HueMulator.java @@ -595,9 +595,9 @@ public class HueMulator { private String basicListHandler(String type, String userId, String requestIp) { log.debug("hue " + type + " list requested: " + userId + " from " + requestIp); - HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); + HueError[] theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); if (theErrors != null) { - if(bridgeSettings.isSettingsChanged()) + if(bridgeSettingMaster.getBridgeSecurity().isSettingsChanged()) bridgeSettingMaster.updateConfigFile(); return aGsonHandler.toJson(theErrors); @@ -609,9 +609,9 @@ public class HueMulator { log.debug("hue group list requested: " + userId + " from " + requestIp); HueError[] theErrors = null; Map groupResponseMap = null; - theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); + theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); if (theErrors == null) { - if(bridgeSettings.isSettingsChanged()) + if(bridgeSettingMaster.getBridgeSecurity().isSettingsChanged()) bridgeSettingMaster.updateConfigFile(); groupResponseMap = new HashMap(); @@ -626,9 +626,9 @@ public class HueMulator { private Object groupsIdHandler(String groupId, String userId, String requestIp) { log.debug("hue group id: <" + groupId + "> requested: " + userId + " from " + requestIp); HueError[] theErrors = null; - theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); + theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); if (theErrors == null) { - if(bridgeSettings.isSettingsChanged()) + if(bridgeSettingMaster.getBridgeSecurity().isSettingsChanged()) bridgeSettingMaster.updateConfigFile(); if (groupId.equalsIgnoreCase("0")) { @@ -651,9 +651,9 @@ public class HueMulator { if (bridgeSettings.isTraceupnp()) log.info("Traceupnp: hue lights list requested: " + userId + " from " + requestIp); log.debug("hue lights list requested: " + userId + " from " + requestIp); - theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); + theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); if (theErrors == null) { - if(bridgeSettings.isSettingsChanged()) + if(bridgeSettingMaster.getBridgeSecurity().isSettingsChanged()) bridgeSettingMaster.updateConfigFile(); List deviceList = repository.findAllByRequester(requestIp); @@ -727,13 +727,13 @@ public class HueMulator { aDeviceType = ""; if (newUser == null) { - newUser = bridgeSettings.createWhitelistUser(aDeviceType); + newUser = bridgeSettingMaster.getBridgeSecurity().createWhitelistUser(aDeviceType); } else { - bridgeSettings.validateWhitelistUser(newUser, aDeviceType, false); + bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(newUser, aDeviceType, false); } - if(bridgeSettings.isSettingsChanged()) + if(bridgeSettingMaster.getBridgeSecurity().isSettingsChanged()) bridgeSettingMaster.updateConfigFile(); if (bridgeSettings.isTraceupnp()) @@ -749,7 +749,7 @@ public class HueMulator { if (bridgeSettings.isTraceupnp()) log.info("Traceupnp: hue api/:userid/config config requested: " + userId + " from " + ipAddress); log.debug("hue api config requested: " + userId + " from " + ipAddress); - if (bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()) != null) { + if (bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()) != null) { log.debug("hue api config requested, No User supplied, returning public config"); HuePublicConfig apiResponse = HuePublicConfig.createConfig("Philips hue", bridgeSettings.getUpnpConfigAddress(), bridgeSettings.getHubversion()); @@ -765,7 +765,7 @@ public class HueMulator { @SuppressWarnings("unchecked") private Object getFullState(String userId, String ipAddress) { log.debug("hue api full state requested: " + userId + " from " + ipAddress); - HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); + HueError[] theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); if (theErrors != null) return theErrors; @@ -779,7 +779,7 @@ public class HueMulator { private Object getLight(String userId, String lightId, String ipAddress) { log.debug("hue light requested: " + lightId + " for user: " + userId + " from " + ipAddress); - HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); + HueError[] theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); if (theErrors != null) return theErrors; @@ -823,7 +823,7 @@ public class HueMulator { Integer targetBri = null; Integer targetBriInc = null; log.debug("Update state requested: " + userId + " from " + ipAddress + " body: " + body); - HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); + HueError[] theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); if (theErrors != null) return aGsonHandler.toJson(theErrors); try { @@ -873,7 +873,7 @@ public class HueMulator { aMultiUtil.setDelayDefault(bridgeSettings.getButtonsleep()); aMultiUtil.setSetCount(1); log.debug("hue state change requested: " + userId + " from " + ipAddress + " body: " + body); - HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); + HueError[] theErrors = bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()); if (theErrors != null) return aGsonHandler.toJson(theErrors); try { diff --git a/src/main/resources/public/scripts/app.js b/src/main/resources/public/scripts/app.js index 686f3d7..f98bcce 100644 --- a/src/main/resources/public/scripts/app.js +++ b/src/main/resources/public/scripts/app.js @@ -93,13 +93,10 @@ app.run( async function ($rootScope, $location, Auth, bridgeService) { } }); - $rootScope.$on('securityReview', function(event, data) { - if(Auth.isLoggedIn()) { - $location.path("/"); - } else { - event.preventDefault(); - $location.path("/login"); - } + $rootScope.$on('securityError', function(event, data) { + Auth.logout(); + event.preventDefault(); + $location.path("/login"); }); $rootScope.$on('securityReinit', function(event, data) { @@ -193,7 +190,10 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.devices = response.data; }, function (error) { - self.displayError("Cannot get devices from habridge: ", error); + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else + self.displayError("Cannot get devices from habridge: ", error); } ); }; @@ -204,6 +204,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.viewDevices(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayError("Cannot renumber devices from habridge: ", error); } ); @@ -242,6 +245,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.getAUser(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Cannot get testuser: ", error); } ); @@ -254,6 +260,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.testuser = response.data[0].success.username; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Cannot get a user: ", error); } ); @@ -266,6 +275,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.getTestUser(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Cannot get security info: ", error); } ); @@ -284,6 +296,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.displaySuccess("Updated security settings.") }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Update ecurity settings Error: ", error); } ); @@ -311,6 +326,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.displaySuccess("Password updated") }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Update password Error: ", error); } ); @@ -332,6 +350,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n } }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("User add Error: ", error); } ); @@ -348,6 +369,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.displaySuccess("User deleted") }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("User add Error: ", error); } ); @@ -359,6 +383,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.displayTimer("Link your device", 30000); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Cannot get security info: ", error); } ); @@ -490,6 +517,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.updateShowLifx(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Load Bridge Settings Error: ", error); } ); @@ -501,6 +531,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.backups = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Backups Error: ", error); } ); @@ -512,6 +545,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.configs = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Configs Error: ", error); } ); @@ -523,6 +559,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.logMsgs = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get log messages Error: ", error); } ); @@ -534,6 +573,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.loggerInfo = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get logger info Error: ", error); } ); @@ -547,6 +589,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.nestitems = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Nest Items Error: ", error); } ); @@ -560,6 +605,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.huedevices = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Hue Items Error: ", error); } ); @@ -573,6 +621,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.veradevices = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Vera Devices Error: ", error); } ); @@ -586,6 +637,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.verascenes = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Vera Scenes Error: ", error); } ); @@ -599,6 +653,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.harmonyactivities = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Harmony Activities Error: ", error); } ); @@ -612,6 +669,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.harmonydevices = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Harmony Devices Error: ", error); } ); @@ -625,6 +685,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.haldevices = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Hal Devices Error: ", error); } ); @@ -638,6 +701,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.mqttbrokers = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get MQTT Devices Error: ", error); } ); @@ -651,6 +717,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.hassdevices = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Hass Devices Error: ", error); } ); @@ -664,6 +733,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.domoticzdevices = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Domoticz Devices Error: ", error); } ); @@ -677,6 +749,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.somfydevices = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Somfy Devices Error: ", error); } ); @@ -691,6 +766,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.lifxdevices = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get Lifx Devices Error: ", error); } ); @@ -763,6 +841,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.state.mapTypes = response.data; }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Get mapTypes Error: ", error); } ); @@ -786,6 +867,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.displaySuccess("Updated " + logComponents.length + " loggers for log levels.") }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Update Log components Error: ", error); } ); @@ -814,6 +898,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.displaySuccess("Bulk device add successful."); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Bulk Add new Device Error: ", error); } ); @@ -832,6 +919,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n function (response) { }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Edit Device Error: ", error); } ); @@ -842,6 +932,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n function (response) { }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Add new Device Error: ", error); } ); @@ -856,6 +949,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.viewBackups(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Backup Device Db Error: ", error); } ); @@ -870,6 +966,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.viewDevices(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Backup Db Restore Error: ", error); } ); @@ -883,6 +982,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.viewBackups(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Delete Backup Db File Error:", error); } ); @@ -912,6 +1014,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.displayError("HABridge is now stopped. Restart must occur from the server.", null); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayError("HABRidge Stop Error: ", error); } ); @@ -931,6 +1036,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n }, 2000); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("HABRidge Reinit Error: ", error); } ); @@ -942,6 +1050,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.reinit(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Save Settings Error: ", error); } ); @@ -956,6 +1067,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.viewConfigs(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Backup Settings Error: ", error); } ); @@ -971,6 +1085,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.viewDevices(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Backup Settings Restore Error: ", error); } ); @@ -984,6 +1101,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.viewConfigs(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Delete Backup Settings File Error: ", error); } ); @@ -995,6 +1115,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.viewDevices(); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Delete Device Error: ", error); } ); @@ -1036,6 +1159,9 @@ app.service ('bridgeService', function ($rootScope, $http, $base64, $location, n self.displaySuccess("Request Executed: " + msgDescription); }, function (error) { + if (error.status === 401) + $rootScope.$broadcast('securityReinit', 'done'); + else self.displayWarn("Request Error, Pleae look in your habridge log: ", error); } ); @@ -3257,6 +3383,7 @@ app.controller('LoginController', function ($scope, $location, Auth) { $scope.logout = function() { Auth.logout(); $scope.loggedIn = Auth.isLoggedIn(); + bridgeService.displaySuccess("User Logged Out"); $location.path("/login"); }; }); @@ -3322,7 +3449,6 @@ app.factory('Auth', function($resource, $rootScope, $sessionStorage, $http, $bas delete $sessionStorage.user; delete $rootScope.user; delete bridgeService.state.loggedInUser; - bridgeService.displaySuccess("User Logged Out"); };