# HG changeset patch # User "Yann E. MORIN" # Date 1208556988 0 # Node ID 8a72f9bcf675fa9603b6128c0ed40fb97d4ecf10 # Parent 4765aa0bd896213ac0d7477f59b51181e31140f8 Using SOCKS 4/5 proxy is no easy task: - a machine may well be able to reach the proxy, even if it is not on the same sub-net(s) as the machine itself (absolutely legitimate) - tsocks.conf needs a list of so-called 'local' networks that can be reached without the need for a SOCKS connection - SOCKS proxies are expected to be in 'local' networks - there is absolutely NO way to tell what networks are local, besides the sub-net(s) the machine is in Therefore, appropriate configuration of SOCKS 4/5 configuration is really complex, and attempts to correctly overcome this issue are doomed. /trunk/scripts/crosstool.sh | 52 46 6 0 ++++++++++++++++++++++++++++++++++---- /trunk/config/global/download_extract.in | 39 31 8 0 +++++++++++++++++++++++------ 2 files changed, 77 insertions(+), 14 deletions(-) diff -r 4765aa0bd896 -r 8a72f9bcf675 config/global/download_extract.in --- a/config/global/download_extract.in Fri Apr 18 08:41:30 2008 +0000 +++ b/config/global/download_extract.in Fri Apr 18 22:16:28 2008 +0000 @@ -74,7 +74,8 @@ config PROXY_TYPE_SOCKS bool - prompt "SOCKS 4/5 proxy" + prompt "SOCKS 4/5 proxy (EXPERIMENTAL)" + depends on EXPERIMENTAL help Use a Socks 4/5 proxy to connect to the internet. All protocols can get tunneled through this kind of proxy (depending @@ -100,17 +101,35 @@ choice bool prompt "type" - default PROXY_TYPE_SOCKS_5 + default PROXY_TYPE_SOCKS_SYS + +config PROXY_TYPE_SOCKS_SYS + bool + prompt "Use system settings" + help + Use that if your system is already configured to + connect to SOCKS 4/5 proxies. + +config PROXY_TYPE_SOCKS_AUTO + bool + prompt "Auto" + help + crosstool-NG will attempt to guess what type of + SOCKS version the proxy speaks. + +config PROXY_TYPE_SOCKS_4 + bool + prompt "SOCKS 4" config PROXY_TYPE_SOCKS_5 bool prompt "SOCKS 5" -config PROXY_TYPE_SOCKS_4 - bool - prompt "SOCKS 4" +endchoice -endchoice +if ! PROXY_TYPE_SOCKS_SYS + +comment "THIS IS HIGHLY EXPERIMENTAL!!!" config PROXY_HOST string @@ -129,16 +148,20 @@ string prompt "password" +endif # ! PROXY_TYPE_SOCKS_SYS + endif # USE_SOCKS_PROXY endchoice config PROXY_TYPE string - default "none" if PROXY_TYPE_NONE - default "http" if PROXY_TYPE_HTTP - default "socks5" if PROXY_TYPE_SOCKS_5 - default "socks4" if PROXY_TYPE_SOCKS_4 + default "none" if PROXY_TYPE_NONE + default "http" if PROXY_TYPE_HTTP + default "sockssys" if PROXY_TYPE_SOCKS_SYS + default "socksauto" if PROXY_TYPE_SOCKS_AUTO + default "socks4" if PROXY_TYPE_SOCKS_4 + default "socks5" if PROXY_TYPE_SOCKS_5 # Force restore indentation config BREAK_INDENT diff -r 4765aa0bd896 -r 8a72f9bcf675 scripts/crosstool.sh --- a/scripts/crosstool.sh Fri Apr 18 08:41:30 2008 +0000 +++ b/scripts/crosstool.sh Fri Apr 18 22:16:28 2008 +0000 @@ -224,15 +224,55 @@ export ftp_proxy="${http_proxy}" CT_DoLog DEBUG "http_proxy='${http_proxy}'" ;; - socks?) - # Re;ove any lingering config file from any previous run + sockssys) + CT_HasOrAbort tsocks + . tsocks -on + ;; + socks*) + CT_HasOrAbort tsocks + # Remove any lingering config file from any previous run rm -f "${CT_BUILD_DIR}/tsocks.conf" - ( echo "server=${CT_PROXY_HOST}"; - echo "server_port=${CT_PROXY_PORT}"; - echo "server_type=${CT_PROXY_TYPE#socks}"; + # Find all interfaces and build locally accessible networks + /sbin/ifconfig |gawk ' + $0 ~ /inet addr:/ { + split( $2, ip, ":|\\." ); + ip_num = ip[2]*2^24 + ip[3]*2^16 + ip[4]*2^8 + ip[5]*2^0; + # Skip 127.0.0.1 + if( ip_num == 2130706433 ) { + next; + } + split( $(NF), mask, ":|\\." ); + mask_num = mask[2]*2^24 + mask[3]*2^16 + mask[4]*2^8 + mask[5]*2^0; + ip_num = and( ip_num, mask_num ); + printf( "local = %d.%d.%d.%d/%d.%d.%d.%d\n", + and( 0xFF, rshift( ip_num, 24 ) ), + and( 0xFF, rshift( ip_num, 16 ) ), + and( 0xFF, rshift( ip_num, 8 ) ), + and( 0xFF, rshift( ip_num, 0 ) ), + and( 0xFF, rshift( mask_num, 24 ) ), + and( 0xFF, rshift( mask_num, 16 ) ), + and( 0xFF, rshift( mask_num, 8 ) ), + and( 0xFF, rshift( mask_num, 0 ) ) ); + } + ' >"${CT_BUILD_DIR}/tsocks.conf" + ( echo "server = ${CT_PROXY_HOST}"; + echo "server_port = ${CT_PROXY_PORT}"; [ -n "${CT_PROXY_USER}" ] && echo "default_user=${CT_PROXY_USER}"; [ -n "${CT_PROXY_PASS}" ] && echo "default_pass=${CT_PROXY_PASS}"; - ) >"${CT_BUILD_DIR}/tsocks.conf" + ) >>"${CT_BUILD_DIR}/tsocks.conf" + case "${CT_PROXY_TYPE/socks}" in + 4|5) proxy_type="${CT_PROXY_TYPE/socks}";; + auto) + reply=$(inspectsocks "${CT_PROXY_HOST}" "${CT_PROXY_PORT}" 2>&1 || true) + case "${reply}" in + *"server is a version 4 socks server"*) proxy_type=4;; + *"server is a version 5 socks server"*) proxy_type=5;; + *) CT_Abort "Unable to determine SOCKS proxy type for '${CT_PROXY_HOST}:${CT_PROXY_PORT}'" + esac + ;; + esac + echo "server_type = ${proxy_type}" >> "${CT_BUILD_DIR}/tsocks.conf" + validateconf -f "${CT_BUILD_DIR}/tsocks.conf" 2>&1 |CT_DoLog DEBUG export TSOCKS_CONF_FILE="${CT_BUILD_DIR}/tsocks.conf" . tsocks -on ;;