void EstablishmentManager::stateChanged(EstablishmentStatePtr es) { const Endpoint &ep = es->getTheirEndpoint(); I2P_LOG_SCOPED_TAG(m_log, "Endpoint", ep); switch(es->getState()) { case EstablishmentState::State::REQUEST_SENT: I2P_LOG(m_log, debug) << "sent session request"; break; case EstablishmentState::State::REQUEST_RECEIVED: I2P_LOG(m_log, debug) << "received session request"; processRequest(es); break; case EstablishmentState::State::CREATED_SENT: I2P_LOG(m_log, debug) << "sent session created"; break; case EstablishmentState::State::CREATED_RECEIVED: I2P_LOG(m_log, debug) << "received session created"; processCreated(es); break; case EstablishmentState::State::CONFIRMED_SENT: { const RouterHash &rh = es->getTheirIdentity().getHash(); I2P_LOG_SCOPED_TAG(m_log, "RouterHash", rh); I2P_LOG(m_log, debug) << "sent session confirmed"; m_context.ios.post(boost::bind(boost::ref(m_context.establishedSignal), rh, (es->getDirection() == EstablishmentState::Direction::INBOUND))); delState(ep); } break; case EstablishmentState::State::CONFIRMED_RECEIVED: I2P_LOG(m_log, debug) << "received session confirmed"; processConfirmed(es); break; case EstablishmentState::State::UNKNOWN: case EstablishmentState::State::FAILURE: I2P_LOG(m_log, info) << "establishment failed"; if(es->getDirection() == EstablishmentState::Direction::OUTBOUND) m_context.ios.post(boost::bind(boost::ref(m_context.failureSignal), es->getTheirIdentity().getHash())); delState(ep); break; } }
void EstablishmentManager::processConfirmed(EstablishmentStatePtr const &state) { I2P_LOG_SCOPED_TAG(m_log, "RouterHash", state->getTheirIdentity().getHash()); if(!state->verifyConfirmationSignature()) { I2P_LOG(m_log, warning) << "confirmation signature verification failed"; state->setState(EstablishmentState::State::FAILURE); post(state); return; } else I2P_LOG(m_log, debug) << "confirmation signature verification succeeded"; Endpoint ep = state->getTheirEndpoint(); PeerState ps(ep, state->getTheirIdentity().getHash()); ps.setCurrentSessionKey(state->getSessionKey()); ps.setCurrentMacKey(state->getMacKey()); std::lock_guard<std::mutex> lock(m_context.peers.getMutex()); m_context.peers.addPeer(std::move(ps)); delState(ep); m_context.ios.post(boost::bind(boost::ref(m_context.establishedSignal), state->getTheirIdentity().getHash(), (state->getDirection() == EstablishmentState::Direction::INBOUND))); }
void VariableTunnelBuildReply::handleMessage(RouterHash const from, I2NP::MessagePtr const msg) { std::shared_ptr<I2NP::VariableTunnelBuildReply> vtbr = std::dynamic_pointer_cast<I2NP::VariableTunnelBuildReply>(msg); I2P_LOG_SCOPED_TAG(m_log, "RouterHash", from); I2P_LOG(m_log, debug) << "received VariableTunnelBuildReply message"; m_ctx.getSignals().invokeTunnelRecordsReceived(vtbr->getMsgId(), vtbr->getRecords()); }
void TunnelData::handleMessage(RouterHash const from, I2NP::MessagePtr const msg) { std::shared_ptr<I2NP::TunnelData> td = std::dynamic_pointer_cast<I2NP::TunnelData>(msg); I2P_LOG_SCOPED_TAG(m_log, "RouterHash", from); I2P_LOG(m_log, debug) << "received TunnelData message"; m_ctx.getSignals().invokeTunnelData(from, td->getTunnelId(), td->getData()); }
void DatabaseSearchReply::handleMessage(RouterHash const from, I2NP::MessagePtr const msg) { std::shared_ptr<I2NP::DatabaseSearchReply> dsr = std::dynamic_pointer_cast<I2NP::DatabaseSearchReply>(msg); I2P_LOG_SCOPED_TAG(m_log, "RouterHash", from); I2P_LOG(m_log, debug) << "received DatabaseSearchReply message"; m_ctx.getSignals().invokeSearchReply(from, dsr->getKey(), dsr->getHashes()); }
void EstablishmentManager::timeoutCallback(const boost::system::error_code& e, EstablishmentStatePtr es) { if(!e) { I2P_LOG_SCOPED_TAG(m_log, "Endpoint", es->getTheirEndpoint()); I2P_LOG(m_log, debug) << "establishment timed out"; es->setState(EstablishmentState::State::FAILURE); post(es); } }
void DatabaseStore::handleMessage(RouterHash const from, I2NP::MessagePtr const msg) { try { std::shared_ptr<I2NP::DatabaseStore> dsm = std::dynamic_pointer_cast<I2NP::DatabaseStore>(msg); I2P_LOG_SCOPED_TAG(m_log, "RouterHash", from); I2P_LOG(m_log, debug) << "received DatabaseStore message"; Botan::Pipe ungzPipe(new Gzip_Decompression); switch(dsm->getDataType()) { case I2NP::DatabaseStore::DataType::ROUTER_INFO: { ungzPipe.start_msg(); ungzPipe.write(dsm->getData()); ungzPipe.end_msg(); unsigned int size = ungzPipe.remaining(); ByteArray inflatedData(size); ungzPipe.read(inflatedData.data(), size); auto begin = inflatedData.cbegin(); RouterInfo ri(begin, inflatedData.cend()); if(ri.verifySignature()) { m_ctx.getDatabase()->setRouterInfo(ri); I2P_LOG(m_log, debug) << "added RouterInfo to DB"; m_ctx.getSignals().invokeDatabaseStore(from, ri.getIdentity().getHash(), true); } else { I2P_LOG(m_log, error) << "RouterInfo verification failed"; } } break; case I2NP::DatabaseStore::DataType::LEASE_SET: I2P_LOG(m_log, debug) << "this is a LeaseSet"; // signal here break; } } catch(Botan::Decoding_Error &e) { I2P_LOG(m_log, error) << "problem decompressing data: " << e.what(); } }