From f818f84adba08934879239476a7dc85d8d6e37e3 Mon Sep 17 00:00:00 2001 From: Michael Peter Christen Date: Sat, 11 Oct 2014 00:34:07 +0200 Subject: [PATCH] more ipv6 fixes --- htroot/MessageSend_p.java | 121 ++++++++++++++++++---------- source/net/yacy/peers/Protocol.java | 30 +------ source/net/yacy/peers/SeedDB.java | 22 +---- 3 files changed, 80 insertions(+), 93 deletions(-) diff --git a/htroot/MessageSend_p.java b/htroot/MessageSend_p.java index 95cfaa1e5..f7dd92d55 100644 --- a/htroot/MessageSend_p.java +++ b/htroot/MessageSend_p.java @@ -25,18 +25,27 @@ //javac -classpath .:../Classes MessageSend_p.java //if the shell's current path is HTROOT +import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Map; +import org.apache.http.entity.mime.content.ContentBody; + +import net.yacy.cora.document.encoding.ASCII; import net.yacy.cora.document.encoding.UTF8; import net.yacy.cora.protocol.RequestHeader; +import net.yacy.kelondro.util.FileUtils; +import net.yacy.peers.Network; import net.yacy.peers.Protocol; +import net.yacy.peers.Protocol.Post; import net.yacy.peers.Seed; +import net.yacy.peers.SeedDB; import net.yacy.search.Switchboard; import net.yacy.server.serverObjects; import net.yacy.server.serverSwitch; +import net.yacy.utils.crypt; public class MessageSend_p { @@ -68,51 +77,52 @@ public class MessageSend_p { // open an editor page for the message // first ask if the other peer is online, and also what kind of document it accepts - final Map result = Protocol.permissionMessage(sb.peers.targetAddress(hash), hash); - //System.out.println("DEBUG: permission request result = " + result.toString()); - String peerName; - Seed targetPeer = null; - if (hash.equals(sb.peers.mySeed().hash)) { - peerName = sb.peers.mySeed().get(Seed.NAME,"nameless"); - } else { - targetPeer = sb.peers.getConnected(hash); - if (targetPeer == null) - peerName = "nameless"; - else - peerName = targetPeer.get(Seed.NAME,"nameless"); - } - - prop.putXML("mode_permission_peerName", peerName); - final String response = (result == null) ? null : result.get("response"); - if (response == null || result == null) { - // we don't have permission or other peer does not exist - prop.put("mode_permission", "0"); - - if (targetPeer != null) { - sb.peers.peerActions.peerDeparture(targetPeer, "peer responded upon message send request: " + response); + Seed seed = sb.peers.getConnected(ASCII.getBytes(hash)); + for(String ip: seed.getIPs()) { + final Map result = Protocol.permissionMessage(seed.getPublicAddress(ip), hash); + //System.out.println("DEBUG: permission request result = " + result.toString()); + String peerName; + Seed targetPeer = null; + if (hash.equals(sb.peers.mySeed().hash)) { + peerName = sb.peers.mySeed().get(Seed.NAME,"nameless"); + } else { + targetPeer = sb.peers.getConnected(hash); + if (targetPeer == null) + peerName = "nameless"; + else + peerName = targetPeer.get(Seed.NAME,"nameless"); } - } else { - prop.put("mode_permission", "1"); - - // write input form - try { - final int messagesize = Integer.parseInt(result.get("messagesize")); - final int attachmentsize = Integer.parseInt(result.get("attachmentsize")); - - prop.putXML("mode_permission_response", response); - prop.put("mode_permission_messagesize", messagesize); - prop.put("mode_permission_attachmentsize", attachmentsize); - prop.putXML("mode_permission_subject", subject); - prop.putXML("mode_permission_message", message); - prop.putHTML("mode_permission_hash", hash); - if (post.containsKey("preview")) { - prop.putWiki(sb.peers.mySeed().getPublicAddress(sb.peers.mySeed().getIP()), "mode_permission_previewmessage", message); - + + prop.putXML("mode_permission_peerName", peerName); + final String response = (result == null) ? null : result.get("response"); + if (response == null || result == null) { + // we don't have permission or other peer does not exist + prop.put("mode_permission", "0"); + if (targetPeer != null) { + sb.peers.peerActions.interfaceDeparture(targetPeer, ip); + } + } else { + prop.put("mode_permission", "1"); + + // write input form + try { + final int messagesize = Integer.parseInt(result.get("messagesize")); + final int attachmentsize = Integer.parseInt(result.get("attachmentsize")); + + prop.putXML("mode_permission_response", response); + prop.put("mode_permission_messagesize", messagesize); + prop.put("mode_permission_attachmentsize", attachmentsize); + prop.putXML("mode_permission_subject", subject); + prop.putXML("mode_permission_message", message); + prop.putHTML("mode_permission_hash", hash); + if (post.containsKey("preview")) { + prop.putWiki(sb.peers.mySeed().getPublicAddress(ip), "mode_permission_previewmessage", message); + } + + } catch (final NumberFormatException e) { + // "unresolved pattern", the remote peer is alive but had an exception + prop.put("mode_permission", "2"); } - - } catch (final NumberFormatException e) { - // "unresolved pattern", the remote peer is alive but had an exception - prop.put("mode_permission", "2"); } } } else { @@ -127,7 +137,30 @@ public class MessageSend_p { if (subject.length() > 100) subject = subject.substring(0, 100); if (message.length() > messagesize) message = message.substring(0, messagesize); final byte[] mb = UTF8.getBytes(message); - final Map result = Protocol.postMessage(sb.peers, hash, subject, mb); + SeedDB seedDB = sb.peers; + // prepare request + final String salt = crypt.randomSalt(); + + // send request + final Map parts = Protocol.basicRequestParts(Switchboard.getSwitchboard(), hash, salt); + parts.put("process", UTF8.StringBody("post")); + parts.put("myseed", UTF8.StringBody(seedDB.mySeed().genSeedStr(salt))); + parts.put("subject", UTF8.StringBody(subject)); + parts.put("message", UTF8.StringBody(mb)); + Seed seed = seedDB.getConnected(ASCII.getBytes(hash)); + Post post1 = null; + for (String ip: seed.getIPs()) { + try { + post1 = new Post(seed.getPublicAddress(ip), hash, "/yacy/message.html", parts, 20000); + } catch (IOException e) { + Network.log.warn("yacyClient.postMessage error:" + e.getMessage()); + post1 = null; + } + if (post1 != null) break; + seedDB.peerActions.interfaceDeparture(seed, ip); + } + final Map result1 = post1 == null ? null : FileUtils.table(post1.result); + final Map result = result1; //message has been sent prop.put("mode_status_response", result.get("response")); diff --git a/source/net/yacy/peers/Protocol.java b/source/net/yacy/peers/Protocol.java index 58e2d771f..37237c9a7 100644 --- a/source/net/yacy/peers/Protocol.java +++ b/source/net/yacy/peers/Protocol.java @@ -133,7 +133,7 @@ public final class Protocol { /** * wrapper class for multi-post attempts to multiple IPs */ - private static class Post { + public static class Post { public byte[] result; // contains the result from a successful post or null if no attempt was successful public Set unsuccessfulAddresses; // contains a set of addresses which had been tested for submission was without success @@ -1153,32 +1153,6 @@ public final class Protocol { } } - public static Map postMessage( - final SeedDB seedDB, - final String targetHash, - final String subject, - final byte[] message) { - // this post a message to the remote message board - - // prepare request - final String salt = crypt.randomSalt(); - - // send request - try { - final Map parts = basicRequestParts(Switchboard.getSwitchboard(), targetHash, salt); - parts.put("process", UTF8.StringBody("post")); - parts.put("myseed", UTF8.StringBody(seedDB.mySeed().genSeedStr(salt))); - parts.put("subject", UTF8.StringBody(subject)); - parts.put("message", UTF8.StringBody(message)); - final Post post = new Post(seedDB.targetAddress(targetHash), targetHash, "/yacy/message.html", parts, 20000); - final Map result = FileUtils.table(post.result); - return result; - } catch (final Exception e ) { - Network.log.warn("yacyClient.postMessage error:" + e.getMessage()); - return null; - } - } - public static Map crawlReceipt( final Seed mySeed, final Seed target, @@ -1634,7 +1608,7 @@ public final class Protocol { * @param salt * @return */ - private static final LinkedHashMap basicRequestParts(final Switchboard sb, final String targetHash, final String salt) { + public static final LinkedHashMap basicRequestParts(final Switchboard sb, final String targetHash, final String salt) { final LinkedHashMap parts = new LinkedHashMap(); // just standard identification essentials diff --git a/source/net/yacy/peers/SeedDB.java b/source/net/yacy/peers/SeedDB.java index 525fa3176..e2e1bcd21 100644 --- a/source/net/yacy/peers/SeedDB.java +++ b/source/net/yacy/peers/SeedDB.java @@ -956,7 +956,7 @@ public final class SeedDB implements AlternativeDomainNames { seed = lookupByName(domain); if (seed == null) return null; if (this.mySeed == null) initMySeed(); - if ((seed == this.mySeed) && (!(seed.isOnline()))) { + if (seed == this.mySeed && !(seed.isOnline())) { // take local ip instead of external return Switchboard.getSwitchboard().myPublicIP() + ":" + Switchboard.getSwitchboard().getLocalPort("port", 8090) + ((subdom == null) ? "" : ("/" + subdom)); } @@ -966,26 +966,6 @@ public final class SeedDB implements AlternativeDomainNames { } } - /** - * use getConnected(hash) instead and retrieve the addresses from the seed - * @param targetHash - * @return - */ - @Deprecated - public String targetAddress(final String targetHash) { - // find target address - String address; - if (targetHash.equals(mySeed().hash)) { - address = mySeed().getPublicAddress(mySeed().getIP()); - } else { - final Seed targetSeed = getConnected(targetHash); - if (targetSeed == null) { return null; } - address = targetSeed.getPublicAddress(targetSeed.getIP()); - } - if (address == null) address = "localhost" + (this.mySeed.getPort() > 0 ? ":" + this.mySeed.getPort() : ""); - return address; - } - private class seedEnum implements Iterator { private Iterator>> it;