|
|
|
@ -72,19 +72,26 @@ namespace client
@@ -72,19 +72,26 @@ namespace client
|
|
|
|
|
if (eol != receiver->buffer && eol[-1] == '\r') eol[-1] = 0; // workaround for Transmission, it sends '\r\n' terminated address
|
|
|
|
|
receiver->data = (uint8_t *)eol + 1; |
|
|
|
|
receiver->dataLen = receiver->bufferOffset - (eol - receiver->buffer + 1); |
|
|
|
|
i2p::data::IdentHash ident; |
|
|
|
|
if (!context.GetAddressBook ().GetIdentHash (receiver->buffer, ident)) |
|
|
|
|
auto addr = context.GetAddressBook ().GetAddress (receiver->buffer); |
|
|
|
|
if (!addr) |
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogError, "BOB: address ", receiver->buffer, " not found"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
auto leaseSet = GetLocalDestination ()->FindLeaseSet (ident); |
|
|
|
|
if (leaseSet) |
|
|
|
|
CreateConnection (receiver, leaseSet); |
|
|
|
|
if (addr->IsIdentHash ()) |
|
|
|
|
{ |
|
|
|
|
auto leaseSet = GetLocalDestination ()->FindLeaseSet (addr->identHash); |
|
|
|
|
if (leaseSet) |
|
|
|
|
CreateConnection (receiver, leaseSet); |
|
|
|
|
else |
|
|
|
|
GetLocalDestination ()->RequestDestination (addr->identHash, |
|
|
|
|
std::bind (&BOBI2PInboundTunnel::HandleDestinationRequestComplete, |
|
|
|
|
this, std::placeholders::_1, receiver)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
GetLocalDestination ()->RequestDestination (ident, |
|
|
|
|
std::bind (&BOBI2PInboundTunnel::HandleDestinationRequestComplete, |
|
|
|
|
this, std::placeholders::_1, receiver)); |
|
|
|
|
GetLocalDestination ()->RequestDestinationWithEncryptedLeaseSet (addr->blindedPublicKey, |
|
|
|
|
std::bind (&BOBI2PInboundTunnel::HandleDestinationRequestComplete, |
|
|
|
|
this, std::placeholders::_1, receiver)); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -540,29 +547,37 @@ namespace client
@@ -540,29 +547,37 @@ namespace client
|
|
|
|
|
void BOBCommandSession::LookupCommandHandler (const char * operand, size_t len) |
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogDebug, "BOB: lookup ", operand); |
|
|
|
|
i2p::data::IdentHash ident; |
|
|
|
|
if (!context.GetAddressBook ().GetIdentHash (operand, ident)) |
|
|
|
|
auto addr = context.GetAddressBook ().GetAddress (operand); |
|
|
|
|
if (!addr) |
|
|
|
|
{ |
|
|
|
|
SendReplyError ("Address Not found"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
auto localDestination = m_CurrentDestination ? m_CurrentDestination->GetLocalDestination () : i2p::client::context.GetSharedLocalDestination (); |
|
|
|
|
auto leaseSet = localDestination->FindLeaseSet (ident); |
|
|
|
|
if (leaseSet) |
|
|
|
|
SendReplyOK (leaseSet->GetIdentity ()->ToBase64 ().c_str ()); |
|
|
|
|
else |
|
|
|
|
if (addr->IsIdentHash ()) |
|
|
|
|
{ |
|
|
|
|
auto s = shared_from_this (); |
|
|
|
|
localDestination->RequestDestination (ident, |
|
|
|
|
[s](std::shared_ptr<i2p::data::LeaseSet> ls) |
|
|
|
|
// we might have leaseset already
|
|
|
|
|
auto leaseSet = localDestination->FindLeaseSet (addr->identHash); |
|
|
|
|
if (leaseSet) |
|
|
|
|
{ |
|
|
|
|
SendReplyOK (leaseSet->GetIdentity ()->ToBase64 ().c_str ()); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// trying to request
|
|
|
|
|
auto s = shared_from_this (); |
|
|
|
|
auto requstCallback = |
|
|
|
|
[s](std::shared_ptr<i2p::data::LeaseSet> ls) |
|
|
|
|
{ |
|
|
|
|
if (ls) |
|
|
|
|
s->SendReplyOK (ls->GetIdentity ()->ToBase64 ().c_str ()); |
|
|
|
|
else |
|
|
|
|
s->SendReplyError ("LeaseSet Not found"); |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
if (addr->IsIdentHash ()) |
|
|
|
|
localDestination->RequestDestination (addr->identHash, requstCallback); |
|
|
|
|
else |
|
|
|
|
localDestination->RequestDestinationWithEncryptedLeaseSet (addr->blindedPublicKey, requstCallback); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void BOBCommandSession::ClearCommandHandler (const char * operand, size_t len) |
|
|
|
|