From 2f7038b917d82421a28b6da4d685853a11006299 Mon Sep 17 00:00:00 2001 From: Joe Chacko Date: Mon, 6 Jun 2016 16:56:42 +0100 Subject: [PATCH] Removed incorrect loop counter in Util. --- .../org/apache/yoko/orb/OCI/IIOP/Util.java | 340 ++++++++---------- 1 file changed, 157 insertions(+), 183 deletions(-) diff --git a/yoko-core/src/main/java/org/apache/yoko/orb/OCI/IIOP/Util.java b/yoko-core/src/main/java/org/apache/yoko/orb/OCI/IIOP/Util.java index 40571487..3eb6804a 100644 --- a/yoko-core/src/main/java/org/apache/yoko/orb/OCI/IIOP/Util.java +++ b/yoko-core/src/main/java/org/apache/yoko/orb/OCI/IIOP/Util.java @@ -19,28 +19,40 @@ import org.apache.yoko.orb.CORBA.InputStream; import org.apache.yoko.orb.CORBA.OutputStream; +import org.apache.yoko.orb.OCI.Buffer; +import org.apache.yoko.orb.OCI.ProfileInfo; +import org.apache.yoko.orb.OCI.ProfileInfoHolder; +import org.apache.yoko.orb.OCI.ProfileInfoSeqHolder; import org.omg.CORBA.Any; +import org.omg.CSIIOP.CompoundSecMech; import org.omg.CSIIOP.CompoundSecMechList; import org.omg.CSIIOP.CompoundSecMechListHelper; +import org.omg.CSIIOP.TAG_CSI_SEC_MECH_LIST; import org.omg.CSIIOP.TAG_TLS_SEC_TRANS; import org.omg.CSIIOP.TLS_SEC_TRANS; import org.omg.CSIIOP.TLS_SEC_TRANSHelper; import org.omg.CSIIOP.TransportAddress; -import org.omg.IOP.Codec; +import org.omg.IIOP.ProfileBody_1_0; +import org.omg.IIOP.ProfileBody_1_0Helper; +import org.omg.IOP.*; import org.omg.IOP.CodecPackage.FormatMismatch; import org.omg.IOP.CodecPackage.TypeMismatch; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + final public class Util { - static public org.omg.IOP.IOR createIOR(String host, int port, String id, - org.apache.yoko.orb.OCI.ProfileInfo profileInfo) { - org.omg.IOP.IOR ior = new org.omg.IOP.IOR(); + static public IOR createIOR(String host, int port, String id, ProfileInfo profileInfo) { + IOR ior = new IOR(); ior.type_id = id; ior.profiles = new org.omg.IOP.TaggedProfile[1]; ior.profiles[0] = new org.omg.IOP.TaggedProfile(); - ior.profiles[0].tag = org.omg.IOP.TAG_INTERNET_IOP.value; + ior.profiles[0].tag = TAG_INTERNET_IOP.value; if (profileInfo.major == 1 && profileInfo.minor == 0) { - org.omg.IIOP.ProfileBody_1_0 body = new org.omg.IIOP.ProfileBody_1_0(); + ProfileBody_1_0 body = new ProfileBody_1_0(); body.iiop_version = new org.omg.IIOP.Version((byte) 1, (byte) 0); body.host = host; if (port >= 0x8000) @@ -48,10 +60,10 @@ static public org.omg.IOP.IOR createIOR(String host, int port, String id, else body.port = (short) port; body.object_key = profileInfo.key; - org.apache.yoko.orb.OCI.Buffer buf = new org.apache.yoko.orb.OCI.Buffer(); + Buffer buf = new Buffer(); OutputStream out = new OutputStream(buf); out._OB_writeEndian(); - org.omg.IIOP.ProfileBody_1_0Helper.write(out, body); + ProfileBody_1_0Helper.write(out, body); ior.profiles[0].profile_data = new byte[buf.length()]; System.arraycopy(buf.data(), 0, ior.profiles[0].profile_data, 0, buf.length()); @@ -66,7 +78,7 @@ static public org.omg.IOP.IOR createIOR(String host, int port, String id, body.port = (short) port; body.object_key = profileInfo.key; body.components = profileInfo.components; - org.apache.yoko.orb.OCI.Buffer buf = new org.apache.yoko.orb.OCI.Buffer(); + Buffer buf = new Buffer(); OutputStream out = new OutputStream(buf); out._OB_writeEndian(); org.omg.IIOP.ProfileBody_1_1Helper.write(out, body); @@ -78,39 +90,37 @@ static public org.omg.IOP.IOR createIOR(String host, int port, String id, return ior; } - static public org.omg.IOP.IOR createIOR(org.omg.IOP.IOR ior, String id, - byte[] key) { + static public IOR createIOR(IOR ior, String id, byte[] key) { // // Extract the IIOP profile information from the provided IOR // int profile; for (profile = 0; profile < ior.profiles.length; profile++) - if (ior.profiles[profile].tag == org.omg.IOP.TAG_INTERNET_IOP.value) + if (ior.profiles[profile].tag == TAG_INTERNET_IOP.value) break; // TODO: Internal error? org.apache.yoko.orb.OB.Assert._OB_assert(profile < ior.profiles.length); - org.apache.yoko.orb.OCI.Buffer buf = new org.apache.yoko.orb.OCI.Buffer( + Buffer buf = new Buffer( ior.profiles[profile].profile_data, ior.profiles[profile].profile_data.length); InputStream in = new InputStream(buf, 0, false, null, null); in._OB_readEndian(); - org.omg.IIOP.ProfileBody_1_0 body = org.omg.IIOP.ProfileBody_1_0Helper + ProfileBody_1_0 body = ProfileBody_1_0Helper .read(in); - org.apache.yoko.orb.OCI.ProfileInfo profileInfo = new org.apache.yoko.orb.OCI.ProfileInfo(); + ProfileInfo profileInfo = new ProfileInfo(); profileInfo.key = key; profileInfo.major = body.iiop_version.major; profileInfo.minor = body.iiop_version.minor; - profileInfo.components = new org.omg.IOP.TaggedComponent[0]; + profileInfo.components = new TaggedComponent[0]; return createIOR(body.host, body.port, id, profileInfo); } - static public boolean extractProfileInfo(org.omg.IOP.IOR ior, - org.apache.yoko.orb.OCI.ProfileInfoHolder profileInfo) { - org.apache.yoko.orb.OCI.ProfileInfoSeqHolder profileInfoSeq = new org.apache.yoko.orb.OCI.ProfileInfoSeqHolder(); - profileInfoSeq.value = new org.apache.yoko.orb.OCI.ProfileInfo[0]; + static public boolean extractProfileInfo(IOR ior, ProfileInfoHolder profileInfo) { + ProfileInfoSeqHolder profileInfoSeq = new ProfileInfoSeqHolder(); + profileInfoSeq.value = new ProfileInfo[0]; extractAllProfileInfos(ior, profileInfoSeq, false, null, 0, false, null); if (profileInfoSeq.value.length > 0) { profileInfo.value = profileInfoSeq.value[0]; @@ -120,8 +130,7 @@ static public boolean extractProfileInfo(org.omg.IOP.IOR ior, return false; } - static public boolean hostMatch(String host1, String host2, - boolean loopbackMatches) { + static public boolean hostMatch(String host1, String host2, boolean matchLoopback) { // // Direct host name comparison // @@ -132,11 +141,9 @@ static public boolean hostMatch(String host1, String host2, // addresses to be really sure if the hosts differ // try { - java.net.InetAddress addr1 = java.net.InetAddress - .getByName(host1); + InetAddress addr1 = InetAddress.getByName(host1); - java.net.InetAddress addr2 = java.net.InetAddress - .getByName(host2); + InetAddress addr2 = InetAddress.getByName(host2); if (!addr1.equals(addr2)) { // @@ -144,9 +151,8 @@ static public boolean hostMatch(String host1, String host2, // the key if the profile body contains the // loopback address? // - if (loopbackMatches) { - java.net.InetAddress loopback = java.net.InetAddress - .getByName("127.0.0.1"); + if (matchLoopback) { + InetAddress loopback = InetAddress.getByName("127.0.0.1"); if (!addr2.equals(loopback)) return false; @@ -164,111 +170,44 @@ static public boolean hostMatch(String host1, String host2, return true; } - static public void extractAllProfileInfos(org.omg.IOP.IOR ior, - org.apache.yoko.orb.OCI.ProfileInfoSeqHolder profileInfoSeq, - boolean performMatch, String host, int port, boolean loopbackMatches, Codec codec) { - short portNo; - if (port >= 0x8000) { - portNo = (short) (port - 0xffff - 1); - } - else { - portNo = (short) port; - } - - java.util.Vector vec = new java.util.Vector(); - for (int i = 0; i < ior.profiles.length; i++) { - if (ior.profiles[i].tag == org.omg.IOP.TAG_INTERNET_IOP.value) { - // - // Get the IIOP profile body - // - byte[] data = ior.profiles[i].profile_data; - org.apache.yoko.orb.OCI.Buffer buf = new org.apache.yoko.orb.OCI.Buffer( - data, data.length); - InputStream in = new InputStream(buf, 0, false, null, null); - in._OB_readEndian(); - org.omg.IIOP.ProfileBody_1_0 body = org.omg.IIOP.ProfileBody_1_0Helper - .read(in); - - // - // Read components if the IIOP version is > 1.0 - // - org.omg.IOP.TaggedComponent[] components; - if (body.iiop_version.major > 1 || body.iiop_version.minor > 0) { - int len = in.read_ulong(); - components = new org.omg.IOP.TaggedComponent[len]; - for (int j = 0; j < len; j++) { - components[j] = org.omg.IOP.TaggedComponentHelper.read(in); - } - } else { - components = new org.omg.IOP.TaggedComponent[0]; - } + static public void extractAllProfileInfos(IOR ior, ProfileInfoSeqHolder profileInfoSeq, + boolean performMatch, String host, int port, boolean matchLoopback, Codec codec) { + short portNo = (short) port; - if (performMatch) { - // - // Check primary host/port - // - boolean match = false; - if (portNo == body.port - && hostMatch(host, body.host, loopbackMatches)) { - match = true; - } + List list = new ArrayList<>(); - // - // Check alternate host/port - // - if (!match) { - for (int j = 0; j < components.length && !match; j++) { - if (components[j].tag == org.omg.IOP.TAG_ALTERNATE_IIOP_ADDRESS.value) { - byte[] d = components[j].component_data; - org.apache.yoko.orb.OCI.Buffer b = new org.apache.yoko.orb.OCI.Buffer( - d, d.length); - InputStream s = new InputStream(b, 0, false, - null, null); - s._OB_readEndian(); - String altHost = s.read_string(); - short altPort = s.read_ushort(); - if (portNo == altPort - && hostMatch(host, altHost, - loopbackMatches)) { - match = true; - } - } else if (components[j].tag == org.omg.CSIIOP.TAG_CSI_SEC_MECH_LIST.value) { - Any any; - try { - any = codec.decode_value(components[j].component_data, CompoundSecMechListHelper.type()); - CompoundSecMechList csml = CompoundSecMechListHelper.extract(any); - - for (int k = 0; i < csml.mechanism_list.length && !match; i++) { - org.omg.IOP.TaggedComponent tc = csml.mechanism_list[k].transport_mech; - if (tc.tag == TAG_TLS_SEC_TRANS.value) { - Any tstAny = codec.decode_value(tc.component_data, TLS_SEC_TRANSHelper.type()); - TLS_SEC_TRANS tst = TLS_SEC_TRANSHelper.extract(tstAny); - TransportAddress[] transportAddresses = tst.addresses; - for (TransportAddress addr: transportAddresses) { - if (portNo == addr.port && hostMatch(host, addr.host_name, loopbackMatches)) { - match = true; - break; - } - } - - } - } - - } catch (FormatMismatch e) { - } catch (TypeMismatch e) { - } - } - } - } + for (int i = 0; i < ior.profiles.length; i++) { + if (ior.profiles[i].tag != TAG_INTERNET_IOP.value) continue; + // + // Get the IIOP profile body + // + byte[] data = ior.profiles[i].profile_data; + Buffer buf = new Buffer(data, data.length); + InputStream in = new InputStream(buf, 0, false, null, null); + in._OB_readEndian(); + ProfileBody_1_0 body = ProfileBody_1_0Helper.read(in); - if (!match) - continue; + // + // Read components if the IIOP version is > 1.0 + // + TaggedComponent[] components; + if (body.iiop_version.major > 1 || body.iiop_version.minor > 0) { + int len = in.read_ulong(); + components = new TaggedComponent[len]; + for (int j = 0; j < len; j++) { + components[j] = TaggedComponentHelper.read(in); } + } else { + components = new TaggedComponent[0]; + } - // - // OK, found a match - // - org.apache.yoko.orb.OCI.ProfileInfo profileInfo = new org.apache.yoko.orb.OCI.ProfileInfo(); + // add this profile to the list unless + // A) the caller requested matching + // B) the profile doesn't match the supplied host and port + if (!!!performMatch + || hostAndPortMatch(host, portNo, body.host, body.port, matchLoopback) + || taggedComponentsMatch(components, host, portNo, codec, matchLoopback)) { + ProfileInfo profileInfo = new ProfileInfo(); profileInfo.key = body.object_key; profileInfo.minor = body.iiop_version.minor; profileInfo.major = body.iiop_version.major; @@ -276,46 +215,84 @@ && hostMatch(host, altHost, profileInfo.index = i; profileInfo.components = components; - vec.addElement(profileInfo); + list.add(profileInfo); } } - if (vec.size() > 0) { - int len = profileInfoSeq.value.length; - if (len == 0) { - profileInfoSeq.value = new org.apache.yoko.orb.OCI.ProfileInfo[vec - .size()]; - vec.copyInto(profileInfoSeq.value); - } else { - org.apache.yoko.orb.OCI.ProfileInfo[] arr = new org.apache.yoko.orb.OCI.ProfileInfo[len - + vec.size()]; - System.arraycopy(profileInfoSeq.value, 0, arr, 0, len); - for (int i = 0; i < vec.size(); i++) { - arr[len + i] = (org.apache.yoko.orb.OCI.ProfileInfo) vec.elementAt(i); + if (!!!list.isEmpty()) { + List bigList = new ArrayList<>(Arrays.asList(profileInfoSeq.value)); + bigList.addAll(list); + profileInfoSeq.value = bigList.toArray(profileInfoSeq.value); + } + } + + private static boolean hostAndPortMatch(String host, short portNo, String bodyHost, short bodyPort, boolean matchLoopback) { + return portNo == bodyPort && hostMatch(host, bodyHost, matchLoopback); + } + + private static boolean taggedComponentsMatch(TaggedComponent[] components, String host, short port, Codec codec, boolean matchLoopback) { + for (final TaggedComponent component : components) { + if (component.tag == TAG_ALTERNATE_IIOP_ADDRESS.value) { + byte[] d = component.component_data; + Buffer b = new Buffer(d, d.length); + InputStream s = new InputStream(b, 0, false, null, null); + s._OB_readEndian(); + String altHost = s.read_string(); + short altPort = s.read_ushort(); + if (hostAndPortMatch(host, port, altHost, altPort, matchLoopback)) { + return true; + } + } else if (component.tag == TAG_CSI_SEC_MECH_LIST.value) { + Any any; + try { + any = codec.decode_value(component.component_data, CompoundSecMechListHelper.type()); + CompoundSecMechList csml = CompoundSecMechListHelper.extract(any); + + for (CompoundSecMech csm : csml.mechanism_list) { + TaggedComponent tc = csm.transport_mech; + if (tc.tag == TAG_TLS_SEC_TRANS.value) { + Any tstAny = codec.decode_value(tc.component_data, TLS_SEC_TRANSHelper.type()); + TLS_SEC_TRANS tst = TLS_SEC_TRANSHelper.extract(tstAny); + TransportAddress[] transportAddresses = tst.addresses; + if (transportAddressesMatch(transportAddresses, host, port, matchLoopback)) + return true; + } + } + } catch (FormatMismatch | TypeMismatch ignored) { } - profileInfoSeq.value = arr; } } + return false; + } + + private static boolean transportAddressesMatch(TransportAddress[] addrs, String host, short port, boolean loopbackMatches) { + for (TransportAddress addr: addrs) { + final short addrPort = addr.port; + if (hostAndPortMatch(host, port, addr.host_name, addrPort, loopbackMatches)) { + return true; + } + } + return false; } - static public boolean equivalent(org.omg.IOP.IOR ior1, org.omg.IOP.IOR ior2) { + static public boolean equivalent(IOR ior1, IOR ior2) { int p1, p2, b1, b2; int cnt1 = 0, cnt2 = 0; - org.omg.IIOP.ProfileBody_1_0[] bodies1; - org.omg.IIOP.ProfileBody_1_0[] bodies2; + ProfileBody_1_0[] bodies1; + ProfileBody_1_0[] bodies2; // // Calculate number of IIOP profiles in ior1 // for (p1 = 0; p1 < ior1.profiles.length; p1++) - if (ior1.profiles[p1].tag == org.omg.IOP.TAG_INTERNET_IOP.value) + if (ior1.profiles[p1].tag == TAG_INTERNET_IOP.value) cnt1++; // // Calculate number of IIOP profiles in ior2 // for (p2 = 0; p2 < ior2.profiles.length; p2++) - if (ior2.profiles[p2].tag == org.omg.IOP.TAG_INTERNET_IOP.value) + if (ior2.profiles[p2].tag == TAG_INTERNET_IOP.value) cnt2++; // @@ -328,15 +305,15 @@ static public boolean equivalent(org.omg.IOP.IOR ior1, org.omg.IOP.IOR ior2) { // // Create an array with all IIOP profile bodies of ior1 // - bodies1 = new org.omg.IIOP.ProfileBody_1_0[cnt1]; + bodies1 = new ProfileBody_1_0[cnt1]; for (p1 = 0, b1 = 0; p1 < ior1.profiles.length; p1++) - if (ior1.profiles[p1].tag == org.omg.IOP.TAG_INTERNET_IOP.value) { + if (ior1.profiles[p1].tag == TAG_INTERNET_IOP.value) { byte[] data = ior1.profiles[p1].profile_data; - org.apache.yoko.orb.OCI.Buffer buf = new org.apache.yoko.orb.OCI.Buffer( + Buffer buf = new Buffer( data, data.length); InputStream in = new InputStream(buf, 0, false, null, null); in._OB_readEndian(); - bodies1[b1++] = org.omg.IIOP.ProfileBody_1_0Helper.read(in); + bodies1[b1++] = ProfileBody_1_0Helper.read(in); } if (b1 != cnt1) @@ -345,15 +322,15 @@ static public boolean equivalent(org.omg.IOP.IOR ior1, org.omg.IOP.IOR ior2) { // // Create an array with all IIOP profile bodies of ior2 // - bodies2 = new org.omg.IIOP.ProfileBody_1_0[cnt2]; + bodies2 = new ProfileBody_1_0[cnt2]; for (p2 = 0, b2 = 0; p2 < ior2.profiles.length; p2++) - if (ior2.profiles[p2].tag == org.omg.IOP.TAG_INTERNET_IOP.value) { + if (ior2.profiles[p2].tag == TAG_INTERNET_IOP.value) { byte[] data = ior2.profiles[p2].profile_data; - org.apache.yoko.orb.OCI.Buffer buf = new org.apache.yoko.orb.OCI.Buffer( + Buffer buf = new Buffer( data, data.length); InputStream in = new InputStream(buf, 0, false, null, null); in._OB_readEndian(); - bodies2[b2++] = org.omg.IIOP.ProfileBody_1_0Helper.read(in); + bodies2[b2++] = ProfileBody_1_0Helper.read(in); } if (b2 != cnt2) @@ -395,8 +372,8 @@ static public boolean equivalent(org.omg.IOP.IOR ior1, org.omg.IOP.IOR ior2) { return true; } - static boolean compareBodies(org.omg.IIOP.ProfileBody_1_0 body1, - org.omg.IIOP.ProfileBody_1_0 body2) { + static boolean compareBodies(ProfileBody_1_0 body1, + ProfileBody_1_0 body2) { // // Compare versions // @@ -430,10 +407,10 @@ static boolean compareBodies(org.omg.IIOP.ProfileBody_1_0 body1, // addresses to be really sure if the hosts differ // try { - java.net.InetAddress addr1 = java.net.InetAddress + InetAddress addr1 = InetAddress .getByName(body1.host); - java.net.InetAddress addr2 = java.net.InetAddress + InetAddress addr2 = InetAddress .getByName(body2.host); if (!addr1.equals(addr2)) @@ -455,33 +432,30 @@ static boolean compareBodies(org.omg.IIOP.ProfileBody_1_0 body1, // // Calculate a hash for an IOR containing IIOP profiles // - static public int hash(org.omg.IOP.IOR ior, int maximum) { + static public int hash(IOR ior, int maximum) { int hash = 0; - for (int i = 0; i < ior.profiles.length; i++) { - if (ior.profiles[i].tag == org.omg.IOP.TAG_INTERNET_IOP.value) { - // - // Get the first IIOP profile body - // - byte[] data = ior.profiles[i].profile_data; - org.apache.yoko.orb.OCI.Buffer buf = new org.apache.yoko.orb.OCI.Buffer( - data, data.length); - InputStream in = new InputStream(buf, 0, false, null, null); - in._OB_readEndian(); - org.omg.IIOP.ProfileBody_1_0 body = org.omg.IIOP.ProfileBody_1_0Helper - .read(in); + for (TaggedProfile profile : ior.profiles) { + if (profile.tag == TAG_INTERNET_IOP.value) continue; + // + // Get the first IIOP profile body + // + byte[] data = profile.profile_data; + Buffer buf = new Buffer(data, data.length); + InputStream in = new InputStream(buf, 0, false, null, null); + in._OB_readEndian(); + ProfileBody_1_0 body = ProfileBody_1_0Helper.read(in); - // - // Add port to hash - // - hash ^= body.port; + // + // Add port to hash + // + hash ^= body.port; - // - // Add object key to hash - // - for (int j = 0; j + 1 < body.object_key.length; j += 2) - hash ^= body.object_key[j + 1] * 256 + body.object_key[j]; - } + // + // Add object key to hash + // + for (int j = 0; j + 1 < body.object_key.length; j += 2) + hash ^= body.object_key[j + 1] * 256 + body.object_key[j]; } return hash % (maximum + 1);