mirror of
https://github.com/bisq-network/bisq.git
synced 2024-11-19 18:03:12 +01:00
Introduce io.bitsquare.msg.tomp2p package
This commit is contained in:
parent
467f76fd76
commit
96fa93f608
@ -21,8 +21,8 @@ import io.bitsquare.AbstractBitsquareModule;
|
||||
import io.bitsquare.btc.BitcoinModule;
|
||||
import io.bitsquare.crypto.CryptoModule;
|
||||
import io.bitsquare.gui.GuiModule;
|
||||
import io.bitsquare.msg.DefaultMessageModule;
|
||||
import io.bitsquare.msg.MessageModule;
|
||||
import io.bitsquare.msg.tomp2p.TomP2PMessageModule;
|
||||
import io.bitsquare.offer.OfferModule;
|
||||
import io.bitsquare.offer.tomp2p.TomP2POfferModule;
|
||||
import io.bitsquare.persistence.Persistence;
|
||||
@ -83,7 +83,7 @@ public class BitsquareModule extends AbstractBitsquareModule {
|
||||
}
|
||||
|
||||
protected MessageModule messageModule() {
|
||||
return new DefaultMessageModule(properties);
|
||||
return new TomP2PMessageModule(properties);
|
||||
}
|
||||
|
||||
protected BitcoinModule bitcoinModule() {
|
||||
|
@ -1,54 +0,0 @@
|
||||
/*
|
||||
* 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.msg;
|
||||
|
||||
import io.bitsquare.AbstractBitsquareModule;
|
||||
import io.bitsquare.network.BootstrapNodes;
|
||||
import io.bitsquare.network.Node;
|
||||
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.name.Names;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
public class DefaultMessageModule extends AbstractBitsquareModule implements MessageModule {
|
||||
|
||||
public DefaultMessageModule(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
bind(MessageFacade.class).to(TomP2PMessageFacade.class).asEagerSingleton();
|
||||
bind(P2PNode.class).asEagerSingleton();
|
||||
bind(BootstrappedPeerFactory.class).asEagerSingleton();
|
||||
bind(DHTSeedService.class);
|
||||
|
||||
// we will probably later use disk storage instead of memory storage for TomP2P
|
||||
bind(Boolean.class).annotatedWith(Names.named("useDiskStorage")).toInstance(false);
|
||||
|
||||
bind(Node.class)
|
||||
.annotatedWith(Names.named("bootstrapNode"))
|
||||
.toInstance(BootstrapNodes.LOCALHOST);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doClose(Injector injector) {
|
||||
injector.getInstance(MessageFacade.class).shutDown();
|
||||
}
|
||||
}
|
@ -17,7 +17,43 @@
|
||||
|
||||
package io.bitsquare.msg;
|
||||
|
||||
import com.google.inject.Module;
|
||||
import io.bitsquare.AbstractBitsquareModule;
|
||||
import io.bitsquare.network.BootstrapNodes;
|
||||
import io.bitsquare.network.Node;
|
||||
|
||||
public interface MessageModule extends Module {
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.name.Names;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
public abstract class MessageModule extends AbstractBitsquareModule {
|
||||
|
||||
protected MessageModule(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final void configure() {
|
||||
bind(MessageFacade.class).to(messageFacade()).asEagerSingleton();
|
||||
bind(DHTSeedService.class);
|
||||
|
||||
// we will probably later use disk storage instead of memory storage for TomP2P
|
||||
bind(Boolean.class).annotatedWith(Names.named("useDiskStorage")).toInstance(false);
|
||||
|
||||
bind(Node.class)
|
||||
.annotatedWith(Names.named("bootstrapNode"))
|
||||
.toInstance(BootstrapNodes.DIGITAL_OCEAN_1);
|
||||
|
||||
doConfigure();
|
||||
}
|
||||
|
||||
protected void doConfigure() {
|
||||
}
|
||||
|
||||
protected abstract Class<? extends MessageFacade> messageFacade();
|
||||
|
||||
@Override
|
||||
protected void doClose(Injector injector) {
|
||||
injector.getInstance(MessageFacade.class).shutDown();
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@
|
||||
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.msg;
|
||||
package io.bitsquare.msg.tomp2p;
|
||||
|
||||
import io.bitsquare.network.BootstrapState;
|
||||
import io.bitsquare.network.Node;
|
||||
@ -65,7 +65,7 @@ import org.slf4j.LoggerFactory;
|
||||
/**
|
||||
* Creates a DHT peer and bootstrap to the network via a seed node
|
||||
*/
|
||||
public class BootstrappedPeerFactory {
|
||||
class BootstrappedPeerFactory {
|
||||
private static final Logger log = LoggerFactory.getLogger(BootstrappedPeerFactory.class);
|
||||
|
||||
private KeyPair keyPair;
|
@ -15,9 +15,11 @@
|
||||
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.msg;
|
||||
package io.bitsquare.msg.tomp2p;
|
||||
|
||||
import io.bitsquare.arbitrator.Arbitrator;
|
||||
import io.bitsquare.msg.Message;
|
||||
import io.bitsquare.msg.MessageFacade;
|
||||
import io.bitsquare.msg.listeners.ArbitratorListener;
|
||||
import io.bitsquare.msg.listeners.BootstrapListener;
|
||||
import io.bitsquare.msg.listeners.GetPeerAddressListener;
|
||||
@ -68,7 +70,7 @@ class TomP2PMessageFacade implements MessageFacade {
|
||||
private static final Logger log = LoggerFactory.getLogger(TomP2PMessageFacade.class);
|
||||
private static final String ARBITRATORS_ROOT = "ArbitratorsRoot";
|
||||
|
||||
private final P2PNode p2pNode;
|
||||
private final TomP2PNode p2pNode;
|
||||
private final User user;
|
||||
|
||||
private final List<ArbitratorListener> arbitratorListeners = new ArrayList<>();
|
||||
@ -80,7 +82,7 @@ class TomP2PMessageFacade implements MessageFacade {
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@Inject
|
||||
public TomP2PMessageFacade(User user, P2PNode p2pNode) {
|
||||
public TomP2PMessageFacade(User user, TomP2PNode p2pNode) {
|
||||
this.user = user;
|
||||
this.p2pNode = p2pNode;
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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.msg.tomp2p;
|
||||
|
||||
import io.bitsquare.msg.MessageFacade;
|
||||
import io.bitsquare.msg.MessageModule;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
public class TomP2PMessageModule extends MessageModule {
|
||||
|
||||
public TomP2PMessageModule(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doConfigure() {
|
||||
bind(TomP2PNode.class).asEagerSingleton();
|
||||
bind(BootstrappedPeerFactory.class).asEagerSingleton();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<? extends MessageFacade> messageFacade() {
|
||||
return TomP2PMessageFacade.class;
|
||||
}
|
||||
}
|
@ -15,8 +15,9 @@
|
||||
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.msg;
|
||||
package io.bitsquare.msg.tomp2p;
|
||||
|
||||
import io.bitsquare.msg.MessageBroker;
|
||||
import io.bitsquare.msg.listeners.BootstrapListener;
|
||||
import io.bitsquare.network.tomp2p.TomP2PPeer;
|
||||
|
||||
@ -66,14 +67,16 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import lighthouse.files.AppDirectory;
|
||||
|
||||
import static io.bitsquare.network.tomp2p.BaseFutureUtil.isSuccess;
|
||||
|
||||
/**
|
||||
* The fully bootstrapped P2PNode which is responsible himself for his availability in the messaging system. It saves
|
||||
* for instance the IP address periodically.
|
||||
* This class is offering generic functionality of TomP2P needed for Bitsquare, like data and domain protection.
|
||||
* It does not handle any domain aspects of Bitsquare.
|
||||
*/
|
||||
public class P2PNode {
|
||||
private static final Logger log = LoggerFactory.getLogger(P2PNode.class);
|
||||
public class TomP2PNode {
|
||||
private static final Logger log = LoggerFactory.getLogger(TomP2PNode.class);
|
||||
|
||||
private KeyPair keyPair;
|
||||
private final Boolean useDiskStorage;
|
||||
@ -90,14 +93,14 @@ public class P2PNode {
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@Inject
|
||||
public P2PNode(BootstrappedPeerFactory bootstrappedPeerFactory,
|
||||
public TomP2PNode(BootstrappedPeerFactory bootstrappedPeerFactory,
|
||||
@Named("useDiskStorage") Boolean useDiskStorage) {
|
||||
this.bootstrappedPeerFactory = bootstrappedPeerFactory;
|
||||
this.useDiskStorage = useDiskStorage;
|
||||
}
|
||||
|
||||
// for unit testing
|
||||
P2PNode(KeyPair keyPair, PeerDHT peerDHT) {
|
||||
TomP2PNode(KeyPair keyPair, PeerDHT peerDHT) {
|
||||
this.keyPair = keyPair;
|
||||
this.peerDHT = peerDHT;
|
||||
peerDHT.peerBean().keyPair(keyPair);
|
||||
@ -309,7 +312,7 @@ public class P2PNode {
|
||||
public void onSuccess(@Nullable PeerDHT peerDHT) {
|
||||
try {
|
||||
if (peerDHT != null) {
|
||||
P2PNode.this.peerDHT = peerDHT;
|
||||
TomP2PNode.this.peerDHT = peerDHT;
|
||||
setupReplyHandler();
|
||||
FuturePut futurePut = storePeerAddress();
|
||||
futurePut.addListener(new BaseFutureListener<BaseFuture>() {
|
||||
@ -400,10 +403,4 @@ public class P2PNode {
|
||||
storage = new StorageMemory();
|
||||
}
|
||||
}
|
||||
|
||||
// Isolate the success handling as there is bug in port forwarding mode
|
||||
private boolean isSuccess(BaseFuture baseFuture) {
|
||||
// return baseFuture.isSuccess();
|
||||
return true;
|
||||
}
|
||||
}
|
@ -17,7 +17,6 @@
|
||||
|
||||
package io.bitsquare.offer.tomp2p;
|
||||
|
||||
import io.bitsquare.AbstractBitsquareModule;
|
||||
import io.bitsquare.offer.OfferModule;
|
||||
import io.bitsquare.offer.OfferRepository;
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
package io.bitsquare.offer.tomp2p;
|
||||
|
||||
import io.bitsquare.msg.P2PNode;
|
||||
import io.bitsquare.msg.tomp2p.TomP2PNode;
|
||||
import io.bitsquare.offer.Offer;
|
||||
import io.bitsquare.offer.OfferRepository;
|
||||
import io.bitsquare.util.task.FaultHandler;
|
||||
@ -57,10 +57,10 @@ class TomP2POfferRepository implements OfferRepository {
|
||||
private final List<Listener> offerRepositoryListeners = new ArrayList<>();
|
||||
private final LongProperty invalidationTimestamp = new SimpleLongProperty(0);
|
||||
|
||||
private final P2PNode p2pNode;
|
||||
private final TomP2PNode p2pNode;
|
||||
|
||||
@Inject
|
||||
public TomP2POfferRepository(P2PNode p2pNode) {
|
||||
public TomP2POfferRepository(TomP2PNode p2pNode) {
|
||||
this.p2pNode = p2pNode;
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
* along with Bitsquare. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.bitsquare.msg;
|
||||
package io.bitsquare.msg.tomp2p;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@ -48,12 +48,12 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
// TODO Reactivate tests when P2PNode is using original code again. we deactivated the security features atm.
|
||||
// TODO Reactivate tests when TomP2PNode is using original code again. we deactivated the security features atm.
|
||||
// cause IOException: Not listening to anything. Maybe your binding information is wrong.
|
||||
// investigate what has broken it, probably from update to latest head
|
||||
@Ignore
|
||||
public class P2PNodeTest {
|
||||
private static final Logger log = LoggerFactory.getLogger(P2PNodeTest.class);
|
||||
public class TomP2PNodeTest {
|
||||
private static final Logger log = LoggerFactory.getLogger(TomP2PNodeTest.class);
|
||||
|
||||
final private static Random rnd = new Random(42L);
|
||||
|
||||
@ -80,12 +80,12 @@ public class P2PNodeTest {
|
||||
KeyPair keyPairClient = keyGen.genKeyPair();
|
||||
KeyPair keyPairOtherPeer = keyGen.genKeyPair();
|
||||
|
||||
P2PNode node;
|
||||
TomP2PNode node;
|
||||
Number160 locationKey;
|
||||
Object object;
|
||||
FutureDirect futureDirect;
|
||||
|
||||
node = new P2PNode(keyPairClient, client);
|
||||
node = new TomP2PNode(keyPairClient, client);
|
||||
object = "clients data";
|
||||
futureDirect = node.sendData(otherPeer.peerAddress(), object);
|
||||
futureDirect.awaitUninterruptibly();
|
||||
@ -110,7 +110,7 @@ public class P2PNodeTest {
|
||||
KeyPair keyPairClient = keyGen.genKeyPair();
|
||||
KeyPair keyPairOtherPeer = keyGen.genKeyPair();
|
||||
|
||||
P2PNode node;
|
||||
TomP2PNode node;
|
||||
Number160 locationKey;
|
||||
Data data;
|
||||
FuturePut futurePut;
|
||||
@ -119,7 +119,7 @@ public class P2PNodeTest {
|
||||
// otherPeer tries to squat clients location store
|
||||
// he can do it but as he has not the domain key of the client he cannot do any harm
|
||||
// he only can store und that path: locationKey.otherPeerDomainKey.data
|
||||
node = new P2PNode(keyPairOtherPeer, otherPeer);
|
||||
node = new TomP2PNode(keyPairOtherPeer, otherPeer);
|
||||
locationKey = Number160.createHash("clients location");
|
||||
data = new Data("otherPeer data");
|
||||
futurePut = node.putDomainProtectedData(locationKey, data);
|
||||
@ -133,7 +133,7 @@ public class P2PNodeTest {
|
||||
|
||||
// client store his data und his domainkey, no problem with previous occupied
|
||||
// he only can store und that path: locationKey.clientDomainKey.data
|
||||
node = new P2PNode(keyPairClient, client);
|
||||
node = new TomP2PNode(keyPairClient, client);
|
||||
locationKey = Number160.createHash("clients location");
|
||||
data = new Data("client data");
|
||||
futurePut = node.putDomainProtectedData(locationKey, data);
|
||||
@ -146,7 +146,7 @@ public class P2PNodeTest {
|
||||
assertEquals("client data", futureGet.data().object());
|
||||
|
||||
// also other peers can read that data if they know the public key of the client
|
||||
node = new P2PNode(keyPairOtherPeer, otherPeer);
|
||||
node = new TomP2PNode(keyPairOtherPeer, otherPeer);
|
||||
futureGet = node.getDomainProtectedData(locationKey, keyPairClient.getPublic());
|
||||
futureGet.awaitUninterruptibly();
|
||||
assertTrue(futureGet.isSuccess());
|
||||
@ -168,7 +168,7 @@ public class P2PNodeTest {
|
||||
assertFalse(futurePut.isSuccess());
|
||||
|
||||
// he can read his prev. stored data
|
||||
node = new P2PNode(keyPairOtherPeer, otherPeer);
|
||||
node = new TomP2PNode(keyPairOtherPeer, otherPeer);
|
||||
futureGet = node.getDomainProtectedData(locationKey, keyPairOtherPeer.getPublic());
|
||||
futureGet.awaitUninterruptibly();
|
||||
assertTrue(futureGet.isSuccess());
|
||||
@ -226,7 +226,7 @@ public class P2PNodeTest {
|
||||
PeerDHT otherPeer = peers[2];
|
||||
UtilsDHT2.perfectRouting(peers);
|
||||
|
||||
P2PNode node;
|
||||
TomP2PNode node;
|
||||
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
|
||||
keyGen.initialize(1024);
|
||||
KeyPair keyPairClient = keyGen.genKeyPair();
|
||||
@ -243,7 +243,7 @@ public class P2PNodeTest {
|
||||
KeyPair keyPair1 = gen.generateKeyPair();
|
||||
keyPairClient = keyPair1;
|
||||
|
||||
node = new P2PNode(keyPairClient, client);
|
||||
node = new TomP2PNode(keyPairClient, client);
|
||||
locationKey = Number160.createHash("add to list clients location");
|
||||
data = new Data("add to list client data1");
|
||||
Data data_1 = data;
|
||||
@ -298,7 +298,7 @@ public class P2PNodeTest {
|
||||
futurePut.awaitUninterruptibly();
|
||||
assertTrue(futurePut.isSuccess());
|
||||
|
||||
node = new P2PNode(keyPairOtherPeer, otherPeer);
|
||||
node = new TomP2PNode(keyPairOtherPeer, otherPeer);
|
||||
futureGet = node.getDataMap(locationKey);
|
||||
futureGet.awaitUninterruptibly();
|
||||
assertTrue(futureGet.isSuccess());
|
||||
@ -334,7 +334,7 @@ public class P2PNodeTest {
|
||||
|
||||
|
||||
// client removes his entry -> OK
|
||||
node = new P2PNode(keyPairClient, client);
|
||||
node = new TomP2PNode(keyPairClient, client);
|
||||
FutureRemove futureRemove = node.removeFromDataMap(locationKey, data_1);
|
||||
futureRemove.awaitUninterruptibly();
|
||||
assertTrue(futureRemove.isSuccess());
|
||||
@ -375,7 +375,7 @@ public class P2PNodeTest {
|
||||
|
||||
|
||||
// otherPeer tries to removes client entry -> FAIL
|
||||
node = new P2PNode(keyPairOtherPeer, otherPeer);
|
||||
node = new TomP2PNode(keyPairOtherPeer, otherPeer);
|
||||
futureRemove = node.removeFromDataMap(locationKey, data_2);
|
||||
futureRemove.awaitUninterruptibly();
|
||||
assertFalse(futureRemove.isSuccess());
|
Loading…
Reference in New Issue
Block a user