Further restrict user agent pattern matching (#120)
* Further restrict user agent pattern matching * Add static qualifier to method
This commit is contained in:
		
							parent
							
								
									97c9a9b0b0
								
							
						
					
					
						commit
						57e1339230
					
				| 
						 | 
					@ -6,7 +6,6 @@ import org.whispersystems.textsecuregcm.util.Pair;
 | 
				
			||||||
import java.util.HashSet;
 | 
					import java.util.HashSet;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Optional;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
import java.util.regex.Matcher;
 | 
					import java.util.regex.Matcher;
 | 
				
			||||||
import java.util.regex.Pattern;
 | 
					import java.util.regex.Pattern;
 | 
				
			||||||
| 
						 | 
					@ -22,9 +21,9 @@ public class UserAgentTagUtil {
 | 
				
			||||||
    static final         List<Tag> UNRECOGNIZED_TAGS = List.of(Tag.of(PLATFORM_TAG, "unrecognized"), Tag.of(VERSION_TAG, "unrecognized"));
 | 
					    static final         List<Tag> UNRECOGNIZED_TAGS = List.of(Tag.of(PLATFORM_TAG, "unrecognized"), Tag.of(VERSION_TAG, "unrecognized"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final Map<String, Pattern> PATTERNS_BY_PLATFORM = Map.of(
 | 
					    private static final Map<String, Pattern> PATTERNS_BY_PLATFORM = Map.of(
 | 
				
			||||||
            "android", Pattern.compile("^Signal-Android (4[^ ]+).*$", Pattern.CASE_INSENSITIVE),
 | 
					            "android", Pattern.compile("^Signal-Android (4\\.\\d+\\.\\d+(?:\\.\\d+)?)(?:\\s.*)?$", Pattern.CASE_INSENSITIVE),
 | 
				
			||||||
            "desktop", Pattern.compile("^Signal Desktop (1[^ ]+).*$", Pattern.CASE_INSENSITIVE),
 | 
					            "desktop", Pattern.compile("^Signal Desktop (1\\.\\d+\\.\\d+(?:\\.\\d+)?)(?:\\s.*)?$", Pattern.CASE_INSENSITIVE),
 | 
				
			||||||
            "ios", Pattern.compile("^Signal/(3[^ ]+) \\(.*ios.*\\)$", Pattern.CASE_INSENSITIVE));
 | 
					            "ios", Pattern.compile("^Signal/(3\\.\\d+\\.\\d+(?:\\.\\d+)?) \\(.*ios.*\\)(?:\\s.*)?$", Pattern.CASE_INSENSITIVE));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static final         int                       MAX_VERSIONS  = 1_000;
 | 
					    static final         int                       MAX_VERSIONS  = 1_000;
 | 
				
			||||||
    private static final Set<Pair<String, String>> SEEN_VERSIONS = new HashSet<>();
 | 
					    private static final Set<Pair<String, String>> SEEN_VERSIONS = new HashSet<>();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,17 +22,27 @@ public class UserAgentTagUtilTest {
 | 
				
			||||||
                     new HashSet<>(UserAgentTagUtil.getUserAgentTags(userAgent)));
 | 
					                     new HashSet<>(UserAgentTagUtil.getUserAgentTags(userAgent)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static List<Tag> platformVersionTags(String platform, String version) {
 | 
				
			||||||
 | 
					        return List.of(Tag.of(UserAgentTagUtil.PLATFORM_TAG, platform), Tag.of(UserAgentTagUtil.VERSION_TAG, version));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @SuppressWarnings("unused")
 | 
					    @SuppressWarnings("unused")
 | 
				
			||||||
    private Object argumentsForTestGetUserAgentTags() {
 | 
					    private Object argumentsForTestGetUserAgentTags() {
 | 
				
			||||||
        return new Object[] {
 | 
					        return new Object[] {
 | 
				
			||||||
                new Object[] { "This is obviously not a reasonable User-Agent string.", UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
					                new Object[] { "This is obviously not a reasonable User-Agent string.", UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
                new Object[] { null,                                                    UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
					                new Object[] { null,                                                    UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
                new Object[] { "Signal-Android 4.53.7 (Android 8.1)",                   List.of(Tag.of(UserAgentTagUtil.PLATFORM_TAG, "android"), Tag.of(UserAgentTagUtil.VERSION_TAG, "4.53.7")) },
 | 
					                new Object[] { "Signal-Android 4.53.7 (Android 8.1)",                   platformVersionTags("android", "4.53.7") },
 | 
				
			||||||
                new Object[] { "Signal Desktop 1.2.3",                                  List.of(Tag.of(UserAgentTagUtil.PLATFORM_TAG, "desktop"), Tag.of(UserAgentTagUtil.VERSION_TAG, "1.2.3")) },
 | 
					                new Object[] { "Signal Desktop 1.2.3",                                  platformVersionTags("desktop", "1.2.3") },
 | 
				
			||||||
                new Object[] { "Signal/3.9.0 (iPhone; iOS 12.2; Scale/3.00)",           List.of(Tag.of(UserAgentTagUtil.PLATFORM_TAG, "ios"), Tag.of(UserAgentTagUtil.VERSION_TAG, "3.9.0")) },
 | 
					                new Object[] { "Signal/3.9.0 (iPhone; iOS 12.2; Scale/3.00)",           platformVersionTags("ios", "3.9.0") },
 | 
				
			||||||
                new Object[] { "Signal-Android 1.2.3 (Android 8.1)",                    UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
					                new Object[] { "Signal-Android 1.2.3 (Android 8.1)",                    UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
                new Object[] { "Signal Desktop 3.9.0",                                  UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
					                new Object[] { "Signal Desktop 3.9.0",                                  UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
                new Object[] { "Signal/4.53.7 (iPhone; iOS 12.2; Scale/3.00)",          UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
					                new Object[] { "Signal/4.53.7 (iPhone; iOS 12.2; Scale/3.00)",          UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
 | 
					                new Object[] { "Signal-Android 4.68.3 (Android 9)",                     platformVersionTags("android", "4.68.3") },
 | 
				
			||||||
 | 
					                new Object[] { "Signal-Android 1.2.3 (Android 4.3)",                    UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
 | 
					                new Object[] { "Signal-Android 4.68.3.0-bobsbootlegclient",             UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
 | 
					                new Object[] { "Signal Desktop 1.22.45-foo-0",                          UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
 | 
					                new Object[] { "Signal Desktop 1.34.5-beta.1-fakeclientemporium",       UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
 | 
					                new Object[] { "Signal Desktop 1.32.0-beta.3",                          UserAgentTagUtil.UNRECOGNIZED_TAGS },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue