Browse Source

Flag as invalid server entries with dial port 0

Rod Hynes 5 years ago
parent
commit
d08350fa19
1 changed files with 19 additions and 7 deletions
  1. 19 7
      psiphon/server/api.go

+ 19 - 7
psiphon/server/api.go

@@ -663,18 +663,30 @@ func statusAPIRequestHandler(
 			//
 			// IsValidServerEntryTag ensures that the local copy of psinet is not stale
 			// before returning a negative result, to mitigate accidental pruning.
+			//
+			// In addition, when the reported dial port number is 0, flag the server
+			// entry as invalid to trigger client pruning. This covers a class of
+			// invalid/semi-functional server entries, found in practice to be stored
+			// by clients, where some protocol port number has been omitted -- due to
+			// historical bugs in various server entry handling implementations. When
+			// missing from a server entry loaded by a client, the port number
+			// evaluates to 0, the zero value, which is not a valid port number even if
+			// were not missing.
 
-			var serverEntryTagStr string
+			serverEntryTag, ok := getOptionalStringRequestParam(failedTunnelStat, "server_entry_tag")
 
-			serverEntryTag, ok := failedTunnelStat["server_entry_tag"]
 			if ok {
-				serverEntryTagStr, ok = serverEntryTag.(string)
-			}
+				serverEntryValid := db.IsValidServerEntryTag(serverEntryTag)
+
+				if serverEntryValid {
+					dialPortNumber, err := getIntStringRequestParam(failedTunnelStat, "dial_port_number")
+					if err == nil && dialPortNumber == 0 {
+						serverEntryValid = false
+					}
+				}
 
-			if ok {
-				serverEntryValid := db.IsValidServerEntryTag(serverEntryTagStr)
 				if !serverEntryValid {
-					invalidServerEntryTags[serverEntryTagStr] = true
+					invalidServerEntryTags[serverEntryTag] = true
 				}
 
 				// Add a field to the failed_tunnel log indicating if the server entry is