diff --git a/ChangeLog.md b/ChangeLog.md index ea668c7b..6ac03417 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1150,3 +1150,37 @@ **InviZible Pro beta 2.2.6** * Fixed a crash when using Tor bridges containing only IP and port. + +**InviZible Pro beta 2.2.7** +* Updated Tor to version 4.8.12. +* Implemented Tor isolate by app option. +* Added donation addresses to the about screen. +* Fixes and optimizations. + +**InviZible Pro beta 2.2.8** +* Improved app update process. +* Updated Polish, German, Spanish, Indonesian and Chinese translations. +* Fixes and optimizations. + +**InviZible Pro beta 2.2.9** +* Updated Purple I2P to version 2.53.0. +* Updated Tor geoip files. +* Preparing the app for use on Android 15. +* Fixed detecting internet access permission in apps with a shared id. +* Fixes and optimizations. + +**InviZible Pro beta 2.3.0** +* Updated Tor bridges: Conjure, Lyrebird, SnowFlake. +* Updated French and Portuguese (Brazil) translations. +* Added Arabic and Bulgarian translations. +* Fixes and optimizations. + +**InviZible Pro beta 2.3.1** +* Updated Purple I2P to version 2.53.1. +* Updated German, Bulgarian, Chinese, Polish, Arabic, Persian and Portuguese (Brazil) translations. +* Fixed using socks5 proxy with authentication. +* A lot of minor fixes and optimisations. + +**InviZible Pro beta 2.3.2** +* Updated Tor. +* Fixes and optimizations. diff --git a/README.md b/README.md index b0faf4d6..1ce390fa 100644 --- a/README.md +++ b/README.md @@ -158,19 +158,21 @@ This product is produced independently from the **Tor®**, **DNSCrypt**, **Purpl and carries no guarantee from The Above Projects about quality, suitability or anything else. ## Donations -**PayPal**: Send to invizible.soft@gmail.com - **Patreon**: https://www.patreon.com/inviziblepro **BTC**: 1GfJwiHG6xKCQCpHeW6fELzFfgsvcSxVUR +**LTC**: MUSAXkcAvnN1Ytauzeo9bwjVjarUdDHGgk + **BCH**: qzl4w4ahh7na2z23056qawwdyuclkgty5gc4q8tw88 **USDT**: 0xdA1Dd53FE6501140E3Dcd5134323dfccF20aD536 **XLM**: GBID6I3VYR4NIFLZWI3MEQH3M2H72COC3HQDI5WMYYQGAC3TE55TSKAX -**XMR** 83k3FtpRhoT8QpE3M8mKunjXsktfVhGS2fVXm1X1Myj4EoH5hJ4BfuFXkYcRod61kCDP1hpcDSw2FFM622rRD6rWEJ45UjU +**XMR** 82WFzofvGUdY52w9zCfrZWaHVqEDcJH7y1FujzvXdGPeU9UpuFNeCvtCKhtpC6pZmMYuCNgFjcw5mHAgEJQ4RTwV9XRhobX + +Please note that the XMR address has changed. The old address is no longer valid. ## License diff --git a/build.gradle b/build.gradle index 42aea967..b4e69468 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ buildscript { kotlin_version = '1.9.23' dagger_version = '2.51.1' multidex_version = "2.0.1" + work_version = "2.9.0" } @@ -13,7 +14,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.4.0' + classpath 'com.android.tools.build:gradle:8.5.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" diff --git a/fastlane/metadata/android/en-US/changelogs/100227.txt b/fastlane/metadata/android/en-US/changelogs/100227.txt new file mode 100644 index 00000000..eea188d4 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100227.txt @@ -0,0 +1,5 @@ +**InviZible Pro beta 2.2.7** +* Updated Tor to version 4.8.12. +* Implemented Tor isolate by app option. +* Added donation addresses to the about screen. +* Fixes and optimizations. diff --git a/fastlane/metadata/android/en-US/changelogs/100228.txt b/fastlane/metadata/android/en-US/changelogs/100228.txt new file mode 100644 index 00000000..05a82482 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100228.txt @@ -0,0 +1,4 @@ +**InviZible Pro beta 2.2.8** +* Improved app update process. +* Updated Polish, German, Spanish, Indonesian and Chinese translations. +* Fixes and optimizations. diff --git a/fastlane/metadata/android/en-US/changelogs/100229.txt b/fastlane/metadata/android/en-US/changelogs/100229.txt new file mode 100644 index 00000000..70a540bc --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100229.txt @@ -0,0 +1,6 @@ +**InviZible Pro beta 2.2.9** +* Updated Purple I2P to version 2.53.0. +* Updated Tor geoip files. +* Preparing the app for use on Android 15. +* Fixed detecting internet access permission in apps with a shared id. +* Fixes and optimizations. diff --git a/fastlane/metadata/android/en-US/changelogs/100230.txt b/fastlane/metadata/android/en-US/changelogs/100230.txt new file mode 100644 index 00000000..e7fa333d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100230.txt @@ -0,0 +1,5 @@ +**InviZible Pro beta 2.3.0** +* Updated Tor bridges: Conjure, Lyrebird, SnowFlake. +* Updated French and Portuguese (Brazil) translations. +* Added Arabic and Bulgarian translations. +* Fixes and optimizations. diff --git a/fastlane/metadata/android/en-US/changelogs/100231.txt b/fastlane/metadata/android/en-US/changelogs/100231.txt new file mode 100644 index 00000000..6a7f2c84 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100231.txt @@ -0,0 +1,5 @@ +**InviZible Pro beta 2.3.1** +* Updated Purple I2P to version 2.53.1. +* Updated German, Bulgarian, Chinese, Polish, Arabic, Persian and Portuguese (Brazil) translations. +* Fixed using socks5 proxy with authentication. +* A lot of minor fixes and optimisations. diff --git a/fastlane/metadata/android/en-US/changelogs/100232.txt b/fastlane/metadata/android/en-US/changelogs/100232.txt new file mode 100644 index 00000000..15ab0fbc --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/100232.txt @@ -0,0 +1,3 @@ +**InviZible Pro beta 2.3.2** +* Updated Tor. +* Fixes and optimizations. diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0f7edf09..85310727 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,5 +3,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip -distributionSha256Sum=85719317abd2112f021d4f41f09ec370534ba288432065f4b477b6a3b652910d +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip +distributionSha256Sum=194717442575a6f96e1c1befa2c30e9a4fc90f701d7aee33eb879b79e7ff05c0 diff --git a/tordnscrypt/build.gradle b/tordnscrypt/build.gradle index 0ead8e4c..8e0eee26 100644 --- a/tordnscrypt/build.gradle +++ b/tordnscrypt/build.gradle @@ -15,7 +15,7 @@ android { fdroid{ applicationId "pan.alexander.tordnscrypt.stable" - versionName "6.7.1" + versionName "6.8.0" dimension = 'version' resValue 'string', 'package_name', applicationId } @@ -54,10 +54,10 @@ android { defaultConfig { minSdkVersion 19 - targetSdkVersion 33 - versionCode 226 + targetSdkVersion 34 + versionCode 232 - resConfigs "en", "ru", "pl", "de", "fa", "fi", "in", "fr", "ja", "zh", "es", "pt", "pt-rBR", "el", "tr", "it", "uk" + resConfigs "en", "ru", "pl", "de", "fa", "fi", "in", "fr", "ja", "zh", "es", "pt", "pt-rBR", "el", "tr", "it", "uk", "bg", "ar" externalNativeBuild { cmake { @@ -153,15 +153,15 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.preference:preference-ktx:1.2.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.google.android.material:material:1.11.0' + implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.recyclerview:recyclerview:1.3.2' - implementation 'androidx.lifecycle:lifecycle-process:2.7.0' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0' + implementation 'androidx.lifecycle:lifecycle-process:2.8.4' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.4' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation 'androidx.test.ext:junit:1.2.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' implementation 'eu.chainfire:libsuperuser:1.1.1' implementation 'com.jrummyapps:android-shell:1.0.1' implementation 'androidx.core:core-ktx:1.13.1' @@ -172,4 +172,6 @@ dependencies { //DI implementation "com.google.dagger:dagger:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version" + //Persistent Work Manager + implementation "androidx.work:work-runtime-ktx:$work_version" } diff --git a/tordnscrypt/libs/arm64-v8a/libconjure.so b/tordnscrypt/libs/arm64-v8a/libconjure.so index 1be56ea1..80d16adc 100755 Binary files a/tordnscrypt/libs/arm64-v8a/libconjure.so and b/tordnscrypt/libs/arm64-v8a/libconjure.so differ diff --git a/tordnscrypt/libs/arm64-v8a/libi2pd.so b/tordnscrypt/libs/arm64-v8a/libi2pd.so index a08e5ba1..62a6755a 100644 Binary files a/tordnscrypt/libs/arm64-v8a/libi2pd.so and b/tordnscrypt/libs/arm64-v8a/libi2pd.so differ diff --git a/tordnscrypt/libs/arm64-v8a/libobfs4proxy.so b/tordnscrypt/libs/arm64-v8a/libobfs4proxy.so index 5bcd3569..4719d864 100755 Binary files a/tordnscrypt/libs/arm64-v8a/libobfs4proxy.so and b/tordnscrypt/libs/arm64-v8a/libobfs4proxy.so differ diff --git a/tordnscrypt/libs/arm64-v8a/libsnowflake.so b/tordnscrypt/libs/arm64-v8a/libsnowflake.so index b9acc428..40d0a2b3 100755 Binary files a/tordnscrypt/libs/arm64-v8a/libsnowflake.so and b/tordnscrypt/libs/arm64-v8a/libsnowflake.so differ diff --git a/tordnscrypt/libs/arm64-v8a/libtor.so b/tordnscrypt/libs/arm64-v8a/libtor.so index 1e73a7e6..9a14c87f 100644 Binary files a/tordnscrypt/libs/arm64-v8a/libtor.so and b/tordnscrypt/libs/arm64-v8a/libtor.so differ diff --git a/tordnscrypt/libs/armeabi-v7a/libconjure.so b/tordnscrypt/libs/armeabi-v7a/libconjure.so index b4dab1c0..059fbb08 100755 Binary files a/tordnscrypt/libs/armeabi-v7a/libconjure.so and b/tordnscrypt/libs/armeabi-v7a/libconjure.so differ diff --git a/tordnscrypt/libs/armeabi-v7a/libi2pd.so b/tordnscrypt/libs/armeabi-v7a/libi2pd.so index 92bcccb3..535686e6 100644 Binary files a/tordnscrypt/libs/armeabi-v7a/libi2pd.so and b/tordnscrypt/libs/armeabi-v7a/libi2pd.so differ diff --git a/tordnscrypt/libs/armeabi-v7a/libobfs4proxy.so b/tordnscrypt/libs/armeabi-v7a/libobfs4proxy.so index f85a35b5..b23067a1 100755 Binary files a/tordnscrypt/libs/armeabi-v7a/libobfs4proxy.so and b/tordnscrypt/libs/armeabi-v7a/libobfs4proxy.so differ diff --git a/tordnscrypt/libs/armeabi-v7a/libsnowflake.so b/tordnscrypt/libs/armeabi-v7a/libsnowflake.so index 39e035a6..ca94dabc 100755 Binary files a/tordnscrypt/libs/armeabi-v7a/libsnowflake.so and b/tordnscrypt/libs/armeabi-v7a/libsnowflake.so differ diff --git a/tordnscrypt/libs/armeabi-v7a/libtor.so b/tordnscrypt/libs/armeabi-v7a/libtor.so index b3872213..d68b0fd9 100644 Binary files a/tordnscrypt/libs/armeabi-v7a/libtor.so and b/tordnscrypt/libs/armeabi-v7a/libtor.so differ diff --git a/tordnscrypt/libs/prebuild b/tordnscrypt/libs/prebuild index 98bbab39..5b3c57a0 100755 --- a/tordnscrypt/libs/prebuild +++ b/tordnscrypt/libs/prebuild @@ -4,27 +4,24 @@ cd "$( dirname "${BASH_SOURCE[0]}" )" lyrebird_version=workaround/ntor-auth-mismatch dnscryptproxy_version=master -snowflake_version=v2.9.2 +snowflake_version=feat/check-dns-ip libzmq_version=v4.3.5 conjure_version=prod webtunnel_version=prod -tor_openssl_version=openssl-3.3.0 +tor_openssl_version=openssl-3.3.1 libevent_version=release-2.1.12-stable zstd_version=v1.4.9 xz_version=v5.2.4 tor_version=prod -i2pd_openssl_version=openssl-3.3.0 -miniupnpc_version=c2818392e12f42901ab5abf145f43d69825a38c9 -i2pd_version=2.52.0 +i2pd_openssl_version=openssl-3.3.1 +miniupnpc_version=miniupnpc_2_2_8 +i2pd_version=2.53.1 git clone --single-branch --branch $lyrebird_version https://gitlab.torproject.org/Gedsh/lyrebird git clone --single-branch --branch $dnscryptproxy_version https://github.com/Gedsh/dnscrypt-proxy -git clone https://git.torproject.org/pluggable-transports/snowflake.git -pushd snowflake/ -git checkout -f $snowflake_version -b $snowflake_version -popd +git clone --single-branch --branch $snowflake_version https://gitlab.torproject.org/Gedsh/snowflake.git git clone https://github.com/zeromq/libzmq pushd libzmq/ diff --git a/tordnscrypt/owner.gradle b/tordnscrypt/owner.gradle index ee13d726..bde07b06 100644 --- a/tordnscrypt/owner.gradle +++ b/tordnscrypt/owner.gradle @@ -34,7 +34,7 @@ android { productFlavors { lite { applicationId "pan.alexander.tordnscrypt.stable" - versionName "6.7.1" + versionName "6.8.0" dimension = 'version' signingConfig signingConfigs.stablesign resValue 'string', 'package_name', applicationId @@ -42,7 +42,7 @@ android { pro { applicationId "pan.alexander.tordnscrypt.stable" - versionName "6.7.1" + versionName "6.8.0" dimension = 'version' signingConfig signingConfigs.stablesign resValue 'string', 'package_name', applicationId @@ -50,7 +50,7 @@ android { beta { applicationId "pan.alexander.tordnscrypt" - versionName "2.2.6" + versionName "2.3.2" dimension = 'version' signingConfig signingConfigs.betasign resValue 'string', 'package_name', applicationId @@ -59,7 +59,7 @@ android { google_play { minSdkVersion 22 applicationId "pan.alexander.tordnscrypt.gp" - versionName "6.7.1" + versionName "6.8.0" dimension = 'version' signingConfig signingConfigs.stablesign resValue 'string', 'package_name', applicationId @@ -90,10 +90,10 @@ android { defaultConfig { minSdkVersion 19 - targetSdkVersion 33 - versionCode 226 + targetSdkVersion 34 + versionCode 232 - resConfigs "en", "ru", "pl", "de", "fa", "fi", "in", "fr", "ja", "zh", "es", "pt", "pt-rBR", "el", "tr", "it", "uk" + resConfigs "en", "ru", "pl", "de", "fa", "fi", "in", "fr", "ja", "zh", "es", "pt", "pt-rBR", "el", "tr", "it", "uk", "bg", "ar" externalNativeBuild { cmake { @@ -197,16 +197,16 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.preference:preference-ktx:1.2.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.google.android.material:material:1.11.0' + implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.recyclerview:recyclerview:1.3.2' - implementation 'androidx.lifecycle:lifecycle-process:2.7.0' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0' + implementation 'androidx.lifecycle:lifecycle-process:2.8.4' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.4' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4' google_playImplementation 'com.android.billingclient:billing:6.2.0' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation 'androidx.test.ext:junit:1.2.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' implementation 'eu.chainfire:libsuperuser:1.1.1' implementation 'com.jrummyapps:android-shell:1.0.1' implementation 'androidx.core:core-ktx:1.13.1' @@ -216,6 +216,8 @@ dependencies { //DI implementation "com.google.dagger:dagger:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version" + //Persistent Work Manager + implementation "androidx.work:work-runtime-ktx:$work_version" //Multidex debugImplementation "androidx.multidex:multidex:$multidex_version" diff --git a/tordnscrypt/src/fdroid/AndroidManifest.xml b/tordnscrypt/src/fdroid/AndroidManifest.xml index 9fde8ded..f4b886b3 100644 --- a/tordnscrypt/src/fdroid/AndroidManifest.xml +++ b/tordnscrypt/src/fdroid/AndroidManifest.xml @@ -35,6 +35,10 @@ + + @@ -147,7 +151,8 @@ android:name=".update.UpdateService" android:enabled="true" android:exported="false" - android:foregroundServiceType="dataSync" /> + android:foregroundServiceType="dataSync" + tools:node="remove" /> @@ -155,13 +160,17 @@ android:name=".utils.root.RootExecService" android:enabled="true" android:exported="false" - android:foregroundServiceType="dataSync" /> + android:foregroundServiceType="shortService" /> + android:foregroundServiceType="specialUse"> + + - - + diff --git a/tordnscrypt/src/google_play/AndroidManifest.xml b/tordnscrypt/src/google_play/AndroidManifest.xml index 0ed2956e..c5378a50 100644 --- a/tordnscrypt/src/google_play/AndroidManifest.xml +++ b/tordnscrypt/src/google_play/AndroidManifest.xml @@ -34,6 +34,10 @@ + + + android:foregroundServiceType="dataSync" + tools:node="remove" /> @@ -151,13 +156,17 @@ android:name=".utils.root.RootExecService" android:enabled="true" android:exported="false" - android:foregroundServiceType="dataSync" /> + android:foregroundServiceType="shortService" /> + android:foregroundServiceType="specialUse"> + + - - + diff --git a/tordnscrypt/src/main/AndroidManifest.xml b/tordnscrypt/src/main/AndroidManifest.xml index 168ed234..3cd04ef2 100644 --- a/tordnscrypt/src/main/AndroidManifest.xml +++ b/tordnscrypt/src/main/AndroidManifest.xml @@ -25,6 +25,8 @@ + + @@ -141,13 +143,17 @@ android:name=".utils.root.RootExecService" android:enabled="true" android:exported="false" - android:foregroundServiceType="dataSync" /> + android:foregroundServiceType="shortService" /> + android:foregroundServiceType="specialUse"> + + - - + diff --git a/tordnscrypt/src/main/assets/dnscrypt.mp3 b/tordnscrypt/src/main/assets/dnscrypt.mp3 index d6e043ff..682339da 100644 Binary files a/tordnscrypt/src/main/assets/dnscrypt.mp3 and b/tordnscrypt/src/main/assets/dnscrypt.mp3 differ diff --git a/tordnscrypt/src/main/assets/tor.mp3 b/tordnscrypt/src/main/assets/tor.mp3 index 2370e2d6..1f5267fb 100644 Binary files a/tordnscrypt/src/main/assets/tor.mp3 and b/tordnscrypt/src/main/assets/tor.mp3 differ diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/MainActivity.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/MainActivity.java index f06282c7..eccf1c5b 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/MainActivity.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/MainActivity.java @@ -376,7 +376,12 @@ public void onBackPressed() { @Override public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.main, menu); + try { + getMenuInflater().inflate(R.menu.main, menu); + } catch (Exception e) { + loge("MainActivity onCreateOptionsMenu", e); + throw e; + } return true; } @@ -643,8 +648,13 @@ private void newTorIdentity(MenuItem newIdentityMenuItem) { rotateAnimation.setDuration(1000); rotateAnimation.setRepeatCount(3); - LayoutInflater inflater = getLayoutInflater(); - animatingImage = (ImageView) inflater.inflate(R.layout.icon_image_new_tor_identity, null); + try { + LayoutInflater inflater = getLayoutInflater(); + animatingImage = (ImageView) inflater.inflate(R.layout.icon_image_new_tor_identity, null); + } catch (Exception e) { + loge("MainActivity newTorIdentity", e); + throw e; + } } if (rotateAnimation != null && animatingImage != null) { @@ -708,7 +718,7 @@ private void checkHotspotState() { checkHotspotStateTimer = new Timer(); - checkHotspotStateTimer.scheduleAtFixedRate(new TimerTask() { + checkHotspotStateTimer.schedule(new TimerTask() { int loop = 0; @Override diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragment.java index 48480d5a..8afd6026 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/TopFragment.java @@ -57,7 +57,6 @@ import kotlinx.coroutines.Job; import pan.alexander.tordnscrypt.dialogs.AgreementDialog; import pan.alexander.tordnscrypt.dialogs.AskAccelerateDevelop; -import pan.alexander.tordnscrypt.dialogs.AskRestoreDefaultsDialog; import pan.alexander.tordnscrypt.dialogs.NewUpdateDialogFragment; import pan.alexander.tordnscrypt.dialogs.NotificationDialogFragment; import pan.alexander.tordnscrypt.dialogs.NotificationHelper; @@ -85,7 +84,7 @@ import pan.alexander.tordnscrypt.utils.notification.NotificationPermissionManager; import static pan.alexander.tordnscrypt.assistance.AccelerateDevelop.accelerated; -import static pan.alexander.tordnscrypt.dialogs.AskRestoreDefaultsDialog.MODULE_NAME_ARG; +import static pan.alexander.tordnscrypt.dialogs.AskRestoreDefaultsDialog.getInstance; import static pan.alexander.tordnscrypt.utils.Utils.shortenTooLongConjureLog; import static pan.alexander.tordnscrypt.utils.Utils.shortenTooLongSnowflakeLog; import static pan.alexander.tordnscrypt.utils.Utils.shortenTooLongWebTunnelLog; @@ -148,8 +147,6 @@ public class TopFragment extends Fragment public ViewModelProvider.Factory viewModelFactory; @Inject public Lazy verifierLazy; - @Inject - public Lazy askRestoreDefaultsDialog; private TopFragmentViewModel viewModel; @@ -271,7 +268,12 @@ public void onResume() { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_top, container, false); + try { + return inflater.inflate(R.layout.fragment_top, container, false); + } catch (Exception e) { + loge("TopFragment onCreateView", e); + throw e; + } } @Override @@ -696,7 +698,7 @@ private void startInstallation() { initTimer(); } - scheduledFuture = timer.scheduleAtFixedRate(new Runnable() { + scheduledFuture = timer.scheduleWithFixedDelay(new Runnable() { int loop = 0; @Override @@ -920,12 +922,10 @@ private void receiverOnReceive(Intent intent) { if (intent.getAction().equals(UpdateService.UPDATE_RESULT)) { showUpdateResultMessage(activity); refreshModulesVersions(activity); - } else if (intent.getAction().equals(ModulesStarterHelper.ASK_RESTORE_DEFAULTS)) { - DialogFragment dialog = askRestoreDefaultsDialog.get(); - Bundle args = new Bundle(); + } else if (intent.getAction().equals(ModulesStarterHelper.ASK_RESTORE_DEFAULTS) + && isAdded() && !isStateSaved()) { ModuleName name = (ModuleName) intent.getSerializableExtra(ModulesStarterHelper.MODULE_NAME); - args.putSerializable(MODULE_NAME_ARG, name); - dialog.setArguments(args); + DialogFragment dialog = getInstance(name); dialog.show(getChildFragmentManager(), "AskRestoreDefaults"); } } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/about/AboutActivity.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/about/AboutActivity.java index 93eb43ea..331ee7f0 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/about/AboutActivity.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/about/AboutActivity.java @@ -20,8 +20,12 @@ package pan.alexander.tordnscrypt.about; import android.annotation.SuppressLint; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import androidx.appcompat.app.AlertDialog; + +import android.util.Base64; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -30,6 +34,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.util.Date; @@ -101,6 +106,24 @@ public void onResume() { Date buildDate = BuildConfig.BUILD_TIME; tvHelpBuildDate.setText(DateFormat.getDateInstance(DateFormat.SHORT).format(buildDate)); + TextView tvDonateTitle = findViewById(R.id.tvDonateTitle); + TextView tvDonateBitcoin = findViewById(R.id.tvDonateBitcoin); + TextView tvDonateLitecoin = findViewById(R.id.tvDonateLitecoin); + TextView tvDonateMonero = findViewById(R.id.tvDonateMonero); + if (pathVars.get().getAppVersion().endsWith("p")) { + tvDonateTitle.setVisibility(View.GONE); + tvDonateBitcoin.setVisibility(View.GONE); + tvDonateLitecoin.setVisibility(View.GONE); + tvDonateMonero.setVisibility(View.GONE); + } else { + tvDonateBitcoin.setText(getBitcoinUri()); + tvDonateBitcoin.setOnClickListener(this); + tvDonateLitecoin.setText(getLitecoinUri()); + tvDonateLitecoin.setOnClickListener(this); + tvDonateMonero.setText(getMoneroUri()); + tvDonateMonero.setOnClickListener(this); + } + findViewById(R.id.dnscryptLicense).setOnClickListener(this); findViewById(R.id.torLicense).setOnClickListener(this); findViewById(R.id.itpdLicense).setOnClickListener(this); @@ -111,6 +134,7 @@ public void onResume() { findViewById(R.id.busyboxLicense).setOnClickListener(this); } + @SuppressLint("InflateParams") public void showLicense(int title, int resource, boolean isApache) { InputStream raw = getResources().openRawResource(resource); @@ -149,7 +173,13 @@ public void showLicense(int title, int resource, boolean isApache) { AlertDialog.Builder builder = new AlertDialog.Builder(this); LayoutInflater layoutInflater = getLayoutInflater(); - View inflatedView = layoutInflater.inflate(R.layout.licenses_scrollable_text, null, false); + View inflatedView; + try { + inflatedView = layoutInflater.inflate(R.layout.licenses_scrollable_text, null, false); + } catch (Exception e) { + loge("AboutActivity showLicense", e); + throw e; + } TextView licenseText = inflatedView.findViewById(R.id.tvLicense); licenseText.setText(outputText); @@ -173,10 +203,47 @@ public void showLicense(int title, int resource, boolean isApache) { } } + private String getBitcoinUri() { + return decodeBase64("WW1sMFkyOXBiam94UjJaS2QybElSelo0UzBOUlEzQklaVmMyWmtWTWVrWm1aM04yWTFONFZsVlM="); + } + + private String getLitecoinUri() { + return decodeBase64("YkdsMFpXTnZhVzQ2VFZWVFFWaHJZMEYyYms0eFdYUmhkWHBsYnpsaWQycFdhbUZ5VldSRVNFZG5hdz09"); + } + + private String getMoneroUri() { + return decodeBase64("Ylc5dVpYSnZPamd5VjBaNmIyWjJSMVZrV1RVeWR6bDZRMlp5V2xkaFNGWnhSVVJqU2tnM2VURkdkV3A2ZGxoa1IxQmxWVGxWY0hWR1RtVkRkblJEUzJoMGNFTTJjRnB0VFZsMVEwNW5SbXBqZHpWdFNFRm5SVXBSTkZKVWQxWTVXRkpvYjJKWQ=="); + } + + private static String decodeBase64(final String base64) { + byte[] bytes = Base64.decode(base64, Base64.DEFAULT); + String unwrap = new String(bytes, StandardCharsets.UTF_8); + bytes = Base64.decode(unwrap, Base64.DEFAULT); + return new String(bytes, StandardCharsets.UTF_8); + } + + private void sendDonateIntent(String uri) { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(Uri.parse(uri)); + Intent chooser = Intent.createChooser(intent, "Donate with..."); + try { + startActivity(chooser); + } catch (Exception ignored) { + } + + } + @Override public void onClick(View view) { int id = view.getId(); - if (id == R.id.dnscryptLicense) { + if (id == R.id.tvDonateBitcoin) { + sendDonateIntent(getBitcoinUri()); + } else if (id == R.id.tvDonateMonero) { + sendDonateIntent(getMoneroUri()); + } else if (id == R.id.tvDonateLitecoin) { + sendDonateIntent(getLitecoinUri()); + } else if (id == R.id.dnscryptLicense) { showLicense(R.string.about_license_dnscrypt, R.raw.dnscrypt_license, false); } else if (id == R.id.torLicense) { showLicense(R.string.about_license_tor, R.raw.tor_license, false); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/BackupFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/BackupFragment.java index 0e966502..fe316bea 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/BackupFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/BackupFragment.java @@ -29,6 +29,7 @@ import android.os.Bundle; import android.os.Environment; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.LinearLayoutCompat; @@ -137,9 +138,16 @@ public void onCreate(Bundle savedInstanceState) { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_backup, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_backup, container, false); + } catch (Exception e) { + loge("BackupFragment onCreateView", e); + throw e; + } + Button btnResetSettings = view.findViewById(R.id.btnResetSettings); btnResetSettings.setOnClickListener(this); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/BackupHelper.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/BackupHelper.java index ce828a10..ea9a16c6 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/BackupHelper.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/BackupHelper.java @@ -216,9 +216,9 @@ private void convertUIDsToPackageNames(List applications, Strin for (String savedUIDStr : savedUIDs) { - int savedUID = 0; + long savedUID = 0; if (savedUIDStr.matches("^-?\\d+$")) { - savedUID = Integer.parseInt(savedUIDStr); + savedUID = Long.parseLong(savedUIDStr); } if (savedUID <= 2000) { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/RestoreHelper.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/RestoreHelper.java index a5c0bd07..480f81bb 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/RestoreHelper.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/backup/RestoreHelper.java @@ -28,6 +28,7 @@ import androidx.preference.PreferenceManager; import android.content.pm.PackageManager; +import android.os.Build; import java.io.File; import java.io.FileInputStream; @@ -45,6 +46,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import dalvik.system.ZipPathValidator; import pan.alexander.tordnscrypt.R; import pan.alexander.tordnscrypt.di.SharedPreferencesModule; import pan.alexander.tordnscrypt.modules.ModulesAux; @@ -192,6 +194,10 @@ private boolean isBackupExist() { try (FileInputStream fileInputStream = new FileInputStream(pathBackup + "/InvizibleBackup.zip"); ZipInputStream zipInputStream = new ZipInputStream(fileInputStream)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + ZipPathValidator.clearCallback(); + } + ZipEntry zipEntry = zipInputStream.getNextEntry(); while (zipEntry != null) { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/bridges/DefaultVanillaBridgeRepositoryImpl.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/bridges/DefaultVanillaBridgeRepositoryImpl.kt index d4d71b78..73e73ad6 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/bridges/DefaultVanillaBridgeRepositoryImpl.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/bridges/DefaultVanillaBridgeRepositoryImpl.kt @@ -27,6 +27,8 @@ import pan.alexander.tordnscrypt.domain.bridges.DefaultVanillaBridgeRepository import pan.alexander.tordnscrypt.utils.Constants.* import pan.alexander.tordnscrypt.utils.connectionchecker.SocketInternetChecker import pan.alexander.tordnscrypt.utils.logger.Logger.logw +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_PASS +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_USER import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_OUTBOUND_PROXY import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_OUTBOUND_PROXY_ADDRESS import java.lang.IllegalArgumentException @@ -84,7 +86,9 @@ class DefaultVanillaBridgeRepositoryImpl @Inject constructor( ip, port, proxyAddress[0].trim(), - proxyAddress[1].trim().toInt() + proxyAddress[1].trim().toInt(), + getTorProxyUser(), + getTorProxyPass() ) } } else { @@ -109,17 +113,23 @@ class DefaultVanillaBridgeRepositoryImpl @Inject constructor( private fun getTorOutboundProxyAddress() = defaultPreferences.getString(TOR_OUTBOUND_PROXY_ADDRESS, "") + private fun getTorProxyUser() = defaultPreferences.getString(PROXY_USER, "") ?: "" + + private fun getTorProxyPass() = defaultPreferences.getString(PROXY_PASS, "") ?: "" + private fun checkTimeoutDirectly(ip: String, port: String) = socketInternetChecker.get() - .checkConnectionPing(ip, port.toInt(), "", 0) + .checkConnectionPing(ip, port.toInt(), "", 0, "", "") private fun checkTimeoutViaProxy( ip: String, port: String, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String, ) = socketInternetChecker.get() - .checkConnectionPing(ip, port.toInt(), proxyAddress, proxyPort) + .checkConnectionPing(ip, port.toInt(), proxyAddress, proxyPort, proxyUser, proxyPass) override suspend fun getRelaysWithFingerprintAndAddress( allowIPv6Relays: Boolean @@ -229,6 +239,8 @@ class DefaultVanillaBridgeRepositoryImpl @Inject constructor( port = port, proxyAddress = proxyAddress[0].trim(), proxyPort = proxyAddress[1].trim().toInt(), + proxyUser = getTorProxyUser(), + proxyPass = getTorProxyPass(), connectTimeout = connectTimeout, reachableTimeout = reachableTimeout ) @@ -238,6 +250,8 @@ class DefaultVanillaBridgeRepositoryImpl @Inject constructor( port = port, proxyAddress = "", proxyPort = 0, + "", + "", connectTimeout = connectTimeout, reachableTimeout = reachableTimeout ) @@ -248,6 +262,8 @@ class DefaultVanillaBridgeRepositoryImpl @Inject constructor( port = port, proxyAddress = "", proxyPort = 0, + "", + "", connectTimeout = connectTimeout, reachableTimeout = reachableTimeout ) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerDataSource.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerDataSource.kt index bfcd20da..af4c52cf 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerDataSource.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerDataSource.kt @@ -23,14 +23,18 @@ interface ConnectionCheckerDataSource { fun checkInternetAvailableOverHttp( site: String, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String ): Boolean fun checkInternetAvailableOverSocks( ip: String, port: Int, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String ): Boolean fun checkNetworkAvailable(): Boolean diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerDataSourceImpl.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerDataSourceImpl.kt index 45b69718..7b1d24de 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerDataSourceImpl.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerDataSourceImpl.kt @@ -34,20 +34,26 @@ class ConnectionCheckerDataSourceImpl @Inject constructor( override fun checkInternetAvailableOverHttp( site: String, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String ): Boolean = - httpInternetChecker.get().checkConnectionAvailability(site, proxyAddress, proxyPort) + httpInternetChecker.get().checkConnectionAvailability(site, proxyAddress, proxyPort, proxyUser, proxyPass) override fun checkInternetAvailableOverSocks( ip: String, port: Int, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String, ): Boolean = socketInternetChecker.get().checkConnectionAvailability( ip, port, proxyAddress, - proxyPort + proxyPort, + proxyUser, + proxyPass ) override fun checkNetworkAvailable(): Boolean = diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerRepositoryImpl.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerRepositoryImpl.kt index 263a3403..a05cff15 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerRepositoryImpl.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/data/connection_checker/ConnectionCheckerRepositoryImpl.kt @@ -29,12 +29,16 @@ class ConnectionCheckerRepositoryImpl @Inject constructor( override fun checkInternetAvailableOverHttp( site: String, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String ): Boolean { return connectionCheckerDataSource.checkInternetAvailableOverHttp( site, proxyAddress, - proxyPort + proxyPort, + proxyUser, + proxyPass ) } @@ -42,13 +46,17 @@ class ConnectionCheckerRepositoryImpl @Inject constructor( ip: String, port: Int, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String, ): Boolean { return connectionCheckerDataSource.checkInternetAvailableOverSocks( ip, port, proxyAddress, - proxyPort + proxyPort, + proxyUser, + proxyPass ) } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/di/AppComponent.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/di/AppComponent.kt index a67e7b7e..bcc33d22 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/di/AppComponent.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/di/AppComponent.kt @@ -33,6 +33,7 @@ import pan.alexander.tordnscrypt.di.arp.ArpSubcomponent import pan.alexander.tordnscrypt.di.modulesservice.ModulesServiceSubcomponent import pan.alexander.tordnscrypt.di.tiles.TilesSubcomponent import pan.alexander.tordnscrypt.dialogs.* +import pan.alexander.tordnscrypt.dialogs.progressDialogs.PleaseWaitDialogBridgesRequest import pan.alexander.tordnscrypt.dnscrypt_fragment.DNSCryptFragmentReceiver import pan.alexander.tordnscrypt.domain.preferences.PreferenceRepository @@ -128,6 +129,11 @@ interface AppComponent { fun inject(dialogFragment: RequestIgnoreDataRestrictionDialog) fun inject(dialogFragment: SendCrashReport) fun inject(dialogFragment: AddDNSCryptServerDialogFragment) + fun inject(dialogFragment: AskRestoreDefaultsDialog) + fun inject(dialogFragment: PleaseWaitDialogBridgesRequest) + fun inject(dialogFragment: BridgesCaptchaDialogFragment) + fun inject(dialogFragment: BridgesReadyDialogFragment) + fun inject(dialogFragment: SelectBridgesTransportDialogFragment) fun inject(usageStatistic: UsageStatistic) fun inject(modulesKiller: ModulesKiller) fun inject(contextUIDUpdater: ContextUIDUpdater) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/AgreementDialog.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/AgreementDialog.java index 55807548..7c4ef76b 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/AgreementDialog.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/AgreementDialog.java @@ -19,8 +19,10 @@ package pan.alexander.tordnscrypt.dialogs; +import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.AGREEMENT_ACCEPTED; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; @@ -46,6 +48,7 @@ public static AgreementDialog newInstance() { return new AgreementDialog(); } + @SuppressLint("InflateParams") @Override public AlertDialog.Builder assignBuilder() { @@ -65,7 +68,13 @@ public AlertDialog.Builder assignBuilder() { return null; } - View view = lInflater.inflate(R.layout.agreement_layout, null, false); + View view; + try { + view = lInflater.inflate(R.layout.agreement_layout, null, false); + } catch (Exception e) { + loge("AgreementDialog assignBuilder", e); + throw e; + } if (view == null) { preferences.setBoolPreference(AGREEMENT_ACCEPTED, true); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/AskRestoreDefaultsDialog.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/AskRestoreDefaultsDialog.java index 5021061e..73de2d05 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/AskRestoreDefaultsDialog.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/AskRestoreDefaultsDialog.java @@ -23,10 +23,12 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; import androidx.lifecycle.ViewModelProvider; import javax.inject.Inject; +import pan.alexander.tordnscrypt.App; import pan.alexander.tordnscrypt.R; import pan.alexander.tordnscrypt.TopFragmentViewModel; import pan.alexander.tordnscrypt.utils.enums.ModuleName; @@ -37,16 +39,13 @@ public class AskRestoreDefaultsDialog extends ExtendedDialogFragment { private ModuleName module; - ViewModelProvider.Factory viewModelFactory; - TopFragmentViewModel topFragmentViewModel; - @Inject - public AskRestoreDefaultsDialog(ViewModelProvider.Factory viewModelFactory) { - this.viewModelFactory = viewModelFactory; - } + public ViewModelProvider.Factory viewModelFactory; + private TopFragmentViewModel topFragmentViewModel; @Override public void onCreate(@Nullable Bundle savedInstanceState) { + App.getInstance().getDaggerComponent().inject(this); super.onCreate(savedInstanceState); topFragmentViewModel = new ViewModelProvider( @@ -85,4 +84,12 @@ public AlertDialog.Builder assignBuilder() { return builder; } + + public static DialogFragment getInstance(ModuleName name) { + DialogFragment dialog = new AskRestoreDefaultsDialog(); + Bundle args = new Bundle(); + args.putSerializable(MODULE_NAME_ARG, name); + dialog.setArguments(args); + return dialog; + } } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/BridgesCaptchaDialogFragment.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/BridgesCaptchaDialogFragment.kt index fa9889b2..1fcf2b0d 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/BridgesCaptchaDialogFragment.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/BridgesCaptchaDialogFragment.kt @@ -23,6 +23,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.DialogInterface import android.graphics.Bitmap +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.View.OnFocusChangeListener @@ -32,15 +33,18 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider import kotlinx.coroutines.ExperimentalCoroutinesApi +import pan.alexander.tordnscrypt.App import pan.alexander.tordnscrypt.R import pan.alexander.tordnscrypt.settings.tor_bridges.PreferencesTorBridgesViewModel import pan.alexander.tordnscrypt.utils.Utils.hideKeyboard +import pan.alexander.tordnscrypt.utils.logger.Logger.loge import javax.inject.Inject @ExperimentalCoroutinesApi -class BridgesCaptchaDialogFragment @Inject constructor( - private val viewModelFactory: ViewModelProvider.Factory -) : ExtendedDialogFragment() { +class BridgesCaptchaDialogFragment : ExtendedDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory var transport = "" var ipv6 = false @@ -54,6 +58,11 @@ class BridgesCaptchaDialogFragment @Inject constructor( private var okButtonPressed = false + override fun onCreate(savedInstanceState: Bundle?) { + App.instance.daggerComponent.inject(this) + super.onCreate(savedInstanceState) + } + @SuppressLint("InflateParams") override fun assignBuilder(): AlertDialog.Builder = AlertDialog.Builder(requireActivity()).apply { @@ -61,7 +70,12 @@ class BridgesCaptchaDialogFragment @Inject constructor( Context.LAYOUT_INFLATER_SERVICE ) as LayoutInflater - val view: View = layoutInflater.inflate(R.layout.tor_transport_code_image, null) + val view: View = try { + layoutInflater.inflate(R.layout.tor_transport_code_image, null) + } catch (e: Exception) { + loge("BridgesCaptchaDialogFragment assignBuilder", e) + throw e + } val imgCode = view.findViewById(R.id.imgCode) val etCode = view.findViewById(R.id.etCode) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/BridgesReadyDialogFragment.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/BridgesReadyDialogFragment.kt index 7caa56e0..d07b84a6 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/BridgesReadyDialogFragment.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/BridgesReadyDialogFragment.kt @@ -20,21 +20,24 @@ package pan.alexander.tordnscrypt.dialogs import android.content.DialogInterface +import android.os.Bundle import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider import kotlinx.coroutines.ExperimentalCoroutinesApi +import pan.alexander.tordnscrypt.App import pan.alexander.tordnscrypt.R import pan.alexander.tordnscrypt.settings.tor_bridges.PreferencesTorBridges import pan.alexander.tordnscrypt.settings.tor_bridges.PreferencesTorBridgesViewModel import javax.inject.Inject @ExperimentalCoroutinesApi -class BridgesReadyDialogFragment @Inject constructor( - private val viewModelFactory: ViewModelProvider.Factory -) : ExtendedDialogFragment() { +class BridgesReadyDialogFragment : ExtendedDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory private val preferencesTorBridgesViewModel: PreferencesTorBridgesViewModel by viewModels( { requireParentFragment() }, @@ -43,6 +46,11 @@ class BridgesReadyDialogFragment @Inject constructor( var bridges = "" + override fun onCreate(savedInstanceState: Bundle?) { + App.instance.daggerComponent.inject(this) + super.onCreate(savedInstanceState) + } + override fun assignBuilder(): AlertDialog.Builder = AlertDialog.Builder(requireActivity()).apply { val tvBridges = TextView(requireActivity()).apply { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/Registration.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/Registration.java index 2dc7a206..8295bef0 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/Registration.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/Registration.java @@ -46,7 +46,7 @@ public class Registration { private final Activity activity; - public static boolean wrongRegistrationCode = true; + public static volatile boolean wrongRegistrationCode = true; private final Lazy preferenceRepository; public Registration(Activity activity) { @@ -88,6 +88,7 @@ public void showDonateDialog() { } + @SuppressLint("InflateParams") public void showEnterCodeDialog() { if (activity == null || !(activity instanceof MainActivity) || activity.isFinishing()) { @@ -95,7 +96,13 @@ public void showEnterCodeDialog() { } LayoutInflater inflater = activity.getLayoutInflater(); - @SuppressLint("InflateParams") final View inputView = inflater.inflate(R.layout.edit_text_for_dialog, null, false); + View inputView; + try { + inputView = inflater.inflate(R.layout.edit_text_for_dialog, null, false); + } catch (Exception e) { + loge("Registration showEnterCodeDialog", e); + throw e; + } final EditText editText = inputView.findViewById(R.id.etForDialog); editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE); editText.setOnFocusChangeListener((v, hasFocus) -> { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/SelectBridgesTransportDialogFragment.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/SelectBridgesTransportDialogFragment.kt index 6e0b6246..f895af48 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/SelectBridgesTransportDialogFragment.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/SelectBridgesTransportDialogFragment.kt @@ -23,6 +23,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.DialogInterface import android.content.SharedPreferences +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.View.GONE @@ -33,19 +34,23 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider import kotlinx.coroutines.ExperimentalCoroutinesApi +import pan.alexander.tordnscrypt.App import pan.alexander.tordnscrypt.R import pan.alexander.tordnscrypt.di.SharedPreferencesModule.Companion.DEFAULT_PREFERENCES_NAME import pan.alexander.tordnscrypt.settings.tor_bridges.PreferencesTorBridgesViewModel +import pan.alexander.tordnscrypt.utils.logger.Logger.loge import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_USE_IPV6 import javax.inject.Inject import javax.inject.Named @ExperimentalCoroutinesApi -class SelectBridgesTransportDialogFragment @Inject constructor( +class SelectBridgesTransportDialogFragment : ExtendedDialogFragment() { + + @Inject @Named(DEFAULT_PREFERENCES_NAME) - private val defaultPreferences: SharedPreferences, - private val viewModelFactory: ViewModelProvider.Factory -) : ExtendedDialogFragment() { + lateinit var defaultPreferences: SharedPreferences + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory private val preferencesTorBridgesViewModel: PreferencesTorBridgesViewModel by viewModels( { requireParentFragment() }, @@ -54,13 +59,23 @@ class SelectBridgesTransportDialogFragment @Inject constructor( private var okButtonPressed = false + override fun onCreate(savedInstanceState: Bundle?) { + App.instance.daggerComponent.inject(this) + super.onCreate(savedInstanceState) + } + @SuppressLint("InflateParams") override fun assignBuilder(): AlertDialog.Builder = AlertDialog.Builder(requireActivity()).apply { val layoutInflater = requireActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater - val view: View = layoutInflater.inflate(R.layout.select_tor_transport, null) + val view: View = try { + layoutInflater.inflate(R.layout.select_tor_transport, null) + } catch (e: Exception) { + loge("SelectBridgesTransportDialogFragment assignBuilder", e) + throw e + } val rbgTorTransport = view.findViewById(R.id.rbgTorTransport) val chbRequestIPv6Bridges = view.findViewById(R.id.chbRequestIPv6Bridges) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/UpdateDefaultBridgesDialog.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/UpdateDefaultBridgesDialog.kt index 1683f25d..8c50c444 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/UpdateDefaultBridgesDialog.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/UpdateDefaultBridgesDialog.kt @@ -21,7 +21,9 @@ package pan.alexander.tordnscrypt.dialogs import android.app.Activity import android.content.Intent +import android.os.Build import androidx.appcompat.app.AlertDialog +import dalvik.system.ZipPathValidator import kotlinx.coroutines.Job import pan.alexander.tordnscrypt.App import pan.alexander.tordnscrypt.R @@ -71,11 +73,15 @@ class UpdateDefaultBridgesDialog private constructor() { val outputFile = File(pathVars.appDataDir + "/app_data/tor/bridges_default.lst") val installedBridgesSize = outputFile.length() try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + ZipPathValidator.clearCallback() + } + ZipInputStream(activity.assets.open("tor.mp3")).use { zipInputStream -> var zipEntry = zipInputStream.nextEntry while (zipEntry != null) { val fileName = zipEntry.name - if (fileName.contains("bridges_default.lst") && zipEntry.size != installedBridgesSize) { + if (fileName.endsWith("bridges_default.lst") && zipEntry.size != installedBridgesSize) { FileOutputStream(outputFile).use { outputStream -> copyData(zipInputStream, outputStream) logi("Tor default bridges were updated!") diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/progressDialogs/ImportRulesDialog.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/progressDialogs/ImportRulesDialog.java index fcc85fea..d10f78b9 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/progressDialogs/ImportRulesDialog.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/progressDialogs/ImportRulesDialog.java @@ -19,6 +19,8 @@ package pan.alexander.tordnscrypt.dialogs.progressDialogs; +import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; + import android.annotation.SuppressLint; import android.app.Dialog; import android.os.Bundle; @@ -49,6 +51,7 @@ public static ImportRulesDialog newInstance() { return new ImportRulesDialog(); } + @SuppressLint("InflateParams") @Override public AlertDialog.Builder assignBuilder() { @@ -59,8 +62,13 @@ public AlertDialog.Builder assignBuilder() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.import_dnscrypt_rules_dialog_title); - @SuppressLint("InflateParams") - View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_import_dnscrypt_rules, null, false); + View view; + try { + view = getActivity().getLayoutInflater().inflate(R.layout.dialog_import_dnscrypt_rules, null, false); + } catch (Exception e) { + loge("ImportRulesDialog assignBuilder", e); + throw e; + } if (view != null) { builder.setView(view); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/progressDialogs/PleaseWaitDialogBridgesRequest.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/progressDialogs/PleaseWaitDialogBridgesRequest.kt index fe338949..40418273 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/progressDialogs/PleaseWaitDialogBridgesRequest.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dialogs/progressDialogs/PleaseWaitDialogBridgesRequest.kt @@ -27,21 +27,28 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider import kotlinx.coroutines.ExperimentalCoroutinesApi +import pan.alexander.tordnscrypt.App import pan.alexander.tordnscrypt.R import pan.alexander.tordnscrypt.dialogs.ExtendedDialogFragment import pan.alexander.tordnscrypt.settings.tor_bridges.PreferencesTorBridgesViewModel import javax.inject.Inject @ExperimentalCoroutinesApi -class PleaseWaitDialogBridgesRequest @Inject constructor( - private val viewModelFactory: ViewModelProvider.Factory -) : ExtendedDialogFragment() { +class PleaseWaitDialogBridgesRequest : ExtendedDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory private val preferencesTorBridgesViewModel: PreferencesTorBridgesViewModel by viewModels( { requireParentFragment() }, { viewModelFactory } ) + override fun onCreate(savedInstanceState: Bundle?) { + App.instance.daggerComponent.inject(this) + super.onCreate(savedInstanceState) + } + override fun assignBuilder(): AlertDialog.Builder = AlertDialog.Builder(requireActivity()).apply { setTitle(R.string.pref_fast_use_tor_bridges_request_dialog) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptRunFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptRunFragment.java index bae7506c..d2330835 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptRunFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/dnscrypt_fragment/DNSCryptRunFragment.java @@ -79,7 +79,13 @@ public DNSCryptRunFragment() { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_dnscrypt_run, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_dnscrypt_run, container, false); + } catch (Exception e) { + loge("DNSCryptRunFragment onCreateView", e); + throw e; + } btnDNSCryptStart = view.findViewById(R.id.btnDNSCryptStart); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_checker/ConnectionCheckerInteractorImpl.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_checker/ConnectionCheckerInteractorImpl.kt index 998eb09e..8a016eaa 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_checker/ConnectionCheckerInteractorImpl.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_checker/ConnectionCheckerInteractorImpl.kt @@ -242,12 +242,14 @@ class ConnectionCheckerInteractorImpl @Inject constructor( defaultPreferences.getString(PROXY_ADDRESS, LOOPBACK_ADDRESS) ?: LOOPBACK_ADDRESS val proxyPort = defaultPreferences.getString(PROXY_PORT, DEFAULT_PROXY_PORT).let { - if (it?.matches(Regex(NUMBER_REGEX)) == true) { + if (it?.matches(Regex(NUMBER_REGEX)) == true && it.toLong() <= MAX_PORT_NUMBER) { it.toInt() } else { DEFAULT_PROXY_PORT.toInt() } } + val proxyUser = defaultPreferences.getString(PROXY_USER, "") ?: "" + val proxyPass = defaultPreferences.getString(PROXY_PASS, "") ?: "" val useProxy = defaultPreferences.getBoolean(USE_PROXY, false) && proxyAddress.isNotBlank() && proxyPort != 0 @@ -260,7 +262,9 @@ class ConnectionCheckerInteractorImpl @Inject constructor( checkerRepository.checkInternetAvailableOverHttp( site, proxyAddress, - proxyPort + proxyPort, + proxyUser, + proxyPass ) } else { val dnsForConnectivityCheck = getNetworkDns() @@ -281,7 +285,9 @@ class ConnectionCheckerInteractorImpl @Inject constructor( dnsForConnectivityCheck, PLAINTEXT_DNS_PORT, "", - 0 + 0, + "", + "" ) } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_checker/ConnectionCheckerRepository.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_checker/ConnectionCheckerRepository.kt index fc0aba59..0ba613ef 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_checker/ConnectionCheckerRepository.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_checker/ConnectionCheckerRepository.kt @@ -20,13 +20,21 @@ package pan.alexander.tordnscrypt.domain.connection_checker interface ConnectionCheckerRepository { - fun checkInternetAvailableOverHttp(site: String, proxyAddress: String, proxyPort: Int): Boolean + fun checkInternetAvailableOverHttp( + site: String, + proxyAddress: String, + proxyPort: Int, + proxyUser: String, + proxyPass: String + ): Boolean fun checkInternetAvailableOverSocks( ip: String, port: Int, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String, ): Boolean fun checkNetworkAvailable(): Boolean diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_records/ConnectionRecordsConverter.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_records/ConnectionRecordsConverter.kt index 8776b117..29ace49c 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_records/ConnectionRecordsConverter.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/connection_records/ConnectionRecordsConverter.kt @@ -536,11 +536,11 @@ class ConnectionRecordsConverter @Inject constructor( allThroughTor = isRouteAllThroughTor() appsThroughTor.apply { clear() - addAll(preferenceRepository.getStringSetPreference(UNLOCK_APPS).map { it.toInt() }) + addAll(preferenceRepository.getStringSetPreference(UNLOCK_APPS).map { it.toLong().toInt() }) } appsBypassTor.apply { clear() - addAll(preferenceRepository.getStringSetPreference(CLEARNET_APPS).map { it.toInt() }) + addAll(preferenceRepository.getStringSetPreference(CLEARNET_APPS).map { it.toLong().toInt() }) } } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/log_reader/dnscrypt/DNSCryptLogParser.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/log_reader/dnscrypt/DNSCryptLogParser.kt index 6fd580de..765b9ab2 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/log_reader/dnscrypt/DNSCryptLogParser.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/domain/log_reader/dnscrypt/DNSCryptLogParser.kt @@ -42,7 +42,7 @@ class DNSCryptLogParser(private val modulesLogRepository: ModulesLogRepository) if (!startedSuccessfully) { for (i in lines.size - 1 downTo 0) { val line = lines[i] - if (line.contains(" OK ")) { + if (line.contains(" OK ") || line.contains("lowest initial latency")) { startedSuccessfully = true startedWithError = false errorCountDownCounter = COUNT_DOWN_TIMER @@ -53,7 +53,7 @@ class DNSCryptLogParser(private val modulesLogRepository: ModulesLogRepository) break } else if (line.contains("connect: connection refused") || (line.contains("ERROR") && !line.contains("Unable to resolve")) - || line.contains("[CRITICAL]") + || (line.contains("[CRITICAL]") && !line.contains("Certificate hash")) || line.contains("[FATAL]") ) { if (errorCountDownCounter <= 0) { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/iptables/IptablesFirewall.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/iptables/IptablesFirewall.kt index 951ba9ca..bc672976 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/iptables/IptablesFirewall.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/iptables/IptablesFirewall.kt @@ -123,6 +123,7 @@ class IptablesFirewall @Inject constructor( VpnUtils.nonTorList .asSequence() .filter { it != "127.0.0.0/8" } //exclude localhost + .filter { it != META_ADDRESS } //exclude meta address .map { "$iptables -A $FILTER_OUTPUT_FIREWALL -d $it -j $FILTER_FIREWALL_LAN" } @@ -231,14 +232,14 @@ class IptablesFirewall @Inject constructor( listAllowed.forEach { if (it?.matches(negativeNumberRegex) == true) { uidSpecialAllowed.add(it.toInt()) - } else if (it?.matches(positiveNumberRegex) == true) { + } else if (it?.matches(positiveNumberRegex) == true && it.toLong() <= Int.MAX_VALUE) { uidAllowed.add(it.toInt()) } } private fun fillLanAllowed() { preferences.getStringSetPreference(APPS_ALLOW_LAN_PREF).forEach { - if (it.matches(numberRegex)) { + if (it.matches(numberRegex) && it.toLong() <= Int.MAX_VALUE) { uidLanAllowed.add(it.toInt()) } } @@ -297,7 +298,7 @@ class IptablesFirewall @Inject constructor( fun getCriticalUidsAllowed() = preferences.getStringSetPreference(APPS_ALLOW_WIFI_PREF) .also { it.addAll(preferences.getStringSetPreference(APPS_ALLOW_GSM_PREF)) } - .filter { it.matches(positiveNumberRegex) } + .filter { it.matches(positiveNumberRegex) && it.toLong() <= Int.MAX_VALUE } .map { it.toInt() } .filter { it <= 2000 } } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDRunFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDRunFragment.java index d2c904a3..52030e76 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDRunFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/itpd_fragment/ITPDRunFragment.java @@ -79,7 +79,13 @@ public ITPDRunFragment() { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_itpd_run, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_itpd_run, container, false); + } catch (Exception e) { + loge("ITPDRunFragment onCreateView", e); + throw e; + } btnITPDStart = view.findViewById(R.id.btnITPDStart); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/language/LanguageList.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/language/LanguageList.java index ba184fbf..b22c6f90 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/language/LanguageList.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/language/LanguageList.java @@ -29,6 +29,8 @@ public class LanguageList { private static String sStandardOptionLabel = STANDARD_OPTION_LABEL_DEFAULT; private static final String[] HUMAN_RAW = { null, + "QXJhYmljICjYp9mE2LnYsdio2YrYqSk=", + "QnVsZ2FyaWFuICjQkdGK0LvQs9Cw0YDRgdC60Lgp", "Q2hpbmVzZSAo5Lit5paHKQ==", "RW5nbGlzaCAoRW5nbGlzaCk=", "RmlubmlzaCAoU3VvbWkp", @@ -49,6 +51,8 @@ public class LanguageList { }; private static final String[] MACHINE = { "", + "ar", + "bg", "zh", "en", "fi", diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/main_fragment/MainFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/main_fragment/MainFragment.java index a1f78edf..5c9cea6f 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/main_fragment/MainFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/main_fragment/MainFragment.java @@ -144,7 +144,13 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.main_fragment, container, false); + View view; + try { + view = inflater.inflate(R.layout.main_fragment, container, false); + } catch (Exception e) { + loge("MainFragment onCreateView", e); + throw e; + } btnStartMainFragment = view.findViewById(R.id.btnStartMainFragment); btnStartMainFragment.setOnClickListener(this); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesStateLoop.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesStateLoop.java index a8180fa2..5d419581 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesStateLoop.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/modules/ModulesStateLoop.java @@ -51,10 +51,10 @@ import pan.alexander.tordnscrypt.utils.connectivitycheck.ConnectivityCheckManager; import pan.alexander.tordnscrypt.utils.enums.ModuleState; import pan.alexander.tordnscrypt.utils.enums.OperationMode; +import pan.alexander.tordnscrypt.utils.workers.UpdateIPsManager; import pan.alexander.tordnscrypt.vpn.service.ServiceVPNHelper; import static pan.alexander.tordnscrypt.di.SharedPreferencesModule.DEFAULT_PREFERENCES_NAME; -import static pan.alexander.tordnscrypt.utils.jobscheduler.JobSchedulerManager.startRefreshTorUnlockIPs; import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import static pan.alexander.tordnscrypt.utils.logger.Logger.logi; import static pan.alexander.tordnscrypt.utils.logger.Logger.logw; @@ -108,6 +108,8 @@ public class ModulesStateLoop implements Runnable, public Lazy connectivityCheckManager; @Inject public Lazy modulesStatusBroadcaster; + @Inject + public Lazy updateIPsManager; private boolean iptablesUpdateTemporaryBlocked; @@ -615,7 +617,7 @@ private void setTorReady(boolean ready) { } if (ready && !savedReady) { - startRefreshTorUnlockIPs(modulesService.getApplicationContext()); + updateIPsManager.get().startRefreshTorUnlockIPs(); } } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/nflog/NflogParser.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/nflog/NflogParser.kt index 8729edc7..75399ee4 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/nflog/NflogParser.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/nflog/NflogParser.kt @@ -54,20 +54,20 @@ class NflogParser @Inject constructor( if (matcher.find()) { val time = (matcher.group(1) ?: "0").toLong() .takeIf { it > 0 } ?: System.currentTimeMillis() - var uid = (matcher.group(2) ?: "-1").toInt() + var uid = (matcher.group(2) ?: "-1").toLong() val protocol = matcher.group(3) ?: "" val saddr = matcher.group(4) ?: "" val sport = (matcher.group(5) ?: "0").toInt() val daddr = matcher.group(6) ?: "" val dport = (matcher.group(7) ?: "0").toInt() - if (uid >= 0) { - nflogSessionsHolder.addSession(uid, protocol, saddr, sport, daddr, dport) + if (uid >= 0 && uid <= Int.MAX_VALUE) { + nflogSessionsHolder.addSession(uid.toInt(), protocol, saddr, sport, daddr, dport) } else { - uid = nflogSessionsHolder.getUid(protocol, saddr, sport, daddr, dport) + uid = nflogSessionsHolder.getUid(protocol, saddr, sport, daddr, dport).toLong() } - if (uid == ownUid) { + if (uid == ownUid.toLong() || uid > Int.MAX_VALUE) { return null } @@ -81,7 +81,7 @@ class NflogParser @Inject constructor( return PacketRecord( time = time, - uid = uid, + uid = uid.toInt(), saddr = saddr, daddr = daddr, protocol = protocolInt, diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/patches/ConfigUtil.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/patches/ConfigUtil.kt index 3e4626a3..bf0c7858 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/patches/ConfigUtil.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/patches/ConfigUtil.kt @@ -20,6 +20,8 @@ package pan.alexander.tordnscrypt.patches import android.content.Context +import android.os.Build +import dalvik.system.ZipPathValidator import pan.alexander.tordnscrypt.App import pan.alexander.tordnscrypt.utils.logger.Logger.loge import pan.alexander.tordnscrypt.utils.logger.Logger.logi @@ -205,18 +207,22 @@ class ConfigUtil(private val context: Context) { val installedGeoipSize = geoip.length() val installedGeoip6Size = geoip6.length() try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + ZipPathValidator.clearCallback() + } + ZipInputStream(context.assets.open("tor.mp3")).use { zipInputStream -> var zipEntry = zipInputStream.nextEntry while (zipEntry != null) { val fileName = zipEntry.name - if (fileName.contains("geoip6")) { + if (fileName.endsWith("geoip6")) { if (zipEntry.size != installedGeoip6Size) { FileOutputStream(geoip6).use { outputStream -> copyData(zipInputStream, outputStream) logi("Tor geoip6 was updated!") } } - } else if (fileName.contains("geoip")) { + } else if (fileName.endsWith("geoip")) { if (zipEntry.size != installedGeoipSize) { FileOutputStream(geoip).use { outputStream -> copyData(zipInputStream, outputStream) diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/proxy/ProxyFragment.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/proxy/ProxyFragment.kt index 605f38e2..7d1702ef 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/proxy/ProxyFragment.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/proxy/ProxyFragment.kt @@ -45,8 +45,11 @@ import pan.alexander.tordnscrypt.domain.preferences.PreferenceRepository import pan.alexander.tordnscrypt.settings.SettingsActivity import pan.alexander.tordnscrypt.utils.Constants.DEFAULT_PROXY_PORT import pan.alexander.tordnscrypt.utils.Constants.LOOPBACK_ADDRESS +import pan.alexander.tordnscrypt.utils.Constants.MAX_PORT_NUMBER import pan.alexander.tordnscrypt.utils.executors.CoroutineExecutor import pan.alexander.tordnscrypt.utils.logger.Logger.loge +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.DNSCRYPT_OUTBOUND_PROXY +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.I2PD_OUTBOUND_PROXY import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXIFY_DNSCRYPT import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXIFY_I2PD import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXIFY_TOR @@ -54,6 +57,7 @@ import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_ADDRESS import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_PASS import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_PORT import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_USER +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_OUTBOUND_PROXY import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.USE_PROXY import javax.inject.Inject @@ -104,27 +108,17 @@ class ProxyFragment : Fragment(), View.OnClickListener, TextWatcher { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - _binding = FragmentProxyBinding.inflate(inflater, container, false) - val passAndNameIsEmpty = binding.etProxyPass.text.toString().trim().isEmpty() - && binding.etProxyUserName.text.toString().trim().isEmpty() + _binding = try { + FragmentProxyBinding.inflate(inflater, container, false) + } catch (e: Exception) { + loge("ProxyFragment onCreateView", e) + throw e + } (binding.btnSelectWoProxyApps as Button).setOnClickListener(this) (binding.btnProxySave as Button).setOnClickListener(this) - (binding.chbProxyDNSCrypt as CompoundButton).apply { - isEnabled = passAndNameIsEmpty - isChecked = getBoolFromSharedPreferences(PROXIFY_DNSCRYPT) - } - (binding.chbProxyTor as CompoundButton).apply { - isEnabled = passAndNameIsEmpty - isChecked = getBoolFromSharedPreferences(PROXIFY_TOR) - } - (binding.chbProxyITPD as CompoundButton).apply { - isEnabled = passAndNameIsEmpty - isChecked = getBoolFromSharedPreferences(PROXIFY_I2PD) - } - binding.etProxyServer.setText(sharedPreferences?.getString(PROXY_ADDRESS, LOOPBACK_ADDRESS)) binding.etProxyPort.setText(sharedPreferences?.getString(PROXY_PORT, DEFAULT_PROXY_PORT)) @@ -137,6 +131,27 @@ class ProxyFragment : Fragment(), View.OnClickListener, TextWatcher { addTextChangedListener(this@ProxyFragment) } + val dnsCryptProxified = + sharedPreferences?.getBoolean(DNSCRYPT_OUTBOUND_PROXY, false) ?: false + val torProxified = sharedPreferences?.getBoolean(TOR_OUTBOUND_PROXY, false) ?: false + val itpdProxified = sharedPreferences?.getBoolean(I2PD_OUTBOUND_PROXY, false) ?: false + + val passAndNameIsEmpty = binding.etProxyPass.text.toString().trim().isEmpty() + && binding.etProxyUserName.text.toString().trim().isEmpty() + (binding.chbProxyDNSCrypt as CompoundButton).apply { + isEnabled = passAndNameIsEmpty + isChecked = + getBoolFromSharedPreferences(PROXIFY_DNSCRYPT) && dnsCryptProxified && passAndNameIsEmpty + } + (binding.chbProxyTor as CompoundButton).apply { + isChecked = getBoolFromSharedPreferences(PROXIFY_TOR) && torProxified + } + (binding.chbProxyITPD as CompoundButton).apply { + isEnabled = passAndNameIsEmpty + isChecked = + getBoolFromSharedPreferences(PROXIFY_I2PD) && itpdProxified && passAndNameIsEmpty + } + etBackground = binding.etProxyServer.background return binding.root @@ -192,10 +207,12 @@ class ProxyFragment : Fragment(), View.OnClickListener, TextWatcher { val proxyPass = binding.etProxyPass.text.toString().trim() if (getTextFromSharedPreferences(PROXY_USER) != proxyUserName) { saveToSharedPreferences(PROXY_USER, proxyUserName) + serverOrPortChanged = true settingsChanged = true } if (getTextFromSharedPreferences(PROXY_PASS) != proxyPass) { saveToSharedPreferences(PROXY_PASS, proxyPass) + serverOrPortChanged = true settingsChanged = true } @@ -283,6 +300,8 @@ class ProxyFragment : Fragment(), View.OnClickListener, TextWatcher { val server = binding.etProxyServer.text?.toString()?.trim() ?: "" val port = binding.etProxyPort.text?.toString()?.trim() ?: "" + val user = binding.etProxyUserName.text?.toString()?.trim() ?: "" + val pass = binding.etProxyPass.text?.toString()?.trim() ?: "" if (server.isEmpty() || !server.matches(IP_REGEX)) { binding.etProxyServer.background = @@ -305,7 +324,7 @@ class ProxyFragment : Fragment(), View.OnClickListener, TextWatcher { return } - if (port.isEmpty() || !port.matches(PORT_REGEX)) { + if (port.isEmpty() || !port.matches(PORT_REGEX) || port.toLong() > MAX_PORT_NUMBER) { binding.etProxyPort.background = ContextCompat.getDrawable(context, R.drawable.error_hint_selector) return @@ -313,7 +332,7 @@ class ProxyFragment : Fragment(), View.OnClickListener, TextWatcher { task = executor.submit("ProxyFragment checkProxy") { try { - val result = proxyHelper.checkProxyConnectivity(server, port.toInt()) + val result = proxyHelper.checkProxyConnectivity(server, port.toInt(), user, pass) if (_binding != null) { if (result.matches(Regex("\\d+"))) { @@ -391,8 +410,13 @@ class ProxyFragment : Fragment(), View.OnClickListener, TextWatcher { val passAndNameIsEmpty = binding.etProxyPass.text.toString().trim().isEmpty() && binding.etProxyUserName.text.toString().trim().isEmpty() - (binding.chbProxyDNSCrypt as CompoundButton).isEnabled = passAndNameIsEmpty - (binding.chbProxyTor as CompoundButton).isEnabled = passAndNameIsEmpty - (binding.chbProxyITPD as CompoundButton).isEnabled = passAndNameIsEmpty + (binding.chbProxyDNSCrypt as CompoundButton).apply { + isEnabled = passAndNameIsEmpty + isChecked = isChecked && passAndNameIsEmpty + } + (binding.chbProxyITPD as CompoundButton).apply { + isEnabled = passAndNameIsEmpty + isChecked = isChecked && passAndNameIsEmpty + } } } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/proxy/ProxyHelper.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/proxy/ProxyHelper.kt index 02f077ac..ebf6c4ec 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/proxy/ProxyHelper.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/proxy/ProxyHelper.kt @@ -29,6 +29,7 @@ import pan.alexander.tordnscrypt.utils.Constants.DEFAULT_PROXY_PORT import pan.alexander.tordnscrypt.utils.Constants.IPv4_REGEX import pan.alexander.tordnscrypt.utils.Constants.LOOPBACK_ADDRESS import pan.alexander.tordnscrypt.utils.Constants.QUAD_DNS_41 +import pan.alexander.tordnscrypt.utils.connectionchecker.ProxyAuthManager.setDefaultAuth import pan.alexander.tordnscrypt.utils.enums.ModuleState import pan.alexander.tordnscrypt.utils.executors.CoroutineExecutor import pan.alexander.tordnscrypt.utils.filemanager.FileManager @@ -38,11 +39,18 @@ import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.I2PD_OUTBOUND_ import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXIFY_DNSCRYPT import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXIFY_I2PD import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXIFY_TOR +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_PASS +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_USER import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_OUTBOUND_PROXY -import java.net.* +import java.net.InetAddress +import java.net.InetSocketAddress +import java.net.Proxy +import java.net.Socket +import java.net.SocketAddress import javax.inject.Inject import javax.inject.Named + private const val CHECK_CONNECTION_TIMEOUT_MSEC = 500 class ProxyHelper @Inject constructor( @@ -136,7 +144,12 @@ class ProxyHelper @Inject constructor( } } - fun checkProxyConnectivity(proxyHost: String, proxyPort: Int): String { + fun checkProxyConnectivity( + proxyHost: String, + proxyPort: Int, + proxyUser: String, + proxyPass: String + ): String { val start = System.currentTimeMillis() try { @@ -150,6 +163,7 @@ class ProxyHelper @Inject constructor( val proxy = Proxy(Proxy.Type.SOCKS, InetSocketAddress(proxyHost, proxyPort)) Socket(proxy).use { + setDefaultAuth(proxyUser, proxyPass) it.connect(sockaddr, CHECK_CONNECTION_TIMEOUT_MSEC) it.soTimeout = 1 @@ -192,21 +206,43 @@ class ProxyHelper @Inject constructor( return } + val proxyUser = defaultPreferences.getString(PROXY_USER, "") ?: "" + val proxyPass = defaultPreferences.getString(PROXY_PASS, "") ?: "" + val auth = proxyUser.isNotEmpty() || proxyPass.isNotEmpty() + var clientOnlyLinePosition = -1 var socksProxyLineExist = false + var socksProxyLinePosition = -1 + var socksProxyUserNameLineExist = false + var socksProxyPasswordLineExist = false val torConf = FileManager.readTextFileSynchronous(context, torConfPath) val torConfToSave = mutableListOf() for (i in torConf.indices) { var line = torConf[i] - if (line.contains("Socks5Proxy")) { + if (line.contains("Socks5Proxy ")) { line = when { socksProxyLineExist -> "" enable -> "Socks5Proxy $address" else -> "#Socks5Proxy $address" } socksProxyLineExist = true - } else if (line.contains("ClientOnly")) { + socksProxyLinePosition = i + } else if (line.contains("ClientOnly ")) { clientOnlyLinePosition = i + } else if (line.contains("Socks5ProxyUsername ")) { + line = when { + socksProxyUserNameLineExist -> "" + enable && auth -> "Socks5ProxyUsername $proxyUser" + else -> "#Socks5ProxyUsername $proxyUser" + } + socksProxyUserNameLineExist = true + } else if (line.contains("Socks5ProxyPassword ")) { + line = when { + socksProxyPasswordLineExist -> "" + enable && auth -> "Socks5ProxyPassword $proxyPass" + else -> "#Socks5ProxyPassword $proxyPass" + } + socksProxyPasswordLineExist = true } if (line.isNotEmpty()) { @@ -215,6 +251,13 @@ class ProxyHelper @Inject constructor( } if (enable && !socksProxyLineExist && clientOnlyLinePosition >= 0) { torConfToSave.add(clientOnlyLinePosition, "Socks5Proxy $address") + socksProxyLinePosition = clientOnlyLinePosition + } + if (enable && auth && !socksProxyUserNameLineExist && socksProxyLinePosition >= 0) { + torConfToSave.add(socksProxyLinePosition + 1, "Socks5ProxyUsername $proxyUser") + } + if (enable && auth && !socksProxyPasswordLineExist && socksProxyLinePosition >= 0) { + torConfToSave.add(socksProxyLinePosition + 2, "Socks5ProxyPassword $proxyPass") } FileManager.writeTextFileSynchronous(context, torConfPath, torConfToSave) } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/ConfigEditorFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/ConfigEditorFragment.java index 099cc4e0..5e82b483 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/ConfigEditorFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/ConfigEditorFragment.java @@ -45,6 +45,7 @@ import pan.alexander.tordnscrypt.utils.filemanager.OnTextFileOperationsCompleteListener; import static pan.alexander.tordnscrypt.utils.enums.FileOperationsVariants.readTextFile; +import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import javax.inject.Inject; @@ -101,7 +102,13 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_config_editor, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_config_editor, container, false); + } catch (Exception e) { + loge("ConfigEditorFragment onCreateView", e); + throw e; + } etConfigEditor = view.findViewById(R.id.etConfigEditor); etConfigEditor.setBackgroundColor(Color.TRANSPARENT); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/PreferencesFastFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/PreferencesFastFragment.java index ae3a03bf..3879e249 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/PreferencesFastFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/PreferencesFastFragment.java @@ -63,14 +63,13 @@ import pan.alexander.tordnscrypt.modules.ModulesStatus; import pan.alexander.tordnscrypt.nflog.NflogManager; import pan.alexander.tordnscrypt.utils.ThemeUtils; +import pan.alexander.tordnscrypt.utils.workers.UpdateIPsManager; import pan.alexander.tordnscrypt.views.SwitchPlusClickPreference; import static pan.alexander.tordnscrypt.assistance.AccelerateDevelop.accelerated; import static pan.alexander.tordnscrypt.di.SharedPreferencesModule.DEFAULT_PREFERENCES_NAME; import static pan.alexander.tordnscrypt.dialogs.FakeSniInputDialogFragmentKt.FAKE_SNI_ARG; import static pan.alexander.tordnscrypt.utils.Utils.verifyHostsSet; -import static pan.alexander.tordnscrypt.utils.jobscheduler.JobSchedulerManager.startRefreshTorUnlockIPs; -import static pan.alexander.tordnscrypt.utils.jobscheduler.JobSchedulerManager.stopRefreshTorUnlockIPs; import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.ALL_THROUGH_TOR; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.AUTO_START_DELAY; @@ -111,6 +110,8 @@ public class PreferencesFastFragment extends PreferenceFragmentCompat public Lazy pathVars; @Inject public Lazy fakeSniInputDialogFragment; + @Inject + public Lazy updateIPsManager; private final ModulesStatus modulesStatus = ModulesStatus.getInstance(); @@ -371,9 +372,9 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu switch (preference.getKey()) { case "swAutostartTor": if (Boolean.parseBoolean(newValue.toString())) { - startRefreshTorUnlockIPs(context); + updateIPsManager.get().startRefreshTorUnlockIPs(); } else if (!ModulesAux.isTorSavedStateRunning()) { - stopRefreshTorUnlockIPs(context); + updateIPsManager.get().stopRefreshTorUnlockIPs(); } return true; case ALL_THROUGH_TOR: diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/PreferencesITPDFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/PreferencesITPDFragment.java index c2705d99..aec14928 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/PreferencesITPDFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/PreferencesITPDFragment.java @@ -47,6 +47,7 @@ import pan.alexander.tordnscrypt.modules.ModulesRestarter; import static pan.alexander.tordnscrypt.di.SharedPreferencesModule.DEFAULT_PREFERENCES_NAME; +import static pan.alexander.tordnscrypt.utils.Constants.MAX_PORT_NUMBER; import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import static pan.alexander.tordnscrypt.utils.enums.ModuleState.STOPPED; import static pan.alexander.tordnscrypt.utils.enums.OperationMode.ROOT_MODE; @@ -298,7 +299,7 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu || Objects.equals(preference.getKey(), "SAM interface port")) { boolean useModulesWithRoot = ModulesStatus.getInstance().getMode() == ROOT_MODE && ModulesStatus.getInstance().isUseModulesWithRoot(); - if (!newValue.toString().matches("\\d+") + if (!newValue.toString().matches("\\d+") || Long.parseLong(newValue.toString()) > MAX_PORT_NUMBER || (!useModulesWithRoot && Integer.parseInt(newValue.toString()) < 1024)) { return false; } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/SettingsActivity.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/SettingsActivity.java index e50e609b..f31e3be9 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/SettingsActivity.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/SettingsActivity.java @@ -322,7 +322,13 @@ public boolean onCreateOptionsMenu(Menu menu) { if (Objects.equals(action, "tor_apps_unlock") || Objects.equals(action, "proxy_apps_exclude")) { - getMenuInflater().inflate(R.menu.settings_menu, menu); + try { + getMenuInflater().inflate(R.menu.settings_menu, menu); + } catch (Exception e) { + loge("SettingsActivity onCreateOptionsMenu", e); + throw e; + } + showMenu = true; return true; } else { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/ShowLogFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/ShowLogFragment.java index db2b6c75..6ca10028 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/ShowLogFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/ShowLogFragment.java @@ -22,6 +22,8 @@ import android.app.Activity; import android.os.Bundle; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.material.floatingactionbutton.FloatingActionButton; import androidx.fragment.app.Fragment; @@ -70,9 +72,14 @@ public void onCreate(@Nullable Bundle savedInstanceState) { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_show_log, container, false); + try { + return inflater.inflate(R.layout.fragment_show_log, container, false); + } catch (Exception e) { + loge("ShowLogFragment onCreateView", e); + throw e; + } } @Override diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_relays/DnsRelaysAdapter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_relays/DnsRelaysAdapter.java index 678793de..61218610 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_relays/DnsRelaysAdapter.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_relays/DnsRelaysAdapter.java @@ -21,6 +21,8 @@ import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; +import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; + import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -71,7 +73,13 @@ public long getItemId(int position) { @NonNull @Override public DNSRelaysViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_dns_relay, parent, false); + View view; + try { + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_dns_relay, parent, false); + } catch (Exception e) { + loge("DnsRelaysAdapter DNSRelaysViewHolder", e); + throw e; + } return new DNSRelaysViewHolder(view); } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_relays/PreferencesDNSCryptRelays.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_relays/PreferencesDNSCryptRelays.java index 8b8a5b9a..527691d2 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_relays/PreferencesDNSCryptRelays.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_relays/PreferencesDNSCryptRelays.java @@ -19,6 +19,8 @@ package pan.alexander.tordnscrypt.settings.dnscrypt_relays; +import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; + import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; @@ -88,7 +90,13 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, activity.setTitle(R.string.pref_dnscrypt_relays_title); - View view = inflater.inflate(R.layout.fragment_preferences_dnscrypt_relays, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_preferences_dnscrypt_relays, container, false); + } catch (Exception e) { + loge("PreferencesDNSCryptRelays onCreateView", e); + throw e; + } pbDnsCryptRelays = view.findViewById(R.id.pbDnsCryptRelays); RecyclerView rvDNSRelay = view.findViewById(R.id.rvDNSRelays); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_servers/DnsServersAdapter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_servers/DnsServersAdapter.java index df69eecc..a4a4f1b6 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_servers/DnsServersAdapter.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_servers/DnsServersAdapter.java @@ -21,6 +21,8 @@ import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; +import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; + import android.content.Context; import android.content.res.Configuration; import android.text.Html; @@ -126,7 +128,13 @@ class DnsServersAdapter extends RecyclerView.Adapter BufferedReader(InputStreamReader(inputStream)).use { reader -> var line: String? = reader.readLine().trim() + var index = 0 while (line != null) { if (currentThread().isInterrupted) { @@ -426,7 +427,12 @@ class ImportRules( } if (line.isNotEmpty() && !line.contains("#") && !line.contains("!")) { - return line.matches(regExp) + index++ + if (line.matches(regExp)) { + return true + } else if (index > 100) { + return false + } } line = reader.readLine().trim() diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_settings/PreferencesDNSFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_settings/PreferencesDNSFragment.java index bbce0904..593fb986 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_settings/PreferencesDNSFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/dnscrypt_settings/PreferencesDNSFragment.java @@ -73,6 +73,7 @@ import static pan.alexander.tordnscrypt.utils.Constants.IPv6_REGEX; import static pan.alexander.tordnscrypt.utils.Constants.IPv6_REGEX_WITH_MASK; import static pan.alexander.tordnscrypt.utils.Constants.LOOPBACK_ADDRESS; +import static pan.alexander.tordnscrypt.utils.Constants.MAX_PORT_NUMBER; import static pan.alexander.tordnscrypt.utils.Constants.META_ADDRESS; import static pan.alexander.tordnscrypt.utils.Constants.QUAD_DNS_41; import static pan.alexander.tordnscrypt.utils.Constants.QUAD_DNS_61; @@ -333,7 +334,7 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu if (Objects.equals(preference.getKey(), DNSCRYPT_LISTEN_PORT)) { boolean useModulesWithRoot = ModulesStatus.getInstance().getMode() == ROOT_MODE && ModulesStatus.getInstance().isUseModulesWithRoot(); - if (!newValue.toString().matches("\\d+") + if (!newValue.toString().matches("\\d+") || Long.parseLong(newValue.toString()) > MAX_PORT_NUMBER || (!useModulesWithRoot && Integer.parseInt(newValue.toString()) < 1024)) { return false; } @@ -382,7 +383,7 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu } else if (Objects.equals(preference.getKey(), "proxy_port")) { boolean useModulesWithRoot = ModulesStatus.getInstance().getMode() == ROOT_MODE && ModulesStatus.getInstance().isUseModulesWithRoot(); - if (!newValue.toString().matches("\\d+") + if (!newValue.toString().matches("\\d+") || Long.parseLong(newValue.toString()) > MAX_PORT_NUMBER || (!useModulesWithRoot && Integer.parseInt(newValue.toString()) < 1024)) { return false; } @@ -968,21 +969,29 @@ private void cleanModuleFolder(Context context) { executor.submit("PreferencesDNSFragment cleanModuleFolder", () -> { - boolean successfully1 = !FileManager.deleteFileSynchronous(context, appDataDir + boolean success = !FileManager.deleteFileSynchronous(context, appDataDir + "/app_data/dnscrypt-proxy", "public-resolvers.md"); - boolean successfully2 = !FileManager.deleteFileSynchronous(context, appDataDir + success = success && !FileManager.deleteFileSynchronous(context, appDataDir + "/app_data/dnscrypt-proxy", "public-resolvers.md.minisig"); - boolean successfully3 = !FileManager.deleteFileSynchronous(context, appDataDir + success = success && !FileManager.deleteFileSynchronous(context, appDataDir + "/app_data/dnscrypt-proxy", "relays.md"); - boolean successfully4 = !FileManager.deleteFileSynchronous(context, appDataDir + success = success && !FileManager.deleteFileSynchronous(context, appDataDir + "/app_data/dnscrypt-proxy", "relays.md.minisig"); + success = success && !FileManager.deleteFileSynchronous(context, appDataDir + + "/app_data/dnscrypt-proxy", "odoh-servers.md"); + success = success && !FileManager.deleteFileSynchronous(context, appDataDir + + "/app_data/dnscrypt-proxy", "odoh-servers.md.minisig"); + success = success && !FileManager.deleteFileSynchronous(context, appDataDir + + "/app_data/dnscrypt-proxy", "odoh-relays.md"); + success = success && !FileManager.deleteFileSynchronous(context, appDataDir + + "/app_data/dnscrypt-proxy", "odoh-relays.md.minisig"); Activity activity = getActivity(); if (activity == null) { return null; } - if (successfully1 || successfully2 || successfully3 || successfully4) { + if (success) { activity.runOnUiThread(() -> Toast.makeText(activity, R.string.done, Toast.LENGTH_SHORT).show()); } else { activity.runOnUiThread(() -> Toast.makeText(activity, R.string.wrong, Toast.LENGTH_SHORT).show()); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/FirewallFragment.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/FirewallFragment.kt index 29a8be5f..08bf1b3c 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/FirewallFragment.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/FirewallFragment.kt @@ -123,7 +123,12 @@ class FirewallFragment : Fragment(), savedInstanceState: Bundle? ): View { - _binding = FragmentFirewallBinding.inflate(inflater, container, false) + _binding = try { + FragmentFirewallBinding.inflate(inflater, container, false) + } catch (e: Exception) { + loge("FirewallFragment onCreateView", e) + throw e + } firewallAdapter = FirewallAdapter( requireContext(), @@ -273,7 +278,12 @@ class FirewallFragment : Fragment(), } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - return inflater.inflate(R.menu.firewall_menu, menu) + try { + return inflater.inflate(R.menu.firewall_menu, menu) + } catch (e: Exception) { + loge("FirewallFragment onCreateOptionsMenu", e) + throw e + } } override fun onPrepareOptionsMenu(menu: Menu) { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/FirewallUtils.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/FirewallUtils.kt index 75f0ac43..7ee002ac 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/FirewallUtils.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/FirewallUtils.kt @@ -21,7 +21,11 @@ package pan.alexander.tordnscrypt.settings.firewall fun Set.toIntSet(): Set { val intSet = mutableSetOf() - forEach { intSet.add(it.toInt()) } + forEach { + if (it.toLong() <= Int.MAX_VALUE) { + intSet.add(it.toInt()) + } + } return intSet } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/adapter/FirewallAdapter.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/adapter/FirewallAdapter.kt index 5010338c..e2788621 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/adapter/FirewallAdapter.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/firewall/adapter/FirewallAdapter.kt @@ -127,8 +127,12 @@ class FirewallAdapter( } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FirewallViewHolder { - val itemView = + val itemView = try { LayoutInflater.from(parent.context).inflate(R.layout.item_firewall, parent, false) + } catch (e: Exception) { + loge("FirewallAdapter onCreateViewHolder", e) + throw e + } val modulesStatus = ModulesStatus.getInstance() if (modulesStatus.mode == OperationMode.VPN_MODE) { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/show_rules/ShowRulesRecycleFrag.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/show_rules/ShowRulesRecycleFrag.java index a3432b2a..03900a83 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/show_rules/ShowRulesRecycleFrag.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/show_rules/ShowRulesRecycleFrag.java @@ -95,10 +95,16 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_show_rules_recycle, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_show_rules_recycle, container, false); + } catch (Exception e) { + loge("ShowRulesRecycleFrag onCreateView", e); + throw e; + } RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(container.getContext()); mRecyclerView = view.findViewById(R.id.rvRules); @@ -267,7 +273,7 @@ public void onClick(View v) { mRecyclerView.scrollToPosition(rules_list.size() - 1); } - public class RulesAdapter extends RecyclerView.Adapter { + class RulesAdapter extends RecyclerView.Adapter { ArrayList list_rules_adapter; LayoutInflater lInflater = (LayoutInflater) requireActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); @@ -280,7 +286,13 @@ public class RulesAdapter extends RecyclerView.Adapter snowflakeConfigurator; @Inject public ViewModelProvider.Factory viewModelFactory; - @Inject - public Lazy selectBridgesTransportDialogFragment; - @Inject - public Lazy pleaseWaitDialogBridgesRequest; - @Inject - public Lazy bridgesCaptchaDialogFragment; - @Inject - public Lazy bridgesReadyDialogFragment; public PreferencesTorBridges() { } @@ -233,7 +227,13 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, activity.setTitle(R.string.pref_fast_use_tor_bridges); - View view = inflater.inflate(R.layout.fragment_preferences_tor_bridges, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_preferences_tor_bridges, container, false); + } catch (Exception e) { + loge("PreferencesTorBridges onCreateView", e); + throw e; + } rbNoBridges = view.findViewById(R.id.rbNoBridges); @@ -594,7 +594,8 @@ private void showPleaseWaitDialog() { PleaseWaitDialogBridgesRequest dialog = (PleaseWaitDialogBridgesRequest) getChildFragmentManager().findFragmentByTag(tag); if (dialog == null || !dialog.isAdded()) { - pleaseWaitDialogBridgesRequest.get().show(getChildFragmentManager(), tag); + dialog = new PleaseWaitDialogBridgesRequest(); + dialog.show(getChildFragmentManager(), tag); } } @@ -603,7 +604,8 @@ private void showSelectBridgesTransportDialog() { SelectBridgesTransportDialogFragment dialog = (SelectBridgesTransportDialogFragment) getChildFragmentManager().findFragmentByTag(tag); if (dialog == null || !dialog.isAdded()) { - selectBridgesTransportDialogFragment.get().show(getChildFragmentManager(), tag); + dialog = new SelectBridgesTransportDialogFragment(); + dialog.show(getChildFragmentManager(), tag); } } @@ -612,7 +614,7 @@ private void showCaptchaDialog(String transport, boolean ipv6, Bitmap captcha, S BridgesCaptchaDialogFragment dialog = (BridgesCaptchaDialogFragment) getChildFragmentManager().findFragmentByTag(tag); if (dialog == null || !dialog.isAdded()) { - dialog = bridgesCaptchaDialogFragment.get(); + dialog = new BridgesCaptchaDialogFragment(); dialog.setTransport(transport); dialog.setIpv6(ipv6); dialog.setCaptcha(captcha); @@ -626,7 +628,7 @@ private void showBridgesReadyDialog(String bridges) { BridgesReadyDialogFragment dialog = (BridgesReadyDialogFragment) getChildFragmentManager().findFragmentByTag(tag); if (dialog == null || !dialog.isAdded()) { - dialog = bridgesReadyDialogFragment.get(); + dialog = new BridgesReadyDialogFragment(); dialog.setBridges(bridges); dialog.show(getChildFragmentManager(), tag); } @@ -728,7 +730,13 @@ private void addBridges(final List persistList) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); - @SuppressLint("InflateParams") final View inputView = inflater.inflate(R.layout.edit_text_for_dialog, null, false); + View inputView; + try { + inputView = inflater.inflate(R.layout.edit_text_for_dialog, null, false); + } catch (Exception e) { + loge("PreferencesTorBridges addBridges", e); + throw e; + } final EditText input = inputView.findViewById(R.id.etForDialog); input.setSingleLine(false); builder.setView(inputView); @@ -1202,12 +1210,16 @@ private Job verifyNewDefaultBridgesExist(Context context, boolean useDefaultBrid try (ZipInputStream zipInputStream = new ZipInputStream(context.getAssets().open("tor.mp3"))) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + ZipPathValidator.clearCallback(); + } + ZipEntry zipEntry = zipInputStream.getNextEntry(); while (zipEntry != null) { String fileName = zipEntry.getName(); - if (fileName.contains("bridges_default.lst") && zipEntry.getSize() != installedBridgesSize) { + if (fileName.endsWith("bridges_default.lst") && zipEntry.getSize() != installedBridgesSize) { if (isAdded() && handlerLazy != null) { handlerLazy.get().post(() -> { AlertDialog dialog = UpdateDefaultBridgesDialog.DIALOG.getDialog(getActivity(), useDefaultBridges); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_countries/CountrySelectFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_countries/CountrySelectFragment.java index 64c0c4b7..f9ff046c 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_countries/CountrySelectFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_countries/CountrySelectFragment.java @@ -19,6 +19,9 @@ package pan.alexander.tordnscrypt.settings.tor_countries; +import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; + +import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; @@ -82,17 +85,21 @@ public void onCreate(@Nullable Bundle savedInstanceState) { countries = getArguments().getString("countries"); } - if (getActivity() != null && getActivity() instanceof SettingsActivity) { - SettingsActivity settingsActivity = (SettingsActivity) getActivity(); + Activity activity = getActivity(); + if (activity instanceof SettingsActivity settingsActivity) { preferencesTorFragment = settingsActivity.preferencesTorFragment; } } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_country_select, container, false); + try { + return inflater.inflate(R.layout.fragment_country_select, container, false); + } catch (Exception e) { + loge("CountrySelectFragment onCreateView", e); + throw e; + } } @Override @@ -218,7 +225,13 @@ private class CountriesAdapter extends RecyclerView.Adapter { +class DomainIpAdapter extends RecyclerView.Adapter { private final AsyncListDiffer diff = new AsyncListDiffer<>( this, new DomainIpDiffUtilItemCallback() ); @@ -63,7 +65,13 @@ public void updateDomainIps(Set newDomainIpsSet) { @NonNull @Override public DomainIpViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = unlockTorIpsFragment.getLayoutInflater().inflate(R.layout.item_tor_ips, parent, false); + View view; + try { + view = unlockTorIpsFragment.getLayoutInflater().inflate(R.layout.item_tor_ips, parent, false); + } catch (Exception e) { + loge("DomainIpAdapter onCreateViewHolder", e); + throw e; + } return new DomainIpViewHolder(view); } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_ips/UnlockTorIpsFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_ips/UnlockTorIpsFragment.java index 0c01b042..a87a8b92 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_ips/UnlockTorIpsFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_ips/UnlockTorIpsFragment.java @@ -179,7 +179,13 @@ private void setTitle( public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_preferences_tor_ips, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_preferences_tor_ips, container, false); + } catch (Exception e) { + loge("UnlockTorIpsFragment onCreateView", e); + throw e; + } initViews(view); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_preferences/PreferencesTorFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_preferences/PreferencesTorFragment.java index ba5d0ec7..b53b692c 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_preferences/PreferencesTorFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/settings/tor_preferences/PreferencesTorFragment.java @@ -62,8 +62,10 @@ import static pan.alexander.tordnscrypt.utils.Constants.IPv6_REGEX_NO_BOUNDS; import static pan.alexander.tordnscrypt.utils.Constants.LOOPBACK_ADDRESS; import static pan.alexander.tordnscrypt.utils.Constants.LOOPBACK_ADDRESS_IPv6; +import static pan.alexander.tordnscrypt.utils.Constants.MAX_PORT_NUMBER; import static pan.alexander.tordnscrypt.utils.Constants.META_ADDRESS; import static pan.alexander.tordnscrypt.utils.Constants.TOR_VIRTUAL_ADDR_NETWORK_IPV6; +import static pan.alexander.tordnscrypt.utils.enums.OperationMode.VPN_MODE; import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.DORMANT_CLIENT_TIMEOUT; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.SNOWFLAKE_RENDEZVOUS; @@ -73,6 +75,7 @@ import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_FASCIST_FIREWALL; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_FASCIST_FIREWALL_LOCK; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_HTTP_TUNNEL_PORT; +import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_ISOLATE_UID; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_OUTBOUND_PROXY; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_OUTBOUND_PROXY_ADDRESS; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_SOCKS_PORT; @@ -138,6 +141,16 @@ public void onCreate(Bundle savedInstanceState) { ArrayList preferences = new ArrayList<>(); + if (ModulesStatus.getInstance().getMode() == VPN_MODE) { + preferences.add(findPreference(TOR_ISOLATE_UID)); + } else { + PreferenceCategory isolationCategory = findPreference("tor_isolation_settings"); + Preference isolateUid = findPreference(TOR_ISOLATE_UID); + if (isolationCategory != null && isolateUid != null) { + isolationCategory.removePreference(isolateUid); + } + } + preferences.add(findPreference("VirtualAddrNetwork")); preferences.add(findPreference("HardwareAccel")); preferences.add(findPreference("AvoidDiskWrites")); @@ -331,6 +344,21 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu return false; } + try { + return tryPreferenceChange(context, preference, newValue); + } catch (Exception e) { + loge("PreferencesTorFragment onPreferenceChange", e); + Toast.makeText(context, R.string.wrong, Toast.LENGTH_LONG).show(); + } + + return false; + } + + private boolean tryPreferenceChange( + @NonNull Context context, + @NonNull Preference preference, + Object newValue + ) { SharedPreferences sharedPreferences = defaultPreferences.get(); boolean isolateDestAddress = sharedPreferences.getBoolean("pref_tor_isolate_dest_address", false); boolean isolateDestPort = sharedPreferences.getBoolean("pref_tor_isolate_dest_port", false); @@ -441,7 +469,7 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu boolean useModulesWithRoot = ModulesStatus.getInstance().getMode() == ROOT_MODE && ModulesStatus.getInstance().isUseModulesWithRoot(); - if (!dnsPort.matches("\\d+") + if (!dnsPort.matches("\\d+") || Long.parseLong(newValue.toString()) > MAX_PORT_NUMBER || (!useModulesWithRoot && Integer.parseInt(newValue.toString()) < 1024)) { return false; } @@ -513,7 +541,7 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu boolean useModulesWithRoot = ModulesStatus.getInstance().getMode() == ROOT_MODE && ModulesStatus.getInstance().isUseModulesWithRoot(); - if (!proxyPort.matches("\\d+") + if (!proxyPort.matches("\\d+") || Long.parseLong(newValue.toString()) > MAX_PORT_NUMBER || (!useModulesWithRoot && Integer.parseInt(proxyPort) < 1024)) { return false; } @@ -545,6 +573,9 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu } } + return true; + } else if (Objects.equals(preference.getKey(), TOR_ISOLATE_UID)) { + isChanged = true; return true; } else if (Objects.equals(preference.getKey(), "pref_tor_isolate_dest_address")) { @@ -662,7 +693,8 @@ public boolean onPreferenceChange(@NonNull Preference preference, Object newValu && !newValue.toString().matches("\\d+")) { return false; } else if ((Objects.equals(preference.getKey(), DORMANT_CLIENT_TIMEOUT))) { - if (newValue.toString().matches("\\d+")) { + if (newValue.toString().matches("\\d+") + && Long.parseLong(newValue.toString()) <= Integer.MAX_VALUE) { int value = Integer.parseInt(newValue.toString()); if (value < 10) { return false; diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tiles/ModulesControlTileManager.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tiles/ModulesControlTileManager.kt index 4eb91f46..18276ebd 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tiles/ModulesControlTileManager.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tiles/ModulesControlTileManager.kt @@ -40,17 +40,16 @@ import pan.alexander.tordnscrypt.domain.preferences.PreferenceRepository import pan.alexander.tordnscrypt.modules.* import pan.alexander.tordnscrypt.modules.ModulesService.* import pan.alexander.tordnscrypt.settings.PathVars -import pan.alexander.tordnscrypt.utils.Constants.DEFAULT_SITES_IPS_REFRESH_INTERVAL import pan.alexander.tordnscrypt.utils.Utils import pan.alexander.tordnscrypt.utils.Utils.isInterfaceLocked import pan.alexander.tordnscrypt.utils.enums.ModuleState import pan.alexander.tordnscrypt.utils.enums.OperationMode import pan.alexander.tordnscrypt.utils.filemanager.FileShortener -import pan.alexander.tordnscrypt.utils.jobscheduler.JobSchedulerManager.stopRefreshTorUnlockIPs import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.* import pan.alexander.tordnscrypt.utils.root.RootCommands import pan.alexander.tordnscrypt.utils.root.RootCommandsMark.* import pan.alexander.tordnscrypt.utils.root.RootExecService.* +import pan.alexander.tordnscrypt.utils.workers.UpdateIPsManager import pan.alexander.tordnscrypt.vpn.service.ServiceVPNHelper import javax.inject.Inject import javax.inject.Named @@ -67,7 +66,8 @@ class ModulesControlTileManager @Inject constructor( @Named(SharedPreferencesModule.DEFAULT_PREFERENCES_NAME) private val defaultPreferences: SharedPreferences, private val handler: Handler, - private val pathVars: PathVars + private val pathVars: PathVars, + private val updateIPsManager: dagger.Lazy ) { private val modulesStatus = ModulesStatus.getInstance() @@ -319,7 +319,7 @@ class ModulesControlTileManager @Inject constructor( runTor() } else if (modulesStatus.torState == ModuleState.RUNNING) { - stopRefreshTorUnlockIPsIfRequired() + stopRefreshTorUnlockIPs() stopTor() } } @@ -332,16 +332,8 @@ class ModulesControlTileManager @Inject constructor( ModulesAux.saveTorStateRunning(true) } - private fun stopRefreshTorUnlockIPsIfRequired() { - val refreshPeriod = defaultPreferences.getString( - SITES_IPS_REFRESH_INTERVAL, DEFAULT_SITES_IPS_REFRESH_INTERVAL.toString() - )?.toInt() ?: DEFAULT_SITES_IPS_REFRESH_INTERVAL - - if (refreshPeriod == 0) { - return - } - - stopRefreshTorUnlockIPs(context) + private fun stopRefreshTorUnlockIPs() { + updateIPsManager.get().stopRefreshTorUnlockIPs() } private fun stopTor() { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java index a78848df..d7a9503f 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorFragmentPresenter.java @@ -53,10 +53,10 @@ import pan.alexander.tordnscrypt.utils.executors.CoroutineExecutor; import pan.alexander.tordnscrypt.utils.integrity.Verifier; import pan.alexander.tordnscrypt.utils.enums.ModuleState; +import pan.alexander.tordnscrypt.utils.workers.UpdateIPsManager; import pan.alexander.tordnscrypt.vpn.service.ServiceVPNHelper; import static pan.alexander.tordnscrypt.TopFragment.TOP_BROADCAST; -import static pan.alexander.tordnscrypt.utils.jobscheduler.JobSchedulerManager.stopRefreshTorUnlockIPs; import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import static pan.alexander.tordnscrypt.utils.logger.Logger.logi; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.IGNORE_SYSTEM_DNS; @@ -86,6 +86,8 @@ public class TorFragmentPresenter implements TorFragmentPresenterInterface, public Lazy verifierLazy; @Inject public Lazy pathVars; + @Inject + public Lazy updateIPsManager; public TorFragmentView view; @@ -231,7 +233,7 @@ public void setTorStopped() { return; } - stopRefreshTorUnlockIPs(context); + updateIPsManager.get().stopRefreshTorUnlockIPs(); view.setTorStatus(R.string.tvTorStop, R.color.textModuleStatusColorStopped); view.setStartButtonText(R.string.btnTorStart); @@ -618,7 +620,7 @@ public void startButtonOnClick() { displayLog(); } else if (modulesStatus.getTorState() == RUNNING) { - stopRefreshTorUnlockIPs(context); + updateIPsManager.get().stopRefreshTorUnlockIPs(); setTorStopping(); stopTor(); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorRunFragment.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorRunFragment.java index 719eecb2..59e98687 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorRunFragment.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/tor_fragment/TorRunFragment.java @@ -26,6 +26,7 @@ import android.content.IntentFilter; import android.os.Bundle; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager; @@ -74,9 +75,15 @@ public TorRunFragment() { @SuppressLint({"SetTextI18n", "ClickableViewAccessibility"}) @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_tor_run, container, false); + View view; + try { + view = inflater.inflate(R.layout.fragment_tor_run, container, false); + } catch (Exception e) { + loge("TorRunFragment onCreateView", e); + throw e; + } btnTorStart = view.findViewById(R.id.btnTorStart); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/update/DownloadTask.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/update/DownloadTask.java index fd29a52b..36ac6415 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/update/DownloadTask.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/update/DownloadTask.java @@ -71,7 +71,9 @@ public class DownloadTask extends Thread { private static final int READ_TIMEOUT = 60; private static final int CONNECT_TIMEOUT = 60; - private static final int ATTEMPTS_TO_DOWNLOAD = 3; + private static final int ATTEMPTS_TO_DOWNLOAD = 5; + private static final int MAX_ATTEMPTS_TO_DOWNLOAD = 120; + private static final int TIME_TO_DOWNLOAD_MINUTES = 25; @Inject public Lazy preferenceRepository; @@ -109,7 +111,8 @@ public void run() { String fileToDownload = intent.getStringExtra("file"); String hash = intent.getStringExtra("hash"); PreferenceRepository preferences = preferenceRepository.get(); - int attempts = ATTEMPTS_TO_DOWNLOAD; + int attempts = 0; + long startTime = System.currentTimeMillis(); try { @@ -128,10 +131,14 @@ public void run() { outputFile = downloadFile(fileToDownload, urlToDownload); } catch (IOException e) { exception = e; - logw("UpdateService failed to download file " + urlToDownload, e); + logw("UpdateService failed to download file " + urlToDownload + ", attempt " + attempts, e); } - attempts--; - } while (outputFile == null && attempts > 0 && !Thread.currentThread().isInterrupted()); + attempts++; + } while (outputFile == null + && (attempts < ATTEMPTS_TO_DOWNLOAD + || System.currentTimeMillis() - startTime < TIME_TO_DOWNLOAD_MINUTES * 60000 + && attempts < MAX_ATTEMPTS_TO_DOWNLOAD) + && !Thread.currentThread().isInterrupted()); if (outputFile == null) { throw exception; @@ -211,7 +218,12 @@ private File downloadFile(String fileToDownload, String urlToDownload) throws IO con.setRequestProperty("Range", "bytes=" + range + "-"); } - long fileLength = con.getContentLength(); + long fileLength; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + fileLength = con.getContentLengthLong() + range; + } else { + fileLength = con.getContentLength() + range; + } try (InputStream input = new BufferedInputStream(con.getInputStream()); OutputStream output = new FileOutputStream(path, true)) { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/Constants.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/Constants.java index cf8b0c90..88eb8667 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/Constants.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/Constants.java @@ -27,6 +27,7 @@ public interface Constants { String LOOPBACK_ADDRESS_IPv6 = "::1"; String META_ADDRESS = "0.0.0.0"; String META_ADDRESS_IPv6 = "::"; + int MAX_PORT_NUMBER = 65535; String STANDARD_WIFI_INTERFACE_NAME = "wlan0"; String STANDARD_ETHERNET_INTERFACE_NAME = "eth0"; String STANDARD_VPN_INTERFACE_NAME = "tun0"; diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/apps/InstalledApplicationsManager.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/apps/InstalledApplicationsManager.kt index 9378b20b..7e2d47e4 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/apps/InstalledApplicationsManager.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/apps/InstalledApplicationsManager.kt @@ -77,6 +77,7 @@ class InstalledApplicationsManager private constructor( private var multiUserSupport = defaultPreferences.getBoolean(MULTI_USER_SUPPORT, true) private var savedTime = 0L + @Suppress("UNNECESSARY_SAFE_CALL", "USELESS_ELVIS") fun getInstalledApps(): List { try { @@ -87,7 +88,7 @@ class InstalledApplicationsManager private constructor( reentrantLock.lockInterruptibly() - val uids = arrayListOf() + val userUids = arrayListOf() val packageManager: PackageManager = context.packageManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && multiUserSupport) { @@ -98,15 +99,15 @@ class InstalledApplicationsManager private constructor( user?.let { val m = pattern.matcher(user.toString()) if (m.find()) { - val id = m.group(1)?.toInt() - if (id != null) { - uids.add(id) + val id = m.group(1)?.toLong() + if (id != null && id <= Int.MAX_VALUE) { + userUids.add(id.toInt()) } } } } - logi("Devise Users: ${uids.joinToString()}") + logi("Devise Users: ${userUids.joinToString()}") } var pkgManagerFlags = PackageManager.GET_META_DATA @@ -130,14 +131,14 @@ class InstalledApplicationsManager private constructor( val userAppsMap = hashMapOf() val multiUserAppsMap = hashMapOf() - var application: ApplicationData? installedApps.forEach { applicationInfo -> - application = userAppsMap[applicationInfo.uid] + var appDataSaved = userAppsMap[applicationInfo.uid] //val name = packageManager.getApplicationLabel(applicationInfo)?.toString() ?: "Undefined" val name = try { - applicationInfo.loadLabel(packageManager)?.toString() ?: applicationInfo.packageName + applicationInfo.loadLabel(packageManager)?.toString() + ?: applicationInfo.packageName } catch (e: Exception) { logw("InstalledApplications get name", e) applicationInfo.packageName @@ -154,20 +155,19 @@ class InstalledApplicationsManager private constructor( null } - if (application == null) { - val uid = applicationInfo.uid + val uid = applicationInfo.uid + val packageName = applicationInfo.packageName + + if (appDataSaved == null) { if (uid == ownUID) { return@forEach } - val system = (applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 - + val system = isAppSystem(applicationInfo) val useInternet = isAppUseInternet(packageManager, applicationInfo) - val packageName = applicationInfo.packageName - - application = ApplicationData( + appDataSaved = ApplicationData( name, packageName, uid, @@ -177,32 +177,93 @@ class InstalledApplicationsManager private constructor( activeApps.contains(uid.toString()) ) - if ((applicationInfo.flags and ApplicationInfo.FLAG_INSTALLED) != 0) { - application?.let { + if (isAppInstalled(applicationInfo)) { + appDataSaved.let { userAppsMap[uid] = it - val time = System.currentTimeMillis() - if (time - savedTime > ON_APP_ADDED_REFRESH_PERIOD_MSEC) { - onAppAddListener?.onAppAdded(it) - savedTime = time - } + updateDisplayedList(it) } } } else { - application?.addName(name) + + val system = isAppSystem(applicationInfo) || appDataSaved.system + val useInternet = isAppUseInternet(packageManager, applicationInfo) + || appDataSaved.hasInternetPermission + val pack = if (packageName.length < appDataSaved.pack.length) { + packageName + } else { + appDataSaved.pack + } + + if (system != appDataSaved.system + || useInternet != appDataSaved.hasInternetPermission + || pack != appDataSaved.pack + ) { + + val namesSaved = appDataSaved.names + val iconSaved = appDataSaved.icon + + appDataSaved = ApplicationData( + name, + pack, + uid, + icon ?: iconSaved, + system, + useInternet, + activeApps.contains(uid.toString()) + ) + + appDataSaved.addAllNames(namesSaved) + + userAppsMap[uid] = appDataSaved + } else { + appDataSaved.addName(name) + } } - if (uids.size > 1 || uids.getOrElse(0) { 0 } != 0) { - val tempMultiUserAppsMap: Map = checkPartOfMultiUser( + if (userUids.size > 1 || userUids.getOrElse(0) { 0 } != 0) { + val singleAppMultiUserAppsMap: Map = checkPartOfMultiUser( applicationInfo, name, icon, - uids, + userUids, packageManager, multiUserAppsMap ) - tempMultiUserAppsMap.forEach { (uid, applicationData) -> - if (multiUserAppsMap.containsKey(uid)) { - multiUserAppsMap[uid]?.addAllNames(applicationData.names) + singleAppMultiUserAppsMap.forEach { (uid, applicationData) -> + val applicationDataSaved = multiUserAppsMap[uid] + + if (applicationDataSaved != null) { + val system = applicationDataSaved.system || applicationData.system + val useInternet = applicationDataSaved.hasInternetPermission + || applicationData.hasInternetPermission + val pack = + if (applicationData.pack.length < applicationDataSaved.pack.length) { + applicationData.pack + } else { + applicationDataSaved.pack + } + + if (system != applicationDataSaved.system + || useInternet != applicationDataSaved.hasInternetPermission + || pack != applicationDataSaved.pack + ) { + val appData = ApplicationData( + applicationData.names.firstOrNull() ?: name, + pack, + applicationData.uid, + applicationData.icon ?: applicationDataSaved.icon, + system, + useInternet, + activeApps.contains(uid.toString()) + ) + + appData.addAllNames(applicationData.names) + appData.addAllNames(applicationDataSaved.names) + + multiUserAppsMap[uid] = appData + } else { + multiUserAppsMap[uid]?.addAllNames(applicationData.names) + } } else { multiUserAppsMap[uid] = applicationData } @@ -276,56 +337,79 @@ class InstalledApplicationsManager private constructor( return useInternet } + private fun isAppSystem(applicationInfo: ApplicationInfo) = + (applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 + + private fun isAppInstalled(applicationInfo: ApplicationInfo) = + applicationInfo.flags and ApplicationInfo.FLAG_INSTALLED != 0 + private fun checkPartOfMultiUser( applicationInfo: ApplicationInfo, name: String, - icon: Drawable?, uids: List, + icon: Drawable?, + userUids: List, packageManager: PackageManager, multiUserAppsMap: Map ): Map { - val tempMultiUserAppsMap = hashMapOf() - - uids.forEach { uid -> - if (uid != 0) { - try { - val applicationUID = "$uid${applicationInfo.uid}".toInt() + val singleAppMultiUserAppsMap = hashMapOf() - val packages = packageManager.getPackagesForUid(applicationUID) + for (userUid in userUids) { - packages?.let { - val system = (applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 - val useInternet = isAppUseInternet(packageManager, applicationInfo) - val packageName = it.joinToString() - val application = ApplicationData( - "$name(M)", - packageName, - applicationUID, - icon, - system, - useInternet, - activeApps.contains(applicationUID.toString()) - ) - - tempMultiUserAppsMap[applicationUID] = application - - val time = System.currentTimeMillis() + if (userUid == 0) { + continue + } - if (!multiUserAppsMap.containsKey(applicationUID) - && time - savedTime > ON_APP_ADDED_REFRESH_PERIOD_MSEC - ) { - onAppAddListener?.onAppAdded(application) - savedTime = time - } - } - } catch (ignored: SecurityException) { - } catch (e: Exception) { - loge("InstalledApplications checkPartOfMultiUser", e) - } + try { + tryCheckApp( + appInfo = applicationInfo, + name = name, + icon = icon, + userUid = userUid, + packageManager = packageManager, + multiUserAppsMap = multiUserAppsMap, + singleAppMultiUserAppsMap = singleAppMultiUserAppsMap + ) + } catch (ignored: SecurityException) { + } catch (e: Exception) { + loge("InstalledApplications checkPartOfMultiUser", e) } } - return tempMultiUserAppsMap + return singleAppMultiUserAppsMap + } + + private fun tryCheckApp( + appInfo: ApplicationInfo, + name: String, + icon: Drawable?, + userUid: Int, + packageManager: PackageManager, + multiUserAppsMap: Map, + singleAppMultiUserAppsMap: HashMap + ) { + val applicationUIDLong = "$userUid${appInfo.uid}".toLong() + if (applicationUIDLong > Int.MAX_VALUE) return + val applicationUID = applicationUIDLong.toInt() + + val packages = packageManager.getPackagesForUid(applicationUID) ?: return + + val system = isAppSystem(appInfo) + val useInternet = isAppUseInternet(packageManager, appInfo) + val pack = packages.minByOrNull { it.length } ?: "" + val appData = ApplicationData( + "$name(M)", + pack, + applicationUID, + icon, + system, + useInternet, + activeApps.contains(applicationUID.toString()) + ) + singleAppMultiUserAppsMap[applicationUID] = appData + if (!multiUserAppsMap.containsKey(applicationUID)) { + updateDisplayedList(appData) + } } private fun getKnownApplications(): ArrayList { @@ -500,6 +584,14 @@ class InstalledApplicationsManager private constructor( fun onAppAdded(application: ApplicationData) } + private fun updateDisplayedList(applicationData: ApplicationData) { + val time = System.currentTimeMillis() + if (time - savedTime > ON_APP_ADDED_REFRESH_PERIOD_MSEC) { + onAppAddListener?.onAppAdded(applicationData) + savedTime = time + } + } + class Builder { private var onAppAddListener: OnAppAddListener? = null diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/bootcomplete/BootCompleteManager.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/bootcomplete/BootCompleteManager.java index edf453a3..b15a4ad9 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/bootcomplete/BootCompleteManager.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/bootcomplete/BootCompleteManager.java @@ -27,7 +27,6 @@ import static pan.alexander.tordnscrypt.utils.enums.OperationMode.ROOT_MODE; import static pan.alexander.tordnscrypt.utils.enums.OperationMode.UNDEFINED; import static pan.alexander.tordnscrypt.utils.enums.OperationMode.VPN_MODE; -import static pan.alexander.tordnscrypt.utils.jobscheduler.JobSchedulerManager.stopRefreshTorUnlockIPs; import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import static pan.alexander.tordnscrypt.utils.logger.Logger.logi; import static pan.alexander.tordnscrypt.utils.logger.Logger.logw; @@ -67,6 +66,7 @@ import pan.alexander.tordnscrypt.utils.enums.OperationMode; import pan.alexander.tordnscrypt.utils.filemanager.FileShortener; import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys; +import pan.alexander.tordnscrypt.utils.workers.UpdateIPsManager; import pan.alexander.tordnscrypt.vpn.service.ServiceVPNHelper; public class BootCompleteManager { @@ -84,6 +84,7 @@ public class BootCompleteManager { private final Lazy pathVars; private final Lazy apManager; private final Lazy modulesStatusBroadcaster; + private final Lazy updateIPsManager; private Context context; private String appDataDir; @@ -95,7 +96,8 @@ public BootCompleteManager( Lazy handler, Lazy pathVars, Lazy apManager, - Lazy modulesStatusBroadcaster + Lazy modulesStatusBroadcaster, + Lazy updateIPsManager ) { this.defaultSharedPreferences = defaultSharedPreferences; this.preferenceRepository = preferenceRepository; @@ -103,6 +105,7 @@ public BootCompleteManager( this.pathVars = pathVars; this.apManager = apManager; this.modulesStatusBroadcaster = modulesStatusBroadcaster; + this.updateIPsManager = updateIPsManager; } private ModulesStatus modulesStatus = ModulesStatus.getInstance(); @@ -221,20 +224,20 @@ public void performAction(final Context context, Intent intent) { startStopRestartModules(true, true, false); } else if (autoStartDNSCrypt && !autoStartITPD) { startStopRestartModules(true, false, false); - stopRefreshTorUnlockIPs(context); + updateIPsManager.get().stopRefreshTorUnlockIPs(); } else if (!autoStartDNSCrypt && autoStartTor && !autoStartITPD) { startStopRestartModules(false, true, false); } else if (!autoStartDNSCrypt && !autoStartTor && autoStartITPD) { startStopRestartModules(false, false, true); - stopRefreshTorUnlockIPs(context); + updateIPsManager.get().stopRefreshTorUnlockIPs(); } else if (!autoStartDNSCrypt && autoStartTor) { startStopRestartModules(false, true, true); } else if (autoStartDNSCrypt) { startStopRestartModules(true, false, true); - stopRefreshTorUnlockIPs(context); + updateIPsManager.get().stopRefreshTorUnlockIPs(); } else { startStopRestartModules(false, false, false); - stopRefreshTorUnlockIPs(context); + updateIPsManager.get().stopRefreshTorUnlockIPs(); } if ((autoStartDNSCrypt || autoStartTor || autoStartITPD) && (mode == VPN_MODE || fixTTL)) { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/HttpInternetChecker.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/HttpInternetChecker.kt index 96fa6b85..eee463d5 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/HttpInternetChecker.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/HttpInternetChecker.kt @@ -20,6 +20,7 @@ package pan.alexander.tordnscrypt.utils.connectionchecker import pan.alexander.tordnscrypt.utils.Constants.TOR_BROWSER_USER_AGENT +import pan.alexander.tordnscrypt.utils.connectionchecker.ProxyAuthManager.setDefaultAuth import java.net.HttpURLConnection import java.net.InetSocketAddress import java.net.Proxy @@ -36,11 +37,17 @@ class HttpInternetChecker @Inject constructor() { private var connection: HttpURLConnection? = null - fun checkConnectionAvailability(site: String, proxyAddress: String, proxyPort: Int): Boolean { + fun checkConnectionAvailability( + site: String, + proxyAddress: String, + proxyPort: Int, + proxyUser: String, + proxyPass: String + ): Boolean { var result = false try { - result = checkConnection(site, proxyAddress, proxyPort) + result = checkConnection(site, proxyAddress, proxyPort, proxyUser, proxyPass) return result } finally { if (result) { @@ -49,7 +56,13 @@ class HttpInternetChecker @Inject constructor() { } } - private fun checkConnection(site: String, proxyAddress: String, proxyPort: Int): Boolean { + private fun checkConnection( + site: String, + proxyAddress: String, + proxyPort: Int, + proxyUser: String, + proxyPass: String + ): Boolean { val url = URL(site) connection = if (proxyAddress.isNotBlank() && proxyPort != 0) { @@ -61,6 +74,8 @@ class HttpInternetChecker @Inject constructor() { ) ) + setDefaultAuth(proxyUser, proxyPass) + url.openConnection(proxy) as HttpsURLConnection } else { url.openConnection() as HttpsURLConnection diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/ProxyAuthManager.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/ProxyAuthManager.kt new file mode 100644 index 00000000..42c251e9 --- /dev/null +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/ProxyAuthManager.kt @@ -0,0 +1,45 @@ +/* + This file is part of InviZible Pro. + + InviZible Pro is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + InviZible Pro is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with InviZible Pro. If not, see . + + Copyright 2019-2024 by Garmatin Oleksandr invizible.soft@gmail.com + */ + +package pan.alexander.tordnscrypt.utils.connectionchecker + +import pan.alexander.tordnscrypt.utils.logger.Logger.loge +import java.net.Authenticator +import java.net.PasswordAuthentication + +object ProxyAuthManager { + + fun setDefaultAuth(proxyUser: String, proxyPass: String) = + try { + if (proxyUser.isNotEmpty() || proxyPass.isNotEmpty()) { + Authenticator.setDefault(getAuth(proxyUser, proxyPass)) + } else { + Unit + } + } catch (e: Exception) { + loge("ProxyAuthManager setDefaultAuth", e) + } + + private fun getAuth(user: String?, password: String): Authenticator = + object : Authenticator() { + public override fun getPasswordAuthentication(): PasswordAuthentication { + return (PasswordAuthentication(user, password.toCharArray())) + } + } +} diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/SocketInternetChecker.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/SocketInternetChecker.kt index 0f06c960..bcf05980 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/SocketInternetChecker.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/connectionchecker/SocketInternetChecker.kt @@ -19,6 +19,7 @@ package pan.alexander.tordnscrypt.utils.connectionchecker +import pan.alexander.tordnscrypt.utils.connectionchecker.ProxyAuthManager.setDefaultAuth import java.lang.Exception import java.net.* import javax.inject.Inject @@ -34,6 +35,8 @@ class SocketInternetChecker @Inject constructor() { port: Int, proxyAddress: String, proxyPort: Int, + proxyUser: String, + proxyPass: String, connectTimeout: Int = CONNECT_TIMEOUT_SEC, reachableTimeout: Int = CHECK_ADDRESS_REACHABLE_TIMEOUT_SEC ): Boolean { @@ -42,6 +45,7 @@ class SocketInternetChecker @Inject constructor() { try { socket = if (isProxyUsed(proxyAddress, proxyPort)) { + setDefaultAuth(proxyUser, proxyPass) val proxySockAdr: SocketAddress = InetSocketAddress( proxyAddress, proxyPort @@ -76,7 +80,9 @@ class SocketInternetChecker @Inject constructor() { ip: String, port: Int, proxyAddress: String, - proxyPort: Int + proxyPort: Int, + proxyUser: String, + proxyPass: String ): Int { var socket: Socket? = null @@ -84,6 +90,7 @@ class SocketInternetChecker @Inject constructor() { try { socket = if (isProxyUsed(proxyAddress, proxyPort)) { + setDefaultAuth(proxyUser, proxyPass) val proxySockAdr: SocketAddress = InetSocketAddress( proxyAddress, proxyPort diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/integrity/Verifier.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/integrity/Verifier.java index f6ab97ca..2b6444b7 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/integrity/Verifier.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/integrity/Verifier.java @@ -23,6 +23,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.Signature; +import android.os.Build; import android.util.Base64; import java.io.BufferedWriter; @@ -47,6 +48,7 @@ import javax.inject.Singleton; import dagger.Lazy; +import dalvik.system.ZipPathValidator; import pan.alexander.tordnscrypt.R; import pan.alexander.tordnscrypt.TopFragment; import pan.alexander.tordnscrypt.settings.PathVars; @@ -69,6 +71,10 @@ public Verifier(Context context, Lazy pathVars) { private String getApkSignatureZip() throws Exception { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + ZipPathValidator.clearCallback(); + } + File apkFile = new File(context.getApplicationInfo().sourceDir); ZipFile zipFile = new ZipFile(apkFile); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/jobscheduler/JobSchedulerManager.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/jobscheduler/JobSchedulerManager.kt deleted file mode 100644 index fb3d3876..00000000 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/jobscheduler/JobSchedulerManager.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - This file is part of InviZible Pro. - - InviZible Pro is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - InviZible Pro is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with InviZible Pro. If not, see . - - Copyright 2019-2024 by Garmatin Oleksandr invizible.soft@gmail.com - */ - -package pan.alexander.tordnscrypt.utils.jobscheduler - -import android.app.job.JobInfo -import android.app.job.JobScheduler -import android.content.ComponentName -import android.content.Context -import android.os.Build -import androidx.preference.PreferenceManager -import pan.alexander.tordnscrypt.utils.Constants.DEFAULT_SITES_IPS_REFRESH_INTERVAL -import pan.alexander.tordnscrypt.utils.Constants.SITES_IPS_REFRESH_JOB_ID -import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.SITES_IPS_REFRESH_INTERVAL -import pan.alexander.tordnscrypt.utils.web.GetIPsJobService -import pan.alexander.tordnscrypt.utils.web.TorRefreshIPsWork - -object JobSchedulerManager { - - @JvmStatic - fun startRefreshTorUnlockIPs(context: Context) { - var refreshPeriodHours = DEFAULT_SITES_IPS_REFRESH_INTERVAL - val refreshPeriod = PreferenceManager.getDefaultSharedPreferences(context).getString( - SITES_IPS_REFRESH_INTERVAL, - DEFAULT_SITES_IPS_REFRESH_INTERVAL.toString() - ) - - refreshPeriod?.let { - refreshPeriodHours = it.toInt() - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && refreshPeriodHours > 0) { - val jobService = ComponentName(context, GetIPsJobService::class.java) - val getIPsJobBuilder: JobInfo.Builder = - JobInfo.Builder(SITES_IPS_REFRESH_JOB_ID, jobService) - .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) - .setPeriodic(refreshPeriodHours * 60 * 60 * 1000L) - - val jobScheduler = - context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler - jobScheduler.schedule(getIPsJobBuilder.build()) - } else if (refreshPeriodHours > 0) { - TorRefreshIPsWork(context, null).refreshIPs() - } - } - - @JvmStatic - fun stopRefreshTorUnlockIPs(context: Context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - val jobScheduler = - context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler - jobScheduler.cancel(SITES_IPS_REFRESH_JOB_ID) - } - } -} diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/portchecker/PortChecker.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/portchecker/PortChecker.java index e871560a..6a4846ea 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/portchecker/PortChecker.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/portchecker/PortChecker.java @@ -20,8 +20,8 @@ package pan.alexander.tordnscrypt.utils.portchecker; import static pan.alexander.tordnscrypt.utils.Constants.LOOPBACK_ADDRESS; +import static pan.alexander.tordnscrypt.utils.Constants.MAX_PORT_NUMBER; import static pan.alexander.tordnscrypt.utils.Constants.NUMBER_REGEX; -import static pan.alexander.tordnscrypt.utils.logger.Logger.loge; import java.net.ConnectException; import java.net.DatagramSocket; @@ -39,7 +39,7 @@ public PortChecker() { public boolean isPortBusy(String port) { int portInt; - if (port.matches(NUMBER_REGEX)) { + if (port.matches(NUMBER_REGEX) && port.length() <= 5 && Long.parseLong(port) <= MAX_PORT_NUMBER) { portInt = Integer.parseInt(port); } else { return true; @@ -56,7 +56,7 @@ public boolean isPortAvailable(int port) { public String getFreePort(String port) { - if (!port.matches(NUMBER_REGEX)) { + if (!port.matches(NUMBER_REGEX) || port.length() > 5 || Long.parseLong(port) > MAX_PORT_NUMBER) { return port; } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/preferences/PreferenceKeys.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/preferences/PreferenceKeys.java index d1fe245e..6e2a27a2 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/preferences/PreferenceKeys.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/preferences/PreferenceKeys.java @@ -153,8 +153,8 @@ public interface PreferenceKeys { String TOR_USE_IPV6 = "ClientUseIPv6"; String TOR_FASCIST_FIREWALL = "FascistFirewall"; String TOR_FASCIST_FIREWALL_LOCK = "FascistFirewallLock"; - String TOR_ENTRY_NODES = "EntryNodes"; + String TOR_ISOLATE_UID = "pref_tor_isolate_uid"; //I2PD Settings String I2PD_USE_IPV6 = "ipv6"; diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecService.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecService.java index 84d2df0d..7951e4f1 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecService.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/root/RootExecService.java @@ -205,4 +205,10 @@ public void onCommandsDone(@NonNull List results, int mark) { sendResult(results, mark); moveServiceToBackground(); } + + @Override + public void onTimeout(int startId) { + moveServiceToBackground(); + super.onTimeout(startId); + } } diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/GetIPsJobService.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/GetIPsJobService.java deleted file mode 100644 index 53147de1..00000000 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/GetIPsJobService.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of InviZible Pro. - - InviZible Pro is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - InviZible Pro is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with InviZible Pro. If not, see . - - Copyright 2019-2024 by Garmatin Oleksandr invizible.soft@gmail.com - */ - -package pan.alexander.tordnscrypt.utils.web; - -import android.app.job.JobParameters; -import android.app.job.JobService; -import android.os.Build; - -import androidx.annotation.RequiresApi; - -@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) -public class GetIPsJobService extends JobService { - - private JobParameters params; - - public GetIPsJobService() { - } - - @Override - public boolean onStartJob(JobParameters params) { - this.params = params; - - TorRefreshIPsWork torRefreshIPsWork = new TorRefreshIPsWork(getApplicationContext(), this); - torRefreshIPsWork.refreshIPs(); - - return true; - } - - public void finishJob(boolean wantReschedule) { - jobFinished(params, wantReschedule); - } - - @Override - public boolean onStopJob(JobParameters params) { - return false; - } - -} diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/HttpsConnectionManager.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/HttpsConnectionManager.kt index 9839f2bd..b7aba6ae 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/HttpsConnectionManager.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/HttpsConnectionManager.kt @@ -20,16 +20,27 @@ package pan.alexander.tordnscrypt.utils.web import android.content.Context +import android.content.SharedPreferences import android.os.Build import kotlinx.coroutines.* import pan.alexander.tordnscrypt.di.CoroutinesModule +import pan.alexander.tordnscrypt.di.SharedPreferencesModule.Companion.DEFAULT_PREFERENCES_NAME import pan.alexander.tordnscrypt.modules.ModulesStatus import pan.alexander.tordnscrypt.settings.PathVars +import pan.alexander.tordnscrypt.utils.Constants.DEFAULT_PROXY_PORT import pan.alexander.tordnscrypt.utils.Constants.LOOPBACK_ADDRESS +import pan.alexander.tordnscrypt.utils.Constants.MAX_PORT_NUMBER +import pan.alexander.tordnscrypt.utils.Constants.NUMBER_REGEX import pan.alexander.tordnscrypt.utils.Constants.TOR_BROWSER_USER_AGENT +import pan.alexander.tordnscrypt.utils.connectionchecker.ProxyAuthManager.setDefaultAuth import pan.alexander.tordnscrypt.utils.enums.ModuleState import pan.alexander.tordnscrypt.utils.logger.Logger.loge import pan.alexander.tordnscrypt.utils.logger.Logger.logi +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_ADDRESS +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_PASS +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_PORT +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.PROXY_USER +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.USE_PROXY import java.io.IOException import java.io.InputStream import java.net.HttpURLConnection.HTTP_OK @@ -46,6 +57,8 @@ import javax.net.ssl.SSLSession class HttpsConnectionManager @Inject constructor( private val context: Context, private val pathVars: PathVars, + @Named(DEFAULT_PREFERENCES_NAME) + private val defaultPreferences: SharedPreferences, @Named(CoroutinesModule.DISPATCHER_IO) private val dispatcherIo: CoroutineDispatcher ) { @@ -204,9 +217,22 @@ class HttpsConnectionManager @Inject constructor( fun getHttpsUrlConnection(url: String): HttpsURLConnection { val modulesStatus = ModulesStatus.getInstance() + val proxyAddress = + defaultPreferences.getString(PROXY_ADDRESS, LOOPBACK_ADDRESS) ?: LOOPBACK_ADDRESS + val proxyPort = defaultPreferences.getString(PROXY_PORT, DEFAULT_PROXY_PORT).let { + if (it?.matches(Regex(NUMBER_REGEX)) == true && it.toLong() <= MAX_PORT_NUMBER) { + it.toInt() + } else { + DEFAULT_PROXY_PORT.toInt() + } + } + val useProxy = defaultPreferences.getBoolean(USE_PROXY, false) + && proxyAddress.isNotBlank() + && proxyPort != 0 + val proxy = if (modulesStatus.torState == ModuleState.RUNNING && modulesStatus.isTorReady) { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { - logi("Using http proxy for url connection") + logi("Using tor http proxy for url connection") Proxy( Proxy.Type.HTTP, InetSocketAddress( @@ -214,7 +240,7 @@ class HttpsConnectionManager @Inject constructor( ) ) } else { - logi("Using socks proxy for url connection") + logi("Using tor socks proxy for url connection") Proxy( Proxy.Type.SOCKS, InetSocketAddress( @@ -222,6 +248,17 @@ class HttpsConnectionManager @Inject constructor( ) ) } + } else if (useProxy) { + logi("Using socks proxy for url connection") + val proxyUser = defaultPreferences.getString(PROXY_USER, "") ?: "" + val proxyPass = defaultPreferences.getString(PROXY_PASS, "") ?: "" + setDefaultAuth(proxyUser, proxyPass) + Proxy( + Proxy.Type.SOCKS, + InetSocketAddress( + proxyAddress, proxyPort + ) + ) } else { logi("Using direct url connection") null diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/TorRefreshIPsWork.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/TorRefreshIPsWork.java index 8a3292ce..2066e8fc 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/TorRefreshIPsWork.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/web/TorRefreshIPsWork.java @@ -21,7 +21,6 @@ import android.content.Context; import android.content.SharedPreferences; -import android.os.Build; import android.os.Handler; @@ -54,6 +53,9 @@ import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_TETHERING; import static pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.TOR_USE_IPV6; +import androidx.work.ListenableWorker; +import androidx.work.Worker; + import javax.inject.Inject; import javax.inject.Named; @@ -72,33 +74,38 @@ public class TorRefreshIPsWork { public Lazy handler; @Inject public CoroutineExecutor executor; + @Inject + public Context context; private final Pattern ipv4Pattern = Pattern.compile(IPv4_REGEX); private final Pattern ipv6Pattern = Pattern.compile(IPv6_REGEX); - private final Context context; - private final GetIPsJobService getIPsJobService; + private final Worker worker; - private boolean exceptionWhenResolvingHost = false; + private boolean updateFault = false; - public TorRefreshIPsWork(Context context, GetIPsJobService getIPsJobService) { + public TorRefreshIPsWork(Worker worker) { App.getInstance().getDaggerComponent().inject(this); - this.context = context; - this.getIPsJobService = getIPsJobService; + this.worker = worker; } - public void refreshIPs() { - executor.submit("TorRefreshIPsWork refreshIPs", () -> { + public ListenableWorker.Result refreshIPs() { + logi("TorRefreshIPsWork refreshIPs"); - logi("TorRefreshIPsWork refreshIPs"); + try { + updateData(); - try { - updateData(); - } catch (Exception e) { - loge("TorRefreshIPsWork performBackgroundWork", e, true); + if (updateFault) { + updateFault = false; + return ListenableWorker.Result.retry(); + } else { + return ListenableWorker.Result.success(); } - return null; - }); + } catch (Exception e) { + loge("TorRefreshIPsWork performBackgroundWork", e, true); + } + + return ListenableWorker.Result.failure(); } private void updateData() { @@ -122,10 +129,6 @@ private void updateData() { ModulesStatus.getInstance().setIptablesRulesUpdateRequested(context, true); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && getIPsJobService != null) { - handler.get().post(() -> getIPsJobService.finishJob(exceptionWhenResolvingHost)); - } - } @@ -209,14 +212,17 @@ private Set universalGetIPs(Set hosts, Set ips, boolean Set unlockIPsPrepared = new HashSet<>(); - Set IPsReady = new HashSet<>(); + Set ipsReady = new HashSet<>(); - if (hosts != null) { + if (hosts != null && !hosts.isEmpty()) { for (String host : hosts) { if (!host.startsWith("#")) { ArrayList preparedIPs = handleActionGetIP(host, includeIPv6); unlockIPsPrepared.addAll(preparedIPs); } + if (worker.isStopped()) { + break; + } } for (String unlockIPPrepared : unlockIPsPrepared) { @@ -228,12 +234,20 @@ private Set universalGetIPs(Set hosts, Set ips, boolean } if (matcher.find()) { - IPsReady.add(unlockIPPrepared); + ipsReady.add(unlockIPPrepared); + } + + if (worker.isStopped()) { + break; } } + + if (ipsReady.isEmpty()) { + updateFault = true; + } } - if (ips != null) { + if (ips != null && !ips.isEmpty()) { for (String unlockIP : ips) { Matcher matcher; if (includeIPv6 && isIPv6Address(unlockIP)) { @@ -243,13 +257,16 @@ private Set universalGetIPs(Set hosts, Set ips, boolean } if (matcher.find()) { - IPsReady.add(unlockIP); + ipsReady.add(unlockIP); } - } + if (worker.isStopped()) { + break; + } + } } - return IPsReady; + return ipsReady; } private boolean isIPv6Address(String ip) { @@ -265,7 +282,6 @@ private ArrayList handleActionGetIP(String host, boolean includeIPv6) { TimeUnit.MILLISECONDS.sleep(DELAY_ERROR_RETRY_MSEC); preparedIPs.addAll(dnsInteractor.get().resolveDomain(host, includeIPv6)); } catch (Exception e) { - exceptionWhenResolvingHost = true; loge("TorRefreshIPsWork get " + host, e); } } @@ -274,7 +290,7 @@ private ArrayList handleActionGetIP(String host, boolean includeIPv6) { private boolean saveSettings(Set ipsToUnlock, String settingsKey) { Set ips = preferenceRepository.get().getStringSetPreference(settingsKey); - if (ips.size() == ipsToUnlock.size() && ips.containsAll(ipsToUnlock)) { + if (ips.size() == ipsToUnlock.size() && ips.containsAll(ipsToUnlock) || worker.isStopped()) { return false; } else { preferenceRepository.get().setStringSetPreference(settingsKey, ipsToUnlock); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/workers/UpdateIPsManager.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/workers/UpdateIPsManager.kt new file mode 100644 index 00000000..de19bf1d --- /dev/null +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/workers/UpdateIPsManager.kt @@ -0,0 +1,98 @@ +/* + This file is part of InviZible Pro. + + InviZible Pro is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + InviZible Pro is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with InviZible Pro. If not, see . + + Copyright 2019-2024 by Garmatin Oleksandr invizible.soft@gmail.com + */ + +package pan.alexander.tordnscrypt.utils.workers + +import android.content.Context +import androidx.preference.PreferenceManager +import androidx.work.BackoffPolicy +import androidx.work.Constraints +import androidx.work.ExistingPeriodicWorkPolicy +import androidx.work.NetworkType +import androidx.work.PeriodicWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.WorkRequest.Companion.DEFAULT_BACKOFF_DELAY_MILLIS +import pan.alexander.tordnscrypt.utils.Constants.DEFAULT_SITES_IPS_REFRESH_INTERVAL +import pan.alexander.tordnscrypt.utils.logger.Logger.loge +import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.SITES_IPS_REFRESH_INTERVAL +import java.util.concurrent.TimeUnit +import javax.inject.Inject +import javax.inject.Singleton + +private const val REFRESH_IPS_WORK = "pan.alexander.tordnscrypt.REFRESH_IPS_WORK" +private const val REFRESH_INITIAL_DELAY_MINUTES = 1L + +@Singleton +class UpdateIPsManager @Inject constructor( + private val context: Context +) { + fun startRefreshTorUnlockIPs() { + + val interval = getInterval() + if (interval == 0L) { + return + } + + val constraints = Constraints.Builder() + .setRequiresBatteryNotLow(true) + .setRequiresStorageNotLow(true) + .setRequiredNetworkType(NetworkType.CONNECTED) + .build() + + val updateRequest = PeriodicWorkRequestBuilder(interval, TimeUnit.HOURS) + .setConstraints(constraints) + .setInitialDelay(REFRESH_INITIAL_DELAY_MINUTES, TimeUnit.MINUTES) + .setBackoffCriteria( + BackoffPolicy.EXPONENTIAL, + DEFAULT_BACKOFF_DELAY_MILLIS, + TimeUnit.MILLISECONDS + ) + .build() + + WorkManager.getInstance(context) + .enqueueUniquePeriodicWork( + REFRESH_IPS_WORK, + ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE, + updateRequest + ) + } + + fun stopRefreshTorUnlockIPs() { + + val interval = getInterval() + if (interval == 0L) { + return + } + + WorkManager.getInstance(context) + .cancelUniqueWork(REFRESH_IPS_WORK) + } + + private fun getInterval(): Long = try { + val refreshPeriod = PreferenceManager.getDefaultSharedPreferences(context).getString( + SITES_IPS_REFRESH_INTERVAL, + DEFAULT_SITES_IPS_REFRESH_INTERVAL.toString() + ) + + refreshPeriod?.toLong() ?: DEFAULT_SITES_IPS_REFRESH_INTERVAL.toLong() + } catch (e: Exception) { + loge("UpdateIPsManager getInterval", e) + DEFAULT_SITES_IPS_REFRESH_INTERVAL.toLong() + } +} diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/workers/UpdateIPsWorker.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/workers/UpdateIPsWorker.kt new file mode 100644 index 00000000..b0f7e883 --- /dev/null +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/workers/UpdateIPsWorker.kt @@ -0,0 +1,33 @@ +/* + This file is part of InviZible Pro. + + InviZible Pro is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + InviZible Pro is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with InviZible Pro. If not, see . + + Copyright 2019-2024 by Garmatin Oleksandr invizible.soft@gmail.com + */ + +package pan.alexander.tordnscrypt.utils.workers + +import android.content.Context +import androidx.work.Worker +import androidx.work.WorkerParameters +import pan.alexander.tordnscrypt.utils.web.TorRefreshIPsWork + +class UpdateIPsWorker(appContext: Context, workerParams: WorkerParameters) : + Worker(appContext, workerParams) { + + override fun doWork(): Result { + return TorRefreshIPsWork(this).refreshIPs() + } +} diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/zipUtil/ZipFileManager.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/zipUtil/ZipFileManager.java index 2daaa3ed..b811f580 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/zipUtil/ZipFileManager.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/utils/zipUtil/ZipFileManager.java @@ -21,6 +21,7 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.os.Build; import java.io.File; import java.io.FileInputStream; @@ -35,6 +36,7 @@ import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import dalvik.system.ZipPathValidator; import pan.alexander.tordnscrypt.utils.filemanager.FileManager; import static pan.alexander.tordnscrypt.utils.logger.Logger.logi; @@ -61,6 +63,10 @@ public void extractZipFromInputStream(InputStream inputStream, String outputPath try (ZipInputStream zipInputStream = new ZipInputStream(inputStream)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + ZipPathValidator.clearCallback(); + } + ZipEntry zipEntry = zipInputStream.getNextEntry(); while (zipEntry != null) { diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/ServiceVPN.java b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/ServiceVPN.java index 81402fd9..0d00df68 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/ServiceVPN.java +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/ServiceVPN.java @@ -191,7 +191,7 @@ public class ServiceVPN extends VpnService implements OnInternetConnectionChecke native int jni_get_mtu(); @Keep - private native void jni_socks5_for_tor(String addr, int port, String username, String password, int dnsPort); + private native void jni_socks5_for_tor(String addr, int port, String username, String password, boolean isolateUid, int dnsPort); @Keep private native void jni_socks5_for_proxy(String addr, int port, String username, String password); @@ -216,18 +216,19 @@ synchronized void startNative(final ParcelFileDescriptor vpn, List listA vpnPreferences.getTorSOCKSPort(), "", "", + vpnPreferences.getTorIsolateUid(), vpnPreferences.getTorDNSPort() ); } else { - jni_socks5_for_tor("", 0, "", "", 0); + jni_socks5_for_tor("", 0, "", "", false, 0); } if (vpnPreferences.getUseProxy()) { jni_socks5_for_proxy( vpnPreferences.getProxyAddress(), vpnPreferences.getProxyPort(), - "", - "" + vpnPreferences.getProxyUser(), + vpnPreferences.getProxyPass() ); } else { jni_socks5_for_proxy("", 0, "", ""); diff --git a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/VpnPreferenceHolder.kt b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/VpnPreferenceHolder.kt index 0ecea949..4342cc1a 100644 --- a/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/VpnPreferenceHolder.kt +++ b/tordnscrypt/src/main/java/pan/alexander/tordnscrypt/vpn/service/VpnPreferenceHolder.kt @@ -21,7 +21,6 @@ package pan.alexander.tordnscrypt.vpn.service import android.content.SharedPreferences import android.os.Build -import android.util.Log import pan.alexander.tordnscrypt.di.SharedPreferencesModule.Companion.DEFAULT_PREFERENCES_NAME import pan.alexander.tordnscrypt.domain.preferences.PreferenceRepository import pan.alexander.tordnscrypt.modules.ModulesStatus @@ -29,6 +28,7 @@ import pan.alexander.tordnscrypt.proxy.CLEARNET_APPS_FOR_PROXY import pan.alexander.tordnscrypt.settings.PathVars import pan.alexander.tordnscrypt.utils.Constants.DEFAULT_PROXY_PORT import pan.alexander.tordnscrypt.utils.Constants.LOOPBACK_ADDRESS +import pan.alexander.tordnscrypt.utils.Constants.MAX_PORT_NUMBER import pan.alexander.tordnscrypt.utils.Constants.NUMBER_REGEX import pan.alexander.tordnscrypt.utils.enums.OperationMode import pan.alexander.tordnscrypt.utils.preferences.PreferenceKeys.* @@ -70,19 +70,23 @@ class VpnPreferenceHolder @Inject constructor( val proxyAddress = defaultPreferences.getString(PROXY_ADDRESS, LOOPBACK_ADDRESS) ?: LOOPBACK_ADDRESS val proxyPort = defaultPreferences.getString(PROXY_PORT, DEFAULT_PROXY_PORT).let { - if (it?.matches(Regex(NUMBER_REGEX)) == true) { + if (it?.matches(Regex(NUMBER_REGEX)) == true && it.toLong() <= MAX_PORT_NUMBER) { it.toInt() } else { DEFAULT_PROXY_PORT.toInt() } } + val proxyUser = defaultPreferences.getString(PROXY_USER, "") ?: "" + val proxyPass = defaultPreferences.getString(PROXY_PASS, "") ?: "" val useProxy = defaultPreferences.getBoolean(USE_PROXY, false) && proxyAddress.isNotBlank() && proxyPort != 0 + val torIsolateUid = defaultPreferences.getBoolean(TOR_ISOLATE_UID, false) + val torDNSPort = pathVars.torDNSPort.let { - if (it.matches(Regex(NUMBER_REGEX))) { + if (it.matches(Regex(NUMBER_REGEX)) && it.toLong() <= MAX_PORT_NUMBER) { it.toInt() } else { 5400 @@ -90,7 +94,7 @@ class VpnPreferenceHolder @Inject constructor( } val torSOCKSPort = pathVars.torSOCKSPort.let { - if (it.matches(Regex(NUMBER_REGEX))) { + if (it.matches(Regex(NUMBER_REGEX)) && it.toLong() <= MAX_PORT_NUMBER) { it.toInt() } else { 9050 diff --git a/tordnscrypt/src/main/jni/invizible/invizible.c b/tordnscrypt/src/main/jni/invizible/invizible.c index 1db933ba..63826104 100644 --- a/tordnscrypt/src/main/jni/invizible/invizible.c +++ b/tordnscrypt/src/main/jni/invizible/invizible.c @@ -32,6 +32,7 @@ int tor_socks5_port = 0; char tor_socks5_username[127 + 1]; char tor_socks5_password[127 + 1]; int tor_dns_port = 0; +bool tor_isolate_uid = false; char proxy_socks5_addr[INET6_ADDRSTRLEN + 1]; int proxy_socks5_port = 0; @@ -220,6 +221,7 @@ Java_pan_alexander_tordnscrypt_vpn_service_ServiceVPN_jni_1socks5_1for_1tor(JNIE jint port, jstring username_, jstring password_, + jboolean isolate_uid, jint dnsport) { const char *addr = (*env)->GetStringUTFChars(env, addr_, 0); const char *username = (*env)->GetStringUTFChars(env, username_, 0); @@ -233,6 +235,7 @@ Java_pan_alexander_tordnscrypt_vpn_service_ServiceVPN_jni_1socks5_1for_1tor(JNIE strcpy(tor_socks5_username, username); strcpy(tor_socks5_password, password); tor_dns_port = dnsport; + tor_isolate_uid = isolate_uid; log_android(ANDROID_LOG_WARN, "TOR SOCKS5 %s:%d user=%s", tor_socks5_addr, tor_socks5_port, tor_socks5_username); diff --git a/tordnscrypt/src/main/jni/invizible/tcp.c b/tordnscrypt/src/main/jni/invizible/tcp.c index b19eded5..ce9818c7 100644 --- a/tordnscrypt/src/main/jni/invizible/tcp.c +++ b/tordnscrypt/src/main/jni/invizible/tcp.c @@ -27,6 +27,7 @@ extern char tor_socks5_addr[INET6_ADDRSTRLEN + 1]; extern int tor_socks5_port; extern char tor_socks5_username[127 + 1]; extern char tor_socks5_password[127 + 1]; +extern bool tor_isolate_uid; extern char proxy_socks5_addr[INET6_ADDRSTRLEN + 1]; extern int proxy_socks5_port; @@ -415,11 +416,14 @@ void check_tcp_socket(const struct arguments *args, } if (*proxy_socks5_addr && proxy_socks5_port && !redirect_to_tor) { - *socks5_username = *proxy_socks5_username; - *socks5_password = *proxy_socks5_password; + strcpy(socks5_username, proxy_socks5_username); + strcpy(socks5_password, proxy_socks5_password); + } else if (tor_isolate_uid) { + sprintf(socks5_username, "%d", s->tcp.uid); + sprintf(socks5_password, "%d", s->tcp.uid); } else { - *socks5_username = *tor_socks5_username; - *socks5_password = *tor_socks5_password; + strcpy(socks5_username, tor_socks5_username); + strcpy(socks5_password, tor_socks5_password); } uint8_t ulen = strlen(socks5_username); diff --git a/tordnscrypt/src/main/res/layout-land/content_main.xml b/tordnscrypt/src/main/res/layout-land/content_main.xml index 02bf6db9..b5d332fd 100644 --- a/tordnscrypt/src/main/res/layout-land/content_main.xml +++ b/tordnscrypt/src/main/res/layout-land/content_main.xml @@ -15,7 +15,7 @@ android:orientation="vertical" android:visibility="gone"> - - - - + + + + + + + + - \ No newline at end of file + diff --git a/tordnscrypt/src/main/res/layout/content_main.xml b/tordnscrypt/src/main/res/layout/content_main.xml index c318c34d..83ace3ba 100644 --- a/tordnscrypt/src/main/res/layout/content_main.xml +++ b/tordnscrypt/src/main/res/layout/content_main.xml @@ -15,7 +15,7 @@ android:orientation="vertical" android:visibility="gone"> - + + الإعدادات + تور مع DNSCrypt وI2P + توقف I2P + يعمل I2P + يبدأ I2P + ثُبّت I2P + لم تُثبّت I2P + انتظر من فضلك… + لا تظهر + توقف DNSCrypt + ثُبّت DNSCrypt + يثبت DNSCrypt + يبدأ DNSCrypt + يعمل DNSCrypt + يتوقف DNSCrypt + لم تُثبّت DNSCrypt + توقف تور + ثُبّت تور + يثبت تور + لم تُثبّت تور + يبدأ تور + يعمل تور + يتوقف تور + ألغِ + خطأ! + خروج + تم + هناك خطأ ما! + هل تريد إكمال التثبيت؟ + نسخة متميزة + أوافق + لا أوافق + احفظ التغييرات + تجاهل التغييرات + سماح + رفض + يمكنك استخدام InviZible Pro مع وضع VPN المحلي، أو التطبيقات ذات الوكيل الخاص أو ميزة VPN المحلية في وضع الوكيل. + الإعدادات العامة + إعدادات DNSCrypt + إعدادات I2P + النسخ الاحتياطي واستعادة + السجلات + تبرّع + استعادة الإعدادات + الإعدادات + بدء تلقائي + حدّد خوادم DNSCrypt + إعدادات تور + إعدادات التوجيه + حدّد المواقع + حدّد التطبيقات + قائمة التطبيقات لاستخدامها مع تور + استبعاد المواقع + استبعاد التطبيقات + استبعاد من تور + أفضل حل لخصوصيتك + يتوقف I2P + يثبت I2P + البدء عند التمهيد + جارِ التحقق من توفر الجذر (Root)… + جارِ الأتصال + ثبّت + تحذير! + تم حفظ النسخة الاحتياطية + اعادة الضبط + اختر مجلد النسخ الاحتياطي: + تمت استعادة النسخة الاحتياطية + خوادم DNSCrypt + هل أنت متأكد؟ لا يمكن التراجع عن هذا الإجراء! + بدء تلقائي DNSCrypt + تأخير + استخدم مهلة (ثواني) فقط إذا لم يعمل التشغيل التلقائي بشكل صحيح + اسأل لاحقا + بدء تلقائي تور + خطأ في حفظ الملف! + بدء تلقائي I2P + توجيه كل حركة المرور InviZible + يمكنك استخدام InviZible Pro مع التطبيقات ذات الوكيل الخاص أو ميزة VPN المحلية في وضع الوكيل. + إعدادات تور + إعدادات سريعة + توجيه كل حركة المرور عبر تور + عنا + قائمة المواقع لفتحها مع تور. هذه الميزة لا تعمل للمواقع التي تقف وراء CDN + مسار الملف: + احفظ الإعدادات + قائمة المواقع لفتح مباشرة. لا تعمل هذه الميزة مع المواقع التي تدعم CDN + قائمة التطبيقات لاستخدامها مع InviZible + استبعد بالكامل + قائمة التطبيقات لفتح مباشرة + توجيه إلى تور + استبعد UDP من تور + فترة التحديث + الجسور + استخدمه إذا لم تتمكن من الاتصال بشبكة تور + لا تستخدم الجسور + استخدم قائمة الجسور الخاصة + اطلب جسور + عدّل الجسور + التشويش + جسور IPv6 + تتوفر جسور تور الافتراضية الجديدة. هل تريد تحديثها؟ + حفظ + إغلاق + تزييف SNI + حدّد السمة + وضع النهار + وضع ليلي + تلقائي + النظام الافتراضي + يُرجى تعطيل عقد الإدخال في إعدادات تور، وإلا فلن تتمكن من استخدام الجسور. + استخدم القائمة الافتراضية للجسور + أضِف الجسور + الرجاء إلغاء تنشيط الجسر أولاً! + الرجاء إدخال الأحرف من الصورة + الرجاء تحديد نوع التشويش: + طلب جسور جديدة + جسورك الجديدة من bridges.torproject.org: + الفترة بالساعات لتحديث مواقع IP. لنظام التشغيل أندرويد 5.1 والإصدارات الأحدث. ضع 0 لإيقاف التحديث. + اسم المضيف خاطئ! + حدّث + إظهار سجلات اتصال التطبيق في علامة التبويب DNS + احظر http + رفض الاتصال بمنفذ http 80 + تحقق من تحديثات InviZible Pro والوحدات النمطية يوميًا + تحقق مما إذا كانت الإصدارات الجديدة متاحة الآن + كشف DHCP مخادع + تحقق من التحديثات فقط باستخدام تور وعندما يكون تور قيد التشغيل + استخدم امتيازات الجذر لوحدات DNSCrypt وتور وI2P. يؤدي تمكين هذه الميزة إلى ترك الوحدات غير مُدارة وقد يتسبب في حدوث مشكلات في الاتصال! + رفض الاتصال بمنفذ http 80 لـ HOTSPOT + حماية التطبيق من التعرض للقتل بواسطة أندرويد + اكتشف هجمات DHCP المخادع في شبكات Wi-Fi. + حظر الموقع عند اكتشاف هجوم إعادة ربط DNS + سيقوم InviZible Pro بإجراء كافة الاتصالات من خلال وكيل SOCKS5 + وضع التوافق + استخدم الأمر التالي لإدارة وحدات التطبيق: \"am broadcast -a pan.alexander.tordnscrypt.SHELL_SCRIPT_CONTROL --ei dnscrypt 1 --ei tor 1 --ei i2p 1 %s\". حيث 1 - يبدأ، 0 - يوقف الوحدة. + يُرجى استبعاد InviZible Pro من تحسين بطارية أندرويد لمنع النظام من إنهاء DNSCrypt أو تور أو I2P في أي وقت. قد تتطلب بعض الأنظمة الخاصة، مثل MIUI، خطوات إضافية. + فعّل إذا كان جهازك مزودًا بذاكرة ROM مخصصة وانقطع الاتصال عند الضغط على زر البدء + توجيه جميع حركة المرور الواردة عبر تور + يُرجى السماح باستخدام بيانات الخلفية والسماح باستخدام البيانات أثناء تشغيل توفير البيانات. وهذا أمر ضروري لتجربة سلسة عبر الإنترنت. + قائمة المواقع التي سيتم فتحها باستخدام تور لـ HOTSPOT + لا تستخدم BusyBox + افتح تضبيط الربط + الرجاء إعادة تشغيل I2P + في انتظار الشبكة… + انتظر قفل xtables + انتظر حتى يمكن الحصول على قفل iptables الحصري لمنع التعديل المتزامن لقواعد iptables. + للمستخدم المتقدم فقط! + حفظ أوامر الجذر للتسجيل + DNSCrypt، تور، I2P محمية. لا تختبئ. + جارِ تنفيذ أوامر الجذر… + انتظر من فضلك… + استخدم الخوادم التي تطبق بروتوكول DNS-over-HTTPS. + استخدم الخوادم التي تطبق بروتوكول Oblivious DNS-over-HTTPS. + تجاوز عناوين LAN + لا تستخدم تور لوجهات LAN ومجموعات IP المحفوظة لـ IANA + سجلات في الوقت الفعلي + حدّد اللغة + التحديثات التلقائية + تحقق من تحديث + حدّث بصرامة من خلال تور + استخدم امتيازات الجذر + تشغيل الوحدات مع الجذر + أُخرى + حظر HOTSPOT http + كشف هجوم الوسيط (MITM) + كشف انتحال ARP + اكتشف انتحال هجوم وسيط ARP وهجمات DHCP المارقة في شبكات Wi-Fi. + حظر الإنترنت عند اكتشاف هجوم + سيتم حظر اتصال الإنترنت أثناء الهجوم + حماية إعادة ربط DNS + الوكيل + استخدم وكيل socks5 + احظر الاتصال بالإنترنت عند إيقاف تور وDNSCrypt وPurple I2P + تحديث القواعد + حدّث القواعد عند كل تغيير في الاتصال + أظهِر الإشعار + منع سكون الجهاز + لا تسمح للجهاز بالوقوع في وضع الغفوة. قد يكون مفيدًا عند استخدام HOTSPOT. يستنزف البطارية! + مبدال القتل (Kill switch) + رسائل المساعدة + إظهار كافة الرسائل التي تم وضع علامة \"غير مسموح لها\" بالعرض + فعّل التحكم في البرنامج النصي + هل تريد التوقف عن تحسين استخدام البطارية؟ + هل تريد تعطيل موفر بيانات الشبكة؟ + تلقائي + استخدم جهاز BusyBox + استخدم تطبيق BusyBox + HOTSPOT-تجريبية + ابدأ المشاركة عند التمهيد + السماح بمشاركة تور + حدّد BusyBox + توجيه كله من خلال تور + حدّد المواقع + استبعاد المواقع + قائمة المواقع لفتحها مباشرة لـ HOTSPOT + السماح بمشاركة I2P + أصلح TTL + سيتم تثبيت TTL على 64 باستخدام VPN محلي. دعم النواة غير مطلوب. لإصلاح TTL، برجاء تشغيل DNSCrypt أو/و تور. + عنوان IP لجهاز LAN + فعّل Fix TTL واضبط جهاز LAN للاتصال بـ InviZible. استخدم البوابة الافتراضية: %1$s، خادم DNS: %2$s. + الرجاء إعادة تشغيل DNSCrypt + الرجاء إعادة تشغيل تور + دعم متعدد المستخدمين + دعم التطبيقات المزدوجة، وMIUI، وIsland، وShelter، وتطبيقات الملف الشخصي للعمل. قد يكون غير فعال في وضع VPN + حدّد iptables + استخدم iptables للتطبيق + استخدم iptables للجهاز + جارِ الاتصال… + تم حظر الإنترنت بسبب مبدال القتل. شغّل تور أو DNSCrypt أو I2P للسماح بالاتصال. أو عطّل مبدال القتل في الإعدادات العامة. + حُفظت الإعدادات + الاعدادات العامة + حدّد خادمًا واحدًا على الأقل! + منفذ محلي للاستماع إليه. + تتطلب خوادم (من مصادر ثابتة + بعيدة) لتلبية خصائص محددة + استخدم الخوادم التي تطبق بروتوكول DNSCrypt. + استخدم الخوادم التي يمكن الوصول إليها عبر IPv4 + استخدم الخوادم التي يمكن الوصول إليها عبر IPv6 + يجب أن يدعم الخادم امتدادات أمان DNS (DNSSEC). + يجب ألا يفرض الخادم القائمة السوداء الخاصة به (للرقابة الأبوية، وحظر الإعلانات...). + ‎‍‎‍‎‎‎استخدم دائمًا TCP للاتصال بالخوادم الأولية + منفذ الوكيل + اعدادات اخرى + لا تدع DNSCrypt يحاول استخدام إعدادات DNS الخاصة بالنظام. استخدم مُحللات Bootstrap دون قيد أو شرط. + تتطلب الخوادم المحددة بواسطة مصادر بعيدة لتلبية خصائص محددة + يجب ألا يقوم الخادم بتسجيل استعلامات المستخدم (تصريحي). + استخدم TCP بدلاً من UDP للاتصال بخوادم DNSCrypt. يجب تفعيل هذا الخيار إذا كنت تستخدم DNSCrypt عبر تور. + وكيل SOCKS + وكيل الصادر (Outbound) + وجّه كافة اتصالات TCP إلى وكيل تور المحلي Socks5. لا يدعم تور UDP، لذا عيّن Force TCP على true أيضًا. + هذا هو مُحلل DNS عادي وغير مُعمَّى، وسيتم استخدامه فقط للاستعلامات التي يتم تنفيذها لمرة واحدة عند استرداد قائمة أدوات الحل الأولية، وفقط إذا لم يعمل تكوين DNS للنظام.لن يتم استخدامه أبدًا إذا كانت القوائم قد تم تخزينها مؤقتًا بالفعل. + diff --git a/tordnscrypt/src/main/res/values-bg/strings.xml b/tordnscrypt/src/main/res/values-bg/strings.xml index 81d34151..3485f208 100644 --- a/tordnscrypt/src/main/res/values-bg/strings.xml +++ b/tordnscrypt/src/main/res/values-bg/strings.xml @@ -108,7 +108,7 @@ Актуализирайте правилата при всяка промяна на свързаността Показване на известие Предотврати заспиване на устройството - Допълнителна защита с режим без Root за предотвратяване на спиране на приложението от android. Може да изтощи батерията + Не позволявайте на устройството да изпада в режим на заспиване. Може да бъде полезно при използване на HOTSPOT. Изтощава батерията! Режим на съвместимост Активирайте, ако вашето устройство е с персонализиран ROM и връзката се загуби, когато натиснете бутона START Помощни съобщения @@ -203,18 +203,18 @@ Сървърът не трябва да регистрира потребителски заявки (декларативно). Изберете поне един сървър! Локален порт за слушане. - Изисквайте сървъри (от статични + отдалечени източници), за да отговарят на специфични свойства. + Изисквайте сървъри (от статични + отдалечени източници), за да отговарят на специфични свойства Използвайте сървъри, изпълняващи протокола DNSCrypt. Използвайте сървъри, прилагащи протокола DNS-over-HTTPS. Използвайте сървъри, достъпни през IPv4 Сървърът трябва да поддържа DNS разширения за сигурност (DNSSEC). - Изисквайте сървъри, дефинирани от отдалечени източници, за да отговарят на специфични свойства. - Винаги използвайте TCP за свързване към сървъри нагоре по веригата. + Изисквайте сървъри, дефинирани от отдалечени източници, за да отговарят на специфични свойства + Винаги използвайте TCP за свързване към сървъри нагоре по веригата Сървърът не трябва да налага собствен черен списък (за родителски контрол, блокиране на реклами...). Активиране на прокси Насочете всички TCP връзки към локален Tor възел. Tor не поддържа UDP, така че задайте force_tcp също на true. proxy_port - Други настройки. + Други настройки Bootstrap резолвер. Това е нормален, некриптиран DNS резолвер, който ще се използва само за еднократни заявки при извличане на първоначалния списък с резолвери и само ако системната DNS конфигурация не работи. Никога няма да се използва, ако списъците вече са кеширани. Никога не позволявайте на dnscrypt-proxy да се опитва да използва системните DNS настройки. Безусловно използвайте резервния резолвер.. Активиране на поддръжка за HTTP/3 (DoH3, HTTP през QUIC). Обърнете внимание, че подобно на DNSCrypt, но за разлика от други HTTP версии, това използва UDP и (обикновено) порт 443 вместо TCP. @@ -227,9 +227,8 @@ Изтрийте правилата за прикриване Не регистрирайте тези типове заявки, за да намалите многословието. Оставете празно, за да регистрирате всичко. Отворете регистъра на заявките - Регистриране на съмнителни заявки. - Това може да бъде полезно, ако трябва да маршрутизирате всичко през Tor. -\n В противен случай оставете това на false, тъй като не подобрява сигурността (dnscrypt-proxy винаги ще шифрова всичко дори с помощта на UDP) и може само да увеличи латентността. + Регистриране на съмнителни заявки + Използвайте TCP вместо UDP, за да се свържете към DNSCrypt сървъри. Тази опция трябва да бъде активирана, ако използвате DNSCrypt през Tor. Използвайте iptables на устройството Изчакайте заключването на xtables Изчакайте, докато може да бъде получено изключителното заключване на iptables, за да предотвратите едновременна промяна на правилата на iptables. @@ -239,34 +238,32 @@ Свързване… Интернетът е блокиран поради превключвателя Kill. Стартирайте Tor, DNSCrypt или I2P, за да разрешите връзката. Или деактивирайте превключвателя Kill в Общи настройки. Моля изчакай… - SOCKS proxy. + SOCKS proxy Насочвайте заявки за конкретни домейни към специален набор от сървъри. Правила за препращане на импортиране Правила за прикриване - Прикриването връща предварително зададен адрес за конкретно име. -\n Освен че действа като HOSTS файл, той може също да върне IP адрес с различно име. Той също така ще направи изравняване на CNAME.. + Прикриването връща предварително зададен адрес за конкретно име. Освен че действа като HOSTS файл, той може също да върне IP адрес с различно име. Той също така ще направи изравняване на CNAME. Импортиране на правила за прикриване Импортирайте файл с правила за прикриване. Можете да изберете няколко файла, дублиращите се редове ще бъдат премахнати. - Регистриране на заявки. + Регистриране на заявки Регистрирайте клиентските заявки във файл. Активирайте регистрирането на заявки Активиране на подозрително регистриране - Регистрирайте заявки за несъществуващи зони. -\n Тези заявки могат да разкрият наличието на зловреден софтуер, повредени/остарели приложения и устройства, сигнализиращи за присъствието си на трети страни. + Регистрирайте заявки за несъществуващи зони. Тези заявки могат да разкрият наличието на зловреден софтуер, повредени/остарели приложения и устройства, сигнализиращи за присъствието си на трети страни. Отворете подозрителен дневник Измислица SNI - Блокиране въз основа на шаблон (черен списък). + Блокиране въз основа на модел (черен списък) Черен списък Черният списък е съставен от един модел на ред. Черен списък за импортиране Импортирайте списък с домейни или файл с хостове. Можете да изберете няколко файла, дублиращите се редове ще бъдат премахнати. Изтриване на черния списък IP черен списък - Базирано на шаблон IP блокиране (IP черен списък). + Базирано на шаблон IP блокиране (IP черен списък) Черният списък на IP се състои от един модел на ред. Изтриване на черния списък с IP Черен списък за импортиране на IP Черен списък за импортиране на IP. Можете да изберете няколко файла, дублиращите се редове ще бъдат премахнати. - Бели списъци въз основа на шаблони (заобикаляне на черните списъци). + Бели списъци въз основа на шаблони (заобикаляне на черните списъци) Бял списък diff --git a/tordnscrypt/src/main/res/values-de/strings.xml b/tordnscrypt/src/main/res/values-de/strings.xml index 4a995064..1d22dfc6 100644 --- a/tordnscrypt/src/main/res/values-de/strings.xml +++ b/tordnscrypt/src/main/res/values-de/strings.xml @@ -11,9 +11,9 @@ "I2P installiert" "I2P nicht installiert" "Starte beim Booten" - "Prüfe ob Root verfügbar ist…" + Prüfe, ob Root verfügbar ist… "Bitte warten…" - Nicht wieder anzeigen + Nicht anzeigen "DNSCrypt gestoppt" "DNSCrypt installiert" "DNSCrypt wird installiert" @@ -37,16 +37,16 @@ "Erledigt" "Etwas ist schiefgegangen!" "Möchtest du die Installation vervollständigen?" - "Premium Version" + Premiumversion "Zustimmen" "Ablehnen" - "Du kannst InviZible Pro entweder im lokalen VPN Modus benutzen, als eigenen Proxy für lokale Applikationen oder lokale VPN Features im Proxy Modus nutzen." - "Du kannst InviZible Pro entweder als eigenen Proxy für lokale Applikationen oder lokale VPN Features im Proxy Modus nutzen." + Du kannst InviZible Pro entweder im lokalen VPN-Modus benutzen, als eigenen Proxy für lokale Applikationen oder lokale VPN-Features im Proxy-Modus nutzen. + Du kannst InviZible Pro entweder als eigenen Proxy für lokale Applikationen oder lokale VPN-Features im Proxy-Modus nutzen. "Fehler beim Speichern der Datei!" "Allgemeine Einstellungen" - "DNSCrypt Einstellungen" - "Tor Einstellungen" - "I2P Einstellungen" + DNSCrypt-Einstellungen + Tor-Einstellungen + I2P-Einstellungen "Schnelleinstellungen" "Sichern & Wiederherstellen" "Über" @@ -58,177 +58,177 @@ "Wähle den Sicherungsordner:" "Einstellungen" "Autostart" - Starte DNSCrypt beim Booten - Starte Tor beim Booten - Starte I2P beim Booten + DNSCrypt automatisch starten + Tor automatisch starten + I2P automatisch starten "Verzögerung" "Verzögerung (Sek.) nur verwenden, wenn der Autostart nicht korrekt funktioniert" - "DNSCrypt Server" - "Wähle die DNSCrypt Server" - "Tor Einstellungen" - "Routing Einstellungen" + DNSCrypt-Server + Wähle die DNSCrypt-Server + Tor-Einstellungen + Routing-Einstellungen "Sende jeglichen Datenverkehr durch Tor" "Sende jeglichen Datenverkehr durch InviZible" - Wähle Webseiten - Liste der Webseiten die mit Tor geöffnet werden - Wähle Applikationen - "Liste der Apps die mit Tor geöffnet werden" - "Liste der Apps die mit InviZible geöffnet werden" - Webseiten ausschliessen - Webseiten die direkt geöffnet werden - Applikationen ausschliessen - "Liste der Apps die direkt geöffnet werden" + Seiten auswählen + Liste der Webseiten, die mit Tor geöffnet werden + Anwendungen auswählen + Liste der Apps, die mit Tor geöffnet werden + Liste der Apps, die mit InviZible geöffnet werden + Seiten ausschließen + Websites, die direkt geöffnet werden. Dies funktioniert nicht für Seiten hinter CDNs. + Anwendungen ausschließen + Liste der Apps, die direkt geöffnet werden Aktualisierungsintervall - Zeitraum in Stunden um Webseiten-IPs zu aktualisieren. Für Android 5.1 und höher. Setze auf 0 um die Aktualisierungen zu stoppen. - "Bridges" - "Benutze diese, falls du nicht zum Tor Netzwerk verbinden kannst" - "Bridges nicht benutzen" - "Benutze Bridges Standard Liste" - "Benutze Bridges Eigene Liste" - "Bridges anfordern" - "Bridges hinzufügen" - "Bridge bearbeiten" - "Bitte zuerst Bridge deaktivieren!" + Zeitraum in Stunden, um Website-IPs zu aktualisieren. Für Android 5.1 und höher. Setze auf 0, um die Aktualisierungen zu stoppen. + Brücken + Benutze diese, falls du dich nicht mit dem Tor-Netzwerk verbinden kannst + Brücken nicht benutzen + Benutze Brücken-Standardliste + Eigene Brückenliste verwenden + Brücken anfordern + Brücken hinzufügen + Brücke bearbeiten + Bitte zuerst Brücke deaktivieren! "Verschleierung" "Bitte wähle den Typ der Verschleierung:" "Bitte gib die Zeichen aus dem Bild ein" - "Neue Bridges anfordern" - "Deine neuen Bridges von bridges.torproject.org:" + Neue Brücken anfordern + Deine neuen Brücken von bridges.torproject.org: "Speichern" - "Schliessen" + Schließen "Falscher Hostname!" - Theme auswählen + Thema auswählen Sprache auswählen "HTTP blockieren" - "Verbindung zu HTTP Port 80 verweigern" + Verbindung mit HTTP-Port 80 verweigern "Update" - Automatische Updates - Prüfe täglich auf Updates von InviZible Pro und Modules + Automatische Aktualisierungen + Prüfe täglich auf Aktualisierungen von InviZible Pro und Modulen Prüfe Update - "Prüfe ob ein neues Update verfügbar ist" - "Updates nur durch Tor" + Prüfe jetzt, ob neue Versionen verfügbar sind + Ausschließlich via Tor aktualisieren "Updateprüfung nur mit Tor und wenn Tor läuft" - "Benutze Root Rechte" + Benutze Rootrechte "Führe Module mit Root aus" - "Benutze Root Rechte für DNSCrypt, Tor und I2P Module. Durch Aktivierung dieser Funktion bleiben die Module unverwaltet, dies kann zu Verbindungsproblemen führen!" + Benutze Rootrechte für die DNSCrypt-, Tor- und I2P-Module. Durch Aktivierung dieser Funktion bleiben die Module unverwaltet, dies kann zu Verbindungsproblemen führen! "Diverses" - "Blockiere HOTSPOT http" - "Verbindung zu http Port 80 im HOTSPOT Modus verweigern" - Zusätzlicher Schutz vor Schliessen der App durch Android mittels Kein Root Modus + Blockiere HTTP in Hotspots + Verbindung zum HTTP-Port 80 im Hotspot-Modus verweigern + Verhindern, dass die App durch Android geschlossen wird "Aktualisierung der Regeln" "Aktualisiere die Regeln bei jeder Verbindungsänderung" "Zeige Benachrichtigungen" - "Verhindere den Sleep Modus" - Zusätzlicher Schutz vor Schliessen der App durch Android mittels Kein Root Modus. Kann den Batterieverbrauch erhöhen - "Hilfe Messages" - Hilfe Messages immer anzeigen + Verhindere das automatische Ausschalten des Bildschirms + Untersage dem Gerät in einen Ruhezustand zu wechseln. Kann bei Verwendung der HOTSPOT-Funktion nützlich sein. Verursacht erhöhten Akkuverbrauch! + Hilfe-Nachrichten + Alle Nachrichten anzeigen, die als nicht zum Anzeigen erlaubt markiert wurden. Bitte deaktiviere die Batterieoptimierung deines Telefons für InviZible Pro. Andernfalls können DNSCrypt, Tor oder I2P jederzeit durch Android beendet werden. Auf manchen Systemen, wie zB MIUI, können zusätzliche Schritte nötig sein. "BusyBox auswählen" "HOTSPOT-Experimentell" Starte Tethering beim Booten - Erlaube Tor Tethering + Erlaube Tor-Tethering "Sende jeglichen Datenverkehr durch Tor" "Sende jeglichen eingehenden Datenverkehr durch Tor" - Wähle Webseiten - Liste der Webseiten die im HOTSPOT Modus mit Tor geöffnet werden - Webseiten ausschliessen - Liste der Webseiten die im HOTSPOT Modus direkt geöffnet werden - Erlaube I2P Tethering + Seiten auswählen + Liste der Webseiten, die im Hotspot-Modus mit Tor geöffnet werden + Seiten ausschließen + Liste der Webseiten, die im Hotspot-Modus direkt geöffnet werden + Erlaube I2P-Tethering "TTL festlegen" - "TTL wird bei Benutzung des lokalen VPN auf 64 festgelegt. Kernel Unterstützung wird nicht benötigt. Um TTL festzulegen starte bitte DNSCrypt und/oder Tor." - Öffne die Tethering Konfiguration + TTL wird bei Benutzung des lokalen VPN auf 64 festgelegt. Kernel-Unterstützung wird nicht benötigt. Um TTL festzulegen, starte bitte DNSCrypt und/oder Tor. + Öffne die Tethering-Konfiguration "Bitte starte DNSCrypt neu" "Bitte starte Tor neu" "Bitte starte I2P neu" - "iptables auswählen" - "Speichere Root Kommandos im Log" + IPTables auswählen + Speichere Root-Kommandos im Log "DNSCrypt, Tor, I2P sind geschützt. Nicht verstecken." "Bitte warten…" "Einstellungen gespeichert" - "GLOBALE EINSTELLUNGEN" + Globale Einstellungen "Nur für fortgeschrittene Benutzer!" "Wähle mindestens einen Server!" - "Lokaler Port auf dem gelauscht wird." - "Benötige Server (von statischen + Remote Quellen) um spezielle Eigenschaften zu erfüllen." - "Benutze Server die das DNSCrypt Protokoll implementieren." - "Benutze Server die das DNS-over-HTTPS Protokoll implementieren." - "Benötige Server die von Remote Quellen definiert wurden, um spezielle Eigenschaften zu erfüllen." - "Server muss die DNS Sicherheits Erweiterungen unterstützen (DNSSEC)." + Lokaler Port, auf dem gelauscht wird. + Benötige Server (von statischen + Remote-Quellen), um spezielle Eigenschaften zu erfüllen. + Benutze Server, die das DNSCrypt-Protokoll implementieren. + Benutze Server, die das DNS-over-HTTPS-Protokoll implementieren. + Benötige Server, die von Remote-Quellen definiert wurden, um spezielle Eigenschaften zu erfüllen + Server muss die DNS-Sicherheitserweiterungen unterstützen (DNSSEC). "Server darf Useranfragen nicht speichern (deklarativ)." "Server darf keine eigene Blacklist erzwingen (Elterliche Kontrolle, Blockieren von Werbung…)." - "Benutze immer TCP um zu Upstream Servern zu verbinden." + Benutze immer TCP zum Verbinden mit Upstream-Servern. "Dies kann nützlich sein, wenn jeglicher Datenverkehr durch Tor geleitet werden soll. Andernfalls sollte dies nicht aktiviert werden, da die Sicherheit dadurch nicht verbessert, die Latenz jedoch erhöht wird (DNSCrypt-Proxy wird immer alles verschlüsseln, auch wenn UDP verwendet wird)." - "HTTP / SOCKS Proxy." + SOCKS-Proxy "Proxy aktivieren" - "Route alle TCP Verbindungen zu einem lokalen Tor Knoten. Da Tor UDP nicht unterstützt, setze force_tcp ebenfalls auf aktiv." - "proxy_port" - "Andere Einstellungen." - "Bootstrap Resolver. Dies ist ein normaler, nicht verschlüsselter DNS Resolver, der nur für einmalige Anfragen benutzt wird, um die Liste von Eingangsresolvern zu beziehen, und dies nur, wenn die System DNS Konfiguration nicht funktioniert. Er wird nie benutzt sobald sich Listen im Cache befinden." - "Lasse Dnscrypt-proxy niemals versuchen die DNS Einstellungen des Systems zu verwenden. Verwende den Fallback Resolver.." - "FILTER" - "Forwarding Regeln" + Route alle TCP-Verbindungen zu einem lokalen Tor-Knoten. Da Tor UDP nicht unterstützt, setze die Einstellung „TCP erzwingen“ ebenfalls auf aktiv. + Proxy-Port + Andere Einstellungen + Bootstrap-Resolver. Dies ist ein normaler, unverschlüsselter DNS-Resolver, der nur für einmalige Anfragen benutzt wird, um die Liste von Eingangsresolvern zu beziehen, und dies nur, wenn die System-DNS-Konfiguration nicht funktioniert. Er wird nicht mehr benutzt, sobald sich Listen im Cache befinden. + Lasse den DNSCrypt-Proxy niemals versuchen, die DNS-Einstellungen des Systems zu verwenden. Verwende den Fallback-Resolver. + Filter + Weiterleitungsregeln "Route Anfragen für spezifische Domains zu festgelegten Servern weiter." - "Cloaking Regeln" - "Cloaking gibt für spezifische Namen eine festgelegte Adresse zurück. Zusätzlich zur Funktion als HOSTS Datei, kann Cloaking auch die IP Adresse eines unterschiedlichen Namens zurückgeben. CNAME Flattening wird ebenso durchgeführt.." + Cloaking-Regeln + Cloaking gibt für spezifische Namen eine festgelegte Adresse zurück. Zusätzlich zur Funktion als HOSTS-Datei kann Cloaking auch die IP-Adresse eines anderen Namens zurückgeben. CNAME-Flattening wird ebenso durchgeführt. "Logging von Anfragen." "Logge Client-Anfragen in eine Datei." "Aktiviere das Logging von Anfragen" - "Folgende Anfragetypen nicht loggen, um die Informationsmenge zu reduzieren. Leerlassen um alles zu loggen." - "Öffne das Anfragen Log" + Folgende Anfragetypen nicht loggen, um die Informationsmenge zu reduzieren. Leerlassen, um alles zu loggen. + Öffne das Anfragen-Log "Logging von verdächtigen Anfragen." "Logge Anfragen für nichtexistente Zonen. Die Anfragen können das Vorhandensein von Malware, kaputten Applikationen oder Geräten an Dritte melden bzw aufdecken.." - "Aktiviere Verdächtiges Logging" - "Öffne das Verdächtigen Log" - "Schema gestütztes Blocking (Blacklist)." + Aktiviere verdächtiges Logging + Öffne das Verdächtigen-Log + Schema-gestütztes Blocking (Blacklist). "Blacklist" "Blacklists bestehen aus einem Schema pro Zeile." - "Schema gestütztes IP Blocking (IP Blacklist)." - "IP Blacklist" - "IP Blacklists bestehen aus einem Schema pro Zeile." - "Schema gestütztes Whitelisting (Blacklist Umgehung)." + Schema-gestütztes IP-Blocking (IP-Blacklist). + IP-Blacklist + IP-Blacklists bestehen aus einem Schema pro Zeile. + Schema-gestütztes Whitelisting (Blacklist-Umgehung). "Whitelist" - "Whitelists unterstützen die gleichen Schemas wie Blacklists. Wenn sich ein Name in der Whitelist befindet umgeht diese Sitzung Namens- und IP Filter." + Whitelists unterstützen die gleichen Schemata wie Blacklists. Wenn sich ein Name in der Whitelist befindet, umgeht diese Sitzung Namens- und IP-Filter. "Servers" "Quellen" - "Remote Liste von verfügbaren Servern." + Remote-Liste von verfügbaren Servern. "Quellenliste wird nach refresh_delay Stunden ungültig." "Relays" "Quellen" "Relayliste wird nach refresh_delay Stunden ungültig." - "DNSCrypt Relays" + DNSCrypt-Relays "Voreinstellung existiert nicht in dnscrypt-proxy.toml!" "Log löschen" - "DNSCrypt Anfragen Log" - "DNSCrypt Verdächtig Log" + DNSCrypt-Anfragen-Log + DNSCrypt-verdächtig-Log "Log ist leer" - "Sofortige Beantwortung von A und AAAA Anfragen für Hostnamen ohne einen Domainnamen." + Sofortige Beantwortung von A- und AAAA-Anfragen für Hostnamen ohne einen Domainnamen. "Sofortige Beantwortung von Anfragen für lokale Zonen, anstatt sie an höhere Resolver durchzulassen (verursacht meist Fehler und Timeouts)." - "Wenn Tor aufgrund eines MAPADDRESS Befehls vom Kontroller oder dem AutomapHostsOnResolve Feature eine virtuelle (unbenutzte) Addresse zuweisen muss, dann wählt Tor eine unzugeordnete Addresse aus diesem Bereich." + Wenn Tor aufgrund eines MAPADDRESS-Befehls vom Controller oder dem AutomapHostsOnResolve-Feature eine virtuelle (unbenutzte) Addresse zuweisen muss, dann wählt Tor eine noch nicht zugeordnete Adresse aus diesem Bereich. "Wenn ungleich 0, versuche Schreibzugriffe zu reduzieren." - "Diese Option regelt Tor’s Padding Verhalten um vor gewissen Formen von Verkehrsanalyse zu schützen. Deaktivieren um Bandbreite zu sparen." - "Wenn aktiviert wird Tor OR Verbindungen nicht allzu lange aufrecht erhalten und zudem weniger Padding senden. Aktivieren um Bandbreite zu sparen." - "Eine Ausschlussliste von Ländercodes für Exit Nodes - Knoten, die als Übergabepunkte ins Internet fungieren." - "Eine Liste von Ländercodes für Exit Nodes - Knoten, die als Übergabepunkte ins Internet fungieren." + Diese Option regelt Tors Padding-Verhalten, um vor gewissen Formen von Verkehrsanalyse zu schützen. Deaktivieren, um Bandbreite zu sparen. + Wenn aktiviert, wird Tor OR-Verbindungen nicht allzu lange aufrechterhalten und zudem weniger Padding senden. Aktivieren, um Bandbreite zu sparen. + Eine Ausschlussliste von Ländercodes für Ausgangsknoten – Knoten, die als Übergabepunkte ins Internet fungieren. + Eine Liste von Ländercodes für Ausgangsknoten – Knoten, die als Übergabepunkte ins Internet fungieren. "Eine Liste von Ländercodes, die für das Aufbauen eines Circuits ausgeschlossen werden." "Eine Liste von Ländercodes für Knoten, die für den Einstieg in deinen normalen Circuit verwendet werden." - "Wenn StrictNodes aktiviert ist wird Tor ausschliesslich die ExcludeNodes Option als Vorraussetzung für alle generierten Circuits heranziehen, selbst wenn dies für dich die Funktionalität beeinträchtigen sollte." + Wenn StrictNodes aktiviert ist, wird Tor ausschließlich die ExcludeNodes-Option als Vorraussetzung für alle generierten Circuits heranziehen, selbst wenn dies für dich die Funktionalität beeinträchtigen sollte. "Wenn aktiviert, dann wird Tor nur Verbindungen zu ORs aufbauen, die über deine Firewall erreichbar sind (Standard 80 und 443)." - "Überlege alle NUM Sekunden ob ein neuer Circuit aufgebaut werden soll" - "Erlaube einen Circuit wiederzuverwenden, der mindestens NUM Sekunden zuvor erstmalig benutzt wurde, aber füge nie einen neuen Stream einem veralteten Circuit hinzu." - "Falls aktiviert, wird Tor nie 2 Server, deren IPs zu nahe beinander sind,in denselben Circuit aufnehmen. Momentan sind zwei Adressen zu nahe wenn sie sich im gleichen /16 Bereich befinden." - "SOCKS Proxy aktivieren" - "Öffne diesen Port um auf Verbindungen von SOCKS Applikationen zu lauschen." - "HTTPTunnel aktivieren" - "Öffne diesen Port um auf Proxy Verbindungen, die anstelle von SOCKS das HTTP CONNECT Protokoll verwenden, zu lauschen." - "Transparenten Proxy aktivieren" - "Öffne diesen Port um auf transparente Proxy Verbindungen zu lauschen." - "DNS aktivieren" - "Öffne diesen Port um auf UDP DNS Anfragen zu lauschen und sie anonym aufzulösen." - "Wenn deaktiviert, wird Tor kein IPv4 nutzen, um zu Verzeichnisservern oder Einstiegsknoten zu verbinden." - "Wenn aktiviert, wird Tor versuchen IPv6 zu nutzen, um zu Verzeichnisservern oder Einstiegsknoten zu verbinden." + Überlege alle NUM Sekunden, ob ein neuer Circuit aufgebaut werden soll + Erlaube, einen Circuit wiederzuverwenden, der mindestens NUM Sekunden zuvor erstmalig benutzt wurde, aber füge nie einen neuen Stream einem veralteten Circuit hinzu. + Falls aktiviert, wird Tor nie zwei Server, deren IPs zu nahe beinander sind, in denselben Circuit aufnehmen. Momentan sind sich zwei Adressen zu nahe, wenn sie sich im gleichen /16-Bereich befinden. + SOCKS-Proxy + Öffne diesen Port, um auf Verbindungen von SOCKS-Applikationen zu lauschen. + HTTP-Tunnel + Öffne diesen Port, um auf Proxy-Verbindungen zu lauschen, die anstelle von SOCKS das HTTP-CONNECT-Protokoll verwenden. + Transparenter Proxy + Öffne diesen Port, um auf transparente Proxy-Verbindungen zu lauschen. + DNS auflösen + Öffne diesen Port, um auf UDP-DNS-Anfragen zu lauschen und sie anonym aufzulösen. + Wenn deaktiviert, wird Tor kein IPv4 nutzen, um sich mit Verzeichnisservern oder Einstiegsknoten zu verbinden. + Wenn aktiviert, kann Tor versuchen, sich via IPv6 mit Verzeichnisservern oder Einstiegsknoten zu verbinden. "Voreinstellung existiert nicht in dnscrypt-proxy.toml!" - "Host oder IP Unblock" - "Host oder IP Umgehung" + Host oder IP zum Entsperren + Host oder IP zum Umgehen "Bearbeite Host oder IP" "Deaktiviert" "Cache leeren" @@ -237,112 +237,112 @@ "Wähle alle" "Entferne Auswahl" Allgemeine Einstellungen - Erlaube eingehende Verbindungen. - Port auf dem auf eingehende Verbindungen gelauscht wird. + Eingehende Verbindungen + Port, auf dem auf eingehende Verbindungen gelauscht wird. Externe IP des Routers für eingehende Verbindungen. "Aktiviere Kommunikation über IPv4." "Aktiviere Kommunikation über IPv6." - "Router akzeptiert keine Transit Tunnels und deaktiviert somit Transit Traffic komplett." + Router akzeptiert keine Transit-Tunnel und deaktiviert somit Transit-Verkehr komplett. "Router wird überschwemmt werden." "Bandbreitenbegrenzung in KBps." "Max % der Bandbreitenbegrenzung für Transit. 0–100." - "Aktiviere SSU Transport Protokoll (verwende UDP)." - "Aktiviere NTCP2 Transport Protokoll (verwende TCP)." - Aktiviere ntcpproxy - "Spezifiziere Proxy Server für NTCP. Benutze folgende Syntax: http://address:port oder socks://address:port." - "HTTP Proxy" - "HTTP Proxy" - "HTTP Proxy Port" - "Port auf dem gelauscht wird (HTTP Proxy)." - "Socks Proxy" - "Socks Proxy" - "Socks Proxy Port" - "Port auf dem gelauscht wird (SOCKS Proxy)." - "SAM Schnittstelle" - "SAM Schnittstelle" - "SAM Schnittstellenport" - "Port der SAM Bridge." + Aktiviere SSU-Transportprotokoll (verwende UDP). + Aktiviere NTCP2-Transportprotokoll (verwende TCP). + Ausgehender Proxy + Spezifiziere Proxy-Server für NTCP. Benutze folgende Syntax: http://address:port oder socks://address:port. + HTTP-Proxy + HTTP-Proxy + HTTP-Proxy-Port + Port, auf dem gelauscht wird (HTTP-Proxy). + Socks-Proxy + Socks-Proxy + Socks-Proxy-Port + Port, auf dem gelauscht wird (SOCKS-Proxy). + SAM-Schnittstelle + SAM-Schnittstelle + SAM-Schnittstellenport + Port der SAM-Brücke. "Kryptographie" - "Benutze vorberechnete ElGamal Tabellen." + Benutze vorberechnete Elgamal-Tabellen. "UPnP aktivieren/deaktivieren." "Reseeding" - "Verifiziere su3 Signatur." + Verifiziere su3-Signatur. "Begrenzungen" - "Setze maximale Anzahl von Transit Tunnels ausser Kraft. 2500 Standard." + Setze maximale Anzahl von Transit-Tunneln außer Kraft. Standardmäßig 2500. "Begrenze die Anzahl an offenen Dateien (0 - Benutze Systemgrenze)." - Maximale Grösse der Kerndatei in Kb (0 - Benutze Systemgrenze). - Addressbuch - "Addressbuch Bereitstellungs URL für die Ersteinrichtung." - "Addressbuch Bereitstellungs URLs." + Maximale Größe der Kerndatei in Kb (0 – benutze Systemgrenze). + Adressbuch + Addressbuch-Bereitstellungs-URL für die Ersteinrichtung. + Addressbuch-Bereitstellungs-URLs. "Voreinstellung existiert nicht in i2pd.conf!" "Info" "Es sieht aus, als wäre DNSCrypt vom System beendet worden. Deine Internetverbindung wurde wiederhergestellt. Bitte überprüfe deine Geräteeinstellungen!" "Es sieht aus, als wäre Tor vom System beendet worden. Deine Internetverbindung wurde wiederhergestellt. Bitte überprüfe deine Geräteeinstellungen!" "Es sieht aus, als wäre I2P vom System beendet worden. Bitte überprüfe deine Geräteeinstellungen!" - "Es sieht aus, als könnte sich DNSCrypt NICHT in das Internet verbinden. Du kannst versuchen einen anderen DNSCrypt Server auszuwählen. Die betreffende Auswahl findest du unter Menü->Schnelleinstellungen->DNSCrypt Server" - "Es sieht aus, als könnte Tor NICHT ins Internet verbinden. Dein ISP könnte Tor Verbindungen blockieren. Du kannst versuchen, Tor Bridges zu verwenden. Du findest diese in MENÜ -> Schnelleinstellungen -> Bridges" + Es sieht aus, als konnte sich DNSCrypt nicht mit dem Internet verbinden. Du kannst versuchen, einen anderen DNSCrypt-Server auszuwählen. Die betreffende Auswahl findest du unter Menü → Schnelleinstellungen → DNSCrypt-Server + Es sieht aus, als konnte sich Tor nicht mit dem Internet verbinden. Dein ISP könnte Tor-Verbindungen blockieren. Du kannst versuchen, Tor-Brücken zu verwenden. Du findest diese unter Menü → Schnelleinstellungen → Brücken "Kindersicherung" - "Du kannst die Konfiguration dieser App sperren. Bitte gib hierzu ein Passwort ein oder benutze das Bestehende." + Du kannst die Konfiguration dieser App sperren. Bitte gib hierzu ein Passwort ein oder benutze das bestehende. "Bitte Passwort eingeben." "Falsches Passwort!" "Kontrollpanel entsperrt" "Kontrollpanel gesperrt" - "HOTSPOT" + Hotspot "Speichere Logs" "Pfad für Logs:" "Logs gespeichert. Bitte sende InvizibleLogs.txt an den Entwickler. Du findest die Logs in folgendem Ordner:" "Update" - "Einige InviZible Module sind bereit für ein Update. Möchtest du die Updates durchführen? Dies wird die Moduleinstellungen überschreiben!" - "Update" + Einige InviZible-Module sind bereit für eine Aktualisierung. Möchtest du die Aktualisierungen surchführen? Dies wird die Moduleinstellungen überschreiben! + Aktualisierung "Später" - "Nicht wieder fragen" - "Bitte starte InviZible Pro neu und erlaube die komplette Installation! Konfiguriere nach der Installation HOTSPOT neu, falls du ihn benutzt!" + Nicht erneut fragen + Bitte starte InviZible Pro neu und erlaube die komplette Installation! Konfiguriere nach der Installation den Hotspot neu, falls du ihn benutzt! "Datei wird heruntergeladen" "Der Download wurde abgebrochen" "DOWNLOAD ABBRECHEN" "Neue Version:" - "Ein InviZible Pro Update ist verfügbar. Möchtest du es herunterladen und installieren? Die Installation läuft im Hintergrund weiter." - "DNSCrypt Update ist verfügbar. Möchtest du es herunterladen und installieren? Die Installation läuft im Hintergrund weiter." - "Tor Update ist verfügbar. Möchtest du es herunterladen und installieren? Die Installation läuft im Hintergrund weiter." - "Purple I2P Update ist verfügbar. Möchtest du es herunterladen und installieren? Die Installation läuft im Hintergrund weiter." - Überprüfe auf Updates - Bitte warte während auf Updates geprüft wird - "Der Update Server ist temporär nicht erreichbar. Bitte versuche es später noch einmal." - "Der Update Server war nicht erreichbar." - "Fehler beim Update." - Es wurden keine Updates gefunden. + Eine InviZible-Pro-Aktualisierung ist verfügbar. Möchtest du sie herunterladen und installieren? Die Installation läuft im Hintergrund weiter. + DNSCrypt-Aktualisierung ist verfügbar. Möchtest du sie herunterladen und installieren? Die Installation läuft im Hintergrund weiter. + Tor-Aktualisierung ist verfügbar. Möchtest du sie herunterladen und installieren? Die Installation läuft im Hintergrund weiter. + Purple-2P-Aktualisierung ist verfügbar. Möchtest du sie herunterladen und installieren? Die Installation läuft im Hintergrund weiter. + Prüfen auf Aktualisierungen + Bitte warte, während auf Aktualisierungen geprüft wird + Der Update-Server ist temporär nicht erreichbar. Bitte versuche es später noch einmal. + Der Update-Server war nicht erreichbar. + Fehler beim Aktualisieren. + Es wurden keine Aktualisierungen gefunden. "Letzte Überprüfung:" - "Updates wurden gefunden." - "Updates wurden installiert." + Aktualisierungen wurden gefunden. + Aktualisierungen wurden installiert. "Es sieht aus, als hättest du mit diesem Code bereits 3 Kopien von InviZible aktiviert. Falls dies nicht zutrifft, kontaktiere bitte den Entwickler." - "Es sieht aus, als wäre dein PRO Code falsch. Bitte kontaktiere den Entwickler." - "Du hast bereits mehr als 5x am Tag nach InviZible Pro Updates gesucht. Bitte versuche es später noch einmal." - "Dies sieht nach einer inoffiziellen Version von InviZible aus. Bitte pass auf!" - "Nur in der PRO Version" + Es sieht aus, als wäre dein PRO-Code falsch. Bitte kontaktiere den Entwickler. + Du hast bereits mehr als 5x am Tag nach InviZible-Pro-Aktualisierungen gesucht. Bitte versuche es später noch einmal. + Dies sieht nach einer inoffiziellen Version von InviZible aus. Bitte sei vorsichtig! + Nur in der PRO-Version "Spenden" - InviZible Pro Project braucht deine Unterstützung. Bitte besuche die Spendenseite oder gib deinen Registrierungscode ein. + Das InviZible-Pro-Projekt braucht deine Unterstützung. Bitte besuche die Spendenseite oder gib deinen Registrierungscode ein. "Besuchen" "Code eingeben" "Code eingeben" - "InviZible Pro Project und sein Entwickler möchten sich für deine Unterstützung bedanken. Möchtest du den Download und das Upgrade auf PRO durchführen? Die Installation läuft im Hintergrund weiter." - "Remote Listen von verfügbaren Relays." - "VPN Modus ist aktiv" - "VPN Modus ist aus" - "VPN Modus Fehler!" - "Bitte konfiguriere die Benutzung des Proxy Servers in den Einstellungen des verbundenen Gerätes. Standard Werte sind: IP:10.1.10.1 Port:8118" - "Verstecke deine IP mit TOR" - "Mit DNSCRYPT schützen" + Das InviZible-Pro-Projekt und sein Entwickler möchten sich für deine Unterstützung bedanken. Möchtest du den Download und das Upgrade auf PRO durchführen? Die Installation läuft im Hintergrund weiter. + Remote-Listen von verfügbaren Relays. + VPN-Modus ist aktiv + VPN-Modus ist aus + VPN-Modus-Fehler! + Bitte konfiguriere die Benutzung des Proxy-Servers in den Einstellungen des verbundenen Gerätes. Die Standardwerte sind: IP:10.1.10.1 Port:8118 + Verschleiere deine IP mit TOR + Schütze dich mit DNSCRYPT "Zugang zum I2P-Netzwerk mit Purple I2P" "Eigenen Server hinzufügen" - "Ungültige Server Konfiguration. Bitte überprüfe das SDNS Feld." + Ungültige Server-Konfiguration. Bitte überprüfe das SDNS-Feld. "Bitte beachte, dass du momentan bereits einen Einkauf getätigt hast:" - InviZible Pro Project braucht deine Unterstützung. Drücke OK um die Premium Features kostenpflichtig zu erwerben. - "Es tut mir leid, aber dein Einkauf kann leider nicht bestätigt werden. Eine Rückerstattung erolgt nach 3 tagen." - "Leider ist dieses Feature nur in der Premium Version verfügbar." + Das InviZible-Pro-Projekt braucht deine Unterstützung. Drücke auf OK, um die Premium-Funktionen kostenpflichtig zu erwerben. + Es tut mir leid, aber dein Einkauf kann leider nicht bestätigt werden. Eine Rückerstattung erolgt nach 3 Tagen. + Leider ist diese Funktion nur in der Premiumversion verfügbar. \t Vielen Dank, dass du dich für InviZible Pro entschieden hast. Ich hoffe, dass du dich damit gut geschützt und angenehm im Internet bewegen kannst. \n\n\tInviZible Pro beinhaltet Tor, DNSCrypt und Purple I2P als Module. - \n\n\tInviZible Pro kann Root benutzen, falls dein Gerät dies erlaubt, oder alternativ ein lokales VPN anbieten, das Internetverkehr an Tor, DNSCrypt und I2P Netzwerke weiterleitet. + \n\n\tInviZible Pro kann Root benutzen, falls dein Gerät dies erlaubt, oder alternativ ein lokales VPN anbieten, das Internetverkehr über die Tor-, DNSCrypt- und I2P-Netzwerke weiterleitet. \n\n\tCopyright © 2019-2024 \n\tGarmatin Oleksandr \n\tinvizible.soft@gmail.com @@ -354,96 +354,96 @@ "Ausgehende SOCKS Proxy Adresse" "Ausgehender SOCKS Proxy Port" "Speichere Änderungen" - "Verwerfe Änderungen" + Verwirf Änderungen "Bearbeite dnscrypt-proxy.toml direkt" "Bearbeite tor.conf direkt" "Bearbeite i2pd.conf direkt" "Bearbeite tunnels.conf direkt" "Möchtest du die Änderungen speichern ? Dies kann die Funktionalität von InviZible Pro beeinträchtigen." - "Benutze Server die über IPv4 erreichbar sind" - "Benutze Server die über IPv6 erreichbar sind" - "Importiere Forwarding Regeln" - "Importiere eine Forwarding Regeldatei. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt." - "Lösche Forwarding Regeln" - "Importiere Cloaking Regeln" - "Importiere eine Cloaking Regeldatei. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt." - "Lösche Cloaking Regeln" + Benutze Server, die über IPv4 erreichbar sind + Benutze Server, die über IPv6 erreichbar sind + Importiere Weiterleitungsregeln + Importiere eine Weirerleitungs-Regeldatei. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt. + Lösche Weiterleitungsregeln + Importiere Cloaking-Regeln + Importiere eine Cloaking-Regeldatei. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt. + Lösche Cloaking-Regeln "Importiere Blacklist" - "Importiere eine Liste von Domains oder eine Hosts Datei. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt." + Importiere eine Liste von Domains oder eine Hosts-Datei. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt. "Lösche Blacklist" - "Importiere IP Blacklist" - "Importiere eine IP Blacklist Liste. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt." - "Lösche IP Blacklist" + Importiere IP-Blacklist + Importiere eine IP-Blacklist. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt. + Lösche IP-Blacklist "Importiere Whitelist" "Importiere eine Domain-Liste. Du kannst mehrere Dateien auswählen, doppelte Einträge werden entfernt." "Lösche Whitelist" - "Beantworte IPv6 bezogene Anfragen umgehend leer. Dies beschleunigt Abläufe, wenn keine IPv6 Konnektivität vorhanden ist, kann aber gleichzeitig zu Störungen bei manchen Stub Resolvern führen." - "Bitte schalte \"Privater DNS\" in den Android Netzwerkeinstellungen aus. Diese Option beeinträchtigt DNSCrypt." + Beantworte IPv6-bezogene Anfragen umgehend leer. Dies beschleunigt Abläufe, wenn keine IPv6-Konnektivität vorhanden ist, kann aber gleichzeitig zu Störungen bei manchen Stub-Resolvern führen. + Bitte schalte „Privates DNS“ in den Android-Netzwerkeinstellungen aus. Diese Option beeinträchtigt DNSCrypt. "Importiere Regeln" "Bitte warten... %d Regeln importiert." "Erledigt! %d Regeln wurden importiert." "Erledigt! Die Regeln wurden gelöscht." - "Zuviele Regeln. Nur die ersten 1000 werden angezeigt." - "STUN Server für SnowFlake Bridges" + Zu viele Regeln. Nur die ersten 1000 werden angezeigt. + STUN-Server für Snowflake-Brücken "Teile keine Circuits mit Daten, die an eine andere Zieladresse gerichtet sind." "Teile keine Circuits mit Daten, die an einen anderen Zielport gerichtet sind." - "Neue Tor Bridges sind verfügbar. Möchtest du diese aktualisieren?" - "MITM Angriffserkennung" - "ARP Spoofing Erkennung" - Erkenne Man-in-the-middle ARP Spoofing sowie bösartige DHCP Angriffe in WLAN Netzen. - "Blockiere die Internetverbindung wenn ein Angriff erkannt wird" - "Die Internetverbindung wird während eines Angriffs blockiert" + Neue Tor-Brücken sind verfügbar. Möchtest du diese aktualisieren? + MITM-Angriffserkennung + ARP-Spoofing-Erkennung + Erkenne Man-in-the-middle-ARP-Spoofing sowie bösartige DHCP-Angriffe in WLAN-Netzwerken. + Blockiere die Internetverbindung, wenn ein Angriff erkannt wird + Die Internetverbindung wird während eines Angriffs blockiert werden "Proxy" - "Benutze SOCKS5 Proxy" - "InviZible Pro wird alle Verbindungen durch den SOCKS5 Proxy leiten" + Benutze SOCKS5-Proxy + InviZible Pro wird alle Verbindungen durch den SOCKS5-Proxy leiten "Kompatibilitätsmodus" - Aktivieren falls du ein Gerät mit Custom-ROM nutzt, bei dem die Verbindung abbricht sobald du den START Knopf drückst - "Aktiviere Skript Kontrolle" - "Nutze den folgenden Befehl um Module zu verwalten: \"am broadcast -a pan.alexander.tordnscrypt.SHELL_SCRIPT_CONTROL --ei dnscrypt 1 --ei tor 1 --ei i2p 1 %s\" 1 = Modulstart, 0 = Modulstopp" - "Lokale IP Adresse" - "Aktiviere Fix TTL und konfiguriere das LAN Gerät InviZible zu nutzen. Benutze den Standard Gateway: %1$s, DNS Server: %2$s." - "Unterstützung für Multi-User" - Unterstützung für Dual Apps, MIUI, Island, Shelter und Apps mit Arbeitsprofilen - "Aktiviere SOCKS Ausgabe Proxy" - "Tor wird alle OR Verbindungen durch den SOCKS5 Proxy leiten" + Aktivieren, falls du ein Gerät mit Custom-ROM nutzt, bei dem die Verbindung abbricht, sobald du den Startknopf drückst + Aktiviere Skriptkontrolle + Nutze den folgenden Befehl, um Module zu verwalten: \"am broadcast -a pan.alexander.tordnscrypt.SHELL_SCRIPT_CONTROL --ei dnscrypt 1 --ei tor 1 --ei i2p 1 %s\". Dabei bedeutet 1 Modulstart, und 0 bedeutet Modulstopp. + Lokale IP-Adresse + Aktiviere Fix TTL und konfiguriere das LAN-Gerät, InviZible zu nutzen. Benutze den Standard-Gateway: %1$s, DNS Server: %2$s. + Unterstützung für mehrere Nutzer + Unterstützung für Dual-Apps, MIUI, Island, Shelter und Apps mit Arbeitsprofilen + SOCKS-Ausgabe-Proxy + Tor wird alle OR-Verbindungen durch den SOCKS5-Proxy leiten "Laufende Dienste" - "Update Benachrichtigungen" - "Root Kommandos Benachrichtigung" + Aktualisierungsbenachrichtigungen + Root-Kommandos-Benachrichtigung "Ein Absturzbericht wurde vorbereitet. Möchtest du diesen zum Verbessern von InviZible an den Entwickler senden?" - "Neue Tor Identität" - "Tor Identität gewechselt" - "Proxy Server:" - "Proxy Port:" + Neue Tor-Identität + Tor-Identität gewechselt + Proxy-Server: + Proxy-Port: "Benutzername:" "Passwort:" "Dieses Feld kann leer gelassen werden" "Ausschluss von Programmen" - "Liste von Applikationen zur Direktverbindung. Diese Programme werden weder Tor benutzen, noch sich über den Proxy ins Internet verbinden!" + Liste von Applikationen zur Direktverbindung. Diese Programme werden weder Tor benutzen noch sich über den Proxy ins Internet verbinden! "Bitte wähle zumindest die den Proxy ausführende App, falls du einen lokalen Proxy benutzt." "Benutze Proxy für DNSCrypt" "Benutze Proxy für Tor" "Benutze Proxy für Purple I2P" "Speichern und aktivieren" - "Verbindungsfehler zum Proxy: %s" + Verbinden mit Proxy fehlgeschlagen: %s "Erfolgreiche Verbindung. Ping %s ms." - "ARP Spoofing erkannt!" + ARP-Spoofing erkannt! "Bösartiges DHCP erkannt!" - "Man-in-the-middle Angriff erkannt! Deine Daten können von einem anderen Gerät im lokalen Netzwerk abgefangen werden. WLAN aus- und kurz darauf wieder anschalten. Die Verwendung des derzeitigen Hotspots kann ebenfalls betroffen sein." - "Erkennung von ARP Spoofing auf deinem Gerät wird leider nicht unterstützt!" - "Bitte deaktiviere die Einstiegsknoten in den Tor Einstellungen um Bridges nutzen zu können." - "Umgehe LAN Adressen" - "Benutze Tor nicht für Ziele im LAN und IANA reservierte IP Blöcke." - "Deaktiviere Tor Bridges wenn du Einstiegsknoten verwenden möchtest." - "Firewall Benachrichtigungen" + Man-in-the-middle-Angriff erkannt! Deine Daten können von einem anderen Gerät im lokalen Netzwerk abgefangen werden. WLAN aus- und kurz darauf wieder anschalten. Die Verwendung des derzeitigen Hotspots kann ebenfalls betroffen sein. + Erkennung von ARP-Spoofing auf deinem Gerät wird leider nicht unterstützt! + Bitte deaktiviere die Einstiegsknoten in den Tor-Einstellungen, um Brücken nutzen zu können. + Umgehe LAN-Adressen + Benutze Tor nicht für Ziele im LAN und IANA-reservierte IP-Blöcke. + Deaktiviere Tor-Brücken, wenn du Einstiegsknoten verwenden möchtest. + Firewall-Benachrichtigungen "Firewall" "Alle" "System" "User" "Sortiere nach Namen" "Sortiere nach UID" - "Firewall On/Off" + Firewall an/aus "Möchtest du die Änderungen speichern?" - "Um die Firewall zu aktivieren solltest du mindestens DNSCrypt oder Tor starten." + Um die Firewall zu aktivieren, solltest du zumindest DNSCrypt oder Tor starten. "%s ist installiert" "Internet hierfür erlauben?" "Erlauben" @@ -451,85 +451,92 @@ "Tagesmodus" "Nachtmodus" "Automodus" - "Defaultmodus" - "Erlaube Verbindungen zum lokalen Netzwerk sowie Onion und I2P Seiten" - "Erlaube Verbindungen in WiFi Netzwerken" - "Erlaube Verbindungen in GSM Netzwerken" - "Erlaube Verbindungen im Roaming Modus" + Systemstandard + Erlaube Verbindungen zum lokalen Netzwerk sowie Onion- und I2P-Seiten + Erlaube Verbindungen in WLAN-Netzwerken + Erlaube Verbindungen in GSM-Netzwerken + Erlaube Verbindungen im Roaming-Modus "Erlaube Verbindungen mit aktiviertem VPN" "Alle auswählen" "Alle abwählen" - "Grün - Erlauben, Weiss - Verweigern von Verbindungen" - "Firewall Einstellungen" + Grün – Erlauben, weiß – Verweigern von Verbindungen + Firewall-Einstellungen "Voreinstellung für neue Apps" - "Erlaube Internet Verbindungen für neu installierte Apps" - "Blockiere Internet Verbindungen für neu installierte Apps" - "Bitte deaktiviere den Proxy in den Android WiFi Netzwerkeinstellungen. Diese Option beeinträchtigt InviZible." - "Bitte deaktiviere den Proxy in den Android GSM APN Einstellungen. Diese Option beeinträchtigt InviZible." + Erlaube Internetverbindungen für neu installierte Apps + Blockiere Internetverbindungen für neu installierte Apps + Bitte deaktiviere den Proxy in den Android-WLAN-Netzwerkeinstellungen. Diese Option beeinträchtigt InviZible. + Bitte deaktiviere den Proxy in den Android-GSM-APN-Einstellungen. Diese Option beeinträchtigt InviZible. "Hilfsbenachrichtigungen" - "DNS Rebinding Schutz" - "Blockiere Seite wenn eine DNS Rebinding Attacke erkannt wird" - "DNS Rebinding" - "Potentielle DNS Rebinding Attacke erkannt! Seite %s wurde blockiert" + DNS-Rebinding-Schutz + Blockiere Seite, wenn eine DNS-Rebinding-Attacke erkannt wird + DNS-Rebinding + Potentielle DNS-Rebinding-Attacke erkannt! Seite %s wurde blockiert "Bist du sicher? Diese Aktion kann nicht rückgängig gemacht werden!" "Einstellungen zurücksetzen" "Backup gespeichert" "Backup wiederhergestellt" - "Das InviZible Pro Projekt und sein Entwickler möchten sich für deine Unterstützung bedanken." - "Versuche die eingebaute Crypto Hardware Beschleunigung zu nutzen falls verfügbar" + Das InviZible-Pro-Projekt und sein Entwickler möchten sich für deine Unterstützung bedanken. + Versuche, die eingebaute Kryptografie-Hardwarebeschleunigung zu nutzen, falls verfügbar "Verbinde..." "Warten auf Verbindung..." - "Wechsle Tor IP" - "Tor IP wird gewechselt" + Wechsle Tor-IP + Tor-IP wird gewechselt "Du hast mehr als 3 Kacheln zu den Schnelleinstellungen hinzugefügt. Bitte belasse es bei 3. Das Hinzufügen von mehr als 3 Kacheln kann Probleme verursachen." "Erkennung von bösartigem DHCP" - Erkenne bösartige Man-in-the-middle DHCP Attacken in Wi-Fi Netzwerken. + Erkenne bösartige Man-in-the-middle-DHCP-Attacken in WLAN-Netzwerken. "Wähle ein Rendezvous" "Versteckt den Domänennamen des Brokers vor dem ISP. Der Broker wird verwendet, um eine Verbindung aufzubauen." - "Voreinstellung für App Anzeige" - "Apps werden unabhängig von ihrem Internet Status angezeigt." - "Nur Apps mit Internet Erlaubnis werden angezeigt." + Voreinstellung für App-Anzeige + Apps werden unabhängig von ihrem Internetstatus angezeigt. + Nur Apps mit Internetberechtigung werden angezeigt. "Aus-Schalter" - "Blockiere die Internet Verbindung sobald Tor, DNSCrypt oder I2P gestoppt wurden." - "Die Internet Verbindung wurde aufgrund des Aus-Schalters blockiert. Starte Tor, DNSCrypt oder I2P um sie zu reaktivieren. Alternativ kann der Aus-Schalter in den Einstellungen deaktiviert werden." + Blockiere die Internetverbindung, sobald Tor, DNSCrypt oder I2P gestoppt wurden. + Die Internetverbindung wurde aufgrund des Aus-Schalters blockiert. Starte Tor, DNSCrypt oder I2P, um sie zu reaktivieren. Alternativ kann der Aus-Schalter in den Einstellungen deaktiviert werden. "Liste ist leer" "Automatisch" "BusyBox des Gerätes verwenden" - "BusyBox des Programmes verwenden" + BusyBox des Programms verwenden "BusyBox nicht verwenden" "IPTables des Gerätes verwenden" "IPTables des Gerätes verwenden" - "Warten auf die xTables Sperre" - "Warten bis die IPTables-Sperre greift, um gleichzeitige Änderung von IPTables-Regeln zu verhindern." + Warten auf die xTables-Sperre + Warten, bis die IPTables-Sperre greift, um gleichzeitige Änderung von IPTables-Regeln zu verhindern. "Überprüfung auf Internetverbindung" - "Echtzeit Logs" - "Zeige Programmverbindungslogs im DNS Reiter" - "Unterstützung für HTTP/3 aktivieren (DoH3, HTTP über QUIK). Beachte, dass hierbei normalerweise im Gegensatz zu anderen HTTP Versionen (aber analog zu DNSCrypt) UDP und Port 443 anstelle von TCP benutzt wird." - "SSU2 Transport Protokoll aktivieren (Benutze UDP)." + Echtzeitlogs + Zeige Programmverbindungslogs im DNS-Reiter + Unterstützung für HTTP/3 aktivieren (DoH3, HTTP über QUIK). Beachte, dass hierbei normalerweise im Gegensatz zu anderen HTTP-Versionen (aber analog zu DNSCrypt) UDP und Port 443 anstelle von TCP benutzt wird. + SSU2-Transportprotokoll aktivieren (benutze UDP). "Später nachfragen" - "Benachrichtigungen sind essentiell, um wichtige Informationen über InviZibles Vorgänge, Status und entdeckte Angriffe anzuzeigen. Möchtest du Benachrichtigungen für InviZible erlauben?" - "Aktiviere diese Option nur, wenn du dich in einem IPv6 Netzwerk befindest und IPv4 Adressen nicht mehr erreichbar sind. Andernfalls wirst du keinerlei Verbindungen mehr aufbauen können." - "Verwendete statische IPv6 Präfixe." - "IPv6 bridges" + Benachrichtigungen sind essenziell, um wichtige Informationen über App-Vorgänge, den App-Status und entdeckte Angriffe anzuzeigen. Möchtest du Benachrichtigungen für InviZible erlauben? + "Aktiviere diese Option nur, wenn du dich in einem IPv6-Netzwerk befindest und IPv4-Adressen nicht mehr erreichbar sind. Andernfalls wirst du keinerlei Verbindungen mehr aufbauen können." + Verwendete statische IPv6-Präfixe. + IPv6-Brücken "Achtung" - InviZible Pro kann %1$s nicht starten! Bitte versuchen Sie, die Einstellungen von %2$s zurückzusetzen. Wenn dies nicht hilft, starten Sie bitte Ihr Gerät neu. + InviZible Pro kann %1$s nicht starten! Bitte versuche, die Einstellungen von %2$s zurückzusetzen. Wenn dies nicht hilft, starte bitte dein Gerät neu. "Zurücksetzen" "SNI vortäuschen" - "Tor verfolgt die letzten Verbindungen zu Hosts und versucht, die jeweiligen Exit-Nodes wiederzuverwenden. Diese Option kann dazu beitragen, endlose Captchas zu vermeiden." + Tor verfolgt die letzten Verbindungen zu Hosts und versucht, die jeweiligen Ausgangsknoten wiederzuverwenden. Diese Option kann dazu beitragen, endlose Captchas zu vermeiden. "Akku-Leistungsoptimierung stoppen?" "Datensparmodus deaktivieren?" - "Bitte erlaube sowohl reguläre als auch Hintergrunddaten während der Datensparmodus aktiv ist. Dies ist für eine reibungslose Onlineerfahrung essentiell." - "Führe Root Befehle aus..." + Bitte erlaube sowohl reguläre als auch Hintergrunddaten, während der Datensparmodus aktiv ist. Dies ist für eine reibungslose Onlineerfahrung essentiell. + Führe Root-Befehle aus… "Tor geht in einen Ruhezustand über, wenn für eine bestimmte Zeit keine Client-Aktivität registriert wird. Mindestdauer hierbei 10 Minuten" - "Drücken um hinzuzufügen." - "Langes Drücken um hinzuzufügen." - "Drücken um zu bearbeiten." - "Langes Drücken um zu bearbeiten." + Drücken zum Hinzufügen. + Lang drücken zum Hinzuzufügen. + Drücken zum Bearbeiten. + Lang drücken zum Bearbeiten. "Anonymisiere Relays" "Anonymisierte Relays werden nicht verwendet." "Von Tor ausschliessen" "Route zu Tor" - "UDP von Tor ausschliessen" - "App umgehen" + UDP von Tor ausschließen + Komplett ausschließen "\u2193 Ziehen zum Aktualisieren \u2193" + Gateway zum normalen Internet + Knoten + Isolationseinstellungen + Teile Circuits nicht mit Streams anderer Apps. + Diese System-App zu blockieren, kann zu einer instabilen Internetverbindung führen! + Um diese Option zu aktivieren, solltest du Brücken deaktivieren oder Brücken lediglich mit den Ports 80 und 443 verwenden. + Server verwenden, die das Oblivious-DNS-over-HTTPS-Protokoll implementieren. diff --git a/tordnscrypt/src/main/res/values-es/strings.xml b/tordnscrypt/src/main/res/values-es/strings.xml index 090b9312..62766e8d 100644 --- a/tordnscrypt/src/main/res/values-es/strings.xml +++ b/tordnscrypt/src/main/res/values-es/strings.xml @@ -543,4 +543,5 @@ Puerta de acceso a Internet Dirección del proxy externo (IP o local). Las solicitudes fuera de I2P irán allí. Para activar esta opción, debe desactivar los puentes o utilizar puentes solo con puertos 80 y 443. + No compartas circuitos con streams de diferentes aplicaciones. diff --git a/tordnscrypt/src/main/res/values-fa/strings.xml b/tordnscrypt/src/main/res/values-fa/strings.xml index 8d12a050..1b94ec84 100644 --- a/tordnscrypt/src/main/res/values-fa/strings.xml +++ b/tordnscrypt/src/main/res/values-fa/strings.xml @@ -1,6 +1,6 @@ - "TOR به همراه DNSCrypt و l2P" + تور به همراه DNSCrypt و l2P "بهترین راه‌حل برای حفظ حریم خصوصی شما" "تنظیمات" "I2P متوقف شد" @@ -69,7 +69,7 @@ فعال‌سازی DNSCrypt هنگام راه‌اندازی - شروع TOR هنگام راه‌اندازی مجدد + شروع تور هنگام راه‌اندازی مجدد "شروع خودکار I2P" "تأخیر" @@ -90,7 +90,7 @@ لیست این وب سایت‌ها به طور مستقیم باز می‌شوند. این ویژگی برای سایت‌های پشت CDN کار نمی‌کند محدود‌سازی برنامه‌ها "برنامه‌هایی که مستقیم اجرا شوند" - بازخوانی Interval + بازه بازخوانی تعداد دفعات بازخوانی IPهای وب‌سایت‌ها در یک ساعت (فقط اندورید ۵.۱ به بالا). برای توقف بازخوانی عدد صفر را وارد کنید. "پل‌ها" "از این مورد تنها اگر نمی‌توانید به TOR متصل شوید استفاده کنید" @@ -126,12 +126,12 @@ "دیگر" "مسدود کردن HTTP هات‌اسپات" "مسدودسازی ارتباط به HTTP Port 80 برای هات اسپات" - محافظت از برنامه‌ها در حالت بدون Root برای جلوگیری از بسته شدن برنامه توسط اندروید + محافظت از برنامه‌ها در حالت بدون روت برای جلوگیری از بسته شدن برنامه توسط اندروید "تازه کردن قوانین" "بروزرسانی قوانین برای هر تغییر اتصال" "نمایش اعلان‌ها" "جلوگیری از به خواب رفتن دستگاه" - حفاظت بیش‌تر بدون حالت Root برای جلوگیری از توقف برنامه توسط اندروید. ممکن است باعث تخلیه زودتر باتری شود + حفاظت بیش‌تر بدون حالت روت برای جلوگیری از توقف برنامه توسط اندروید. ممکن است باعث تخلیه زودتر باتری شود "راهنمایی‌ها" همیشه پیغام‌های راهنما را نشان بده لطفا InviZible Pro را در بهینه‌سازی باتری دستگاه قرار ندهید‌. در غیر این صورت، ممکن است اندروید DNSCrypt و TOR و یا I2P را در هر زمان خاموش کند. در بعضی سیستم عامل‌های استثناء همانند سیستم عامل گوشی‌های شیائومی باید چند گام اضافه. @@ -358,7 +358,7 @@ لطفاً از سرور پروکسی در تنظیمات دستگاه‌ متصل استفاده نمایید. مقادیر پیش‌فرض: \nآی‌پی:10.1.10.1 \nپورت:8118 - "پنهان‌سازی IP توسط TOR" + پنهان‌سازی IP توسط تور "حفاظت از DNS توسط DNSCrypt" "دسترسی به سایت‌های I2P توسط Purple I2P" "توجه" @@ -531,4 +531,45 @@ مستثنی کردن به طور کامل "لطفا اجازه فعال شدن background data usage و data usage را هنگامی که ذخیره دیتا روشن است بدهید.این مورد برای تجربه کاربری بهتر مورد نیاز است." نمایش گزارش‌های ارتباط برنامه در تب DNS + قطع اضطراری + فعال کردن پروتکل انتقال SSU2 (استفاده از UDP) + تنظیمات ایزوله + فقط برنامه هایی که می توانند به اینترنت متصل شوند نشان داده می شوند. + مدارها را با جریان های برنامه های مختلف به اشتراک نگذارید. + دروازه ای به اینترنت عادی + پراکسی HTTP در بالادست از آدرس آن (مثل http://false.i2p) + آدرس خارج از پروکسی (آی‌پی یا محلی). درخواست های خارج از I2P به آنجا می روند. + برنامه‌ها بدون در نظر گرفتن اینکه آیا برنامه می‌تواند به اینترنت متصل شود یا نه، نشان داده می‌شوند. + ↓ برای تازه کردن بکشید ↓ + اعلان‌ها برای نمایش اطلاعات مهم درباره عملکرد برنامه، کنترل برنامه و حملات شناسایی‌شده ضروری هستند. آیا می‌خواهید اعلان‌ها را برای InviZible مجاز کنید؟ + برای افزودن فشار دهید. + برای ویرایش فشار دهید. + ناشناس کردن رله ها + جعل نشانگر نام سرور + استفاده از جداول آی پی برنامه + استفاده از جداول آی پی دستگاه + انتظار برای قفل جداول افراطی + برای جلوگیری از تغییر همزمان قوانین جداول آی‌پی منتظر بمانید تا رمز انحصاری آن بدست آید. + اینترنت به دلیل قطع اضطراری مسدود شده است. برای اجازه دادن به اتصال، تور، DNSCrypt یا I2P را راه اندازی کنید. یا قطع اضطراری را در تنظیمات سریع غیرفعال کنید. + اگر در شبکه فقط IPv6 هستید و سایت های IPv4 در دسترس نیستند، این گزینه را فعال کنید. در غیر این صورت آن را فعال نکنید، وگرنه نمی توانید به هیچ چیزی متصل شوید. + اگر تور برای مدت زمان مشخصی استفاده نشود، وارد حالت غیرفعال می شود. باید حداقل 10 دقیقه باشد + بازنشانی + نمایش همه برنامه ها + پشتیبانی از HTTP/3 (DoH3، HTTP از طریق QUIC) را فعال کنید. توجه داشته باشید که مانند DNSCrypt اما بر خلاف سایر نسخه‌های HTTP، به جای TCP از UDP و (معمولا) پورت 443 استفاده می‌کند. + مسدود کردن این برنامه سیستمی ممکن است باعث اتصال اینترنت ناپایدار شود! + لیست خالی + از رله های ناشناس استفاده نمی شود. + تشخیص DHCP ناخواسته + حملات DHCP ناخواسته را در میان شبکه های Wi-Fi شناسایی کنید. + مجموعه ای از پیشوندهای IPv6 ثابت استفاده شده. + انتخاب نوع ارتباط + نام دامنه کارگزار را از ارائه‌دهنده اینترنت مخفی می‌کند. کارگزار برای برقراری ارتباط استفاده می شود. + تور اتصالات اخیر به هاست ها را ردیابی می کند و سعی می کند از همان گره خروجی برای هرکدام مجددا استفاده کند. این گزینه ممکن است به جلوگیری از کپچای بی پایان کمک کند. + برای افزودن طولانی فشار دهید. + بررسی اتصال به اینترنت + برای فعال کردن این گزینه باید پل ها را غیرفعال کنید یا فقط از پل هایی با پورت های 80 و 443 استفاده کنید. + از سرورهایی استفاده کنید که پروتکل Oblivious DNS-over-HTTPS را پیاده سازی می کنند. + برای ویرایش طولانی فشار دهید. + گره ها + InviZible Pro نمی تواند %1$s را شروع کند! لطفاً تنظیمات %2$s را بازنشانی کنید. اگر کمکی نکرد، لطفاً دستگاه خود را راه اندازی مجدد کنید. diff --git a/tordnscrypt/src/main/res/values-fr/strings.xml b/tordnscrypt/src/main/res/values-fr/strings.xml index 74b9903c..e9738fae 100644 --- a/tordnscrypt/src/main/res/values-fr/strings.xml +++ b/tordnscrypt/src/main/res/values-fr/strings.xml @@ -58,9 +58,9 @@ "Choisissez le dossier de sauvegarde:" "Paramètres" "Démarrage automatique" - Lancer DNSCrypt au démarrage - Lancer Tor au démarrage - Lancer I2P au démarrage + Lancer DNSCrypt automatiquement + Lancer Tor automatiquement + Lancer I2P automatiquement "Délai" "Utiliser un délai (en secondes) uniquement si le démarrage automatique ne fonctionne pas correctement" "Serveurs DNSCrypt" @@ -74,11 +74,11 @@ Sélectionner les applications "Liste des applications à utiliser avec Tor" "Liste des applications à utiliser avec InviZible" - Exclure des sites Web - Liste des sites Web à ouvrir directement - Exclure des Applications + Exclure des sites web + Liste des sites web à ouvrir directement. Cette option ne fonctionne pas pour les sites utilisant des CDN + Exclure des applications "Liste d'applications à ouvrir directement" - Intervalle de Rafraîchissement + Intervalle de rafraîchissement Durée en heures entre chaque actualisation des adresses IP des sites Web. Pour Android 5.1 et supérieur. Mettez 0 pour empêcher le rafraîchissement. "Passerelles" "Utilisez-le si vous ne pouvez pas vous connecter au réseau Tor" @@ -97,14 +97,14 @@ "Sauvegarder" "Fermer" "nom d'hôte erroné!" - Sélectionner un Thème - Sélectionner une Langue + Sélectionner un thème + Sélectionner une langue "Bloquer l'http" "Refuser la connexion au port http 80" "Mise à Jour" - Mise à Jours automatique + Mises à jour automatiques Vérifier quotidiennement les versions d\'InviZible Pro et de ses modules - Vérifier les Mise à Jours + Vérifier les mises à jour "Vérifier immédiatement si de nouvelles versions sont disponibles" "Mettre à jour uniquement via Tor" "Vérifier les mises à jour uniquement via Tor et lorsque Tor est en fonctionnement" @@ -114,7 +114,7 @@ "Autre" "Bloquer l'http sur les POINTS D'ACCÈS" "Refuser la connexion au port http 80 sur les POINTS D'ACCÈS" - Protéger l\'application en fonctionnant sans Privilèges pour éviter que l\'application ne soit tuée par Android + Protéger l\'application pour éviter que l\'application ne soit mise en veille par le système android "Rafraîchir les règles" "Mettre à jour les règles à chaque changement de connectivité" "Afficher la notification" @@ -516,4 +516,10 @@ "Activate this option if you are on an ipv6-only network and ipv4 sites become unavailable. Don't enable it otherwise, or you won't be able to connect to anything at all." "Set of used static IPv6 prefixes." "IPv6 bridges" + Relais anonymes + Exclure de Tor + Exclure UDP de Tor + Exclure entièrement + Presser pour éditer. + Presser longtemps pour éditer. diff --git a/tordnscrypt/src/main/res/values-in/strings.xml b/tordnscrypt/src/main/res/values-in/strings.xml index fb2fe83c..7d50ffc6 100644 --- a/tordnscrypt/src/main/res/values-in/strings.xml +++ b/tordnscrypt/src/main/res/values-in/strings.xml @@ -494,4 +494,58 @@ \n\tinvizible.soft@gmail.com \n\tinvizible.net/en/privacy + Tanyakan nanti + Log waktu nyata + Pengaturan isolasi + Pintu gerbang ke internet biasa + Proxy HTTP upstream out url proxy (seperti http://false.i2p) + Alamat outproxy (IP atau lokal). Permintaan di luar I2P akan masuk ke sana. + Jangan berbagi sirkuit dengan stream dari aplikasi yang berbeda. + Aktifkan protokol transport SSU2 (gunakan UDP). + Reset + Memblokir aplikasi sistem ini dapat mengakibatkan koneksi internet tidak stabil! + Aplikasi ditampilkan terlepas dari apakah aplikasi tersebut dapat terhubung ke Internet atau tidak. + Pemeriksaan konektivitas internet + Tekan untuk menambahkan. + Tekan lama untuk mengedit. + Anonimkan relai + Relay anonim tidak digunakan. + Menonaktifkan penghemat data jaringan? + Gunakan server yang mengimplementasikan protokol Oblivious DNS-over-HTTPS. + Kumpulan awalan IPv6 statis yang digunakan. + Tampilkan semua aplikasi + Hanya aplikasi yang dapat tersambung ke Internet yang ditampilkan. + Kecualikan dari Tor + Rute ke Tor + Mengecualikan UDP dari Tor + Kecualikan seluruhnya + Jembatan IPv6 + Menampilkan log koneksi aplikasi di tab DNS + Mendeteksi serangan DHCP jahat Man-in-the-Middle di jaringan Wi-Fi. + Tombol pemutus + Blokir koneksi internet ketika Tor, DNSCrypt, dan Purple I2P dihentikan + Izinkan penggunaan data latar belakang dan izinkan penggunaan data saat Penghemat data aktif. Hal ini penting untuk pengalaman online yang lancar. + Berhenti mengoptimalkan penggunaan baterai? + Auto + Gunakan perangkat BusyBox + Gunakan aplikasi BusyBox + Tidak menggunakan BusyBox + Internet diblokir karena tombol Kill. Mulai Tor, DNSCrypt atau I2P untuk mengizinkan koneksi. Atau nonaktifkan tombol Pemutus di Pengaturan Umum. + Aktifkan dukungan untuk HTTP/3 (DoH3, HTTP over QUIC). Perhatikan bahwa, seperti DNSCrypt tetapi tidak seperti versi HTTP lainnya, ini menggunakan UDP dan (biasanya) port 443, bukan TCP. + Aktifkan opsi ini jika Anda berada di jaringan khusus IPv6 dan situs IPv4 tidak tersedia. Jangan aktifkan jika tidak, atau Anda tidak akan dapat tersambung ke apa pun. + Daftar Kosong + Untuk mengaktifkan opsi ini, Anda harus menonaktifkan bridge atau menggunakan bridge dengan port 80 dan 443 saja. + Tor akan melacak koneksi terakhir ke host dan mencoba menggunakan kembali node keluar yang sama untuk setiap koneksi. Opsi ini dapat membantu menghindari captcha yang tidak ada habisnya. + Gunakan aplikasi iptables + Tunggu hingga xtables terkunci + Tor memasuki kondisi tidak aktif jika tidak melihat aktivitas klien selama waktu tertentu. Setidaknya harus 10 menit + Tekan untuk mengedit. + Deteksi DHCP nakal + Gunakan perangkat iptables + Tunggu hingga kunci iptables eksklusif dapat diperoleh untuk mencegah modifikasi aturan iptables secara bersamaan. + Menyembunyikan nama domain broker dari penyedia Internet. Broker digunakan untuk membuat koneksi. + InviZible Pro tidak dapat memulai %1$s! Coba atur ulang pengaturan %2$s. Jika hal ini tidak membantu, mulai ulang perangkat Anda. + ↓ Tarik untuk menyegarkan ↓ + Pemberitahuan sangat penting untuk menampilkan informasi penting tentang operasi aplikasi, kontrol aplikasi, dan serangan yang terdeteksi. Apakah Anda ingin mengizinkan pemberitahuan untuk InviZible? + Tekan lama untuk menambahkan. diff --git a/tordnscrypt/src/main/res/values-pl/strings.xml b/tordnscrypt/src/main/res/values-pl/strings.xml index 59aefb1a..cdb40756 100644 --- a/tordnscrypt/src/main/res/values-pl/strings.xml +++ b/tordnscrypt/src/main/res/values-pl/strings.xml @@ -1,7 +1,7 @@ "Tor z DNSCrypt oraz I2P" - "najlepsze rozwiazanie dla Twojej prywatnosci" + najlepsze rozwiązanie dla Twojej prywatnosci "Ustawienia" "I2P Zatrzymane" "I2P Uruchomione" @@ -10,9 +10,9 @@ "Instalacja I2P" "I2P Zainstalowane" "I2P Nie zainstalowane" - "Uruchom podczas startu urzadzenia" - "Sprawdzam czy Root jest dostepny…" - "Prosze czekac…" + Uruchom przy starcie systemu + Sprawdzam, czy Root jest dostępny… + Proszę czekać… Nie pokazuj "DNSCrypt zatrzymany" "DNSCrypt zainstalowany" @@ -26,306 +26,306 @@ "Instalacja Tor" "Tor nie zainstalowany" "Uruchamianie Tor" - "Zalaczanie" + Łączenie "Tor uruchomiony" "Zatrzymywanie Tor" "Anuluj" - "Blad!" - "Ostrzezenie!" + Błąd! + Ostrzeżenie! "Instaluj" - "Wyjdz" + Wyjdź "Gotowe" - "Cos poszlo zle!" - "Czy chcesz dokonczyc instalacje?" + Coś poszło źle! + Czy chcesz dokończyć instalację? "Wersja premium" - "Zgadzam sie" - "Nie zgadzam sie" - "Mozesz uzywac InviZible Pro z lokalnym trybem VPN lub aplikacjami z własnym proxy lub lokalna funkcja VPN w trybie proxy." - "Możesz uzywac InviZible Pro z aplikacjami z wlasnym proxy lub lokalna funkcja VPN w trybie proxy." - "Blad zapisu pliku!" - "Ustawienia wspolne" + Zgadzam się + Nie zgadzam się + Możesz używać InviZible Pro z lokalnym trybem VPN lub aplikacjami z własnym proxy lub lokalną funkcją VPN w trybie proxy. + Możesz używać InviZible Pro z aplikacjami z własnym proxy lub lokalną funkcją VPN w trybie proxy. + Błąd zapisu pliku! + Ustawienia wspólne "Ustawienia DNSCrypt" "Ustawienia Tor" "Ustawienia I2P" "Szybkie ustawienia" - "Zapisz kopie & Przywroc" + Zapisz & Przywróć kopie "O programie" "Logi" - "Dotuj" - "Przywroc wszystko" + Wspomóż + Przywróć wszystko "Zapisz wszystko" - "Sciezka folderu:" + Ścieżka folderu: "Wybierz folder kopii zapasowej:" "Ustawienia" "Uruchomienie automatyczne" - Uruchom DNSCrypt przy starcie systemu - Uruchom Tor przy starcie systemu - Uruchom I2P przy starcie systemu - "Opoznij" + Autostart DNSCrypt + Autostart Tor + Autostart I2P + Opóźnienie "Użyj opóźnienia (w sekundach) tylko wtedy, gdy Autostart nie działa prawidłowo" "Serwery DNSCrypt" "Wybierz serwery DNSCrypt" "Ustawienia Tora" "Ustawienia routingu" - "Przekieruj caly ruch przez Tor" - "Przekieruj caly ruch przez InviZible" - Wybierz strony web - Lista stron web do otwierania przez Tor - Wybierz aplikacje - "Lista aplikacji laczacych sie przez Tor" - "Lista aplikacji laczacych sie przez InviZible" - Wyklucz stony web - Lista stron web laczacych sie bezposrednio + Przekieruj cały ruch przez sieć Tor + Kieruj cały ruch przez InviZible + Wybrane witryny + Lista witryn otwieranych za pomocą Tora. Ta funkcja nie działa w przypadku witryn za CDN + Wybór aplikacji + Lista aplikacji łączących się przez Tor + Lista aplikacji łączących się przez InviZible + Wykluczone witryny + Lista witryn do bezpośredniego otwarcia. Ta funkcja nie działa w przypadku witryn obsługujących CDN Wyklucz aplikacje - "Lista aplikacji laczacych sie bezposrednio" - Czestotliwosc odswiezania - Czestotliwosc odswiezania IP stron w godzinach. Dla Androida 5.1 i wyzej. 0 blokuje odswiezanie. + Lista aplikacji otwierana bezpośrednio + Częstotliwość odświeżania + Okres w godzinach do odświeżenia adresu IP witryny. Dla systemu Android 5.1 i nowszych. Ustaw 0, aby zatrzymać odświeżanie. "Mostki" - "Zastosuj jesli nie mozesz polaczyc sie z siecia Tor" - "Nie uzywaj mostkow" - "Uzyj listy domyslnej" - "Zastosuj wlasna liste mostkow" + Użyj go, jeśli nie możesz połączyć się z siecią Tor + Nie używaj mostów + Użyj domyślnej listy mostów + Użyj własnej listy mostów "Zadane mostki" "Dodaj mostki" "Edytuj mostek" - "Prosze najpierw deaktywowac mostek!" - "Obfuskacja" - "Prosze wybrac typ obfuskacji:" - "Wprowadz znaki z obrazka" - "Wysylam zadanie listy mostkow" - "Twoje nowe mostki z bridges.torproject.org:" + Najpierw dezaktywuj most! + Maskowanie + Wybierz typ zaciemnienia: + Wprowadź znaki z obrazu + Żądanie nowych mostów + Nowe mosty z bridges.torproject.org: "Zapisz" "Zamknij" - "Bledna nazwa hosta!" - Wybierz schemat - Wybierz jezyk + Błędna nazwa hosta! + Wybierz motyw + Wybierz język "Zablokuj ruch http" - "Zablokuj polaczenia z portem http 80" - "Aktualizacja" - Aktualizacja automatyczna - Sprawdzaj aktualizacje InviZible Pro i modulow codziennie - Sprawdz aktualizacje - "Sprawdz czy sa dostepne nowe wersje" + Zablokuj połączenia z portem http 80 + Aktualizacje + Aktualizacje automatyczne + Codziennie sprawdzaj aktualizacje InviZible Pro i modułów + Sprawdź aktualizację + Sprawdź, czy dostępne są nowe wersje "Aktualizuj tylko przez Tor" "Sprawdzaj aktualizacje tylko przez Tor" - "Uzyj uprawnien Roota" - "Uruchom moduly z uprawnieiami Roota" - "Zastosuj uprawnienia Roota do DNSCrypt, Tor, I2P. To ustawienie pozostawia moduly nie zarzadzane, moze powodowac problemy z polaczeniem!" - "Inne" - "Zablokuj Punkt Dostepu po http" - "Odmow polaczenia na port http 80 dla Punktu Dostepu" - Zapobiega zamknieciu aplikacji uruchomionej bez praw roota przez system - "Odswiez reguly" - "Zaktualizuj reguly przy kazdej zmianie lacznosci" + Użyj uprawnień Roota + Uruchom moduły z uprawnieniami Roota + Użyj uprawnień roota dla modułów DNSCrypt, Tor i I2P. Włączenie tej funkcji pozostawia moduły niezarządzane i może powodować problemy z połączeniem! + Inne + Blokuj HOTSPOT http + Odmów połączenia z portem http 80 dla HOTSPOT + Zapobiegaj zamknięciu aplikacji przez Androida + Odśwież reguły + Aktualizuj reguły przy każdej zmianie łączności "Pokaz powiadomienia" - "Zapobiegaj uspieniu urzadzenia" - Dodatkowa ochrona bez trybu rootowania, aby zapobiec uspieniu aplikacji przez Androida. Moze wyczeprac baterie + Zapobiegaj uśpieniu urządzenia + Nie wolno dopuścić do przejścia urządzenia w tryb uśpienia. Może być przydatny podczas korzystania z HOTSPOT. Rozładowuje baterię! "Podpowiedzi" - Zawsze pokazuj podpowiedzi + Pokaż wszystkie wiadomości, które zostały oznaczone jako niedozwolone do wyświetlania Wyklucz InviZible Pro z optymalizacji baterii Androida, aby uniemożliwić systemowi zakończenie DNSCrypt, Tor lub I2P w dowolnym momencie. Niektóre specjalne systemy, takie jak MIUI, mogą wymagać dodatkowych kroków. "Wybierz BusyBox" - "Punkt dostepu - eksperymentalnie" - Autostart udostepniania polaczenia przy starcie systemu - Zezwol na udostepnianie polaczenia - "Przekieruj caly ruch przez Tor" - "Kieruj caly ruch przychodzacy przez Tor" - Wybierz strony web - Strony otwierane w trybie Punktu Dostepu przez Tor - Wyklucz strony - Stony otwierane bezposrednio przez Punkt Dostepu - Zezwol na udostepnianie I2P - "Naprawić TTL" - TTL zostanie ustawione na 64 przy uzyciu lokalnej sieci VPN. Obsluga jadra nie jest wymagana. Mozna go uzywac tylko w \"root mode\" z wyłączoną opcją \"Run Modules With Root\". Aby naprawic TTL, uruchom DNSCrypt lub / i Tor. - Otworz ustawienia Punktu Dostepu - "Prosze zrestartowac DNSCrypt" - "Prosze zrestartowac Tor" - "Prosze zrestartowac I2P" + HOTSPOT - eksperymentalny + Rozpocznij udostępnianie po uruchomieniu + Zezwalaj na udostępnianie połączenia Tor + Przekieruj cały ruch przez Tor + Kieruj cały ruch przychodzący przez Tor + Wybór witryn + Lista witryn do otwarcia z Tor dla HOTSPOT + Wykluczone witryny + Lista witryn do otwarcia bezpośrednio dla HOTSPOT + Zezwalaj na udostępnianie I2P + Napraw TTL + TTL zostanie ustalony na 64 przy użyciu lokalnej sieci VPN. Obsługa jądra nie jest wymagana. Aby naprawić TTL należy uruchomić DNSCrypt lub/i Tor. + Otwórz konfigurację Punktu Dostępu + Uruchom ponownie DNSCrypt + Uruchom ponownie Tor + Uruchom ponownie I2P "Wybierz iptables" "Zapisz polecenia Roota w logu" - "DNSCrypt, Tor, I2P sa chronione. Nie ukrywaj!" + DNSCrypt, Tor, I2P są chronione. Nie ukrywaj. "Wykonywanie komend Root…" - "Prosze czekac…" + Proszę czekać… "Zapisano ustawienia" - "Ustawienia glowne" - "Dla zaawansowanych! Wiesz co robisz?" + Ustawienia globalne + Tylko dla zaawansowanych użytkowników! "Wybierz przynajmniej 1 serwer!" - "Lokalny port nasluchu." - "Wymaga serwerow (ze zrodla lokalnego i zdalnych) spelniajacych wymogi." - "Zastosuj serwery uzywajace DNSCrypt." - "Zastosuj serwery uzywajace DNS-over-HTTPS." - "Wymaga serwerow spelniajacych wymagania zdalnych zrodel." - "Serwer musi wspierac rozszerzenia DNS security (DNSSEC)." - "Serwer nie moze logowac zapytan (deklarajca serwera!)." - "Serwer nie moze stosowac wlasnej blacklisty (kontrola rodzicielska, blok reklam…)." - "Zawsze stosuj TCP do polaczenia z serwerem." - "Moze byc przydatne jesli przekierowujesz caly ruch przez Tor. W innym przypadku zostaw odznaczone, i tak nie zwieksza ochrony prywatnosci (proksy dnscrypt i tak zaszyfruje wszytko nawet po UDP), i moze tylko zwiekszyc lagi." - "Proxy SOCKS" - "Uruchom proxy" - "Przekieruj calosc ruchu TCP do Tora. Tor nie wspiera UDP - nalezy ustawic rowniez force_tcp." - "port_proxy" - "Inne ustawienia." - Serwer zapasowy. To jest normalny, nieszyfroway serwer DNS, ktory bedzie wykorzystwany tylko dla jednorazowych zapytan przy pobieraniu listy serwerow TYLKO jesli systemowy DNS nie bedzie dostepny. Nie zostanie uzyty jesli bedzie istniala kopia listy serwerow. - "Nie zezwalaj proxy dnscrypt uzywac systemowego DNS. Bezwarunkowo stosuj serwer zapasowy." - "FILTRY" - "Reguly przekierowan" - "Przekierowuj zapytania do wybranych domen przez wybrana grupe serwerow." - "Reguly maskujace" - "Maskowanie zwraca predefiniowany adres dla specyficznych nazw. Pracuje jak plik HOSTS, a takze zwraca adres IP innej nazwy. Wykonuje tez flattening CNAME." - "Logowanie zapytan." - "Zapisuj log zapytan klientow do pliku." - "Uruchom logowanie zapytan" - "Nie zapisuj zapytan tego typu by zredukowac nadmiarowe dane. Zostaw puste by logowac wszystko." - "Otworz log zapytan" - "Logowanie podejrzanych zapytan." - "Logowanie zapytan do nieistniejacych stref. Takie zapytania moga wskazywac na obecnosc malware, uszkodzonych/przestarzalych aplikacji, oraz raportowanie obecnosci przez urzadzenie do innych podmiotow." - "Wlacz logowanie podejrzanych" - "Otworz log podejrzanych zapytan" - "Lista blokowania (blacklista)." - "Blacklista" - "Blacklista jest tworzona przez jeden wpis na linie." - "Blokowanie IP (IP blacklist) wg maski." - "Blacklista IP" - "Blacklista IP tworzona jest przez jeden wpis na linie." - "Whitelista (obejscie Blacklisty)." - "Whitelista" - "Whitelista wspiera takie same zasady jak Blacklista. Jesli nazwa jest znaleziona we Whiteliscie, sesja pominie filtrowanie nazw i IP." + Lokalny port nasłuchu. + Wymagane, aby serwery (ze źródeł statycznych i zdalnych) spełniały określone właściwości + Używaj serwerów implementujących protokół DNSCrypt. + Używaj serwerów implementujących protokół DNS-over-HTTPS. + Wymaga, aby serwery zdefiniowane przez zdalne źródła spełniały określone właściwości + Serwer musi wspierać rozszerzenia DNS security (DNSSEC). + Serwer nie może rejestrować zapytań użytkowników (deklaratywnie). + Serwer nie może wymuszać własnej czarnej listy (do kontroli rodzicielskiej, blokowania reklam...). + Zawsze używaj protokołu TCP do łączenia się z serwerami + Używaj TCP zamiast UDP do łączenia się z serwerami DNSCrypt. Ta opcja powinna być włączona, jeśli używasz DNSCrypt przez Tor. + Proxy SOCKS + Wychodzące proxy + Kieruje wszystkie połączenia TCP do lokalnego przychodzącego serwera proxy Socks5. Tor nie obsługuje UDP, więc ustaw Force TCP na true. + Port proxy + Inne ustawienia + Jest to normalny, niezaszyfrowany resolver DNS, który będzie używany tylko do jednorazowych zapytań podczas pobierania początkowej listy resolverów i tylko wtedy, gdy konfiguracja DNS systemu nie działa. Nigdy nie będzie używany, jeśli listy zostały już zbuforowane. + Nie pozwól, aby DNSCrypt próbował używać systemowych ustawień DNS. Bezwarunkowo używaj resolverów Bootstrap. + Filtry + Reguły przekierowań + Kierowanie zapytań dla określonych domen do dedykowanego zestawu serwerów. + Reguły maskujące + Maskowanie zwraca predefiniowany adres dla specyficznych nazw. Pracuje jak plik HOSTS, a także zwraca adres IP innej nazwy. Wykonuje również spłaszczanie CNAME. + Rejestrowanie zapytań + Zapisuj log zapytań klientów do pliku. + Rejestrowanie zapytań + Nie zapisuj zapytań tego typu by zredukować nadmiarowe dane. Pozostaw puste, aby rejestrować wszystko. + Otwórz log zapytań + Rejestrowanie podejrzanych zapytań + Rejestrowanie zapytań o nieistniejące strefy. Zapytania te mogą ujawnić obecność złośliwego oprogramowania, uszkodzonych/nieaktualnych aplikacji i urządzeń sygnalizujących swoją obecność stronom trzecim. + Rejestrowanie podejrzanych + Otwórz podejrzany Log + Blokowanie na podstawie wzorca (czarna lista) + Czarna lista + Czarna lista składa się z jednego wzorca na linię. + Blokowanie adresów IP na podstawie wzorców (czarna lista adresów IP) + Czarna lista adresów IP + Czarna lista IP składa się z jednego wzorca na linię. + Biała lista oparta na wzorcach (omijanie czarnych list) + Biała lista + Biała lista obsługuje te same wzorce, co czarne listy. Jeśli nazwa pasuje do wpisu na białej liście, odpowiednia sesja ominie nazwy i filtry IP. "Serwery" - "Zrodla" - "Zdalna lista dostepnych serwerow." - "Lista zrodel wygasa po uplywie refresh_delay godzin." - "Przekazniki" - "Zrodla" - "Lista przekaznikow wygasa po uplywie refresh_delay godzin." - "Przekaznik DNSCrypt" + Źródła + Lista zdalnych dostępnych serwerów. + Lista serwerów zostanie zaktualizowana po określonym opóźnieniu w godzinach. + Przekaźniki + Źródła + Lista przekaźników zostanie zaktualizowana po określonym opóźnieniu w godzinach. + Przekaźnik DNSCrypt "Ustawienie nie istnieje w dnscrypt-proxy.toml!" - "Usun log" - "Log zapytan DNSCrypt" - "Log podejrzanych zapytan DNSCrypt" - "Log pusty" - "Natychmiast odpowiedz na zapytania A i AAAA dotyczące nazw hostów bez nazwy domeny." - "Natychmiast reaguj na zapytania dotyczące lokalnych stref zamiast przesylac je do resolverow wyzszego rzedu (zawsze powoduje bledy lub przekroczenia limitu czasu)." - "Gdy Tor musi przydzielic adres wirtualny z powodu polecenia MAPADDRESS lub wlasnosci AutomapHostsOnResolve, Tor wybiera nieprzydzielony adres z tego zakresu." - "Jezeli rozne od zera, sprobuj zapisywac na dysk z mniejsza czestotliwoscia." - "Zarzadza Paddingiem Tora jako proba obrony przed analiza traffica. Zablokuj dla zmniejszenia transmisji danych." - "Jesli wlaczone, Tor nie bedzie podtrzymywal dlugich polaczen OR, oraz bedzie wysylal mniejsze odstepy dla tych polaczen. Wlacz by zmniejszyc transmisje danych." - "Lista krajow wykluczonych przy wyborze exit node, ktore kieruja twoj ruch sieciowy na zewnatrz Tora." - "Lista krajow wybranych jako exit node - beda one przekierowywac twoj ruch na zewnatrz Tora." - "Lista krajow pomijanych przy budowie obwodu." - "Lista krajow z pierwszego kregu obwodu." - "Wlaczenie StrictNodes spowoduje ze Tor bedzie bezwzglednie przestrzegal ograniczen wpisanych w ExcludeNodes dla wszystkich tworzonych obwodow, nawet jesli uniemozliwi to funkcjonowanie." - "Gdy wlaczone, Tor utworzy polaczenia wychodzace tylko OR-ow ktore maja uruchomione porty na uzycie ktorych zezwalaja reguly (domyslnie 80 i 443)." - "Sprawdza czy tworzyc nowy obwod co kazde NUM sekund." - "Umozliwia uzycie obwodu utworzonego maksymalnie NUM sekund temu, ale nigdy nie dolacza nowego strumienia do obwodu zbyt starego." - "Jesli zaznaczone, Tor nie uzyje dwoch serwerow ktorych adresy IP znajduja sie zbyt blisko w tym samym obwodzie. Obecnie adresy sa zbyt blisko jesli oba sa w tym samym /16 zakresie." - "Uruchom proxy SOCKS" - "Otworz port nasluchujacy polaczenia z aplikacji uzywajacych SOCKS." - "Wlacz HTTPTunnel" - "Otworz port nasluchujacy polaczen aplikacji stosujacych protokol HTTP CONNECT zamiast SOCKS." - "Uruchom transparentne proxy" - "Otworz port dla nasluchu polaczen transparentnych." - "Uruchom DNS" - "Otworz ten port do nasluchu zapytan DNS po UDP i rozwiaz anonimowo." - "Jesli zablokowane, Tor bedzie unikal wysylania zapytan do directory servers i nodow wejsciowych po IPv4." - "Jesli zaznaczone, Tor moze komunikowac sie z directory servers i nodami wejsciowymi po IPv6." + Usuń log + Log zapytań DNSCrypt + Log podejrzanych zapytań DNSCrypt + Log jest pusty + Natychmiastowa odpowiedź na zapytania A i AAAA dla nazw hostów bez nazwy domeny. + Natychmiastowe odpowiadanie na zapytania o strefy lokalne zamiast przekazywania ich do resolverów upstream (co zawsze powoduje błędy lub przekroczenie limitu czasu). + Gdy Tor musi przypisać wirtualny (nieużywany) adres z powodu polecenia MAPADDRESS z kontrolera lub funkcji AutomapHostsOnResolve, Tor wybiera nieprzypisany adres z tego zakresu. + Jeśli wartość jest niezerowa, spróbuj rzadziej zapisywać dane na dysku. + Ta opcja reguluje użycie przez Tora wypełnienia w celu ochrony przed niektórymi formami analizy ruchu. Wyłącz, aby zaoszczędzić przepustowość. + Jeśli opcja jest włączona, Tor nie będzie utrzymywał otwartych połączeń OR, oraz będzie wysyłał mniejsze odstępy dla tych połączeń. Włącz, aby zaoszczędzić przepustowość. + Lista kodów krajów, których nigdy nie należy używać podczas wybierania węzła wyjściowego, który dostarcza ruch poza sieć Tor. + Lista kodów krajów do użycia jako węzeł wyjściowy - czyli węzeł, który dostarcza ruch poza sieć Tor. + Lista kodów krajów, których należy unikać podczas tworzenia obwodu. + Lista kodów krajów węzłów do użycia w pierwszym przeskoku w normalnych obwodach. + Jeśli opcja StrictNodes jest włączona, Tor będzie traktował wyłącznie opcję ExcludeNodes jako wymóg, którego należy przestrzegać dla wszystkich generowanych obwodów, nawet jeśli uniemożliwi to funkcjonowanie. + Jeśli ta opcja jest włączona, Tor będzie tworzył połączenia wychodzące tylko do OR działających na portach dozwolonych przez zaporę sieciową (domyślnie 80 i 443). + Sprawdza czy tworzyć nowy obwód co każde NUM sekund. + Używaj obwodu, który został użyty po raz pierwszy co najwyżej NUM sekund temu, ale nigdy nie dołączaj nowego strumienia do obwodu, który jest zbyt stary. + Jeśli ta opcja jest włączona, Tor nie umieści dwóch serwerów, których adresy IP są zbyt blisko siebie, w tym samym obwodzie. Obecnie dwa adresy są zbyt blisko, jeśli leżą w tym samym zakresie /16. + Proxy SOCKS + Otwórz port nasłuchujący połączenia z aplikacji używających SOCKS. + Tunel HTTP + Otwórz port nasłuchujący połączeń aplikacji stosujących protokół HTTP CONNECT zamiast SOCKS. + Przezroczyste proxy + Otwórz ten port, aby nasłuchiwać przezroczystych połączeń proxy. + Rozwiązywanie DNS + Otwórz ten port, aby nasłuchiwać żądań DNS UDP i rozwiązywać je anonimowo. + Jeśli opcja ta jest wyłączona, Tor będzie unikał łączenia się z serwerami katalogów i węzłami wejściowymi przez IPv4. + Jeśli jest włączona, Tor może łączyć się z serwerami katalogów lub węzłami wejściowymi przez IPv6. "Ustawienie nie istnieje w tor.conf!" - "Host lub IP ktory chesz odblokowac" - "Host lub IP ktory chcesz pominac" + Host lub IP, który ma zostać odblokowany + Host lub adres IP dla obejścia "Edytuj Host lub IP" "Zablokowane" "Wyczyść pamięć podręczną" - "Aplikacje laczace sie przez InviZible" - "Aplikacje pomijajace InviZible" + Aplikacje współpracujące z InviZible + Aplikacje pomijające InviZible "Zaznacz wszystko" - "Usun zaznaczenie" - Ustawienia wspolne - Zezwol na polaczenia przychodzace - Port nasluchu polaczen przychodzacych. - Zewnetrzne IP dla polaczen przychodzacych. - "Umozliw komunikacje po IPv4." - "Umozliw komunikacje po IPv6." - "Router nie bedzie akceptowac ruchu tunelowego, calkowicie go blokujac." + Usuń zaznaczenie + Ustawienia wspólne + Połączenia przychodzące + Port do nasłuchiwania połączeń przychodzących (domyślnie: auto (losowy)). + Zewnętrzny adres IP routera dla połączeń przychodzących (domyślnie: auto, jeśli SSU2 jest włączone). + Włącz komunikację przez IPv4. + Włącz komunikację przez IPv6. + Router nie będzie akceptować ruchu tunelowego, całkowicie go blokując. "Ustaw router jako floodfill." "Limit pasma KBps." "Max % pasma na ruch tranzytowy. 0–100." - "Uruchom protokol transferu SSU (uzyj UDP)." - "Uruchom protokol transferu NTCP2 (uzyj TCP)." - Uruchom ntcpproxy - "Okresl serwer proxy dla NTCP. Albo http://address:port albo socks://address:port." + Włącz protokół transportowy SSU (użyj UDP). + Włącz protokół transportowy NTCP2 (użyj TCP). + Wychodzące proxy + Określa serwer proxy dla NTCP. Powinno być http://address:port lub socks://address:port. "proxy HTTP" "proxy HTTP" "port proxy HTTP" - "Port nasluchu (proxy HTTP)." + Port nasłuchu (proxy HTTP). "proxy SOCKS" "proxy SOCKS" "port proxy SOCKS" - "Port nasluchu (Proxy SOCKS)." + Port nasłuchu (Proxy SOCKS). "interfejs SAM" "interfejs SAM" "Port interfejsu SAM" "Port mostka SAM." "Kryptografia" - "Uzyj predefiniowanych tablic ElGamal." - "Udostepnij lub zablokuj UPnP." - "Reseeding" + Używaj predefiniowanych tablic ElGamal. + Włącz lub wyłącz UPnP. + Ponowny zasiew "Zweryfikuj podpis su3." "Ograniczenia" - "Zmien maksymalna ilosc tuneli tranzytowych. Domyslnie 2500." - "Ogranicz ilosc deskryptorow plikow (0 - zastosuj ograniczenie systemowe)." - Maksymalna wielkosc corefile w Kb (0 - zastosuj ograniczenie systemowe). - Ksiazka adresowa - "Subskrybcja URL ksiazki adresowej dla ustawien poczatkowych." - "URL subskrybcji ksiaki adresowej." + Zmień maksymalna ilość tuneli tranzytowych. Domyślnie 2500. + Ogranicz ilość deskryptorów plików (0 - użyj limitu systemowego). + Maksymalny rozmiar pliku rdzenia w Kb (0 - użyj limitu systemowego). + Książka adresowa + Subskrybuj URL książki adresowej dla ustawień początkowych. + URL subskrypcji książki adresowej. "Ustawienie nie istnieje w i2pd.conf!" - "Info" - "Wyglada na to ze system android wylaczyl DNSCrypt. Twoje polaczenie z siecia zostalo przywrocone. Szprawdz ustawienia urzadzenia!" - "Wyglada na to ze system android wylaczyl Tor. Twoje polaczenie z siecia zostalo przywrocone. Szprawdz ustawienia urzadzenia!" - "Wyglada ze system android wylaczyl I2P. sprawdz ustawienia urzadzenia!" - "Wyglada ze DNSCrypt NIE MOZE polaczyc sie z siecia. sprobuj wybrac inne serwery DNSCrypt. Menu-> Ustawienia szybkie -> wybierz serwery DNSCrypt" + Informacje + Wygląda na to ze system android wyłączył DNSCrypt. Połączenie internetowe zostało przywrócone. Sprawdź ustawienia urządzenia! + Wygląda na to ze system android wyłączył Tor. Połączenie internetowe zostało przywrócone. Sprawdź ustawienia urządzenia! + Wygląda na to, że system android wyłączył I2P. Sprawdź ustawienia urządzenia! + Wygląda na to, że DNSCrypt nie może połączyć się z Internetem. Możesz spróbować wybrać inne serwery DNSCrypt. Można je znaleźć w MENU -> Szybkie ustawienia -> Wybierz serwery DNSCrypt "Wygląda na to, że Tor nie może połączyć się z Internetem. Dostawca usług internetowych może blokować połączenia z Torem. Możesz spróbować użyć mostów Tor. Można je znaleźć w MENU -> Szybkie ustawienia -> Mosty" - "Child Lock" - "Mozesz zablokowac dostep do ustawien aplikacji. Wprowadz haslo lub uzyj poprzedniego." - "Wprowadz haslo." - "Bledne haslo!" + Blokada rodzicielska + Możesz zablokować kontrolę nad tą aplikacją. Wprowadź hasło lub użyj poprzedniego. + Wprowadź hasło. + Błędne hasło! "Ustawienia odblokowane" "Ustawienia zablokowane" "Punkt Dostepu" "Zapisz logi" - "Sciezka do logow:" - "Logi zapisane. Wyslij InvizibleLogs.txt do developera. Logi znajduja sie w folderze:" + Ścieżka do logów: + Logi zapisane. Wyślij InvizibleLogs.txt do developera. Logi znajdują się w folderze: "Aktualizacja" - "Jest dostepna aktualizacja niektorych modulow InviZible. Czy chcesz aktualizowac? Aktualizacja nadpisze ustawienia modulow!" + Niektóre moduły InviZible są gotowe do aktualizacji. Czy chcesz je zaktualizować? Spowoduje to nadpisanie ustawień modułów! "Aktualizacja" - "Pozniej" + Później "Nie pytaj ponownie" - "Prosze uruchomic ponownie InviZible Pro i dokonczyc instalacje! Po instalacji ponownie ustaw Punkt Dostepu, jesli go uzywasz!" + Uruchom ponownie InviZible Pro i pozwól na pełną instalację! Po instalacji ponownie skonfiguruj HOTSPOT, jeśli go używasz! "Pobieram plik" - "Pobieranie zostalo zatrzymane" + Pobieranie zostało zatrzymane "Anuluj pobieranie" "Nowa wersja:" - "Jest dostepna nowa wersja InviZible Pro. Czy chcesz ja sciagnac i wykonac aktualizacje? Aktualizacja będzie kontynuowana w tle." - "Jest dostepna aktualizacja DNSCrypt. Czy chcesz ja sciagnac i wykonac aktualizacje? Aktualizacja będzie kontynuowana w tle." - "Jest dostepna aktualizacja Tora. Czy chcesz ja sciagnac i wykonac aktualizacje? Aktualizacja będzie kontynuowana w tle." - "Jest dostepna aktualizacja Purple I2P. Czy chcesz ja sciagnac i wykonac aktualizacje? Aktualizacja będzie kontynuowana w tle." - Sprawdzam aktualizacje - Prosze czekac, sprawdzam aktualizacje. - "Serwer aktualizacji jest czasowo niedostepny. Prosze sprobowac  pozniej." - "Serwer aktualizacji jest niedostepny." - "Blad aktualizacji." - Brak dostepnych aktualizacji. + Aktualizacja InviZible Pro jest dostępna. Czy chcesz ją pobrać i zaktualizować? Aktualizacja będzie kontynuowana w tle. + Aktualizacja DNSCrypt jest dostępna. Czy chcesz ją pobrać i zaktualizować? Aktualizacja będzie kontynuowana w tle. + Aktualizacja Tor jest dostępna. Czy chcesz ją pobrać i zaktualizować? Aktualizacja będzie kontynuowana w tle. + Aktualizacja Purple I2P jest dostępna. Czy chcesz ją pobrać i zaktualizować? Aktualizacja będzie kontynuowana w tle. + Sprawdzanie aktualizacji + Poczekaj na sprawdzenie aktualizacji. + Serwer aktualizacji jest chwilowo niedostępny. Spróbuj ponownie później. + Serwer aktualizacji jest niedostępny. + Błąd aktualizacji. + Nie znaleziono żadnych aktualizacji. "Ostatnio sprawdzono:" "Znaleziono aktualizacje." - "Aktualizacje zostaly zainstalowane." - "Wyglada ze juz aktywowales 3 kopie InviZible z tym kodem. Jesli to blad, skontaktuj sie z developerem." - "Wyglada ze Twoj kod PRO jest bledny. Skontaktuj sie z deweloperem." - "Dzisiaj sprawdziles aktualizacje 5 razy. Sprawdz ponownie pozniej." - "To chyba nie jest oficjalna wersja InviZible. Uwazaj!" + Aktualizacje zostały zainstalowane. + Wygląda na to, że aktywowałeś już 3 kopie InviZible za pomocą tego kodu. Jeśli jest nieprawidłowy, skontaktuj się z deweloperem. + Wygląda na to, że kod PRO jest nieprawidłowy. Skontaktuj się z deweloperem. + Sprawdzałeś aktualizacje InviZible Pro więcej niż 5 razy dziennie. Spróbuj ponownie później. + Wygląda na to, że to nieoficjalna wersja InviZible. Bądź ostrożny! "Tylko wersja PRO" "Dotacja" Projekt InviZible Pro potrzebuje Twojego wsparcia. Odwiedź stronę dotacji lub wprowadź otrzymany kod rejestracyjny. - "Odwiedz" - "Wprowadz kod" - "Wprowadz kod" - "Projekt InviZible Pro Project i jego Autor wyrazaja podziekowania za wsparcie. Czy chcialbys pobrac i wykonac upgrade do wersji PRO? Aktualizacja będzie kontynuowana w tle." + Odwiedź + Wprowadź kod + Wprowadź kod + Projekt InviZible Pro i jego autor wyrażają wdzięczność za pomoc. Chcesz pobrać i zaktualizować do wersji PRO? Aktualizacja będzie kontynuowana w tle. "Zdalne listy dostępnych przekaźników." "Tryb VPN jest aktywny" "Tryb VPN jest wyłączony" @@ -333,197 +333,197 @@ "Skonfiguruj użycie serwera proxy w ustawieniach podłączonego urządzenia. Wartości domyślne: IP:10.1.10.1 Port:8118" "Ukryj adres IP za pomocą TOR" "Ochrona DNSCRYPT" - "Dostep do sieci I2P za pomocą Purple I2P" + Dostęp do sieci I2P za pomocą Purple I2P "Dodaj serwer" "Niepoprawna niestandardowa konfiguracja serwera. Sprawdź pole SDNS." - "Pamiataj, ze masz oczekujacy zakup:" + Pamiętaj, że masz oczekujący zakup: "Projekt InviZible Pro potrzebuje Twojego wsparcia. Naciśnij OK, aby kupić funkcje premium." - "Przepraszamy, ale nie mozna potwierdzic zakupu. Otrzymasz zwrot pieniedzy po 3 dniach." - "Niestety ta funkcja jest dostepna tylko w wersji premium." - "Proxy wychodzace HTTP" - "Adres wychodzacego proxy HTTP" - "Proxy wychodzace SOCKS" - "Adres proxy wychodzacego SOCKS" - "Port proxy wychodzacego SOCKS" + Przepraszamy, ale potwierdzenie zakupu jest niemożliwe. Zwrot pieniędzy nastąpi po 3 dniach. + Niestety ta funkcja jest dostępna tylko w wersji premium. + Proxy wychodzące HTTP + Adres wychodzącego proxy HTTP + Proxy wychodzące SOCKS + Adres proxy wychodzącego SOCKS + Port proxy wychodzącego SOCKS "Zapisz zmiany" - "Pomin zmiany" + Odrzuć zmiany "Edytuj dnscrypt-proxy.toml" "Edytuj tor.conf" "Edytuj i2pd.conf" "Edytuj tunnels.conf" - "Czy chcesz zapisac zmiany? Moze to spowodowac bledy programu." - "Uzyj serwerow dostepnych przez IPv4" - "Uzyj serwerow dostepnych przez IPv6" - "Importuj reguly przekierowujace" - "Importuj plik regul przekierowujacych. Mozesz uzyc wielu plikow, duplikaty przekierowan beda usuniete." - "Usun reguly przekierowujace" - "Importuj reguly maskujace" - "Importuj plik regul maskujacych. Mozesz uzyc wielu plikow, duplikaty beda usuniete." - "Usun reguly maskujace" - "Importuj blackliste" - "Importuj liste domen lub plik hosts. Mozesz uzyc wielu plikow, duplikaty beda usuniete" - "Skasuj blackliste" - "Importuj blackliste IP" - "Importuj pliki blacklisty IP. Mozesz uzyc wielu plikow, duplikaty beda usuniete." - "Skasuj blackliste IP" - "Importuj whiteliste" - "Importuj liste domen. Mozesz uzyc wielu plikow, duplikaty zostana usuniete." - "Skasuj whiteliste" - "Zwracaj natychmiastowo pusta odpowiedz na zapytania IPv6. To ustawienie przyspiesza dzialanie jesli nie ma polaczenia PIv6, jednak moze wywolywac problemy ze stabilnoscia." - "Prosze wylaczyc \"Private DNS\" w ustawieniach Androida. To ustawienie wywoluje konflikty z InviZible" - "Importuj reguly" - "Prosze czekac… zaimportowano %d regul." - "Wykonano! Zaimportowano %d regul." - "Wykonano. Reguly skasowane." - "Zbyt wiele regul do wyswietlenia. Pokazuje pierwsze 1000." - "Serwery STUN dla mostkow SnowFlake" - "Nie udostepniaj obwodow z roznymi adresami docelowymi." - "Nie udostepniaj obwodow z roznymi portami docelowymi." - "Sa dostepne nowe domyslne mostki Tor. Czy chcesz wykonac aktualizacje?" - "Wykrywanie ataku MITM" - "Wykrywanie ARP spoofing" - Wykrywanie atakow MITM, ARP spofing oraz atakow rogue DHCP w sieciach WiFi - "W przypadku wykrycia ataku, blokuj polaczenie z siecia" - "Polaczenie z internetem bedzie zablokowane podczas ataku." + Czy chcesz zapisać zmiany? Może to spowodować uszkodzenie InviZible Pro. + Używaj serwerów dostępnych przez IPv4 + Używaj serwerów dostępnych przez IPv6 + Importuj reguły przekierowujące + Importuj plik reguł przekierowania. Możesz wybrać wiele plików, zduplikowane wiersze zostaną usunięte. + Usuń reguły przekierowujące + Importuj reguły maskujące + Importuj plik reguł maskujących. Możesz użyć wielu plików, duplikaty będą usunięte. + Usuń reguły maskujące + Importuj czarną listę + Importuj listę domen lub plik hosts. Możesz wybrać wiele plików, zduplikowane wiersze zostaną usunięte. + Usuń czarną listę + Importuj czarną listę adresów IP + Importuj czarną listę IP. Można wybrać wiele plików, zduplikowane wiersze zostaną usunięte. + Usuń czarną listę adresów IP + Importuj białą listę + Importuj listę domen. Można wybrać wiele plików, zduplikowane wiersze zostaną usunięte. + Usuń białą listę + Natychmiastowa odpowiedź na zapytania związane z IPv6 z pustą odpowiedzią. Przyspiesza to działanie, gdy nie ma łączności IPv6, ale może również powodować problemy z niezawodnością w przypadku niektórych resolverów stub. + Wyłącz \"Prywatny DNS\" w ustawieniach sieci Android. Ta opcja zakłóca działanie InviZible. + Importuj reguły + Czekaj... Zaimportowano %d reguł. + Wykonano! Zaimportowano %d reguł. + Wykonano. Reguły zostały usunięte. + Zbyt wiele reguł do wyświetlenia. Wyświetlane jest tylko pierwsze 1000. + Serwery STUN dla mostków SnowFlake + Nie należy współdzielić obwodów ze strumieniami kierowanymi na inny adres docelowy. + Nie należy współdzielić obwodów ze strumieniami ukierunkowanymi na inny port docelowy. + Dostępne są nowe domyślne mosty Tor. Czy chcesz je zaktualizować? + Wykrywanie ataków MITM + Wykrywanie fałszowania ARP + Wykrywanie ataków Man-in-the-Middle ARP spoofing i nieuczciwych ataków DHCP w sieciach Wi-Fi. + Blokuj Internet po wykryciu ataku + Połączenie internetowe zostanie zablokowane podczas ataku "Proxy" - "Uzyj proxy socks5" - "InviZible przekieruje wszystkie polaczenia przez proxy SOCKS5" - "Tryb zgodnosci" - Aktywuj jesli masz urzadzenie z modyfikowanym ROMem oraz jesli przycisniecie Start powoduje zerwanie polaczenia + Użyj proxy socks5 + InviZible Pro będzie nawiązywać wszystkie połączenia przez proxy SOCKS5 + Tryb zgodności + Włącz, jeśli urządzenie ma niestandardowy system operacyjny i połączenie jest tracone po naciśnięciu przycisku START "Aktywuj skrypt kontrolny" - "Aby zarzadzac modulami, uzyj nastepujacej komendy: \"am broadcast -a pan.alexander.tordnscrypt.SHELL_SCRIPT_CONTROL --ei dnscrypt 1 --ei tor 1 --ei i2p 1 %s\". Gdzie 1 - uruchamia, 0 - zatrzymuje modul." - "Adres IP urzadzenia LAN" - "Aktywuj Fix TTL i skonfiguruj urzadzenie LAN dla polaczenia InviZible. Uzyj domyslnie: gateway: %1$s, Serwer DNS: %2$s" - "Wsparcie trybu multi-user" - Wsparcie Dual Apps, MIUI, profili Island, Shelter i Work - "Aktywuj proxy wychozace SOCKS" - "Tor przekieruje wszystkie polaczenia OR przez proxy SOCKS 5" - "Uruchomione uslugi" + Użyj następującego polecenia, aby zarządzać modułami aplikacji: \"am broadcast -a pan.alexander.tordnscrypt.SHELL_SCRIPT_CONTROL --ei dnscrypt 1 --ei tor 1 --ei i2p 1 %s\". Gdzie 1 - uruchamia, 0 - zatrzymuje moduł. + Adres IP urządzenia LAN + Włącz Fix TTL i skonfiguruj urządzenie LAN, aby połączyć się z InviZible. Użyj domyślnej bramy: %1$s, serwera DNS: %2$s. + Wsparcie wielu użytkowników + Obsługa aplikacji Dual Apps, MIUI, Island, Shelter i Work profile. Może być nieefektywne w trybie VPN + Serwer proxy SOCKS dla połączeń wychodzących + Tor wykona wszystkie połączenia OR przez proxy SOCKS 5. + Uruchomione usługi "Powiadomienie o aktualizacji" "Powiadomienie o poleceniach roota" - "Wykryto raport awarii. Czy chcesz go wyslac do Tworcy programu aby wspomoc ulepszanie InviZible?" - "Nowa tozsamosc Tora" - "Tozsamosc Tor zostala zmieniona" + Wykryto raport o awarii. Chcesz wysłać go do dewelopera, aby ulepszyć InviZible? + Nowa tożsamość Tor + Tożsamość Tor uległa zmianie "Serwer proxy:" "Port proxy:" - "Uzytkownik:" - "Haslo:" - "To pole moze pozostac puste" - "Aplikacje pomijajace proxy:" - "Lista aplikacji ktore nie beda uzywaly Tor ani proxy do polaczenia z siecia!" - "Prosze zaznaczyc co najmniej aplikacje proxy owner, jezeli uzywasz lokalnego proxy." - "Uzywaj proxy dla DNSCrypt" - "Uzywaj proxy dla Tor" - "Uzywaj proxy dla I2P" + Nazwa użytkownika: + Hasło: + To pole może pozostać puste + Wykluczenia aplikacji + Lista aplikacji do bezpośredniego otwarcia. Aplikacje te nie będą używać Tora ani Proxy do łączenia się z Internetem! + Jeśli korzystasz z lokalnego serwera proxy, wybierz przynajmniej aplikację właściciela serwera proxy. + Używaj proxy dla DNSCrypt + Używaj proxy dla Tor + Używaj proxy dla I2P "Zapisz i uruchom" - "Nie mozna polaczyc sie z proxy: %s" - "Udane polaczenie. Ping: %s ms." - "Wykryto spoofing ARP!" + Nie można połączyć się z proxy: %s + Udane połączenie. Ping: %s ms. + Wykryto fałszowanie ARP! "Wykryto Rogue DHCP!" - "Wykryto atak MITM! Twoje dane moga byc przechwytywane przez inne urzadzenie w sieci lokalnej. Wylacz WiFi, odczekaj kilka sekund i wlacz ponownie. Uzywanie obecnie skonfigurowanego hotspota moze byc niebezpieczne!" - "Wykrywanie spoofingu ARP nie jest wspierane na twoim urzadzeniu" - "Prosze wylaczyc wezly wejsciowe w ustawieniach Tora, inaczej nie mozna uzywac mostkow." - "Bypass adresow LAN" - "Nie uzywaj Tora dla sieci LAN oraz dla blokow IP zarezerwowanych dla IANA" - "Wylacz mostki Tora jesli chcesz wybrac wezly wejscia" + Wykryto atak typu man-in-the-middle! Twoje dane mogą zostać przechwycone przez inne urządzenie w sieci lokalnej. Wyłącz, odczekaj kilka sekund i włącz Wi-Fi. Korzystanie z obecnego hotspotu Wi-Fi może być niebezpieczne! + Wykrywanie spoofingu ARP nie jest obsługiwane przez urządzenie! + Wyłącz węzły wejściowe w ustawieniach Tora, w przeciwnym razie nie będziesz mógł korzystać z mostów. + Omijanie adresów LAN + Nie używaj Tora dla miejsc docelowych w sieci LAN i bloków IP zarezerwowanych przez IANA + Wyłącz mosty Tor, jeśli chcesz wybrać węzły wejściowe. "Powiadomienia firewalla" - "Firewall" + Zapora sieciowa "Wszystkie" "System" - "Uzytkownik" + Użytkownik "Sortuj po nazwie" "Sortuj po UID" - "Firewall On/Off" - "Czy chcesz zachowac zmiany?" - "Aby aktywowac firewall, nalezy uruchomic co najmniej DNSCrypt lub Tor." - "%s zostalo zaintalowane" - "Udostepnic internet?" - "Zezwol" - "Odmow" + Zapora włączona/wyłączona + Czy chcesz zachować zmiany? + Aby aktywować zaporę sieciową, należy uruchomić co najmniej DNSCrypt lub Tor. + %s zostało zainstalowane + Udostępnić internet? + Zezwalaj + Odmów "Tryb dzienny" "Tryb nocny" "Auto" - "Domyslny systemu" - "Zezwol na polaczenia sieci lokalnej, onion i stron i2p" - "Zezwol na polaczenia WiFi" - "Zezwol na polaczenia GSM" - "Zezwol na polaczenia w roamingu" - "Zezwol na polaczenia przy wlaczonym VPN" + Domyślne ustawienia systemu + Zezwalaj na połączenia z siecią lokalną, witrynami onion i i2p + Zezwalaj na połączenia w sieciach WiFi + Zezwalaj na połączenia w sieciach GSM + Zezwalaj na połączenia w roamingu + Zezwalaj na połączenia z włączoną siecią VPN "Wybierz wszystko" "Odznacz wszystko" - "Zielony - zezwol, bialy - blokuj polaczenia" + Zielony - zezwól, biały - odmów połączenia "Ustawienia firewalla" - "Zezwol na polaczenie nowym aplikacjom" - "Polaczenie z internetem dla nowych aplikacji dozwolone." - "Polaczenie z internetem dla nowych aplikacji zablokowane." - "Wylacz proxy w ustawieniach WiFi Androida. To ustawienie powoduje konflikt z InviZible." - "Wylacz proxy w ustawieniach punktu dostepu APN. To ustawienie powoduje konflikt z InviZible." + Zezwalaj na połączenia dla nowych aplikacji + Połączenia internetowe dla nowo zainstalowanych aplikacji są dozwolone. + Połączenia internetowe dla nowo zainstalowanych aplikacji są blokowane. + Wyłącz proxy w ustawieniach WiFi Androida. To ustawienie powoduje konflikt z InviZible. + Wyłącz proxy w ustawieniach punktu dostępu APN. To ustawienie powoduje konflikt z InviZible. "Powiadomienia dodatkowe" - "Ochrona przekierowan DNS" - "Zablokuj strone jesli wykryto przekierowanie DNS" + Ochrona przekierowań DNS + Zablokuj witryny po wykryciu ataku DNS "Przekierowanie DNS" - "Wykryto prawodopodobne przekierowanie DNS! Strona %s zostala zablokowana." - "Jestes pewien? Tej czynnosci nie mozna cofnac!" + Wykryto potencjalny atak DNS Rebinding! Strona %s została zablokowana. + Jesteś pewien? Tego działania nie można cofnąć! "Resetuj ustawienia" - "Zapisano backup" - "Przywrocono backup" - "Projekt InviZible Pro Project i jego Autor wyrazaja podziekowania za wsparcie." - "Sprobuj wykorzystac sprzetowa akceleracje szyfrowania, jesli dostepna." - "Nawiazuje polaczenie…" - "Oczekiwanie na siec…" - "Zmien IP Tora" + Zapisano kopię zapasową + Przywrócono kopię zapasową + Projekt InviZible Pro i jego autor wyrażają wdzięczność za wsparcie! + Spróbuj wykorzystać sprzętową akceleracje szyfrowania, jeśli jest dostępna. + Łączenie… + Czekam na sieć… + Zmień IP Tora "Zmieniam IP Tora" - "Dodales wiecej niz 3 kafelki w Ustawieniach Szybkich. Pozostaw tylko 3. Wieksza ilosc powoduje problemy z kontrola aplikacji." + Do Szybkich ustawień dodano więcej niż 3 kafelki. Pozostaw tylko 3. Dodanie więcej niż 3 kafelków może spowodować problemy z kontrolą aplikacji. "Wykryto Rogue DHCP" - "Wykryj ataki Man-in-the-middle rogue DHCP w sieciach WiFi" + Wykryj ataki DHCP typu Man-in-the-Middle w sieciach Wi-Fi. "Wybierz rendezvous" - "Ukrywa domene brokera pred ISP. Broker jest uzywany do nawiazania polaczenia." + Ukrywa nazwę domeny brokera przed dostawcą Internetu. Broker jest używany do nawiązywania połączenia. "Pokaz wszystkie aplikacje" - "Aplikacje sa wyswietlane niezaleznie od tego czy moga laczyc sie z siecia." - "Pokazuje tylko aplikacje ktore moga sie polaczyc z siecia." - "Wylacznik bezpieczenstwa" - "Blokuj polaczenia sieciowe kiedy Tor, DNSCrypt oraz Purple I2P sa zatrzymane" - "Wyacznik bezpieczenstwa zablokowal internet. Uruchom Tor, DNSCrypt lub I2P aby zezwolic na polaczenie. Albo: zablokuj wyl bezp w Ustawieniach Wspolnych." + Aplikacje są wyświetlane niezależnie od tego, czy aplikacja może połączyć się z Internetem, czy nie. + Wyświetlane są tylko aplikacje, które mogą łączyć się z Internetem. + Wyłącznik bezpieczeństwa + Blokuj połączenia internetowe, gdy Tor, DNSCrypt i Purple I2P są wyłączone + Wyłącznik bezpieczeństwa zablokował internet. Uruchom Tor, DNSCrypt lub I2P, aby zezwolić na połączenie. Lub wyłącz przełącznik bezpieczeństwa w ustawieniach wspólnych. "Lista jest pusta" "Auto" - "Uzyj BusyBox urzadzenia" - "Uzyj BusyBox aplikacji" - "Nie uzywaj BusyBox" - "Uzyj iptables aplikacji" - "Uzyj iptables urzadzenia" + Użyj BusyBox urządzenia + Użyj BusyBox aplikacji + Nie używaj BusyBox + Użyj iptables aplikacji + Użyj iptables urządzenia "Poczekaj na zablokowanie xtables" - "Poczekaj na wylaczny dostep do iptables aby zapobiec rownoleglej modyfikacji regul." - "sprawdzam dostep do internetu" - "Logi real-time" - "Pokaz logi polaczenia aplikacji w kolumnie DNS" - "Umozliw wsparcie dla HTTP/3 (DoH3, HTTP over QUIC). Uwaga: tak jak dla DNSCrypt i przeciwnie do innych wersji HTTP, uzywane jest tu UDP i (zwykle) port 443 zamiast TCP." - "Umozliw wsparcie dla protokolu SSU2 (uzyj UDP)" - "Zapytaj pozniej" - "Powiadomienia dostarczaja istotnych informacji odnosnie pracy i stanu programu oraz wykrytych atakach. Czy uaktywnic powiadomienia?" - "Uaktywnij jesli jestes w sieci uzywajacej tylko IPv6, a IPv4 nie jest dostepny. Nie udostepniaj w innych przypadkach, albo calkowicie utracisz polaczenie." - "Zestaw uzytych prefixow IPv6." + Poczekaj, aż będzie można uzyskać wyłączną blokadę iptables, aby zapobiec jednoczesnej modyfikacji reguł iptables. + Sprawdzanie łączności z Internetem + Logi w czasie rzeczywistym + Pokaz logi połączeń aplikacji na karcie DNS + Włącz obsługę protokołu HTTP/3 (DoH3, HTTP przez QUIC). Podobnie jak DNSCrypt, ale w przeciwieństwie do innych wersji HTTP, używa on UDP i (zwykle) portu 443 zamiast TCP. + Włącz protokół transportowy SSU2 (użyj UDP). + Zapytaj później + Powiadomienia są niezbędne do wyświetlania ważnych informacji o działaniu aplikacji, kontroli aplikacji i wykrytych atakach. Czy chcesz zezwolić na powiadomienia dla InviZible? + Włącz tę opcję, jeśli korzystasz z sieci obsługującej wyłącznie protokół IPv6, a witryny IPv4 stają się niedostępne. Nie włączaj tej opcji w przeciwnym razie nie będziesz w stanie połączyć się z niczym. + Zbiór użytych statycznych prefiksów IPv6. "Mostki IPv6" "Uwaga" - Blad uruchomienia InviZible Pro %1$s! Zmien ustawienia %2$s . Jesli nie pomoze - uruchom urzadzenie ponownie. - "Reset" - "Uruchom spoofing SNI" - "Tor zapamieta i zapisze niedawne polaczenia do hsotow i sprobuje uzyc tych samych exit node dla kazdego z nich. To moze pomoc uniknac petli captcha." + InviZible Pro nie może uruchomić %1$s! Spróbuj zresetować ustawienia %2$s. Jeśli to nie pomoże, uruchom ponownie urządzenie. + Zresetuj + Fałszywe SNI + Tor będzie śledził ostatnie połączenia z hostami i próbował ponownie użyć tego samego węzła wyjściowego dla każdego z nich. Ta opcja może pomóc uniknąć niekończących się pętli captcha. - \tDziękujemy za wybranie InviZible Pro. Jestem pewien, że zwiększy to Twoją prywatność i zapewni płynne korzystanie z Internetu. + \tDziękujemy za wybranie InviZible Pro. Jestem przekonany, że zwiększy on twoją prywatność i zapewni płynne korzystanie z Internetu. \n\n\tInviZible Pro zawiera moduły Tor, DNSCrypt i Purple I2P. - \n\n\tInviZible Pro może korzystać z roota, jeśli Twoje urządzenie jest zrootowane lub korzysta z lokalnej sieci VPN, aby dostarczać ruch internetowy bezpośrednio do sieci Tor, DNSCrypt i I2P. + \n\n\tInviZible Pro może korzystać z roota, jeśli twoje urządzenie jest zrootowane, lub używa lokalnej sieci VPN do dostarczania ruchu internetowego bezpośrednio do sieci Tor, DNSCrypt i I2P. \n\n\tPolityka prywatności: - \n\tInviZible Pro nie gromadzi ani nie udostępnia żadnych osobistych lub wrażliwych danych użytkownika. + \n\tInviZible Pro nie gromadzi ani nie udostępnia żadnych osobistych ani wrażliwych danych użytkownika. \n\n\tCopyright © 2019-2024 \n\tGarmatin Oleksandr \n\tinvizible.soft@gmail.com \n\tinvizible.net/en/privacy Naciśnij, aby dodać. - Zaprzestać optymalizacji zużycia baterii? + Przestać optymalizować zużycie baterii? Wyklucz z sieci Tor Wyklucz UDP z sieci Tor - Omiń aplikację + Całkowite wykluczenie Trasa do Tor Tor przechodzi w stan uśpienia, jeśli nie widzi aktywności klienta przez określony czas. Musi on wynosić co najmniej 10 minut Wyłączyć oszczędzanie danych sieciowych? @@ -534,4 +534,13 @@ ↓ Przeciągnięcie odświeża ↓ Naciśnij, aby edytować. Naciśnij i przytrzymaj, aby edytować. + Ustawienia izolowania + Brama do zwykłego internetu + Używaj serwerów implementujących protokół Oblivious DNS-over-HTTPS. + Węzły + Zablokowanie tej aplikacji systemowej może skutkować niestabilnym połączeniem internetowym! + Aby aktywować tę opcję, należy wyłączyć mosty lub używać mostów tylko z portami 80 i 443. + Adres URL wyjściowego serwera proxy HTTP (jak np. http://false.i2p) + Nie udostępniaj obwodów strumieniom z różnych aplikacji. + Adres serwera wyjściowego proxy (IP lub lokalny). Żądania spoza I2P będą tam kierowane. diff --git a/tordnscrypt/src/main/res/values-pt-rBR/strings.xml b/tordnscrypt/src/main/res/values-pt-rBR/strings.xml index 63286054..00663026 100644 --- a/tordnscrypt/src/main/res/values-pt-rBR/strings.xml +++ b/tordnscrypt/src/main/res/values-pt-rBR/strings.xml @@ -19,7 +19,7 @@ "Instalando DNSCrypt" "O DNSCrypt não está instalado" "Iniciando DNSCrypt" - "DNSCypt Rodando" + DNSCrypt Rodando "DNSCrypt Parando" "Tor Parado" "Tor Instalado" @@ -150,7 +150,6 @@ Selecionar Iptables "Salvar comandos Root para o log" "DNSCrypt, Tor 2 o I2P são protegidos. Não esconda." - Executando comandos de Root… "Por favor, aguarde…" "Configurações salvas" "CONFIGURAÇÕES GLOBAIS" @@ -350,7 +349,6 @@ Erro no modo VPN! "Configure o uso do servidor proxy nas configurações do dispositivo conectado. Valores padrão: IP:10.1.10.1 Porta:8118" "Ocultar IP com TOR" - "Atenção" Defenda-se com DNSCRYPT Acesso à rede I2P com Purple I2P "Adicionar servidor customizado" @@ -526,4 +524,41 @@ \n\tinvizible.soft@gmail.com \n\tinvizible.net/en/privacy + "Habilitar suporte para HTTP/3 (DoH3, HTTP sobre QUIC). Note que, assim como o DNSCrypt, mas diferente das outras versões do HTTP, isso usa UDP e (geralmente) a porta 443 em vez de TCP." + "Habilitar o protocolo de transporte SSU2 (usar UDP)." + "Perguntar depois" + "As notificações são essenciais para exibir informações importantes sobre a operação do aplicativo, controle do aplicativo e ataques detectados. Gostaria de permitir notificações para o InviZible?" + "Ative esta opção se você estiver em uma rede somente IPv6 e sites IPv4 ficarem indisponíveis. Caso contrário, não a ative, ou você não conseguirá se conectar a nada." + "Conjunto de prefixos IPv6 estáticos utilizados." + "Bridges IPv6" + "Atenção" + "O InviZible Pro não pode iniciar %1$s! Por favor, tente redefinir as configurações de %2$s. Se isso não ajudar, reinicie seu dispositivo." + "Reiniciar" + "Spoof SNI" + "O Tor rastreará conexões recentes com hosts e tentará reutilizar o mesmo nó de saída para cada uma delas. Esta opção pode ajudar a evitar captchas intermináveis." + "Parar de otimizar o uso da bateria?" + "Desativar o economizador de dados da rede?" + "Por favor, permita o uso de dados em segundo plano e o uso de dados enquanto o economizador de dados está ativado. Isso é essencial para uma experiência online suave." + "Executando comandos de Root…" + "O Tor entra em um estado de inatividade se não detectar atividade do cliente por um tempo especificado. Deve ser de pelo menos 10 minutos." + "Pressione para adicionar." + "Pressione e segure para adicionar." + "Pressione para editar." + "Pressione e segure para editar." + "Anonimizar retransmissores." + "Os retransmissores anonimizados não estão em uso." + "Excluir do Tor" + "Roteirizar para o Tor" + "Excluir UDP do Tor" + "Excluir completamente" + "\u2193 Puxe para atualizar \u2193" + "Bloquear este aplicativo do sistema pode resultar em uma conexão de internet instável!" + Use servidores que implementam o protocolo Oblivious DNS-over-HTTPS. + "Nós" + "Configurações de isolamento" + "Gateway para a internet convencional" + "URL do proxy HTTP upstream (como http://false.i2p)" + "Endereço do outproxy (IP ou local). As solicitações fora do I2P serão enviadas para lá." + "Para ativar esta opção, você deve desativar as pontes ou usar pontes com as portas 80 e 443 apenas." + "Não compartilhe circuitos com conexões de diferentes aplicativos." diff --git a/tordnscrypt/src/main/res/values-ru/strings.xml b/tordnscrypt/src/main/res/values-ru/strings.xml index 29c418f7..35e5d119 100644 --- a/tordnscrypt/src/main/res/values-ru/strings.xml +++ b/tordnscrypt/src/main/res/values-ru/strings.xml @@ -221,6 +221,7 @@ Редактировать сайт или IP Выключено STUN сервера для мостов SnowFlake + Не использовать ту же цепочку для разных приложений. Разделить трафик приложений на основе удаленного адреса. Разделить трафик приложений на основе удаленного порта. Tor переходит в режим ожидания, если не видит активности клиента в течении заданного времени. Должно быть не менее 10 минут. diff --git a/tordnscrypt/src/main/res/values-sr/strings.xml b/tordnscrypt/src/main/res/values-sr/strings.xml new file mode 100644 index 00000000..65a02804 --- /dev/null +++ b/tordnscrypt/src/main/res/values-sr/strings.xml @@ -0,0 +1,56 @@ + + + Најбоље решење за вашу приватност + Л2П заустављен + Л2П покренут + Л2П се покреће + Л2П се зауставља + Л2П се инсталира + Л2П није инсталиран + Покренути при покретању система + Молимо сачекајте… + Без приказивања + ДНСКрипт је заустављен + ДНСКрипт је инсталиран + ДНСКрипт се инсталира + ДНСКрипт се покреће + ДНСКрипт се зауставља + Тор је заустављен + Подешавања + Откажи + Изаберите фолдер резервне копије: + Резервна копија је враћена + Резервна копија је сачувана + Ресетујте подешавања + Одбити + Уклони избор + Закључавање за децу + Контрола је закључана + ИнвиЗибле Про пројекат тражи вашу помоћ. Притисните ОК да бисте купили премијум функције. + Да ли желите да сачувате промене? Може покварити ИнвиЗибле Про. + Нови Тор идентитет + Анонимни релеји + Анонимизирани релеји се не користе. + Провера интернет везе + Л2П је инсталиран + Провера да ли је рут доступан + ДНСКрипт није инсталиран + ДНСКрипт је покренут + Тор је инсталиран + Тор се инсталира + Тор није инсталиран + Тор се покреће + Тор са ДНСКриптом и Л2П + Можете закључати контролу над овом апликацијом. Молићу унесите лозинку или користите претходну. + Дозволи + Да ли сте сигурни? Ова радња се не може опозвати! + Ресет + Питај касније + ИнвиЗибле Про не може да покрене %1$с! Покушајте да ресетујете подешавања %2$с. Ако ово не помогне, поново покрените уређај. + Избриши лог + Врати подешавања + Сачувај подешавања + ОТКАЖИ ПРЕУЗИМАЊЕ + Да ли желите да сачувате промене? + Изаберите Све + \ No newline at end of file diff --git a/tordnscrypt/src/main/res/values-uk/strings.xml b/tordnscrypt/src/main/res/values-uk/strings.xml index 4711df40..bbb3f657 100644 --- a/tordnscrypt/src/main/res/values-uk/strings.xml +++ b/tordnscrypt/src/main/res/values-uk/strings.xml @@ -211,6 +211,7 @@ Чорний список складається з одного шаблону на рядок. Реле Редагувати хост або IP-адресу + Не використовувати той же ланцюжок для різних додатків. Не використовати спільні ланцюги з потоками, що мають іншу адресу призначення. Сокс-проксі Не запитувати знову diff --git a/tordnscrypt/src/main/res/values-zh/strings.xml b/tordnscrypt/src/main/res/values-zh/strings.xml index 02ea3e6e..2f833514 100644 --- a/tordnscrypt/src/main/res/values-zh/strings.xml +++ b/tordnscrypt/src/main/res/values-zh/strings.xml @@ -247,7 +247,7 @@ "启用通过 IPv4 通信。" "启用通过 IPv6 通信。" "路由器将不接受中转隧道,完全禁用中转流量。" - "路由器将洪泛。" + 路由器将进行流量填充。 "带宽限制 (KBps)。" "最大中转带宽限制比率。0–100。" "启用 SSU 传输协议(使用 UDP)。" @@ -480,7 +480,7 @@ 你在快捷设置中添加了超过3个磁贴。请只留下3个。添加超过3个磁贴会导致应用控制的问题。 恶意 DHCP 检测 检测Wi-Fi网络中的中间人恶意DHCP攻击。 - 选择会合 + 选择会合点 在互联网提供商处隐藏代理的域名。代理用于建立连接。 显示所有应用 无论应用程序是否可以连接到互联网,都会显示应用程序。 @@ -545,4 +545,5 @@ 节点 隔离设置 要激活此选项,应禁用网桥或仅使用具有80和443端口的网桥。 + 不要与来自不同应用程序的流共享链路。 diff --git a/tordnscrypt/src/main/res/values/array.xml b/tordnscrypt/src/main/res/values/array.xml index 81a8e8dc..d93098c4 100644 --- a/tordnscrypt/src/main/res/values/array.xml +++ b/tordnscrypt/src/main/res/values/array.xml @@ -573,14 +573,14 @@ X - meganerd-doh-ipv6 + sth-doh-se-ipv6 njalla-doh mullvad-doh dns.digitale-gesellschaft.ch plan9dns-nj-doh-ipv6 libredns dnswarden-uncensor-dc-swiss - meganerd-ipv6 + scaleway-ams-ipv6 scaleway-fr diff --git a/tordnscrypt/src/main/res/values/strings.xml b/tordnscrypt/src/main/res/values/strings.xml index d69d406c..e404249b 100644 --- a/tordnscrypt/src/main/res/values/strings.xml +++ b/tordnscrypt/src/main/res/values/strings.xml @@ -478,6 +478,8 @@ Clear cache Track Host Exits Tor will track recent connections to hosts and attempt to reuse the same exit node for each. This option may help avoid endless captcha. + Isolate By UID + Don’t share circuits with streams from different apps. Isolate Dest Addr Don’t share circuits with streams targeting a different destination address. Isolate Dest Port @@ -600,7 +602,7 @@ Copyright (C) 2019-2024 Garmatin Oleksandr\n All Rights Reserved\n Web Site: Privacy Policy \tInviZible Pro does not collect or share any personal or sensitive user data. - InviZible Pro forwards internet traffic to Tor, DNSCrypt and I2P networks. + InviZible Pro forwards internet traffic directly to Tor, DNSCrypt and I2P networks. For detailed information, please visit the official pages of the mentioned projects. \tInviZible Pro is free software: you can redistribute it and/or modify diff --git a/tordnscrypt/src/main/res/xml/preferences_tor.xml b/tordnscrypt/src/main/res/xml/preferences_tor.xml index 11166756..d9e7904c 100644 --- a/tordnscrypt/src/main/res/xml/preferences_tor.xml +++ b/tordnscrypt/src/main/res/xml/preferences_tor.xml @@ -140,6 +140,12 @@ android:layout="@layout/preferences_category_custom" android:title="@string/pref_tor_isolation_categ"> +