Skip to content

Commit

Permalink
Реализация поддержки socks5 сервера
Browse files Browse the repository at this point in the history
  • Loading branch information
anyks committed Oct 3, 2021
1 parent 8fadf82 commit cb97760
Show file tree
Hide file tree
Showing 7 changed files with 379 additions and 35 deletions.
4 changes: 2 additions & 2 deletions include/core/http.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -340,8 +340,8 @@ namespace awh {
*/
bool isAlive() const noexcept;
/**
* isHandshake Метод получения флага рукопожатия
* @return флаг получения рукопожатия
* isHandshake Метод проверки рукопожатия
* @return проверка рукопожатия
*/
virtual bool isHandshake() noexcept;
/**
Expand Down
28 changes: 24 additions & 4 deletions include/core/socks5.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,10 @@ namespace awh {
*/
enum class state_t : uint8_t {
AUTH, // Режим ожидания прохождения аутентификации
VERIFY, // Режим выполнения проверки запрошенных данных клиентом
METHOD, // Режим ожидания получения метода
BROKEN, // Режим бракованных данных
REQUEST, // Режим ожидания получения запроса
RESPONSE, // Режим ожидания получения ответа
HANDSHAKE // Режим выполненного рукопожатия
};
Expand Down Expand Up @@ -145,18 +147,31 @@ namespace awh {
*/
ResAuth() : ver(0x0), status(0x0) {}
} __attribute__((packed)) resAuth_t;
/**
* Req Структура запроса
*/
typedef struct Req {
uint8_t ver; // Версия прокси-протокола
uint8_t cmd; // Код запроса у прокси-сервера
uint8_t rsv; // Зарезервированный октет
uint8_t atyp; // Тип подключения
/**
* Req Конструктор
*/
Req() : ver(0x0), cmd(0x0), rsv(0x0), atyp(0x0) {}
} __attribute__((packed)) req_t;
/**
* Res Структура ответа
*/
typedef struct Resp {
typedef struct Res {
uint8_t ver; // Версия прокси-протокола
uint8_t rep; // Код ответа прокси-сервера
uint8_t rsv; // Зарезервированный октет
uint8_t atyp; // Тип подключения
/**
* Resp Конструктор
*/
Resp() : ver(0x0), rep(0x0), rsv(0x0), atyp(0x0) {}
Res() : ver(0x0), rep(0x0), rsv(0x0), atyp(0x0) {}
} __attribute__((packed)) res_t;
/**
* IP Структура ip адреса сервера
Expand Down Expand Up @@ -232,8 +247,13 @@ namespace awh {
*/
bool isEnd() const noexcept;
/**
* isHandshake Метод получения флага рукопожатия
* @return флаг получения рукопожатия
* isVerify Метод проверки запроса клиента
* @return результат проверки
*/
bool isVerify() const noexcept;
/**
* isHandshake Метод проверки рукопожатия
* @return проверка рукопожатия
*/
bool isHandshake() const noexcept;
public:
Expand Down
31 changes: 25 additions & 6 deletions include/server/socks5.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,23 +31,42 @@ namespace awh {
* Socks5Server Класс сервера для работы с socks5 прокси-сервером
*/
typedef class Socks5Server : public socks5_t {
public:
/**
* Server Структура параметров запрашиваемого сервера
*/
typedef struct Server {
int family; // Тип хоста сервера IPv4/IPv6
u_int port; // Порт сервера
string host; // Хост сервера
/**
* Server Конструктор
*/
Server() : family(AF_INET), port(80), host("") {}
} serv_t;
private:
// Параметры запрашиваемого сервера
serv_t server;
private:
// Внешняя функция проверки авторизации
function <bool (const string &, const string &)> authFn = nullptr;
public:
/**
* resCmd Метод получения бинарного буфера ответа
* @param rep код ответа сервера
*/
void resCmd() const noexcept;
/**
* resAuth Метод получения бинарного буфера ответа на авторизацию клиента
*/
void resAuth() const noexcept;
void resCmd(const uint8_t rep) const noexcept;
/**
* resMethod Метод получения бинарного буфера выбора метода подключения
* @param methods методы авторизаций выбранныйе пользователем
*/
void resMethod(const vector <method_t> & methods) const noexcept;
void resMethod(const vector <uint8_t> & methods) const noexcept;
/**
* resAuth Метод получения бинарного буфера ответа на авторизацию клиента
* @param login логин пользователя
* @param password пароль пользователя
*/
void resAuth(const string & login, const string & password) const noexcept;
public:
/**
* parse Метод парсинга входящих данных
Expand Down
12 changes: 6 additions & 6 deletions src/client/socks5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,15 +190,15 @@ void awh::Socks5Client::parse(const char * buffer, const size_t size) noexcept {
// Если данных достаточно для получения ответа
if(size > sizeof(res_t)){
// Создаём объект данных ответа
res_t resp;
res_t res;
// Выполняем чтение данных
memcpy(&resp, buffer, sizeof(resp));
memcpy(&res, buffer, sizeof(res));
// Если версия протокола соответствует
if(resp.ver == (uint8_t) VER){
if(res.ver == (uint8_t) VER){
// Если рукопожатие выполнено
if(resp.rep == (uint8_t) rep_t::SUCCESS){
if(res.rep == (uint8_t) rep_t::SUCCESS){
// Определяем тип адреса
switch(resp.atyp){
switch(res.atyp){
// Получаем адрес IPv4
case (uint8_t) atyp_t::IPv4: {
// Если буфер пришел достаточного размера
Expand Down Expand Up @@ -268,7 +268,7 @@ void awh::Socks5Client::parse(const char * buffer, const size_t size) noexcept {
// Если авторизация не пройдена
} else {
// Устанавливаем код сообщения
this->code = resp.rep;
this->code = res.rep;
// Устанавливаем статус ошибки
this->state = state_t::BROKEN;
}
Expand Down
4 changes: 2 additions & 2 deletions src/core/http.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -709,8 +709,8 @@ bool awh::Http::isAlive() const noexcept {
return result;
}
/**
* isHandshake Метод получения флага рукопожатия
* @return флаг получения рукопожатия
* isHandshake Метод проверки рукопожатия
* @return проверка рукопожатия
*/
bool awh::Http::isHandshake() noexcept {
// Выполняем проверку на удачное рукопожатие
Expand Down
18 changes: 15 additions & 3 deletions src/core/socks5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,11 +159,23 @@ u_short awh::Socks5::setOctet(const uint8_t octet, const u_short offset) const n
*/
bool awh::Socks5::isEnd() const noexcept {
// Выполняем проверку завершения работы
return ((this->state == state_t::HANDSHAKE) || (this->state == state_t::BROKEN));
return (
(this->state == state_t::BROKEN) ||
(this->state == state_t::VERIFY) ||
(this->state == state_t::HANDSHAKE)
);
}
/**
* isHandshake Метод получения флага рукопожатия
* @return флаг получения рукопожатия
* isVerify Метод проверки запроса клиента
* @return результат проверки
*/
bool awh::Socks5::isVerify() const noexcept {
// Выполняем проверку запроса клиента
return (this->state == state_t::VERIFY);
}
/**
* isHandshake Метод проверки рукопожатия
* @return проверка рукопожатия
*/
bool awh::Socks5::isHandshake() const noexcept{
// Выполняем проверку рукопожатия
Expand Down
Loading

0 comments on commit cb97760

Please sign in to comment.