Просмотр исходного кода

Adjust NoticeAvailableEgressRegions for tactics

- Always exclude LimitTunnelProtocols

- Emit notice when there are no servers supporting
  limited tunnel protocols for selected region,
  allowing client to alert user to change selection
Rod Hynes 7 лет назад
Родитель
Сommit
a254309fad

+ 1 - 1
ConsoleClient/main.go

@@ -241,7 +241,7 @@ func main() {
 			}
 			// Since embedded server list entries may become stale, they will not
 			// overwrite existing stored entries for the same server.
-			err = psiphon.StoreServerEntries(serverEntries, false)
+			err = psiphon.StoreServerEntries(config, serverEntries, false)
 			if err != nil {
 				psiphon.NoticeError("error storing embedded server entry list data: %s", err)
 				return

+ 9 - 3
MobileLibrary/psi/psi.go

@@ -132,7 +132,10 @@ func Start(
 	}
 
 	// Stores list of server entries.
-	err = storeServerEntries(embeddedServerEntryListFilename, embeddedServerEntryList)
+	err = storeServerEntries(
+		config,
+		embeddedServerEntryListFilename,
+		embeddedServerEntryList)
 	if err != nil {
 		return err
 	}
@@ -222,7 +225,9 @@ func GetPacketTunnelDNSResolverIPv6Address() string {
 
 // Helper function to store a list of server entries.
 // if embeddedServerEntryListFilename is not empty, embeddedServerEntryList will be ignored.
-func storeServerEntries(embeddedServerEntryListFilename, embeddedServerEntryList string) error {
+func storeServerEntries(
+	config *psiphon.Config,
+	embeddedServerEntryListFilename, embeddedServerEntryList string) error {
 
 	if embeddedServerEntryListFilename != "" {
 
@@ -233,6 +238,7 @@ func storeServerEntries(embeddedServerEntryListFilename, embeddedServerEntryList
 		defer file.Close()
 
 		err = psiphon.StreamingStoreServerEntries(
+			config,
 			protocol.NewStreamingServerEntryDecoder(
 				file,
 				common.GetCurrentTimestamp(),
@@ -251,7 +257,7 @@ func storeServerEntries(embeddedServerEntryListFilename, embeddedServerEntryList
 		if err != nil {
 			return fmt.Errorf("error decoding embedded server list: %s", err)
 		}
-		err = psiphon.StoreServerEntries(serverEntries, false)
+		err = psiphon.StoreServerEntries(config, serverEntries, false)
 		if err != nil {
 			return fmt.Errorf("error storing embedded server list: %s", err)
 		}

+ 1 - 1
psiphon/controller.go

@@ -166,7 +166,7 @@ func NewController(config *Config) (controller *Controller, err error) {
 // component fails or the parent context is canceled.
 func (controller *Controller) Run(ctx context.Context) {
 
-	ReportAvailableRegions()
+	ReportAvailableRegions(controller.config)
 
 	runCtx, stopRunning := context.WithCancel(ctx)
 	defer stopRunning()

+ 28 - 7
psiphon/dataStore.go

@@ -285,7 +285,11 @@ func StoreServerEntry(serverEntry *protocol.ServerEntry, replaceIfExists bool) e
 
 // StoreServerEntries stores a list of server entries.
 // There is an independent transaction for each entry insert/update.
-func StoreServerEntries(serverEntries []*protocol.ServerEntry, replaceIfExists bool) error {
+func StoreServerEntries(
+	config *Config,
+	serverEntries []*protocol.ServerEntry,
+	replaceIfExists bool) error {
+
 	checkInitDataStore()
 
 	for _, serverEntry := range serverEntries {
@@ -297,7 +301,7 @@ func StoreServerEntries(serverEntries []*protocol.ServerEntry, replaceIfExists b
 
 	// Since there has possibly been a significant change in the server entries,
 	// take this opportunity to update the available egress regions.
-	ReportAvailableRegions()
+	ReportAvailableRegions(config)
 
 	return nil
 }
@@ -305,7 +309,9 @@ func StoreServerEntries(serverEntries []*protocol.ServerEntry, replaceIfExists b
 // StreamingStoreServerEntries stores a list of server entries.
 // There is an independent transaction for each entry insert/update.
 func StreamingStoreServerEntries(
-	serverEntries *protocol.StreamingServerEntryDecoder, replaceIfExists bool) error {
+	config *Config,
+	serverEntries *protocol.StreamingServerEntryDecoder,
+	replaceIfExists bool) error {
 
 	checkInitDataStore()
 
@@ -333,7 +339,7 @@ func StreamingStoreServerEntries(
 
 	// Since there has possibly been a significant change in the server entries,
 	// take this opportunity to update the available egress regions.
-	ReportAvailableRegions()
+	ReportAvailableRegions(config)
 
 	return nil
 }
@@ -637,6 +643,13 @@ func (iterator *ServerEntryIterator) Reset() error {
 
 		count := CountServerEntries(iterator.config.EgressRegion, limitTunnelProtocols)
 		NoticeCandidateServers(iterator.config.EgressRegion, limitTunnelProtocols, count)
+
+		// LimitTunnelProtocols may have changed since the last ReportAvailableRegions,
+		// and now there may be no servers with the required capabilities in the
+		// selected region. ReportAvailableRegions will signal this to the client.
+		if count == 0 {
+			ReportAvailableRegions(iterator.config)
+		}
 	}
 
 	// This query implements the Psiphon server candidate selection
@@ -889,13 +902,21 @@ func CountNonImpairedProtocols(
 }
 
 // ReportAvailableRegions prints a notice with the available egress regions.
-// Note that this report ignores LimitTunnelProtocols.
-func ReportAvailableRegions() {
+func ReportAvailableRegions(config *Config) {
 	checkInitDataStore()
 
+	limitTunnelProtocols := config.clientParameters.Get().TunnelProtocols(
+		parameters.LimitTunnelProtocols)
+
 	regions := make(map[string]bool)
 	err := scanServerEntries(func(serverEntry *protocol.ServerEntry) {
-		regions[serverEntry.Region] = true
+		if len(limitTunnelProtocols) == 0 ||
+			// When ReportAvailableRegions is called only limitTunnelProtocols is known;
+			// impairedTunnelProtocols and excludeMeek may not apply.
+			len(serverEntry.GetSupportedProtocols(limitTunnelProtocols, nil, false)) > 0 {
+
+			regions[serverEntry.Region] = true
+		}
 	})
 
 	if err != nil {

+ 1 - 1
psiphon/migrateDataStore_windows.go

@@ -88,7 +88,7 @@ func prepareMigrationEntries(config *Config) []*protocol.ServerEntry {
 func migrateEntries(config *Config, serverEntries []*protocol.ServerEntry, legacyDataStoreFilename string) {
 	checkInitDataStore()
 
-	err := StoreServerEntries(serverEntries, false)
+	err := StoreServerEntries(config, serverEntries, false)
 	if err != nil {
 		NoticeAlert("migrateEntries: StoreServerEntries failed: %s", err)
 	} else {

+ 2 - 0
psiphon/remoteServerList.go

@@ -94,6 +94,7 @@ func FetchCommonRemoteServerList(
 	}
 
 	err = StreamingStoreServerEntries(
+		config,
 		protocol.NewStreamingServerEntryDecoder(
 			serverListPayloadReader,
 			common.GetCurrentTimestamp(),
@@ -287,6 +288,7 @@ func FetchObfuscatedServerLists(
 		}
 
 		err = StreamingStoreServerEntries(
+			config,
 			protocol.NewStreamingServerEntryDecoder(
 				serverListPayloadReader,
 				common.GetCurrentTimestamp(),

+ 4 - 1
psiphon/serverApi.go

@@ -228,7 +228,10 @@ func (serverContext *ServerContext) doHandshakeRequest(
 	// The reason we are storing the entire array of server entries at once rather
 	// than one at a time is that some desirable side-effects get triggered by
 	// StoreServerEntries that don't get triggered by StoreServerEntry.
-	err = StoreServerEntries(decodedServerEntries, true)
+	err = StoreServerEntries(
+		serverContext.tunnel.config,
+		decodedServerEntries,
+		true)
 	if err != nil {
 		return common.ContextError(err)
 	}