PROTO_SOCKS4,
PROTO_SOCKS5,
PROTO_HTTP_CONNECT,
+ PROTO_HTTPS_CONNECT,
} protocol_t;
struct opm_lookup
char note[16];
protocol_t proto;
uint16_t port;
+ bool ssl;
rb_dlink_node node;
};
return PROTO_SOCKS5;
else if(strcasecmp(str, "httpconnect") == 0)
return PROTO_HTTP_CONNECT;
+ else if(strcasecmp(str, "httpsconnect") == 0)
+ return PROTO_HTTPS_CONNECT;
else
return PROTO_NONE;
}
{
case PROTO_SOCKS4:
#ifdef RB_IPV6
+ /* SOCKS4 is IPv4 only */
if(GET_SS_FAMILY(&auth->c_addr) == AF_INET6)
{
rb_free(scan);
callback = socks5_connected;
break;
case PROTO_HTTP_CONNECT:
+ case PROTO_HTTPS_CONNECT:
callback = http_connect_connected;
default:
return;
SET_SS_PORT(&c_a, htons(proxy->port));
rb_dlinkAdd(scan, &scan->node, &lookup->scans);
- rb_connect_tcp(scan->F,
- (struct sockaddr *)&c_a,
- (struct sockaddr *)&l_a,
- GET_SS_LEN(&l_a),
- callback, scan, opm_timeout);
+
+ if(!proxy->ssl)
+ rb_connect_tcp(scan->F,
+ (struct sockaddr *)&c_a,
+ (struct sockaddr *)&l_a,
+ GET_SS_LEN(&l_a),
+ callback, scan, opm_timeout);
+ else
+ rb_connect_tcp_ssl(scan->F,
+ (struct sockaddr *)&c_a,
+ (struct sockaddr *)&l_a,
+ GET_SS_LEN(&l_a),
+ callback, scan, opm_timeout);
}
static bool
{
case PROTO_SOCKS4:
snprintf(proxy->note, sizeof(proxy->note), "socks4:%hu", proxy->port);
+ proxy->ssl = false;
break;
case PROTO_SOCKS5:
snprintf(proxy->note, sizeof(proxy->note), "socks5:%hu", proxy->port);
+ proxy->ssl = false;
break;
case PROTO_HTTP_CONNECT:
snprintf(proxy->note, sizeof(proxy->note), "httpconnect:%hu", proxy->port);
+ proxy->ssl = false;
+ break;
+ case PROTO_HTTPS_CONNECT:
+ snprintf(proxy->note, sizeof(proxy->note), "httpsconnect:%hu", proxy->port);
+ proxy->ssl = true;
break;
default:
warn_opers(L_CRIT, "OPM: got an unknown proxy type: %s (port %hu)", parv[0], proxy->port);