コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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)));
        }
コード例 #3
0
        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());
        }
コード例 #4
0
ファイル: TunnelData.cpp プロジェクト: anastiel/i2pcpp
        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());
        }
コード例 #5
0
        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());
        }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
ファイル: DatabaseStore.cpp プロジェクト: anastiel/i2pcpp
        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();
            }
        }