Skip to content
This repository was archived by the owner on Apr 13, 2020. It is now read-only.

Commit 465e411

Browse files
committed
Change to StringBuilder, add more on security
Fix tests, clean up
1 parent 9904182 commit 465e411

File tree

11 files changed

+53
-1040
lines changed

11 files changed

+53
-1040
lines changed

TODO.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Sailgauge tries port 8080
3030
Make Waypoint 'here' option
3131

3232
Enable users and passwords and protect server pages
33-
Add restart from web page
33+
3434
config.html wont delete arrays
3535
NMEA ais outputs incorrect position format?
3636
ais requires Cog true? cogM not considered.
@@ -40,10 +40,10 @@ log4j and config may need re-working after upgrade.
4040
REST api needs attention - http://www:8088/signalk/v1/config returns all
4141

4242
Finish adding XMPP support
43-
start xmpp routes
4443
add outgoing filters
4544
use queue to collect buffer
4645
* dont make xmmp.42.co.nz the default!
46+
*firewall needs an MSG_SRC_IP or a filter on XMPP server.
4747

4848
need avahi-utils?
4949

src/main/java/nz/co/fortytwo/signalk/processor/FullExportProcessor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,9 @@ public void recordEvent(PathEvent pathEvent) {
227227
return;
228228

229229
if(path.endsWith(dot+source)
230-
&& path.endsWith(dot+timestamp)
231-
&& path.contains(dot+source+dot)
232-
&& path.endsWith(dot+sourceRef)){
230+
|| path.endsWith(dot+timestamp)
231+
|| path.contains(dot+source+dot)
232+
|| path.endsWith(dot+sourceRef)){
233233
return;
234234
}
235235
// Send update if necessary.

src/main/java/nz/co/fortytwo/signalk/processor/IncomingSecurityFirewall.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,30 @@
2323
*/
2424
package nz.co.fortytwo.signalk.processor;
2525

26-
import static nz.co.fortytwo.signalk.util.SignalKConstants.CONFIG;
2726
import static nz.co.fortytwo.signalk.util.SignalKConstants.CONFIG_ACTION;
2827
import static nz.co.fortytwo.signalk.util.SignalKConstants.CONFIG_ACTION_SAVE;
2928
import static nz.co.fortytwo.signalk.util.SignalKConstants.CONTEXT;
29+
import static nz.co.fortytwo.signalk.util.SignalKConstants.DEMO;
3030
import static nz.co.fortytwo.signalk.util.SignalKConstants.INTERNAL_IP;
3131
import static nz.co.fortytwo.signalk.util.SignalKConstants.MSG_SRC_IP;
3232
import static nz.co.fortytwo.signalk.util.SignalKConstants.MSG_TYPE;
3333
import static nz.co.fortytwo.signalk.util.SignalKConstants.PUT;
3434
import static nz.co.fortytwo.signalk.util.SignalKConstants.SERIAL;
3535
import static nz.co.fortytwo.signalk.util.SignalKConstants.UPDATES;
36-
import static nz.co.fortytwo.signalk.util.SignalKConstants.dot;
3736
import static nz.co.fortytwo.signalk.util.SignalKConstants.self;
3837

3938
import java.util.ArrayList;
4039
import java.util.List;
4140

41+
import org.apache.camel.Exchange;
42+
import org.apache.camel.Processor;
43+
import org.apache.logging.log4j.LogManager;
44+
import org.apache.logging.log4j.Logger;
45+
4246
import mjson.Json;
4347
import nz.co.fortytwo.signalk.util.ConfigConstants;
4448
import nz.co.fortytwo.signalk.util.Util;
4549

46-
import org.apache.camel.Exchange;
47-
import org.apache.camel.Processor;
48-
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
49-
5050
/**
5151
* Parse the signalkModel json and remove anything that violates security
5252
*
@@ -90,16 +90,21 @@ public void process(Exchange exchange) throws Exception {
9090
// we trust local serial
9191
String type = exchange.getIn().getHeader(MSG_TYPE,
9292
String.class);
93-
if (SERIAL.equals(type))
93+
if (SERIAL.equals(type)||DEMO.equals(type)){
94+
if (logger.isDebugEnabled())
95+
logger.debug("Accepting msg:" + type);
9496
return;
95-
97+
}
98+
//TODO: check for valid XMPP/STOMP/MQTT SRC_IP ??
99+
96100
// we filter on ip
97101
String srcIp = exchange.getIn().getHeader(MSG_SRC_IP,
98102
String.class);
99103
if (logger.isDebugEnabled())
100104
logger.debug("Checking src ip:" + srcIp);
101105
if (srcIp == null) {
102-
logger.debug(exchange);
106+
logger.debug("Src ip null:"+exchange.getIn().getHeaders());
107+
//exchange.getIn().setBody(null);
103108
return;
104109
}
105110
// denied - drop now
@@ -131,8 +136,7 @@ public void process(Exchange exchange) throws Exception {
131136
// we trust INTERNAL_IP
132137
if (INTERNAL_IP.equals(type)) {
133138
if (logger.isDebugEnabled())
134-
logger.debug("Message allowed for src ip (internal):"
135-
+ srcIp);
139+
logger.debug("Message allowed for src ip (internal):"+ srcIp+":"+exchange.getIn().getHeaders());
136140
return;
137141
}
138142

src/main/java/nz/co/fortytwo/signalk/processor/SourceToSourceRefProcessor.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,22 @@
2424

2525
package nz.co.fortytwo.signalk.processor;
2626

27+
import static nz.co.fortytwo.signalk.util.SignalKConstants.MSG_TYPE;
2728
import static nz.co.fortytwo.signalk.util.SignalKConstants.dot;
28-
import static nz.co.fortytwo.signalk.util.SignalKConstants.normal;
29+
import static nz.co.fortytwo.signalk.util.SignalKConstants.label;
2930
import static nz.co.fortytwo.signalk.util.SignalKConstants.source;
3031
import static nz.co.fortytwo.signalk.util.SignalKConstants.sourceRef;
3132
import static nz.co.fortytwo.signalk.util.SignalKConstants.sources;
32-
import static nz.co.fortytwo.signalk.util.SignalKConstants.type;
33-
import static nz.co.fortytwo.signalk.util.SignalKConstants.vessels_dot_self_dot;
3433

3534
import java.util.Map.Entry;
3635
import java.util.NavigableMap;
3736

38-
import mjson.Json;
39-
import nz.co.fortytwo.signalk.model.SignalKModel;
40-
import nz.co.fortytwo.signalk.util.JsonSerializer;
41-
4237
import org.apache.camel.Exchange;
4338
import org.apache.camel.Processor;
44-
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
39+
import org.apache.logging.log4j.LogManager;
40+
import org.apache.logging.log4j.Logger;
41+
42+
import nz.co.fortytwo.signalk.model.SignalKModel;
4543

4644
/**
4745
* Replaces source with the actual $sourceRef object and stores source in sources.*
@@ -66,27 +64,28 @@ public void process(Exchange exchange) throws Exception {
6664
for(String key : model.getKeys()){
6765
//get the source.type key
6866
//if(logger.isDebugEnabled())logger.debug("Key:"+key);
69-
if(key.endsWith(dot+source+dot+type)){
67+
if(key.endsWith(dot+source+dot+label)){
7068
if(logger.isDebugEnabled())logger.debug("Convert key:"+key);
7169
int pos = key.indexOf(dot+source+dot);
72-
String typeVal = (String) model.get(key);
70+
String typeVal = exchange.getIn().getHeader(MSG_TYPE,String.class);
7371

7472
int pos1 = pos+source.length()+2;
7573
String refKey = key.substring(0,pos);
76-
if(logger.isDebugEnabled())logger.debug("refKey:"+refKey+", type:"+typeVal);
74+
if(logger.isDebugEnabled())logger.debug("refKey:"+refKey+", bus:"+typeVal);
7775
//get the label
78-
String label = (String) model.get(refKey+dot+source+dot+"label");
76+
String lbl = (String) model.get(refKey+dot+source+dot+label);
77+
if(logger.isDebugEnabled())logger.debug("refKey:"+refKey+", label:"+lbl);
7978
//set sourceRef
80-
model.getFullData().put(refKey+dot+sourceRef, typeVal+dot+label);
79+
model.getFullData().put(refKey+dot+sourceRef, typeVal+dot+lbl);
8180
//put in sources
8281
NavigableMap<String, Object> node = signalkModel.getSubMap(refKey+dot+source);
8382
if(logger.isDebugEnabled())logger.debug("Found keys:"+node.size());
8483
//node is the source object
8584
if(node!=null){
8685
for(Entry<String, Object> entry:node.entrySet()){
8786
String nodeKey = entry.getKey().substring(pos1);
88-
model.getFullData().put(sources+dot+typeVal+dot+label+dot+nodeKey, entry.getValue());
89-
if(logger.isDebugEnabled())logger.debug("Added key:"+sources+dot+typeVal+dot+label+dot+nodeKey+"="+entry.getValue());
87+
model.getFullData().put(sources+dot+typeVal+dot+lbl+dot+nodeKey, entry.getValue());
88+
if(logger.isDebugEnabled())logger.debug("Added key:"+sources+dot+typeVal+dot+lbl+dot+nodeKey+"="+entry.getValue());
9089
}
9190

9291
//drop the source key and all subkeys

src/main/java/nz/co/fortytwo/signalk/server/RouteManager.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@
2424
package nz.co.fortytwo.signalk.server;
2525

2626
import static nz.co.fortytwo.signalk.util.ConfigConstants.OUTPUT_XMPP;
27+
import static nz.co.fortytwo.signalk.util.SignalKConstants.DEMO;
2728
//import static nz.co.fortytwo.signalk.util.ConfigConstants.UUID;
2829
import static nz.co.fortytwo.signalk.util.SignalKConstants.FORMAT_DELTA;
2930
import static nz.co.fortytwo.signalk.util.SignalKConstants.MSG_SRC_BUS;
31+
import static nz.co.fortytwo.signalk.util.SignalKConstants.MSG_SRC_IP;
32+
import static nz.co.fortytwo.signalk.util.SignalKConstants.MSG_TYPE;
3033
import static nz.co.fortytwo.signalk.util.SignalKConstants.POLICY_IDEAL;
3134
import static nz.co.fortytwo.signalk.util.SignalKConstants.SIGNALK_API;
3235
import static nz.co.fortytwo.signalk.util.SignalKConstants.SIGNALK_AUTH;
@@ -154,7 +157,7 @@ public void configure0() throws Exception {
154157
.redeliveryDelay(1000));
155158

156159
from ("direct:fail").id("Fail")
157-
.to("log:log:nz.co.fortytwo.signalk.error?level=ERROR&showAll=true");
160+
.to("log:nz.co.fortytwo.signalk.error?level=ERROR&showAll=true");
158161

159162
SignalKModelFactory.load(signalkModel);
160163

@@ -421,9 +424,11 @@ public void configure0() throws Exception {
421424
.onException(Exception.class).handled(true).maximumRedeliveries(0)
422425
.to("log:nz.co.fortytwo.signalk.model.receive?level=ERROR&showException=true&showStackTrace=true")
423426
.end()
424-
.split(body().tokenize("\n")).streaming()
427+
.split(body().regexTokenize("[\r\n|\n|\r]")).streaming()
425428
.convertBodyTo(String.class)
426-
.throttle(2).timePeriodMillis(1000)
429+
.throttle(4).timePeriodMillis(1000)
430+
.setHeader(MSG_TYPE, constant(DEMO))
431+
//.setHeader(MSG_SRC_IP,constant("127.0.0.1"))
427432
.setHeader(MSG_SRC_BUS, constant("demo"))
428433
.to(SEDA_INPUT).id(SignalkRouteFactory.getName("SEDA_INPUT"))
429434
.end();

src/main/java/nz/co/fortytwo/signalk/server/SerialPortReader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public class SerialReader implements SerialPortEventListener {
155155

156156
private Pattern uid;
157157
List<String> lines = new ArrayList<String>();
158-
StringBuffer line = new StringBuffer(60);
158+
StringBuilder line = new StringBuilder(60);
159159
private boolean enableSerial=true;
160160
private boolean complete;
161161
protected InputStream in;
@@ -194,7 +194,7 @@ public void serialEvent(SerialPortEvent event) {
194194
//10=LF, 13=CR, lines should end in CR/LF
195195
if(r==10 ||x==256){
196196
if(r==10)complete=true;
197-
line.append(new String(buff));
197+
line.append(buff);
198198
buff=new byte[256];
199199
x=0;
200200
}
@@ -239,7 +239,7 @@ public void serialEvent(SerialPortEvent event) {
239239
}
240240
}
241241
complete=false;
242-
line=new StringBuffer(60);
242+
line=new StringBuilder(60);
243243
}
244244
}
245245
}

src/main/java/nz/co/fortytwo/signalk/server/SubscriptionManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ public class SubscriptionManager {
5050

5151
//hold sessionid <> wsSessionId
5252
BiMap<String, String> wsSessionMap = HashBiMap.create();
53+
//map wsSession to output type
5354
Map<String, String> outPutMap = new HashMap<String, String>();
55+
//wsSession> localIp#remoteIp
5456
Map<String, String> ipMap = new HashMap<String, String>();
5557
//wsSessionId>Subscription
5658
ConcurrentLinkedQueue<Subscription> subscriptions = new ConcurrentLinkedQueue<Subscription>();

src/test/java/nz/co/fortytwo/signalk/processor/FullExportProcessorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void shouldEmitIfMatchesWithIdealPolicy() throws Exception {
106106

107107
@Test
108108
public void shouldEmitIfMatchesWithInstantPolicy() throws Exception {
109-
testScenario("vessels.self.navigation", SignalKConstants.POLICY_INSTANT, 3, self_nav);
109+
testScenario("vessels.self.navigation", SignalKConstants.POLICY_INSTANT, 1, self_nav);
110110
}
111111

112112
@Test

src/test/java/nz/co/fortytwo/signalk/processor/SourceToSourceRefProcessorTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626
package nz.co.fortytwo.signalk.processor;
2727

28+
import static nz.co.fortytwo.signalk.util.SignalKConstants.MSG_TYPE;
2829
import static nz.co.fortytwo.signalk.util.SignalKConstants.dot;
2930
import static nz.co.fortytwo.signalk.util.SignalKConstants.env_outside_pressure;
3031
import static nz.co.fortytwo.signalk.util.SignalKConstants.nav_courseOverGroundMagnetic;
@@ -61,9 +62,11 @@ public void shouldMoveSource() throws Exception {
6162

6263
model.putAll(TestHelper.getSourcesModel().getFullData());
6364
logger.debug("Input:"+model);
65+
logger.debug("Input vessels:"+model.getSubMap("vessels"));
6466
SourceToSourceRefProcessor processor = new SourceToSourceRefProcessor();
6567
Exchange ex = new DefaultExchange(ctx);
6668
ex.getIn().setBody(model);
69+
ex.getIn().setHeader(MSG_TYPE,"unknown");
6770
processor.process(ex);
6871
logger.debug("Processed to:"+ex.getIn().getBody());
6972
String srcRef = "unknown";

src/test/resources/log4j2.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,11 @@
5959
},
6060
{
6161
"name": "nz.co.fortytwo.signalk.handler",
62-
"level": "info"
62+
"level": "debug"
6363
},
6464
{
6565
"name": "nz.co.fortytwo.signalk.processor",
66-
"level": "info"
66+
"level": "debug"
6767
},
6868
{
6969
"name": "nz.co.fortytwo.signalk.processor.InputFilterProcessor",

0 commit comments

Comments
 (0)