Skip to content

Commit

Permalink
WIP transport refactor server
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinherron committed Sep 29, 2022
1 parent 534f9b6 commit b9b7968
Show file tree
Hide file tree
Showing 24 changed files with 566 additions and 486 deletions.
Expand Up @@ -26,6 +26,7 @@

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.eclipse.milo.opcua.sdk.server.OpcUaServer;
import org.eclipse.milo.opcua.sdk.server.api.config.EndpointConfig;
import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig;
import org.eclipse.milo.opcua.sdk.server.identity.CompositeValidator;
import org.eclipse.milo.opcua.sdk.server.identity.UsernameIdentityValidator;
Expand All @@ -34,6 +35,7 @@
import org.eclipse.milo.opcua.stack.core.StatusCodes;
import org.eclipse.milo.opcua.stack.core.UaRuntimeException;
import org.eclipse.milo.opcua.stack.core.security.DefaultCertificateManager;
import org.eclipse.milo.opcua.stack.core.security.DefaultServerCertificateValidator;
import org.eclipse.milo.opcua.stack.core.security.DefaultTrustListManager;
import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
import org.eclipse.milo.opcua.stack.core.transport.TransportProfile;
Expand All @@ -43,8 +45,6 @@
import org.eclipse.milo.opcua.stack.core.types.structured.BuildInfo;
import org.eclipse.milo.opcua.stack.core.util.CertificateUtil;
import org.eclipse.milo.opcua.stack.core.util.NonceUtil;
import org.eclipse.milo.opcua.stack.server.EndpointConfiguration;
import org.eclipse.milo.opcua.stack.server.security.DefaultServerCertificateValidator;
import org.eclipse.milo.opcua.stack.transport.server.tcp.OpcTcpServerTransport;
import org.eclipse.milo.opcua.stack.transport.server.tcp.OpcTcpServerTransportConfig;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -144,7 +144,7 @@ public ExampleServer() throws Exception {
)
);

Set<EndpointConfiguration> endpointConfigurations = createEndpointConfigurations(certificate);
Set<EndpointConfig> endpointConfigurations = createEndpointConfigs(certificate);

OpcUaServerConfig serverConfig = OpcUaServerConfig.builder()
.setApplicationUri(applicationUri)
Expand Down Expand Up @@ -177,8 +177,8 @@ public ExampleServer() throws Exception {
exampleNamespace.startup();
}

private Set<EndpointConfiguration> createEndpointConfigurations(X509Certificate certificate) {
var endpointConfigurations = new LinkedHashSet<EndpointConfiguration>();
private Set<EndpointConfig> createEndpointConfigs(X509Certificate certificate) {
var endpointConfigs = new LinkedHashSet<EndpointConfig>();

List<String> bindAddresses = List.of("0.0.0.0");

Expand All @@ -188,7 +188,7 @@ private Set<EndpointConfiguration> createEndpointConfigurations(X509Certificate

for (String bindAddress : bindAddresses) {
for (String hostname : hostnames) {
EndpointConfiguration.Builder builder = EndpointConfiguration.newBuilder()
EndpointConfig.Builder builder = EndpointConfig.newBuilder()
.setBindAddress(bindAddress)
.setHostname(hostname)
.setPath("/milo")
Expand All @@ -200,14 +200,14 @@ private Set<EndpointConfiguration> createEndpointConfigurations(X509Certificate
);


EndpointConfiguration.Builder noSecurityBuilder = builder.copy()
EndpointConfig.Builder noSecurityBuilder = builder.copy()
.setSecurityPolicy(SecurityPolicy.None)
.setSecurityMode(MessageSecurityMode.None);

endpointConfigurations.add(buildTcpEndpoint(noSecurityBuilder));
endpointConfigs.add(buildTcpEndpoint(noSecurityBuilder));

// TCP Basic256Sha256 / SignAndEncrypt
endpointConfigurations.add(buildTcpEndpoint(
endpointConfigs.add(buildTcpEndpoint(
builder.copy()
.setSecurityPolicy(SecurityPolicy.Basic256Sha256)
.setSecurityMode(MessageSecurityMode.SignAndEncrypt))
Expand All @@ -224,19 +224,19 @@ private Set<EndpointConfiguration> createEndpointConfigurations(X509Certificate
* its base address.
*/

EndpointConfiguration.Builder discoveryBuilder = builder.copy()
EndpointConfig.Builder discoveryBuilder = builder.copy()
.setPath("/milo/discovery")
.setSecurityPolicy(SecurityPolicy.None)
.setSecurityMode(MessageSecurityMode.None);

endpointConfigurations.add(buildTcpEndpoint(discoveryBuilder));
endpointConfigs.add(buildTcpEndpoint(discoveryBuilder));
}
}

return endpointConfigurations;
return endpointConfigs;
}

private static EndpointConfiguration buildTcpEndpoint(EndpointConfiguration.Builder base) {
private static EndpointConfig buildTcpEndpoint(EndpointConfig.Builder base) {
return base.copy()
.setTransportProfile(TransportProfile.TCP_UASC_UABINARY)
.setBindPort(TCP_BIND_PORT)
Expand Down
Expand Up @@ -12,9 +12,9 @@

import org.eclipse.milo.opcua.sdk.client.OpcUaClient;
import org.eclipse.milo.opcua.sdk.server.OpcUaServer;
import org.eclipse.milo.opcua.sdk.server.api.config.EndpointConfig;
import org.eclipse.milo.opcua.stack.core.UaException;
import org.eclipse.milo.opcua.stack.core.types.builtin.LocalizedText;
import org.eclipse.milo.opcua.stack.server.EndpointConfiguration;

import static org.eclipse.milo.opcua.stack.core.types.builtin.unsigned.Unsigned.uint;

Expand All @@ -23,7 +23,7 @@ public final class TestClient {
private TestClient() {}

public static OpcUaClient create(OpcUaServer server) throws UaException {
EndpointConfiguration endpoint = server.getConfig().getEndpoints().iterator().next();
EndpointConfig endpoint = server.getConfig().getEndpoints().iterator().next();

return OpcUaClient.create(
endpoint.getEndpointUrl(),
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2019 the Eclipse Milo Authors
* Copyright (c) 2022 the Eclipse Milo Authors
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
Expand All @@ -24,12 +24,14 @@

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.eclipse.milo.opcua.sdk.server.OpcUaServer;
import org.eclipse.milo.opcua.sdk.server.api.config.EndpointConfig;
import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig;
import org.eclipse.milo.opcua.sdk.server.identity.UsernameIdentityValidator;
import org.eclipse.milo.opcua.sdk.server.util.HostnameUtil;
import org.eclipse.milo.opcua.stack.core.StatusCodes;
import org.eclipse.milo.opcua.stack.core.UaRuntimeException;
import org.eclipse.milo.opcua.stack.core.security.DefaultCertificateManager;
import org.eclipse.milo.opcua.stack.core.security.DefaultServerCertificateValidator;
import org.eclipse.milo.opcua.stack.core.security.DefaultTrustListManager;
import org.eclipse.milo.opcua.stack.core.security.SecurityPolicy;
import org.eclipse.milo.opcua.stack.core.transport.TransportProfile;
Expand All @@ -40,8 +42,6 @@
import org.eclipse.milo.opcua.stack.core.util.CertificateUtil;
import org.eclipse.milo.opcua.stack.core.util.SelfSignedCertificateGenerator;
import org.eclipse.milo.opcua.stack.core.util.SelfSignedHttpsCertificateBuilder;
import org.eclipse.milo.opcua.stack.server.EndpointConfiguration;
import org.eclipse.milo.opcua.stack.server.security.DefaultServerCertificateValidator;
import org.eclipse.milo.opcua.stack.transport.server.tcp.OpcTcpServerTransport;
import org.eclipse.milo.opcua.stack.transport.server.tcp.OpcTcpServerTransportConfig;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -136,7 +136,7 @@ public static OpcUaServer create(int port) throws Exception {
StatusCodes.Bad_ConfigurationError,
"certificate is missing the application URI"));

Set<EndpointConfiguration> endpointConfigurations = createEndpointConfigurations(certificate, port);
Set<EndpointConfig> endpointConfigurations = createEndpointConfigs(certificate, port);

OpcUaServerConfig serverConfig = OpcUaServerConfig.builder()
.setApplicationUri(applicationUri)
Expand Down Expand Up @@ -169,8 +169,8 @@ public static OpcUaServer create(int port) throws Exception {
});
}

private static Set<EndpointConfiguration> createEndpointConfigurations(X509Certificate certificate, int port) {
Set<EndpointConfiguration> endpointConfigurations = new LinkedHashSet<>();
private static Set<EndpointConfig> createEndpointConfigs(X509Certificate certificate, int port) {
Set<EndpointConfig> endpointConfigurations = new LinkedHashSet<>();

var bindAddresses = new ArrayList<String>();
bindAddresses.add("localhost");
Expand All @@ -179,7 +179,7 @@ private static Set<EndpointConfiguration> createEndpointConfigurations(X509Certi

for (String bindAddress : bindAddresses) {
for (String hostname : hostnames) {
EndpointConfiguration.Builder builder = EndpointConfiguration.newBuilder()
EndpointConfig.Builder builder = EndpointConfig.newBuilder()
.setBindAddress(bindAddress)
.setHostname(hostname)
.setPath("/test")
Expand All @@ -190,7 +190,7 @@ private static Set<EndpointConfiguration> createEndpointConfigurations(X509Certi
USER_TOKEN_POLICY_X509);


EndpointConfiguration.Builder noSecurityBuilder = builder.copy()
EndpointConfig.Builder noSecurityBuilder = builder.copy()
.setSecurityPolicy(SecurityPolicy.None)
.setSecurityMode(MessageSecurityMode.None);

Expand All @@ -217,7 +217,7 @@ private static Set<EndpointConfiguration> createEndpointConfigurations(X509Certi
* its base address.
*/

EndpointConfiguration.Builder discoveryBuilder = builder.copy()
EndpointConfig.Builder discoveryBuilder = builder.copy()
.setPath("/test/discovery")
.setSecurityPolicy(SecurityPolicy.None)
.setSecurityMode(MessageSecurityMode.None);
Expand All @@ -229,7 +229,7 @@ private static Set<EndpointConfiguration> createEndpointConfigurations(X509Certi
return endpointConfigurations;
}

private static EndpointConfiguration buildTcpEndpoint(int port, EndpointConfiguration.Builder base) {
private static EndpointConfig buildTcpEndpoint(int port, EndpointConfig.Builder base) {
return base.copy()
.setTransportProfile(TransportProfile.TCP_UASC_UABINARY)
.setBindPort(port)
Expand Down
14 changes: 3 additions & 11 deletions opc-ua-sdk/sdk-server/pom.xml
Expand Up @@ -9,7 +9,8 @@
~ SPDX-License-Identifier: EPL-2.0
-->

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
Expand All @@ -30,25 +31,16 @@
<artifactId>stack-core</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>stack-server</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>transport</artifactId>
<version>2.0.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.eclipse.milo</groupId>
<artifactId>sdk-core</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
Expand Down
Expand Up @@ -34,6 +34,7 @@
import org.eclipse.milo.opcua.sdk.server.api.AddressSpaceManager;
import org.eclipse.milo.opcua.sdk.server.api.EventListener;
import org.eclipse.milo.opcua.sdk.server.api.EventNotifier;
import org.eclipse.milo.opcua.sdk.server.api.config.EndpointConfig;
import org.eclipse.milo.opcua.sdk.server.api.config.OpcUaServerConfig;
import org.eclipse.milo.opcua.sdk.server.diagnostics.ServerDiagnosticsSummary;
import org.eclipse.milo.opcua.sdk.server.model.ObjectTypeInitializer;
Expand Down Expand Up @@ -82,7 +83,6 @@
import org.eclipse.milo.opcua.stack.core.util.EndpointUtil;
import org.eclipse.milo.opcua.stack.core.util.Lazy;
import org.eclipse.milo.opcua.stack.core.util.ManifestUtil;
import org.eclipse.milo.opcua.stack.server.EndpointConfiguration;
import org.eclipse.milo.opcua.stack.transport.server.OpcServerTransport;
import org.eclipse.milo.opcua.stack.transport.server.ServerApplication;
import org.eclipse.milo.opcua.stack.transport.server.ServiceRequestContext;
Expand Down Expand Up @@ -219,7 +219,7 @@ public CompletableFuture<OpcUaServer> startup() {

config.getEndpoints()
.stream()
.sorted(Comparator.comparing(EndpointConfiguration::getTransportProfile))
.sorted(Comparator.comparing(EndpointConfig::getTransportProfile))
.forEach(endpoint -> {
logger.info(
"Binding endpoint {} to {}:{} [{}/{}]",
Expand Down Expand Up @@ -476,7 +476,7 @@ public CompletableFuture<UaResponseMessageType> handleServiceRequest(
}


private EndpointDescription transformEndpoint(EndpointConfiguration endpoint) {
private EndpointDescription transformEndpoint(EndpointConfig endpoint) {
return new EndpointDescription(
endpoint.getEndpointUrl(),
getApplicationDescription(),
Expand Down Expand Up @@ -541,15 +541,15 @@ private ApplicationDescription getApplicationDescription() {
return applicationDescription.getOrCompute(() -> {
List<String> discoveryUrls = config.getEndpoints()
.stream()
.map(EndpointConfiguration::getEndpointUrl)
.map(EndpointConfig::getEndpointUrl)
.filter(url -> url.endsWith("/discovery"))
.distinct()
.collect(toList());

if (discoveryUrls.isEmpty()) {
discoveryUrls = config.getEndpoints()
.stream()
.map(EndpointConfiguration::getEndpointUrl)
.map(EndpointConfig::getEndpointUrl)
.distinct()
.collect(toList());
}
Expand Down
Expand Up @@ -13,7 +13,6 @@
import java.math.RoundingMode;
import java.nio.ByteBuffer;
import java.security.KeyPair;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.time.Duration;
import java.util.ArrayList;
Expand Down Expand Up @@ -241,15 +240,11 @@ public CreateSessionResponse createSession(
}
}

ByteString clientCertificateBytesFromRequest = request.getClientCertificate();
ByteString clientCertificateBytesFromRequest =
request.getClientCertificate();

ByteString clientCertificateBytesFromSecureChannel;
try {
clientCertificateBytesFromSecureChannel =
ByteString.of(context.getSecureChannel().getRemoteCertificate().getEncoded());
} catch (CertificateEncodingException e) {
throw new UaException(StatusCodes.Bad_SecurityChecksFailed, e);
}
ByteString clientCertificateBytesFromSecureChannel =
context.getSecureChannel().getRemoteCertificateBytes();

if (securityPolicy != SecurityPolicy.None) {
if (!Objects.equal(clientCertificateBytesFromRequest, clientCertificateBytesFromSecureChannel)) {
Expand Down

0 comments on commit b9b7968

Please sign in to comment.