/* */ #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, getRemoteNode()->getIPAddress(), _tcpPort); SharedHandle reply = getMessageFactory()->createAnnouncePeerReplyMessage (getRemoteNode(), getTransactionID()); getMessageDispatcher()->addMessageToQueue(reply); } BDE DHTAnnouncePeerMessage::getArgument() { BDE aDict = BDE::dict(); aDict[DHTMessage::ID] = BDE(getLocalNode()->getID(), DHT_ID_LENGTH); aDict[INFO_HASH] = BDE(_infoHash, DHT_ID_LENGTH); aDict[PORT] = _tcpPort; aDict[TOKEN] = _token; return aDict; } const std::string& DHTAnnouncePeerMessage::getMessageType() const { return ANNOUNCE_PEER; } void DHTAnnouncePeerMessage::validate() const { if(!_tokenTracker->validateToken(_token, _infoHash, getRemoteNode()->getIPAddress(), getRemoteNode()->getPort())) { throw DL_ABORT_EX (StringFormat("Invalid token=%s from %s:%u", util::toHex(_token).c_str(), getRemoteNode()->getIPAddress().c_str(), getRemoteNode()->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