Browse Source

Merge pull request #109 from adamkruger/meek-fronting-addresses-regex

Meek fronting addresses regex
Rod Hynes 10 years ago
parent
commit
17de7e5d99
3 changed files with 25 additions and 9 deletions
  1. 4 0
      psiphon/controller.go
  2. 1 0
      psiphon/serverEntry.go
  3. 20 9
      psiphon/tunnel.go

+ 4 - 0
psiphon/controller.go

@@ -25,6 +25,7 @@ package psiphon
 
 import (
 	"errors"
+	"math/rand"
 	"net"
 	"sync"
 	"time"
@@ -62,6 +63,9 @@ type Controller struct {
 // NewController initializes a new controller.
 func NewController(config *Config) (controller *Controller, err error) {
 
+	// Needed by regen, at least
+	rand.Seed(int64(time.Now().Nanosecond()))
+
 	// Generate a session ID for the Psiphon server API. This session ID is
 	// used across all tunnels established by the controller.
 	sessionId, err := MakeSessionId()

+ 1 - 0
psiphon/serverEntry.go

@@ -66,6 +66,7 @@ type ServerEntry struct {
 	MeekFrontingHost              string   `json:"meekFrontingHost"`
 	MeekFrontingDomain            string   `json:"meekFrontingDomain"`
 	MeekFrontingAddresses         []string `json:"meekFrontingAddresses"`
+	MeekFrontingAddressesRegex    string   `json:"meekFrontingAddressesRegex"`
 }
 
 // SupportsProtocol returns true if and only if the ServerEntry has

+ 20 - 9
psiphon/tunnel.go

@@ -30,6 +30,7 @@ import (
 	"sync"
 	"time"
 
+        "github.com/Psiphon-Inc/goregen"
 	"github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/transferstats"
 	"golang.org/x/crypto/ssh"
 )
@@ -349,18 +350,28 @@ func dialSsh(
 
 	frontingAddress := ""
 	if useFronting {
+		if len(serverEntry.MeekFrontingAddressesRegex) > 0 {
 
-		// Randomly select, for this connection attempt, one front address for
-		// fronting-capable servers.
+			// Generate a front address based on the regex.
 
-		if len(serverEntry.MeekFrontingAddresses) == 0 {
-			return nil, nil, ContextError(errors.New("MeekFrontingAddresses is empty"))
-		}
-		index, err := MakeSecureRandomInt(len(serverEntry.MeekFrontingAddresses))
-		if err != nil {
-			return nil, nil, ContextError(err)
+			frontingAddress, err = regen.Generate(serverEntry.MeekFrontingAddressesRegex)
+			if err != nil {
+				return nil, nil, ContextError(err)
+			}
+		} else {
+
+			// Randomly select, for this connection attempt, one front address for
+			// fronting-capable servers.
+
+			if len(serverEntry.MeekFrontingAddresses) == 0 {
+				return nil, nil, ContextError(errors.New("MeekFrontingAddresses is empty"))
+			}
+			index, err := MakeSecureRandomInt(len(serverEntry.MeekFrontingAddresses))
+			if err != nil {
+				return nil, nil, ContextError(err)
+			}
+			frontingAddress = serverEntry.MeekFrontingAddresses[index]
 		}
-		frontingAddress = serverEntry.MeekFrontingAddresses[index]
 	}
 	NoticeConnectingServer(
 		serverEntry.IpAddress,