Skip to content

Commit ea66600

Browse files
authored
Add support for setting allowed transports in the environment (#1504)
* Add support for setting allowed transports in the environment
1 parent 25a82ab commit ea66600

File tree

5 files changed

+94
-1
lines changed

5 files changed

+94
-1
lines changed

chained/proxy.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ func CreateDialersMap(configDir string, proxies map[string]*config.ProxyConfig,
9898
wg.Add(1)
9999
go func(name string, s *config.ProxyConfig) {
100100
defer wg.Done()
101+
if !common.SupportsTransport(s.PluggableTransport) {
102+
log.Debugf("Ignoring dialer for %v with transport %v not in %v", name, s.PluggableTransport, os.Getenv("LANTERN_TRANSPORTS"))
103+
return
104+
}
101105
dialer, err := CreateDialer(configDir, name, s, uc)
102106
if err != nil {
103107
log.Errorf("Unable to configure chained server %v. Received error: %v", name, err)

common/httpclient.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func GetHTTPClient() *http.Client {
5252
}
5353

5454
var k kindling.Kindling
55-
ioWriter := log.AsStdLogger().Writer()
55+
ioWriter := log.AsDebugLogger().Writer()
5656
// Create new fronted instance.
5757
f, err := newFronted(ioWriter, sentry.PanicListener)
5858
if err != nil {

common/lanternconfig.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package common
22

3+
import (
4+
"os"
5+
"slices"
6+
"strings"
7+
)
8+
39
const (
410
// The default name for this app (used if no client-supplied name is passed at initialization)
511
DefaultAppName = "Lantern"
@@ -10,3 +16,24 @@ const (
1016
// TrackingID is the Google Analytics tracking ID.
1117
TrackingID = "UA-21815217-12"
1218
)
19+
20+
var transports = loadTransports()
21+
22+
func loadTransports() []string {
23+
env := os.Getenv("LANTERN_TRANSPORTS")
24+
if env == "" {
25+
return []string{}
26+
}
27+
parts := strings.Split(env, ",")
28+
for i, part := range parts {
29+
parts[i] = strings.TrimSpace(part)
30+
}
31+
return parts
32+
}
33+
34+
// SupportsTransport reads the LANTERN_TRANSPORTS environment variable and returns whether or not the
35+
// specified transport is supported. If there is no LANTERN_TRANSPORTS environment variable defined,
36+
// all transports are supported.
37+
func SupportsTransport(transport string) bool {
38+
return len(transports) == 0 || slices.Contains(transports, transport)
39+
}

common/lanternconfig_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package common
2+
3+
import (
4+
"os"
5+
"reflect"
6+
"testing"
7+
)
8+
9+
func TestLoadTransports_EmptyEnv(t *testing.T) {
10+
orig := os.Getenv("LANTERN_TRANSPORTS")
11+
defer os.Setenv("LANTERN_TRANSPORTS", orig)
12+
13+
os.Unsetenv("LANTERN_TRANSPORTS")
14+
got := loadTransports()
15+
want := []string{}
16+
if !reflect.DeepEqual(got, want) {
17+
t.Errorf("Expected %v, got %v", want, got)
18+
}
19+
}
20+
21+
func TestLoadTransports_SingleTransport(t *testing.T) {
22+
orig := os.Getenv("LANTERN_TRANSPORTS")
23+
defer os.Setenv("LANTERN_TRANSPORTS", orig)
24+
25+
os.Setenv("LANTERN_TRANSPORTS", "obfs4")
26+
got := loadTransports()
27+
want := []string{"obfs4"}
28+
if !reflect.DeepEqual(got, want) {
29+
t.Errorf("Expected %v, got %v", want, got)
30+
}
31+
}
32+
33+
func TestLoadTransports_MultipleTransports(t *testing.T) {
34+
orig := os.Getenv("LANTERN_TRANSPORTS")
35+
defer os.Setenv("LANTERN_TRANSPORTS", orig)
36+
37+
os.Setenv("LANTERN_TRANSPORTS", "obfs4, meek, shadowsocks ")
38+
got := loadTransports()
39+
want := []string{"obfs4", "meek", "shadowsocks"}
40+
if !reflect.DeepEqual(got, want) {
41+
t.Errorf("Expected %v, got %v", want, got)
42+
}
43+
}
44+
45+
func TestLoadTransports_WhitespaceOnly(t *testing.T) {
46+
orig := os.Getenv("LANTERN_TRANSPORTS")
47+
defer os.Setenv("LANTERN_TRANSPORTS", orig)
48+
49+
os.Setenv("LANTERN_TRANSPORTS", " ")
50+
got := loadTransports()
51+
want := []string{""}
52+
if !reflect.DeepEqual(got, want) {
53+
t.Errorf("Expected %v, got %v", want, got)
54+
}
55+
}

dialer/parallel_dialer.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"context"
55
"errors"
66
"net"
7+
8+
"github.com/getlantern/flashlight/v7/common"
79
)
810

911
type parallelDialer struct {
@@ -21,6 +23,11 @@ func newParallelPreferProxyless(proxyless proxyless, d Dialer, opts *Options) Di
2123
}
2224

2325
func (d *parallelDialer) DialContext(ctx context.Context, network, addr string) (net.Conn, error) {
26+
if !common.SupportsTransport("proxyless") {
27+
log.Debugf("Proxyless transport not supported, falling back to default dialer for %s", addr)
28+
// If the proxyless transport is not supported, we fall back to the default dialer.
29+
return d.dialer.DialContext(ctx, network, addr)
30+
}
2431
switch d.proxylessDialer.status(addr) {
2532
case SUCCEEDED:
2633
log.Debugf("Proxyless dialer succeeded for %s, using it", addr)

0 commit comments

Comments
 (0)