diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-02-18 13:41:58 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-02-18 13:41:58 +0000 |
| commit | 20cd2e52468f96f5aa0558aa30306e6abc6fbfcd (patch) | |
| tree | 41be8349f5db162356c0fd316b751d5bda57e647 /src | |
| parent | c37539eb25c6a85534fe7a73af2dd9ebccad7f49 (diff) | |
2008-02-18 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added --bt-min-crypto-level and --bt-require-crypto options.
* src/OptionHandlerFactory.cc
* src/MSEHandshake.cc
* src/HelpItemFactory.cc
* src/option_processing.cc
* src/ReceiverMSEHandshakeCommand.cc
* src/prefs.h
* src/DefaultBtAnnounce.cc
* src/InitiatorMSEHandshakeCommand.cc
* src/usage_text.h
* test/MSEHandshakeTest.cc
Diffstat (limited to 'src')
| -rw-r--r-- | src/DefaultBtAnnounce.cc | 7 | ||||
| -rw-r--r-- | src/HelpItemFactory.cc | 10 | ||||
| -rw-r--r-- | src/InitiatorMSEHandshakeCommand.cc | 35 | ||||
| -rw-r--r-- | src/MSEHandshake.cc | 19 | ||||
| -rw-r--r-- | src/OptionHandlerFactory.cc | 2 | ||||
| -rw-r--r-- | src/ReceiverMSEHandshakeCommand.cc | 3 | ||||
| -rw-r--r-- | src/option_processing.cc | 10 | ||||
| -rw-r--r-- | src/prefs.h | 6 | ||||
| -rw-r--r-- | src/usage_text.h | 9 |
9 files changed, 86 insertions, 15 deletions
diff --git a/src/DefaultBtAnnounce.cc b/src/DefaultBtAnnounce.cc index a804a476..11ae3a88 100644 --- a/src/DefaultBtAnnounce.cc +++ b/src/DefaultBtAnnounce.cc @@ -51,6 +51,7 @@ #include "BtRuntime.h" #include "PeerStorage.h" #include "Peer.h" +#include "Option.h" namespace aria2 { @@ -160,7 +161,11 @@ std::string DefaultBtAnnounce::getAnnounceUrl() { url += std::string("&")+"trackerid="+Util::torrentUrlencode((const unsigned char*)trackerId.c_str(), trackerId.size()); } - url += "&supportcrypto=1"; + if(option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) { + url += "&requirecrypto=1"; + } else { + url += "&supportcrypto=1"; + } return url; } diff --git a/src/HelpItemFactory.cc b/src/HelpItemFactory.cc index f94327ca..5d922287 100644 --- a/src/HelpItemFactory.cc +++ b/src/HelpItemFactory.cc @@ -351,6 +351,16 @@ TagContainerHandle HelpItemFactory::createHelpItems() item->addTag(TAG_BITTORRENT); tc->addItem(item); } + { + HelpItemHandle item = new HelpItem(PREF_BT_MIN_CRYPTO_LEVEL, TEXT_BT_MIN_CRYPTO_LEVEL, V_PLAIN); + item->addTag(TAG_BITTORRENT); + tc->addItem(item); + } + { + HelpItemHandle item = new HelpItem(PREF_BT_REQUIRE_CRYPTO, TEXT_BT_REQUIRE_CRYPTO, V_FALSE); + item->addTag(TAG_BITTORRENT); + tc->addItem(item); + } #endif // ENABLE_BITTORRENT #ifdef ENABLE_METALINK { diff --git a/src/InitiatorMSEHandshakeCommand.cc b/src/InitiatorMSEHandshakeCommand.cc index 79c11a24..beb3dfae 100644 --- a/src/InitiatorMSEHandshakeCommand.cc +++ b/src/InitiatorMSEHandshakeCommand.cc @@ -145,17 +145,34 @@ bool InitiatorMSEHandshakeCommand::executeInternal() { bool InitiatorMSEHandshakeCommand::prepareForNextPeer(int32_t wait) { - // try legacy BitTorrent handshake if preference allows it. - // TODO preference is not created yet. - logger->info("CUID#%d - Retry using legacy BitTorrent handshake.", cuid); - Command* command = - new PeerInitiateConnectionCommand(cuid, _requestGroup, peer, e, btContext, - false); - e->commands.push_back(command); - return true; + if(e->option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) { + logger->info("CUID#%d - Establishing connection using legacy BitTorrent handshake is disabled by preference.", cuid); + if(peerStorage->isPeerAvailable() && btRuntime->lessThanEqMinPeer()) { + SharedHandle<Peer> peer = peerStorage->getUnusedPeer(); + peer->usedBy(CUIDCounterSingletonHolder::instance()->newID()); + Command* command = + new PeerInitiateConnectionCommand(peer->usedBy(), _requestGroup, peer, e, + btContext); + e->commands.push_back(command); + } + return true; + } else { + // try legacy BitTorrent handshake + logger->info("CUID#%d - Retry using legacy BitTorrent handshake.", cuid); + Command* command = + new PeerInitiateConnectionCommand(cuid, _requestGroup, peer, e, btContext, + false); + e->commands.push_back(command); + return true; + } } -void InitiatorMSEHandshakeCommand::onAbort(Exception* ex) {} +void InitiatorMSEHandshakeCommand::onAbort(Exception* ex) +{ + if(e->option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) { + peerStorage->returnPeer(peer); + } +} bool InitiatorMSEHandshakeCommand::exitBeforeExecute() { diff --git a/src/MSEHandshake.cc b/src/MSEHandshake.cc index 63752643..79799033 100644 --- a/src/MSEHandshake.cc +++ b/src/MSEHandshake.cc @@ -48,6 +48,8 @@ #include "Util.h" #include "BtRegistry.h" #include "BtContext.h" +#include "prefs.h" +#include "Option.h" #include <cstring> #include <cassert> @@ -256,7 +258,10 @@ void MSEHandshake::sendInitiatorStep2() // crypto_provide unsigned char cryptoProvide[4]; memset(cryptoProvide, 0, sizeof(cryptoProvide)); - cryptoProvide[3] = CRYPTO_PLAIN_TEXT | CRYPTO_ARC4; + if(_option->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) { + cryptoProvide[3] = CRYPTO_PLAIN_TEXT; + } + cryptoProvide[3] |= CRYPTO_ARC4; memcpy(buffer+8, cryptoProvide, sizeof(cryptoProvide)); // len(padC) @@ -328,7 +333,8 @@ bool MSEHandshake::receiveInitiatorCryptoSelectAndPadDLength() unsigned char cryptoSelect[CRYPTO_BITFIELD_LENGTH]; _decryptor->decrypt(cryptoSelect, sizeof(cryptoSelect), rbufptr, sizeof(cryptoSelect)); - if(cryptoSelect[3]&CRYPTO_PLAIN_TEXT) { + if(cryptoSelect[3]&CRYPTO_PLAIN_TEXT && + _option->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) { _logger->debug("CUID#%d - peer prefers plaintext.", _cuid); _negotiatedCryptoType = CRYPTO_PLAIN_TEXT; } @@ -440,11 +446,11 @@ bool MSEHandshake::receiveReceiverHashAndPadCLength() rbufptr, sizeof(cryptoProvide)); // TODO choose the crypto type based on the preference. // For now, choose ARC4. - if(cryptoProvide[3]&CRYPTO_PLAIN_TEXT) { + if(cryptoProvide[3]&CRYPTO_PLAIN_TEXT && + _option->get(PREF_BT_MIN_CRYPTO_LEVEL) == V_PLAIN) { _logger->debug("CUID#%d - peer provides plaintext.", _cuid); _negotiatedCryptoType = CRYPTO_PLAIN_TEXT; - } - if(cryptoProvide[3]&CRYPTO_ARC4) { + } else if(cryptoProvide[3]&CRYPTO_ARC4) { _logger->debug("CUID#%d - peer provides ARC4.", _cuid); _negotiatedCryptoType = CRYPTO_ARC4; } @@ -476,6 +482,9 @@ bool MSEHandshake::receiveReceiverIALength() bool MSEHandshake::receiveReceiverIA() { + if(_iaLength == 0) { + return true; + } int32_t r = _iaLength-_rbufLength; if(r > receiveNBytes(r)) { return false; diff --git a/src/OptionHandlerFactory.cc b/src/OptionHandlerFactory.cc index 13aa5b79..f01fbf3c 100644 --- a/src/OptionHandlerFactory.cc +++ b/src/OptionHandlerFactory.cc @@ -119,6 +119,8 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers() PREF_DHT_ENTRY_POINT_HOST, PREF_DHT_ENTRY_POINT_PORT)); handlers.push_back(new NumberOptionHandler(PREF_STOP, 0, 35000000)); + handlers.push_back(new ParameterOptionHandler(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN, V_ARC4)); + handlers.push_back(new BooleanOptionHandler(PREF_BT_REQUIRE_CRYPTO)); return handlers; } diff --git a/src/ReceiverMSEHandshakeCommand.cc b/src/ReceiverMSEHandshakeCommand.cc index 89cbcd10..01e4ff1e 100644 --- a/src/ReceiverMSEHandshakeCommand.cc +++ b/src/ReceiverMSEHandshakeCommand.cc @@ -86,6 +86,9 @@ bool ReceiverMSEHandshakeCommand::executeInternal() _sequence = RECEIVER_WAIT_KEY; break; case MSEHandshake::HANDSHAKE_LEGACY: { + if(e->option->getAsBool(PREF_BT_REQUIRE_CRYPTO)) { + throw new DlAbortEx("The legacy BitTorrent handshake is not acceptable by the preference."); + } Command* c = new PeerReceiveHandshakeCommand(cuid, peer, e, socket); e->commands.push_back(c); return true; diff --git a/src/option_processing.cc b/src/option_processing.cc index 165f7a88..0f4b5aff 100644 --- a/src/option_processing.cc +++ b/src/option_processing.cc @@ -140,6 +140,8 @@ Option* option_processing(int argc, char* const argv[]) op->put(PREF_ENABLE_DHT, V_FALSE); op->put(PREF_DHT_LISTEN_PORT, "6881-6999"); op->put(PREF_DHT_FILE_PATH, Util::getHomeDir()+"/.aria2/dht.dat"); + op->put(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN); + op->put(PREF_BT_REQUIRE_CRYPTO, V_FALSE); // following options are not parsed by OptionHandler and not stored in Option. bool noConf = false; @@ -221,6 +223,8 @@ Option* option_processing(int argc, char* const argv[]) { "enable-dht", optional_argument, &lopt, 27 }, { "dht-listen-port", required_argument, &lopt, 28 }, { "dht-entry-point", required_argument, &lopt, 29 }, + { PREF_BT_MIN_CRYPTO_LEVEL, required_argument, &lopt, 30 }, + { PREF_BT_REQUIRE_CRYPTO, required_argument, &lopt, 31 }, #endif // ENABLE_BITTORRENT #ifdef ENABLE_METALINK { "metalink-file", required_argument, NULL, 'M' }, @@ -325,6 +329,12 @@ Option* option_processing(int argc, char* const argv[]) case 29: cmdstream << PREF_DHT_ENTRY_POINT << "=" << optarg << "\n"; break; + case 30: + cmdstream << PREF_BT_MIN_CRYPTO_LEVEL << "=" << optarg << "\n"; + break; + case 31: + cmdstream << PREF_BT_REQUIRE_CRYPTO << "=" << optarg << "\n"; + break; case 100: cmdstream << PREF_METALINK_VERSION << "=" << optarg << "\n"; break; diff --git a/src/prefs.h b/src/prefs.h index 06fe79f6..88c4fe0f 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -228,6 +228,12 @@ #define PREF_DHT_ENTRY_POINT "dht-entry-point" // values: a string #define PREF_DHT_FILE_PATH "dht-file-path" +// values: plain | arc4 +#define PREF_BT_MIN_CRYPTO_LEVEL "bt-min-crypto-level" +# define V_PLAIN "plain" +# define V_ARC4 "arc4" +// values:: true | false +#define PREF_BT_REQUIRE_CRYPTO "bt-require-crypto" /** * Metalink related preferences diff --git a/src/usage_text.h b/src/usage_text.h index 221cc06e..fae24579 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -267,6 +267,15 @@ _(" --dht-listen-port... Set UDP listening port for DHT.\n"\ #define TEXT_DHT_ENTRY_POINT \ _(" --dht-entry-point=HOST:PORT Set host and port as an entry point to DHT\n"\ " network.") +#define TEXT_BT_MIN_CRYPTO_LEVEL \ +_(" --bt-min-crypto-level=plain|arc4 Set minimum level of encryption method.\n"\ + " If several encryption methods are provided by a\n"\ + " peer, aria2 chooses a lowest one which satisfies\n"\ + " given level.") +#define TEXT_BT_REQUIRE_CRYPTO \ +_(" --bt-require-crypto=true|false If true is given, aria2 doesn't accept and\n"\ + " establish connection with legacy BitTorrent\n"\ + " handshake. Thus always use Obfuscation handshake.") #define TEXT_METALINK_FILE \ _(" -M, --metalink-file=METALINK_FILE The file path to the .metalink file.") #define TEXT_METALINK_SERVERS \ |
