socks.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. package pt
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "net"
  7. "time"
  8. )
  9. const (
  10. socks4Version = 0x04
  11. socks5Version = 0x05
  12. socksAuthNoneRequired = 0x00
  13. socksAuthUsernamePassword = 0x02
  14. socksAuthNoAcceptableMethods = 0xff
  15. socksCmdConnect = 0x01
  16. socksReserved = 0x00
  17. socksAtypeV4 = 0x01
  18. socksAtypeDomainName = 0x03
  19. socksAtypeV6 = 0x04
  20. socksAuthRFC1929Ver = 0x01
  21. socksAuthRFC1929Success = 0x00
  22. socksAuthRFC1929Fail = 0x01
  23. socksRepSucceeded = 0x00
  24. // "general SOCKS server failure"
  25. SocksRepGeneralFailure = 0x01
  26. // "connection not allowed by ruleset"
  27. SocksRepConnectionNotAllowed = 0x02
  28. // "Network unreachable"
  29. SocksRepNetworkUnreachable = 0x03
  30. // "Host unreachable"
  31. SocksRepHostUnreachable = 0x04
  32. // "Connection refused"
  33. SocksRepConnectionRefused = 0x05
  34. // "TTL expired"
  35. SocksRepTTLExpired = 0x06
  36. // "Command not supported"
  37. SocksRepCommandNotSupported = 0x07
  38. // "Address type not supported"
  39. SocksRepAddressNotSupported = 0x08
  40. socks4ResponseVersion = 0x00
  41. socks4RequestGranted = 0x5a
  42. socks4RequestRejected = 0x5b
  43. )
  44. // Put a sanity timeout on how long we wait for a SOCKS request.
  45. const socksRequestTimeout = 5 * time.Second
  46. // SocksRequest describes a SOCKS request.
  47. type SocksRequest struct {
  48. // The endpoint requested by the client as a "host:port" string.
  49. Target string
  50. // The userid string sent by the client.
  51. Username string
  52. // The password string sent by the client.
  53. Password string
  54. // The parsed contents of Username as a key–value mapping.
  55. Args Args
  56. }
  57. // SocksConn encapsulates a net.Conn and information associated with a SOCKS request.
  58. type SocksConn struct {
  59. net.Conn
  60. Req SocksRequest
  61. socksVersion byte
  62. }
  63. // Send a message to the proxy client that access to the given address is
  64. // granted.
  65. // For SOCKS5, Addr is ignored, and "0.0.0.0:0" is always sent back for
  66. // BND.ADDR/BND.PORT in the SOCKS response.
  67. // For SOCKS4a, if the IP field inside addr is not an IPv4 address, the IP
  68. // portion of the response will be four zero bytes.
  69. func (conn *SocksConn) Grant(addr *net.TCPAddr) error {
  70. if conn.socksVersion == socks4Version {
  71. return sendSocks4aResponseGranted(conn, addr)
  72. }
  73. return sendSocks5ResponseGranted(conn)
  74. }
  75. // Send a message to the proxy client that access was rejected or failed. This
  76. // sends back a "General Failure" error code. RejectReason should be used if
  77. // more specific error reporting is desired.
  78. func (conn *SocksConn) Reject() error {
  79. if conn.socksVersion == socks4Version {
  80. return sendSocks4aResponseRejected(conn)
  81. }
  82. return sendSocks5ResponseRejected(conn, SocksRepGeneralFailure)
  83. }
  84. // Send a message to the proxy client that access was rejected, with the
  85. // specific error code indicating the reason behind the rejection.
  86. // For SOCKS4a, the reason is ignored.
  87. func (conn *SocksConn) RejectReason(reason byte) error {
  88. if conn.socksVersion == socks4Version {
  89. return sendSocks4aResponseRejected(conn)
  90. }
  91. return sendSocks5ResponseRejected(conn, reason)
  92. }
  93. // SocksListener wraps a net.Listener in order to read a SOCKS request on Accept.
  94. //
  95. // func handleConn(conn *pt.SocksConn) error {
  96. // defer conn.Close()
  97. // remote, err := net.Dial("tcp", conn.Req.Target)
  98. // if err != nil {
  99. // conn.Reject()
  100. // return err
  101. // }
  102. // defer remote.Close()
  103. // err = conn.Grant(remote.RemoteAddr().(*net.TCPAddr))
  104. // if err != nil {
  105. // return err
  106. // }
  107. // // do something with conn and remote
  108. // return nil
  109. // }
  110. // ...
  111. // ln, err := pt.ListenSocks("tcp", "127.0.0.1:0")
  112. // if err != nil {
  113. // panic(err.Error())
  114. // }
  115. // for {
  116. // conn, err := ln.AcceptSocks()
  117. // if err != nil {
  118. // log.Printf("accept error: %s", err)
  119. // if e, ok := err.(net.Error); !ok || !e.Temporary() {
  120. // break
  121. // }
  122. // continue
  123. // }
  124. // go handleConn(conn)
  125. // }
  126. type SocksListener struct {
  127. net.Listener
  128. }
  129. // Open a net.Listener according to network and laddr, and return it as a
  130. // SocksListener.
  131. func ListenSocks(network, laddr string) (*SocksListener, error) {
  132. ln, err := net.Listen(network, laddr)
  133. if err != nil {
  134. return nil, err
  135. }
  136. return NewSocksListener(ln), nil
  137. }
  138. // Create a new SocksListener wrapping the given net.Listener.
  139. func NewSocksListener(ln net.Listener) *SocksListener {
  140. return &SocksListener{ln}
  141. }
  142. // Accept is the same as AcceptSocks, except that it returns a generic net.Conn.
  143. // It is present for the sake of satisfying the net.Listener interface.
  144. func (ln *SocksListener) Accept() (net.Conn, error) {
  145. return ln.AcceptSocks()
  146. }
  147. // Call Accept on the wrapped net.Listener, do SOCKS negotiation, and return a
  148. // SocksConn. After accepting, you must call either conn.Grant or conn.Reject
  149. // (presumably after trying to connect to conn.Req.Target).
  150. //
  151. // Errors returned by AcceptSocks may be temporary (for example, EOF while
  152. // reading the request, or a badly formatted userid string), or permanent (e.g.,
  153. // the underlying socket is closed). You can determine whether an error is
  154. // temporary and take appropriate action with a type conversion to net.Error.
  155. // For example:
  156. //
  157. // for {
  158. // conn, err := ln.AcceptSocks()
  159. // if err != nil {
  160. // if e, ok := err.(net.Error); ok && e.Temporary() {
  161. // log.Printf("temporary accept error; trying again: %s", err)
  162. // continue
  163. // }
  164. // log.Printf("permanent accept error; giving up: %s", err)
  165. // break
  166. // }
  167. // go handleConn(conn)
  168. // }
  169. func (ln *SocksListener) AcceptSocks() (*SocksConn, error) {
  170. c, err := ln.Listener.Accept()
  171. if err != nil {
  172. return nil, err
  173. }
  174. conn := new(SocksConn)
  175. conn.Conn = c
  176. err = conn.SetDeadline(time.Now().Add(socksRequestTimeout))
  177. if err != nil {
  178. conn.Close()
  179. err = newTemporaryNetError("AcceptSocks: conn.SetDeadline() #1 failed: %s", err.Error())
  180. return nil, err
  181. }
  182. rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))
  183. // Determine which SOCKS version the client is using and branch on it.
  184. if version, err := socksPeekByte(rw.Reader); err != nil {
  185. conn.Close()
  186. err = newTemporaryNetError("AcceptSocks: socksPeekByte() failed: %s", err.Error())
  187. return nil, err
  188. } else if version == socks4Version {
  189. conn.socksVersion = socks4Version
  190. conn.Req, err = readSocks4aConnect(rw.Reader)
  191. if err != nil {
  192. conn.Close()
  193. return nil, err
  194. }
  195. } else if version == socks5Version {
  196. conn.socksVersion = socks5Version
  197. conn.Req, err = socks5Handshake(rw)
  198. if err != nil {
  199. conn.Close()
  200. return nil, err
  201. }
  202. } else {
  203. conn.Close()
  204. err = newTemporaryNetError("AcceptSocks: Illegal SOCKS version: 0x%02x", version)
  205. return nil, err
  206. }
  207. err = conn.SetDeadline(time.Time{})
  208. if err != nil {
  209. conn.Close()
  210. err = newTemporaryNetError("AcceptSocks: conn.SetDeadline() #2 failed: %s", err.Error())
  211. return nil, err
  212. }
  213. return conn, nil
  214. }
  215. // Returns "socks5", suitable to be included in a call to Cmethod.
  216. func (ln *SocksListener) Version() string {
  217. return "socks5"
  218. }
  219. // socks5handshake conducts the SOCKS5 handshake up to the point where the
  220. // client command is read and the proxy must open the outgoing connection.
  221. // Returns a SocksRequest.
  222. func socks5Handshake(rw *bufio.ReadWriter) (req SocksRequest, err error) {
  223. // Negotiate the authentication method.
  224. var method byte
  225. if method, err = socks5NegotiateAuth(rw); err != nil {
  226. return
  227. }
  228. // Authenticate the client.
  229. if err = socks5Authenticate(rw, method, &req); err != nil {
  230. return
  231. }
  232. // Read the command.
  233. err = socks5ReadCommand(rw, &req)
  234. return
  235. }
  236. // socks5NegotiateAuth negotiates the authentication method and returns the
  237. // selected method as a byte. On negotiation failures an error is returned.
  238. func socks5NegotiateAuth(rw *bufio.ReadWriter) (method byte, err error) {
  239. // Validate the version.
  240. if err = socksReadByteVerify(rw.Reader, "version", socks5Version); err != nil {
  241. err = newTemporaryNetError("socks5NegotiateAuth: %s", err.Error())
  242. return
  243. }
  244. // Read the number of methods.
  245. var nmethods byte
  246. if nmethods, err = socksReadByte(rw.Reader); err != nil {
  247. err = newTemporaryNetError("socks5NegotiateAuth: Failed to read nmethods byte: %s", err.Error())
  248. return
  249. }
  250. // Read the methods.
  251. var methods []byte
  252. if methods, err = socksReadBytes(rw.Reader, int(nmethods)); err != nil {
  253. err = newTemporaryNetError("socks5NegotiateAuth: Failed to read methods bytes: %s", err.Error())
  254. return
  255. }
  256. // Pick the most "suitable" method.
  257. method = socksAuthNoAcceptableMethods
  258. for _, m := range methods {
  259. switch m {
  260. case socksAuthNoneRequired:
  261. // Pick Username/Password over None if the client happens to
  262. // send both.
  263. if method == socksAuthNoAcceptableMethods {
  264. method = m
  265. }
  266. case socksAuthUsernamePassword:
  267. method = m
  268. }
  269. }
  270. // Send the negotiated method.
  271. var msg [2]byte
  272. msg[0] = socks5Version
  273. msg[1] = method
  274. if _, err = rw.Writer.Write(msg[:]); err != nil {
  275. err = newTemporaryNetError("socks5NegotiateAuth: Failed to write negotiated method: %s", err.Error())
  276. return
  277. }
  278. if err = socksFlushBuffers(rw); err != nil {
  279. err = newTemporaryNetError("socks5NegotiateAuth: Failed to flush buffers: %s", err.Error())
  280. return
  281. }
  282. return
  283. }
  284. // socks5Authenticate authenticates the client via the chosen authentication
  285. // mechanism.
  286. func socks5Authenticate(rw *bufio.ReadWriter, method byte, req *SocksRequest) (err error) {
  287. switch method {
  288. case socksAuthNoneRequired:
  289. // Straight into reading the connect.
  290. case socksAuthUsernamePassword:
  291. if err = socks5AuthRFC1929(rw, req); err != nil {
  292. return
  293. }
  294. case socksAuthNoAcceptableMethods:
  295. err = newTemporaryNetError("socks5Authenticate: SOCKS method select had no compatible methods")
  296. return
  297. default:
  298. err = newTemporaryNetError("socks5Authenticate: SOCKS method select picked a unsupported method 0x%02x", method)
  299. return
  300. }
  301. if err = socksFlushBuffers(rw); err != nil {
  302. err = newTemporaryNetError("socks5Authenticate: Failed to flush buffers: %s", err)
  303. return
  304. }
  305. return
  306. }
  307. // socks5AuthRFC1929 authenticates the client via RFC 1929 username/password
  308. // auth. As a design decision any valid username/password is accepted as this
  309. // field is primarily used as an out-of-band argument passing mechanism for
  310. // pluggable transports.
  311. func socks5AuthRFC1929(rw *bufio.ReadWriter, req *SocksRequest) (err error) {
  312. sendErrResp := func() {
  313. // Swallow the write/flush error here, we are going to close the
  314. // connection and the original failure is more useful.
  315. resp := []byte{socksAuthRFC1929Ver, socksAuthRFC1929Fail}
  316. rw.Write(resp[:])
  317. socksFlushBuffers(rw)
  318. }
  319. // Validate the fixed parts of the command message.
  320. if err = socksReadByteVerify(rw.Reader, "auth version", socksAuthRFC1929Ver); err != nil {
  321. sendErrResp()
  322. err = newTemporaryNetError("socks5AuthRFC1929: %s", err)
  323. return
  324. }
  325. // Read the username.
  326. var ulen byte
  327. if ulen, err = socksReadByte(rw.Reader); err != nil {
  328. err = newTemporaryNetError("socks5AuthRFC1929: Failed to read username length: %s", err)
  329. return
  330. }
  331. if ulen < 1 {
  332. sendErrResp()
  333. err = newTemporaryNetError("socks5AuthRFC1929: username with 0 length")
  334. return
  335. }
  336. var uname []byte
  337. if uname, err = socksReadBytes(rw.Reader, int(ulen)); err != nil {
  338. err = newTemporaryNetError("socks5AuthRFC1929: Failed to read username: %s", err)
  339. return
  340. }
  341. req.Username = string(uname)
  342. // Read the password.
  343. var plen byte
  344. if plen, err = socksReadByte(rw.Reader); err != nil {
  345. err = newTemporaryNetError("socks5AuthRFC1929: Failed to read password length: %s", err)
  346. return
  347. }
  348. if plen < 1 {
  349. sendErrResp()
  350. err = newTemporaryNetError("socks5AuthRFC1929: password with 0 length")
  351. return
  352. }
  353. var passwd []byte
  354. if passwd, err = socksReadBytes(rw.Reader, int(plen)); err != nil {
  355. err = newTemporaryNetError("socks5AuthRFC1929: Failed to read password: %s", err)
  356. return
  357. }
  358. if !(plen == 1 && passwd[0] == 0x00) {
  359. // tor will set the password to 'NUL' if there are no arguments.
  360. req.Password = string(passwd)
  361. }
  362. // Mash the username/password together and parse it as a pluggable
  363. // transport argument string.
  364. if req.Args, err = parseClientParameters(req.Username + req.Password); err != nil {
  365. sendErrResp()
  366. err = newTemporaryNetError("socks5AuthRFC1929: failed to parse client parameters: %s", err)
  367. return
  368. }
  369. // Write success response
  370. resp := []byte{socksAuthRFC1929Ver, socksAuthRFC1929Success}
  371. if _, err = rw.Write(resp[:]); err != nil {
  372. err = newTemporaryNetError("socks5AuthRFC1929: failed to write success response: %s", err)
  373. return
  374. }
  375. return
  376. }
  377. // socks5ReadCommand reads a SOCKS5 client command and parses out the relevant
  378. // fields into a SocksRequest. Only CMD_CONNECT is supported.
  379. func socks5ReadCommand(rw *bufio.ReadWriter, req *SocksRequest) (err error) {
  380. sendErrResp := func(reason byte) {
  381. // Swallow errors that occur when writing/flushing the response,
  382. // connection will be closed anyway.
  383. sendSocks5ResponseRejected(rw, reason)
  384. socksFlushBuffers(rw)
  385. }
  386. // Validate the fixed parts of the command message.
  387. if err = socksReadByteVerify(rw.Reader, "version", socks5Version); err != nil {
  388. sendErrResp(SocksRepGeneralFailure)
  389. err = newTemporaryNetError("socks5ReadCommand: %s", err)
  390. return
  391. }
  392. if err = socksReadByteVerify(rw.Reader, "command", socksCmdConnect); err != nil {
  393. sendErrResp(SocksRepCommandNotSupported)
  394. err = newTemporaryNetError("socks5ReadCommand: %s", err)
  395. return
  396. }
  397. if err = socksReadByteVerify(rw.Reader, "reserved", socksReserved); err != nil {
  398. sendErrResp(SocksRepGeneralFailure)
  399. err = newTemporaryNetError("socks5ReadCommand: %s", err)
  400. return
  401. }
  402. // Read the destination address/port.
  403. // XXX: This should probably eventually send socks 5 error messages instead
  404. // of rudely closing connections on invalid addresses.
  405. var atype byte
  406. if atype, err = socksReadByte(rw.Reader); err != nil {
  407. err = newTemporaryNetError("socks5ReadCommand: Failed to read address type: %s", err)
  408. return
  409. }
  410. var host string
  411. switch atype {
  412. case socksAtypeV4:
  413. var addr []byte
  414. if addr, err = socksReadBytes(rw.Reader, net.IPv4len); err != nil {
  415. err = newTemporaryNetError("socks5ReadCommand: Failed to read IPv4 address: %s", err)
  416. return
  417. }
  418. host = net.IPv4(addr[0], addr[1], addr[2], addr[3]).String()
  419. case socksAtypeDomainName:
  420. var alen byte
  421. if alen, err = socksReadByte(rw.Reader); err != nil {
  422. err = newTemporaryNetError("socks5ReadCommand: Failed to read domain name length: %s", err)
  423. return
  424. }
  425. if alen == 0 {
  426. err = newTemporaryNetError("socks5ReadCommand: SOCKS request had domain name with 0 length")
  427. return
  428. }
  429. var addr []byte
  430. if addr, err = socksReadBytes(rw.Reader, int(alen)); err != nil {
  431. err = newTemporaryNetError("socks5ReadCommand: Failed to read domain name: %s", err)
  432. return
  433. }
  434. host = string(addr)
  435. case socksAtypeV6:
  436. var rawAddr []byte
  437. if rawAddr, err = socksReadBytes(rw.Reader, net.IPv6len); err != nil {
  438. err = newTemporaryNetError("socks5ReadCommand: Failed to read IPv6 address: %s", err)
  439. return
  440. }
  441. addr := make(net.IP, net.IPv6len)
  442. copy(addr[:], rawAddr[:])
  443. host = fmt.Sprintf("[%s]", addr.String())
  444. default:
  445. sendErrResp(SocksRepAddressNotSupported)
  446. err = newTemporaryNetError("socks5ReadCommand: SOCKS request had unsupported address type 0x%02x", atype)
  447. return
  448. }
  449. var rawPort []byte
  450. if rawPort, err = socksReadBytes(rw.Reader, 2); err != nil {
  451. err = newTemporaryNetError("socks5ReadCommand: Failed to read port number: %s", err)
  452. return
  453. }
  454. port := int(rawPort[0])<<8 | int(rawPort[1])<<0
  455. if err = socksFlushBuffers(rw); err != nil {
  456. err = newTemporaryNetError("socks5ReadCommand: Failed to flush buffers: %s", err)
  457. return
  458. }
  459. req.Target = fmt.Sprintf("%s:%d", host, port)
  460. return
  461. }
  462. // Send a SOCKS5 response with the given code. BND.ADDR/BND.PORT is always the
  463. // IPv4 address/port "0.0.0.0:0".
  464. func sendSocks5Response(w io.Writer, code byte) error {
  465. resp := make([]byte, 4+4+2)
  466. resp[0] = socks5Version
  467. resp[1] = code
  468. resp[2] = socksReserved
  469. resp[3] = socksAtypeV4
  470. // BND.ADDR/BND.PORT should be the address and port that the outgoing
  471. // connection is bound to on the proxy, but Tor does not use this
  472. // information, so all zeroes are sent.
  473. if _, err := w.Write(resp[:]); err != nil {
  474. err = newTemporaryNetError("sendSocks5Response: Failed write response: %s", err)
  475. return err
  476. }
  477. return nil
  478. }
  479. // Send a SOCKS5 response code 0x00.
  480. func sendSocks5ResponseGranted(w io.Writer) error {
  481. return sendSocks5Response(w, socksRepSucceeded)
  482. }
  483. // Send a SOCKS5 response with the provided failure reason.
  484. func sendSocks5ResponseRejected(w io.Writer, reason byte) error {
  485. return sendSocks5Response(w, reason)
  486. }
  487. /*
  488. * Common helpers
  489. */
  490. func socksFlushBuffers(rw *bufio.ReadWriter) error {
  491. if err := rw.Writer.Flush(); err != nil {
  492. return err
  493. }
  494. if err := socksFlushReadBuffer(rw.Reader); err != nil {
  495. return err
  496. }
  497. return nil
  498. }
  499. func socksFlushReadBuffer(r *bufio.Reader) error {
  500. if r.Buffered() > 0 {
  501. return fmt.Errorf("%d bytes left after SOCKS message", r.Buffered())
  502. }
  503. return nil
  504. }
  505. func socksReadByte(r *bufio.Reader) (byte, error) {
  506. return r.ReadByte()
  507. }
  508. func socksReadBytes(r *bufio.Reader, n int) ([]byte, error) {
  509. ret := make([]byte, n)
  510. if _, err := io.ReadFull(r, ret); err != nil {
  511. return nil, err
  512. }
  513. return ret, nil
  514. }
  515. func socksReadByteVerify(r *bufio.Reader, descr string, expected byte) error {
  516. val, err := socksReadByte(r)
  517. if err != nil {
  518. return err
  519. }
  520. if val != expected {
  521. return fmt.Errorf("SOCKS message field %s was 0x%02x, not 0x%02x", descr, val, expected)
  522. }
  523. return nil
  524. }
  525. func socksReadBytesUntil(r *bufio.Reader, end byte) ([]byte, error) {
  526. val, err := r.ReadBytes(end)
  527. if err != nil {
  528. return nil, err
  529. }
  530. return val, nil
  531. }
  532. func socksPeekByte(r *bufio.Reader) (b byte, err error) {
  533. var byteSlice []byte
  534. if byteSlice, err = r.Peek(1); err != nil {
  535. return
  536. }
  537. b = byteSlice[0]
  538. return
  539. }
  540. // temporaryNetError is used for our custom errors. All such errors are "temporary";
  541. // that is, the listener doesn't need to be torn down when they occur. They also
  542. // need to implement the net.Error interface.
  543. type temporaryNetError struct {
  544. error
  545. }
  546. // Ensure temporaryNetError implements net.Error
  547. var _ net.Error = temporaryNetError{}
  548. func newTemporaryNetError(errMsg string, args ...interface{}) *temporaryNetError {
  549. return &temporaryNetError{
  550. error: fmt.Errorf(errMsg, args...),
  551. }
  552. }
  553. func (tne temporaryNetError) Timeout() bool {
  554. return false
  555. }
  556. func (tne temporaryNetError) Temporary() bool {
  557. return true
  558. }
  559. /*
  560. * SOCKS4a-specific code
  561. */
  562. // Read a SOCKS4a connect request. Returns a SocksRequest.
  563. func readSocks4aConnect(r *bufio.Reader) (req SocksRequest, err error) {
  564. // Validate the version.
  565. if err = socksReadByteVerify(r, "version", socks4Version); err != nil {
  566. err = newTemporaryNetError("readSocks4aConnect: %s", err.Error())
  567. return
  568. }
  569. var cmdConnect byte
  570. if cmdConnect, err = socksReadByte(r); err != nil {
  571. err = newTemporaryNetError("readSocks4aConnect: Failed to read connect command: %s", err.Error())
  572. return
  573. }
  574. if cmdConnect != socksCmdConnect {
  575. err = newTemporaryNetError("readSocks4aConnect: SOCKS header had command 0x%02x, not 0x%02x", cmdConnect, socksCmdConnect)
  576. return
  577. }
  578. var rawPort []byte
  579. if rawPort, err = socksReadBytes(r, 2); err != nil {
  580. err = newTemporaryNetError("readSocks4aConnect: Failed to read port: %s", err.Error())
  581. return
  582. }
  583. port := int(rawPort[0])<<8 | int(rawPort[1])<<0
  584. var rawHostIP []byte
  585. if rawHostIP, err = socksReadBytes(r, 4); err != nil {
  586. err = newTemporaryNetError("readSocks4aConnect: Failed to read IP address: %s", err.Error())
  587. return
  588. }
  589. // If there's a hostname, it comes after the username, so we'll wait a bit
  590. // before we process the IP info.
  591. var usernameBytes []byte
  592. usernameBytes, err = socksReadBytesUntil(r, '\x00')
  593. if err != nil {
  594. err = newTemporaryNetError("readSocks4aConnect: Failed to read username: %s", err.Error())
  595. return
  596. }
  597. req.Username = string(usernameBytes[:len(usernameBytes)-1])
  598. req.Args, err = parseClientParameters(req.Username)
  599. if err != nil {
  600. err = newTemporaryNetError("readSocks4aConnect: Failed to parse client parameters: %s", err.Error())
  601. return
  602. }
  603. var host string
  604. if rawHostIP[0] == 0 && rawHostIP[1] == 0 && rawHostIP[2] == 0 && rawHostIP[3] != 0 {
  605. // If the IP is of the form 0.0.0.x (with x nonzero), then a domain name is provided.
  606. var hostBytes []byte
  607. if hostBytes, err = socksReadBytesUntil(r, '\x00'); err != nil {
  608. err = newTemporaryNetError("readSocks4aConnect: Failed to read domain name: %s", err.Error())
  609. return
  610. }
  611. host = string(hostBytes[:len(hostBytes)-1])
  612. } else {
  613. host = net.IPv4(rawHostIP[0], rawHostIP[1], rawHostIP[2], rawHostIP[3]).String()
  614. }
  615. req.Target = fmt.Sprintf("%s:%d", host, port)
  616. if err = socksFlushReadBuffer(r); err != nil {
  617. err = newTemporaryNetError("readSocks4aConnect: Failed to flush buffers: %s", err.Error())
  618. return
  619. }
  620. return
  621. }
  622. // Send a SOCKS4a response with the given code and address. If the IP field
  623. // inside addr is not an IPv4 address, the IP portion of the response will be
  624. // four zero bytes.
  625. func sendSocks4aResponse(w io.Writer, code byte, addr *net.TCPAddr) error {
  626. var resp [8]byte
  627. resp[0] = socks4ResponseVersion
  628. resp[1] = code
  629. resp[2] = byte((addr.Port >> 8) & 0xff)
  630. resp[3] = byte((addr.Port >> 0) & 0xff)
  631. ipv4 := addr.IP.To4()
  632. if ipv4 != nil {
  633. resp[4] = ipv4[0]
  634. resp[5] = ipv4[1]
  635. resp[6] = ipv4[2]
  636. resp[7] = ipv4[3]
  637. }
  638. if _, err := w.Write(resp[:]); err != nil {
  639. err = newTemporaryNetError("sendSocks4aResponse: Failed to write response: %s", err.Error())
  640. return err
  641. }
  642. return nil
  643. }
  644. // Send a SOCKS4a response code 0x5a.
  645. func sendSocks4aResponseGranted(w io.Writer, addr *net.TCPAddr) error {
  646. return sendSocks4aResponse(w, socks4RequestGranted, addr)
  647. }
  648. // Send a SOCKS4a response code 0x5b (with an all-zero address).
  649. func sendSocks4aResponseRejected(w io.Writer) error {
  650. emptyAddr := net.TCPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 0}
  651. return sendSocks4aResponse(w, socks4RequestRejected, &emptyAddr)
  652. }