diff --git a/config/config.go b/config/config.go index 6794036..28870e5 100644 --- a/config/config.go +++ b/config/config.go @@ -51,7 +51,8 @@ type Config struct { } `yaml:"metrics"` Meta struct { - Mode BridgeMode `yaml:"mode"` + Mode BridgeMode `yaml:"mode"` + Proxy string `yaml:"proxy"` } `yaml:"meta"` Bridge BridgeConfig `yaml:"bridge"` diff --git a/config/upgrade.go b/config/upgrade.go index 444a982..6b158cb 100644 --- a/config/upgrade.go +++ b/config/upgrade.go @@ -70,6 +70,7 @@ func DoUpgrade(helper *up.Helper) { helper.Copy(up.Str, "metrics", "listen") helper.Copy(up.Str, "meta", "mode") + helper.Copy(up.Str|up.Null, "meta", "proxy") if usernameTemplate, ok := helper.Get(up.Str, "bridge", "username_template"); ok && strings.Contains(usernameTemplate, "{userid}") { helper.Set(up.Str, strings.ReplaceAll(usernameTemplate, "{userid}", "{{.}}"), "bridge", "username_template") diff --git a/example-config.yaml b/example-config.yaml index 474a019..4a11289 100644 --- a/example-config.yaml +++ b/example-config.yaml @@ -93,6 +93,8 @@ meta: # # Remember to change the appservice id, bot profile info, bridge username_template and management_room_text too. mode: instagram + # Proxy address for connecting to Meta. If empty, no proxy will be used. + proxy: # Bridge config bridge: diff --git a/messagix/client.go b/messagix/client.go index ba38a56..9a6afee 100644 --- a/messagix/client.go +++ b/messagix/client.go @@ -18,6 +18,7 @@ import ( "github.com/google/go-querystring/query" "github.com/rs/zerolog" + "golang.org/x/net/proxy" "go.mau.fi/mautrix-meta/messagix/cookies" "go.mau.fi/mautrix-meta/messagix/crypto" @@ -52,8 +53,9 @@ type Client struct { configs *Configs SyncManager *SyncManager - cookies cookies.Cookies - proxy func(*http.Request) (*url.URL, error) + cookies cookies.Cookies + httpProxy func(*http.Request) (*url.URL, error) + socksProxy proxy.Dialer lsRequests int graphQLRequests int @@ -181,16 +183,31 @@ func (c *Client) configurePlatformClient() { } } -func (c *Client) SetProxy(proxy string) error { - proxyParsed, err := url.Parse(proxy) +func (c *Client) SetProxy(proxyAddr string) error { + proxyParsed, err := url.Parse(proxyAddr) if err != nil { return err } - c.http.Transport = &http.Transport{ - Proxy: http.ProxyURL(proxyParsed), + if proxyParsed.Scheme == "http" || proxyParsed.Scheme == "https" { + c.httpProxy = http.ProxyURL(proxyParsed) + c.http.Transport.(*http.Transport).Proxy = c.httpProxy + } else if proxyParsed.Scheme == "socks5" { + c.socksProxy, err = proxy.FromURL(proxyParsed, &net.Dialer{Timeout: 20 * time.Second}) + if err != nil { + return err + } + c.http.Transport.(*http.Transport).Dial = c.socksProxy.Dial + contextDialer, ok := c.socksProxy.(proxy.ContextDialer) + if ok { + c.http.Transport.(*http.Transport).DialContext = contextDialer.DialContext + } } - c.Logger.Debug().Any("addr", proxyParsed.Host).Msg("Proxy Updated") + + c.Logger.Debug(). + Str("scheme", proxyParsed.Scheme). + Str("host", proxyParsed.Host). + Msg("Using proxy") return nil } diff --git a/messagix/socket.go b/messagix/socket.go index 03070ff..a56af3c 100644 --- a/messagix/socket.go +++ b/messagix/socket.go @@ -14,6 +14,7 @@ import ( "time" "github.com/gorilla/websocket" + "golang.org/x/net/proxy" "go.mau.fi/mautrix-meta/messagix/cookies" "go.mau.fi/mautrix-meta/messagix/methods" @@ -88,9 +89,16 @@ func (s *Socket) Connect() error { headers := s.getConnHeaders() brokerUrl := s.BuildBrokerUrl() - dialer := websocket.Dialer{} - if s.client.proxy != nil { - dialer.Proxy = s.client.proxy + dialer := websocket.Dialer{HandshakeTimeout: 20 * time.Second} + if s.client.httpProxy != nil { + dialer.Proxy = s.client.httpProxy + } else if s.client.socksProxy != nil { + dialer.NetDial = s.client.socksProxy.Dial + + contextDialer, ok := s.client.socksProxy.(proxy.ContextDialer) + if ok { + dialer.NetDialContext = contextDialer.DialContext + } } s.client.Logger.Debug().Str("broker", brokerUrl).Msg("Dialing socket") diff --git a/user.go b/user.go index 75ecdf5..16366e5 100644 --- a/user.go +++ b/user.go @@ -467,7 +467,8 @@ func (user *User) unlockedConnectWithCookies(cookies cookies.Cookies) (*messagix user.log.Debug().Msg("Connecting to Meta") log := user.log.With().Str("component", "messagix").Logger() - cli, err := messagix.NewClient(MessagixPlatform, cookies, log, "") + // TODO set proxy for media client + cli, err := messagix.NewClient(MessagixPlatform, cookies, log, user.bridge.Config.Meta.Proxy) if err != nil { return nil, fmt.Errorf("failed to prepare client: %w", err) }