Go to the documentation of this file.
4 #include "../src/windows.hpp"
6 #include <sys/socket.h>
7 #include <netinet/in.h>
28 while (
len - total > 0) {
29 res = recv (sock_fd,
buffer + total,
len - total, 0);
31 fprintf (stderr,
"socks_server: error receiving %d bytes: %d %d\n",
45 fprintf (stderr,
"socks_server: error receiving bytes: %d %d\n", res,
55 while (
len - total > 0) {
58 fprintf (stderr,
"socks_server: error sending %d bytes: %d %d\n",
69 struct sockaddr_in ip4addr;
70 ip4addr.sin_family = AF_INET;
71 ip4addr.sin_addr.s_addr = htonl (addr);
72 ip4addr.sin_port = htons (port);
73 res = connect (socket, (
struct sockaddr *) &ip4addr,
sizeof ip4addr);
78 int socks_server_address_len)
81 fprintf (stderr,
"socks_server: setup socks server\n");
84 memmove (socks_server_address, strchr (socks_server_address,
'/') + 2,
85 strlen (strchr (socks_server_address,
'/') + 1));
86 fprintf (stderr,
"socks_server: bound to: tcp://%s\n",
87 socks_server_address);
88 return (
void *) (intptr_t) server_fd;
94 int max_client_connect)
96 int server_fd = (int) (intptr_t) socks_server;
97 fprintf (stderr,
"socks_server: starting server thread\n");
100 res = listen (server_fd, max_client_connect);
104 if (username ==
NULL || username[0] ==
'\0') {
108 if (password ==
NULL)
113 while (
count < max_client_connect) {
117 fprintf (stderr,
"socks_server: waiting for connection\n");
121 fprintf (stderr,
"socks_server: accepted client connection %d/%d\n",
122 count, max_client_connect);
130 for (
int i = 0;
i < nmethods;
i++) {
134 fprintf (stderr,
"socks_server: received greetings\n");
141 "socks_server: answered greetings (method: 0x%x)\n",
158 if (strcmp (username,
buffer) != 0) {
160 "socks_server: error on username check: '%s', "
169 if (strcmp (password,
buffer) != 0) {
171 "socks_server: error on password check: '%s', "
177 fprintf (stderr,
"socks_server: received credentials\n");
182 "socks_server: answered credentials (err: 0x%x)\n",
195 "socks_server: received command (cmd: %d, atype: %d)\n",
198 uint32_t naddr = 0, bind_naddr = 0;
199 uint16_t nport = 0, bind_nport = 0;
202 int request_atype =
buffer[3];
203 if (request_atype == 0x1) {
206 "socks_server: received address (addr: 0x%x)\n",
208 }
else if (request_atype == 0x3) {
215 "socks_server: received domainname (hostname: %s)\n",
219 if (strcmp (
"somedomainname.org",
buffer) == 0) {
220 naddr = htonl (0x7f000001);
224 }
else if (request_atype == 0x4) {
226 unsigned char nipv6local[16] = {0};
230 "socks_server: received ipv6 address (buffer:");
231 for (
int i = 0;
i < 16;
i++)
232 fprintf (stderr,
" 0x%x", (
unsigned char)
buffer[
i]);
233 fprintf (stderr,
")\n");
234 if (memcmp (
buffer, nipv6local, 16) == 0) {
235 naddr = htonl (0x7f000001);
243 fprintf (stderr,
"socks_server: received port (port: %d)\n",
246 fprintf (stderr,
"socks_server: trying to connect to %x:%d\n",
247 ntohl (naddr), ntohs (nport));
248 remote = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
253 struct sockaddr_in ip4addr;
254 socklen_t
len =
sizeof (ip4addr);
256 getsockname (remote, (
struct sockaddr *) &ip4addr, &
len);
259 "socks_server: connected and bound at: %x:%d\n",
260 ntohl (ip4addr.sin_addr.s_addr),
261 ntohs (ip4addr.sin_port));
262 bind_naddr = ip4addr.sin_addr.s_addr;
263 bind_nport = ip4addr.sin_port;
271 buffer[3] = request_atype;
273 if (request_atype == 0x1) {
275 }
else if (request_atype == 0x3) {
278 buffer[0] = strlen (
"localhost");
280 strcpy (
buffer,
"localhost");
282 }
else if (request_atype == 0x4) {
284 char nipv6local[16] = {0};
289 fprintf (stderr,
"socks_server: replied to request (err: 0x%x)\n",
300 "socks_server: waiting for input (client fd: %d, remote "
304 if (
client == -1 || remote == -1)
309 for (
int i = 0;
i < 2;
i++) {
312 fprintf (stderr,
"socks_server: ready to read from fd %d\n",
314 int write_fd, read_fd = items[
i].
fd;
321 fprintf (stderr,
"socks_server: read returned: %d\n",
323 if (nbytes == 0 || nbytes == -1) {
329 if (read_fd == remote) {
342 fprintf (stderr,
"socks_server: closed remote connection %d/%d\n",
343 count, max_client_connect);
349 fprintf (stderr,
"socks_server: closed client connection %d/%d\n",
350 count, max_client_connect);
353 fprintf (stderr,
"socks_server: closed server\n");
363 fprintf (stderr,
"socks_server: delay no auth socks server start\n");
376 fprintf (stderr,
"socks_server: delay basic auth socks server start\n");
394 size_t len = connect_address_size;
405 if (socks_proxy !=
NULL) {
407 strlen (socks_proxy));
409 fprintf (stderr,
"pull_client: use socks proxy: tcp://%s\n",
418 #ifdef ZMQ_BUILD_DRAFT_API
420 const char *socks_proxy,
421 const char *username,
422 const char *password)
427 if (socks_proxy !=
NULL) {
429 strlen (socks_proxy));
431 fprintf (stderr,
"pull_client: use socks proxy: tcp://%s\n",
436 username ==
NULL ? 0 : strlen (username));
440 password ==
NULL ? 0 : strlen (password));
452 fprintf (stderr,
"push_server: sending 2 messages\n");
456 fprintf (stderr,
"pull_client: receiving 2 messages\n");
521 strcpy (connect_address_hostname,
"tcp://somedomainname.org");
545 strcpy (connect_address_hostname,
"tcp://::1");
569 strcpy (connect_address_hostname,
"tcp://[::1]");
592 strcpy (socks_address_bind_before_connect,
"127.0.0.1:0;");
593 strcat (socks_address_bind_before_connect, socks_server_address);
609 #ifdef ZMQ_BUILD_DRAFT_API
616 void *pull = setup_pull_client_with_auth (
628 "libzmq without DRAFT support, ignoring socks basic auth test");
634 #ifdef ZMQ_BUILD_DRAFT_API
641 void *pull = setup_pull_client_with_auth (
653 "libzmq without DRAFT support, ignoring socks basic auth test");
659 #ifdef ZMQ_BUILD_DRAFT_API
667 socks_server_address,
"",
NULL);
678 "libzmq without DRAFT support, ignoring socks basic auth test");
684 #ifdef ZMQ_BUILD_DRAFT_API
703 "libzmq without DRAFT support, ignoring socks basic auth test");
709 #ifdef ZMQ_BUILD_DRAFT_API
716 void *pull = setup_pull_client_with_auth (
728 "libzmq without DRAFT support, ignoring socks basic auth test");
734 #ifdef ZMQ_BUILD_DRAFT_API
741 void *pull = setup_pull_client_with_auth (
753 "libzmq without DRAFT support, ignoring socks basic auth test");
762 fprintf (stderr,
"test_string_opt_ok: testing %s\n", msg);
766 size_t res_len = (size_t)
sizeof buffer;
778 const char *expected_value,
783 fprintf (stderr,
"test_opt_ok: testing %s\n", msg);
787 size_t res_len = (size_t)
sizeof buffer;
800 fprintf (stderr,
"test_opt_invalid: testing %s\n", msg);
817 #ifdef ZMQ_BUILD_DRAFT_API
819 for (
int i = 0;
i < (int)
sizeof buffer;
i++) {
842 "username/password test");
#define ZMQ_SOCKS_PASSWORD
void socks_server_no_auth_delay(void *socks_server)
const SETUP_TEARDOWN_TESTCONTEXT char bind_address[]
void test_socks_basic_auth(void)
ZMQ_EXPORT void * zmq_threadstart(zmq_thread_fn *func_, void *arg_)
void sendall(int sock_fd, char *buffer, int len)
void test_socks_basic_auth_null_pass(void)
void msleep(int milliseconds_)
void socks_server_basic_auth(void *socks_server)
ZMQ_EXPORT int zmq_poll(zmq_pollitem_t *items_, int nitems_, long timeout_)
void test_opt_invalid(const char *msg, int opt, const char *value, int len)
void test_socks_no_socks(void)
#define ZMQ_LAST_ENDPOINT
void test_socks_proxy_options(void)
#define SETUP_TEARDOWN_TESTCONTEXT
void socks_server_basic_auth_no_pass(void *socks_server)
void send(fd_t fd_, const char(&data_)[N])
void test_socks_basic_auth_null_user(void)
void * test_context_socket_close_zero_linger(void *socket_)
#define TEST_ASSERT(condition)
ZMQ_EXPORT int zmq_connect(void *s_, const char *addr_)
void test_socks_basic_auth_empty_pass(void)
void test_socks_ipv6(void)
SETUP_TEARDOWN_TESTCONTEXT void recvall(int sock_fd, char *buffer, int len)
int remote_connect(int socket, uint32_t addr, uint16_t port)
ZMQ_EXPORT int zmq_setsockopt(void *s_, int option_, const void *optval_, size_t optvallen_)
ZMQ_EXPORT void zmq_threadclose(void *thread_)
#define LIBZMQ_UNUSED(object)
#define TEST_ASSERT_SUCCESS_RAW_ERRNO(expr)
void * setup_pull_client(const char *connect_address, const char *socks_proxy)
void socks_server_task(void *socks_server, const char *username, const char *password, int max_client_connect)
void * setup_socks_server(char *socks_server_address, int socks_server_address_len)
void test_socks_basic_auth_empty_user(void)
#define MAX_SOCKET_STRING
static UPB_NORETURN void err(tarjan *t)
ZMQ_EXPORT int zmq_bind(void *s_, const char *addr_)
void test_socks_delay(void)
void test_socks_userpass_options(void)
void test_string_opt_ok(const char *msg, int opt, const char *value)
void * test_context_socket(int type_)
#define TEST_ASSERT_EQUAL(expected, actual)
#define TEST_IGNORE_MESSAGE(message)
void s_send_seq(void *socket_,...)
void test_opt_ok(const char *msg, int opt, const char *value, size_t len, const char *expected_value, size_t expected_len)
void setup_test_environment(int timeout_seconds_)
void s_recv_seq(void *socket_,...)
SETUP_TEARDOWN_TESTCONTEXT char connect_address[MAX_SOCKET_STRING]
void test_socks_bind_before_connect(void)
static void push(tarjan *t, const upb_refcounted *r)
#define TEST_ASSERT_FAILURE_ERRNO(error_code, expr)
void test_socks_basic_auth_delay(void)
void socks_server_no_auth(void *socks_server)
void socks_server_basic_auth_delay(void *socks_server)
void communicate(void *push, void *pull)
GLsizei const GLfloat * value
int recvonce(int sock_fd, char *buffer, int len)
void test_socks_ipv6_sb(void)
void test_socks_domainname(void)
void * setup_push_server(char *connect_address, int connect_address_size)
#define TEST_ASSERT_SUCCESS_ERRNO(expr)
ZMQ_EXPORT int zmq_getsockopt(void *s_, int option_, void *optval_, size_t *optvallen_)
const Descriptor::ReservedRange const EnumValueDescriptor method
fd_t bind_socket_resolve_port(const char *address_, const char *port_, char *my_endpoint_, const int af_, const int protocol_)
#define ZMQ_SOCKS_USERNAME
libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:59