Go to the documentation of this file.
49 #define UP_TYPE_SOCKS "SOCKS Proxy"
90 volatile int *signal_received)
109 "SOCKS username and/or password exceeds 255 characters. "
110 "Authentication not possible.");
114 int sret = snprintf(to_send,
sizeof(to_send),
"\x01%c%s%c%s",
117 ASSERT(sret <=
sizeof(to_send));
119 size = send(sd, to_send, strlen(to_send),
MSG_NOSIGNAL);
121 if (size != strlen(to_send))
140 status = select(sd + 1, &reads, NULL, NULL, &tv);
143 if (*signal_received)
177 if (buf[0] != 5 && buf[1] != 0)
179 msg(
D_LINK_ERRORS,
"socks_username_password_auth: server refused the authentication");
194 volatile int *signal_received)
201 char method_sel[3] = { 0x05, 0x01, 0x00 };
204 method_sel[2] = 0x02;
207 size = send(sd, method_sel,
sizeof(method_sel),
MSG_NOSIGNAL);
208 if (size !=
sizeof(method_sel))
227 status = select(sd + 1, &reads, NULL, NULL, &tv);
230 if (*signal_received)
264 if (buf[0] !=
'\x05')
271 if (buf[1] != method_sel[2])
273 msg(
D_LINK_ERRORS,
"socks_handshake: Socks proxy returned unexpected auth");
286 msg(
D_LINK_ERRORS,
"socks_handshake: server asked for username/login auth but we were "
287 "not provided any credentials");
310 volatile int *signal_received)
319 addr->
addr.
in4.sin_family = AF_INET;
320 addr->
addr.
in4.sin_addr.s_addr = htonl(INADDR_ANY);
321 addr->
addr.
in4.sin_port = htons(0);
324 while (len < 4 + alen + 2)
337 status = select(sd + 1, &reads, NULL, NULL, &tv);
340 if (*signal_received)
370 msg(
D_LINK_ERRORS,
"ERROR: recv_socks_reply: empty response from socks server");
391 alen = (
unsigned char) c + 1;
399 msg(
D_LINK_ERRORS,
"recv_socks_reply: Socks proxy returned bad address type");
405 if (len < (
int)
sizeof(buf))
413 if (buf[0] !=
'\x05' || buf[1] !=
'\x00')
420 if (atyp ==
'\x01' && addr != NULL)
422 memcpy(&addr->
addr.
in4.sin_addr, buf + 4,
sizeof(addr->
addr.
in4.sin_addr));
423 memcpy(&addr->
addr.
in4.sin_port, buf + 8,
sizeof(addr->
addr.
in4.sin_port));
425 msg(
M_INFO,
"SOCKS proxy wants us to send UDP to %s",
438 port = atoi(servname);
439 if (port >0 && port < 65536)
445 service = getservbyname(servname, NULL);
458 const char *servname,
477 len = (5 + len + 2 >
sizeof(buf)) ? (
sizeof(buf) - 5 - 2) : len;
480 memcpy(buf + 5, host, len);
485 msg(
D_LINK_ERRORS,
"establish_socks_proxy_passthrough: Cannot convert %s to port number", servname);
489 buf[5 + len] = (char) (port >> 8);
490 buf[5 + len + 1] = (char) (port & 0xff);
493 const ssize_t size = send(sd, buf, 5 + len + 2,
MSG_NOSIGNAL);
494 if ((
int)size != 5 + (
int)len + 2)
533 const ssize_t size = send(ctrl_sd,
534 "\x05\x03\x00\x01\x00\x00\x00\x00\x00\x00",
void establish_socks_proxy_udpassoc(struct socks_proxy_info *p, socket_descriptor_t ctrl_sd, socket_descriptor_t udp_sd, struct openvpn_sockaddr *relay_addr, struct event_timeout *server_poll_timeout, struct signal_info *sig_info)
volatile int signal_received
union openvpn_sockaddr::@14 addr
static bool buf_read(struct buffer *src, void *dest, int size)
static struct gc_arena gc_new(void)
int len
Length in bytes of the actual content within the allocated memory.
int socks_process_outgoing_udp(struct buffer *buf, const struct link_socket_actual *to)
char username[USER_PASS_LEN]
struct buffer buf_sub(struct buffer *buf, int size, bool prepend)
void establish_socks_proxy_passthru(struct socks_proxy_info *p, socket_descriptor_t sd, const char *host, const char *servname, struct event_timeout *server_poll_timeout, struct signal_info *sig_info)
void socks_proxy_close(struct socks_proxy_info *sp)
#define GET_USER_PASS_MANAGEMENT
static bool recv_socks_reply(socket_descriptor_t sd, struct openvpn_sockaddr *addr, struct event_timeout *server_poll_timeout, volatile int *signal_received)
int get_server_poll_remaining_time(struct event_timeout *server_poll_timeout)
static void secure_memzero(void *data, size_t len)
Securely zeroise memory.
static bool buf_write_u16(struct buffer *dest, uint16_t data)
static bool buf_write_u8(struct buffer *dest, uint8_t data)
void socks_process_incoming_udp(struct buffer *buf, struct link_socket_actual *from)
static void openvpn_fd_set(socket_descriptor_t fd, fd_set *setp)
static int buf_read_u16(struct buffer *buf)
static bool get_user_pass(struct user_pass *up, const char *auth_file, const char *prefix, const unsigned int flags)
Retrieves the user credentials from various sources depending on the flags.
Wrapper structure for dynamically allocated memory.
static int port_from_servname(const char *servname)
static bool buf_write(struct buffer *dest, const void *src, size_t size)
Garbage collection arena used to keep track of dynamically allocated memory.
static void strncpynt(char *dest, const char *src, size_t maxlen)
SOCKET socket_descriptor_t
static SERVICE_STATUS_HANDLE service
static SERVICE_STATUS status
static void gc_free(struct gc_arena *a)
struct socks_proxy_info * socks_proxy_new(const char *server, const char *port, const char *authfile)
#define ALLOC_OBJ_CLEAR(dptr, type)
char password[USER_PASS_LEN]
static void get_signal(volatile int *sig)
Copy the global signal_received (if non-zero) to the passed-in argument sig.
static int buf_read_u8(struct buffer *buf)
struct openvpn_sockaddr dest
void register_signal(struct signal_info *si, int signum, const char *signal_text)
Register a soft signal in the signal_info struct si respecting priority.
static const char * print_openvpn_sockaddr(const struct openvpn_sockaddr *addr, struct gc_arena *gc)
static bool socks_handshake(struct socks_proxy_info *p, socket_descriptor_t sd, struct event_timeout *server_poll_timeout, volatile int *signal_received)
static bool buf_defined(const struct buffer *buf)
static bool socks_username_password_auth(struct socks_proxy_info *p, socket_descriptor_t sd, struct event_timeout *server_poll_timeout, volatile int *signal_received)
static int cleanup(void **state)