BGPCEP MD5 Password Fix 23/29023/4
authorClaudio D. Gasparini <cgaspari@cisco.com>
Fri, 30 Oct 2015 14:01:01 +0000 (15:01 +0100)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 30 Oct 2015 23:04:23 +0000 (23:04 +0000)
Password were checked in case if null
but not in case of empty.
Fix by creating an Optional from password where in
case of null or empty will be absent.

Change-Id: I67033deeccd5f634a73d941d0c3da23e8dfb644d
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
bgp/bmp-impl/src/main/java/org/opendaylight/controller/config/yang/bmp/impl/BmpMonitorImplModule.java
bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java
bgp/openconfig-spi/src/main/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfiguration.java
bgp/openconfig-spi/src/test/java/org/opendaylight/protocol/bgp/openconfig/spi/pojo/BGPPeerInstanceConfigurationTest.java
bgp/rib-impl/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java
pcep/pcc-mock/src/main/java/org/opendaylight/protocol/pcep/pcc/mock/Main.java
pcep/topology-provider/src/main/java/org/opendaylight/controller/config/yang/pcep/topology/provider/PCEPTopologyProviderModule.java

index 19bac206a4c57a31ee3ed4d84f893a2f158f4f0c..5f6b5175bf1cc0235218c40fd18c4b5156e6b5bf 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.protocol.util.Ipv4Util;
 import org.opendaylight.tcpmd5.api.KeyMapping;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.MonitorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
 import org.osgi.framework.BundleContext;
@@ -60,9 +61,11 @@ public class BmpMonitorImplModule extends org.opendaylight.controller.config.yan
                     LOG.warn("Monitored router {} does not have an address skipping it", mr);
                     continue;
                 }
-                if (mr.getPassword() != null) {
+                final Rfc2385Key rfc2385KeyPassword = mr.getPassword();
+                String password;
+                if (rfc2385KeyPassword != null && !(password = rfc2385KeyPassword.getValue()).isEmpty()) {
                     final String s = getAddressString(mr.getAddress());
-                    ret.put(InetAddresses.forString(s), mr.getPassword().getValue().getBytes(Charsets.US_ASCII));
+                    ret.put(InetAddresses.forString(s), password.getBytes(Charsets.US_ASCII));
                 }
             }
         }
index b9ad367e5cb9d186b9efb67deb4c5322a3d7baaf..09043d7595dca46cb82d9f08868ae463ccaf3b8a 100644 (file)
@@ -87,10 +87,11 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation {
                     final String s = mr.getAddress().getIpv4Address().getValue();
                     final InetAddress addr = InetAddresses.forString(s);
                     KeyMapping ret = null;
-                    final Rfc2385Key passwords = mr.getPassword();
-                    if (passwords != null) {
+                    final Rfc2385Key rfc2385KeyPassword = mr.getPassword();
+                    String password;
+                    if (rfc2385KeyPassword != null && !(password = rfc2385KeyPassword.getValue()).isEmpty()) {
                         ret = new KeyMapping();
-                        ret.put(addr, passwords.getValue().getBytes(Charsets.US_ASCII));
+                        ret.put(addr, password.getBytes(Charsets.US_ASCII));
                     }
                     try {
                         clientChannels.add(dispatcher.createClient(
index 8d998e711d6d68eb16c40384f11842499ef51798..d0abf0b7d67457c830c67ad00b1af3084e512c3d 100644 (file)
@@ -32,10 +32,10 @@ public final class BGPPeerInstanceConfiguration extends AbstractInstanceConfigur
     private final boolean active;
     private final List<BgpTableType> advertizedTables;
     private final AsNumber asNumber;
-    private final Rfc2385Key password;
+    private final Optional<Rfc2385Key> password;
 
     public BGPPeerInstanceConfiguration(final InstanceConfigurationIdentifier identifier, final IpAddress host, final PortNumber port, final short holdTimer, final PeerRole peerRole,
-            final boolean active, final List<BgpTableType> advertizedTables, final AsNumber asNumber, final Rfc2385Key password) {
+            final boolean active, final List<BgpTableType> advertizedTables, final AsNumber asNumber, final Optional<Rfc2385Key> password) {
         super(identifier);
         this.host = Preconditions.checkNotNull(host);
         this.port = Preconditions.checkNotNull(port);
@@ -44,7 +44,7 @@ public final class BGPPeerInstanceConfiguration extends AbstractInstanceConfigur
         this.active = Preconditions.checkNotNull(active);
         this.advertizedTables = Preconditions.checkNotNull(advertizedTables);
         this.asNumber = Preconditions.checkNotNull(asNumber);
-        this.password = password;
+        this.password = Preconditions.checkNotNull(password);
     }
 
     public IpAddress getHost() {
@@ -76,7 +76,7 @@ public final class BGPPeerInstanceConfiguration extends AbstractInstanceConfigur
     }
 
     public Optional<Rfc2385Key> getPassword() {
-        return Optional.fromNullable(password);
+        return password;
     }
 
 }
index a17a1328e6deb631d9de6a413ffa18714566b3b5..dd94e2c9314158b144db68e0263f4c2dd229180c 100644 (file)
@@ -20,6 +20,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key;
 
 public class BGPPeerInstanceConfigurationTest {
 
@@ -30,7 +31,7 @@ public class BGPPeerInstanceConfigurationTest {
     private static final AsNumber AS_NUMBER = new AsNumber(72L);
 
     private final BGPPeerInstanceConfiguration config = new BGPPeerInstanceConfiguration(INSTANCE_NAME, HOST, PORT, HOLD_TIMER, PeerRole.Ibgp,
-            Boolean.FALSE, Collections.<BgpTableType>emptyList(), AS_NUMBER, null);
+            Boolean.FALSE, Collections.<BgpTableType>emptyList(), AS_NUMBER, Optional.<Rfc2385Key>absent());
 
     @Test
     public final void testGetHost() {
index b36bae53f1cb171466f539d362a3763277ace0b9..ef91a5a5e69008f0ea9c913c25f48b9277e9657d 100644 (file)
@@ -50,6 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.MultiprotocolCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -76,7 +77,7 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
         JmxAttributeValidationException.checkNotNull(getHost(), "value is not set.", hostJmxAttribute);
         JmxAttributeValidationException.checkNotNull(getPort(), "value is not set.", portJmxAttribute);
 
-        if (getPassword() != null) {
+        if (getOptionaPassword(getPassword()).isPresent()) {
             /*
              *  This is a nasty hack, but we don't have another clean solution. We cannot allow
              *  password being set if the injected dispatcher does not have the optional
@@ -118,7 +119,6 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
 
         final List<BgpParameters> tlvs = getTlvs(r);
         final AsNumber remoteAs = getAsOrDefault(r);
-        final String password = getPasswordOrNull();
         final BGPSessionPreferences prefs = new BGPSessionPreferences(r.getLocalAs(), getHoldtimer(), r.getBgpIdentifier(), remoteAs, tlvs);
         final BGPPeer bgpClientPeer;
 
@@ -146,7 +146,7 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
 
         // Initiate connection
         if(getInitiateConnection()) {
-            final Future<Void> cf = initiateConnection(createAddress(), password, getPeerRegistryBackwards());
+            final Future<Void> cf = initiateConnection(createAddress(), getOptionaPassword(getPassword()), getPeerRegistryBackwards());
             return new CloseableNoEx() {
                 @Override
                 public void close() {
@@ -164,16 +164,6 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
         void close();
     }
 
-    private String getPasswordOrNull() {
-        final String password;
-        if (getPassword() != null) {
-            password = getPassword().getValue();
-        } else {
-            password = null;
-        }
-        return password;
-    }
-
     private AsNumber getAsOrDefault(final RIB r) {
         // Remote AS number defaults to our local AS
         final AsNumber remoteAs;
@@ -216,11 +206,11 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
         return new IpAddress(host.getIpv6Address());
     }
 
-    private io.netty.util.concurrent.Future<Void> initiateConnection(final InetSocketAddress address, final String password, final BGPPeerRegistry registry) {
+    private io.netty.util.concurrent.Future<Void> initiateConnection(final InetSocketAddress address, final Optional<Rfc2385Key> password, final BGPPeerRegistry registry) {
         KeyMapping keys = null;
-        if (password != null) {
+        if (password.isPresent()) {
             keys = new KeyMapping();
-            keys.put(address.getAddress(), password.getBytes(Charsets.US_ASCII));
+            keys.put(address.getAddress(), password.get().getValue().getBytes(Charsets.US_ASCII));
         }
 
         final RIB rib = getRibDependency();
@@ -262,7 +252,7 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
             if (neighborProvider != null) {
                 neighborProvider.writeConfiguration(new BGPPeerInstanceConfiguration(identifier,
                         getHostWithoutValue(), getPort(), getHoldtimer(), getPeerRole(), getInitiateConnection(),
-                        getAdvertizedTableDependency(), getAsOrDefault(getRibDependency()), getPassword()));
+                        getAdvertizedTableDependency(), getAsOrDefault(getRibDependency()), getOptionaPassword(getPassword())));
             }
         }
 
@@ -275,4 +265,8 @@ public final class BGPPeerModule extends org.opendaylight.controller.config.yang
 
     }
 
+    private Optional<Rfc2385Key> getOptionaPassword(Rfc2385Key password) {
+        return password != null && ! password.getValue().isEmpty() ? Optional.of(password) : Optional.<Rfc2385Key>absent();
+    }
+
 }
index 7cff740196f40ed04d664411402a4d499840a16e..b03185ccf626760e6deeb261b28638d7caac9ab1 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.protocol.pcep.pcc.mock;
 
+import static com.google.common.base.Strings.isNullOrEmpty;
+
 import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.LoggerContext;
 import com.google.common.base.Charsets;
@@ -166,7 +168,7 @@ public final class Main {
     }
 
     private static KeyMapping getKeyMapping(final InetAddress inetAddress, final String password) {
-        if (password != null) {
+        if (!isNullOrEmpty(password)) {
             final KeyMapping keyMapping = new KeyMapping();
             keyMapping.put(inetAddress, password.getBytes(Charsets.US_ASCII));
             return keyMapping;
index 731c4f7000e8b397f207c7d842a9524bd3b5cada..9a0ca1255f5afaef75a999eae6106357320e7d8e 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.tcpmd5.api.KeyMapping;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
@@ -69,9 +70,11 @@ public final class PCEPTopologyProviderModule extends
                     LOG.warn("Client {} does not have an address skipping it", c);
                     continue;
                 }
-                if (c.getPassword() != null) {
+                final Rfc2385Key rfc2385KeyPassword = c.getPassword();
+                String password;
+                if (rfc2385KeyPassword != null && !(password = rfc2385KeyPassword.getValue()).isEmpty()) {
                     final String s = getAddressString(c.getAddress());
-                    ret.put(InetAddresses.forString(s), c.getPassword().getValue().getBytes(Charsets.US_ASCII));
+                    ret.put(InetAddresses.forString(s), password.getBytes(Charsets.US_ASCII));
                 }
             }
         }