Testing security impl

This commit is contained in:
Admin
2017-03-30 15:55:36 -05:00
parent ba621fcb85
commit cd5417c2e0
28 changed files with 274 additions and 116 deletions

View File

@@ -9,17 +9,17 @@ public abstract class AuthFramework {
// TODO Auto-generated constructor stub
}
protected void addAuthenticatedUser(Request request, User u) {
public void addAuthenticatedUser(Request request, User u) {
request.session().attribute(USER_SESSION_ID, u);
}
protected void removeAuthenticatedUser(Request request) {
public void removeAuthenticatedUser(Request request) {
request.session().removeAttribute(USER_SESSION_ID);
}
protected User getAuthenticatedUser(Request request) {
public User getAuthenticatedUser(Request request) {
return request.session().attribute(USER_SESSION_ID);
}
}

View File

@@ -18,7 +18,7 @@ import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
public class BridgeSecurity {
public class BridgeSecurity extends AuthFramework {
private static final Logger log = LoggerFactory.getLogger(BridgeSecurity.class);
private char[] habridgeKey;
private static final byte[] SALT = {
@@ -105,6 +105,24 @@ public class BridgeSecurity {
return error;
}
public String delUser(User aUser) throws IOException {
String error = null;
if(aUser != null) {
if(securityDescriptor.getUsers() != null) {
if(securityDescriptor.getUsers().get(aUser.getUsername()) != null) {
securityDescriptor.getUsers().remove(aUser.getUsername());
settingsChanged = true;
}
else
error = "User not found";
}
}
else
error = "invalid user object given";
return error;
}
public void setExecGarden(String theGarden) {
securityDescriptor.setExecGarden(theGarden);
settingsChanged = true;

View File

@@ -185,7 +185,7 @@ public class BridgeSettings extends BackupHandler {
String theKey = System.getProperty("security.key");
if(theKey == null)
theKey = "";
theKey = "IWantMyPasswordsToBeAbleToBeDecodedPleaseSeeTheReadme";
bridgeSecurity = new BridgeSecurity(theKey.toCharArray(), theBridgeSettings.getSecurityData());
}

View File

@@ -68,9 +68,9 @@ public class HABridge {
else {
//Setup the device connection homes through the manager
homeManager = new HomeManager();
homeManager.buildHomes(bridgeSettings.getBridgeSettingsDescriptor(), udpSender);
homeManager.buildHomes(bridgeSettings, udpSender);
// setup the class to handle the resource setup rest api
theResources = new DeviceResource(bridgeSettings.getBridgeSettingsDescriptor(), homeManager);
theResources = new DeviceResource(bridgeSettings, homeManager);
// setup the class to handle the upnp response rest api
theSettingResponder = new UpnpSettingsResource(bridgeSettings.getBridgeSettingsDescriptor());
theSettingResponder.setupServer();

View File

@@ -4,6 +4,6 @@ import com.bwssystems.HABridge.devicemanagmeent.ResourceHandler;
import com.bwssystems.HABridge.hue.HueMulatorHandler;
public interface Home extends HueMulatorHandler, ResourceHandler {
public Home createHome(BridgeSettingsDescriptor bridgeSettings);
public Home createHome(BridgeSettings bridgeSettings);
public void closeHome();
}

View File

@@ -31,7 +31,7 @@ public class HomeManager {
}
// factory method
public void buildHomes(BridgeSettingsDescriptor bridgeSettings, UDPDatagramSender aUdpDatagramSender) {
public void buildHomes(BridgeSettings bridgeSettings, UDPDatagramSender aUdpDatagramSender) {
Home aHome = null;
//setup the harmony connection if available
aHome = new HarmonyHome(bridgeSettings);

View File

@@ -34,7 +34,7 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.read.CyclicBufferAppender;
public class SystemControl extends AuthFramework {
public class SystemControl {
private static final Logger log = LoggerFactory.getLogger(SystemControl.class);
public static final String CYCLIC_BUFFER_APPENDER_NAME = "CYCLIC";
private LoggerContext lc;
@@ -62,11 +62,11 @@ public class SystemControl extends AuthFramework {
before(SYSTEM_CONTEXT + "/*", (request, response) -> {
if(bridgeSettings.getBridgeSecurity().isSecure()) {
String pathInfo = request.pathInfo();
if(pathInfo == null || !pathInfo.equals(SYSTEM_CONTEXT + "/login")) {
User authUser = getAuthenticatedUser(request);
if(authUser == null) {
halt(401, "{\"message\":\"User not authenticated\"}");
}
if(pathInfo == null || (!pathInfo.equals(SYSTEM_CONTEXT + "/login") && !pathInfo.equals(SYSTEM_CONTEXT + "/habridge/version"))) {
User authUser = bridgeSettings.getBridgeSecurity().getAuthenticatedUser(request);
if(authUser == null) {
halt(401, "{\"message\":\"User not authenticated\"}");
}
}
}
});
@@ -75,7 +75,7 @@ public class SystemControl extends AuthFramework {
log.debug("Get HA Bridge version: v" + version.getVersion());
response.status(HttpStatus.SC_OK);
response.type("application/json");
return "{\"version\":\"" + version.getVersion() + "\"}";
return "{\"version\":\"" + version.getVersion() + "\",\"isSecure\":" + bridgeSettings.getBridgeSecurity().isSecure() + "}";
});
// http://ip_address:port/system/habridge/testuser gets the valid test user for calling the api
@@ -171,12 +171,46 @@ public class SystemControl extends AuthFramework {
String theDecodedPayload = new String(Base64.getDecoder().decode(request.body()));
User theUser = new Gson().fromJson(theDecodedPayload, User.class);
String errorMessage = theUser.validate();
if(errorMessage != null) {
response.status(HttpStatus.SC_BAD_REQUEST);
errorMessage = "{\"message\":\"" + errorMessage + "\"}";
} else {
errorMessage = bridgeSettings.getBridgeSecurity().addUser(theUser);
if(errorMessage == null) {
response.status(HttpStatus.SC_OK);
bridgeSettings.save(bridgeSettings.getBridgeSettingsDescriptor());
} else {
response.status(HttpStatus.SC_BAD_REQUEST);
errorMessage = "{\"message\":\"" + errorMessage + "\"}";
}
}
if(errorMessage == null)
errorMessage = "{}";
response.type("application/json");
return errorMessage;
});
// http://ip_address:port/system/deluser CORS request
options(SYSTEM_CONTEXT + "/deluser", (request, response) -> {
response.status(HttpStatus.SC_OK);
response.header("Access-Control-Allow-Origin", request.headers("Origin"));
response.header("Access-Control-Allow-Methods", "GET, POST, PUT");
response.header("Access-Control-Allow-Headers", request.headers("Access-Control-Request-Headers"));
response.header("Content-Type", "text/html; charset=utf-8");
return "";
});
// http://ip_address:port/system/deluser which dels a user
put(SYSTEM_CONTEXT + "/deluser", (request, response) -> {
log.debug("deluser....");
String theDecodedPayload = new String(Base64.getDecoder().decode(request.body()));
User theUser = new Gson().fromJson(theDecodedPayload, User.class);
String errorMessage = bridgeSettings.getBridgeSecurity().delUser(theUser);
if(errorMessage != null) {
response.status(HttpStatus.SC_BAD_REQUEST);
errorMessage = "{\"message\":\"" + errorMessage + "\"}";
} else {
response.status(HttpStatus.SC_OK);
bridgeSettings.getBridgeSecurity().addUser(theUser);
bridgeSettings.save(bridgeSettings.getBridgeSettingsDescriptor());
}
@@ -202,7 +236,7 @@ public class SystemControl extends AuthFramework {
User theUser = new Gson().fromJson(theDecodedPayload, User.class);
LoginResult result = bridgeSettings.getBridgeSecurity().validatePassword(theUser);
if(result.getUser() != null)
addAuthenticatedUser(request, theUser);
bridgeSettings.getBridgeSecurity().addAuthenticatedUser(request, theUser);
response.status(HttpStatus.SC_OK);
response.type("application/json");
return result;

View File

@@ -1,9 +1,11 @@
package com.bwssystems.HABridge.devicemanagmeent;
import static spark.Spark.get;
import static spark.Spark.halt;
import static spark.Spark.options;
import static spark.Spark.post;
import static spark.Spark.put;
import static spark.Spark.before;
import static spark.Spark.delete;
import java.util.Arrays;
@@ -15,9 +17,10 @@ import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.DeviceMapTypes;
import com.bwssystems.HABridge.HomeManager;
import com.bwssystems.HABridge.User;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.dao.BackupFilename;
import com.bwssystems.HABridge.dao.DeviceDescriptor;
@@ -36,11 +39,13 @@ public class DeviceResource {
private static final Logger log = LoggerFactory.getLogger(DeviceResource.class);
private DeviceRepository deviceRepository;
private HomeManager homeManager;
private BridgeSettings bridgeSettings;
private Gson aGsonHandler;
private static final Set<String> supportedVerbs = new HashSet<>(Arrays.asList("get", "put", "post"));
public DeviceResource(BridgeSettingsDescriptor theSettings, HomeManager aHomeManager) {
this.deviceRepository = new DeviceRepository(theSettings.getUpnpDeviceDb());
public DeviceResource(BridgeSettings theSettings, HomeManager aHomeManager) {
bridgeSettings = theSettings;
this.deviceRepository = new DeviceRepository(bridgeSettings.getBridgeSettingsDescriptor().getUpnpDeviceDb());
homeManager = aHomeManager;
aGsonHandler = new GsonBuilder().create();
setupEndpoints();
@@ -52,6 +57,14 @@ public class DeviceResource {
private void setupEndpoints() {
log.info("HABridge device management service started.... ");
before(API_CONTEXT + "/*", (request, response) -> {
if(bridgeSettings.getBridgeSecurity().isSecure()) {
User authUser = bridgeSettings.getBridgeSecurity().getAuthenticatedUser(request);
if(authUser == null) {
halt(401, "{\"message\":\"User not authenticated\"}");
}
}
});
// http://ip_address:port/api/devices CORS request
options(API_CONTEXT, "application/json", (request, response) -> {
response.status(HttpStatus.SC_OK);

View File

@@ -1,10 +1,10 @@
package com.bwssystems.HABridge.hue;
import com.bwssystems.HABridge.AuthFramework;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.DeviceMapTypes;
import com.bwssystems.HABridge.HomeManager;
import com.bwssystems.HABridge.User;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.api.UserCreateRequest;
import com.bwssystems.HABridge.api.hue.DeviceResponse;
@@ -23,7 +23,9 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;
import static spark.Spark.before;
import static spark.Spark.get;
import static spark.Spark.halt;
import static spark.Spark.options;
import static spark.Spark.post;
import static spark.Spark.put;
@@ -41,7 +43,7 @@ import java.util.Map;
* Based on Armzilla's HueMulator - a Philips Hue emulator using sparkjava rest server
*/
public class HueMulator extends AuthFramework {
public class HueMulator {
private static final Logger log = LoggerFactory.getLogger(HueMulator.class);
private static final String HUE_CONTEXT = "/api";
@@ -66,6 +68,14 @@ public class HueMulator extends AuthFramework {
// This function sets up the sparkjava rest calls for the hue api
public void setupServer() {
log.info("Hue emulator service started....");
before(HUE_CONTEXT + "/*", (request, response) -> {
if(bridgeSettingMaster.getBridgeSecurity().isSecureHueApi()) {
User authUser = bridgeSettingMaster.getBridgeSecurity().getAuthenticatedUser(request);
if(authUser == null) {
halt(401, "{\"message\":\"User not authenticated\"}");
}
}
});
// http://ip_address:port/api/{userId}/groups returns json objects of
// all groups configured
get(HUE_CONTEXT + "/:userid/groups", "application/json", (request, response) -> {
@@ -731,7 +741,7 @@ public class HueMulator extends AuthFramework {
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, true) != null) {
if (bridgeSettings.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());
@@ -747,7 +757,7 @@ public class HueMulator extends AuthFramework {
@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, true);
HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton());
if (theErrors != null)
return theErrors;
@@ -761,7 +771,7 @@ public class HueMulator extends AuthFramework {
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, true);
HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton());
if (theErrors != null)
return theErrors;
@@ -805,7 +815,7 @@ public class HueMulator extends AuthFramework {
Integer targetBri = null;
Integer targetBriInc = null;
log.debug("Update state requested: " + userId + " from " + ipAddress + " body: " + body);
HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, true);
HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton());
if (theErrors != null)
return aGsonHandler.toJson(theErrors);
try {
@@ -855,7 +865,7 @@ public class HueMulator extends AuthFramework {
aMultiUtil.setDelayDefault(bridgeSettings.getButtonsleep());
aMultiUtil.setSetCount(1);
log.debug("hue state change requested: " + userId + " from " + ipAddress + " body: " + body);
HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, true);
HueError[] theErrors = bridgeSettings.validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton());
if (theErrors != null)
return aGsonHandler.toJson(theErrors);
try {

View File

@@ -7,7 +7,7 @@ import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.DeviceMapTypes;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.dao.DeviceDescriptor;
@@ -32,7 +32,7 @@ public class NestHome implements com.bwssystems.HABridge.Home {
private Boolean isFarenheit;
private Boolean validNest;
public NestHome(BridgeSettingsDescriptor bridgeSettings) {
public NestHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -164,20 +164,20 @@ public class NestHome implements com.bwssystems.HABridge.Home {
}
@Override
public com.bwssystems.HABridge.Home createHome(BridgeSettingsDescriptor bridgeSettings) {
public com.bwssystems.HABridge.Home createHome(BridgeSettings bridgeSettings) {
theSession = null;
theNest = null;
nestItems = null;
validNest = bridgeSettings.isValidNest();
validNest = bridgeSettings.getBridgeSettingsDescriptor().isValidNest();
aGsonHandler = null;
log.info("Nest Home created." + (validNest ? "" : " No Nest configured."));
if(validNest) {
aGsonHandler = new GsonBuilder().create();
isFarenheit = bridgeSettings.isFarenheit();
isFarenheit = bridgeSettings.getBridgeSettingsDescriptor().isFarenheit();
try {
theSession = new NestSession(bridgeSettings.getNestuser(), bridgeSettings.getNestpwd());
theSession = new NestSession(bridgeSettings.getBridgeSettingsDescriptor().getNestuser(), bridgeSettings.getBridgeSettingsDescriptor().getNestpwd());
theNest = new Nest(theSession);
} catch (LoginException e) {
log.error("Caught Login Exception, setting Nest to invalid....");

View File

@@ -9,7 +9,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.NamedIP;
import com.bwssystems.HABridge.api.CallItem;
@@ -27,7 +27,7 @@ public class DomoticzHome implements Home {
private Boolean validDomoticz;
private HTTPHandler httpClient;
public DomoticzHome(BridgeSettingsDescriptor bridgeSettings) {
public DomoticzHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -123,14 +123,14 @@ public class DomoticzHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
validDomoticz = bridgeSettings.isValidDomoticz();
public Home createHome(BridgeSettings bridgeSettings) {
validDomoticz = bridgeSettings.getBridgeSettingsDescriptor().isValidDomoticz();
log.info("Domoticz Home created." + (validDomoticz ? "" : " No Domoticz devices configured."));
if(!validDomoticz)
return null;
httpClient = new HTTPHandler();
domoticzs = new HashMap<String, DomoticzHandler>();
Iterator<NamedIP> theList = bridgeSettings.getDomoticzaddress().getDevices().iterator();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getDomoticzaddress().getDevices().iterator();
while(theList.hasNext()) {
NamedIP aDomoticz = theList.next();
try {

View File

@@ -5,7 +5,7 @@ import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.dao.DeviceDescriptor;
@@ -16,8 +16,9 @@ import com.bwssystems.HABridge.hue.TimeDecode;
public class CommandHome implements Home {
private static final Logger log = LoggerFactory.getLogger(CommandHome.class);
private String execGarden;;
public CommandHome(BridgeSettingsDescriptor bridgeSettings) {
public CommandHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -34,6 +35,13 @@ public class CommandHome implements Home {
intermediate = BrightnessDecode.calculateReplaceIntensityValue(intermediate, itensity, targetBri, targetBriInc, false);
intermediate = DeviceDataDecode.replaceDeviceData(intermediate, device);
intermediate = TimeDecode.replaceTimeValue(intermediate);
if(execGarden != null) {
if(System.getProperty("os.name").toLowerCase().indexOf("win") > 0)
intermediate = execGarden + "\\" + intermediate;
else
intermediate = execGarden + "/" + intermediate;
}
String anError = doExecRequest(intermediate, lightId);
if (anError != null) {
responseString = anError;
@@ -65,8 +73,9 @@ public class CommandHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
public Home createHome(BridgeSettings bridgeSettings) {
log.info("Command Home for system program execution created.");
this.execGarden = bridgeSettings.getBridgeSecurity().getExecGarden();
return this;
}

View File

@@ -9,7 +9,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.NamedIP;
import com.bwssystems.HABridge.api.CallItem;
@@ -21,7 +21,7 @@ public class HalHome implements Home {
private Map<String, HalInfo> hals;
private Boolean validHal;
public HalHome(BridgeSettingsDescriptor bridgeSettings) {
public HalHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -111,17 +111,17 @@ public class HalHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
validHal = bridgeSettings.isValidHal();
public Home createHome(BridgeSettings bridgeSettings) {
validHal = bridgeSettings.getBridgeSettingsDescriptor().isValidHal();
log.info("HAL Home created." + (validHal ? "" : " No HAL devices configured."));
if(!validHal)
return null;
hals = new HashMap<String, HalInfo>();
Iterator<NamedIP> theList = bridgeSettings.getHaladdress().getDevices().iterator();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getHaladdress().getDevices().iterator();
while(theList.hasNext()) {
NamedIP aHal = theList.next();
try {
hals.put(aHal.getName(), new HalInfo(aHal, bridgeSettings.getHaltoken()));
hals.put(aHal.getName(), new HalInfo(aHal, bridgeSettings.getBridgeSettingsDescriptor().getHaltoken()));
} catch (Exception e) {
log.error("Cannot get hal client (" + aHal.getName() + ") setup, Exiting with message: " + e.getMessage(), e);
return null;

View File

@@ -10,7 +10,7 @@ import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.DeviceMapTypes;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.IpList;
@@ -32,7 +32,7 @@ public class HarmonyHome implements Home {
private Boolean validHarmony;
private Gson aGsonHandler;
public HarmonyHome(BridgeSettingsDescriptor bridgeSettings) {
public HarmonyHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -197,9 +197,9 @@ public class HarmonyHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
public Home createHome(BridgeSettings bridgeSettings) {
isDevMode = Boolean.parseBoolean(System.getProperty("dev.mode", "false"));
validHarmony = bridgeSettings.isValidHarmony();
validHarmony = bridgeSettings.getBridgeSettingsDescriptor().isValidHarmony();
log.info("Harmony Home created." + (validHarmony ? "" : " No Harmony devices configured.") + (isDevMode ? " DevMode is set." : ""));
if(validHarmony || isDevMode) {
hubs = new HashMap<String, HarmonyServer>();
@@ -214,16 +214,16 @@ public class HarmonyHome implements Home {
theList.add(devModeIp);
IpList thedevList = new IpList();
thedevList.setDevices(theList);
bridgeSettings.setHarmonyAddress(thedevList);
bridgeSettings.getBridgeSettingsDescriptor().setHarmonyAddress(thedevList);
}
Iterator<NamedIP> theList = bridgeSettings.getHarmonyAddress().getDevices().iterator();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getHarmonyAddress().getDevices().iterator();
while(theList.hasNext() && validHarmony) {
NamedIP aHub = theList.next();
boolean loopControl = true;
int retryCount = 0;
while(loopControl) {
try {
hubs.put(aHub.getName(), HarmonyServer.setup(bridgeSettings, isDevMode, aHub));
hubs.put(aHub.getName(), HarmonyServer.setup(bridgeSettings.getBridgeSettingsDescriptor(), isDevMode, aHub));
loopControl = false;
} catch (Exception e) {
if(retryCount > 3) {

View File

@@ -9,7 +9,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.NamedIP;
import com.bwssystems.HABridge.api.CallItem;
@@ -26,23 +26,23 @@ public class HassHome implements Home {
private Boolean validHass;
private Gson aGsonHandler;
public HassHome(BridgeSettingsDescriptor bridgeSettings) {
public HassHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
public Home createHome(BridgeSettings bridgeSettings) {
hassMap = null;
aGsonHandler = null;
validHass = bridgeSettings.isValidHass();
validHass = bridgeSettings.getBridgeSettingsDescriptor().isValidHass();
log.info("HomeAssistant Home created." + (validHass ? "" : " No HomeAssistants configured."));
if(validHass) {
hassMap = new HashMap<String,HomeAssistant>();
aGsonHandler =
new GsonBuilder()
.create();
Iterator<NamedIP> theList = bridgeSettings.getHassaddress().getDevices().iterator();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getHassaddress().getDevices().iterator();
while(theList.hasNext() && validHass) {
NamedIP aHass = theList.next();
try {

View File

@@ -3,7 +3,7 @@ package com.bwssystems.HABridge.plugins.http;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.api.NameValue;
@@ -20,7 +20,7 @@ public class HTTPHome implements Home {
private static final Logger log = LoggerFactory.getLogger(HTTPHome.class);
private HTTPHandler anHttpHandler;
public HTTPHome(BridgeSettingsDescriptor bridgeSettings) {
public HTTPHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -79,7 +79,7 @@ public class HTTPHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
public Home createHome(BridgeSettings bridgeSettings) {
anHttpHandler = new HTTPHandler();
log.info("Http Home created.");
return this;

View File

@@ -8,7 +8,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.NamedIP;
import com.bwssystems.HABridge.api.CallItem;
@@ -25,7 +25,7 @@ public class HueHome implements Home {
private Boolean validHue;
private Gson aGsonHandler;
public HueHome(BridgeSettingsDescriptor bridgeSettings) {
public HueHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -105,12 +105,12 @@ public class HueHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
validHue = bridgeSettings.isValidHue();
public Home createHome(BridgeSettings bridgeSettings) {
validHue = bridgeSettings.getBridgeSettingsDescriptor().isValidHue();
log.info("Hue passthru Home created." + (validHue ? "" : " No Hue passtrhu systems configured."));
if(validHue) {
hues = new HashMap<String, HueInfo>();
Iterator<NamedIP> theList = bridgeSettings.getHueaddress().getDevices().iterator();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getHueaddress().getDevices().iterator();
while(theList.hasNext()) {
NamedIP aHue = theList.next();
hues.put(aHue.getName(), new HueInfo(aHue));

View File

@@ -14,7 +14,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.dao.DeviceDescriptor;
@@ -38,21 +38,21 @@ public class LifxHome implements Home {
private Boolean validLifx;
private Gson aGsonHandler;
public LifxHome(BridgeSettingsDescriptor bridgeSettings) {
public LifxHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
public Home createHome(BridgeSettings bridgeSettings) {
lifxMap = null;
aGsonHandler = null;
validLifx = bridgeSettings.isValidLifx();
validLifx = bridgeSettings.getBridgeSettingsDescriptor().isValidLifx();
log.info("LifxDevice Home created." + (validLifx ? "" : " No LifxDevices configured."));
if(validLifx) {
try {
log.info("Open Lifx client....");
InetAddress configuredAddress = InetAddress.getByName(bridgeSettings.getUpnpConfigAddress());
InetAddress configuredAddress = InetAddress.getByName(bridgeSettings.getBridgeSettingsDescriptor().getUpnpConfigAddress());
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(configuredAddress);
InetAddress bcastInetAddr = null;
if (networkInterface != null) {

View File

@@ -8,7 +8,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.NamedIP;
import com.bwssystems.HABridge.api.CallItem;
@@ -26,7 +26,7 @@ public class MQTTHome implements Home {
private Boolean validMqtt;
private Gson aGsonHandler;
public MQTTHome(BridgeSettingsDescriptor bridgeSettings) {
public MQTTHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -123,15 +123,15 @@ public class MQTTHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
validMqtt = bridgeSettings.isValidMQTT();
public Home createHome(BridgeSettings bridgeSettings) {
validMqtt = bridgeSettings.getBridgeSettingsDescriptor().isValidMQTT();
log.info("MQTT Home created." + (validMqtt ? "" : " No MQTT Clients configured."));
if(validMqtt) {
aGsonHandler =
new GsonBuilder()
.create();
handlers = new HashMap<String, MQTTHandler>();
Iterator<NamedIP> theList = bridgeSettings.getMqttaddress().getDevices().iterator();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getMqttaddress().getDevices().iterator();
while(theList.hasNext()) {
NamedIP aClientConfig = theList.next();
MQTTHandler aHandler = new MQTTHandler(aClientConfig);

View File

@@ -1,6 +1,6 @@
package com.bwssystems.HABridge.plugins.somfy;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.DeviceMapTypes;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.NamedIP;
@@ -31,7 +31,7 @@ public class SomfyHome implements Home {
private Map<String, SomfyInfo> somfys;
private Boolean validSomfy;
public SomfyHome(BridgeSettingsDescriptor bridgeSettings) {
public SomfyHome(BridgeSettings bridgeSettings) {
createHome(bridgeSettings);
}
@@ -97,12 +97,12 @@ public class SomfyHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
validSomfy = bridgeSettings.isValidSomfy();
public Home createHome(BridgeSettings bridgeSettings) {
validSomfy = bridgeSettings.getBridgeSettingsDescriptor().isValidSomfy();
log.info("Somfy Home created." + (validSomfy ? "" : " No Somfys configured."));
if(validSomfy) {
somfys = new HashMap<>();
Iterator<NamedIP> theList = bridgeSettings.getSomfyAddress().getDevices().iterator();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getSomfyAddress().getDevices().iterator();
while (theList.hasNext()) {
NamedIP aSomfy = theList.next();
somfys.put(aSomfy.getName(), new SomfyInfo(aSomfy, aSomfy.getName()));

View File

@@ -15,7 +15,7 @@ import org.apache.commons.lang3.StringEscapeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.api.hue.HueErrorResponse;
@@ -34,7 +34,7 @@ public class TCPHome implements Home {
private Gson aGsonHandler;
public TCPHome(BridgeSettingsDescriptor bridgeSettings) {
public TCPHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -122,7 +122,7 @@ public class TCPHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
public Home createHome(BridgeSettings bridgeSettings) {
log.info("TCP Home created.");
theSockets = new HashMap<String, Socket>();
aGsonHandler = new GsonBuilder().create();

View File

@@ -10,7 +10,7 @@ import org.apache.commons.lang3.StringEscapeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.dao.DeviceDescriptor;
@@ -25,7 +25,7 @@ public class UDPHome implements Home {
private UDPDatagramSender theUDPDatagramSender;
private byte[] sendData;
public UDPHome(BridgeSettingsDescriptor bridgeSettings, UDPDatagramSender aUDPDatagramSender) {
public UDPHome(BridgeSettings bridgeSettings, UDPDatagramSender aUDPDatagramSender) {
super();
theUDPDatagramSender = aUDPDatagramSender;
createHome(bridgeSettings);
@@ -80,7 +80,7 @@ public class UDPHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
public Home createHome(BridgeSettings bridgeSettings) {
log.info("UDP Home created.");
return this;
}

View File

@@ -9,7 +9,7 @@ import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.BridgeSettings;
import com.bwssystems.HABridge.DeviceMapTypes;
import com.bwssystems.HABridge.Home;
import com.bwssystems.HABridge.NamedIP;
@@ -25,7 +25,7 @@ public class VeraHome implements Home {
private Map<String, VeraInfo> veras;
private Boolean validVera;
public VeraHome(BridgeSettingsDescriptor bridgeSettings) {
public VeraHome(BridgeSettings bridgeSettings) {
super();
createHome(bridgeSettings);
}
@@ -90,12 +90,12 @@ public class VeraHome implements Home {
}
@Override
public Home createHome(BridgeSettingsDescriptor bridgeSettings) {
validVera = bridgeSettings.isValidVera();
public Home createHome(BridgeSettings bridgeSettings) {
validVera = bridgeSettings.getBridgeSettingsDescriptor().isValidVera();
log.info("Vera Home created." + (validVera ? "" : " No Veras configured."));
if(validVera) {
veras = new HashMap<String, VeraInfo>();
Iterator<NamedIP> theList = bridgeSettings.getVeraAddress().getDevices().iterator();
Iterator<NamedIP> theList = bridgeSettings.getBridgeSettingsDescriptor().getVeraAddress().getDevices().iterator();
while(theList.hasNext()) {
NamedIP aVera = theList.next();
veras.put(aVera.getName(), new VeraInfo(aVera));

View File

@@ -51,7 +51,7 @@
<ul class="dropdown-menu" aria-labelledby="dLabel">
<li><a href="http://www.bwssystems.com" target="_blank">Developed by BWS Systems</a></li>
<li><a href="http://www.amazon.com/echo" target="_blank">Amazon Echo</a></li>
<li><a href="">HA Bridge Version {{bridge.habridgeversion}}</a></li>
<li><a href="">HA Bridge Version {{bridge.habridgeversion.version}}</a></li>
<li><center>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">

View File

@@ -77,7 +77,9 @@ app.config (function ($locationProvider, $routeProvider) {
})
});
app.run( function ($rootScope, $location, Auth, bridgeService) {
app.run( async function ($rootScope, $location, Auth, bridgeService) {
bridgeService.getHABridgeVersion();
await bridgeService.sleep(4000);
Auth.init();
$rootScope.$on('$routeChangeStart', function (event, next) {
@@ -88,11 +90,11 @@ app.run( function ($rootScope, $location, Auth, bridgeService) {
});
if(Auth.isLoggedIn()) {
bridgeService.loadBridgeSettings();
bridgeService.getHABridgeVersion();
bridgeService.getTestUser();
bridgeService.getSecurityInfo();
bridgeService.viewMapTypes();
bridgeService.loadBridgeSettings();
bridgeService.getTestUser();
bridgeService.getSecurityInfo();
bridgeService.viewMapTypes();
await bridgeService.sleep(2000);
}
});
@@ -108,13 +110,18 @@ String.prototype.replaceAll = function (search, replace)
};
app.service ('bridgeService', function ($http, $base64, ngToast) {
app.service ('bridgeService', function ($http, $base64, $location, ngToast) {
var self = this;
this.state = {base: "./api/devices", bridgelocation: ".", systemsbase: "./system", huebase: "./api", configs: [], backups: [], devices: [], device: {},
mapandid: [], type: "", settings: [], myToastMsg: [], logMsgs: [], loggerInfo: [], mapTypes: [], olddevicename: "", logShowAll: false,
isInControl: false, showVera: false, showHarmony: false, showNest: false, showHue: false, showHal: false, showMqtt: false, showHass: false,
showDomoticz: false, showSomfy: false, showLifx: false, habridgeversion: "", viewDevId: "", queueDevId: "", securityInfo: {}, username: "test"};
showDomoticz: false, showSomfy: false, showLifx: false, habridgeversion: {}, viewDevId: "", queueDevId: "", securityInfo: {}, username: "test"};
this.sleep = function (ms) {
return new Promise(resolve => setTimeout(resolve, ms));
};
this.displayWarn = function(errorTitle, error) {
var toastContent = errorTitle;
if (error !== null && typeof(error) !== 'undefined') {
@@ -197,7 +204,10 @@ app.service ('bridgeService', function ($http, $base64, ngToast) {
this.getHABridgeVersion = function () {
return $http.get(this.state.systemsbase + "/habridge/version").then(
function (response) {
self.state.habridgeversion = response.data.version;
self.state.habridgeversion = {
version: response.data.version,
isSecure: response.data.isSecure
};
},
function (error) {
self.displayWarn("Cannot get version: ", error);
@@ -245,6 +255,26 @@ app.service ('bridgeService', function ($http, $base64, ngToast) {
);
};
this.isSecure = function () {
if(self.state.habridgeversion === undefined)
return true;
if(self.state.habridgeversion.isSecure === undefined)
return true;
return self.state.habridgeversion.isSecure;
};
this.initA = async function() {
self.getHABridgeVersion();
await self.sleep(4000);
};
this.initB = async function() {
self.loadBridgeSettings();
self.getTestUser();
self.getSecurityInfo();
self.viewMapTypes();
await self.sleep(4000);
};
this.changePassword = function (aPassword, aPassword2) {
var newUserInfo = {};
newUserInfo = {
@@ -274,6 +304,26 @@ app.service ('bridgeService', function ($http, $base64, ngToast) {
return $http.put(this.state.systemsbase + "/adduser", theEncodedPayload ).then(
function (response) {
self.displaySuccess("User added")
if(!self.isSecure()) {
self.initA();
$location.path('/login');
}
},
function (error) {
self.displayWarn("User add Error: ", error);
}
);
};
this.delUser = function (username) {
var newUserInfo = {};
newUserInfo = {
username: username
};
var theEncodedPayload = $base64.encode(angular.toJson(newUserInfo));
return $http.put(this.state.systemsbase + "/deluser", theEncodedPayload ).then(
function (response) {
self.displaySuccess("User deleted")
},
function (error) {
self.displayWarn("User add Error: ", error);
@@ -1336,6 +1386,12 @@ app.controller('SecurityDialogCtrl', function ($scope, bridgeService, ngDialog)
$scope.showPassword = $scope.isSecure;
};
$scope.delUser = function (newUser) {
bridgeService.delUser(newUser);
$scope.addingUser = false;
$scope.showPassword = $scope.isSecure;
};
$scope.dismissDialog = function () {
ngDialog.close('ngdialog1');
};
@@ -3208,7 +3264,7 @@ app.factory('Auth', function($resource, $rootScope, $sessionStorage, $http, $bas
*/
auth.init = function(){
if (auth.isLoggedIn()){
$rootScope.user = currentUser();
$rootScope.user = auth.currentUser();
}
};
@@ -3264,6 +3320,8 @@ app.factory('Auth', function($resource, $rootScope, $sessionStorage, $http, $bas
auth.userHasPermission = function(permissions){
if(!bridgeService.isSecure())
return true;
if(!auth.isLoggedIn()){
return false;
}
@@ -3281,11 +3339,15 @@ app.factory('Auth', function($resource, $rootScope, $sessionStorage, $http, $bas
auth.currentUser = function(){
if(!bridgeService.isSecure())
return "nouser";
return $sessionStorage.user;
};
auth.isLoggedIn = function(){
if(!bridgeService.isSecure())
return true;
return $sessionStorage.user != null;
};

View File

@@ -24,10 +24,13 @@
<button type="button" class="btn btn-primary" ng-click="setSecurityInfo()">Update</button>
</div>
<div class="form-group">
<label>New User</label>
<label>Add/Delete User</label>
<input id="new-user" name="new-user" class="form-control"
type="text" ng-model="newUser"
placeholder="someone" nu-check="new-user">
</div>
<div class="form-group">
<button type="button" class="btn btn-danger" ng-click="delUser(newUser)">Delete</button>
</div>
<div ng-if="showPassword" postrender-action="setBlankPassword('password-1')">
<div class="form-group">