Add bt-udp-socks-proxy option with its utilities

pull/1857/head
myl7 2021-12-05 19:36:10 +08:00
parent a838cdde0a
commit 2806da3298
No known key found for this signature in database
GPG Key ID: 04F1013B67177C88
9 changed files with 115 additions and 3 deletions

View File

@ -141,15 +141,23 @@ DHTSetup::setup(DownloadEngine* e, int family)
A2_LOG_DEBUG(fmt("Initialized local node ID=%s",
util::toHex(localNode->getID(), DHT_ID_LENGTH).c_str()));
{
if (!connection->startProxy("127.0.0.1", 8000, "", "",
const std::string& user =
e->getOption()->get(PREF_BT_UDP_SOCKS_PROXY_USER);
const std::string& passwd =
e->getOption()->get(PREF_BT_UDP_SOCKS_PROXY_PASSWD);
uri::UriStruct us;
uri::parse(us, e->getOption()->get(PREF_BT_UDP_SOCKS_PROXY));
const std::string& host = us.host;
uint16_t port = us.port;
if (!connection->startProxy(host, port, user, passwd,
localNode->getIPAddress(),
localNode->getPort())) {
throw DL_ABORT_EX("Error occurred while connecting to SOCKS5 relay "
"server for UDP proxy for DHT and UDP trackers");
}
A2_LOG_DEBUG(fmt("Connected to SOCKS5 relay server %s:%u for UDP proxy",
host, port));
}
A2_LOG_DEBUG(fmt("Connected to SOCKS5 relay server %s:%u for UDP proxy",
"127.0.0.1", 8000));
auto tracker = std::make_shared<DHTMessageTracker>();
auto routingTable = make_unique<DHTRoutingTable>(localNode);
auto factory = make_unique<DHTMessageFactoryImpl>(family);

View File

@ -88,6 +88,9 @@ uint16_t getDefaultPort(const std::string& protocol)
else if (protocol == "sftp") {
return 22;
}
else if (protocol == "socks") {
return 1080;
}
else {
return 0;
}

View File

@ -1371,6 +1371,37 @@ std::vector<OptionHandler*> OptionHandlerFactory::createOptionHandlers()
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
{
OptionHandler* op(new SocksProxyOptionHandler(
PREF_BT_UDP_SOCKS_PROXY, TEXT_BT_UDP_SOCKS_PROXY, NO_DEFAULT_VALUE));
op->addTag(TAG_BITTORRENT);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
{
OptionHandler* op(new DefaultOptionHandler(PREF_BT_UDP_SOCKS_PROXY_PASSWD,
TEXT_BT_UDP_SOCKS_PROXY_PASSWD,
NO_DEFAULT_VALUE));
op->addTag(TAG_BITTORRENT);
op->setEraseAfterParse(true);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
{
OptionHandler* op(new DefaultOptionHandler(PREF_BT_UDP_SOCKS_PROXY_USER,
TEXT_BT_UDP_SOCKS_PROXY_USER,
NO_DEFAULT_VALUE));
op->addTag(TAG_BITTORRENT);
op->setEraseAfterParse(true);
op->setInitialOption(true);
op->setChangeGlobalOption(true);
op->setChangeOptionForReserved(true);
handlers.push_back(op);
}
{
OptionHandler* op(new HttpProxyOptionHandler(PREF_ALL_PROXY, TEXT_ALL_PROXY,
NO_DEFAULT_VALUE));

View File

@ -529,6 +529,48 @@ std::string HttpProxyOptionHandler::createPossibleValuesString() const
return "[http://][USER:PASSWORD@]HOST[:PORT]";
}
SocksProxyOptionHandler::SocksProxyOptionHandler(
PrefPtr pref, const char* description, const std::string& defaultValue,
char shortName)
: AbstractOptionHandler(pref, description, defaultValue,
OptionHandler::REQ_ARG, shortName),
proxyUserPref_(option::k2p(std::string(pref->k) + "-user")),
proxyPasswdPref_(option::k2p(std::string(pref->k) + "-passwd"))
{
}
SocksProxyOptionHandler::~SocksProxyOptionHandler() = default;
void SocksProxyOptionHandler::parseArg(Option& option,
const std::string& optarg) const
{
if (optarg.empty()) {
option.put(pref_, optarg);
}
else {
std::string uri;
if (util::startsWith(optarg, "socks://") ||
util::startsWith(optarg, "socks5://")) {
uri = optarg;
}
else {
uri = "socks://";
uri += optarg;
}
uri::UriStruct us;
if (!uri::parse(us, uri)) {
throw DL_ABORT_EX(_("unrecognized proxy format"));
}
us.protocol = "socks";
option.put(pref_, uri::construct(us));
}
}
std::string SocksProxyOptionHandler::createPossibleValuesString() const
{
return "[socks[5]://][USER:PASSWORD@]HOST[:PORT]";
}
LocalFilePathOptionHandler::LocalFilePathOptionHandler(
PrefPtr pref, const char* description, const std::string& defaultValue,
bool acceptStdin, char shortName, bool mustExist,

View File

@ -230,6 +230,20 @@ public:
virtual std::string createPossibleValuesString() const CXX11_OVERRIDE;
};
class SocksProxyOptionHandler : public AbstractOptionHandler {
private:
PrefPtr proxyUserPref_;
PrefPtr proxyPasswdPref_;
public:
SocksProxyOptionHandler(PrefPtr pref, const char* description,
const std::string& defaultValue, char shortName = 0);
virtual ~SocksProxyOptionHandler();
virtual void parseArg(Option& option,
const std::string& optarg) const CXX11_OVERRIDE;
virtual std::string createPossibleValuesString() const CXX11_OVERRIDE;
};
class LocalFilePathOptionHandler : public AbstractOptionHandler {
private:
std::string possibleValuesString_;

View File

@ -263,6 +263,7 @@ error_code::Value option_processing(Option& op, bool standalone,
overrideWithEnv(*confOption, oparser, PREF_HTTP_PROXY, "http_proxy");
overrideWithEnv(*confOption, oparser, PREF_HTTPS_PROXY, "https_proxy");
overrideWithEnv(*confOption, oparser, PREF_FTP_PROXY, "ftp_proxy");
overrideWithEnv(*confOption, oparser, PREF_BT_UDP_SOCKS_PROXY, "bt_udp_sokcs_proxy");
overrideWithEnv(*confOption, oparser, PREF_ALL_PROXY, "all_proxy");
overrideWithEnv(*confOption, oparser, PREF_NO_PROXY, "no_proxy");
if (!standalone) {

View File

@ -437,6 +437,7 @@ PrefPtr PREF_HTTP_PROXY = makePref("http-proxy");
PrefPtr PREF_HTTPS_PROXY = makePref("https-proxy");
PrefPtr PREF_FTP_PROXY = makePref("ftp-proxy");
PrefPtr PREF_ALL_PROXY = makePref("all-proxy");
PrefPtr PREF_BT_UDP_SOCKS_PROXY = makePref("bt-udp-socks-proxy");
// values: comma separated hostname or domain
PrefPtr PREF_NO_PROXY = makePref("no-proxy");
// values: get | tunnel
@ -447,6 +448,8 @@ PrefPtr PREF_HTTPS_PROXY_USER = makePref("https-proxy-user");
PrefPtr PREF_HTTPS_PROXY_PASSWD = makePref("https-proxy-passwd");
PrefPtr PREF_FTP_PROXY_USER = makePref("ftp-proxy-user");
PrefPtr PREF_FTP_PROXY_PASSWD = makePref("ftp-proxy-passwd");
PrefPtr PREF_BT_UDP_SOCKS_PROXY_USER = makePref("bt-udp-socks-proxy-user");
PrefPtr PREF_BT_UDP_SOCKS_PROXY_PASSWD = makePref("bt-udp-socks-proxy-passwd");
PrefPtr PREF_ALL_PROXY_USER = makePref("all-proxy-user");
PrefPtr PREF_ALL_PROXY_PASSWD = makePref("all-proxy-passwd");

View File

@ -388,6 +388,7 @@ extern PrefPtr PREF_CONTENT_DISPOSITION_DEFAULT_UTF8;
extern PrefPtr PREF_HTTP_PROXY;
extern PrefPtr PREF_HTTPS_PROXY;
extern PrefPtr PREF_FTP_PROXY;
extern PrefPtr PREF_BT_UDP_SOCKS_PROXY;
extern PrefPtr PREF_ALL_PROXY;
// values: comma separated hostname or domain
extern PrefPtr PREF_NO_PROXY;
@ -399,6 +400,8 @@ extern PrefPtr PREF_HTTPS_PROXY_USER;
extern PrefPtr PREF_HTTPS_PROXY_PASSWD;
extern PrefPtr PREF_FTP_PROXY_USER;
extern PrefPtr PREF_FTP_PROXY_PASSWD;
extern PrefPtr PREF_BT_UDP_SOCKS_PROXY_USER;
extern PrefPtr PREF_BT_UDP_SOCKS_PROXY_PASSWD;
extern PrefPtr PREF_ALL_PROXY_USER;
extern PrefPtr PREF_ALL_PROXY_PASSWD;

View File

@ -83,6 +83,9 @@
" previously defined proxy, use \"\".\n" \
" See also the --all-proxy option.\n" \
" This affects all ftp downloads.")
#define TEXT_BT_UDP_SOCKS_PROXY \
_(" --bt-udp-socks-proxy=PROXY Use a SOCKS5 proxy server for UDP in BitTorrent.\n"\
" This affects DHT and connecting UDP trackers in BitTorrent.")
#define TEXT_ALL_PROXY \
_(" --all-proxy=PROXY Use a proxy server for all protocols. To override\n" \
" a previously defined proxy, use \"\".\n" \
@ -690,6 +693,10 @@
_(" --ftp-proxy-user=USER Set user for --ftp-proxy.")
#define TEXT_FTP_PROXY_PASSWD \
_(" --ftp-proxy-passwd=PASSWD Set password for --ftp-proxy.")
#define TEXT_BT_UDP_SOCKS_PROXY_USER \
_(" --bt-udp-socks-proxy-user=USER Set user for --http-proxy.")
#define TEXT_BT_UDP_SOCKS_PROXY_PASSWD \
_(" --bt-udp-socks-proxy-passwd=PASSWD Set password for --http-proxy.")
#define TEXT_REMOVE_CONTROL_FILE \
_(" --remove-control-file[=true|false] Remove control file before download. Using\n" \
" with --allow-overwrite=true, download always\n" \