From ae647625b0c260219ca1c930f32a65914d5bd28f Mon Sep 17 00:00:00 2001 From: kari-ts <135075563+kari-ts@users.noreply.github.com> Date: Tue, 2 Jan 2024 14:33:52 -0800 Subject: [PATCH 01/10] build.gradle: increase JVM memory settings (#145) This fixes the issue where building in Android Studio OOMs Fixes #10714 Signed-off-by: kari-ts --- android/gradle.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/gradle.properties b/android/gradle.properties index 31c5e979bf..eb5eeced9b 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,5 @@ android.defaults.buildfeatures.buildconfig=true android.nonFinalResIds=false android.nonTransitiveRClass=false -android.useAndroidX=true \ No newline at end of file +android.useAndroidX=true +org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m From 7a52cae96f7eb5b3fa6a549fc930c91e7f26bb1b Mon Sep 17 00:00:00 2001 From: kari-ts <135075563+kari-ts@users.noreply.github.com> Date: Mon, 8 Jan 2024 16:26:26 -0800 Subject: [PATCH 02/10] .gitignore: ignore Java profiling files (#146) Updates #cleanup --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e8af3f34b1..210f9d72a2 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,7 @@ tailscale-fdroid.apk tailscale.jks # android sdk dir -./android-sdk \ No newline at end of file +./android-sdk + +# Java profiling output +*.hprof \ No newline at end of file From dcca09fe7f836408336ec63e94478147350396ff Mon Sep 17 00:00:00 2001 From: Denton Gentry Date: Wed, 10 Jan 2024 12:13:46 -0800 Subject: [PATCH 03/10] Update OSS 1.57.x. Signed-off-by: Denton Gentry --- android/build.gradle | 2 +- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index ee34862948..69361a9fcb 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -26,7 +26,7 @@ android { defaultConfig { minSdkVersion 22 targetSdkVersion 33 - versionCode 192 + versionCode 193 versionName "1.55.148-t86aa0485a-g5ef7bbaff0a" } compileOptions { diff --git a/go.mod b/go.mod index 0e4720a7e5..2eb3af57fe 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( golang.org/x/exp/shiny v0.0.0-20220827204233-334a2380cb91 golang.org/x/sys v0.15.0 inet.af/netaddr v0.0.0-20220617031823-097006376321 - tailscale.com v1.1.1-0.20231208201721-86aa0485a6bb + tailscale.com v1.1.1-0.20240110191920-ca48db0d606d ) require ( @@ -57,7 +57,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 // indirect github.com/jsimonetti/rtnetlink v1.3.5 // indirect - github.com/klauspost/compress v1.17.0 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a // indirect github.com/mdlayher/genetlink v1.3.2 // indirect github.com/mdlayher/netlink v1.7.2 // indirect @@ -70,11 +70,11 @@ require ( github.com/safchain/ethtool v0.3.0 // indirect github.com/tailscale/certstore v0.1.1-0.20231202035212-d3fa0460f47e // indirect github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55 // indirect - github.com/tailscale/golang-x-crypto v0.0.0-20230713185742-f0b76a10a08e // indirect + github.com/tailscale/golang-x-crypto v0.0.0-20240108194725-7ce1f622c780 // indirect github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a // indirect github.com/tailscale/netlink v1.1.1-0.20211101221916-cabfb018fe85 // indirect - github.com/tailscale/web-client-prebuilt v0.0.0-20231208174705-9b3142ca6f79 // indirect + github.com/tailscale/web-client-prebuilt v0.0.0-20240109232428-26bf65339dda // indirect github.com/tcnksm/go-httpstat v0.2.0 // indirect github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect github.com/vishvananda/netlink v1.2.1-beta.2 // indirect @@ -84,13 +84,13 @@ require ( go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect go4.org/netipx v0.0.0-20230824141953-6213f710f925 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 // indirect - golang.org/x/crypto v0.15.0 // indirect + golang.org/x/crypto v0.17.1-0.20240102205709-08396bb92b82 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/image v0.12.0 // indirect golang.org/x/mod v0.14.0 // indirect golang.org/x/net v0.18.0 // indirect golang.org/x/sync v0.5.0 // indirect - golang.org/x/term v0.14.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.15.0 // indirect diff --git a/go.sum b/go.sum index f1ac18a57d..ed1ee8c04e 100644 --- a/go.sum +++ b/go.sum @@ -282,8 +282,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= -github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/knq/sysutil v0.0.0-20191005231841-15668db23d08 h1:V0an7KRw92wmJysvFvtqtKMAPmvS5O0jtB0nYo6t+gs= @@ -441,16 +441,16 @@ github.com/tailscale/certstore v0.1.1-0.20231202035212-d3fa0460f47e h1:PtWT87weP github.com/tailscale/certstore v0.1.1-0.20231202035212-d3fa0460f47e/go.mod h1:XrBNfAFN+pwoWuksbFS9Ccxnopa15zJGgXRFN90l3K4= github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55 h1:Gzfnfk2TWrk8Jj4P4c1a3CtQyMaTVCznlkLZI++hok4= github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55/go.mod h1:4k4QO+dQ3R5FofL+SanAUZe+/QfeK0+OIuwDIRu2vSg= -github.com/tailscale/golang-x-crypto v0.0.0-20230713185742-f0b76a10a08e h1:JyeJF/HuSwvxWtsR1c0oKX1lzaSH5Wh4aX+MgiStaGQ= -github.com/tailscale/golang-x-crypto v0.0.0-20230713185742-f0b76a10a08e/go.mod h1:DjoeCULdP6vTJ/xY+nzzR9LaUHprkbZEpNidX0aqEEk= +github.com/tailscale/golang-x-crypto v0.0.0-20240108194725-7ce1f622c780 h1:U0J2CUrrTcc2wmr9tSLYEo+USfwNikRRsmxVLD4eZ7E= +github.com/tailscale/golang-x-crypto v0.0.0-20240108194725-7ce1f622c780/go.mod h1:ikbF+YT089eInTp9f2vmvy4+ZVnW5hzX1q2WknxSprQ= github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 h1:4chzWmimtJPxRs2O36yuGRW3f9SYV+bMTTvMBI0EKio= github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05/go.mod h1:PdCqy9JzfWMJf1H5UJW2ip33/d4YkoKN0r67yKH1mG8= github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a h1:SJy1Pu0eH1C29XwJucQo73FrleVK6t4kYz4NVhp34Yw= github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a/go.mod h1:DFSS3NAGHthKo1gTlmEcSBiZrRJXi28rLNd/1udP1c8= github.com/tailscale/netlink v1.1.1-0.20211101221916-cabfb018fe85 h1:zrsUcqrG2uQSPhaUPjUQwozcRdDdSxxqhNgNZ3drZFk= github.com/tailscale/netlink v1.1.1-0.20211101221916-cabfb018fe85/go.mod h1:NzVQi3Mleb+qzq8VmcWpSkcSYxXIg0DkI6XDzpVkhJ0= -github.com/tailscale/web-client-prebuilt v0.0.0-20231208174705-9b3142ca6f79 h1:X/pih/eWbzacjtEnAMgHLkE2OsJi+Kx0OndYsGgmEFs= -github.com/tailscale/web-client-prebuilt v0.0.0-20231208174705-9b3142ca6f79/go.mod h1:agQPE6y6ldqCOui2gkIh7ZMztTkIQKH049tv8siLuNQ= +github.com/tailscale/web-client-prebuilt v0.0.0-20240109232428-26bf65339dda h1:S+2mKvqj3K84d7qCX7MEjMsCiNXbEzXQ+ZvGdHsvAyc= +github.com/tailscale/web-client-prebuilt v0.0.0-20240109232428-26bf65339dda/go.mod h1:agQPE6y6ldqCOui2gkIh7ZMztTkIQKH049tv8siLuNQ= github.com/tailscale/wireguard-go v0.0.0-20231121184858-cc193a0b3272 h1:zwsem4CaamMdC3tFoTpzrsUSMDPV0K6rhnQdF7kXekQ= github.com/tailscale/wireguard-go v0.0.0-20231121184858-cc193a0b3272/go.mod h1:BOm5fXUBFM+m9woLNBoxI9TaBXXhGNP50LX/TGIvGb4= github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0= @@ -519,8 +519,8 @@ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.17.1-0.20240102205709-08396bb92b82 h1:Im4GabMwJDxh7eJBIF8XGVAyhmlqdBQmZV49AzWdKEk= +golang.org/x/crypto v0.17.1-0.20240102205709-08396bb92b82/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20210722180016-6781d3edade3/go.mod h1:DVyR6MI7P4kEQgvZJSj1fQGrWIi2RzIrfYWycwheUAc= @@ -628,8 +628,8 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -730,5 +730,5 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= software.sslmate.com/src/go-pkcs12 v0.2.1 h1:tbT1jjaeFOF230tzOIRJ6U5S1jNqpsSyNjzDd58H3J8= software.sslmate.com/src/go-pkcs12 v0.2.1/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -tailscale.com v1.1.1-0.20231208201721-86aa0485a6bb h1:aqNobiOqenabOEzseJ7QeM44yjpa18X3KF9JyG8Rmd8= -tailscale.com v1.1.1-0.20231208201721-86aa0485a6bb/go.mod h1:bIE/bJ2uS/cWG/a1vEDtAztrWTJY76ev5QWjAIfales= +tailscale.com v1.1.1-0.20240110191920-ca48db0d606d h1:kB3Yfxxj8JrXmu2fOfwsnnz0WQNWEyTxS3i9lOwyQns= +tailscale.com v1.1.1-0.20240110191920-ca48db0d606d/go.mod h1:NHP8nTEoz3rLkz0/7YDTmZvoQPq5Jay02onLt4tU2UM= From 52601c0dffc1891742ddc74d31eb815eeb1c2061 Mon Sep 17 00:00:00 2001 From: Denton Gentry Date: Wed, 10 Jan 2024 14:26:29 -0800 Subject: [PATCH 04/10] android: bump version code Signed-off-by: Denton Gentry --- android/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 69361a9fcb..60fb2f08ae 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -26,8 +26,8 @@ android { defaultConfig { minSdkVersion 22 targetSdkVersion 33 - versionCode 193 - versionName "1.55.148-t86aa0485a-g5ef7bbaff0a" + versionCode 194 + versionName "1.57.72-tca48db0d6-gdcca09fe7f8" } compileOptions { sourceCompatibility 1.8 From 99c54591e66b8d85d171a72bfa35746f6bd6b499 Mon Sep 17 00:00:00 2001 From: kari-ts <135075563+kari-ts@users.noreply.github.com> Date: Tue, 16 Jan 2024 10:29:59 -0800 Subject: [PATCH 05/10] .gitignore: ignore IDE (#148) Updates #cleanup --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 210f9d72a2..fef2cbfa5a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,7 @@ tailscale.jks ./android-sdk # Java profiling output -*.hprof \ No newline at end of file +*.hprof + +#IDE +.vscode \ No newline at end of file From 1b42117791266251b41959fc18e6c6215a85f739 Mon Sep 17 00:00:00 2001 From: kari-ts <135075563+kari-ts@users.noreply.github.com> Date: Wed, 17 Jan 2024 11:10:41 -0800 Subject: [PATCH 06/10] use network callback to update DNS config when network changes (#147) * use network callback to update DNS config when network changes -Use requestNetwork, which gets the best network matching the passed in network request, to listen for changes to network and cache DNS config -Call netmon.InjectEvent on network change to indicate a change Follow-up will fix issue in netmon where IsMajorChangeFrom doesn't identify major changes when a network is added Fixes #10107 * use network callback to update DNS config when network changes -Use requestNetwork, which gets the best network matching the passed in network request, to listen for changes to network and cache DNS config -Call netmon.InjectEvent on network change to indicate a change Follow-up will fix issue in netmon where IsMajorChangeFrom doesn't identify major changes when a network is added Updates tailscale/tailscale/#10107 hi * hi * . * use network callback to update DNS config when network changes -Use requestNetwork, which gets the best network matching the passed in network request, to listen for changes to network and cache DNS config -Call netmon.InjectEvent on network change to indicate a change Follow-up will fix issue in netmon where IsMajorChangeFrom doesn't identify major changes when a network is added Updates tailscale/tailscale/#10107 * fixed missing connectivity manager --- .vscode/settings.json | 0 android/src/main/AndroidManifest.xml | 1 + .../src/main/java/com/tailscale/ipn/App.java | 44 +-- .../java/com/tailscale/ipn/DnsConfig.java | 321 +----------------- .../java/com/tailscale/ipn/DnsConfigTest.java | 21 -- cmd/tailscale/backend.go | 2 +- cmd/tailscale/callbacks.go | 27 +- cmd/tailscale/main.go | 10 +- eclipse-formatter.xml | 315 +++++++++++++++++ 9 files changed, 373 insertions(+), 368 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 android/src/test/java/com/tailscale/ipn/DnsConfigTest.java create mode 100644 eclipse-formatter.xml diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 327951b445..8523e9dd01 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + diff --git a/android/src/main/java/com/tailscale/ipn/App.java b/android/src/main/java/com/tailscale/ipn/App.java index 299d3549d1..a1da150166 100644 --- a/android/src/main/java/com/tailscale/ipn/App.java +++ b/android/src/main/java/com/tailscale/ipn/App.java @@ -71,7 +71,7 @@ import org.gioui.Gio; public class App extends Application { - private final static String PEER_TAG = "peer"; + private static final String PEER_TAG = "peer"; static final String STATUS_CHANNEL_ID = "tailscale-status"; static final int STATUS_NOTIFICATION_ID = 1; @@ -82,16 +82,19 @@ public class App extends Application { private static final String FILE_CHANNEL_ID = "tailscale-files"; private static final int FILE_NOTIFICATION_ID = 3; - private final static Handler mainHandler = new Handler(Looper.getMainLooper()); + private static final Handler mainHandler = new Handler(Looper.getMainLooper()); - public DnsConfig dns = new DnsConfig(this); + private ConnectivityManager connectivityManager; + public DnsConfig dns = new DnsConfig(); public DnsConfig getDnsConfigObj() { return this.dns; } @Override public void onCreate() { super.onCreate(); // Load and initialize the Go library. Gio.init(this); - registerNetworkCallback(); + + this.connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); + setAndRegisterNetworkCallbacks(); createNotificationChannel(NOTIFY_CHANNEL_ID, "Notifications", NotificationManagerCompat.IMPORTANCE_DEFAULT); createNotificationChannel(STATUS_CHANNEL_ID, "VPN Status", NotificationManagerCompat.IMPORTANCE_LOW); @@ -99,26 +102,27 @@ public class App extends Application { } - private void registerNetworkCallback() { - ConnectivityManager cMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); - cMgr.registerNetworkCallback(new NetworkRequest.Builder().build(), new ConnectivityManager.NetworkCallback() { - private void reportConnectivityChange() { - NetworkInfo active = cMgr.getActiveNetworkInfo(); - // https://developer.android.com/training/monitoring-device-state/connectivity-status-type - boolean isConnected = active != null && active.isConnectedOrConnecting(); - onConnectivityChanged(isConnected); + // requestNetwork attempts to find the best network that matches the passed NetworkRequest. It is possible that + // this might return an unusuable network, eg a captive portal. + private void setAndRegisterNetworkCallbacks() { + connectivityManager.requestNetwork(dns.getDNSConfigNetworkRequest(), new ConnectivityManager.NetworkCallback(){ + @Override + public void onAvailable(Network network){ + super.onAvailable(network); + StringBuilder sb = new StringBuilder(""); + LinkProperties linkProperties = connectivityManager.getLinkProperties(network); + List dnsList = linkProperties.getDnsServers(); + for (InetAddress ip : dnsList) { + sb.append(ip.getHostAddress()).append(" "); + } + dns.updateDNSFromNetwork(sb.toString()); + onDnsConfigChanged(); } @Override public void onLost(Network network) { super.onLost(network); - this.reportConnectivityChange(); - } - - @Override - public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { - super.onLinkPropertiesChanged(network, linkProperties); - this.reportConnectivityChange(); + onDnsConfigChanged(); } }); } @@ -347,7 +351,7 @@ public void createNotificationChannel(String id, String name, int importance) { } static native void onVPNPrepared(); - private static native void onConnectivityChanged(boolean connected); + private static native void onDnsConfigChanged(); static native void onShareIntent(int nfiles, int[] types, String[] mimes, String[] items, String[] names, long[] sizes); static native void onWriteStorageGranted(); diff --git a/android/src/main/java/com/tailscale/ipn/DnsConfig.java b/android/src/main/java/com/tailscale/ipn/DnsConfig.java index 5c2cdbcb38..1168e1aca7 100644 --- a/android/src/main/java/com/tailscale/ipn/DnsConfig.java +++ b/android/src/main/java/com/tailscale/ipn/DnsConfig.java @@ -4,14 +4,8 @@ package com.tailscale.ipn; -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.DhcpInfo; -import android.net.LinkProperties; -import android.net.Network; import android.net.NetworkCapabilities; -import android.net.NetworkInfo; -import android.net.wifi.WifiManager; +import android.net.NetworkRequest; import java.lang.reflect.Method; @@ -20,6 +14,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; // Tailscale DNS Config retrieval // @@ -32,65 +28,9 @@ // Importantly, after the Tailscale VPN comes up it will set a DNS server of 100.100.100.100 // but we still want to retrieve the underlying DNS servers received from DHCP. If we roam // from Wi-Fi to LTE, we want the DNS servers received from LTE. -// -// --------------------- Android 7 and later ----------------------------------------- -// -// ## getDnsConfigFromLinkProperties -// Android provides a getAllNetworks interface in the ConnectivityManager. We walk through -// each interface to pick the most appropriate one. -// - If there is an Ethernet interface active we use that. -// - If Wi-Fi is active we use that. -// - If LTE is active we use that. -// - We never use a VPN's DNS servers. That VPN is likely us. Even if not us, Android -// only allows one VPN at a time so a different VPN's DNS servers won't be available -// once Tailscale comes up. -// -// getAllNetworks() is used as the sole mechanism for retrieving the DNS config with -// Android 7 and later. -// -// --------------------- Releases older than Android 7 ------------------------------- -// -// We support Tailscale back to Android 5. Android versions 5 and 6 supply a getAllNetworks() -// implementation but it always returns an empty list. -// -// ## getDnsConfigFromLinkProperties with getActiveNetwork -// ConnectivityManager also supports a getActiveNetwork() routine, which Android 5 and 6 do -// return a value for. If Tailscale isn't up yet and we can get the Wi-Fi/LTE/etc DNS -// config using getActiveNetwork(), we use that. -// -// Once Tailscale is up, getActiveNetwork() returns tailscale0 with DNS server 100.100.100.100 -// and that isn't useful. So we try two other mechanisms: -// -// ## getDnsServersFromSystemProperties -// Android versions prior to 8 let us retrieve the actual system DNS servers from properties. -// Later Android versions removed the properties and only return an empty string. -// -// We check the net.dns1 - net.dns4 DNS servers. If Tailscale is up the DNS server will be -// 100.100.100.100, which isn't useful, but if we get something different we'll use that. -// -// getDnsServersFromSystemProperties can only retrieve the IPv4 or IPv6 addresses of the -// configured DNS servers. We also want to know the DNS Search Domains configured, but -// we have no way to retrieve this using these interfaces. We return an empty list of -// search domains. Sorry. -// -// ## getDnsServersFromNetworkInfo -// ConnectivityManager supports an older API called getActiveNetworkInfo to return the -// active network interface. It doesn't handle VPNs, so the interface will always be Wi-Fi -// or Cellular even if Tailscale is up. -// -// For Wi-Fi interfaces we retrieve the DHCP response from the WifiManager. For Cellular -// interfaces we check for properties populated by most of the radio drivers. -// -// getDnsServersFromNetworkInfo does not have a way to retrieve the DNS Search Domains, -// so we return an empty list. Additionally, these interfaces are so old that they only -// support IPv4. We can't retrieve IPv6 DNS server addresses this way. public class DnsConfig { - private Context ctx; - - public DnsConfig(Context ctx) { - this.ctx = ctx; - } + private String dnsConfigs; // getDnsConfigAsString returns the current DNS configuration as a multiline string: // line[0] DNS server addresses separated by spaces @@ -102,260 +42,27 @@ public DnsConfig(Context ctx) { // // an empty string means the current DNS configuration could not be retrieved. String getDnsConfigAsString() { - String s = getDnsConfigFromLinkProperties(); + String s = getDnsConfigs(); if (!s.trim().isEmpty()) { return s; } - if (android.os.Build.VERSION.SDK_INT >= 23) { - // If ConnectivityManager.getAllNetworks() works, it is the - // authoritative mechanism and we rely on it. The other methods - // which follow involve more compromises. - return ""; - } - - s = getDnsServersFromSystemProperties(); - if (!s.trim().isEmpty()) { - return s; - } - return getDnsServersFromNetworkInfo(); - } - - // getDnsConfigFromLinkProperties finds the DNS servers for each Network interface - // returned by ConnectivityManager getAllNetworks().LinkProperties, and return the - // one that (heuristically) would be the primary DNS servers. - // - // on a Nexus 4 with Android 5.1 on wifi: 2602:248:7b4a:ff60::1 10.1.10.1 - // on a Nexus 7 with Android 6.0 on wifi: 2602:248:7b4a:ff60::1 10.1.10.1 - // on a Pixel 3a with Android 12.0 on wifi: 2602:248:7b4a:ff60::1 10.1.10.1\nlocaldomain - // on a Pixel 3a with Android 12.0 on LTE: fd00:976a::9 fd00:976a::10 - // - // One odd behavior noted on Pixel3a with Android 12: - // With Wi-Fi already connected, starting Tailscale returned DNS servers 2602:248:7b4a:ff60::1 10.1.10.1 - // Turning off Wi-Fi and connecting LTE returned DNS servers fd00:976a::9 fd00:976a::10. - // Turning Wi-Fi back on return DNS servers: 10.1.10.1. The IPv6 DNS server is gone. - // This appears to be the ConnectivityManager behavior, not something we are doing. - // - // This implementation can work through Android 12 (SDK 30). In SDK 31 the - // getAllNetworks() method is deprecated and we'll need to implement a - // android.net.ConnectivityManager.NetworkCallback instead to monitor - // link changes and track which DNS server to use. - String getDnsConfigFromLinkProperties() { - ConnectivityManager cMgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); - if (cMgr == null) { - return ""; - } - - Network[] networks = cMgr.getAllNetworks(); - if (networks == null) { - // Android 6 and before often returns an empty list, but we - // can try again with just the active network. - // - // Once Tailscale is connected, the active network will be Tailscale - // which will have 100.100.100.100 for its DNS server. We reject - // TYPE_VPN in getPreferabilityForNetwork, so it won't be returned. - Network active = cMgr.getActiveNetwork(); - if (active == null) { - return ""; - } - networks = new Network[]{active}; - } - - // getPreferabilityForNetwork returns an index into dnsConfigs from 0-3. - String[] dnsConfigs = new String[]{"", "", "", ""}; - for (Network network : networks) { - int idx = getPreferabilityForNetwork(cMgr, network); - if ((idx < 0) || (idx > 3)) { - continue; - } - - LinkProperties linkProp = cMgr.getLinkProperties(network); - NetworkCapabilities nc = cMgr.getNetworkCapabilities(network); - List dnsList = linkProp.getDnsServers(); - StringBuilder sb = new StringBuilder(""); - for (InetAddress ip : dnsList) { - sb.append(ip.getHostAddress() + " "); - } - - String d = linkProp.getDomains(); - if (d != null) { - sb.append("\n"); - sb.append(d); - } - - dnsConfigs[idx] = sb.toString(); - } - - // return the lowest index DNS config which exists. If an Ethernet config - // was found, return it. Otherwise if Wi-fi was found, return it. Etc. - for (String s : dnsConfigs) { - if (!s.trim().isEmpty()) { - return s; - } - } - return ""; } - // getDnsServersFromSystemProperties returns DNS servers found in system properties. - // On Android versions prior to Android 8, we can directly query the DNS - // servers the system is using. More recent Android releases return empty strings. - // - // Once Tailscale is connected these properties will return 100.100.100.100, which we - // suppress. - // - // on a Nexus 4 with Android 5.1 on wifi: 2602:248:7b4a:ff60::1 10.1.10.1 - // on a Nexus 7 with Android 6.0 on wifi: 2602:248:7b4a:ff60::1 10.1.10.1 - // on a Pixel 3a with Android 12.0 on wifi: - // on a Pixel 3a with Android 12.0 on LTE: - // - // The list of DNS search domains does not appear to be available in system properties. - String getDnsServersFromSystemProperties() { - try { - Class SystemProperties = Class.forName("android.os.SystemProperties"); - Method method = SystemProperties.getMethod("get", String.class); - List servers = new ArrayList(); - for (String name : new String[]{"net.dns1", "net.dns2", "net.dns3", "net.dns4"}) { - String value = (String) method.invoke(null, name); - if (value != null && !value.isEmpty() && - !value.equals("100.100.100.100") && - !servers.contains(value)) { - servers.add(value); - } - } - return String.join(" ", servers); - } catch (Exception e) { - return ""; + private String getDnsConfigs(){ + synchronized(this) { + return this.dnsConfigs; } } - - public String intToInetString(int hostAddress) { - return String.format(java.util.Locale.ROOT, "%d.%d.%d.%d", - (0xff & hostAddress), - (0xff & (hostAddress >> 8)), - (0xff & (hostAddress >> 16)), - (0xff & (hostAddress >> 24))); - } - - // getDnsServersFromNetworkInfo retrieves DNS servers using ConnectivityManager - // getActiveNetworkInfo() plus interface-specific mechanisms to retrieve the DNS servers. - // Only IPv4 DNS servers are supported by this mechanism, neither the WifiManager nor the - // interface-specific dns properties appear to populate IPv6 DNS server addresses. - // - // on a Nexus 4 with Android 5.1 on wifi: 10.1.10.1 - // on a Nexus 7 with Android 6.0 on wifi: 10.1.10.1 - // on a Pixel-3a with Android 12.0 on wifi: 10.1.10.1 - // on a Pixel-3a with Android 12.0 on LTE: - // - // The list of DNS search domains is not available in this way. - String getDnsServersFromNetworkInfo() { - ConnectivityManager cMgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); - if (cMgr == null) { - return ""; - } - - NetworkInfo info = cMgr.getActiveNetworkInfo(); - if (info == null) { - return ""; + void updateDNSFromNetwork(String dnsConfigs){ + synchronized(this) { + this.dnsConfigs = dnsConfigs; } - - Class SystemProperties; - Method method; - - try { - SystemProperties = Class.forName("android.os.SystemProperties"); - method = SystemProperties.getMethod("get", String.class); - } catch (Exception e) { - return ""; - } - - List servers = new ArrayList(); - - switch(info.getType()) { - case ConnectivityManager.TYPE_WIFI: - case ConnectivityManager.TYPE_WIMAX: - for (String name : new String[]{ - "net.wifi0.dns1", "net.wifi0.dns2", "net.wifi0.dns3", "net.wifi0.dns4", - "net.wlan0.dns1", "net.wlan0.dns2", "net.wlan0.dns3", "net.wlan0.dns4", - "net.eth0.dns1", "net.eth0.dns2", "net.eth0.dns3", "net.eth0.dns4", - "dhcp.wlan0.dns1", "dhcp.wlan0.dns2", "dhcp.wlan0.dns3", "dhcp.wlan0.dns4", - "dhcp.tiwlan0.dns1", "dhcp.tiwlan0.dns2", "dhcp.tiwlan0.dns3", "dhcp.tiwlan0.dns4"}) { - try { - String value = (String) method.invoke(null, name); - if (value != null && !value.isEmpty() && !servers.contains(value)) { - servers.add(value); - } - } catch (Exception e) { - continue; - } - } - - WifiManager wMgr = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE); - if (wMgr != null) { - DhcpInfo dhcp = wMgr.getDhcpInfo(); - if (dhcp.dns1 != 0) { - String value = intToInetString(dhcp.dns1); - if (value != null && !value.isEmpty() && !servers.contains(value)) { - servers.add(value); - } - } - if (dhcp.dns2 != 0) { - String value = intToInetString(dhcp.dns2); - if (value != null && !value.isEmpty() && !servers.contains(value)) { - servers.add(value); - } - } - } - return String.join(" ", servers); - case ConnectivityManager.TYPE_MOBILE: - case ConnectivityManager.TYPE_MOBILE_HIPRI: - for (String name : new String[]{ - "net.rmnet0.dns1", "net.rmnet0.dns2", "net.rmnet0.dns3", "net.rmnet0.dns4", - "net.rmnet1.dns1", "net.rmnet1.dns2", "net.rmnet1.dns3", "net.rmnet1.dns4", - "net.rmnet2.dns1", "net.rmnet2.dns2", "net.rmnet2.dns3", "net.rmnet2.dns4", - "net.rmnet3.dns1", "net.rmnet3.dns2", "net.rmnet3.dns3", "net.rmnet3.dns4", - "net.rmnet4.dns1", "net.rmnet4.dns2", "net.rmnet4.dns3", "net.rmnet4.dns4", - "net.rmnet5.dns1", "net.rmnet5.dns2", "net.rmnet5.dns3", "net.rmnet5.dns4", - "net.rmnet6.dns1", "net.rmnet6.dns2", "net.rmnet6.dns3", "net.rmnet6.dns4", - "net.rmnet7.dns1", "net.rmnet7.dns2", "net.rmnet7.dns3", "net.rmnet7.dns4", - "net.pdp0.dns1", "net.pdp0.dns2", "net.pdp0.dns3", "net.pdp0.dns4", - "net.pdpbr0.dns1", "net.pdpbr0.dns2", "net.pdpbr0.dns3", "net.pdpbr0.dns4"}) { - try { - String value = (String) method.invoke(null, name); - if (value != null && !value.isEmpty() && !servers.contains(value)) { - servers.add(value); - } - } catch (Exception e) { - continue; - } - - } - } - - return ""; } - // getPreferabilityForNetwork is a utility routine which implements a priority for - // different types of network transport, used in a heuristic to pick DNS servers to use. - int getPreferabilityForNetwork(ConnectivityManager cMgr, Network network) { - NetworkCapabilities nc = cMgr.getNetworkCapabilities(network); - - if (nc == null) { - return -1; - } - if (nc.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { - // tun0 has both VPN and WIFI set, have to check VPN first and return. - return -1; - } - - if (nc.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) { - return 0; - } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { - return 1; - } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { - return 2; - } else { - return 3; - } + NetworkRequest getDNSConfigNetworkRequest(){ + // Request networks that are able to reach the Internet. + return new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build(); } } diff --git a/android/src/test/java/com/tailscale/ipn/DnsConfigTest.java b/android/src/test/java/com/tailscale/ipn/DnsConfigTest.java deleted file mode 100644 index b93e168ed8..0000000000 --- a/android/src/test/java/com/tailscale/ipn/DnsConfigTest.java +++ /dev/null @@ -1,21 +0,0 @@ -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import com.tailscale.ipn.DnsConfig; - -public class DnsConfigTest { - DnsConfig dns; - - @Before - public void setup() { - dns = new DnsConfig(null); - } - - @Test - public void dnsConfig_intToInetStringTest() { - assertEquals(dns.intToInetString(0x0101a8c0), "192.168.1.1"); - assertEquals(dns.intToInetString(0x04030201), "1.2.3.4"); - assertEquals(dns.intToInetString(0), "0.0.0.0"); - } -} diff --git a/cmd/tailscale/backend.go b/cmd/tailscale/backend.go index 8e1a4467d7..e8c79e84d5 100644 --- a/cmd/tailscale/backend.go +++ b/cmd/tailscale/backend.go @@ -184,7 +184,7 @@ func (b *backend) Start(notify func(n ipn.Notify)) error { return b.backend.Start(ipn.Options{}) } -func (b *backend) LinkChange() { +func (b *backend) NetworkChanged() { if b.sys != nil { if nm, ok := b.sys.NetMon.GetOK(); ok { nm.InjectEvent() diff --git a/cmd/tailscale/callbacks.go b/cmd/tailscale/callbacks.go index 534e4390a1..b922367e9c 100644 --- a/cmd/tailscale/callbacks.go +++ b/cmd/tailscale/callbacks.go @@ -30,9 +30,6 @@ var ( // onDisconnect receives global IPNService references when // disconnecting. onDisconnect = make(chan jni.Object) - // onConnectivityChange is notified every time the network - // conditions change. - onConnectivityChange = make(chan bool, 1) // onGoogleToken receives google ID tokens. onGoogleToken = make(chan string) @@ -42,6 +39,9 @@ var ( // onWriteStorageGranted is notified when we are granted WRITE_STORAGE_PERMISSION. onWriteStorageGranted = make(chan struct{}, 1) + + // onDNSConfigChanged is notified when the network changes and the DNS config needs to be updated. + onDNSConfigChanged = make(chan struct{}, 1) ) const ( @@ -109,21 +109,12 @@ func Java_com_tailscale_ipn_IPNService_disconnect(env *C.JNIEnv, this C.jobject) //export Java_com_tailscale_ipn_StartVPNWorker_connect func Java_com_tailscale_ipn_StartVPNWorker_connect(env *C.JNIEnv, this C.jobject) { - requestBackend(ConnectEvent{Enable: true}) + requestBackend(ConnectEvent{Enable: true}) } //export Java_com_tailscale_ipn_StopVPNWorker_disconnect func Java_com_tailscale_ipn_StopVPNWorker_disconnect(env *C.JNIEnv, this C.jobject) { - requestBackend(ConnectEvent{Enable: false}) -} - -//export Java_com_tailscale_ipn_App_onConnectivityChanged -func Java_com_tailscale_ipn_App_onConnectivityChanged(env *C.JNIEnv, cls C.jclass, connected C.jboolean) { - select { - case <-onConnectivityChange: - default: - } - onConnectivityChange <- connected == C.JNI_TRUE + requestBackend(ConnectEvent{Enable: false}) } //export Java_com_tailscale_ipn_QuickToggleService_onTileClick @@ -200,3 +191,11 @@ func Java_com_tailscale_ipn_App_onShareIntent(env *C.JNIEnv, cls C.jclass, nfile } onFileShare <- files } + +//export Java_com_tailscale_ipn_App_onDnsConfigChanged +func Java_com_tailscale_ipn_App_onDnsConfigChanged(env *C.JNIEnv, cls C.jclass) { + select { + case onDNSConfigChanged <- struct{}{}: + default: + } +} diff --git a/cmd/tailscale/main.go b/cmd/tailscale/main.go index e1285a9c5f..dde90d9f57 100644 --- a/cmd/tailscale/main.go +++ b/cmd/tailscale/main.go @@ -526,11 +526,6 @@ func (a *App) runBackend() error { notifyVPNClosed() } } - case <-onConnectivityChange: - if b != nil { - go b.LinkChange() - } - a.notify(state) case s := <-onDisconnect: b.CloseTUNs() jni.Do(a.jvm, func(env *jni.Env) error { @@ -545,6 +540,11 @@ func (a *App) runBackend() error { if state.State >= ipn.Starting { notifyVPNClosed() } + case <-onDNSConfigChanged: + if b != nil { + go b.NetworkChanged() + } + a.notify(state) } } } diff --git a/eclipse-formatter.xml b/eclipse-formatter.xml new file mode 100644 index 0000000000..7f8c57d13d --- /dev/null +++ b/eclipse-formatter.xml @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a76b36506c88dc0832667a071a0334fb4a36ecf2 Mon Sep 17 00:00:00 2001 From: kari-ts <135075563+kari-ts@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:03:13 -0800 Subject: [PATCH 07/10] DnsConfig: get rid of unnecessary isEmpty check (#149) * DnsConfig: remove unnecessary isEmpty check Updates #cleanup * DnsConfig: remove unnecessary isEmpty check Updates #cleanup * k --- android/src/main/java/com/tailscale/ipn/DnsConfig.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/android/src/main/java/com/tailscale/ipn/DnsConfig.java b/android/src/main/java/com/tailscale/ipn/DnsConfig.java index 1168e1aca7..dfe6e8c93d 100644 --- a/android/src/main/java/com/tailscale/ipn/DnsConfig.java +++ b/android/src/main/java/com/tailscale/ipn/DnsConfig.java @@ -42,11 +42,7 @@ public class DnsConfig { // // an empty string means the current DNS configuration could not be retrieved. String getDnsConfigAsString() { - String s = getDnsConfigs(); - if (!s.trim().isEmpty()) { - return s; - } - return ""; + return getDnsConfigs().trim(); } private String getDnsConfigs(){ From 4c7d66701f6ec543dbe92d4a384909f342fe3ab3 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 18 Jan 2024 10:51:34 -0800 Subject: [PATCH 08/10] cmd/tailscale: remove obsolete DNS config logging Causes a JNI crash because 1b42117791266251b41959fc18e6c6215a85f739 removed those methods when fixing our connectivity monitoring. Updates tailscale/tailscale#10107 Signed-off-by: David Anderson --- cmd/tailscale/backend.go | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/cmd/tailscale/backend.go b/cmd/tailscale/backend.go index e8c79e84d5..d3d0336c79 100644 --- a/cmd/tailscale/backend.go +++ b/cmd/tailscale/backend.go @@ -386,39 +386,6 @@ func (b *backend) SetupLogs(logDir string, logID logid.PrivateID, logf logger.Lo } } -// We log the result of each of the DNS configuration discovery mechanisms, as we're -// expecting a long tail of obscure Android devices with interesting behavior. -func (b *backend) logDNSConfigMechanisms() { - err := jni.Do(b.jvm, func(env *jni.Env) error { - cls := jni.GetObjectClass(env, b.appCtx) - m := jni.GetMethodID(env, cls, "getDnsConfigObj", "()Lcom/tailscale/ipn/DnsConfig;") - dns, err := jni.CallObjectMethod(env, b.appCtx, m) - if err != nil { - return fmt.Errorf("getDnsConfigObj JNI: %v", err) - } - dnsCls := jni.GetObjectClass(env, dns) - - for _, impl := range []string{"getDnsConfigFromLinkProperties", - "getDnsServersFromSystemProperties", - "getDnsServersFromNetworkInfo"} { - - m = jni.GetMethodID(env, dnsCls, impl, "()Ljava/lang/String;") - n, err := jni.CallObjectMethod(env, dns, m) - baseConfig := jni.GoString(env, jni.String(n)) - if err != nil { - log.Printf("%s JNI: %v", impl, err) - } else { - oneLine := strings.Replace(baseConfig, "\n", ";", -1) - log.Printf("%s: %s", impl, oneLine) - } - } - return nil - }) - if err != nil { - log.Printf("logDNSConfigMechanisms: %v", err) - } -} - func (b *backend) getPlatformDNSConfig() string { var baseConfig string err := jni.Do(b.jvm, func(env *jni.Env) error { @@ -454,7 +421,6 @@ func (b *backend) getDNSBaseConfig() (ret dns.OSConfig, _ error) { ret.Nameservers = append(ret.Nameservers, googleDNSServers...) } }() - b.logDNSConfigMechanisms() baseConfig := b.getPlatformDNSConfig() lines := strings.Split(baseConfig, "\n") if len(lines) == 0 { From 3255d55e3940249f29f8268afa7de481d33c25f9 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Thu, 18 Jan 2024 11:18:14 -0800 Subject: [PATCH 09/10] Record DNS search domains as well as nameservers. We accidentally removed this in the big connectivity monitor fix. Updates tailscale/tailscale#10107 Signed-off-by: David Anderson --- android/src/main/java/com/tailscale/ipn/App.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/android/src/main/java/com/tailscale/ipn/App.java b/android/src/main/java/com/tailscale/ipn/App.java index a1da150166..644e145bb1 100644 --- a/android/src/main/java/com/tailscale/ipn/App.java +++ b/android/src/main/java/com/tailscale/ipn/App.java @@ -115,6 +115,12 @@ public void onAvailable(Network network){ for (InetAddress ip : dnsList) { sb.append(ip.getHostAddress()).append(" "); } + String searchDomains = linkProperties.getDomains(); + if (searchDomains != null) { + sb.append("\n"); + sb.append(searchDomains); + } + dns.updateDNSFromNetwork(sb.toString()); onDnsConfigChanged(); } From 813ca8adeaaa65a803088cd982deaee3dfbfa615 Mon Sep 17 00:00:00 2001 From: kari-ts <135075563+kari-ts@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:38:53 -0800 Subject: [PATCH 10/10] android: bump version code (#152) * go.mod: update for 1.58.0 Signed-off-by: kari-ts * android: bump version code Signed-off-by: kari-ts * Pulled OSS from HEAD and fixed version name * Removed swp file --------- Signed-off-by: kari-ts --- android/build.gradle | 4 ++-- go.mod | 4 ++-- go.sum | 10 ++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 60fb2f08ae..a4dd82645a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -26,8 +26,8 @@ android { defaultConfig { minSdkVersion 22 targetSdkVersion 33 - versionCode 194 - versionName "1.57.72-tca48db0d6-gdcca09fe7f8" + versionCode 195 + versionName "1.57.100-t8250582fe-g4799cc1ef" } compileOptions { sourceCompatibility 1.8 diff --git a/go.mod b/go.mod index 2eb3af57fe..140501c432 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( golang.org/x/exp/shiny v0.0.0-20220827204233-334a2380cb91 golang.org/x/sys v0.15.0 inet.af/netaddr v0.0.0-20220617031823-097006376321 - tailscale.com v1.1.1-0.20240110191920-ca48db0d606d + tailscale.com v1.1.1-0.20240118202658-8250582fe675 ) require ( @@ -74,7 +74,7 @@ require ( github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a // indirect github.com/tailscale/netlink v1.1.1-0.20211101221916-cabfb018fe85 // indirect - github.com/tailscale/web-client-prebuilt v0.0.0-20240109232428-26bf65339dda // indirect + github.com/tailscale/web-client-prebuilt v0.0.0-20240111230031-5ca22df9e6e7 // indirect github.com/tcnksm/go-httpstat v0.2.0 // indirect github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect github.com/vishvananda/netlink v1.2.1-beta.2 // indirect diff --git a/go.sum b/go.sum index ed1ee8c04e..dcdab6eefc 100644 --- a/go.sum +++ b/go.sum @@ -449,8 +449,8 @@ github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a h1:SJy1Pu0eH1C29X github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a/go.mod h1:DFSS3NAGHthKo1gTlmEcSBiZrRJXi28rLNd/1udP1c8= github.com/tailscale/netlink v1.1.1-0.20211101221916-cabfb018fe85 h1:zrsUcqrG2uQSPhaUPjUQwozcRdDdSxxqhNgNZ3drZFk= github.com/tailscale/netlink v1.1.1-0.20211101221916-cabfb018fe85/go.mod h1:NzVQi3Mleb+qzq8VmcWpSkcSYxXIg0DkI6XDzpVkhJ0= -github.com/tailscale/web-client-prebuilt v0.0.0-20240109232428-26bf65339dda h1:S+2mKvqj3K84d7qCX7MEjMsCiNXbEzXQ+ZvGdHsvAyc= -github.com/tailscale/web-client-prebuilt v0.0.0-20240109232428-26bf65339dda/go.mod h1:agQPE6y6ldqCOui2gkIh7ZMztTkIQKH049tv8siLuNQ= +github.com/tailscale/web-client-prebuilt v0.0.0-20240111230031-5ca22df9e6e7 h1:xAgOVncJuuxkFZ2oXXDKFTH4HDdFYSZRYdA6oMrCewg= +github.com/tailscale/web-client-prebuilt v0.0.0-20240111230031-5ca22df9e6e7/go.mod h1:agQPE6y6ldqCOui2gkIh7ZMztTkIQKH049tv8siLuNQ= github.com/tailscale/wireguard-go v0.0.0-20231121184858-cc193a0b3272 h1:zwsem4CaamMdC3tFoTpzrsUSMDPV0K6rhnQdF7kXekQ= github.com/tailscale/wireguard-go v0.0.0-20231121184858-cc193a0b3272/go.mod h1:BOm5fXUBFM+m9woLNBoxI9TaBXXhGNP50LX/TGIvGb4= github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0= @@ -730,5 +730,7 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= software.sslmate.com/src/go-pkcs12 v0.2.1 h1:tbT1jjaeFOF230tzOIRJ6U5S1jNqpsSyNjzDd58H3J8= software.sslmate.com/src/go-pkcs12 v0.2.1/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -tailscale.com v1.1.1-0.20240110191920-ca48db0d606d h1:kB3Yfxxj8JrXmu2fOfwsnnz0WQNWEyTxS3i9lOwyQns= -tailscale.com v1.1.1-0.20240110191920-ca48db0d606d/go.mod h1:NHP8nTEoz3rLkz0/7YDTmZvoQPq5Jay02onLt4tU2UM= +tailscale.com v1.1.1-0.20240118202658-8250582fe675 h1:GNiVbKAvDA4Ube6UDP+dQxT/rZ76LhHgy+PJGMJ1/oA= +tailscale.com v1.1.1-0.20240118202658-8250582fe675/go.mod h1:faWR8XaXemnSKCDjHC7SAQzaagkUjA5x4jlLWiwxtuk= +tailscale.com v1.58.0 h1:iLGQBaGlweNEo8kBqQHF3gcLKRR87ECfkksvFQCy2/M= +tailscale.com v1.58.0/go.mod h1:faWR8XaXemnSKCDjHC7SAQzaagkUjA5x4jlLWiwxtuk=