Skip to content

Commit

Permalink
Add proxy support
Browse files Browse the repository at this point in the history
  • Loading branch information
tulir committed Jan 29, 2024
1 parent dd29ed9 commit 687ecaf
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 12 deletions.
3 changes: 2 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
1 change: 1 addition & 0 deletions config/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
2 changes: 2 additions & 0 deletions example-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
31 changes: 24 additions & 7 deletions messagix/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}

Expand Down
14 changes: 11 additions & 3 deletions messagix/socket.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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")
Expand Down
3 changes: 2 additions & 1 deletion user.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down

0 comments on commit 687ecaf

Please sign in to comment.