فهرست منبع

Updated iOS embedded server entry list path to be optional

Amir Khan 8 سال پیش
والد
کامیت
898a34d417

+ 8 - 5
MobileLibrary/iOS/PsiphonTunnel/PsiphonTunnel/PsiphonTunnel.h

@@ -119,15 +119,11 @@ typedef NS_ENUM(NSInteger, PsiphonConnectionState)
 
 /*!
  Called when the tunnel is starting to get the initial server entries (typically embedded in the app) that will be used to bootstrap the Psiphon tunnel connection. This value is in a particular format and will be supplied by Psiphon Inc.
+ If getEmbeddedServerEntriesPath is also implemented, it will take precedence over this method, unless getEmbeddedServerEntriesPath returns NULL or an empty string.
  @return  Pre-existing server entries to use when attempting to connect to a server. Must return an empty string if there are no embedded server entries. Must return NULL if there is an error and the tunnel starting should abort.
  */
 - (NSString * _Nullable)getEmbeddedServerEntries;
 
-/*!
-  Called when the tunnel is starting to get the initial server entries (typically embedded in the app) that will be used to bootstrap the Psiphon tunnel connection. This value is in a particular format and will be supplied by Psiphon Inc. 
-  @return File path where embedded server entries file is located. This file should be accessible by the Network Extension.
- */
-- (NSString * _Nullable)getEmbeddedServerEntriesPath;
 
 //
 // Optional delegate methods. Note that some of these are probably necessary for
@@ -135,6 +131,13 @@ typedef NS_ENUM(NSInteger, PsiphonConnectionState)
 //
 @optional
 
+/*!
+  Called when the tunnel is starting to get the initial server entries (typically embedded in the app) that will be used to bootstrap the Psiphon tunnel connection. This value is in a particular format and will be supplied by Psiphon Inc.
+  If this method is implemented, it takes precedence over getEmbeddedServerEntries, and getEmbeddedServerEntries will not be called unless this method returns NULL or an empty string.
+  @return Optional path where embedded server entries file is located. This file should be accessible by the Network Extension.
+ */
+- (NSString * _Nullable)getEmbeddedServerEntriesPath;
+
 /*!
  Gets runtime errors info that may be useful for debugging.
  @param message  The diagnostic message string.

+ 6 - 3
MobileLibrary/iOS/PsiphonTunnel/PsiphonTunnel/PsiphonTunnel.m

@@ -118,9 +118,12 @@
         __block NSString *embeddedServerEntriesPath = nil;
         __block NSString *embeddedServerEntries = nil;
         
-        dispatch_sync(self->callbackQueue, ^{
-            embeddedServerEntriesPath = [self.tunneledAppDelegate getEmbeddedServerEntriesPath];
-        });
+        // getEmbeddedServerEntriesPath is optional in the protocol
+        if ([self.tunneledAppDelegate respondsToSelector:@selector(getEmbeddedServerEntriesPath)]) {
+            dispatch_sync(self->callbackQueue, ^{
+                embeddedServerEntriesPath = [self.tunneledAppDelegate getEmbeddedServerEntriesPath];
+            });
+        }
         
         // If getEmbeddedServerEntriesPath returns nil or empty string,
         // call getEmbeddedServerEntries

+ 33 - 34
MobileLibrary/psi/psi.go

@@ -91,29 +91,8 @@ func Start(
 		return fmt.Errorf("error initializing datastore: %s", err)
 	}
 
-	// if embeddedServerEntryListPath is not empty, ignore embeddedServerEntryList.
-	if embeddedServerEntryListPath != "" {
-
-		err := streamingStoreEntriesWithIOReader(embeddedServerEntryListPath)
-
-		if err != nil {
-			return err
-		}
-
-	} else {
-
-		serverEntries, err := protocol.DecodeServerEntryList(
-			embeddedServerEntryList,
-			common.GetCurrentTimestamp(),
-			protocol.SERVER_ENTRY_SOURCE_EMBEDDED)
-		if err != nil {
-			return fmt.Errorf("error decoding embedded server entry list: %s", err)
-		}
-		err = psiphon.StoreServerEntries(serverEntries, false)
-		if err != nil {
-			return fmt.Errorf("error storing embedded server entry list: %s", err)
-		}
-	}
+	// Stores list of server entries.
+	storeServerEntries(embeddedServerEntryListPath, embeddedServerEntryList)
 
 	controller, err = psiphon.NewController(config)
 	if err != nil {
@@ -181,18 +160,38 @@ func GetPacketTunnelDNSResolverIPv6Address() string {
 	return tun.GetTransparentDNSResolverIPv6Address().String()
 }
 
-// Opens file pointed to by embeddedServerEntryListPath, and stores the entries
-// using StreamingStoreServerEntries
-func streamingStoreEntriesWithIOReader(embeddedServerEntryListPath string) error {
-	serverEntriesFile, err := os.Open(embeddedServerEntryListPath)
-	if err != nil {
-		return fmt.Errorf("failed to read remote server list: %s", common.ContextError(err))
-	}
-	defer serverEntriesFile.Close()
 
-	err = psiphon.StreamingStoreServerEntriesWithIOReader(serverEntriesFile, protocol.SERVER_ENTRY_SOURCE_EMBEDDED)
-	if err != nil {
-		return fmt.Errorf("failed to store common remote server list: %s", common.ContextError(err))
+// Helper function to store a list of server entries.
+// if embeddedServerEntryListPath is not empty, embeddedServerEntryList will be ignored.
+func storeServerEntries(embeddedServerEntryListPath, embeddedServerEntryList string) error {
+
+	// if embeddedServerEntryListPath is not empty, ignore embeddedServerEntryList.
+	if embeddedServerEntryListPath != "" {
+
+		serverEntriesFile, err := os.Open(embeddedServerEntryListPath)
+		if err != nil {
+			return fmt.Errorf("failed to read remote server list: %s", common.ContextError(err))
+		}
+		defer serverEntriesFile.Close()
+
+		err = psiphon.StreamingStoreServerEntriesWithIOReader(serverEntriesFile, protocol.SERVER_ENTRY_SOURCE_EMBEDDED)
+		if err != nil {
+			return fmt.Errorf("failed to store common remote server list: %s", common.ContextError(err))
+		}
+
+	} else {
+
+		serverEntries, err := protocol.DecodeServerEntryList(
+			embeddedServerEntryList,
+			common.GetCurrentTimestamp(),
+			protocol.SERVER_ENTRY_SOURCE_EMBEDDED)
+		if err != nil {
+			return fmt.Errorf("error decoding embedded server entry list: %s", err)
+		}
+		err = psiphon.StoreServerEntries(serverEntries, false)
+		if err != nil {
+			return fmt.Errorf("error storing embedded server entry list: %s", err)
+		}
 	}
 
 	return nil