nexmon – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | #! /bin/bash |
2 | # source: socks4a-echo.sh |
||
3 | #set -vx |
||
4 | |||
5 | # Copyright Gerhard Rieger 2004 |
||
6 | # Published under the GNU General Public License V.2, see file COPYING |
||
7 | |||
8 | # perform primitive simulation of a socks4a server with echo function via stdio. |
||
9 | # accepts and answers correct SOCKS4a requests, but then just echoes data. |
||
10 | # it is required for test.sh |
||
11 | # for TCP, use this script as: |
||
12 | # socat tcp-l:1080,reuseaddr,crlf system:"socks4a-echo.sh" |
||
13 | |||
14 | # older bash and ksh do not have -n option to read command; we try dd then |
||
15 | if echo a |read -n 1 null >/dev/null 2>&1; then |
||
16 | HAVE_READ_N=1 |
||
17 | else |
||
18 | HAVE_READ_N= |
||
19 | fi |
||
20 | |||
21 | if type socat >/dev/null 2>&1; then |
||
22 | SOCAT=socat |
||
23 | else |
||
24 | SOCAT=./socat |
||
25 | fi |
||
26 | |||
27 | case `uname` in |
||
28 | HP-UX|OSF1) |
||
29 | CAT="$SOCAT -u stdin stdout" |
||
30 | ;; |
||
31 | *) |
||
32 | CAT=cat |
||
33 | ;; |
||
34 | esac |
||
35 | |||
36 | if [ $(echo "x\c") = "x" ]; then E="" |
||
37 | elif [ $(echo -e "x\c") = "x" ]; then E="-e" |
||
38 | else |
||
39 | echo "cannot suppress trailing newline on echo" >&2 |
||
40 | exit 1 |
||
41 | fi |
||
42 | ECHO="echo $E" |
||
43 | |||
44 | if [ $($ECHO "\0101") = "A" ]; then |
||
45 | SOCKSREPLY_FAILED="\0\0133\0\0\0\0\0\0\c" |
||
46 | SOCKSREPLY_OK="\0\0132\0\0\0\0\0\0\c" |
||
47 | else |
||
48 | SOCKSREPLY_FAILED="\0\133\0\0\0\0\0\0\c" |
||
49 | SOCKSREPLY_OK="\0\132\0\0\0\0\0\0\c" |
||
50 | fi |
||
51 | |||
52 | # read and parse SOCKS4a header |
||
53 | if [ "$HAVE_READ_N" ]; then |
||
54 | read -r -n 1 vn # bash 2.0.3 does not support -n |
||
55 | else |
||
56 | vn=$(dd bs=1 count=1 2>/dev/null) |
||
57 | fi |
||
58 | if [ "$vn" != $($ECHO "\04") ]; then |
||
59 | $ECHO "$SOCKSREPLY_FAILED" |
||
60 | echo "invalid socks version requested" >&2 |
||
61 | exit |
||
62 | fi |
||
63 | |||
64 | if [ "$HAVE_READ_N" ]; then |
||
65 | read -r -n 1 cd |
||
66 | else |
||
67 | cd=$(dd bs=1 count=1 2>/dev/null) |
||
68 | fi |
||
69 | if [ "$cd" != $($ECHO "\01") ]; then |
||
70 | $ECHO "$SOCKSREPLY_FAILED" |
||
71 | echo "invalid socks operation requested" >&2 |
||
72 | exit |
||
73 | fi |
||
74 | |||
75 | a=$(dd bs=1 count=6 2>/dev/null) |
||
76 | #echo a a a >/dev/tty |
||
77 | #echo "$a" |od -c >/dev/tty |
||
78 | #$ECHO "$a" |od -c >/dev/tty |
||
79 | #echo>/dev/tty |
||
80 | #echo a a a >/dev/tty |
||
81 | if [ "$a" != "$($ECHO "}m\0\0\0\01")" ]; then |
||
82 | sleep 1 |
||
83 | $ECHO "$SOCKSREPLY_FAILED" |
||
84 | echo "wrong socks address or port requested" >&2 |
||
85 | exit |
||
86 | fi |
||
87 | |||
88 | if [ "$HAVE_READ_N" ]; then |
||
89 | read -r -n 7 u |
||
90 | else |
||
91 | u=$(dd bs=1 count=7 2>/dev/null) |
||
92 | fi |
||
93 | if [ "$u" != "nobody" ]; then |
||
94 | $ECHO "$SOCKSREPLY_FAILED" |
||
95 | echo "wrong socks user requested" >&2 |
||
96 | exit |
||
97 | fi |
||
98 | |||
99 | if [ "$HAVE_READ_N" ]; then |
||
100 | read -r -n 10 h |
||
101 | else |
||
102 | h=$(dd bs=1 count=10 2>/dev/null) |
||
103 | fi |
||
104 | if [ "$h" != "localhost" ]; then |
||
105 | $ECHO "$SOCKSREPLY_FAILED" |
||
106 | echo "wrong socks address requested" >&2 |
||
107 | exit |
||
108 | fi |
||
109 | |||
110 | # send ok status |
||
111 | $ECHO "$SOCKSREPLY_OK" |
||
112 | |||
113 | # perform echo function |
||
114 | $CAT |