diff --git a/internal/constants/servers.go b/internal/constants/servers.go index ed858bac..9b3ea8a8 100644 --- a/internal/constants/servers.go +++ b/internal/constants/servers.go @@ -37,7 +37,7 @@ func GetAllServers() (allServers models.AllServers) { }, Surfshark: models.SurfsharkServers{ Version: 1, - Timestamp: 1599323261, + Timestamp: 1599957644, Servers: SurfsharkServers(), }, Vyprvpn: models.VyprvpnServers{ diff --git a/internal/constants/servers_test.go b/internal/constants/servers_test.go index a74f04b9..e66fce3e 100644 --- a/internal/constants/servers_test.go +++ b/internal/constants/servers_test.go @@ -53,7 +53,7 @@ func Test_timestamps(t *testing.T) { assert.Equal(t, "hAjEIo6FIrUsJuRmKOKPzA", digestServersTimestamp(t, allServers.Pia.Servers, allServers.Pia.Timestamp)) assert.Equal(t, "uiMp4IqH7NmvCIQ7gvR05Q", digestServersTimestamp(t, allServers.PiaOld.Servers, allServers.PiaOld.Timestamp)) assert.Equal(t, "kwJdVWTiBOspfrRwZIA+Sg", digestServersTimestamp(t, allServers.Purevpn.Servers, allServers.Purevpn.Timestamp)) - assert.Equal(t, "2rceMJexUNMv0VIqme34iA", digestServersTimestamp(t, allServers.Surfshark.Servers, allServers.Surfshark.Timestamp)) + assert.Equal(t, "q28ju2KJqLhrggJTTjXSiw", digestServersTimestamp(t, allServers.Surfshark.Servers, allServers.Surfshark.Timestamp)) assert.Equal(t, "KdIQWi2tYUM4aMXvWfVBEg", digestServersTimestamp(t, allServers.Vyprvpn.Servers, allServers.Vyprvpn.Timestamp)) assert.Equal(t, "faQUVtOnLMVezN0giHSz3Q", digestServersTimestamp(t, allServers.Windscribe.Servers, allServers.Windscribe.Timestamp)) } diff --git a/internal/constants/surfshark.go b/internal/constants/surfshark.go index 21cfe8f3..6c82255d 100644 --- a/internal/constants/surfshark.go +++ b/internal/constants/surfshark.go @@ -22,47 +22,62 @@ func SurfsharkRegionChoices() (choices []string) { func SurfsharkServers() []models.SurfsharkServer { return []models.SurfsharkServer{ - {Region: "Albania", IPs: []net.IP{{31, 171, 152, 195}, {31, 171, 154, 149}}}, - {Region: "Argentina Buenos Aires", IPs: []net.IP{{91, 206, 168, 13}, {91, 206, 168, 15}}}, - {Region: "Australia Melbourne", IPs: []net.IP{{144, 48, 38, 19}}}, - {Region: "Australia Perth", IPs: []net.IP{{124, 150, 139, 43}, {124, 150, 139, 123}}}, - {Region: "Australia Sydney", IPs: []net.IP{{45, 125, 247, 43}, {45, 125, 247, 195}}}, - {Region: "Austria", IPs: []net.IP{{5, 253, 207, 51}, {37, 120, 212, 77}}}, + {Region: "Albania", IPs: []net.IP{{31, 171, 152, 197}, {31, 171, 154, 147}}}, + {Region: "Argentina Buenos Aires", IPs: []net.IP{{91, 206, 168, 13}, {91, 206, 168, 24}}}, + {Region: "Australia Adelaide", IPs: []net.IP{{45, 248, 79, 67}, {45, 248, 79, 69}}}, + {Region: "Australia Brisbane", IPs: []net.IP{{144, 48, 39, 107}, {144, 48, 39, 131}}}, + {Region: "Australia Melbourne", IPs: []net.IP{{103, 192, 80, 141}, {144, 48, 38, 141}}}, + {Region: "Australia Perth", IPs: []net.IP{{45, 248, 78, 45}, {124, 150, 139, 27}}}, + {Region: "Australia Sydney", IPs: []net.IP{{45, 125, 247, 195}, {180, 149, 228, 117}}}, + {Region: "Australia US", IPs: []net.IP{{45, 76, 117, 108}}}, + {Region: "Austria", IPs: []net.IP{{5, 253, 207, 83}, {37, 120, 212, 131}}}, {Region: "Azerbaijan", IPs: []net.IP{{94, 20, 21, 85}, {94, 20, 21, 87}}}, - {Region: "Belgium", IPs: []net.IP{{5, 253, 205, 99}, {185, 232, 21, 51}}}, - {Region: "Brazil", IPs: []net.IP{{191, 96, 73, 212}, {191, 96, 73, 216}}}, - {Region: "Bulgaria", IPs: []net.IP{{37, 120, 152, 197}, {217, 138, 202, 21}}}, - {Region: "Canada Montreal", IPs: []net.IP{{198, 8, 85, 74}, {198, 8, 85, 89}}}, - {Region: "Canada Toronto", IPs: []net.IP{{68, 71, 244, 197}, {68, 71, 244, 222}}}, + {Region: "Belgium", IPs: []net.IP{{5, 253, 205, 181}, {5, 253, 205, 213}}}, + {Region: "Bosnia and Herzegovina", IPs: []net.IP{{185, 99, 3, 7}, {185, 212, 111, 41}}}, + {Region: "Brazil", IPs: []net.IP{{191, 96, 73, 214}, {191, 96, 73, 216}}}, + {Region: "Bulgaria", IPs: []net.IP{{37, 120, 152, 37}}}, + {Region: "Canada Montreal", IPs: []net.IP{{172, 98, 82, 85}, {198, 8, 85, 19}}}, + {Region: "Canada Toronto", IPs: []net.IP{{68, 71, 244, 200}, {104, 200, 138, 163}}}, + {Region: "Canada Toronto mp001", IPs: []net.IP{{138, 197, 151, 26}}}, + {Region: "Canada US", IPs: []net.IP{{159, 203, 57, 80}}}, + {Region: "Canada Vancouver", IPs: []net.IP{{66, 115, 147, 79}, {66, 115, 147, 87}}}, {Region: "Chile", IPs: []net.IP{{31, 169, 121, 16}}}, - {Region: "Colombia", IPs: []net.IP{{45, 129, 32, 5}, {45, 129, 32, 10}}}, + {Region: "Colombia", IPs: []net.IP{{45, 129, 32, 8}}}, {Region: "Costa Rica", IPs: []net.IP{{176, 227, 241, 19}, {176, 227, 241, 21}}}, {Region: "Croatia", IPs: []net.IP{{89, 164, 99, 109}, {89, 164, 99, 111}}}, - {Region: "Cyprus", IPs: []net.IP{{195, 47, 194, 36}, {195, 47, 194, 61}}}, + {Region: "Cyprus", IPs: []net.IP{{195, 47, 194, 34}}}, {Region: "Czech Republic", IPs: []net.IP{{185, 152, 64, 151}, {185, 152, 64, 178}}}, - {Region: "Estonia", IPs: []net.IP{{165, 231, 163, 3}, {185, 174, 159, 51}}}, - {Region: "Finland", IPs: []net.IP{{196, 244, 191, 163}, {196, 244, 191, 197}}}, - {Region: "France Bordeaux", IPs: []net.IP{{185, 108, 106, 142}, {185, 108, 106, 164}}}, - {Region: "France Marseilles", IPs: []net.IP{{185, 166, 84, 65}, {185, 166, 84, 85}}}, - {Region: "France Paris", IPs: []net.IP{{45, 83, 90, 183}, {84, 247, 51, 251}}}, - {Region: "Germany Berlin", IPs: []net.IP{{152, 89, 163, 245}, {217, 138, 216, 219}}}, - {Region: "Germany Frankfurt am Main", IPs: []net.IP{{37, 120, 196, 51}, {37, 120, 197, 11}}}, + {Region: "Denmark", IPs: []net.IP{{37, 120, 194, 115}, {95, 174, 65, 71}}}, + {Region: "Estonia", IPs: []net.IP{{165, 231, 163, 23}, {185, 174, 159, 69}}}, + {Region: "Finland", IPs: []net.IP{{196, 244, 191, 179}, {196, 244, 191, 181}}}, + {Region: "France Bordeaux", IPs: []net.IP{{185, 108, 106, 67}, {185, 108, 106, 150}}}, + {Region: "France Marseilles", IPs: []net.IP{{185, 166, 84, 53}, {185, 166, 84, 75}}}, + {Region: "France Paris", IPs: []net.IP{{45, 83, 90, 181}, {45, 89, 174, 103}}}, + {Region: "France Sweden", IPs: []net.IP{{199, 247, 8, 20}}}, + {Region: "Germany Berlin", IPs: []net.IP{{152, 89, 163, 19}, {217, 138, 216, 243}}}, + {Region: "Germany Frankfurt am Main", IPs: []net.IP{{185, 158, 135, 36}, {185, 220, 70, 83}}}, {Region: "Germany Frankfurt am Main st001", IPs: []net.IP{{45, 87, 212, 179}}}, {Region: "Germany Frankfurt am Main st002", IPs: []net.IP{{45, 87, 212, 181}}}, {Region: "Germany Frankfurt am Main st003", IPs: []net.IP{{45, 87, 212, 183}}}, - {Region: "Germany Munich", IPs: []net.IP{{178, 238, 231, 49}, {178, 238, 231, 51}}}, - {Region: "Germany Nuremberg", IPs: []net.IP{{62, 171, 149, 162}, {62, 171, 151, 180}}}, - {Region: "Greece", IPs: []net.IP{{194, 150, 167, 34}, {194, 150, 167, 44}}}, - {Region: "Hong Kong", IPs: []net.IP{{84, 17, 37, 154}, {84, 17, 57, 66}}}, - {Region: "Iceland", IPs: []net.IP{{82, 221, 128, 156}, {82, 221, 143, 241}}}, - {Region: "India Chennai", IPs: []net.IP{{103, 94, 27, 101}, {103, 94, 27, 229}}}, - {Region: "India Indore", IPs: []net.IP{{103, 73, 189, 219}, {103, 73, 189, 221}}}, - {Region: "Indonesia", IPs: []net.IP{{103, 120, 66, 219}, {103, 120, 66, 221}}}, - {Region: "Ireland", IPs: []net.IP{{23, 92, 127, 93}, {217, 138, 222, 45}}}, - {Region: "Israel", IPs: []net.IP{{87, 239, 255, 107}, {87, 239, 255, 109}}}, - {Region: "Italy Milan", IPs: []net.IP{{84, 17, 58, 148}, {212, 102, 54, 160}}}, - {Region: "Italy Rome", IPs: []net.IP{{82, 102, 26, 91}, {185, 217, 71, 53}}}, - {Region: "Japan Tokyo", IPs: []net.IP{{89, 187, 161, 4}, {103, 208, 221, 229}}}, + {Region: "Germany Frankfurt mp001", IPs: []net.IP{{46, 101, 189, 14}}}, + {Region: "Germany Munich", IPs: []net.IP{{178, 238, 231, 51}, {178, 238, 231, 55}}}, + {Region: "Germany Nuremberg", IPs: []net.IP{{62, 171, 149, 162}, {62, 171, 151, 182}}}, + {Region: "Germany Singapour", IPs: []net.IP{{159, 89, 14, 157}}}, + {Region: "Germany UK", IPs: []net.IP{{46, 101, 250, 73}}}, + {Region: "Greece", IPs: []net.IP{{194, 150, 167, 34}, {194, 150, 167, 40}}}, + {Region: "Hong Kong", IPs: []net.IP{{84, 17, 57, 73}, {212, 102, 42, 201}}}, + {Region: "Hungary", IPs: []net.IP{{37, 120, 144, 151}, {37, 120, 144, 213}}}, + {Region: "Iceland", IPs: []net.IP{{82, 221, 128, 166}, {82, 221, 143, 243}}}, + {Region: "India Chennai", IPs: []net.IP{{103, 108, 117, 118}, {103, 108, 117, 151}}}, + {Region: "India Indore", IPs: []net.IP{{103, 39, 132, 189}, {137, 59, 52, 109}}}, + {Region: "India Mumbai", IPs: []net.IP{{103, 221, 233, 88}, {165, 231, 253, 147}}}, + {Region: "India UK", IPs: []net.IP{{134, 209, 148, 122}}}, + {Region: "Indonesia", IPs: []net.IP{{103, 120, 66, 214}, {103, 120, 66, 216}}}, + {Region: "Ireland", IPs: []net.IP{{185, 108, 128, 159}, {185, 108, 128, 181}}}, + {Region: "Israel", IPs: []net.IP{{87, 239, 255, 109}}}, + {Region: "Italy Milan", IPs: []net.IP{{84, 17, 58, 148}, {185, 128, 27, 37}}}, + {Region: "Italy Rome", IPs: []net.IP{{82, 102, 26, 61}, {82, 102, 26, 115}}}, + {Region: "Japan Tokyo", IPs: []net.IP{{45, 87, 213, 5}, {103, 208, 221, 227}}}, {Region: "Japan Tokyo st001", IPs: []net.IP{{45, 87, 213, 19}}}, {Region: "Japan Tokyo st002", IPs: []net.IP{{45, 87, 213, 21}}}, {Region: "Japan Tokyo st003", IPs: []net.IP{{45, 87, 213, 23}}}, @@ -70,84 +85,100 @@ func SurfsharkServers() []models.SurfsharkServer { {Region: "Japan Tokyo st005", IPs: []net.IP{{217, 138, 212, 21}}}, {Region: "Japan Tokyo st006", IPs: []net.IP{{82, 102, 28, 123}}}, {Region: "Japan Tokyo st007", IPs: []net.IP{{82, 102, 28, 125}}}, - {Region: "Kazakhstan", IPs: []net.IP{{95, 57, 207, 202}, {95, 57, 207, 204}}}, - {Region: "Korea", IPs: []net.IP{{61, 14, 210, 244}, {103, 249, 28, 231}}}, - {Region: "Latvia", IPs: []net.IP{{188, 92, 78, 135}, {188, 92, 78, 145}}}, + {Region: "Kazakhstan", IPs: []net.IP{{95, 57, 207, 200}}}, + {Region: "Korea", IPs: []net.IP{{61, 14, 210, 239}, {61, 97, 243, 112}}}, + {Region: "Latvia", IPs: []net.IP{{188, 92, 78, 140}, {188, 92, 78, 142}}}, {Region: "Libya", IPs: []net.IP{{41, 208, 72, 157}, {41, 208, 72, 204}}}, - {Region: "Luxembourg", IPs: []net.IP{{185, 153, 151, 94}, {185, 153, 151, 106}}}, + {Region: "Luxembourg", IPs: []net.IP{{185, 153, 151, 60}, {185, 153, 151, 83}}}, {Region: "Malaysia", IPs: []net.IP{{42, 0, 30, 152}, {42, 0, 30, 209}}}, - {Region: "Mexico City Mexico", IPs: []net.IP{{194, 41, 112, 5}, {194, 41, 112, 11}}}, + {Region: "Mexico City Mexico", IPs: []net.IP{{194, 41, 112, 9}, {194, 41, 112, 19}}}, {Region: "Moldova", IPs: []net.IP{{178, 175, 128, 235}, {178, 175, 128, 237}}}, - {Region: "Netherlands Amsterdam", IPs: []net.IP{{81, 19, 209, 120}, {185, 59, 222, 92}}}, - {Region: "Nigeria", IPs: []net.IP{{102, 165, 23, 4}}}, + {Region: "Netherlands Amsterdam", IPs: []net.IP{{89, 46, 223, 74}, {89, 46, 223, 217}}}, + {Region: "Netherlands Amsterdam mp001", IPs: []net.IP{{188, 166, 43, 117}}}, + {Region: "Netherlands Amsterdam st001", IPs: []net.IP{{81, 19, 209, 51}}}, + {Region: "Netherlands US", IPs: []net.IP{{188, 166, 98, 91}}}, + {Region: "New Zealand", IPs: []net.IP{{180, 149, 231, 67}}}, + {Region: "Nigeria", IPs: []net.IP{{102, 165, 23, 6}, {102, 165, 23, 42}}}, {Region: "North Macedonia", IPs: []net.IP{{185, 225, 28, 93}, {185, 225, 28, 101}}}, - {Region: "Norway", IPs: []net.IP{{45, 12, 223, 213}, {95, 174, 66, 41}}}, - {Region: "Paraguay", IPs: []net.IP{{186, 16, 32, 168}, {186, 16, 32, 173}}}, - {Region: "Philippines", IPs: []net.IP{{45, 134, 224, 5}, {45, 134, 224, 18}}}, - {Region: "Poland Gdansk", IPs: []net.IP{{5, 187, 49, 189}, {5, 187, 53, 55}}}, - {Region: "Poland Warsaw", IPs: []net.IP{{84, 17, 55, 134}, {185, 246, 208, 72}}}, - {Region: "Portugal Loule", IPs: []net.IP{{176, 61, 146, 106}, {176, 61, 146, 118}}}, - {Region: "Portugal Porto", IPs: []net.IP{{194, 39, 127, 21}, {194, 39, 127, 38}}}, - {Region: "Romania", IPs: []net.IP{{45, 89, 175, 53}, {86, 106, 137, 147}}}, - {Region: "Russia Moscow", IPs: []net.IP{{213, 183, 56, 145}, {213, 183, 56, 233}}}, - {Region: "Russia St. Petersburg", IPs: []net.IP{{213, 183, 54, 110}, {213, 183, 54, 143}}}, - {Region: "Serbia", IPs: []net.IP{{152, 89, 160, 115}, {152, 89, 160, 117}}}, - {Region: "Singapore", IPs: []net.IP{{89, 187, 163, 132}, {89, 187, 163, 195}}}, + {Region: "Norway", IPs: []net.IP{{45, 12, 223, 213}, {84, 247, 50, 69}}}, + {Region: "Paraguay", IPs: []net.IP{{181, 40, 18, 56}, {186, 16, 32, 163}}}, + {Region: "Philippines", IPs: []net.IP{{45, 134, 224, 10}, {45, 134, 224, 20}}}, + {Region: "Poland Gdansk", IPs: []net.IP{{5, 187, 53, 51}}}, + {Region: "Poland Warsaw", IPs: []net.IP{{185, 246, 208, 77}, {185, 246, 208, 105}}}, + {Region: "Portugal Lisbon", IPs: []net.IP{{5, 154, 174, 26}, {5, 154, 174, 173}}}, + {Region: "Portugal Loule", IPs: []net.IP{{176, 61, 146, 111}, {176, 61, 146, 123}}}, + {Region: "Portugal Porto", IPs: []net.IP{{194, 39, 127, 242}}}, + {Region: "Romania", IPs: []net.IP{{86, 106, 137, 147}, {86, 106, 137, 149}}}, + {Region: "Russia Moscow", IPs: []net.IP{{213, 183, 56, 145}, {213, 183, 56, 160}}}, + {Region: "Russia St. Petersburg", IPs: []net.IP{{213, 183, 54, 23}, {213, 183, 54, 165}}}, + {Region: "Serbia", IPs: []net.IP{{37, 120, 193, 53}, {152, 89, 160, 211}}}, + {Region: "Singapore", IPs: []net.IP{{89, 187, 162, 186}, {89, 187, 163, 210}}}, + {Region: "Singapore Hong Kong", IPs: []net.IP{{206, 189, 83, 129}}}, + {Region: "Singapore Netherlands", IPs: []net.IP{{104, 248, 148, 18}}}, {Region: "Singapore in", IPs: []net.IP{{128, 199, 193, 35}}}, {Region: "Singapore mp001", IPs: []net.IP{{206, 189, 94, 229}}}, {Region: "Singapore st001", IPs: []net.IP{{217, 138, 201, 91}}}, {Region: "Singapore st002", IPs: []net.IP{{217, 138, 201, 93}}}, {Region: "Singapore st003", IPs: []net.IP{{84, 247, 49, 19}}}, {Region: "Singapore st004", IPs: []net.IP{{84, 247, 49, 21}}}, - {Region: "Slovekia", IPs: []net.IP{{37, 120, 221, 3}, {193, 37, 255, 39}}}, - {Region: "Slovenia", IPs: []net.IP{{195, 158, 249, 40}, {195, 158, 249, 50}}}, - {Region: "South Africa", IPs: []net.IP{{154, 127, 49, 226}, {154, 127, 49, 228}}}, - {Region: "Spain Barcelona", IPs: []net.IP{{185, 188, 61, 5}, {185, 188, 61, 13}}}, - {Region: "Spain Madrid", IPs: []net.IP{{89, 37, 95, 13}, {188, 208, 141, 36}}}, - {Region: "Spain Valencia", IPs: []net.IP{{196, 196, 150, 85}, {196, 196, 150, 101}}}, - {Region: "Sweden", IPs: []net.IP{{185, 76, 9, 36}, {185, 76, 9, 44}}}, - {Region: "Switzerland", IPs: []net.IP{{37, 120, 213, 5}}}, - {Region: "Taiwan", IPs: []net.IP{{2, 58, 241, 27}, {103, 98, 75, 71}}}, - {Region: "Thailand", IPs: []net.IP{{103, 253, 74, 3}, {103, 253, 74, 7}}}, + {Region: "Slovekia", IPs: []net.IP{{193, 37, 255, 39}, {193, 37, 255, 41}}}, + {Region: "Slovenia", IPs: []net.IP{{195, 158, 249, 38}, {195, 158, 249, 42}}}, + {Region: "South Africa", IPs: []net.IP{{154, 127, 49, 226}, {154, 127, 49, 232}}}, + {Region: "Spain Barcelona", IPs: []net.IP{{185, 188, 61, 15}, {185, 188, 61, 25}}}, + {Region: "Spain Madrid", IPs: []net.IP{{188, 208, 141, 18}, {188, 208, 141, 20}}}, + {Region: "Spain Valencia", IPs: []net.IP{{185, 153, 150, 48}, {196, 196, 150, 71}}}, + {Region: "Sweden", IPs: []net.IP{{45, 83, 91, 149}, {185, 76, 9, 41}}}, + {Region: "Switzerland", IPs: []net.IP{{84, 17, 53, 219}, {84, 17, 53, 221}}}, + {Region: "Taiwan", IPs: []net.IP{{2, 58, 241, 5}, {2, 58, 241, 43}}}, + {Region: "Thailand", IPs: []net.IP{{45, 64, 186, 132}, {45, 64, 186, 163}}}, {Region: "Turkey", IPs: []net.IP{{185, 195, 79, 5}, {185, 195, 79, 19}}}, - {Region: "Turkey Istanbul", IPs: []net.IP{{107, 150, 95, 147}, {107, 150, 95, 163}}}, - {Region: "UK Glasgow", IPs: []net.IP{{185, 108, 105, 33}, {185, 108, 105, 151}}}, - {Region: "UK London", IPs: []net.IP{{178, 239, 166, 231}, {185, 16, 206, 75}}}, + {Region: "Turkey Istanbul", IPs: []net.IP{{107, 150, 95, 155}, {107, 150, 95, 157}}}, + {Region: "UK France", IPs: []net.IP{{188, 166, 168, 247}}}, + {Region: "UK Germany", IPs: []net.IP{{45, 77, 58, 16}}}, + {Region: "UK Glasgow", IPs: []net.IP{{185, 108, 105, 157}}}, + {Region: "UK London", IPs: []net.IP{{178, 239, 166, 218}, {185, 44, 78, 164}}}, {Region: "UK London mp001", IPs: []net.IP{{206, 189, 119, 92}}}, {Region: "UK London st001", IPs: []net.IP{{217, 146, 82, 83}}}, {Region: "UK London st002", IPs: []net.IP{{185, 134, 22, 80}}}, {Region: "UK London st003", IPs: []net.IP{{185, 134, 22, 92}}}, {Region: "UK London st004", IPs: []net.IP{{185, 44, 76, 186}}}, {Region: "UK London st005", IPs: []net.IP{{185, 44, 76, 188}}}, - {Region: "UK Manchester", IPs: []net.IP{{89, 238, 140, 227}, {193, 148, 17, 131}}}, - {Region: "US Bend", IPs: []net.IP{{45, 43, 14, 83}, {45, 43, 14, 85}}}, - {Region: "US Boston", IPs: []net.IP{{192, 34, 83, 232}, {199, 217, 107, 25}}}, - {Region: "US Charlotte", IPs: []net.IP{{192, 154, 254, 137}, {192, 154, 255, 54}}}, - {Region: "US Chicago", IPs: []net.IP{{74, 119, 146, 183}, {89, 187, 182, 173}}}, - {Region: "US Dallas", IPs: []net.IP{{66, 115, 177, 146}, {212, 102, 40, 71}}}, - {Region: "US Denver", IPs: []net.IP{{174, 128, 245, 5}, {212, 102, 44, 88}}}, - {Region: "US Gahanna", IPs: []net.IP{{104, 244, 208, 37}, {104, 244, 208, 213}}}, - {Region: "US Houston", IPs: []net.IP{{104, 148, 30, 39}, {199, 10, 64, 69}}}, - {Region: "US Kansas City", IPs: []net.IP{{107, 150, 39, 45}, {204, 12, 208, 117}}}, - {Region: "US Las Vegas", IPs: []net.IP{{185, 242, 5, 147}, {185, 242, 5, 155}}}, - {Region: "US Latham", IPs: []net.IP{{45, 43, 19, 66}, {45, 43, 19, 84}}}, - {Region: "US Los Angeles", IPs: []net.IP{{192, 111, 134, 205}, {192, 111, 134, 222}}}, - {Region: "US Miami", IPs: []net.IP{{172, 83, 42, 53}, {172, 83, 42, 156}}}, - {Region: "US New York City", IPs: []net.IP{{84, 17, 35, 66}, {84, 17, 35, 76}}}, + {Region: "UK Manchester", IPs: []net.IP{{193, 148, 17, 83}, {217, 138, 196, 91}}}, + {Region: "US Atlanta", IPs: []net.IP{{66, 115, 166, 147}, {66, 115, 166, 151}}}, + {Region: "US Bend", IPs: []net.IP{{45, 43, 14, 95}}}, + {Region: "US Boston", IPs: []net.IP{{173, 237, 207, 13}, {199, 217, 107, 20}}}, + {Region: "US Buffalo", IPs: []net.IP{{107, 174, 20, 130}}}, + {Region: "US Charlotte", IPs: []net.IP{{66, 11, 124, 136}, {192, 154, 254, 135}}}, + {Region: "US Chicago", IPs: []net.IP{{74, 119, 146, 197}, {89, 187, 182, 173}}}, + {Region: "US Dallas", IPs: []net.IP{{66, 115, 177, 133}, {66, 115, 177, 158}}}, + {Region: "US Denver", IPs: []net.IP{{212, 102, 44, 76}, {212, 102, 44, 98}}}, + {Region: "US Gahanna", IPs: []net.IP{{104, 244, 209, 99}, {104, 244, 211, 171}}}, + {Region: "US Houston", IPs: []net.IP{{104, 148, 30, 53}, {199, 10, 64, 115}}}, + {Region: "US Kansas City", IPs: []net.IP{{173, 208, 202, 59}, {173, 208, 202, 61}}}, + {Region: "US Las Vegas", IPs: []net.IP{{89, 187, 187, 149}, {185, 242, 5, 215}}}, + {Region: "US Latham", IPs: []net.IP{{45, 43, 19, 74}, {45, 43, 19, 92}}}, + {Region: "US Los Angeles", IPs: []net.IP{{38, 95, 110, 73}, {192, 111, 134, 202}}}, + {Region: "US Maryland", IPs: []net.IP{{23, 82, 8, 173}, {23, 105, 163, 94}}}, + {Region: "US Miami", IPs: []net.IP{{89, 187, 173, 250}, {172, 83, 42, 143}}}, + {Region: "US Netherlands", IPs: []net.IP{{142, 93, 58, 71}}}, + {Region: "US New York City", IPs: []net.IP{{84, 17, 35, 78}, {89, 187, 178, 92}}}, {Region: "US New York City mp001", IPs: []net.IP{{45, 55, 60, 159}}}, {Region: "US New York City st001", IPs: []net.IP{{92, 119, 177, 19}}}, {Region: "US New York City st002", IPs: []net.IP{{92, 119, 177, 21}}}, {Region: "US New York City st003", IPs: []net.IP{{92, 119, 177, 23}}}, {Region: "US New York City st004", IPs: []net.IP{{193, 148, 18, 51}}}, {Region: "US New York City st005", IPs: []net.IP{{193, 148, 18, 53}}}, - {Region: "US Orlando", IPs: []net.IP{{198, 147, 22, 85}, {198, 147, 22, 135}}}, - {Region: "US Phoenix", IPs: []net.IP{{184, 170, 240, 179}, {199, 58, 187, 10}}}, - {Region: "US Saint Louis", IPs: []net.IP{{148, 72, 169, 209}, {148, 72, 174, 51}}}, - {Region: "US Salt Lake City", IPs: []net.IP{{104, 200, 131, 172}, {104, 200, 131, 229}}}, - {Region: "US San Francisco", IPs: []net.IP{{107, 181, 166, 37}, {209, 58, 128, 48}}}, - {Region: "US Tampa", IPs: []net.IP{{209, 216, 92, 212}, {209, 216, 92, 222}}}, + {Region: "US Orlando", IPs: []net.IP{{198, 147, 22, 135}, {198, 147, 22, 213}}}, + {Region: "US Phoenix", IPs: []net.IP{{184, 170, 240, 179}, {199, 58, 187, 3}}}, + {Region: "US Portugal", IPs: []net.IP{{142, 93, 81, 242}}}, + {Region: "US Saint Louis", IPs: []net.IP{{148, 72, 174, 43}, {148, 72, 174, 51}}}, + {Region: "US Salt Lake City", IPs: []net.IP{{104, 200, 131, 165}, {104, 200, 131, 249}}}, + {Region: "US San Francisco", IPs: []net.IP{{107, 181, 166, 39}, {107, 181, 166, 83}}}, + {Region: "US San Francisco mp001", IPs: []net.IP{{165, 232, 53, 25}}}, + {Region: "US Seatle", IPs: []net.IP{{199, 229, 250, 163}}}, + {Region: "US Tampa", IPs: []net.IP{{209, 216, 92, 197}, {209, 216, 92, 205}}}, {Region: "Ukraine", IPs: []net.IP{{45, 9, 238, 23}, {45, 9, 238, 30}}}, - {Region: "United Arab Emirates", IPs: []net.IP{{45, 9, 249, 245}, {45, 9, 249, 247}}}, - {Region: "Vietnam", IPs: []net.IP{{202, 143, 111, 211}, {202, 143, 111, 213}}}, + {Region: "United Arab Emirates", IPs: []net.IP{{45, 9, 250, 99}, {45, 9, 250, 103}}}, + {Region: "Vietnam", IPs: []net.IP{{202, 143, 110, 29}, {202, 143, 110, 32}}}, } } diff --git a/internal/updater/ips.go b/internal/updater/ips.go index c7fcfa3b..85589a69 100644 --- a/internal/updater/ips.go +++ b/internal/updater/ips.go @@ -7,15 +7,18 @@ import ( ) func uniqueSortedIPs(ips []net.IP) []net.IP { - uniqueIPs := make(map[string]struct{}) + uniqueIPs := make(map[string]struct{}, len(ips)) for _, ip := range ips { - uniqueIPs[ip.String()] = struct{}{} + key := ip.String() + uniqueIPs[key] = struct{}{} } - ips = make([]net.IP, len(uniqueIPs)) - i := 0 - for ip := range uniqueIPs { - ips[i] = net.ParseIP(ip) - i++ + ips = make([]net.IP, 0, len(uniqueIPs)) + for key := range uniqueIPs { + ip := net.ParseIP(key) + if ipv4 := ip.To4(); ipv4 != nil { + ip = ipv4 + } + ips = append(ips, ip) } sort.Slice(ips, func(i, j int) bool { return bytes.Compare(ips[i], ips[j]) < 0 diff --git a/internal/updater/ips_test.go b/internal/updater/ips_test.go new file mode 100644 index 00000000..b2ea1051 --- /dev/null +++ b/internal/updater/ips_test.go @@ -0,0 +1,41 @@ +package updater + +import ( + "net" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_uniqueSortedIPs(t *testing.T) { + t.Parallel() + testCases := map[string]struct { + inputIPs []net.IP + outputIPs []net.IP + }{ + "nil": { + inputIPs: nil, + outputIPs: []net.IP{}, + }, + "empty": { + inputIPs: []net.IP{}, + outputIPs: []net.IP{}, + }, + "single IPv4": { + inputIPs: []net.IP{{1, 1, 1, 1}}, + outputIPs: []net.IP{{1, 1, 1, 1}}, + }, + "two IPv4s": { + inputIPs: []net.IP{{1, 1, 2, 1}, {1, 1, 1, 1}}, + outputIPs: []net.IP{{1, 1, 1, 1}, {1, 1, 2, 1}}, + }, + } + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + outputIPs := uniqueSortedIPs(testCase.inputIPs) + assert.Equal(t, testCase.outputIPs, outputIPs) + }) + } +} diff --git a/internal/updater/surfshark.go b/internal/updater/surfshark.go index 7cdfe3d4..d7d5e973 100644 --- a/internal/updater/surfshark.go +++ b/internal/updater/surfshark.go @@ -11,7 +11,12 @@ import ( ) func (u *updater) updateSurfshark(ctx context.Context) (err error) { - servers, err := findSurfsharkServers(ctx, u.lookupIP) + servers, warnings, err := findSurfsharkServers(ctx, u.lookupIP) + if u.options.CLI { + for _, warning := range warnings { + u.logger.Warn("Surfshark: %s", warning) + } + } if err != nil { return fmt.Errorf("cannot update Surfshark servers: %w", err) } @@ -23,51 +28,54 @@ func (u *updater) updateSurfshark(ctx context.Context) (err error) { return nil } -func findSurfsharkServers(ctx context.Context, lookupIP lookupIPFunc) (servers []models.SurfsharkServer, err error) { - const zipURL = "https://account.surfshark.com/api/v1/server/configurations" +func findSurfsharkServers(ctx context.Context, lookupIP lookupIPFunc) (servers []models.SurfsharkServer, warnings []string, err error) { + const zipURL = "https://my.surfshark.com/vpn/api/v1/server/configurations" contents, err := fetchAndExtractFiles(zipURL) if err != nil { - return nil, err + return nil, nil, err } + mapping := surfsharkSubdomainToRegion() for fileName, content := range contents { if err := ctx.Err(); err != nil { - return nil, err + return nil, warnings, err } if strings.HasSuffix(fileName, "_tcp.ovpn") { continue // only parse UDP files } remoteLines := extractRemoteLinesFromOpenvpn(content) if len(remoteLines) == 0 { - return nil, fmt.Errorf("cannot find any remote lines in %s", fileName) + return nil, warnings, fmt.Errorf("cannot find any remote lines in %s", fileName) } hosts := extractHostnamesFromRemoteLines(remoteLines) if len(hosts) == 0 { - return nil, fmt.Errorf("cannot find any hosts in %s", fileName) + return nil, warnings, fmt.Errorf("cannot find any hosts in %s", fileName) + } else if len(hosts) > 1 { + warning := fmt.Sprintf("more than one host in %q, only taking first one %q into account", fileName, hosts[0]) + warnings = append(warnings, warning) } - var IPs []net.IP - var region string - for _, host := range hosts { - if net.ParseIP(host) != nil { - // only a few IP addresses, no idea for what region - // ignore them - continue - } - const repetition = 3 - newIPs, err := resolveRepeat(ctx, lookupIP, host, repetition) - if err != nil { - return nil, err - } - IPs = append(IPs, newIPs...) - if region == "" { - subdomain := strings.TrimSuffix(host, ".prod.surfshark.com") - region = surfsharkSubdomainToRegion(subdomain) - } + host := hosts[0] + if net.ParseIP(host) != nil { + warning := fmt.Sprintf("ignoring IP address host %q in %q", host, fileName) + warnings = append(warnings, warning) + continue } - if len(IPs) == 0 { - continue // only IPs, no hostnames found + const repetition = 5 + IPs, err := resolveRepeat(ctx, lookupIP, host, repetition) + if err != nil { + return nil, warnings, err + } else if len(IPs) == 0 { + warning := fmt.Sprintf("no IP address found for host %q", host) + warnings = append(warnings, warning) + continue } - if region == "" { // region not found in mapping + subdomain := strings.TrimSuffix(host, ".prod.surfshark.com") + region, ok := mapping[subdomain] + if ok { + delete(mapping, subdomain) + } else { region = strings.TrimSuffix(hosts[0], ".prod.surfshark.com") + warning := fmt.Sprintf("subdomain %q not found in Surfshark mapping", subdomain) + warnings = append(warnings, warning) } server := models.SurfsharkServer{ Region: region, @@ -75,10 +83,45 @@ func findSurfsharkServers(ctx context.Context, lookupIP lookupIPFunc) (servers [ } servers = append(servers, server) } + + // process entries in mapping that were not in zip file + remainingServers, newWarnings, err := getRemainingServers(ctx, mapping, lookupIP) + warnings = append(warnings, newWarnings...) + if err != nil { + return nil, warnings, err + } + servers = append(servers, remainingServers...) + sort.Slice(servers, func(i, j int) bool { return servers[i].Region < servers[j].Region }) - return servers, nil + return servers, warnings, nil +} +func getRemainingServers(ctx context.Context, mapping map[string]string, lookupIP lookupIPFunc) ( + servers []models.SurfsharkServer, warnings []string, err error) { + for subdomain, region := range mapping { + if err := ctx.Err(); err != nil { + return servers, warnings, err + } + host := subdomain + ".prod.surfshark.com" + const repetition = 3 + IPs, err := resolveRepeat(ctx, lookupIP, host, repetition) + if err != nil { + warning := fmt.Sprintf("subdomain %q for region %q from mapping: %s", subdomain, region, err) + warnings = append(warnings, warning) + continue + } else if len(IPs) == 0 { + warning := fmt.Sprintf("subdomain %q for region %q from mapping did not resolve to any IP address", subdomain, region) + warnings = append(warnings, warning) + continue + } + server := models.SurfsharkServer{ + Region: region, + IPs: uniqueSortedIPs(IPs), + } + servers = append(servers, server) + } + return servers, warnings, nil } func stringifySurfsharkServers(servers []models.SurfsharkServer) (s string) { @@ -92,7 +135,7 @@ func stringifySurfsharkServers(servers []models.SurfsharkServer) (s string) { return s } -func surfsharkSubdomainToRegion(subdomain string) (region string) { +func surfsharkSubdomainToRegion() (mapping map[string]string) { return map[string]string{ "ae-dub": "United Arab Emirates", "al-tia": "Albania", @@ -248,5 +291,9 @@ func surfsharkSubdomainToRegion(subdomain string) (region string) { "ar-bua": "Argentina Buenos Aires", "tr-ist": "Turkey Istanbul", "mx-mex": "Mexico City Mexico", - }[subdomain] + "ca-tor-mp001": "Canada Toronto mp001", + "de-fra-mp001": "Germany Frankfurt mp001", + "nl-ams-mp001": "Netherlands Amsterdam mp001", + "us-sfo-mp001": "US San Francisco mp001", + } }