/*
* This file is part of Bitsquare.
*
* Bitsquare is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bitsquare is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bitsquare.network;
import com.runjva.sourceforge.jsocks.protocol.Socks5Proxy;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.net.discovery.PeerDiscovery;
import org.bitcoinj.net.discovery.PeerDiscoveryException;
import org.bitcoinj.net.discovery.SeedPeers;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
/**
* This class implements various types of discovery over Socks5,
* which can be enabled/disabled via constructor flag.
*/
public class Socks5MultiDiscovery implements PeerDiscovery {
public static final int SOCKS5_DISCOVER_ADDR = 0x0001;
public static final int SOCKS5_DISCOVER_DNS = 0x0010;
public static final int SOCKS5_DISCOVER_ONION = 0x0100;
public static final int SOCKS5_DISCOVER_ALL = 0x1111;
private final ArrayList<PeerDiscovery> discoveryList = new ArrayList<>();
/**
* Supports finding peers by hostname over a socks5 proxy.
*
* @param proxy proxy the socks5 proxy to connect over.
* @param params param to be used for seed and port information.
* @param mode specify discovery mode, OR'd together. one or more of:
* SOCKS5_DISCOVER_ADDR
* SOCKS5_DISCOVER_DNS
* SOCKS5_DISCOVER_ONION
* SOCKS5_DISCOVER_ALL
*/
public Socks5MultiDiscovery(Socks5Proxy proxy, NetworkParameters params, int mode) {
if ((mode & SOCKS5_DISCOVER_ONION) != 0)
discoveryList.add(new Socks5SeedOnionDiscovery(proxy, params));
if ((mode & SOCKS5_DISCOVER_ADDR) != 0)
// note: SeedPeers does not perform any network operations, so does not use proxy.
discoveryList.add(new SeedPeers(params));
if ((mode & SOCKS5_DISCOVER_DNS) != 0)
discoveryList.add(new Socks5DnsDiscovery(proxy, params));
}
/**
* Returns an array containing all the Bitcoin nodes that have been discovered.
*/
@Override
public InetSocketAddress[] getPeers(long timeoutValue, TimeUnit timeoutUnit) throws PeerDiscoveryException {
ArrayList<InetSocketAddress> list = new ArrayList<>();
for (PeerDiscovery discovery : discoveryList) {
list.addAll(Arrays.asList(discovery.getPeers(timeoutValue, timeoutUnit)));
}
return list.toArray(new InetSocketAddress[list.size()]);
}
@Override
public void shutdown() {
//TODO should we add a DnsLookupTor.shutdown() ?
}
}