Skip to content

Commit

Permalink
Router: use DSM.getRecievedBy in FDSMH to determine whether or not to…
Browse files Browse the repository at this point in the history
… store a message in a Client netDB or in the main, floodfill netDb. Revert IMD to it's 2.3.0 state.
  • Loading branch information
eyedeekay committed Nov 11, 2023
1 parent d8415f2 commit bc90b5f
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 173 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,15 @@ public FloodfillDatabaseStoreMessageHandler(RouterContext context, FloodfillNetw
}

public Job createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) {
Job j = new HandleFloodfillDatabaseStoreMessageJob(_context, (DatabaseStoreMessage)receivedMessage, from, fromHash, _facade, _msgIDBloomXor);
if (false) {
j.runJob();
return null;
} else {
return j;
}
DatabaseStoreMessage dsm = (DatabaseStoreMessage)receivedMessage;
// store to client db if received by that client
Hash by = dsm.getEntry().getReceivedBy();
FloodfillNetworkDatabaseFacade netdb;
if (by != null)
netdb = (FloodfillNetworkDatabaseFacade) _context.clientNetDb(by);
else
netdb = _facade;
Job j = new HandleFloodfillDatabaseStoreMessageJob(_context, dsm, from, fromHash, netdb, _msgIDBloomXor);
return j;
}
}
177 changes: 11 additions & 166 deletions router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package net.i2p.router.tunnel;

import java.util.List;

import net.i2p.data.DatabaseEntry;
import net.i2p.data.Hash;
import net.i2p.data.LeaseSet;
Expand All @@ -19,16 +17,11 @@
import net.i2p.data.i2np.TunnelBuildReplyMessage;
import net.i2p.data.i2np.VariableTunnelBuildReplyMessage;
import net.i2p.router.ClientMessage;
import net.i2p.router.Job;
import net.i2p.router.OutNetMessage;
import net.i2p.router.ReplyJob;
import net.i2p.router.RouterContext;
import net.i2p.router.TunnelInfo;
import net.i2p.router.TunnelPoolSettings;
import net.i2p.router.message.GarlicMessageReceiver;
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseSegmentor;
import net.i2p.router.networkdb.kademlia.FloodfillDatabaseStoreMessageHandler;
import net.i2p.util.Log;
import net.i2p.util.RandomSource;

Expand All @@ -55,13 +48,11 @@ public InboundMessageDistributor(RouterContext ctx, Hash client) {

if (_client != null) {
TunnelPoolSettings clienttps = _context.tunnelManager().getInboundSettings(_client);
if (_log.shouldLog(Log.DEBUG)){
_log.debug("Initializing client for " + _client.toBase32());
if (_log.shouldLog(Log.DEBUG))
_log.debug("Initializing client (nickname: "
+ clienttps.getDestinationNickname()
+ " b32: " + _client.toBase32()
+ ") InboundMessageDistributor with tunnel pool settings: " + clienttps);
}
_clientNickname = clienttps.getDestinationNickname();
_msgIDBloomXor = clienttps.getMsgIdBloomXor();
} else {
Expand Down Expand Up @@ -108,6 +99,7 @@ public void distribute(I2NPMessage msg, Hash target, TunnelId tunnel) {
// LS or RI and client or expl., so that we can safely follow references
// in a reply to a LS lookup over client tunnels.
// ILJ would also have to follow references via client tunnels
/****
DatabaseSearchReplyMessage orig = (DatabaseSearchReplyMessage) msg;
if (orig.getNumReplies() > 0) {
if (_log.shouldLog(Log.INFO))
Expand All @@ -117,6 +109,7 @@ public void distribute(I2NPMessage msg, Hash target, TunnelId tunnel) {
newMsg.setSearchKey(orig.getSearchKey());
msg = newMsg;
}
****/
break;

case DatabaseStoreMessage.MESSAGE_TYPE:
Expand All @@ -133,7 +126,6 @@ public void distribute(I2NPMessage msg, Hash target, TunnelId tunnel) {
if (_context.routerHash().equals(key))
return;
RouterInfo ri = (RouterInfo) dsm.getEntry();
ri.setReceivedBy(_client);
if (!key.equals(ri.getIdentity().getHash()))
return;
if (!ri.isValid())
Expand Down Expand Up @@ -176,7 +168,7 @@ public void distribute(I2NPMessage msg, Hash target, TunnelId tunnel) {
return;

} // switch
} else { // client == null/exploratory
} else {
// expl. tunnel
switch (type) {
case DatabaseStoreMessage.MESSAGE_TYPE:
Expand Down Expand Up @@ -224,89 +216,7 @@ public void distribute(I2NPMessage msg, Hash target, TunnelId tunnel) {
+ " (for client " + _clientNickname + " ("
+ ((_client != null) ? _client.toBase32() : "null")
+ ") to target=NULL/tunnel=NULL " + msg);
// Tunnel Build Messages and Delivery Status Messages (used for tunnel
// testing) need to go back to the inNetMessagePool, whether or not
// they came through a client tunnel.
if ( (type == OutboundTunnelBuildReplyMessage.MESSAGE_TYPE) ||
(type == TunnelBuildReplyMessage.MESSAGE_TYPE) ||
(type == VariableTunnelBuildReplyMessage.MESSAGE_TYPE) ||
(type == DeliveryStatusMessage.MESSAGE_TYPE)) {
_context.inNetMessagePool().add(msg, null, null, _msgIDBloomXor);
return;
}

// Handling of client tunnel messages need explicit handling
// in the context of the client subDb.
if (_client != null) {
// For now, the only client message we know how to handle here is a DSM.
// There aren't normally DSM messages here, but it should be safe to store
// them in the client netDb.
if (type == DatabaseStoreMessage.MESSAGE_TYPE) {
DatabaseStoreMessage dsm = (DatabaseStoreMessage)msg;
// Ensure the reply info is cleared, just in case
dsm.setReplyToken(0);
dsm.setReplyTunnel(null);
dsm.setReplyGateway(null);

// We need to replicate some of the handling that was previously
// performed when these types of messages were passed back to
// the inNetMessagePool.
// There's important inline handling made when fetching the original messages.
List<OutNetMessage> origMessages = _context.messageRegistry().getOriginalMessages(msg);
int sz = origMessages.size();
if (sz > 0) {
dsm.setReceivedAsReply();
}
if (dsm.getEntry().isLeaseSet()) {
if (_log.shouldLog(Log.INFO))
_log.info("[client: " + _clientNickname + "] Saving LS DSM from client tunnel.");
FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, (FloodfillNetworkDatabaseFacade) _context.clientNetDb(_client));
Job j = _FDSMH.createJob(msg, null, null);
j.runJob();
if (sz > 0) {
for (int i = 0; i < sz; i++) {
OutNetMessage omsg = origMessages.get(i);
ReplyJob job = omsg.getOnReplyJob();
if (job != null) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Setting ReplyJob ("
+ job + ") for original message:"
+ omsg + "; with reply message [id: "
+ msg.getUniqueId()
+ " Class: "
+ msg.getClass().getSimpleName()
+ "] full message: " + msg);
else if (_log.shouldLog(Log.INFO))
_log.info("Setting a ReplyJob ("
+ job + ") for original message class "
+ omsg.getClass().getSimpleName()
+ " with reply message class "
+ msg.getClass().getSimpleName());
job.setMessage(msg);
_context.jobQueue().addJob(job);
}
}
}
return;
} else {
// drop it, since the data we receive shouldn't include router references.
_context.statManager().addRateData("tunnel.dropDangerousClientTunnelMessage", 1,
DatabaseStoreMessage.MESSAGE_TYPE);
if (_log.shouldLog(Log.WARN))
_log.warn("Dropped dangerous RI DSM message from a tunnel for " + _clientNickname
+ " ("+ _client.toBase32() + ") : " + dsm, new Exception("cause"));
return;
}
}
// Don't know what to do with other message types here.
// But, in testing, it is uncommon to end up here.
if (_log.shouldLog(Log.WARN))
_log.warn("[client: " + _clientNickname + "] Dropping a client message from a tunnel due to lack of delivery handling instructions. Message: " + msg);
return;
} else {
// These messages came down a exploratory tunnel since client == null.
_context.inNetMessagePool().add(msg, null, null, _msgIDBloomXor);
}
_context.inNetMessagePool().add(msg, null, null, _msgIDBloomXor);
}
} else if (_context.routerHash().equals(target)) {
if (type == GarlicMessage.MESSAGE_TYPE)
Expand Down Expand Up @@ -380,53 +290,7 @@ public void handleClove(DeliveryInstructions instructions, I2NPMessage data) {
_log.info("Storing garlic LS down tunnel for: " + dsm.getKey() + " sent to: "
+ _clientNickname + " ("
+ (_client != null ? _client.toBase32() : ") router"));
if (_client != null) {
// We need to replicate some of the handling that was previously
// performed when these types of messages were passed back to
// the inNetMessagePool.
// There's important inline handling made when fetching the original messages.
List<OutNetMessage> origMessages = _context.messageRegistry().getOriginalMessages(data);
int sz = origMessages.size();
if (sz > 0)
dsm.setReceivedAsReply();
// ToDo: This should actually have a try and catch.
if (_log.shouldLog(Log.INFO))
_log.info("Store the LS in the correct dbid subDb: " + _client.toBase32());
FloodfillDatabaseStoreMessageHandler _FDSMH = new FloodfillDatabaseStoreMessageHandler(_context, (FloodfillNetworkDatabaseFacade) _context.clientNetDb(_client));
Job j = _FDSMH.createJob(data, null, null);
j.runJob();
if (sz > 0) {
for (int i = 0; i < sz; i++) {
OutNetMessage omsg = origMessages.get(i);
ReplyJob job = omsg.getOnReplyJob();
if (job != null) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Setting ReplyJob ("
+ job + ") for original message:"
+ omsg + "; with reply message [id: "
+ data.getUniqueId()
+ " Class: "
+ data.getClass().getSimpleName()
+ "] full message: " + data);
else if (_log.shouldLog(Log.INFO))
_log.info("Setting a ReplyJob ("
+ job + ") for original message class "
+ omsg.getClass().getSimpleName()
+ " with reply message class "
+ data.getClass().getSimpleName());
job.setMessage(data);
_context.jobQueue().addJob(job);
}
}
}
} else if (_client == null) {
if (_log.shouldLog(Log.DEBUG))
_log.info("Routing Exploratory Tunnel message back to the inNetMessagePool.");
_context.inNetMessagePool().add(dsm, null, null, _msgIDBloomXor);
} else {
if (_log.shouldLog(Log.ERROR))
_log.error("No handling provisions for message: " + data);
}
_context.inNetMessagePool().add(dsm, null, null, _msgIDBloomXor);
} else {
if (_client != null) {
// drop it, since the data we receive shouldn't include router
Expand All @@ -444,13 +308,10 @@ else if (_log.shouldLog(Log.INFO))
// We must send to the InNetMessagePool so the message can be matched
// and the search marked as successful.
// note that encrypted replies to RI lookups is currently disables in ISJ, we won't get here.

// ... and inject it.
_context.statManager().addRateData("tunnel.inboundI2NPGarlicRIDSM", 1);
if (_log.shouldLog(Log.INFO))
_log.info("Storing garlic RI from exploratory tunnel for: "
+ dsm.getKey()
+ " dsm: " + dsm);
_log.info("Storing garlic RI down tunnel (" + _clientNickname
+ ") for: " + dsm.getKey());
_context.inNetMessagePool().add(dsm, null, null, _msgIDBloomXor);
}
} else if (_client != null && type == DatabaseSearchReplyMessage.MESSAGE_TYPE) {
Expand All @@ -460,6 +321,7 @@ else if (_log.shouldLog(Log.INFO))
// in a reply to a LS lookup over client tunnels.
// ILJ would also have to follow references via client tunnels
DatabaseSearchReplyMessage orig = (DatabaseSearchReplyMessage) data;
/****
if (orig.getNumReplies() > 0) {
if (_log.shouldLog(Log.INFO))
_log.info("Removing replies from a garlic DSRM down a tunnel for " + _client + ": " + data);
Expand All @@ -468,15 +330,8 @@ else if (_log.shouldLog(Log.INFO))
newMsg.setSearchKey(orig.getSearchKey());
orig = newMsg;
}
// Client DSRM are safe to pass back to the inNetMessagePool when
// the replies are stripped.
// Even though the inNetMessagePool will lack information to understand
// the client context, DSRM will be matched against their search,
// which will place the handling back in the client context.
if (_log.shouldLog(Log.DEBUG))
_log.debug("Passing inbound garlic DSRM back to inNetMessagePool for client " + _clientNickname
+ "; msg: " + orig);
_context.inNetMessagePool().add(orig, null, null, _msgIDBloomXor);
****/
_context.inNetMessagePool().add(orig, null, null, _msgIDBloomXor);
} else if (type == DataMessage.MESSAGE_TYPE) {
// a data message targetting the local router is how we send load tests (real
// data messages target destinations)
Expand All @@ -493,17 +348,7 @@ else if (_log.shouldLog(Log.INFO))
+ _clientNickname + " (" + _client.toBase32() + ") : "
+ data, new Exception("cause"));
} else {
if ((type == OutboundTunnelBuildReplyMessage.MESSAGE_TYPE) ||
(type == TunnelBuildReplyMessage.MESSAGE_TYPE) ||
(type == VariableTunnelBuildReplyMessage.MESSAGE_TYPE) ||
(type == DeliveryStatusMessage.MESSAGE_TYPE)) {
_context.inNetMessagePool().add(data, null, null, _msgIDBloomXor);
} else if (_client != null) {
_log.warn("Dropping inbound Message for client " + _clientNickname
+ " due to lack of handling instructions. Msg: " + data);
} else {
_context.inNetMessagePool().add(data, null, null, _msgIDBloomXor);
}
}
return;

Expand Down

0 comments on commit bc90b5f

Please sign in to comment.