Skip to content

Commit 0c97190

Browse files
phiblaaaronzi
andauthored
Add protocol and authentication option (#636)
* Add protocol and authentication option * Reformated & Restructed * Add tests * Remove files from testing * Method name should start with a lowercase and verb * Removed unused imports * Removed unused import * Rename variable from mqttConceptOptions to mqttConnectOptions * Inconsistent use of tab instead of space. Refractored so that only tabs are used --------- Co-authored-by: Aaron Zielstorff <[email protected]>
1 parent 517757e commit 0c97190

File tree

16 files changed

+434
-28
lines changed

16 files changed

+434
-28
lines changed

basyx.aasrepository/basyx.aasrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/aasrepository/feature/mqtt/MqttAasRepositoryConfiguration.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,36 @@ public class MqttAasRepositoryConfiguration {
4444

4545
@ConditionalOnMissingBean
4646
@Bean
47-
public IMqttClient mqttClient(@Value("${mqtt.clientId}") String clientId, @Value("${mqtt.hostname}") String hostname, @Value("${mqtt.port}") int port) throws MqttException {
48-
IMqttClient mqttClient = new MqttClient("tcp://" + hostname + ":" + port, clientId, new MemoryPersistence());
47+
public IMqttClient mqttClient(
48+
@Value("${mqtt.clientId}") String clientId,
49+
@Value("${mqtt.hostname}") String hostname,
50+
@Value("${mqtt.port}") int port,
51+
@Value("${mqtt.protocol:tcp}") String protocol,
52+
MqttConnectOptions mqttConnectOptions)
53+
throws MqttException {
54+
IMqttClient mqttClient = new MqttClient(protocol + "://" + hostname + ":" + port, clientId,
55+
new MemoryPersistence());
4956

50-
mqttClient.connect(mqttConnectOptions());
57+
mqttClient.connect(mqttConnectOptions);
5158

5259
return mqttClient;
5360
}
5461

5562
@ConditionalOnMissingBean
5663
@Bean
5764
@ConfigurationProperties(prefix = "mqtt")
58-
public MqttConnectOptions mqttConnectOptions() {
59-
MqttConnectOptions mqttConceptOptions = new MqttConnectOptions();
60-
mqttConceptOptions.setAutomaticReconnect(true);
61-
return mqttConceptOptions;
65+
public MqttConnectOptions mqttConnectOptions(
66+
@Value("${mqtt.username:}") String username,
67+
@Value("${mqtt.password:}") String password) {
68+
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
69+
mqttConnectOptions.setAutomaticReconnect(true);
70+
71+
if (username.isBlank() || password.isBlank())
72+
return mqttConnectOptions;
73+
74+
mqttConnectOptions.setUserName(username);
75+
mqttConnectOptions.setPassword(password.toCharArray());
76+
77+
return mqttConnectOptions;
6278
}
6379
}

basyx.aasrepository/basyx.aasrepository-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/aasrepository/feature/mqtt/TestMqttV2AASAggregatorObserver.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@
4444
import org.eclipse.digitaltwin.basyx.common.mqttcore.encoding.Base64URLEncoder;
4545
import org.eclipse.digitaltwin.basyx.common.mqttcore.encoding.URLEncoder;
4646
import org.eclipse.digitaltwin.basyx.common.mqttcore.listener.MqttTestListener;
47+
import org.eclipse.paho.client.mqttv3.IMqttClient;
4748
import org.eclipse.paho.client.mqttv3.MqttClient;
49+
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
4850
import org.eclipse.paho.client.mqttv3.MqttException;
4951
import org.eclipse.paho.client.mqttv3.MqttSecurityException;
5052
import org.junit.AfterClass;
@@ -195,4 +197,85 @@ private static Server startBroker() throws IOException {
195197

196198
return broker;
197199
}
200+
201+
@Test
202+
public void checkTCPConnectionWithoutCredentials() throws Exception {
203+
MqttAasRepositoryConfiguration config = new MqttAasRepositoryConfiguration();
204+
MqttConnectOptions options = config.mqttConnectOptions("", "");
205+
IMqttClient client = config.mqttClient(
206+
"test-client",
207+
"localhost",
208+
1884,
209+
"tcp",
210+
options);
211+
assertTrue(client.isConnected());
212+
client.disconnect();
213+
client.close();
214+
}
215+
216+
@Test
217+
public void checkTCPConnectionWitCredentials() throws Exception {
218+
MqttAasRepositoryConfiguration config = new MqttAasRepositoryConfiguration();
219+
MqttConnectOptions options = config.mqttConnectOptions("testuser", "passwd");
220+
IMqttClient client = config.mqttClient(
221+
"test-client",
222+
"localhost",
223+
1884,
224+
"tcp",
225+
options);
226+
assertTrue(client.isConnected());
227+
client.disconnect();
228+
client.close();
229+
}
230+
231+
@Test
232+
public void checkTCPConnectionWitWrongCredentials() throws Exception {
233+
MqttAasRepositoryConfiguration config = new MqttAasRepositoryConfiguration();
234+
MqttConnectOptions options = config.mqttConnectOptions("testuser", "false");
235+
boolean authentication_failed = false;
236+
try {
237+
IMqttClient client = config.mqttClient(
238+
"test-client",
239+
"localhost",
240+
1884,
241+
"tcp",
242+
options);
243+
} catch (MqttException e) {
244+
if (MqttException.REASON_CODE_FAILED_AUTHENTICATION == e.getReasonCode()) {
245+
authentication_failed = true;
246+
}
247+
}
248+
assertTrue(authentication_failed);
249+
}
250+
251+
@Test
252+
public void checkWSConnectionWithoutCredentials() throws Exception {
253+
MqttAasRepositoryConfiguration config = new MqttAasRepositoryConfiguration();
254+
MqttConnectOptions options = config.mqttConnectOptions("", "");
255+
IMqttClient client = config.mqttClient(
256+
"test-client",
257+
"localhost",
258+
8080,
259+
"ws",
260+
options);
261+
assertTrue(client.isConnected());
262+
client.disconnect();
263+
client.close();
264+
}
265+
266+
@Test
267+
public void checkWSConnectionWitCredentials() throws Exception {
268+
MqttAasRepositoryConfiguration config = new MqttAasRepositoryConfiguration();
269+
MqttConnectOptions options = config.mqttConnectOptions("testuser", "passwd");
270+
IMqttClient client = config.mqttClient(
271+
"test-client",
272+
"localhost",
273+
8080,
274+
"ws",
275+
options);
276+
assertTrue(client.isConnected());
277+
client.disconnect();
278+
client.close();
279+
}
280+
198281
}

basyx.aasrepository/basyx.aasrepository-feature-mqtt/src/test/resources/config/moquette.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,7 @@
22

33
# Do not use the default 1883 port
44
port 1884
5+
websocket_port 8080
56
host 0.0.0.0
7+
password_file config/password_file.conf
68
allow_anonymous true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
testuser:0d6be69b264717f2dd33652e212b173104b4a647b7c11ae72e9885f11cd312fb

basyx.aasservice/basyx.aasservice-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/aasservice/feature/mqtt/MqttConfiguration.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.eclipse.paho.client.mqttv3.MqttClient;
2929
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
3030
import org.eclipse.paho.client.mqttv3.MqttException;
31+
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
3132
import org.springframework.beans.factory.annotation.Value;
3233
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
3334
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -41,20 +42,35 @@ public class MqttConfiguration {
4142

4243
@ConditionalOnMissingBean
4344
@Bean
44-
public IMqttClient mqttClient(@Value("${mqtt.clientId}") String clientId, @Value("${mqtt.hostname}") String hostname, @Value("${mqtt.port}") int port) throws MqttException {
45-
IMqttClient mqttClient = new MqttClient("tcp://" + hostname + ":" + port, clientId);
45+
public IMqttClient mqttClient(
46+
@Value("${mqtt.clientId}") String clientId,
47+
@Value("${mqtt.hostname}") String hostname,
48+
@Value("${mqtt.port}") int port,
49+
@Value("${mqtt.protocol:tcp}") String protocol,
50+
MqttConnectOptions mqttConnectOptions) throws MqttException {
51+
IMqttClient mqttClient = new MqttClient(protocol + "://" + hostname + ":" + port, clientId,
52+
new MemoryPersistence());
4653

47-
mqttClient.connect(mqttConnectOptions());
54+
mqttClient.connect(mqttConnectOptions);
4855

4956
return mqttClient;
5057
}
5158

5259
@ConditionalOnMissingBean
5360
@Bean
5461
@ConfigurationProperties(prefix = "mqtt")
55-
public MqttConnectOptions mqttConnectOptions() {
56-
MqttConnectOptions mqttConceptOptions = new MqttConnectOptions();
57-
mqttConceptOptions.setAutomaticReconnect(true);
58-
return mqttConceptOptions;
62+
public MqttConnectOptions mqttConnectOptions(
63+
@Value("${mqtt.username:}") String username,
64+
@Value("${mqtt.password:}") String password) {
65+
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
66+
mqttConnectOptions.setAutomaticReconnect(true);
67+
68+
if (username.isBlank() || password.isBlank())
69+
return mqttConnectOptions;
70+
71+
mqttConnectOptions.setUserName(username);
72+
mqttConnectOptions.setPassword(password.toCharArray());
73+
74+
return mqttConnectOptions;
5975
}
6076
}

basyx.aasservice/basyx.aasservice-feature-mqtt/src/test/java/org/eclipse/digitaltwin/basyx/aasservice/feature/mqtt/TestMqttAasService.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@
5757
import org.eclipse.digitaltwin.basyx.http.Aas4JHTTPSerializationExtension;
5858
import org.eclipse.digitaltwin.basyx.http.BaSyxHTTPConfiguration;
5959
import org.eclipse.digitaltwin.basyx.http.SerializationExtension;
60+
import org.eclipse.paho.client.mqttv3.IMqttClient;
6061
import org.eclipse.paho.client.mqttv3.MqttClient;
62+
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
6163
import org.eclipse.paho.client.mqttv3.MqttException;
6264
import org.eclipse.paho.client.mqttv3.MqttSecurityException;
6365
import org.junit.AfterClass;
@@ -225,4 +227,84 @@ private static Server startBroker() throws IOException {
225227

226228
return broker;
227229
}
230+
231+
@Test
232+
public void checkTCPConnectionWithoutCredentials() throws Exception {
233+
MqttConfiguration config = new MqttConfiguration();
234+
MqttConnectOptions options = config.mqttConnectOptions("", "");
235+
IMqttClient client = config.mqttClient(
236+
"test-client",
237+
"localhost",
238+
1884,
239+
"tcp",
240+
options);
241+
assertTrue(client.isConnected());
242+
client.disconnect();
243+
client.close();
244+
}
245+
246+
@Test
247+
public void checkTCPConnectionWitCredentials() throws Exception {
248+
MqttConfiguration config = new MqttConfiguration();
249+
MqttConnectOptions options = config.mqttConnectOptions("testuser", "passwd");
250+
IMqttClient client = config.mqttClient(
251+
"test-client",
252+
"localhost",
253+
1884,
254+
"tcp",
255+
options);
256+
assertTrue(client.isConnected());
257+
client.disconnect();
258+
client.close();
259+
}
260+
261+
@Test
262+
public void checkTCPConnectionWitWrongCredentials() throws Exception {
263+
MqttConfiguration config = new MqttConfiguration();
264+
MqttConnectOptions options = config.mqttConnectOptions("testuser", "false");
265+
boolean authentication_failed = false;
266+
try {
267+
IMqttClient client = config.mqttClient(
268+
"test-client",
269+
"localhost",
270+
1884,
271+
"tcp",
272+
options);
273+
} catch (MqttException e) {
274+
if (MqttException.REASON_CODE_FAILED_AUTHENTICATION == e.getReasonCode()) {
275+
authentication_failed = true;
276+
}
277+
}
278+
assertTrue(authentication_failed);
279+
}
280+
281+
@Test
282+
public void checkWSConnectionWithoutCredentials() throws Exception {
283+
MqttConfiguration config = new MqttConfiguration();
284+
MqttConnectOptions options = config.mqttConnectOptions("", "");
285+
IMqttClient client = config.mqttClient(
286+
"test-client",
287+
"localhost",
288+
8080,
289+
"ws",
290+
options);
291+
assertTrue(client.isConnected());
292+
client.disconnect();
293+
client.close();
294+
}
295+
296+
@Test
297+
public void checkWSConnectionWitCredentials() throws Exception {
298+
MqttConfiguration config = new MqttConfiguration();
299+
MqttConnectOptions options = config.mqttConnectOptions("testuser", "passwd");
300+
IMqttClient client = config.mqttClient(
301+
"test-client",
302+
"localhost",
303+
8080,
304+
"ws",
305+
options);
306+
assertTrue(client.isConnected());
307+
client.disconnect();
308+
client.close();
309+
}
228310
}

basyx.aasservice/basyx.aasservice-feature-mqtt/src/test/resources/config/moquette.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,7 @@
22

33
# Do not use the default 1883 port
44
port 1884
5+
websocket_port 8080
56
host 0.0.0.0
7+
password_file config/password_file.conf
68
allow_anonymous true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
testuser:0d6be69b264717f2dd33652e212b173104b4a647b7c11ae72e9885f11cd312fb

basyx.submodelrepository/basyx.submodelrepository-feature-mqtt/src/main/java/org/eclipse/digitaltwin/basyx/submodelrepository/feature/mqtt/MqttSubmodelRepositoryConfiguration.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,35 @@ public class MqttSubmodelRepositoryConfiguration {
4747

4848
@ConditionalOnMissingBean
4949
@Bean
50-
public IMqttClient mqttClient(@Value("${mqtt.clientId}") String clientId, @Value("${mqtt.hostname}") String hostname, @Value("${mqtt.port}") int port) throws MqttException {
51-
IMqttClient mqttClient = new MqttClient("tcp://" + hostname + ":" + port, clientId, new MemoryPersistence());
50+
public IMqttClient mqttClient(
51+
@Value("${mqtt.clientId}") String clientId,
52+
@Value("${mqtt.hostname}") String hostname,
53+
@Value("${mqtt.port}") int port,
54+
@Value("${mqtt.protocol:tcp}") String protocol,
55+
MqttConnectOptions mqttConnectOptions) throws MqttException {
56+
IMqttClient mqttClient = new MqttClient(protocol + "://" + hostname + ":" + port, clientId,
57+
new MemoryPersistence());
5258

53-
mqttClient.connect(mqttConnectOptions());
59+
mqttClient.connect(mqttConnectOptions);
5460

5561
return mqttClient;
5662
}
5763

5864
@ConditionalOnMissingBean
5965
@Bean
6066
@ConfigurationProperties(prefix = "mqtt")
61-
public MqttConnectOptions mqttConnectOptions() {
62-
MqttConnectOptions mqttConceptOptions = new MqttConnectOptions();
63-
mqttConceptOptions.setAutomaticReconnect(true);
64-
return mqttConceptOptions;
67+
public MqttConnectOptions mqttConnectOptions(
68+
@Value("${mqtt.username:}") String username,
69+
@Value("${mqtt.password:}") String password) {
70+
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
71+
mqttConnectOptions.setAutomaticReconnect(true);
72+
73+
if (username.isBlank() || password.isBlank())
74+
return mqttConnectOptions;
75+
76+
mqttConnectOptions.setUserName(username);
77+
mqttConnectOptions.setPassword(password.toCharArray());
78+
79+
return mqttConnectOptions;
6580
}
6681
}

0 commit comments

Comments
 (0)