finish base implementation of requester ip filtering within a url item.

not tested
This commit is contained in:
Admin
2016-11-29 16:38:44 -06:00
parent dcc4041d7d
commit 6f58d38224
4 changed files with 159 additions and 61 deletions

View File

@@ -5,7 +5,7 @@
<groupId>com.bwssystems.HABridge</groupId>
<artifactId>ha-bridge</artifactId>
<version>3.5.1a</version>
<version>3.5.1b</version>
<packaging>jar</packaging>
<name>HA Bridge</name>

View File

@@ -0,0 +1,18 @@
package com.bwssystems.HABridge;
public class DeviceMapTypes {
public final static String CUSTOM_DEVICE = "custom";
public final static String VERA_DEVICE = "veraDevice";
public final static String VERA_SCENE = "veraScene";
public final static String HARMONY_ACTIVITY = "harmonyActivity";
public final static String HARMONY_BUTTON = "harmonyButton";
public final static String NEST_HOMEAWAY = "nestHomeAway";
public final static String NEST_THERMO_SET = "nestThermoSet";
public final static String HUE_DEVICE = "hueDevice";
public final static String HAL_DEVICE = "halDevice";
public final static String HAL_BUTTON = "halButton";
public final static String HAL_HOME = "halHome";
public final static String HAL_THERMO_SET = "halThermoSet";
public final static String MQTT_MESSAGE = "mqttMessage";
public final static String EXEC_DEVICE = "execDevice";
}

View File

@@ -1,11 +1,11 @@
package com.bwssystems.HABridge.api;
public class CallItem {
private String type;
private String requesterAddress;
private String item;
private Integer count;
private Integer delay;
private String type;
private String requesterAddress;
public String getType() {
return type;

View File

@@ -1,6 +1,7 @@
package com.bwssystems.HABridge.hue;
import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.DeviceMapTypes;
import com.bwssystems.HABridge.api.CallItem;
import com.bwssystems.HABridge.api.CallItemDeserializer;
import com.bwssystems.HABridge.api.NameValue;
@@ -749,7 +750,9 @@ public class HueMulator implements HueErrorStringSet {
state.setBri(0);
}
}
if(!(device.getMapType() != null && device.getMapType().equalsIgnoreCase("hueDevice"))) {
// code for backwards compatibility
if(!(device.getMapType() != null && device.getMapType().equalsIgnoreCase(DeviceMapTypes.HUE_DEVICE))) {
if(url == null)
url = device.getOnUrl();
}
@@ -774,15 +777,25 @@ public class HueMulator implements HueErrorStringSet {
}
Integer setCount = 1;
for (int i = 0; callItems != null && i < callItems.length; i++) {
if(!filterByRequester(callItems[i].getRequesterAddress(), request.ip())) {
log.debug("filter for requester address not present in list: " + callItems[i].getRequesterAddress() + " with request ip of: " + request.ip());
continue;
}
if (callItems[i].getCount() != null && callItems[i].getCount() > 0)
setCount = callItems[i].getCount();
else
setCount = 1;
// code for backwards compatibility
if((callItems[i].getType() == null || callItems[i].getType().trim().length() == 0) && (device.getMapType() != null && device.getMapType().trim().length() > 0)) {
if(device.getMapType() != null || device.getMapType().length() > 0)
callItems[i].setType(device.getMapType());
else if(device.getDeviceType() != null || device.getDeviceType().length() > 0)
callItems[i].setType(device.getDeviceType());
else
callItems[i].setType(DeviceMapTypes.CUSTOM_DEVICE);
}
if((callItems[i].getType() == null || callItems[i].getType().trim().length() == 0) && (device.getMapType() != null && device.getMapType().trim().length() > 0))
callItems[i].setType(device.getMapType());
if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase("hueDevice")) {
if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.HUE_DEVICE)) {
if (myHueHome != null) {
HueDeviceIdentifier deviceId = new Gson().fromJson(callItems[i].getItem(), HueDeviceIdentifier.class);
@@ -796,55 +809,50 @@ public class HueMulator implements HueErrorStringSet {
}
// make call
responseString = doHttpRequest(
"http://" + deviceId.getIpAddress() + "/api/" + myHueHome.getTheHUERegisteredUser()
+ "/lights/" + deviceId.getDeviceId() + "/state",
HttpPut.METHOD_NAME, device.getContentType(), request.body(), null);
for (int x = 0; x < setCount; x++) {
if (x > 0 || i > 0) {
Thread.sleep(theDelay);
}
if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0)
theDelay = callItems[i].getDelay();
else
theDelay = bridgeSettings.getButtonsleep();
responseString = doHttpRequest(
"http://" + deviceId.getIpAddress() + "/api/" + myHueHome.getTheHUERegisteredUser()
+ "/lights/" + deviceId.getDeviceId() + "/state",
HttpPut.METHOD_NAME, device.getContentType(), request.body(), null);
if (responseString.contains("[{\"error\":"))
x = setCount;
}
if (responseString == null) {
log.warn("Error on calling url to change device state: " + url);
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
+ "\",\"description\": \"Error on calling HUE to change device state\", \"parameter\": \"/lights/"
+ lightId + "state\"}}]";
} else if (responseString.contains("[{\"error\":")
&& responseString.contains("unauthorized user")) {
myHueHome.setTheHUERegisteredUser(null);
hueUser = HueUtil.registerWithHue(httpClient, deviceId.getIpAddress(), device.getName(),
myHueHome.getTheHUERegisteredUser(), this);
if (hueUser == null) {
return errorString;
} else if (responseString.contains("[{\"error\":")) {
if(responseString.contains("unauthorized user")) {
myHueHome.setTheHUERegisteredUser(null);
hueUser = HueUtil.registerWithHue(httpClient, deviceId.getIpAddress(), device.getName(),
myHueHome.getTheHUERegisteredUser(), this);
if (hueUser == null) {
return errorString;
}
myHueHome.setTheHUERegisteredUser(hueUser);
}
myHueHome.setTheHUERegisteredUser(hueUser);
else
log.warn("Error occurred when calling Hue Passthru: " + responseString);
}
} else
} else {
log.warn("No HUE home configured for HUE device passthru call for deviceID: " + device.getId());
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
+ "\",\"description\": \"No HUE configured\", \"parameter\": \"/lights/" + lightId
+ "state\"}}]";
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase("harmonyActivity")) {
}
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.HARMONY_ACTIVITY)) {
log.debug("executing HUE api request to change activity to Harmony: " + url);
if (myHarmonyHome != null) {
RunActivity anActivity = new Gson().fromJson(url, RunActivity.class);
HarmonyHandler myHarmony = myHarmonyHome.getHarmonyHandler(device.getTargetDevice());
if (myHarmony == null) {
log.warn("Should not get here, no harmony hub available");
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
+ "\",\"description\": \"Should not get here, no harmony hub available\", \"parameter\": \"/lights/"
+ lightId + "state\"}}]";
} else
myHarmony.startActivity(anActivity);
} else {
log.warn("Should not get here, no harmony configured");
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
+ "\",\"description\": \"Should not get here, no harmony configured\", \"parameter\": \"/lights/"
+ lightId + "state\"}}]";
}
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase("harmonyButton")) {
log.debug("executing HUE api request to button press(es) to Harmony: " + url);
if (myHarmonyHome != null) {
if (url.substring(0, 1).equalsIgnoreCase("{")) {
url = "[" + url + "]";
}
ButtonPress[] deviceButtons = new Gson().fromJson(url, ButtonPress[].class);
HarmonyHandler myHarmony = myHarmonyHome.getHarmonyHandler(device.getTargetDevice());
if (myHarmony == null) {
log.warn("Should not get here, no harmony hub available");
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
@@ -859,10 +867,64 @@ public class HueMulator implements HueErrorStringSet {
theDelay = callItems[i].getDelay();
else
theDelay = bridgeSettings.getButtonsleep();
log.debug("pressing button: " + deviceButtons[i].getDevice() + " - "
+ deviceButtons[i].getButton() + " - iteration: " + String.valueOf(i)
+ " - count: " + String.valueOf(x));
myHarmony.pressButton(deviceButtons[i]);
myHarmony.startActivity(anActivity);
}
}
} else {
log.warn("Should not get here, no harmony configured");
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
+ "\",\"description\": \"Should not get here, no harmony configured\", \"parameter\": \"/lights/"
+ lightId + "state\"}}]";
}
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.HARMONY_BUTTON)) {
log.debug("executing HUE api request to button press(es) to Harmony: " + url);
if (myHarmonyHome != null) {
if (url.substring(0, 1).equalsIgnoreCase("{")) {
url = "[" + url + "]";
}
ButtonPress[] deviceButtons = new Gson().fromJson(url, ButtonPress[].class);
HarmonyHandler myHarmony = myHarmonyHome.getHarmonyHandler(device.getTargetDevice());
if (myHarmony == null) {
log.warn("Should not get here, no harmony hub available");
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
+ "\",\"description\": \"Should not get here, no harmony hub available\", \"parameter\": \"/lights/"
+ lightId + "state\"}}]";
} else {
if(deviceButtons.length > 1) {
Integer theCount = 1;
for(int z = 0; z < deviceButtons.length; z++) {
if(deviceButtons[z].getCount() != null && deviceButtons[z].getCount() > 0)
theCount = deviceButtons[z].getCount();
else
theCount = 1;
for(int y = 0; y < theCount; y++) {
if( y > 0 || z > 0) {
Thread.sleep(theDelay);
}
if(deviceButtons[z].getDelay() != null && deviceButtons[z].getDelay() > 0)
theDelay = deviceButtons[z].getDelay();
else
theDelay = bridgeSettings.getButtonsleep();
log.debug("pressing button: " + deviceButtons[z].getDevice() + " - " + deviceButtons[z].getButton() + " - iteration: " + String.valueOf(z) + " - count: " + String.valueOf(y));
myHarmony.pressButton(deviceButtons[z]);
}
}
}
else {
for (int x = 0; x < setCount; x++) {
if (x > 0 || i > 0) {
Thread.sleep(theDelay);
}
if (callItems[i].getDelay() != null && callItems[i].getDelay() > 0) {
theDelay = callItems[i].getDelay();
}
else
theDelay = bridgeSettings.getButtonsleep();
log.debug("pressing button: " + deviceButtons[i].getDevice() + " - "
+ deviceButtons[i].getButton() + " - iteration: " + String.valueOf(i)
+ " - count: " + String.valueOf(x));
myHarmony.pressButton(deviceButtons[i]);
}
}
}
} else {
@@ -872,7 +934,7 @@ public class HueMulator implements HueErrorStringSet {
+ lightId + "state\"}}]";
}
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase("nestHomeAway")) {
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.NEST_HOMEAWAY)) {
log.debug("executing HUE api request to set away for nest home: " + url);
if (theNest == null) {
log.warn("Should not get here, no Nest available");
@@ -883,7 +945,7 @@ public class HueMulator implements HueErrorStringSet {
NestInstruction homeAway = new Gson().fromJson(url, NestInstruction.class);
theNest.getHome(homeAway.getName()).setAway(homeAway.getAway());
}
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase("nestThermoSet")) {
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.NEST_THERMO_SET)) {
log.debug("executing HUE api request to set thermostat for nest: " + url);
if (theNest == null) {
log.warn("Should not get here, no Nest available");
@@ -934,7 +996,7 @@ public class HueMulator implements HueErrorStringSet {
+ lightId + "state\"}}]";
}
}
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase("mqttMessage")) {
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.MQTT_MESSAGE)) {
log.debug("executing HUE api request to send message to MQTT broker: " + url);
if (mqttHome != null) {
MQTTMessage[] mqttMessages = new Gson().fromJson(url, MQTTMessage[].class);
@@ -965,8 +1027,13 @@ public class HueMulator implements HueErrorStringSet {
+ lightId + "state\"}}]";
}
} else if (callItems[i].getType() != null && callItems[i].getType().trim().startsWith("exec")) {
} else if (callItems[i].getType() != null && callItems[i].getType().trim().equalsIgnoreCase(DeviceMapTypes.EXEC_DEVICE)) {
log.debug("Exec Request called with url: " + url);
String intermediate;
if (callItems[i].getItem().contains("exec://"))
intermediate = callItems[i].getItem().substring(callItems[i].getItem().indexOf("://") + 3);
else
intermediate = callItems[i].getItem();
for (int x = 0; x < setCount; x++) {
if (x > 0 || i > 0) {
Thread.sleep(theDelay);
@@ -975,16 +1042,11 @@ public class HueMulator implements HueErrorStringSet {
theDelay = callItems[i].getDelay();
else
theDelay = bridgeSettings.getButtonsleep();
String intermediate;
if (callItems[i].getItem().contains("exec://"))
intermediate = callItems[i].getItem().substring(callItems[i].getItem().indexOf("://") + 3);
else
intermediate = callItems[i].getItem();
String anError = doExecRequest(intermediate,
calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc), lightId);
if (anError != null) {
responseString = anError;
i = callItems.length + 1;
x = setCount;
}
}
} else // This section allows the usage of http/tcp/udp/exec
@@ -1014,7 +1076,7 @@ public class HueMulator implements HueErrorStringSet {
} else
hostAddr = hostPortion;
InetAddress IPAddress = InetAddress.getByName(hostAddr);
;
if (theUrlBody.startsWith("0x")) {
theUrlBody = replaceIntensityValue(theUrlBody,
calculateIntensity(state, theStateChanges, stateHasBri, stateHasBriInc),
@@ -1047,7 +1109,7 @@ public class HueMulator implements HueErrorStringSet {
lightId);
if (anError != null) {
responseString = anError;
i = callItems.length + 1;
x = setCount;
}
} else {
log.debug("executing HUE api request to Http "
@@ -1076,7 +1138,7 @@ public class HueMulator implements HueErrorStringSet {
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
+ "\",\"description\": \"Error on calling url to change device state\", \"parameter\": \"/lights/"
+ lightId + "state\"}}]";
i = callItems.length + 1;
x = setCount;
}
}
} catch (Exception e) {
@@ -1085,7 +1147,7 @@ public class HueMulator implements HueErrorStringSet {
responseString = "[{\"error\":{\"type\": 6, \"address\": \"/lights/" + lightId
+ "\",\"description\": \"Error on calling out to device\", \"parameter\": \"/lights/"
+ lightId + "state\"}}]";
i = callItems.length + 1;
x = setCount;
}
}
}
@@ -1477,4 +1539,22 @@ public class HueMulator implements HueErrorStringSet {
public void setErrorString(String anError) {
errorString = anError;
}
private Boolean filterByRequester(String requesterFilterList, String anAddress) {
if (requesterFilterList == null || requesterFilterList.length() == 0)
return true;
HashMap<String, String> addressMap;
addressMap = new HashMap<String, String>();
if (requesterFilterList.contains(",")) {
String[] theArray = requesterFilterList.split(",");
for (String v : theArray) {
addressMap.put(v.trim(), v.trim());
}
} else
addressMap.put(requesterFilterList.trim(), requesterFilterList.trim());
if (addressMap.containsKey(anAddress))
return true;
return false;
}
}