Fixed enable rooms for Alexa. Removed huemulator redirect for Spark.

Added Link management as links are now stored with IP.
This commit is contained in:
Admin
2017-12-12 15:21:45 -06:00
parent 4c86e42776
commit 4ecbad6558
9 changed files with 165 additions and 37 deletions

View File

@@ -205,6 +205,12 @@ public class BridgeSecurity {
return securityDescriptor.getWhitelist();
}
public void setWhitelist(Map<String, WhitelistEntry> aWhitelist) {
securityDescriptor.setWhitelist(aWhitelist);
settingsChanged = true;
return;
}
public HueError[] validateWhitelistUser(String aUser, String userDescription, boolean strict) {
String validUser = null;
boolean found = false;

View File

@@ -62,7 +62,7 @@ public class HABridge {
// sparkjava config directive to set port for the web server to listen on
port(bridgeSettings.getBridgeSettingsDescriptor().getServerPort());
staticFileLocation("/public");
// initExceptionHandler((e) -> HABridge.theExceptionHandler(e, bridgeSettings.getBridgeSettingsDescriptor().getServerPort()));
initExceptionHandler((e) -> HABridge.theExceptionHandler(e, bridgeSettings.getBridgeSettingsDescriptor().getServerPort()));
if(!bridgeSettings.getBridgeControl().isReinit())
init();
bridgeSettings.getBridgeControl().setReinit(false);

View File

@@ -8,6 +8,7 @@ import static spark.Spark.before;
import static spark.Spark.halt;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
@@ -16,11 +17,13 @@ import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Timer;
import java.util.Base64;
import java.util.Map;
import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bwssystems.HABridge.api.hue.WhitelistEntry;
import com.bwssystems.HABridge.dao.BackupFilename;
import com.bwssystems.HABridge.util.JsonTransformer;
import com.bwssystems.HABridge.util.TextStringFormatter;
@@ -28,6 +31,7 @@ import com.bwssystems.logservices.LoggerInfo;
import com.bwssystems.logservices.LoggingForm;
import com.bwssystems.logservices.LoggingManager;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
@@ -295,6 +299,36 @@ public class SystemControl {
return bridgeSettings.getBridgeSecurity().getSecurityInfo();
}, new JsonTransformer());
// http://ip_address:port/system/whitelist gets the whitelist for the bridge
get (SYSTEM_CONTEXT + "/whitelist", (request, response) -> {
log.debug("Get whitelist");
response.status(HttpStatus.SC_OK);
response.type("application/json");
return bridgeSettings.getBridgeSecurity().getWhitelist();
}, new JsonTransformer());
// http://ip_address:port/system/setwhitelist CORS request
options(SYSTEM_CONTEXT + "/setwhitelist", (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/setwhitelist which sets the whitelist after being managed
post(SYSTEM_CONTEXT + "/setwhitelist", (request, response) -> {
log.debug("setwhitelist....");
Type listType = new TypeToken<Map<String, WhitelistEntry>>() {
}.getType();
Map<String, WhitelistEntry> aWhitelist = new Gson().fromJson(request.body(), listType);
bridgeSettings.getBridgeSecurity().setWhitelist(aWhitelist);
bridgeSettings.save(bridgeSettings.getBridgeSettingsDescriptor());
response.status(HttpStatus.SC_OK);
response.type("application/json");
return bridgeSettings.getBridgeSecurity().getWhitelist();
}, new JsonTransformer());
// http://ip_address:port/system/logmgmt/update CORS request
options(SYSTEM_CONTEXT + "/logmgmt/update", (request, response) -> {
response.status(HttpStatus.SC_OK);

View File

@@ -48,10 +48,7 @@ public class DeviceResource {
public DeviceResource(BridgeSettings theSettings, HomeManager aHomeManager) {
bridgeSettings = theSettings;
this.deviceRepository = new DeviceRepository(bridgeSettings.getBridgeSettingsDescriptor().getUpnpDeviceDb());
if(bridgeSettings.getBridgeSettingsDescriptor().isUserooms())
this.groupRepository = new GroupRepository(bridgeSettings.getBridgeSettingsDescriptor().getUpnpGroupDb());
else
this.groupRepository = null;
this.groupRepository = new GroupRepository(bridgeSettings.getBridgeSettingsDescriptor().getUpnpGroupDb());
homeManager = aHomeManager;
aGsonHandler = new GsonBuilder().create();
setupEndpoints();

View File

@@ -76,10 +76,11 @@ public class HueMulator {
public void setupServer() {
log.info("Hue emulator service started....");
before(HUE_CONTEXT + "/*", (request, response) -> {
String path = request.pathInfo();
if (path.endsWith("/")) { // it should work with or without a trailing slash
response.redirect(path.substring(0, path.length() - 1));
}
// This currently causes an error with Spark replies
// String path = request.pathInfo();
// if (path.endsWith("/")) { // it should work with or without a trailing slash
// response.redirect(path.substring(0, path.length() - 1));
// }
log.debug("HueMulator " + request.requestMethod() + " called on api/* with request <<<" + request.pathInfo() + ">>>, and body <<<" + request.body() + ">>>");
if(bridgeSettingMaster.getBridgeSecurity().isSecure()) {
String pathInfo = request.pathInfo();
@@ -127,12 +128,7 @@ public class HueMulator {
response.header("Access-Control-Allow-Origin", request.headers("Origin"));
response.type("application/json");
response.status(HttpStatus.SC_OK);
if(bridgeSettings.isUserooms()) {
return addGroup(request.params(":userid"), request.ip(), request.body());
} else {
log.debug("group add requested from (No Use Rooms) " + request.ip() + " user " + request.params(":userid") + " with body " + request.body());
return "[{\"success\":{\"id\":\"1\"}}]";
}
return addGroup(request.params(":userid"), request.ip(), request.body());
});
// http://ip_address:port/api/:userid/groups/<groupid>
// delete a group
@@ -140,12 +136,7 @@ public class HueMulator {
response.header("Access-Control-Allow-Origin", request.headers("Origin"));
response.type("application/json");
response.status(HttpStatus.SC_OK);
if(bridgeSettings.isUserooms()) {
return deleteGroup(request.params(":userid"), request.params(":groupid"), request.ip());
} else {
log.debug("delete to groups API from " + request.ip() + " user " + request.params(":userid") + " with body " + request.body());
return "[{\"error\":{\"address\": \"/groups/0/action/scene\", \"type\":7, \"description\": \"invalid value, dummy for parameter, scene\"}}]";
}
return deleteGroup(request.params(":userid"), request.params(":groupid"), request.ip());
});
// http://ip_address:port/api/:userid/groups/<groupid>
// modify a single group
@@ -153,12 +144,7 @@ public class HueMulator {
response.header("Access-Control-Allow-Origin", request.headers("Origin"));
response.type("application/json");
response.status(HttpStatus.SC_OK);
if(bridgeSettings.isUserooms()) {
return modifyGroup(request.params(":userid"), request.params(":groupid"), request.ip(), request.body());
} else {
log.debug("put to groups API from " + request.ip() + " user " + request.params(":userid") + " with body " + request.body());
return "[{\"error\":{\"address\": \"/groups/0/action/scene\", \"type\":7, \"description\": \"invalid value, dummy for parameter, scene\"}}]";
}
return modifyGroup(request.params(":userid"), request.params(":groupid"), request.ip(), request.body());
});
// http://ip_address:port/api/:userid/groups/<groupid>/action
// group acions
@@ -166,12 +152,7 @@ public class HueMulator {
response.header("Access-Control-Allow-Origin", request.headers("Origin"));
response.type("application/json");
response.status(HttpStatus.SC_OK);
if(bridgeSettings.isUserooms()) {
return changeGroupState(request.params(":userid"), request.params(":groupid"), request.body(), request.ip(), false);
} else {
log.debug("put action to groups API from " + request.ip() + " user " + request.params(":userid") + " with body " + request.body());
return "[{\"error\":{\"address\": \"/groups/0/action/scene\", \"type\":7, \"description\": \"invalid value, dummy for parameter, scene\"}}]";
}
return changeGroupState(request.params(":userid"), request.params(":groupid"), request.body(), request.ip(), false);
});
// http://ip_address:port/api/{userId}/scenes returns json objects of
// all scenes configured
@@ -1022,7 +1003,7 @@ public class HueMulator {
if (theErrors != null)
return theErrors;
if (Integer.parseInt(lightId) >= 10000) {
if (bridgeSettings.isUserooms() && Integer.parseInt(lightId) >= 10000) {
GroupDescriptor group = groupRepository.findOne(String.valueOf(Integer.parseInt(lightId) - 10000));
return DeviceResponse.createResponseForVirtualLight(group);
}