socks.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  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. // [Psiphon]
  260. // Some SOCKS5 clients send both None and Username/Password when in fact they are only
  261. // able to auth with None. Since we don't need pluggable transport parameters and prefer
  262. // enabling clients to proxy, we prefer None, which allows those clients to connect.
  263. /*
  264. switch m {
  265. case socksAuthNoneRequired:
  266. // Pick Username/Password over None if the client happens to
  267. // send both.
  268. if method == socksAuthNoAcceptableMethods {
  269. method = m
  270. }
  271. case socksAuthUsernamePassword:
  272. method = m
  273. }
  274. */
  275. switch m {
  276. case socksAuthNoneRequired:
  277. method = m
  278. case socksAuthUsernamePassword:
  279. if method == socksAuthNoAcceptableMethods {
  280. method = m
  281. }
  282. }
  283. // [Psiphon]
  284. }
  285. // Send the negotiated method.
  286. var msg [2]byte
  287. msg[0] = socks5Version
  288. msg[1] = method
  289. if _, err = rw.Writer.Write(msg[:]); err != nil {
  290. err = newTemporaryNetError("socks5NegotiateAuth: Failed to write negotiated method: %s", err.Error())
  291. return
  292. }
  293. if err = socksFlushBuffers(rw); err != nil {
  294. err = newTemporaryNetError("socks5NegotiateAuth: Failed to flush buffers: %s", err.Error())
  295. return
  296. }
  297. return
  298. }
  299. // socks5Authenticate authenticates the client via the chosen authentication
  300. // mechanism.
  301. func socks5Authenticate(rw *bufio.ReadWriter, method byte, req *SocksRequest) (err error) {
  302. switch method {
  303. case socksAuthNoneRequired:
  304. // Straight into reading the connect.
  305. case socksAuthUsernamePassword:
  306. if err = socks5AuthRFC1929(rw, req); err != nil {
  307. return
  308. }
  309. case socksAuthNoAcceptableMethods:
  310. err = newTemporaryNetError("socks5Authenticate: SOCKS method select had no compatible methods")
  311. return
  312. default:
  313. err = newTemporaryNetError("socks5Authenticate: SOCKS method select picked a unsupported method 0x%02x", method)
  314. return
  315. }
  316. if err = socksFlushBuffers(rw); err != nil {
  317. err = newTemporaryNetError("socks5Authenticate: Failed to flush buffers: %s", err)
  318. return
  319. }
  320. return
  321. }
  322. // socks5AuthRFC1929 authenticates the client via RFC 1929 username/password
  323. // auth. As a design decision any valid username/password is accepted as this
  324. // field is primarily used as an out-of-band argument passing mechanism for
  325. // pluggable transports.
  326. func socks5AuthRFC1929(rw *bufio.ReadWriter, req *SocksRequest) (err error) {
  327. sendErrResp := func() {
  328. // Swallow the write/flush error here, we are going to close the
  329. // connection and the original failure is more useful.
  330. resp := []byte{socksAuthRFC1929Ver, socksAuthRFC1929Fail}
  331. rw.Write(resp[:])
  332. socksFlushBuffers(rw)
  333. }
  334. // Validate the fixed parts of the command message.
  335. if err = socksReadByteVerify(rw.Reader, "auth version", socksAuthRFC1929Ver); err != nil {
  336. sendErrResp()
  337. err = newTemporaryNetError("socks5AuthRFC1929: %s", err)
  338. return
  339. }
  340. // Read the username.
  341. var ulen byte
  342. if ulen, err = socksReadByte(rw.Reader); err != nil {
  343. err = newTemporaryNetError("socks5AuthRFC1929: Failed to read username length: %s", err)
  344. return
  345. }
  346. if ulen < 1 {
  347. sendErrResp()
  348. err = newTemporaryNetError("socks5AuthRFC1929: username with 0 length")
  349. return
  350. }
  351. var uname []byte
  352. if uname, err = socksReadBytes(rw.Reader, int(ulen)); err != nil {
  353. err = newTemporaryNetError("socks5AuthRFC1929: Failed to read username: %s", err)
  354. return
  355. }
  356. req.Username = string(uname)
  357. // Read the password.
  358. var plen byte
  359. if plen, err = socksReadByte(rw.Reader); err != nil {
  360. err = newTemporaryNetError("socks5AuthRFC1929: Failed to read password length: %s", err)
  361. return
  362. }
  363. if plen < 1 {
  364. sendErrResp()
  365. err = newTemporaryNetError("socks5AuthRFC1929: password with 0 length")
  366. return
  367. }
  368. var passwd []byte
  369. if passwd, err = socksReadBytes(rw.Reader, int(plen)); err != nil {
  370. err = newTemporaryNetError("socks5AuthRFC1929: Failed to read password: %s", err)
  371. return
  372. }
  373. if !(plen == 1 && passwd[0] == 0x00) {
  374. // tor will set the password to 'NUL' if there are no arguments.
  375. req.Password = string(passwd)
  376. }
  377. // [Psiphon]
  378. // Since we don't need pluggable transport parameters and prefer enabling clients to proxy,
  379. // don't parse or validate username/password as PT args.
  380. /*
  381. // Mash the username/password together and parse it as a pluggable
  382. // transport argument string.
  383. if req.Args, err = parseClientParameters(req.Username + req.Password); err != nil {
  384. sendErrResp()
  385. err = newTemporaryNetError("socks5AuthRFC1929: failed to parse client parameters: %s", err)
  386. return
  387. }
  388. */
  389. // [Psiphon]
  390. // Write success response
  391. resp := []byte{socksAuthRFC1929Ver, socksAuthRFC1929Success}
  392. if _, err = rw.Write(resp[:]); err != nil {
  393. err = newTemporaryNetError("socks5AuthRFC1929: failed to write success response: %s", err)
  394. return
  395. }
  396. return
  397. }
  398. // socks5ReadCommand reads a SOCKS5 client command and parses out the relevant
  399. // fields into a SocksRequest. Only CMD_CONNECT is supported.
  400. func socks5ReadCommand(rw *bufio.ReadWriter, req *SocksRequest) (err error) {
  401. sendErrResp := func(reason byte) {
  402. // Swallow errors that occur when writing/flushing the response,
  403. // connection will be closed anyway.
  404. sendSocks5ResponseRejected(rw, reason)
  405. socksFlushBuffers(rw)
  406. }
  407. // Validate the fixed parts of the command message.
  408. if err = socksReadByteVerify(rw.Reader, "version", socks5Version); err != nil {
  409. sendErrResp(SocksRepGeneralFailure)
  410. err = newTemporaryNetError("socks5ReadCommand: %s", err)
  411. return
  412. }
  413. if err = socksReadByteVerify(rw.Reader, "command", socksCmdConnect); err != nil {
  414. sendErrResp(SocksRepCommandNotSupported)
  415. err = newTemporaryNetError("socks5ReadCommand: %s", err)
  416. return
  417. }
  418. if err = socksReadByteVerify(rw.Reader, "reserved", socksReserved); err != nil {
  419. sendErrResp(SocksRepGeneralFailure)
  420. err = newTemporaryNetError("socks5ReadCommand: %s", err)
  421. return
  422. }
  423. // Read the destination address/port.
  424. // XXX: This should probably eventually send socks 5 error messages instead
  425. // of rudely closing connections on invalid addresses.
  426. var atype byte
  427. if atype, err = socksReadByte(rw.Reader); err != nil {
  428. err = newTemporaryNetError("socks5ReadCommand: Failed to read address type: %s", err)
  429. return
  430. }
  431. var host string
  432. switch atype {
  433. case socksAtypeV4:
  434. var addr []byte
  435. if addr, err = socksReadBytes(rw.Reader, net.IPv4len); err != nil {
  436. err = newTemporaryNetError("socks5ReadCommand: Failed to read IPv4 address: %s", err)
  437. return
  438. }
  439. host = net.IPv4(addr[0], addr[1], addr[2], addr[3]).String()
  440. case socksAtypeDomainName:
  441. var alen byte
  442. if alen, err = socksReadByte(rw.Reader); err != nil {
  443. err = newTemporaryNetError("socks5ReadCommand: Failed to read domain name length: %s", err)
  444. return
  445. }
  446. if alen == 0 {
  447. err = newTemporaryNetError("socks5ReadCommand: SOCKS request had domain name with 0 length")
  448. return
  449. }
  450. var addr []byte
  451. if addr, err = socksReadBytes(rw.Reader, int(alen)); err != nil {
  452. err = newTemporaryNetError("socks5ReadCommand: Failed to read domain name: %s", err)
  453. return
  454. }
  455. host = string(addr)
  456. case socksAtypeV6:
  457. var rawAddr []byte
  458. if rawAddr, err = socksReadBytes(rw.Reader, net.IPv6len); err != nil {
  459. err = newTemporaryNetError("socks5ReadCommand: Failed to read IPv6 address: %s", err)
  460. return
  461. }
  462. addr := make(net.IP, net.IPv6len)
  463. copy(addr[:], rawAddr[:])
  464. host = fmt.Sprintf("[%s]", addr.String())
  465. default:
  466. sendErrResp(SocksRepAddressNotSupported)
  467. err = newTemporaryNetError("socks5ReadCommand: SOCKS request had unsupported address type 0x%02x", atype)
  468. return
  469. }
  470. var rawPort []byte
  471. if rawPort, err = socksReadBytes(rw.Reader, 2); err != nil {
  472. err = newTemporaryNetError("socks5ReadCommand: Failed to read port number: %s", err)
  473. return
  474. }
  475. port := int(rawPort[0])<<8 | int(rawPort[1])<<0
  476. if err = socksFlushBuffers(rw); err != nil {
  477. err = newTemporaryNetError("socks5ReadCommand: Failed to flush buffers: %s", err)
  478. return
  479. }
  480. req.Target = fmt.Sprintf("%s:%d", host, port)
  481. return
  482. }
  483. // Send a SOCKS5 response with the given code. BND.ADDR/BND.PORT is always the
  484. // IPv4 address/port "0.0.0.0:0".
  485. func sendSocks5Response(w io.Writer, code byte) error {
  486. resp := make([]byte, 4+4+2)
  487. resp[0] = socks5Version
  488. resp[1] = code
  489. resp[2] = socksReserved
  490. resp[3] = socksAtypeV4
  491. // BND.ADDR/BND.PORT should be the address and port that the outgoing
  492. // connection is bound to on the proxy, but Tor does not use this
  493. // information, so all zeroes are sent.
  494. if _, err := w.Write(resp[:]); err != nil {
  495. err = newTemporaryNetError("sendSocks5Response: Failed write response: %s", err)
  496. return err
  497. }
  498. return nil
  499. }
  500. // Send a SOCKS5 response code 0x00.
  501. func sendSocks5ResponseGranted(w io.Writer) error {
  502. return sendSocks5Response(w, socksRepSucceeded)
  503. }
  504. // Send a SOCKS5 response with the provided failure reason.
  505. func sendSocks5ResponseRejected(w io.Writer, reason byte) error {
  506. return sendSocks5Response(w, reason)
  507. }
  508. /*
  509. * Common helpers
  510. */
  511. func socksFlushBuffers(rw *bufio.ReadWriter) error {
  512. if err := rw.Writer.Flush(); err != nil {
  513. return err
  514. }
  515. if err := socksFlushReadBuffer(rw.Reader); err != nil {
  516. return err
  517. }
  518. return nil
  519. }
  520. func socksFlushReadBuffer(r *bufio.Reader) error {
  521. if r.Buffered() > 0 {
  522. return fmt.Errorf("%d bytes left after SOCKS message", r.Buffered())
  523. }
  524. return nil
  525. }
  526. func socksReadByte(r *bufio.Reader) (byte, error) {
  527. return r.ReadByte()
  528. }
  529. func socksReadBytes(r *bufio.Reader, n int) ([]byte, error) {
  530. ret := make([]byte, n)
  531. if _, err := io.ReadFull(r, ret); err != nil {
  532. return nil, err
  533. }
  534. return ret, nil
  535. }
  536. func socksReadByteVerify(r *bufio.Reader, descr string, expected byte) error {
  537. val, err := socksReadByte(r)
  538. if err != nil {
  539. return err
  540. }
  541. if val != expected {
  542. return fmt.Errorf("SOCKS message field %s was 0x%02x, not 0x%02x", descr, val, expected)
  543. }
  544. return nil
  545. }
  546. func socksReadBytesUntil(r *bufio.Reader, end byte) ([]byte, error) {
  547. val, err := r.ReadBytes(end)
  548. if err != nil {
  549. return nil, err
  550. }
  551. return val, nil
  552. }
  553. func socksPeekByte(r *bufio.Reader) (b byte, err error) {
  554. var byteSlice []byte
  555. if byteSlice, err = r.Peek(1); err != nil {
  556. return
  557. }
  558. b = byteSlice[0]
  559. return
  560. }
  561. // temporaryNetError is used for our custom errors. All such errors are "temporary";
  562. // that is, the listener doesn't need to be torn down when they occur. They also
  563. // need to implement the net.Error interface.
  564. type temporaryNetError struct {
  565. error
  566. }
  567. // Ensure temporaryNetError implements net.Error
  568. var _ net.Error = temporaryNetError{}
  569. func newTemporaryNetError(errMsg string, args ...interface{}) *temporaryNetError {
  570. return &temporaryNetError{
  571. error: fmt.Errorf(errMsg, args...),
  572. }
  573. }
  574. func (tne temporaryNetError) Timeout() bool {
  575. return false
  576. }
  577. func (tne temporaryNetError) Temporary() bool {
  578. return true
  579. }
  580. /*
  581. * SOCKS4a-specific code
  582. */
  583. // Read a SOCKS4a connect request. Returns a SocksRequest.
  584. func readSocks4aConnect(r *bufio.Reader) (req SocksRequest, err error) {
  585. // Validate the version.
  586. if err = socksReadByteVerify(r, "version", socks4Version); err != nil {
  587. err = newTemporaryNetError("readSocks4aConnect: %s", err.Error())
  588. return
  589. }
  590. var cmdConnect byte
  591. if cmdConnect, err = socksReadByte(r); err != nil {
  592. err = newTemporaryNetError("readSocks4aConnect: Failed to read connect command: %s", err.Error())
  593. return
  594. }
  595. if cmdConnect != socksCmdConnect {
  596. err = newTemporaryNetError("readSocks4aConnect: SOCKS header had command 0x%02x, not 0x%02x", cmdConnect, socksCmdConnect)
  597. return
  598. }
  599. var rawPort []byte
  600. if rawPort, err = socksReadBytes(r, 2); err != nil {
  601. err = newTemporaryNetError("readSocks4aConnect: Failed to read port: %s", err.Error())
  602. return
  603. }
  604. port := int(rawPort[0])<<8 | int(rawPort[1])<<0
  605. var rawHostIP []byte
  606. if rawHostIP, err = socksReadBytes(r, 4); err != nil {
  607. err = newTemporaryNetError("readSocks4aConnect: Failed to read IP address: %s", err.Error())
  608. return
  609. }
  610. // If there's a hostname, it comes after the username, so we'll wait a bit
  611. // before we process the IP info.
  612. var usernameBytes []byte
  613. usernameBytes, err = socksReadBytesUntil(r, '\x00')
  614. if err != nil {
  615. err = newTemporaryNetError("readSocks4aConnect: Failed to read username: %s", err.Error())
  616. return
  617. }
  618. req.Username = string(usernameBytes[:len(usernameBytes)-1])
  619. // [Psiphon]
  620. // Since we don't need pluggable transport parameters and prefer enabling clients to proxy,
  621. // don't parse or validate username/password as PT args.
  622. /*
  623. req.Args, err = parseClientParameters(req.Username)
  624. if err != nil {
  625. err = newTemporaryNetError("readSocks4aConnect: Failed to parse client parameters: %s", err.Error())
  626. return
  627. }
  628. */
  629. // [Psiphon]
  630. var host string
  631. if rawHostIP[0] == 0 && rawHostIP[1] == 0 && rawHostIP[2] == 0 && rawHostIP[3] != 0 {
  632. // If the IP is of the form 0.0.0.x (with x nonzero), then a domain name is provided.
  633. var hostBytes []byte
  634. if hostBytes, err = socksReadBytesUntil(r, '\x00'); err != nil {
  635. err = newTemporaryNetError("readSocks4aConnect: Failed to read domain name: %s", err.Error())
  636. return
  637. }
  638. host = string(hostBytes[:len(hostBytes)-1])
  639. } else {
  640. host = net.IPv4(rawHostIP[0], rawHostIP[1], rawHostIP[2], rawHostIP[3]).String()
  641. }
  642. req.Target = fmt.Sprintf("%s:%d", host, port)
  643. if err = socksFlushReadBuffer(r); err != nil {
  644. err = newTemporaryNetError("readSocks4aConnect: Failed to flush buffers: %s", err.Error())
  645. return
  646. }
  647. return
  648. }
  649. // Send a SOCKS4a response with the given code and address. If the IP field
  650. // inside addr is not an IPv4 address, the IP portion of the response will be
  651. // four zero bytes.
  652. func sendSocks4aResponse(w io.Writer, code byte, addr *net.TCPAddr) error {
  653. var resp [8]byte
  654. resp[0] = socks4ResponseVersion
  655. resp[1] = code
  656. resp[2] = byte((addr.Port >> 8) & 0xff)
  657. resp[3] = byte((addr.Port >> 0) & 0xff)
  658. ipv4 := addr.IP.To4()
  659. if ipv4 != nil {
  660. resp[4] = ipv4[0]
  661. resp[5] = ipv4[1]
  662. resp[6] = ipv4[2]
  663. resp[7] = ipv4[3]
  664. }
  665. if _, err := w.Write(resp[:]); err != nil {
  666. err = newTemporaryNetError("sendSocks4aResponse: Failed to write response: %s", err.Error())
  667. return err
  668. }
  669. return nil
  670. }
  671. // Send a SOCKS4a response code 0x5a.
  672. func sendSocks4aResponseGranted(w io.Writer, addr *net.TCPAddr) error {
  673. return sendSocks4aResponse(w, socks4RequestGranted, addr)
  674. }
  675. // Send a SOCKS4a response code 0x5b (with an all-zero address).
  676. func sendSocks4aResponseRejected(w io.Writer) error {
  677. emptyAddr := net.TCPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 0}
  678. return sendSocks4aResponse(w, socks4RequestRejected, &emptyAddr)
  679. }