/* */ #include "DHTAnnouncePeerMessage.h" #include #include "DHTNode.h" #include "DHTRoutingTable.h" #include "DHTMessageFactory.h" #include "DHTMessageDispatcher.h" #include "DHTMessageCallback.h" #include "util.h" #include "DHTPeerAnnounceStorage.h" #include "DHTTokenTracker.h" #include "DlAbortEx.h" #include "BtConstants.h" #include "StringFormat.h" #include "bencode.h" #include "a2functional.h" namespace aria2 { const std::string DHTAnnouncePeerMessage::ANNOUNCE_PEER("announce_peer"); const std::string DHTAnnouncePeerMessage::INFO_HASH("info_hash"); const std::string DHTAnnouncePeerMessage::PORT("port"); const std::string DHTAnnouncePeerMessage::TOKEN("token"); DHTAnnouncePeerMessage::DHTAnnouncePeerMessage(const SharedHandle& localNode, const SharedHandle& remoteNode, const unsigned char* infoHash, uint16_t tcpPort, const std::string& token, const std::string& transactionID): DHTQueryMessage(localNode, remoteNode, transactionID), _token(token), _tcpPort(tcpPort) { memcpy(_infoHash, infoHash, DHT_ID_LENGTH); } DHTAnnouncePeerMessage::~DHTAnnouncePeerMessage() {} void DHTAnnouncePeerMessage::doReceivedAction() { _peerAnnounceStorage->addPeerAnnounce(_infoHash, _remoteNode->getIPAddress(), _tcpPort); SharedHandle reply = _factory->createAnnouncePeerReplyMessage(_remoteNode, _transactionID); _dispatcher->addMessageToQueue(reply); } BDE DHTAnnouncePeerMessage::getArgument() { BDE aDict = BDE::dict(); aDict[DHTMessage::ID] = BDE(_localNode->getID(), DHT_ID_LENGTH); aDict[INFO_HASH] = BDE(_infoHash, DHT_ID_LENGTH); aDict[PORT] = _tcpPort; aDict[TOKEN] = _token; return aDict; } std::string DHTAnnouncePeerMessage::getMessageType() const { return ANNOUNCE_PEER; } void DHTAnnouncePeerMessage::validate() const { if(!_tokenTracker->validateToken(_token, _infoHash, _remoteNode->getIPAddress(), _remoteNode->getPort())) { throw DL_ABORT_EX (StringFormat("Invalid token=%s from %s:%u", util::toHex(_token).c_str(), _remoteNode->getIPAddress().c_str(), _remoteNode->getPort()).str()); } } void DHTAnnouncePeerMessage::setPeerAnnounceStorage(const WeakHandle& storage) { _peerAnnounceStorage = storage; } void DHTAnnouncePeerMessage::setTokenTracker(const WeakHandle& tokenTracker) { _tokenTracker = tokenTracker; } std::string DHTAnnouncePeerMessage::toStringOptional() const { return strconcat("token=", util::toHex(_token), ", info_hash=", util::toHex(_infoHash, INFO_HASH_LENGTH), ", tcpPort=", util::uitos(_tcpPort)); } } // namespace aria2