Fix Socks5.

GitOrigin-RevId: 1a11e4c8c24218ab5fdcb52f695957f30c8109e1
This commit is contained in:
levlam 2018-02-28 23:25:42 +03:00
parent 802860a412
commit 802e7eb8a0
2 changed files with 25 additions and 3 deletions

View File

@ -2798,11 +2798,14 @@ class CliClient final : public Actor {
} else if (op == "sproxy") { } else if (op == "sproxy") {
string server; string server;
string port; string port;
std::tie(server, port) = split(args); string user;
string password;
std::tie(server, args) = split(args);
std::tie(port, args) = split(args);
std::tie(user, password) = split(args);
send_request(make_tl_object<td_api::setProxy>( send_request(make_tl_object<td_api::setProxy>(
make_tl_object<td_api::proxySocks5>(server.empty() ? "162.213.174.36" : server, make_tl_object<td_api::proxySocks5>(server, to_integer<int32>(port), user, password)));
port.empty() ? 13313 : to_integer<int32>(port), "sosouser", "SoSo23")));
} else if (op == "gproxy") { } else if (op == "gproxy") {
send_request(make_tl_object<td_api::getProxy>()); send_request(make_tl_object<td_api::getProxy>());
} else if (op == "SetVerbosity") { } else if (op == "SetVerbosity") {

View File

@ -13,6 +13,9 @@
#include "td/utils/Slice.h" #include "td/utils/Slice.h"
namespace td { namespace td {
static int VERBOSITY_NAME(socks5) = VERBOSITY_NAME(DEBUG);
Socks5::Socks5(SocketFd socket_fd, IPAddress ip_address, string username, string password, Socks5::Socks5(SocketFd socket_fd, IPAddress ip_address, string username, string password,
std::unique_ptr<Callback> callback, ActorShared<> parent) std::unique_ptr<Callback> callback, ActorShared<> parent)
: fd_(std::move(socket_fd)) : fd_(std::move(socket_fd))
@ -22,15 +25,19 @@ Socks5::Socks5(SocketFd socket_fd, IPAddress ip_address, string username, string
, callback_(std::move(callback)) , callback_(std::move(callback))
, parent_(std::move(parent)) { , parent_(std::move(parent)) {
} }
void Socks5::on_error(Status status) { void Socks5::on_error(Status status) {
CHECK(status.is_error()); CHECK(status.is_error());
VLOG(socks5) << "Receive " << status;
if (callback_) { if (callback_) {
callback_->set_result(std::move(status)); callback_->set_result(std::move(status));
callback_.reset(); callback_.reset();
} }
stop(); stop();
} }
void Socks5::tear_down() { void Socks5::tear_down() {
VLOG(socks5) << "Finish to connect to proxy";
unsubscribe(fd_.get_fd()); unsubscribe(fd_.get_fd());
fd_.get_fd().set_observer(nullptr); fd_.get_fd().set_observer(nullptr);
if (callback_) { if (callback_) {
@ -44,12 +51,17 @@ void Socks5::hangup() {
} }
void Socks5::start_up() { void Socks5::start_up() {
VLOG(socks5) << "Begin to connect to proxy";
fd_.get_fd().set_observer(this); fd_.get_fd().set_observer(this);
subscribe(fd_.get_fd()); subscribe(fd_.get_fd());
set_timeout_in(10); set_timeout_in(10);
if (can_write(fd_)) {
loop();
}
} }
void Socks5::send_greeting() { void Socks5::send_greeting() {
VLOG(socks5) << "Send greeting to proxy";
CHECK(state_ == State::SendGreeting); CHECK(state_ == State::SendGreeting);
state_ = State::WaitGreetingResponse; state_ = State::WaitGreetingResponse;
@ -68,6 +80,7 @@ void Socks5::send_greeting() {
Status Socks5::wait_greeting_response() { Status Socks5::wait_greeting_response() {
auto &buf = fd_.input_buffer(); auto &buf = fd_.input_buffer();
VLOG(socks5) << "Receive greeting response of size " << buf.size();
if (buf.size() < 2) { if (buf.size() < 2) {
return Status::OK(); return Status::OK();
} }
@ -89,6 +102,7 @@ Status Socks5::wait_greeting_response() {
} }
Status Socks5::send_username_password() { Status Socks5::send_username_password() {
VLOG(socks5) << "Send username and password";
if (username_.size() >= 128) { if (username_.size() >= 128) {
return Status::Error("Username is too long"); return Status::Error("Username is too long");
} }
@ -110,6 +124,7 @@ Status Socks5::send_username_password() {
Status Socks5::wait_password_response() { Status Socks5::wait_password_response() {
auto &buf = fd_.input_buffer(); auto &buf = fd_.input_buffer();
VLOG(socks5) << "Receive password response of size " << buf.size();
if (buf.size() < 2) { if (buf.size() < 2) {
return Status::OK(); return Status::OK();
} }
@ -128,6 +143,7 @@ Status Socks5::wait_password_response() {
} }
void Socks5::send_ip_address() { void Socks5::send_ip_address() {
VLOG(socks5) << "Send IP address";
CHECK(state_ == State::SendIpAddress); CHECK(state_ == State::SendIpAddress);
callback_->on_connected(); callback_->on_connected();
string request; string request;
@ -155,6 +171,7 @@ void Socks5::send_ip_address() {
Status Socks5::wait_ip_address_response() { Status Socks5::wait_ip_address_response() {
CHECK(state_ == State::WaitIpAddressResponse); CHECK(state_ == State::WaitIpAddressResponse);
auto it = fd_.input_buffer().clone(); auto it = fd_.input_buffer().clone();
VLOG(socks5) << "Receive IP address response of size " << it.size();
if (it.size() < 4) { if (it.size() < 4) {
return Status::OK(); return Status::OK();
} }
@ -224,7 +241,9 @@ void Socks5::loop() {
on_error(Status::Error("Connection closed")); on_error(Status::Error("Connection closed"));
} }
} }
void Socks5::timeout_expired() { void Socks5::timeout_expired() {
on_error(Status::Error("Timeout expired")); on_error(Status::Error("Timeout expired"));
} }
} // namespace td } // namespace td