This repository has no description
1package netutil
2
3import (
4 "fmt"
5 "net"
6 "net/http"
7 "net/url"
8
9 "github.com/bluesky-social/indigo/util/ssrf"
10 "github.com/gorilla/websocket"
11)
12
13// refuses non-public ips to prevent ssrf
14func SSRFDialer(dev bool) *net.Dialer {
15 if dev {
16 return &net.Dialer{}
17 }
18 return ssrf.PublicOnlyDialer()
19}
20
21// refuses non-public ips to prevent ssrf
22func SSRFTransport(dev bool) *http.Transport {
23 if dev {
24 return &http.Transport{}
25 }
26 return ssrf.PublicOnlyTransport()
27}
28
29// refuses non-public ips to prevent ssrf
30func SSRFWebsocketDialer(dev bool) *websocket.Dialer {
31 dialer := *websocket.DefaultDialer
32 dialer.NetDialContext = SSRFDialer(dev).DialContext
33 return &dialer
34}
35
36func EnforceWSSURL(rawURL string, dev bool) (*url.URL, error) {
37 u, err := url.Parse(rawURL)
38 if err != nil {
39 return nil, fmt.Errorf("invalid url: %w", err)
40 }
41 switch u.Scheme {
42 case "wss":
43 case "ws":
44 if !dev {
45 return nil, fmt.Errorf("insecure scheme %q is prohibited in production; use wss://", u.Scheme)
46 }
47 default:
48 return nil, fmt.Errorf("unsupported websocket scheme %q", u.Scheme)
49 }
50 return u, nil
51}