tor-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
July 2019
- 19 participants
- 1200 discussions

[orbot/master] Merge pull request #219 from bitmold/delete_minimalperm_manifest
by n8fr8@torproject.org 05 Jul '19
by n8fr8@torproject.org 05 Jul '19
05 Jul '19
commit dde1957d703b483330db6a4c5cf9fa1b7d77b8a2
Merge: a251d52f ad2e875b
Author: Nathan Freitas <nathan(a)guardianproject.info>
Date: Fri May 31 10:49:51 2019 -0400
Merge pull request #219 from bitmold/delete_minimalperm_manifest
Delete Minimalperm Manifest
app/src/minimalperm/AndroidManifest.xml | 163 --------------------------------
1 file changed, 163 deletions(-)
1
0

[orbot/master] Merge pull request #218 from bitmold/ndk_app_platform_warning
by n8fr8@torproject.org 05 Jul '19
by n8fr8@torproject.org 05 Jul '19
05 Jul '19
commit a251d52fe8ada9d55f6860e230c4cf7a55514542
Merge: eda464bb 917e49f5
Author: Nathan Freitas <nathan(a)guardianproject.info>
Date: Fri May 31 10:49:35 2019 -0400
Merge pull request #218 from bitmold/ndk_app_platform_warning
Removes APP_PLATFORM warning at the start of ndk-build
orbotservice/src/main/AndroidManifest.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
1
0
commit a1c5806adc3d73575c1ade48d0c611ff90540cc5
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Fri May 31 10:47:36 2019 -0400
update tor-android to 0.4.0.4-rc
---
orbotservice/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/orbotservice/build.gradle b/orbotservice/build.gradle
index df861342..7160e29d 100644
--- a/orbotservice/build.gradle
+++ b/orbotservice/build.gradle
@@ -28,7 +28,7 @@ android {
dependencies {
implementation project(':jsocksAndroid')
- implementation 'org.torproject:tor-android-binary:0.3.5.8-rc-v2'
+ implementation 'org.torproject:tor-android-binary:0.4.0.4-rc'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.jaredrummler:android-shell:1.0.0'
implementation fileTree(dir: 'libs', include: ['.so'])
1
0

[orbot/master] update version to 16100003 aka 16.1.0-BETA-1-tor-0.4.0.4-rc
by n8fr8@torproject.org 05 Jul '19
by n8fr8@torproject.org 05 Jul '19
05 Jul '19
commit 417e4fcd0720be57328d63a96d2c9fc0e119330f
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Fri May 31 14:35:12 2019 -0400
update version to 16100003 aka 16.1.0-BETA-1-tor-0.4.0.4-rc
---
app/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 1f471ab5..e99ca3b4 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -34,8 +34,8 @@ android {
minSdkVersion 16
applicationId 'org.torproject.android'
targetSdkVersion 28
- versionCode 16060002
- versionName '16.0.6-BETA-2-tor-0.3.5.8'
+ versionCode 16100003
+ versionName '16.1.0-BETA-1-tor-0.4.0.4-rc'
archivesBaseName = "Orbot-$versionName"
}
}
1
0

[orbot/master] We no longer use the minimalperm product flavor so there's no need
by n8fr8@torproject.org 05 Jul '19
by n8fr8@torproject.org 05 Jul '19
05 Jul '19
commit ad2e875bc2084de6e809e44a1d213ad2791a0436
Author: bim <dsnake(a)protonmail.com>
Date: Thu May 30 15:10:55 2019 -0400
We no longer use the minimalperm product flavor so there's no need
to keep this manifest file in app/src
---
app/src/minimalperm/AndroidManifest.xml | 163 --------------------------------
1 file changed, 163 deletions(-)
diff --git a/app/src/minimalperm/AndroidManifest.xml b/app/src/minimalperm/AndroidManifest.xml
deleted file mode 100644
index adf74209..00000000
--- a/app/src/minimalperm/AndroidManifest.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.torproject.android"
- android:installLocation="auto">
-
- <uses-sdk
- android:minSdkVersion="16"
- android:maxSdkVersion="22"
- android:targetSdkVersion="22" />
-
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
-
- <application
- android:name=".OrbotApp"
- android:allowBackup="false"
- android:allowClearUserData="true"
- android:configChanges="locale|orientation|screenSize"
- android:description="@string/app_description"
- android:hardwareAccelerated="false"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:largeHeap="false"
- android:theme="@style/DefaultTheme">
- <activity
- android:name=".OrbotMainActivity"
- android:excludeFromRecents="true"
- android:launchMode="singleTop">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
-
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
-
- <data android:scheme="bridge" />
- </intent-filter>
- <intent-filter>
- <category android:name="android.intent.category.DEFAULT" />
-
- <action android:name="org.torproject.android.REQUEST_HS_PORT" />
- </intent-filter>
- <intent-filter>
- <category android:name="android.intent.category.DEFAULT" />
-
- <action android:name="org.torproject.android.START_TOR" />
- </intent-filter>
- </activity>
-
- <!-- This is for ensuring the background service still runs when/if the app is swiped away -->
- <activity
- android:name=".service.util.DummyActivity"
- android:allowTaskReparenting="true"
- android:alwaysRetainTaskState="false"
- android:clearTaskOnLaunch="true"
- android:enabled="true"
- android:excludeFromRecents="true"
- android:finishOnTaskLaunch="true"
- android:noHistory="true"
- android:stateNotNeeded="true"
- android:theme="@android:style/Theme.Translucent" />
- <activity
- android:name=".vpn.VPNEnableActivity"
- android:exported="false"
- android:label="@string/app_name" />
- <activity
- android:name=".ui.PromoAppsActivity"
- android:exported="false" />
- <activity
- android:name=".settings.SettingsPreferences"
- android:label="@string/app_name" />
- <activity
- android:name=".ui.AppManagerActivity"
- android:label="@string/app_name"
- android:theme="@style/Theme.AppCompat" />
-
- <service
- android:name=".service.TorService"
- android:enabled="true"
- android:permission="android.permission.BIND_VPN_SERVICE"
- android:stopWithTask="false"></service>
- <service
- android:name=".service.vpn.TorVpnService"
- android:enabled="true"
- android:permission="android.permission.BIND_VPN_SERVICE">
- <intent-filter>
- <action android:name="android.net.VpnService" />
- </intent-filter>
- </service>
-
- <receiver
- android:name=".service.StartTorReceiver"
- android:exported="true">
- <intent-filter>
- <action android:name="org.torproject.android.intent.action.START" />
- </intent-filter>
- </receiver>
- <receiver
- android:name=".OnBootReceiver"
- android:enabled="true"
- android:exported="true">
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
-
- <category android:name="android.intent.category.HOME" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.QUICKBOOT_POWERON" />
-
- <category android:name="android.intent.category.HOME" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.MEDIA_MOUNTED" />
-
- <category android:name="android.intent.category.HOME" />
- </intent-filter>
- </receiver>
-
- <activity
- android:name=".ui.hiddenservices.HiddenServicesActivity"
- android:label="@string/title_activity_hidden_services"
- android:theme="@style/DefaultTheme">
- <meta-data
- android:name="android.support.PARENT_ACTIVITY"
- android:value=".OrbotMainActivity" />
- </activity>
-
- <provider
- android:name=".ui.hiddenservices.providers.HSContentProvider"
- android:authorities="org.torproject.android.ui.hiddenservices.providers"
- android:exported="false" />
- <provider
- android:name="android.support.v4.content.FileProvider"
- android:authorities="org.torproject.android.ui.hiddenservices.storage"
- android:exported="false"
- android:grantUriPermissions="true">
- <meta-data
- android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/hidden_services_paths" />
- </provider>
-
- <activity
- android:name=".ui.hiddenservices.ClientCookiesActivity"
- android:label="@string/client_cookies"
- android:theme="@style/DefaultTheme">
- <meta-data
- android:name="android.support.PARENT_ACTIVITY"
- android:value=".OrbotMainActivity" />
- </activity>
-
- <provider
- android:name=".ui.hiddenservices.providers.CookieContentProvider"
- android:authorities="org.torproject.android.ui.hiddenservices.providers.cookie"
- android:exported="false" />
- </application>
-
-</manifest>
1
0

[orbot/master] Merge branch 'issue_199' of https://github.com/sisbell/orbot into sisbell-issue_199
by n8fr8@torproject.org 05 Jul '19
by n8fr8@torproject.org 05 Jul '19
05 Jul '19
commit ff7d3dd5d523c94fb94894dcd664ff3501c598cc
Merge: 7c2cfc3e 08c35bd3
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Wed May 29 17:02:40 2019 -0400
Merge branch 'issue_199' of https://github.com/sisbell/orbot into sisbell-issue_199
app/src/main/res/drawable-hdpi-v11/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable-hdpi-v9/inverse.png | Bin 1027 -> 0 bytes
.../drawable-hdpi/ic_filter_none_black_36dp.png | Bin 232 -> 0 bytes
.../ic_playlist_add_check_black_36dp.png | Bin 221 -> 0 bytes
app/src/main/res/drawable-hdpi/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable-ldpi-v11/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable-ldpi-v9/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable-ldpi/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable-mdpi-v11/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable-mdpi-v9/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable-xhdpi-v11/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable-xhdpi-v9/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable/button.xml | 37 ---
app/src/main/res/drawable/button_off.xml | 37 ---
app/src/main/res/drawable/button_on.xml | 35 ---
app/src/main/res/drawable/error.png | Bin 2922 -> 0 bytes
app/src/main/res/drawable/ic_menu_goto.png | Bin 1636 -> 0 bytes
app/src/main/res/drawable/ic_play.png | Bin 3560 -> 0 bytes
app/src/main/res/drawable/inverse.png | Bin 1027 -> 0 bytes
app/src/main/res/drawable/n8fr8.jpg | Bin 18062 -> 0 bytes
app/src/main/res/drawable/rounded_button.xml | 13 -
app/src/main/res/drawable/toggle.xml | 8 -
app/src/main/res/drawable/tor.png | Bin 4766 -> 0 bytes
app/src/main/res/drawable/tor25.png | Bin 2227 -> 0 bytes
app/src/main/res/layout/layout_about.xml | 4 +-
.../res/layout/layout_add_client_cookie_dialog.xml | 2 -
.../res/layout/layout_content_client_cookies.xml | 1 -
app/src/main/res/layout/layout_help.xml | 20 --
.../res/layout/layout_hs_backups_list_item.xml | 1 -
app/src/main/res/layout/layout_hs_data_dialog.xml | 3 -
.../main/res/layout/layout_hs_list_view_main.xml | 1 -
app/src/main/res/layout/layout_log.xml | 52 ----
app/src/main/res/layout/layout_main.xml | 12 +-
app/src/main/res/layout/layout_orbot_control.xml | 10 -
app/src/main/res/layout/layout_vpn_setup.xml | 34 ---
.../main/res/layout/scrollingtext_buttons_view.xml | 34 ---
app/src/main/res/menu/orbot_main.xml | 4 +-
app/src/main/res/menu/share_menu.xml | 7 -
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml | 5 -
.../res/mipmap-anydpi-v26/ic_launcher_round.xml | 5 -
app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2253 -> 0 bytes
.../res/mipmap-hdpi/ic_launcher_foreground.png | Bin 2146 -> 0 bytes
app/src/main/res/mipmap-hdpi/ic_launcher_round.png | Bin 4325 -> 0 bytes
app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1580 -> 0 bytes
.../res/mipmap-mdpi/ic_launcher_foreground.png | Bin 1376 -> 0 bytes
app/src/main/res/mipmap-mdpi/ic_launcher_round.png | Bin 2723 -> 0 bytes
app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3071 -> 0 bytes
.../res/mipmap-xhdpi/ic_launcher_foreground.png | Bin 3075 -> 0 bytes
.../main/res/mipmap-xhdpi/ic_launcher_round.png | Bin 6103 -> 0 bytes
app/src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 4682 -> 0 bytes
.../res/mipmap-xxhdpi/ic_launcher_foreground.png | Bin 5112 -> 0 bytes
.../main/res/mipmap-xxhdpi/ic_launcher_round.png | Bin 9447 -> 0 bytes
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 6541 -> 0 bytes
.../res/mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 7372 -> 0 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 13447 -> 0 bytes
app/src/main/res/values-ach/strings.xml | 1 -
app/src/main/res/values-ar/poestrings.xml | 18 --
app/src/main/res/values-ar/strings.xml | 152 ----------
app/src/main/res/values-ay/poestrings.xml | 24 --
app/src/main/res/values-ay/strings.xml | 150 ---------
app/src/main/res/values-az/strings.xml | 201 ++-----------
app/src/main/res/values-be/poestrings.xml | 21 --
app/src/main/res/values-be/strings.xml | 150 ---------
app/src/main/res/values-bg/poestrings.xml | 22 --
app/src/main/res/values-bg/strings.xml | 199 ++----------
app/src/main/res/values-bn-rBD/strings.xml | 54 +---
app/src/main/res/values-bn-rIN/strings.xml | 10 +-
app/src/main/res/values-bn/strings.xml | 26 +-
app/src/main/res/values-brx/strings.xml | 7 +-
app/src/main/res/values-bs/strings.xml | 14 +-
app/src/main/res/values-ca/poestrings.xml | 22 --
app/src/main/res/values-ca/strings.xml | 218 +++-----------
app/src/main/res/values-cs-rCZ/strings.xml | 197 ++----------
app/src/main/res/values-cs/strings.xml | 75 +----
app/src/main/res/values-cy/strings.xml | 69 +----
app/src/main/res/values-da/strings.xml | 156 ++--------
app/src/main/res/values-de-rAT/strings.xml | 1 -
app/src/main/res/values-de/poestrings.xml | 21 --
app/src/main/res/values-de/strings.xml | 218 +++-----------
app/src/main/res/values-el/poestrings.xml | 22 --
app/src/main/res/values-el/strings.xml | 218 +++-----------
app/src/main/res/values-en-rGB/poestrings.xml | 22 --
app/src/main/res/values-en-rGB/strings.xml | 67 +----
app/src/main/res/values-eo/strings.xml | 109 ++-----
app/src/main/res/values-es-rAR/poestrings.xml | 21 --
app/src/main/res/values-es-rAR/strings.xml | 167 ++---------
app/src/main/res/values-es/arrays.xml | 8 +-
app/src/main/res/values-es/poestrings.xml | 22 --
app/src/main/res/values-es/strings.xml | 218 +++-----------
app/src/main/res/values-et/strings.xml | 155 ++--------
app/src/main/res/values-eu/poestrings.xml | 21 --
app/src/main/res/values-eu/strings.xml | 218 +++-----------
app/src/main/res/values-fa/poestrings.xml | 22 --
app/src/main/res/values-fa/strings.xml | 219 +++-----------
app/src/main/res/values-fi/strings.xml | 143 ---------
app/src/main/res/values-fr-rFR/strings.xml | 199 ++----------
app/src/main/res/values-fr/poestrings.xml | 21 --
app/src/main/res/values-fr/strings.xml | 218 +++-----------
app/src/main/res/values-gl/poestrings.xml | 22 --
app/src/main/res/values-gl/strings.xml | 219 +++-----------
app/src/main/res/values-gu-rIN/strings.xml | 4 +-
app/src/main/res/values-gu/strings.xml | 15 +-
app/src/main/res/values-he/strings.xml | 228 +++-----------
app/src/main/res/values-hi/poestrings.xml | 21 --
app/src/main/res/values-hi/strings.xml | 218 +++-----------
app/src/main/res/values-hr-rHR/strings.xml | 26 +-
app/src/main/res/values-hr/strings.xml | 143 ---------
app/src/main/res/values-hu/poestrings.xml | 22 --
app/src/main/res/values-hu/strings.xml | 218 +++-----------
app/src/main/res/values-hy-rAM/strings.xml | 15 +-
app/src/main/res/values-ia/strings.xml | 30 +-
app/src/main/res/values-id/strings.xml | 199 ++----------
app/src/main/res/values-in-rID/poestrings.xml | 20 --
app/src/main/res/values-in-rID/strings.xml | 199 ++----------
app/src/main/res/values-in/strings.xml | 42 +--
app/src/main/res/values-is/poestrings.xml | 22 --
app/src/main/res/values-is/strings.xml | 218 +++-----------
app/src/main/res/values-it/poestrings.xml | 22 --
app/src/main/res/values-it/strings.xml | 218 +++-----------
app/src/main/res/values-iw/poestrings.xml | 22 --
app/src/main/res/values-iw/strings.xml | 172 ++---------
app/src/main/res/values-ja/poestrings.xml | 22 --
app/src/main/res/values-ja/strings.xml | 218 +++-----------
app/src/main/res/values-kn-rIN/strings.xml | 1 -
app/src/main/res/values-kn/strings.xml | 15 +-
app/src/main/res/values-ko/strings.xml | 199 ++----------
app/src/main/res/values-ky/strings.xml | 22 +-
app/src/main/res/values-lt-rLT/strings.xml | 1 -
app/src/main/res/values-lt/poestrings.xml | 21 --
app/src/main/res/values-lt/strings.xml | 81 +----
app/src/main/res/values-lv/strings.xml | 199 ++----------
app/src/main/res/values-mk/poestrings.xml | 22 --
app/src/main/res/values-mk/strings.xml | 150 ---------
app/src/main/res/values-ml/strings.xml | 20 +-
app/src/main/res/values-mn/strings.xml | 13 +-
app/src/main/res/values-mr-rIN/strings.xml | 4 +-
app/src/main/res/values-ms-rMY/strings.xml | 146 ++-------
app/src/main/res/values-ms/strings.xml | 153 ++--------
app/src/main/res/values-my/strings.xml | 32 +-
app/src/main/res/values-nb/poestrings.xml | 17 --
app/src/main/res/values-nb/strings.xml | 207 ++-----------
app/src/main/res/values-nl/poestrings.xml | 22 --
app/src/main/res/values-nl/strings.xml | 218 +++-----------
app/src/main/res/values-pa/strings.xml | 22 +-
app/src/main/res/values-pl/strings.xml | 203 ++-----------
app/src/main/res/values-ps/strings.xml | 10 +-
app/src/main/res/values-pt-rBR/poestrings.xml | 22 --
app/src/main/res/values-pt-rBR/strings.xml | 215 ++-----------
app/src/main/res/values-pt-rPT/strings.xml | 102 ++-----
app/src/main/res/values-pt/strings.xml | 135 ++-------
app/src/main/res/values-ro-rRO/strings.xml | 26 +-
app/src/main/res/values-ro/strings.xml | 199 ++----------
app/src/main/res/values-rs-rAR/strings.xml | 40 +--
app/src/main/res/values-ru/poestrings.xml | 21 --
app/src/main/res/values-ru/strings.xml | 218 +++-----------
app/src/main/res/values-si-rLK/strings.xml | 146 ++-------
app/src/main/res/values-sk-rSK/strings.xml | 8 +-
app/src/main/res/values-sk/strings.xml | 199 ++----------
app/src/main/res/values-sl/strings.xml | 74 +----
app/src/main/res/values-sn/strings.xml | 21 +-
app/src/main/res/values-sq/strings.xml | 42 +--
app/src/main/res/values-sr/strings.xml | 212 ++-----------
app/src/main/res/values-sv/poestrings.xml | 22 --
app/src/main/res/values-sv/strings.xml | 218 +++-----------
app/src/main/res/values-ta/poestrings.xml | 22 --
app/src/main/res/values-ta/strings.xml | 75 +----
app/src/main/res/values-th/poestrings.xml | 22 --
app/src/main/res/values-th/strings.xml | 218 +++-----------
app/src/main/res/values-tl/strings.xml | 177 ++---------
app/src/main/res/values-tr/poestrings.xml | 22 --
app/src/main/res/values-tr/strings.xml | 150 ---------
app/src/main/res/values-uk/poestrings.xml | 22 --
app/src/main/res/values-uk/strings.xml | 218 +++-----------
app/src/main/res/values-ur/strings.xml | 23 +-
app/src/main/res/values-uz/strings.xml | 47 +--
app/src/main/res/values-vi/strings.xml | 199 ++----------
app/src/main/res/values-zh-rCN/strings.xml | 204 ++-----------
app/src/main/res/values-zh-rTW/poestrings.xml | 22 --
app/src/main/res/values-zh-rTW/strings.xml | 220 +++-----------
app/src/main/res/values/arrays.xml | 8 +-
app/src/main/res/values/colors.xml | 2 -
app/src/main/res/values/dimens.xml | 128 +-------
app/src/main/res/values/ic_launcher_background.xml | 4 +-
app/src/main/res/values/poestrings.xml | 22 --
app/src/main/res/values/strings.xml | 165 +---------
app/src/main/res/values/styles.xml | 4 -
.../src/main/res/drawable-hdpi-v11/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-hdpi-v9/inverse.png | Bin 1027 -> 0 bytes
.../main/res/drawable-hdpi/ic_action_settings.png | Bin 553 -> 0 bytes
.../res/drawable-hdpi/ic_autorenew_black_36dp.png | Bin 546 -> 0 bytes
.../src/main/res/drawable-hdpi/ic_launcher.png | Bin 4194 -> 0 bytes
.../src/main/res/drawable-hdpi/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-ldpi-v11/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-ldpi-v9/inverse.png | Bin 1027 -> 0 bytes
.../main/res/drawable-ldpi/ic_action_settings.png | Bin 319 -> 0 bytes
.../src/main/res/drawable-ldpi/ic_launcher.png | Bin 2852 -> 0 bytes
.../src/main/res/drawable-ldpi/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-mdpi-v11/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-mdpi-v9/inverse.png | Bin 1027 -> 0 bytes
.../main/res/drawable-mdpi/ic_action_settings.png | Bin 364 -> 0 bytes
.../src/main/res/drawable-mdpi/ic_launcher.png | Bin 2677 -> 0 bytes
.../src/main/res/drawable-mdpi/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-xhdpi-v11/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-xhdpi-v9/inverse.png | Bin 1027 -> 0 bytes
.../main/res/drawable-xhdpi/ic_action_settings.png | Bin 716 -> 0 bytes
.../src/main/res/drawable-xhdpi/ic_launcher.png | Bin 5964 -> 0 bytes
.../src/main/res/drawable-xhdpi/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-xxhdpi/ic_launcher.png | Bin 9556 -> 0 bytes
.../src/main/res/drawable-xxhdpi/inverse.png | Bin 1027 -> 0 bytes
.../src/main/res/drawable-xxxhdpi/ic_launcher.png | Bin 13297 -> 0 bytes
.../src/main/res/drawable-xxxhdpi/inverse.png | Bin 1027 -> 0 bytes
.../res/layout/layout_notification_expanded.xml | 108 -------
orbotservice/src/main/res/raw/pluto.properties | 3 -
orbotservice/src/main/res/values-ach/strings.xml | 1 -
orbotservice/src/main/res/values-ar/strings.xml | 261 +---------------
orbotservice/src/main/res/values-az/strings.xml | 296 +-----------------
orbotservice/src/main/res/values-bg/strings.xml | 292 +-----------------
.../src/main/res/values-bn-rBD/strings.xml | 32 +-
.../src/main/res/values-bn-rIN/strings.xml | 1 -
orbotservice/src/main/res/values-bn/strings.xml | 1 -
orbotservice/src/main/res/values-brx/strings.xml | 1 -
orbotservice/src/main/res/values-bs/strings.xml | 11 +-
orbotservice/src/main/res/values-ca/strings.xml | 225 +-------------
.../src/main/res/values-cs-rCZ/strings.xml | 222 +-------------
orbotservice/src/main/res/values-cs/strings.xml | 66 +---
orbotservice/src/main/res/values-cy/strings.xml | 75 +----
orbotservice/src/main/res/values-da/strings.xml | 201 +------------
.../src/main/res/values-de-rAT/strings.xml | 1 -
orbotservice/src/main/res/values-de/strings.xml | 292 +-----------------
orbotservice/src/main/res/values-el/strings.xml | 207 +------------
.../src/main/res/values-en-rGB/strings.xml | 4 +-
orbotservice/src/main/res/values-eo/strings.xml | 146 +--------
.../src/main/res/values-es-rAR/strings.xml | 61 +---
orbotservice/src/main/res/values-es/strings.xml | 293 +-----------------
orbotservice/src/main/res/values-et/strings.xml | 209 +------------
orbotservice/src/main/res/values-eu/strings.xml | 218 +-------------
orbotservice/src/main/res/values-fa/strings.xml | 291 +-----------------
orbotservice/src/main/res/values-fi/strings.xml | 278 +----------------
.../src/main/res/values-fr-rFR/strings.xml | 292 +-----------------
orbotservice/src/main/res/values-fr/strings.xml | 39 +--
orbotservice/src/main/res/values-gl/strings.xml | 207 +------------
.../src/main/res/values-gu-rIN/strings.xml | 7 +-
orbotservice/src/main/res/values-gu/strings.xml | 10 +-
orbotservice/src/main/res/values-he/strings.xml | 231 +-------------
orbotservice/src/main/res/values-hi/strings.xml | 19 +-
.../src/main/res/values-hr-rHR/strings.xml | 27 +-
orbotservice/src/main/res/values-hr/strings.xml | 292 +-----------------
orbotservice/src/main/res/values-hu/strings.xml | 292 +-----------------
.../src/main/res/values-hy-rAM/strings.xml | 1 -
orbotservice/src/main/res/values-ia/strings.xml | 27 +-
orbotservice/src/main/res/values-id/strings.xml | 283 +----------------
.../src/main/res/values-in-rID/strings.xml | 283 +----------------
orbotservice/src/main/res/values-in/strings.xml | 42 +--
orbotservice/src/main/res/values-is/strings.xml | 278 +----------------
orbotservice/src/main/res/values-it/strings.xml | 292 +-----------------
orbotservice/src/main/res/values-iw/strings.xml | 231 +-------------
orbotservice/src/main/res/values-ja/strings.xml | 292 +-----------------
.../src/main/res/values-kn-rIN/strings.xml | 1 -
orbotservice/src/main/res/values-kn/strings.xml | 1 -
orbotservice/src/main/res/values-ko/strings.xml | 213 +------------
orbotservice/src/main/res/values-ky/strings.xml | 12 +-
.../src/main/res/values-lt-rLT/strings.xml | 1 -
orbotservice/src/main/res/values-lt/strings.xml | 23 +-
orbotservice/src/main/res/values-lv/strings.xml | 278 +----------------
orbotservice/src/main/res/values-mk/strings.xml | 278 +----------------
orbotservice/src/main/res/values-ml/strings.xml | 1 -
orbotservice/src/main/res/values-mn/strings.xml | 1 -
.../src/main/res/values-mr-rIN/strings.xml | 1 -
.../src/main/res/values-ms-rMY/strings.xml | 194 +-----------
orbotservice/src/main/res/values-ms/strings.xml | 199 +-----------
orbotservice/src/main/res/values-my/strings.xml | 27 +-
orbotservice/src/main/res/values-nb/strings.xml | 258 +---------------
orbotservice/src/main/res/values-nl/strings.xml | 291 +-----------------
orbotservice/src/main/res/values-pa/strings.xml | 12 +-
orbotservice/src/main/res/values-pl/strings.xml | 292 +-----------------
orbotservice/src/main/res/values-ps/strings.xml | 1 -
.../src/main/res/values-pt-rBR/strings.xml | 284 +-----------------
.../src/main/res/values-pt-rPT/strings.xml | 4 +-
orbotservice/src/main/res/values-pt/strings.xml | 179 +----------
.../src/main/res/values-ro-rRO/strings.xml | 27 +-
orbotservice/src/main/res/values-ro/strings.xml | 230 +-------------
.../src/main/res/values-rs-rAR/strings.xml | 43 +--
orbotservice/src/main/res/values-ru/strings.xml | 292 +-----------------
.../src/main/res/values-si-rLK/strings.xml | 188 +-----------
.../src/main/res/values-sk-rSK/strings.xml | 8 +-
orbotservice/src/main/res/values-sk/strings.xml | 38 +--
orbotservice/src/main/res/values-sl/strings.xml | 74 +----
orbotservice/src/main/res/values-sn/strings.xml | 14 +-
orbotservice/src/main/res/values-sq/strings.xml | 27 +-
orbotservice/src/main/res/values-sr/strings.xml | 197 +-----------
orbotservice/src/main/res/values-sv/strings.xml | 292 +-----------------
orbotservice/src/main/res/values-ta/strings.xml | 62 +---
orbotservice/src/main/res/values-th/strings.xml | 171 +----------
orbotservice/src/main/res/values-tl/strings.xml | 251 +---------------
orbotservice/src/main/res/values-tr/strings.xml | 279 +----------------
orbotservice/src/main/res/values-uk/strings.xml | 278 +----------------
orbotservice/src/main/res/values-ur/strings.xml | 9 +-
orbotservice/src/main/res/values-uz/strings.xml | 42 +--
orbotservice/src/main/res/values-vi/strings.xml | 292 +-----------------
.../src/main/res/values-zh-rCN/strings.xml | 297 +-----------------
.../src/main/res/values-zh-rTW/strings.xml | 110 +------
orbotservice/src/main/res/values/dimens.xml | 334 ---------------------
orbotservice/src/main/res/values/strings.xml | 327 +-------------------
orbotservice/src/main/res/values/styles.xml | 5 -
304 files changed, 2375 insertions(+), 23672 deletions(-)
1
0

[orbot/master] Removes warning on ndk-build where the target API for NDK (16) is
by n8fr8@torproject.org 05 Jul '19
by n8fr8@torproject.org 05 Jul '19
05 Jul '19
commit 917e49f55dba8ba4cafeb24ee6372c9cba01e1ae
Author: bim <dsnake(a)protonmail.com>
Date: Thu May 30 14:12:42 2019 -0400
Removes warning on ndk-build where the target API for NDK (16) is
greater than the sdk version defined for the project. Since nothing
was specified in the manifest it defaulted to 1 but we can set this
to Orbot's minSdkVersion of 16 to get rid of this warning
---
orbotservice/src/main/AndroidManifest.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/orbotservice/src/main/AndroidManifest.xml b/orbotservice/src/main/AndroidManifest.xml
index 4b1691d7..0f70c64b 100644
--- a/orbotservice/src/main/AndroidManifest.xml
+++ b/orbotservice/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.torproject.android.service">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-
+ <uses-sdk android:minSdkVersion="16"/>
</manifest>
1
0

05 Jul '19
commit 397391f0580c4997444bfb520fe13c64fa6c973f
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Tue Jun 4 05:27:22 2019 -0400
remove hardcoded port values, make it all dynamic
---
app/src/main/res/xml/preferences.xml | 6 ++--
.../org/torproject/android/service/TorService.java | 39 +++++++++++++++-------
.../android/service/TorServiceConstants.java | 19 ++++++-----
.../android/service/vpn/OrbotVpnManager.java | 11 +++---
4 files changed, 45 insertions(+), 30 deletions(-)
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 1f49d58b..53aa5ecd 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -244,7 +244,7 @@
<PreferenceCategory android:title="Debug">
<EditTextPreference
- android:defaultValue="9050"
+ android:defaultValue="auto"
android:dialogTitle="@string/pref_socks_dialog"
android:inputType="number"
android:key="pref_socks"
@@ -252,7 +252,7 @@
android:title="@string/pref_socks_title" />
<EditTextPreference
- android:defaultValue="9040"
+ android:defaultValue="auto"
android:dialogTitle="@string/pref_transport_dialog"
android:inputType="number"
android:key="pref_transport"
@@ -260,7 +260,7 @@
android:title="@string/pref_transport_title" />
<EditTextPreference
- android:defaultValue="5400"
+ android:defaultValue="auto"
android:dialogTitle="@string/pref_dnsport_dialog"
android:inputType="number"
android:key="pref_dnsport"
diff --git a/orbotservice/src/main/java/org/torproject/android/service/TorService.java b/orbotservice/src/main/java/org/torproject/android/service/TorService.java
index 4517a106..9d88aeb9 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/TorService.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/TorService.java
@@ -9,6 +9,7 @@ package org.torproject.android.service;
import android.annotation.SuppressLint;
+import android.app.Application;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -28,6 +29,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Build;
+import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.BaseColumns;
@@ -89,8 +91,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
private TorControlConnection conn = null;
private int mLastProcessId = -1;
- public static int mPortSOCKS = SOCKS_PROXY_PORT_DEFAULT;
- public static int mPortHTTP = HTTP_PROXY_PORT_DEFAULT;
+ public static int mPortSOCKS = -1;
+ public static int mPortHTTP = -1;
public static int mPortDns = TOR_DNS_PORT_DEFAULT;
public static int mPortTrans = TOR_TRANSPROXY_PORT_DEFAULT;
@@ -132,6 +134,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
private static final Uri HS_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.hiddenservices.providers/hs");
private static final Uri COOKIE_CONTENT_URI = Uri.parse("content://org.torproject.android.ui.hiddenservices.providers.cookie/cookie");
+ private Handler mHandler;
+
public static final class HiddenService implements BaseColumns {
public static final String NAME = "name";
public static final String PORT = "port";
@@ -510,16 +514,18 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
try
{
+ mHandler = new Handler ();
+
appBinHome = getFilesDir();//getDir(TorServiceConstants.DIRECTORY_TOR_BINARY, Application.MODE_PRIVATE);
if (!appBinHome.exists())
appBinHome.mkdirs();
- appCacheHome = getCacheDir();// getDir(TorServiceConstants.DIRECTORY_TOR_DATA,Application.MODE_PRIVATE);
+ appCacheHome = getDir(DIRECTORY_TOR_DATA, Application.MODE_PRIVATE);
if (!appCacheHome.exists())
appCacheHome.mkdirs();
- fileTorRc = new File(appBinHome, TorServiceConstants.TORRC_ASSET_KEY);
- fileControlPort = new File(getFilesDir(), "control.txt");
+ fileTorRc = new File(appBinHome, TORRC_ASSET_KEY);
+ fileControlPort = new File(getFilesDir(), TOR_CONTROL_PORT_FILE);
mHSBasePath = new File(
getFilesDir().getAbsolutePath(),
@@ -682,9 +688,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
extraLines.append("SocksListenAddress 0.0.0.0").append('\n');
-
- String httpPortPref = HTTP_PROXY_PORT_DEFAULT + "";
- extraLines.append("HTTPTunnelPort ").append(checkPortOrAuto(httpPortPref)).append('\n');
+ extraLines.append("HTTPTunnelPort ").append(checkPortOrAuto(HTTP_PROXY_PORT_DEFAULT)).append('\n');
if(prefs.getBoolean(OrbotConstants.PREF_CONNECTION_PADDING, false))
{
@@ -1922,10 +1926,21 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
private void startVPNService ()
{
- Intent intentVpn = new Intent(this,TorVpnService.class);
- intentVpn.setAction("start");
- intentVpn.putExtra("torSocks",mPortSOCKS);
- startService(intentVpn);
+ if (mPortSOCKS != -1) {
+ Intent intentVpn = new Intent(this, TorVpnService.class);
+ intentVpn.setAction("start");
+ intentVpn.putExtra("torSocks", mPortSOCKS);
+ startService(intentVpn);
+ }
+ else
+ {
+ mHandler.postDelayed(new Runnable() {
+ public void run ()
+ {
+ startVPNService();
+ }
+ },5000);
+ }
}
diff --git a/orbotservice/src/main/java/org/torproject/android/service/TorServiceConstants.java b/orbotservice/src/main/java/org/torproject/android/service/TorServiceConstants.java
index e02c8f81..22a6ea29 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/TorServiceConstants.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/TorServiceConstants.java
@@ -11,8 +11,10 @@ public interface TorServiceConstants {
String BROWSER_APP_USERNAME = "info.guardianproject.orfox";
//String DIRECTORY_TOR_BINARY = "bin";
- //String DIRECTORY_TOR_DATA = "data";
-
+ String DIRECTORY_TOR_DATA = "data";
+
+ String TOR_CONTROL_PORT_FILE = "control.txt";
+
//name of the tor C binary
String TOR_ASSET_KEY = "tor";
@@ -51,18 +53,17 @@ public interface TorServiceConstants {
int FILE_WRITE_BUFFER_SIZE = 1024;
String IP_LOCALHOST = "127.0.0.1";
- int UPDATE_TIMEOUT = 1000;
+// int UPDATE_TIMEOUT = 1000;
int TOR_TRANSPROXY_PORT_DEFAULT = 9040;
- int STANDARD_DNS_PORT = 53;
+// int STANDARD_DNS_PORT = 53;
int TOR_DNS_PORT_DEFAULT = 5400;
- String TOR_VPN_DNS_LISTEN_ADDRESS = "127.0.0.1";
+// String TOR_VPN_DNS_LISTEN_ADDRESS = "127.0.0.1";
- int CONTROL_PORT_DEFAULT = 9051;
- int HTTP_PROXY_PORT_DEFAULT = 8118; // like Privoxy!
- int SOCKS_PROXY_PORT_DEFAULT = 9050;
+// int CONTROL_PORT_DEFAULT = 9051;
+ String HTTP_PROXY_PORT_DEFAULT = "auto"; // like Privoxy!
+ String SOCKS_PROXY_PORT_DEFAULT = "auto";
-
//path to check Tor against
String URL_TOR_CHECK = "https://check.torproject.org";
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
index 2db02389..e7675001 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
@@ -62,8 +62,8 @@ public class OrbotVpnManager implements Handler.Callback {
private String mSessionName = "OrbotVPN";
private ParcelFileDescriptor mInterface;
- private int mTorSocks = TorServiceConstants.SOCKS_PROXY_PORT_DEFAULT;
-
+ private int mTorSocks = -1;
+
public static int sSocksProxyServerPort = -1;
public static String sSocksProxyLocalhost = null;
private ProxyServer mSocksProxyServer;
@@ -110,8 +110,8 @@ public class OrbotVpnManager implements Handler.Callback {
if (mThreadVPN == null || (!mThreadVPN.isAlive()))
{
Log.d(TAG,"starting OrbotVPNService service!");
-
- mTorSocks = intent.getIntExtra("torSocks", TorServiceConstants.SOCKS_PROXY_PORT_DEFAULT);
+
+ mTorSocks = intent.getIntExtra("torSocks", -1);
if (!mIsLollipop)
{
@@ -303,8 +303,7 @@ public class OrbotVpnManager implements Handler.Callback {
final String dummyDNS = "1.1.1.1"; //this is intercepted by the tun2socks library, but we must put in a valid DNS to start
final String defaultRoute = "0.0.0.0";
- final String localSocks = localhost + ':'
- + String.valueOf(mTorSocks);
+ final String localSocks = localhost + ':' + mTorSocks;
final String localDNS = virtualGateway + ':' + PDNSD_PORT;
1
0
commit 7ae000d0c2a59c2257f2779de42ad48b4b4080d0
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Fri May 31 14:28:26 2019 -0400
fix pdnsd/VPN support
---
.gitignore | 8 +-
.../org/torproject/android/service/TorService.java | 5 +-
.../android/service/TorServiceConstants.java | 3 -
.../android/service/util/CustomNativeLoader.java | 32 ---
.../service/util/CustomTorResourceInstaller.java | 57 +-----
.../service/util/OtherResourceInstaller.java | 228 ---------------------
.../android/service/vpn/OrbotVpnManager.java | 21 +-
.../android/service/vpn/PDNSDInstaller.java | 195 ++++++++++++++++++
.../android/service/vpn/TorVpnService.java | 11 +-
.../src/main/libs/arm64-v8a/libtun2socks.so | Bin 0 -> 196640 bytes
orbotservice/src/main/libs/arm64-v8a/pdnsd.so | Bin 0 -> 207224 bytes
.../src/main/libs/armeabi-v7a/libtun2socks.so | Bin 0 -> 137836 bytes
orbotservice/src/main/libs/armeabi-v7a/pdnsd.so | Bin 0 -> 169824 bytes
orbotservice/src/main/libs/armeabi/libtun2socks.so | Bin 0 -> 146024 bytes
orbotservice/src/main/libs/armeabi/pdnsd.so | Bin 0 -> 178012 bytes
orbotservice/src/main/libs/x86/libtun2socks.so | Bin 0 -> 195120 bytes
orbotservice/src/main/libs/x86/pdnsd.so | Bin 0 -> 202532 bytes
orbotservice/src/main/libs/x86_64/libtun2socks.so | Bin 0 -> 196920 bytes
orbotservice/src/main/libs/x86_64/pdnsd.so | Bin 0 -> 219696 bytes
19 files changed, 225 insertions(+), 335 deletions(-)
diff --git a/.gitignore b/.gitignore
index a8f09edc..a6294876 100644
--- a/.gitignore
+++ b/.gitignore
@@ -64,10 +64,10 @@ obj
app/src/main/jniLibs/
app/src/main/libs/
-orbotservice/src/main/libs/
-orbotservice/src/main/jniLibs/
-orbotservice/src/main/assets/armeabi/
-orbotservice/src/main/assets/x86/
+#orbotservice/src/main/libs/
+#orbotservice/src/main/jniLibs/
+#orbotservice/src/main/assets/armeabi/
+#orbotservice/src/main/assets/x86/
# emacs
*~
diff --git a/orbotservice/src/main/java/org/torproject/android/service/TorService.java b/orbotservice/src/main/java/org/torproject/android/service/TorService.java
index 6f9f6c12..2561a132 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/TorService.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/TorService.java
@@ -44,7 +44,7 @@ import org.torproject.android.control.TorControlConnection;
import org.torproject.android.service.util.CustomShell;
import org.torproject.android.service.util.CustomTorResourceInstaller;
import org.torproject.android.service.util.DummyActivity;
-import org.torproject.android.service.util.OtherResourceInstaller;
+import org.torproject.android.service.vpn.PDNSDInstaller;
import org.torproject.android.service.util.Prefs;
import org.torproject.android.service.util.TorServiceUtils;
import org.torproject.android.service.util.Utils;
@@ -603,9 +603,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if (!fileTorRc.exists())
return false;
- OtherResourceInstaller oInstaller = new OtherResourceInstaller(this, appBinHome);
- oInstaller.installResources();
-
isTorUpgradeAndConfigComplete = true;
return true;
diff --git a/orbotservice/src/main/java/org/torproject/android/service/TorServiceConstants.java b/orbotservice/src/main/java/org/torproject/android/service/TorServiceConstants.java
index b557de80..e02c8f81 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/TorServiceConstants.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/TorServiceConstants.java
@@ -143,9 +143,6 @@ public interface TorServiceConstants {
// String MEEK_ASSET_KEY = "meek-client";
- //DNS daemon for TCP DNS over TOr
- String PDNSD_ASSET_KEY = "pdnsd";
-
//EXIT COUNTRY CODES
String[] COUNTRY_CODES = {"DE","AT","SE","CH","IS","CA","US","ES","FR","BG","PL","AU","BR","CZ","DK","FI","GB","HU","NL","JP","RO","RU","SG","SK"};
diff --git a/orbotservice/src/main/java/org/torproject/android/service/util/CustomNativeLoader.java b/orbotservice/src/main/java/org/torproject/android/service/util/CustomNativeLoader.java
index bae4b068..0df6784a 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/util/CustomNativeLoader.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/util/CustomNativeLoader.java
@@ -74,38 +74,6 @@ public class CustomNativeLoader {
try {
String folder = Build.CPU_ABI;
- /**
- try {
-
- if (Build.CPU_ABI.equalsIgnoreCase("arm64-v8a")) {
- folder = "arm64-v8a";
- }
- else if (Build.CPU_ABI.equalsIgnoreCase("arm64")) {
- folder = "arm64";
- }
- else if (Build.CPU_ABI.equalsIgnoreCase("x86_64")) {
- folder = "x86_64";
- }
- else if (Build.CPU_ABI.equalsIgnoreCase("armeabi-v7a")) {
- folder = "armeabi-v7a";
- }
- else if (Build.CPU_ABI.equalsIgnoreCase("armeabi")) {
- folder = "armeabi";
- } else if (Build.CPU_ABI.equalsIgnoreCase("x86")) {
- folder = "x86";
- } else if (Build.CPU_ABI.equalsIgnoreCase("mips")) {
- folder = "mips";
- } else {
- folder = "armeabi";
- //FileLog.e("tmessages", "Unsupported arch: " + Build.CPU_ABI);
- }
-
- } catch (Exception e) {
- // FileLog.e("tmessages", e);
- Log.e(TAG, e.getMessage(),e);
- folder = "armeabi";
- }**/
-
String javaArch = System.getProperty("os.arch");
if (javaArch != null && javaArch.contains("686")) {
diff --git a/orbotservice/src/main/java/org/torproject/android/service/util/CustomTorResourceInstaller.java b/orbotservice/src/main/java/org/torproject/android/service/util/CustomTorResourceInstaller.java
index 043987e2..7e9dcc55 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/util/CustomTorResourceInstaller.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/util/CustomTorResourceInstaller.java
@@ -4,30 +4,26 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.util.Log;
-import org.torproject.android.binary.NativeLoader;
import org.torproject.android.binary.TorServiceConstants;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.io.PrintStream;
import java.util.concurrent.TimeoutException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
-
public class CustomTorResourceInstaller implements TorServiceConstants {
- File installFolder;
- Context context;
+ private File installFolder;
+ private Context context;
- File fileTorrc;
- File fileTor;
+ private File fileTorrc;
+ private File fileTor;
public CustomTorResourceInstaller (Context context, File installFolder)
{
@@ -35,35 +31,6 @@ public class CustomTorResourceInstaller implements TorServiceConstants {
this.context = context;
}
- public File getTorrcFile ()
- {
- return fileTorrc;
- }
-
- public File getTorFile ()
- {
- return fileTor;
- }
-
- /**
- private void deleteDirectory(File file) {
- if( file.exists() ) {
- if (file.isDirectory()) {
- File[] files = file.listFiles();
- for(int i=0; i<files.length; i++) {
- if(files[i].isDirectory()) {
- deleteDirectory(files[i]);
- }
- else {
- files[i].delete();
- }
- }
- }
-
- file.delete();
- }
- }**/
-
//
/*
* Extract the Tor resources from the APK file using ZIP
@@ -127,23 +94,7 @@ public class CustomTorResourceInstaller implements TorServiceConstants {
}
- public boolean updateTorConfigCustom (File fileTorRcCustom, String extraLines) throws IOException, FileNotFoundException, TimeoutException
- {
- if (fileTorRcCustom.exists())
- {
- fileTorRcCustom.delete();
- Log.d("torResources","deleting existing torrc.custom");
- }
- else
- fileTorRcCustom.createNewFile();
- FileOutputStream fos = new FileOutputStream(fileTorRcCustom, false);
- PrintStream ps = new PrintStream(fos);
- ps.print(extraLines);
- ps.close();
-
- return true;
- }
/*
* Extract the Tor binary from the APK file using ZIP
diff --git a/orbotservice/src/main/java/org/torproject/android/service/util/OtherResourceInstaller.java b/orbotservice/src/main/java/org/torproject/android/service/util/OtherResourceInstaller.java
deleted file mode 100644
index 241f6c7e..00000000
--- a/orbotservice/src/main/java/org/torproject/android/service/util/OtherResourceInstaller.java
+++ /dev/null
@@ -1,228 +0,0 @@
-package org.torproject.android.service.util;
-
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.StringBufferInputStream;
-import java.util.ArrayList;
-import java.util.concurrent.TimeoutException;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.os.Build;
-import android.util.Log;
-
-import org.torproject.android.service.OrbotConstants;
-import org.torproject.android.service.R;
-import org.torproject.android.service.TorServiceConstants;
-
-public class OtherResourceInstaller implements TorServiceConstants {
-
-
- File installFolder;
- Context context;
-
- public OtherResourceInstaller (Context context, File installFolder)
- {
- this.installFolder = installFolder;
-
- this.context = context;
- }
-
- public void deleteDirectory(File file) {
- if( file.exists() ) {
- if (file.isDirectory()) {
- File[] files = file.listFiles();
- for(int i=0; i<files.length; i++) {
- if(files[i].isDirectory()) {
- deleteDirectory(files[i]);
- }
- else {
- files[i].delete();
- }
- }
- }
-
- file.delete();
- }
- }
-
- private final static String COMMAND_RM_FORCE = "rm -f ";
- private final static String MP3_EXT = ".mp3";
- //
- /*
- * Extract the Tor resources from the APK file using ZIP
- */
- public boolean installResources () throws IOException
- {
-
- File outFile;
-
- if (!installFolder.exists())
- installFolder.mkdirs();
-
- outFile = new File(installFolder, PDNSD_ASSET_KEY);
- NativeLoader.initNativeLibs(context,PDNSD_ASSET_KEY,outFile);
-
-// outFile = new File(installFolder, OBFSCLIENT_ASSET_KEY);
- // NativeLoader.initNativeLibs(context,OBFSCLIENT_ASSET_KEY,outFile);
-
- return true;
- }
-
- // Return Full path to the directory where native JNI libraries are stored.
- public static String getNativeLibraryDir(Context context) {
- ApplicationInfo appInfo = context.getApplicationInfo();
- return appInfo.nativeLibraryDir;
- }
-
- public boolean updateTorConfigCustom (File fileTorRcCustom, String extraLines) throws IOException, FileNotFoundException, TimeoutException
- {
- if (fileTorRcCustom.exists())
- {
- fileTorRcCustom.delete();
- Log.d("torResources","deleting existing torrc.custom");
- }
- else
- fileTorRcCustom.createNewFile();
-
- FileOutputStream fos = new FileOutputStream(fileTorRcCustom, false);
- PrintStream ps = new PrintStream(fos);
- ps.print(extraLines);
- ps.close();
-
- return true;
- }
-
-
- /*
- * Write the inputstream contents to the file
- */
- public static boolean streamToFile(InputStream stm, File outFile, boolean append, boolean zip) throws IOException
-
- {
- byte[] buffer = new byte[FILE_WRITE_BUFFER_SIZE];
-
- int bytecount;
-
- OutputStream stmOut = new FileOutputStream(outFile.getAbsolutePath(), append);
- ZipInputStream zis = null;
-
- if (zip)
- {
- zis = new ZipInputStream(stm);
- ZipEntry ze = zis.getNextEntry();
- stm = zis;
-
- }
-
- while ((bytecount = stm.read(buffer)) > 0)
- {
-
- stmOut.write(buffer, 0, bytecount);
-
- }
-
- stmOut.close();
- stm.close();
-
- if (zis != null)
- zis.close();
-
-
- return true;
-
- }
-
- //copy the file from inputstream to File output - alternative impl
- public static boolean copyFile (InputStream is, File outputFile)
- {
-
- try {
- if (outputFile.exists())
- outputFile.delete();
-
- boolean newFile = outputFile.createNewFile();
- DataOutputStream out = new DataOutputStream(new FileOutputStream(outputFile));
- DataInputStream in = new DataInputStream(is);
-
- int b = -1;
- byte[] data = new byte[1024];
-
- while ((b = in.read(data)) != -1) {
- out.write(data);
- }
-
- if (b == -1); //rejoice
-
- //
- out.flush();
- out.close();
- in.close();
- // chmod?
-
- return newFile;
-
-
- } catch (IOException ex) {
- Log.e(OrbotConstants.TAG, "error copying binary", ex);
- return false;
- }
-
- }
-
-
-
-
- /**
- * Copies a raw resource file, given its ID to the given location
- * @param ctx context
- * @param resid resource id
- * @param file destination file
- * @param mode file permissions (E.g.: "755")
- * @throws IOException on error
- * @throws InterruptedException when interrupted
- */
- public static void copyRawFile(Context ctx, int resid, File file, String mode, boolean isZipd) throws IOException, InterruptedException
- {
- final String abspath = file.getAbsolutePath();
- // Write the iptables binary
- final FileOutputStream out = new FileOutputStream(file);
- InputStream is = ctx.getResources().openRawResource(resid);
-
- if (isZipd)
- {
- ZipInputStream zis = new ZipInputStream(is);
- ZipEntry ze = zis.getNextEntry();
- is = zis;
- }
-
- byte buf[] = new byte[1024];
- int len;
- while ((len = is.read(buf)) > 0) {
- out.write(buf, 0, len);
- }
- out.close();
- is.close();
- // Change the permissions
- Runtime.getRuntime().exec("chmod "+mode+" "+abspath).waitFor();
- }
-
-
- private void setExecutable(File fileBin) {
- fileBin.setReadable(true);
- fileBin.setExecutable(true);
- fileBin.setWritable(false);
- fileBin.setWritable(true, true);
- }
-
-}
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
index 90a13336..b5f294f4 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
@@ -87,12 +87,10 @@ public class OrbotVpnManager implements Handler.Callback {
private VpnService mService;
- public OrbotVpnManager (VpnService service)
- {
+ public OrbotVpnManager (VpnService service) throws IOException, TimeoutException {
mService = service;
- File fileBinHome = service.getFilesDir();//mService.getDir(TorServiceConstants.DIRECTORY_TOR_BINARY, Application.MODE_PRIVATE);
- filePdnsd = new File(fileBinHome,TorServiceConstants.PDNSD_ASSET_KEY);
+ filePdnsd = new PDNSDInstaller(service.getApplicationContext(),service.getFilesDir()).installResources();
Tun2Socks.init();
@@ -344,13 +342,13 @@ public class OrbotVpnManager implements Handler.Callback {
mInterface = newInterface;
- Tun2Socks.Start(mInterface, VPN_MTU, virtualIP, virtualNetMask, localSocks , localDNS , localDnsTransparentProxy);
-
isRestart = false;
//start PDNSD daemon pointing to actual DNS
startDNS("127.0.0.1",localDns);
+ Tun2Socks.Start(mInterface, VPN_MTU, virtualIP, virtualNetMask, localSocks , localDNS , localDnsTransparentProxy);
+
}
catch (Exception e)
@@ -411,11 +409,11 @@ public class OrbotVpnManager implements Handler.Callback {
private void startDNS (String dns, int port) throws IOException, TimeoutException
{
- makePdnsdConf(mService, dns, port,filePdnsd.getParentFile());
+ File fileConf = makePdnsdConf(mService, dns, port,mService.getFilesDir());
- ArrayList<String> customEnv = new ArrayList<String>();
+ // ArrayList<String> customEnv = new ArrayList<String>();
- String[] cmdString = {filePdnsd.getCanonicalPath(),"-c",filePdnsd.getParent() + "/pdnsd.conf"};
+ String[] cmdString = {filePdnsd.getCanonicalPath(),"-c",fileConf.toString()};
ProcessBuilder pb = new ProcessBuilder(cmdString);
pb.redirectErrorStream(true);
Process proc = pb.start();
@@ -425,6 +423,7 @@ public class OrbotVpnManager implements Handler.Callback {
if (proc.exitValue() != 0)
{
+
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
@@ -437,7 +436,7 @@ public class OrbotVpnManager implements Handler.Callback {
}
- public static void makePdnsdConf(Context context, String dns, int port, File fileDir) throws FileNotFoundException, IOException {
+ public static File makePdnsdConf(Context context, String dns, int port, File fileDir) throws FileNotFoundException, IOException {
String conf = String.format(context.getString(R.string.pdnsd_conf), dns, port, fileDir.getCanonicalPath());
File f = new File(fileDir,"pdnsd.conf");
@@ -460,6 +459,8 @@ public class OrbotVpnManager implements Handler.Callback {
}
}
+
+ return f;
}
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/PDNSDInstaller.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/PDNSDInstaller.java
new file mode 100644
index 00000000..58caffad
--- /dev/null
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/PDNSDInstaller.java
@@ -0,0 +1,195 @@
+package org.torproject.android.service.vpn;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.StringBufferInputStream;
+import java.util.ArrayList;
+import java.util.concurrent.TimeoutException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.os.Build;
+import android.util.Log;
+
+import org.torproject.android.service.OrbotConstants;
+import org.torproject.android.service.R;
+import org.torproject.android.service.TorServiceConstants;
+import org.torproject.android.service.util.CustomNativeLoader;
+import org.torproject.android.service.util.NativeLoader;
+
+public class PDNSDInstaller implements TorServiceConstants {
+
+ private final static String LIB_NAME = "pdnsd";
+ private final static String LIB_SO_NAME = "pdnsd.so";
+
+ private final static String TAG = "TorNativeLoader";
+
+ private File installFolder;
+ private Context context;
+ private File filePdnsd;
+
+ public PDNSDInstaller (Context context, File installFolder)
+ {
+ this.installFolder = installFolder;
+ this.context = context;
+ }
+
+ //
+ /*
+ * Extract the Tor resources from the APK file using ZIP
+ *
+ * @File path to the Tor executable
+ */
+ public File installResources () throws IOException, TimeoutException
+ {
+
+ filePdnsd = new File(installFolder, LIB_NAME);
+
+ if (!installFolder.exists())
+ installFolder.mkdirs();
+
+ File fileNativeDir = new File(getNativeLibraryDir(context));
+ filePdnsd = new File(fileNativeDir,LIB_NAME + ".so");
+
+ if (filePdnsd.exists())
+ {
+ if (filePdnsd.canExecute())
+ return filePdnsd;
+ else
+ {
+ setExecutable(filePdnsd);
+
+ if (filePdnsd.canExecute())
+ return filePdnsd;
+ }
+ }
+
+ if (filePdnsd.exists()) {
+ InputStream is = new FileInputStream(filePdnsd);
+ streamToFile(is, filePdnsd, false, true);
+ setExecutable(filePdnsd);
+
+ if (filePdnsd.exists() && filePdnsd.canExecute())
+ return filePdnsd;
+ }
+
+ //let's try another approach
+ filePdnsd = new File(installFolder, LIB_NAME);
+ //fileTor = NativeLoader.initNativeLibs(context,fileTor);
+ CustomNativeLoader.initNativeLibs(context,filePdnsd);
+
+ setExecutable(filePdnsd);
+
+ if (filePdnsd != null && filePdnsd.exists() && filePdnsd.canExecute())
+ return filePdnsd;
+
+ return null;
+ }
+
+
+ // Return Full path to the directory where native JNI libraries are stored.
+ private static String getNativeLibraryDir(Context context) {
+ ApplicationInfo appInfo = context.getApplicationInfo();
+ return appInfo.nativeLibraryDir;
+ }
+
+
+
+
+
+
+ /*
+ * Reads file from assetPath/assetKey writes it to the install folder
+ */
+ private File assetToFile(String assetPath, String assetKey, boolean isZipped, boolean isExecutable) throws IOException {
+ InputStream is = context.getAssets().open(assetPath);
+ File outFile = new File(installFolder, assetKey);
+ streamToFile(is, outFile, false, isZipped);
+ if (isExecutable) {
+ setExecutable(outFile);
+ }
+ return outFile;
+ }
+
+
+ /*
+ * Write the inputstream contents to the file
+ */
+ private static boolean streamToFile(InputStream stm, File outFile, boolean append, boolean zip) throws IOException
+
+ {
+ byte[] buffer = new byte[FILE_WRITE_BUFFER_SIZE];
+
+ int bytecount;
+
+ OutputStream stmOut = new FileOutputStream(outFile.getAbsolutePath(), append);
+ ZipInputStream zis = null;
+
+ if (zip)
+ {
+ zis = new ZipInputStream(stm);
+ ZipEntry ze = zis.getNextEntry();
+ stm = zis;
+
+ }
+
+ while ((bytecount = stm.read(buffer)) > 0)
+ {
+
+ stmOut.write(buffer, 0, bytecount);
+
+ }
+
+ stmOut.close();
+ stm.close();
+
+ if (zis != null)
+ zis.close();
+
+
+ return true;
+
+ }
+
+
+
+ private void setExecutable(File fileBin) {
+ fileBin.setReadable(true);
+ fileBin.setExecutable(true);
+ fileBin.setWritable(false);
+ fileBin.setWritable(true, true);
+ }
+
+ private static File[] listf(String directoryName) {
+
+ // .............list file
+ File directory = new File(directoryName);
+
+ // get all the files from a directory
+ File[] fList = directory.listFiles();
+
+ if (fList != null)
+ for (File file : fList) {
+ if (file.isFile()) {
+ Log.d(TAG,file.getAbsolutePath());
+ } else if (file.isDirectory()) {
+ listf(file.getAbsolutePath());
+ }
+ }
+
+ return fList;
+ }
+
+
+}
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/TorVpnService.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/TorVpnService.java
index 34d89b49..b02fd71a 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/TorVpnService.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/TorVpnService.java
@@ -4,6 +4,9 @@ import android.app.Service;
import android.content.Intent;
import android.net.VpnService;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
/**
* Created by n8fr8 on 9/26/16.
*/
@@ -13,7 +16,13 @@ public class TorVpnService extends VpnService {
@Override
public void onCreate() {
super.onCreate();
- mVpnManager = new OrbotVpnManager(this);
+ try {
+ mVpnManager = new OrbotVpnManager(this);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (TimeoutException e) {
+ e.printStackTrace();
+ }
}
/* (non-Javadoc)
diff --git a/orbotservice/src/main/libs/arm64-v8a/libtun2socks.so b/orbotservice/src/main/libs/arm64-v8a/libtun2socks.so
new file mode 100755
index 00000000..8aaedda7
Binary files /dev/null and b/orbotservice/src/main/libs/arm64-v8a/libtun2socks.so differ
diff --git a/orbotservice/src/main/libs/arm64-v8a/pdnsd.so b/orbotservice/src/main/libs/arm64-v8a/pdnsd.so
new file mode 100755
index 00000000..1bc4487d
Binary files /dev/null and b/orbotservice/src/main/libs/arm64-v8a/pdnsd.so differ
diff --git a/orbotservice/src/main/libs/armeabi-v7a/libtun2socks.so b/orbotservice/src/main/libs/armeabi-v7a/libtun2socks.so
new file mode 100755
index 00000000..74b86bdf
Binary files /dev/null and b/orbotservice/src/main/libs/armeabi-v7a/libtun2socks.so differ
diff --git a/orbotservice/src/main/libs/armeabi-v7a/pdnsd.so b/orbotservice/src/main/libs/armeabi-v7a/pdnsd.so
new file mode 100755
index 00000000..573b5e42
Binary files /dev/null and b/orbotservice/src/main/libs/armeabi-v7a/pdnsd.so differ
diff --git a/orbotservice/src/main/libs/armeabi/libtun2socks.so b/orbotservice/src/main/libs/armeabi/libtun2socks.so
new file mode 100755
index 00000000..55ef663a
Binary files /dev/null and b/orbotservice/src/main/libs/armeabi/libtun2socks.so differ
diff --git a/orbotservice/src/main/libs/armeabi/pdnsd.so b/orbotservice/src/main/libs/armeabi/pdnsd.so
new file mode 100755
index 00000000..95a5269d
Binary files /dev/null and b/orbotservice/src/main/libs/armeabi/pdnsd.so differ
diff --git a/orbotservice/src/main/libs/x86/libtun2socks.so b/orbotservice/src/main/libs/x86/libtun2socks.so
new file mode 100755
index 00000000..af9a3ccc
Binary files /dev/null and b/orbotservice/src/main/libs/x86/libtun2socks.so differ
diff --git a/orbotservice/src/main/libs/x86/pdnsd.so b/orbotservice/src/main/libs/x86/pdnsd.so
new file mode 100755
index 00000000..c078cc38
Binary files /dev/null and b/orbotservice/src/main/libs/x86/pdnsd.so differ
diff --git a/orbotservice/src/main/libs/x86_64/libtun2socks.so b/orbotservice/src/main/libs/x86_64/libtun2socks.so
new file mode 100755
index 00000000..8861e585
Binary files /dev/null and b/orbotservice/src/main/libs/x86_64/libtun2socks.so differ
diff --git a/orbotservice/src/main/libs/x86_64/pdnsd.so b/orbotservice/src/main/libs/x86_64/pdnsd.so
new file mode 100755
index 00000000..68721cc2
Binary files /dev/null and b/orbotservice/src/main/libs/x86_64/pdnsd.so differ
1
0

[orbot/master] update to AndroidPT Obfs4 and use external JSocksAndroid module
by n8fr8@torproject.org 05 Jul '19
by n8fr8@torproject.org 05 Jul '19
05 Jul '19
commit 5374ca86a9f714f1cc3fb75435ab296651c9b5ab
Author: n8fr8 <nathan(a)guardianproject.info>
Date: Fri May 31 14:48:20 2019 -0400
update to AndroidPT Obfs4 and use external JSocksAndroid module
---
jsocksAndroid/build.gradle | 18 -
jsocksAndroid/src/main/AndroidManifest.xml | 5 -
.../com/runjva/sourceforge/jsocks/main/SOCKS.java | 267 --------
.../jsocks/protocol/Authentication.java | 35 --
.../jsocks/protocol/AuthenticationNone.java | 22 -
.../sourceforge/jsocks/protocol/InetRange.java | 492 ---------------
.../sourceforge/jsocks/protocol/ProxyMessage.java | 118 ----
.../sourceforge/jsocks/protocol/ProxyServer.java | 699 ---------------------
.../sourceforge/jsocks/protocol/Socks4Message.java | 167 -----
.../sourceforge/jsocks/protocol/Socks4Proxy.java | 144 -----
.../jsocks/protocol/Socks5DatagramSocket.java | 480 --------------
.../sourceforge/jsocks/protocol/Socks5Message.java | 325 ----------
.../sourceforge/jsocks/protocol/Socks5Proxy.java | 295 ---------
.../jsocks/protocol/SocksException.java | 111 ----
.../jsocks/protocol/SocksProxyBase.java | 543 ----------------
.../jsocks/protocol/SocksServerSocket.java | 235 -------
.../sourceforge/jsocks/protocol/SocksSocket.java | 385 ------------
.../jsocks/protocol/UDPEncapsulation.java | 33 -
.../jsocks/protocol/UDPRelayServer.java | 227 -------
.../protocol/UserPasswordAuthentication.java | 91 ---
.../runjva/sourceforge/jsocks/server/Ident.java | 171 -----
.../jsocks/server/IdentAuthenticator.java | 182 ------
.../jsocks/server/ServerAuthenticator.java | 126 ----
.../jsocks/server/ServerAuthenticatorBase.java | 187 ------
.../jsocks/server/ServerAuthenticatorNone.java | 16 -
.../jsocks/server/UserPasswordAuthenticator.java | 82 ---
.../sourceforge/jsocks/server/UserValidation.java | 24 -
orbotservice/build.gradle | 6 +-
.../org/torproject/android/service/TorService.java | 36 +-
.../android/service/vpn/OrbotVpnManager.java | 2 +-
settings.gradle | 3 +-
31 files changed, 38 insertions(+), 5489 deletions(-)
diff --git a/jsocksAndroid/build.gradle b/jsocksAndroid/build.gradle
deleted file mode 100644
index a6215bf0..00000000
--- a/jsocksAndroid/build.gradle
+++ /dev/null
@@ -1,18 +0,0 @@
-apply plugin: 'com.android.library'
-
-android {
- compileSdkVersion 28
- buildToolsVersion '28.0.3'
-
- defaultConfig {
- minSdkVersion 16
- targetSdkVersion 28
- }
-
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
- }
- }
-}
diff --git a/jsocksAndroid/src/main/AndroidManifest.xml b/jsocksAndroid/src/main/AndroidManifest.xml
deleted file mode 100644
index fb20a650..00000000
--- a/jsocksAndroid/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.jsocksandroid" >
-
-
-</manifest>
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/main/SOCKS.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/main/SOCKS.java
deleted file mode 100644
index 9174c7ea..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/main/SOCKS.java
+++ /dev/null
@@ -1,267 +0,0 @@
-package com.runjva.sourceforge.jsocks.main;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Hashtable;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import android.util.Log;
-
-import com.runjva.sourceforge.jsocks.protocol.InetRange;
-import com.runjva.sourceforge.jsocks.protocol.ProxyServer;
-import com.runjva.sourceforge.jsocks.protocol.SocksProxyBase;
-import com.runjva.sourceforge.jsocks.server.IdentAuthenticator;
-
-public class SOCKS {
-
- private static final int DEFAULT_LISTENING_PORT = 1080;
-
- static public void usage() {
- System.out.println("Usage: java SOCKS [inifile1 inifile2 ...]\n"
- + "If none inifile is given, uses socks.properties.\n");
- }
-
- static public void main(String[] args) {
-
- String[] file_names;
- int port = DEFAULT_LISTENING_PORT;
- String logFile = null;
- String host = null;
-
- final IdentAuthenticator auth = new IdentAuthenticator();
-
- InetAddress localIP = null;
-
- if (args.length == 0) {
- file_names = new String[] { "socks.properties" };
- } else {
- file_names = args;
- }
-
- inform("Loading properties");
- for (int i = 0; i < file_names.length; ++i) {
-
- inform("Reading file " + file_names[i]);
-
- final Properties pr = loadProperties(file_names[i]);
- if (pr == null) {
- System.err.println("Loading of properties from "
- + file_names[i] + "failed.");
- usage();
- return;
- }
- if (!addAuth(auth, pr)) {
- System.err.println("Error in file " + file_names[i] + ".");
- usage();
- return;
- }
- // First file should contain all global settings,
- // like port and host and log.
- if (i == 0) {
- final String port_s = (String) pr.get("port");
- if (port_s != null) {
- try {
- port = Integer.parseInt(port_s);
- } catch (final NumberFormatException nfe) {
- System.err.println("Can't parse port: " + port_s);
- return;
- }
- }
-
- serverInit(pr);
- logFile = (String) pr.get("log");
- host = (String) pr.get("host");
- }
-
- // inform("Props:"+pr);
- }
-
- if (logFile != null) {
- System.err.println("log property not supported anymore.");
- }
- if (host != null) {
- try {
- localIP = InetAddress.getByName(host);
- } catch (final UnknownHostException uhe) {
- System.err.println("Can't resolve local ip: " + host);
- return;
- }
- }
-
- inform("Using Ident Authentication scheme: " + auth);
- final ProxyServer server = new ProxyServer(auth);
- server.start(port, 5, localIP);
- }
-
- static Properties loadProperties(String file_name) {
-
- final Properties pr = new Properties();
-
- try {
- final InputStream fin = new FileInputStream(file_name);
- pr.load(fin);
- fin.close();
- } catch (final IOException ioe) {
- return null;
- }
- return pr;
- }
-
- static boolean addAuth(IdentAuthenticator ident, Properties pr) {
-
- InetRange irange;
-
- final String range = (String) pr.get("range");
- if (range == null) {
- return false;
- }
- irange = parseInetRange(range);
-
- final String users = (String) pr.get("users");
-
- if (users == null) {
- ident.add(irange, null);
- return true;
- }
-
- final Hashtable<String, String> uhash = new Hashtable<String, String>();
-
- final StringTokenizer st = new StringTokenizer(users, ";");
- while (st.hasMoreTokens()) {
- uhash.put(st.nextToken(), "");
- }
-
- ident.add(irange, uhash);
- return true;
- }
-
- /**
- * Does server initialisation.
- */
- static void serverInit(Properties props) {
- int val;
- val = readInt(props, "iddleTimeout");
- if (val >= 0) {
- ProxyServer.setIddleTimeout(val);
- inform("Setting iddle timeout to " + val + " ms.");
- }
- val = readInt(props, "acceptTimeout");
- if (val >= 0) {
- ProxyServer.setAcceptTimeout(val);
- inform("Setting accept timeout to " + val + " ms.");
- }
- val = readInt(props, "udpTimeout");
- if (val >= 0) {
- ProxyServer.setUDPTimeout(val);
- inform("Setting udp timeout to " + val + " ms.");
- }
-
- val = readInt(props, "datagramSize");
- if (val >= 0) {
- ProxyServer.setDatagramSize(val);
- inform("Setting datagram size to " + val + " bytes.");
- }
-
- proxyInit(props);
-
- }
-
- /**
- * Initialises proxy, if any specified.
- */
- static void proxyInit(Properties props) {
- String proxy_list;
- SocksProxyBase proxy = null;
- StringTokenizer st;
-
- proxy_list = (String) props.get("proxy");
- if (proxy_list == null) {
- return;
- }
-
- st = new StringTokenizer(proxy_list, ";");
- while (st.hasMoreTokens()) {
- final String proxy_entry = st.nextToken();
-
- final SocksProxyBase p = SocksProxyBase.parseProxy(proxy_entry);
-
- if (p == null) {
- exit("Can't parse proxy entry:" + proxy_entry);
- }
-
- inform("Adding Proxy:" + p);
-
- if (proxy != null) {
- p.setChainProxy(proxy);
- }
-
- proxy = p;
-
- }
- if (proxy == null) {
- return; // Empty list
- }
-
- final String direct_hosts = (String) props.get("directHosts");
- if (direct_hosts != null) {
- final InetRange ir = parseInetRange(direct_hosts);
- inform("Setting direct hosts:" + ir);
- proxy.setDirect(ir);
- }
-
- ProxyServer.setProxy(proxy);
- }
-
- /**
- * Inits range from the string of semicolon separated ranges.
- */
- static InetRange parseInetRange(String source) {
- final InetRange irange = new InetRange();
-
- final StringTokenizer st = new StringTokenizer(source, ";");
- while (st.hasMoreTokens()) {
- irange.add(st.nextToken());
- }
-
- return irange;
- }
-
- /**
- * Integer representaion of the property named name, or -1 if one is not
- * found.
- */
- static int readInt(Properties props, String name) {
- int result = -1;
- final String val = (String) props.get(name);
- if (val == null) {
- return -1;
- }
- final StringTokenizer st = new StringTokenizer(val);
- if (!st.hasMoreElements()) {
- return -1;
- }
- try {
- result = Integer.parseInt(st.nextToken());
- } catch (final NumberFormatException nfe) {
- inform("Bad value for " + name + ":" + val);
- }
- return result;
- }
-
- // Display functions
- // /////////////////
-
- static void inform(String s) {
- Log.i("SOCKS",s);
- }
-
- static void exit(String msg) {
- System.err.println("Error:" + msg);
- System.err.println("Aborting operation");
- System.exit(0);
- }
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Authentication.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Authentication.java
deleted file mode 100644
index 7bc58d9d..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Authentication.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-/**
- * The Authentication interface provides for performing method specific
- * authentication for SOCKS5 connections.
- */
-public interface Authentication {
- /**
- * This method is called when SOCKS5 server have selected a particular
- * authentication method, for whch an implementaion have been registered.
- *
- * <p>
- * This method should return an array {inputstream,outputstream
- * [,UDPEncapsulation]}. The reason for that is that SOCKS5 protocol allows
- * to have method specific encapsulation of data on the socket for purposes
- * of integrity or security. And this encapsulation should be performed by
- * those streams returned from the method. It is also possible to
- * encapsulate datagrams. If authentication method supports such
- * encapsulation an instance of the UDPEncapsulation interface should be
- * returned as third element of the array, otherwise either null should be
- * returned as third element, or array should contain only 2 elements.
- *
- * @param methodId
- * Authentication method selected by the server.
- * @param proxySocket
- * Socket used to conect to the proxy.
- * @return Two or three element array containing Input/Output streams which
- * should be used on this connection. Third argument is optional and
- * should contain an instance of UDPEncapsulation. It should be
- * provided if the authentication method used requires any
- * encapsulation to be done on the datagrams.
- */
- Object[] doSocksAuthentication(int methodId, java.net.Socket proxySocket)
- throws java.io.IOException;
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/AuthenticationNone.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/AuthenticationNone.java
deleted file mode 100644
index e6821545..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/AuthenticationNone.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * SOCKS5 none authentication. Dummy class does almost nothing.
- */
-public class AuthenticationNone implements Authentication {
-
- public Object[] doSocksAuthentication(final int methodId,
- final java.net.Socket proxySocket) throws java.io.IOException {
-
- if (methodId != 0) {
- return null;
- }
-
- InputStream in = proxySocket.getInputStream();
- OutputStream out = proxySocket.getOutputStream();
- return new Object[] { in, out };
- }
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/InetRange.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/InetRange.java
deleted file mode 100644
index fae13587..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/InetRange.java
+++ /dev/null
@@ -1,492 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
-/**
- * Class InetRange provides the means of defining the range of inetaddresses.
- * It's used by Proxy class to store and look up addresses of machines, that
- * should be contacted directly rather then through the proxy.
- * <P>
- * InetRange provides several methods to add either standalone addresses, or
- * ranges (e.g. 100.200.300.0:100.200.300.255, which covers all addresses on on
- * someones local network). It also provides methods for checking wether given
- * address is in this range. Any number of ranges and standalone addresses can
- * be added to the range.
- */
-public class InetRange implements Cloneable {
-
- Hashtable<String, Object[]> host_names;
- Vector<Object[]> all;
- Vector<String> end_names;
-
- boolean useSeparateThread = true;
-
- /**
- * Creates the empty range.
- */
- public InetRange() {
- all = new Vector<Object[]>();
- host_names = new Hashtable<String, Object[]>();
- end_names = new Vector<String>();
- }
-
- /**
- * Adds another host or range to this range. The String can be one of those:
- * <UL>
- * <li>Host name. eg.(Athena.myhost.com or 45.54.56.65)
- *
- * <li>Range in the form .myhost.net.au <BR>
- * In which case anything that ends with .myhost.net.au will be considered
- * in the range.
- *
- * <li>Range in the form ddd.ddd.ddd. <BR>
- * This will be treated as range ddd.ddd.ddd.0 to ddd.ddd.ddd.255. It is not
- * necessary to specify 3 first bytes you can use just one or two. For
- * example 130. will cover address between 130.0.0.0 and 13.255.255.255.
- *
- * <li>Range in the form host_from[: \t\n\r\f]host_to. <br>
- * That is two hostnames or ips separated by either whitespace or colon.
- * </UL>
- */
- public synchronized boolean add(final String s0) {
- if (s0 == null) {
- return false;
- }
-
- String s = s0.trim();
- if (s.length() == 0) {
- return false;
- }
-
- Object[] entry;
-
- if (s.endsWith(".")) {
- // thing like: 111.222.33.
- // it is being treated as range 111.222.33.000 - 111.222.33.255
-
- final int[] addr = ip2intarray(s);
- long from, to;
- from = to = 0;
-
- if (addr == null) {
- return false;
- }
- for (int i = 0; i < 4; i++) {
- if (addr[i] >= 0) {
- from += (((long) addr[i]) << 8 * (3 - i));
- } else {
- to = from;
- while (i < 4) {
- to += 255l << 8 * (3 - i++);
- }
- break;
- }
- }
- entry = new Object[] { s, null, new Long(from), new Long(to) };
- all.addElement(entry);
-
- } else if (s.startsWith(".")) {
- // Thing like: .myhost.com
-
- end_names.addElement(s);
- all.addElement(new Object[] { s, null, null, null });
- } else {
- final StringTokenizer tokens = new StringTokenizer(s, " \t\r\n\f:");
- if (tokens.countTokens() > 1) {
- entry = new Object[] { s, null, null, null };
- resolve(entry, tokens.nextToken(), tokens.nextToken());
- all.addElement(entry);
- } else {
- entry = new Object[] { s, null, null, null };
- all.addElement(entry);
- host_names.put(s, entry);
- resolve(entry);
- }
-
- }
-
- return true;
- }
-
- /**
- * Adds another ip for this range.
- *
- * @param ip
- * IP os the host which should be added to this range.
- */
- public synchronized void add(final InetAddress ip) {
- long from, to;
- from = to = ip2long(ip);
- all.addElement(new Object[] { ip.getHostName(), ip, new Long(from),
- new Long(to) });
- }
-
- /**
- * Adds another range of ips for this range.Any host with ip address greater
- * than or equal to the address of from and smaller than or equal to the
- * address of to will be included in the range.
- *
- * @param from
- * IP from where range starts(including).
- * @param to
- * IP where range ends(including).
- */
- public synchronized void add(final InetAddress from, final InetAddress to) {
- all.addElement(new Object[] {
- from.getHostAddress() + ":" + to.getHostAddress(), null,
- new Long(ip2long(from)), new Long(ip2long(to)) });
- }
-
- /**
- * Checks wether the givan host is in the range. Attempts to resolve host
- * name if required.
- *
- * @param host
- * Host name to check.
- * @return true If host is in the range, false otherwise.
- * @see InetRange#contains(String,boolean)
- */
- public synchronized boolean contains(final String host) {
- return contains(host, true);
- }
-
- /**
- * Checks wether the given host is in the range.
- * <P>
- * Algorithm: <BR>
- * <ol>
- * <li>Look up if the hostname is in the range (in the Hashtable).
- * <li>Check if it ends with one of the speciefied endings.
- * <li>Check if it is ip(eg.130.220.35.98). If it is check if it is in the
- * range.
- * <li>If attemptResolve is true, host is name, rather than ip, and all
- * previous attempts failed, try to resolve the hostname, and check wether
- * the ip associated with the host is in the range.It also repeats all
- * previos steps with the hostname obtained from InetAddress, but the name
- * is not allways the full name,it is quite likely to be the same. Well it
- * was on my machine.
- * </ol>
- *
- * @param host
- * Host name to check.
- * @param attemptResolve
- * Wether to lookup ip address which corresponds to the host,if
- * required.
- * @return true If host is in the range, false otherwise.
- */
- public synchronized boolean contains(final String host0,
- final boolean attemptResolve) {
- if (all.size() == 0) {
- return false; // Empty range
- }
-
- String host = host0.trim();
- if (host.length() == 0) {
- return false;
- }
-
- if (checkHost(host)) {
- return true;
- }
- if (checkHostEnding(host)) {
- return true;
- }
-
- final long l = host2long(host);
- if (l >= 0) {
- return contains(l);
- }
-
- if (!attemptResolve) {
- return false;
- }
-
- try {
- final InetAddress ip = InetAddress.getByName(host);
- return contains(ip);
- } catch (final UnknownHostException uhe) {
-
- }
-
- return false;
- }
-
- /**
- * Checks wether the given ip is in the range.
- *
- * @param ip
- * Address of the host to check.
- * @return true If host is in the range, false otherwise.
- */
- public synchronized boolean contains(final InetAddress ip) {
- if (checkHostEnding(ip.getHostName())) {
- return true;
- }
- if (checkHost(ip.getHostName())) {
- return true;
- }
- return contains(ip2long(ip));
- }
-
- /**
- * Get all entries in the range as strings. <BR>
- * These strings can be used to delete entries from the range with remove
- * function.
- *
- * @return Array of entries as strings.
- * @see InetRange#remove(String)
- */
- public synchronized String[] getAll() {
- final int size = all.size();
- Object entry[];
- final String all_names[] = new String[size];
-
- for (int i = 0; i < size; ++i) {
- entry = all.elementAt(i);
- all_names[i] = (String) entry[0];
- }
- return all_names;
- }
-
- /**
- * Removes an entry from this range.<BR>
- *
- * @param s
- * Entry to remove.
- * @return true if successfull.
- */
- public synchronized boolean remove(final String s) {
- final Enumeration<Object[]> enumx = all.elements();
- while (enumx.hasMoreElements()) {
- final Object[] entry = enumx.nextElement();
- if (s.equals(entry[0])) {
- all.removeElement(entry);
- end_names.removeElement(s);
- host_names.remove(s);
- return true;
- }
- }
- return false;
- }
-
- /** Get string representaion of this Range. */
- public String toString() {
- final String all[] = getAll();
- if (all.length == 0) {
- return "";
- }
-
- String s = all[0];
- for (int i = 1; i < all.length; ++i) {
- s += "; " + all[i];
- }
- return s;
- }
-
- /** Creates a clone of this Object */
-
- @SuppressWarnings("unchecked")
- public Object clone() {
- final InetRange new_range = new InetRange();
- new_range.all = (Vector<Object[]>) all.clone();
- new_range.end_names = (Vector<String>) end_names.clone();
- new_range.host_names = (Hashtable<String, Object[]>) host_names.clone();
- return new_range;
- }
-
- // Private methods
- // ///////////////
- /**
- * Same as previous but used internally, to avoid unnecessary convertion of
- * IPs, when checking subranges
- */
- private synchronized boolean contains(final long ip) {
- final Enumeration<Object[]> enumx = all.elements();
- while (enumx.hasMoreElements()) {
- final Object[] obj = enumx.nextElement();
- final Long from = obj[2] == null ? null : (Long) obj[2];
- final Long to = obj[3] == null ? null : (Long) obj[3];
- if ((from != null) && (from.longValue() <= ip)
- && (to.longValue() >= ip)) {
- return true;
- }
-
- }
- return false;
- }
-
- private boolean checkHost(final String host) {
- return host_names.containsKey(host);
- }
-
- private boolean checkHostEnding(final String host) {
- final Enumeration<String> enumx = end_names.elements();
- while (enumx.hasMoreElements()) {
- if (host.endsWith(enumx.nextElement())) {
- return true;
- }
- }
- return false;
- }
-
- private void resolve(final Object[] entry) {
- // First check if it's in the form ddd.ddd.ddd.ddd.
- final long ip = host2long((String) entry[0]);
- if (ip >= 0) {
- entry[2] = entry[3] = new Long(ip);
- } else {
- final InetRangeResolver res = new InetRangeResolver(entry);
- res.resolve(useSeparateThread);
- }
- }
-
- private void resolve(final Object[] entry, final String from,
- final String to) {
- long f, t;
- if (((f = host2long(from)) >= 0) && ((t = host2long(to)) >= 0)) {
- entry[2] = new Long(f);
- entry[3] = new Long(t);
- } else {
- final InetRangeResolver res = new InetRangeResolver(entry, from, to);
- res.resolve(useSeparateThread);
- }
- }
-
- // Class methods
- // /////////////
-
- // Converts ipv4 to long value(unsigned int)
- // /////////////////////////////////////////
- static long ip2long(final InetAddress ip) {
- long l = 0;
- final byte[] addr = ip.getAddress();
-
- if (addr.length == 4) { // IPV4
- for (int i = 0; i < 4; ++i) {
- l += (((long) addr[i] & 0xFF) << 8 * (3 - i));
- }
- } else { // IPV6
- return 0; // Have no idea how to deal with those
- }
- return l;
- }
-
- long host2long(final String host) {
- long ip = 0;
-
- // check if it's ddd.ddd.ddd.ddd
- if (!Character.isDigit(host.charAt(0))) {
- return -1;
- }
-
- final int[] addr = ip2intarray(host);
- if (addr == null) {
- return -1;
- }
-
- for (int i = 0; i < addr.length; ++i) {
- ip += ((long) (addr[i] >= 0 ? addr[i] : 0)) << 8 * (3 - i);
- }
-
- return ip;
- }
-
- static int[] ip2intarray(final String host) {
- final int[] address = { -1, -1, -1, -1 };
- int i = 0;
- final StringTokenizer tokens = new StringTokenizer(host, ".");
- if (tokens.countTokens() > 4) {
- return null;
- }
- while (tokens.hasMoreTokens()) {
- try {
- address[i++] = Integer.parseInt(tokens.nextToken()) & 0xFF;
- } catch (final NumberFormatException nfe) {
- return null;
- }
-
- }
- return address;
- }
-
- /*
- * //* This was the test main function //**********************************
- *
- * public static void main(String args[])throws UnknownHostException{ int i;
- *
- * InetRange ir = new InetRange();
- *
- *
- * for(i=0;i<args.length;++i){ System.out.println("Adding:" + args[i]);
- * ir.add(args[i]); }
- *
- * String host; java.io.DataInputStream din = new
- * java.io.DataInputStream(System.in); try{ host = din.readLine();
- * while(host!=null){ if(ir.contains(host)){
- * System.out.println("Range contains ip:"+host); }else{
- * System.out.println(host+" is not in the range"); } host = din.readLine();
- * } }catch(java.io.IOException io_ex){ io_ex.printStackTrace(); } }
- * ******************
- */
-
-}
-
-class InetRangeResolver implements Runnable {
-
- Object[] entry;
-
- String from;
- String to;
-
- InetRangeResolver(final Object[] entry) {
- this.entry = entry;
- from = null;
- to = null;
- }
-
- InetRangeResolver(final Object[] entry, final String from, final String to) {
- this.entry = entry;
- this.from = from;
- this.to = to;
- }
-
- public final void resolve() {
- resolve(true);
- }
-
- public final void resolve(final boolean inSeparateThread) {
- if (inSeparateThread) {
- final Thread t = new Thread(this);
- t.start();
- } else {
- run();
- }
-
- }
-
- public void run() {
- try {
- if (from == null) {
- final InetAddress ip = InetAddress.getByName((String) entry[0]);
- entry[1] = ip;
- final Long l = new Long(InetRange.ip2long(ip));
- entry[2] = l;
- entry[3] = l;
- } else {
- final InetAddress f = InetAddress.getByName(from);
- final InetAddress t = InetAddress.getByName(to);
- entry[2] = new Long(InetRange.ip2long(f));
- entry[3] = new Long(InetRange.ip2long(t));
-
- }
- } catch (final UnknownHostException uhe) {
- // System.err.println("Resolve failed for "+from+','+to+','+entry[0]);
- }
- }
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyMessage.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyMessage.java
deleted file mode 100644
index e7721a1a..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyMessage.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * Abstract class which describes SOCKS4/5 response/request.
- */
-public abstract class ProxyMessage {
-
- /** Host as an IP address */
- public InetAddress ip = null;
-
- /** SOCKS version, or version of the response for SOCKS4 */
- public int version;
-
- /** Port field of the request/response */
- public int port;
-
- /** Request/response code as an int */
- public int command;
-
- /** Host as string. */
- public String host = null;
-
- /** User field for SOCKS4 request messages */
- public String user = null;
-
- ProxyMessage(int command, InetAddress ip, int port) {
- this.command = command;
- this.ip = ip;
- this.port = port;
- }
-
- ProxyMessage() {
- }
-
- /**
- * Initialises Message from the stream. Reads server response from given
- * stream.
- *
- * @param in
- * Input stream to read response from.
- * @throws SocksException
- * If server response code is not SOCKS_SUCCESS(0), or if any
- * error with protocol occurs.
- * @throws IOException
- * If any error happens with I/O.
- */
- public abstract void read(InputStream in) throws SocksException,
- IOException;
-
- /**
- * Initialises Message from the stream. Reads server response or client
- * request from given stream.
- *
- * @param in
- * Input stream to read response from.
- * @param clinetMode
- * If true read server response, else read client request.
- * @throws SocksException
- * If server response code is not SOCKS_SUCCESS(0) and reading
- * in client mode, or if any error with protocol occurs.
- * @throws IOException
- * If any error happens with I/O.
- */
- public abstract void read(InputStream in, boolean client_mode)
- throws SocksException, IOException;
-
- /**
- * Writes the message to the stream.
- *
- * @param out
- * Output stream to which message should be written.
- */
- public abstract void write(OutputStream out) throws SocksException,
- IOException;
-
- /**
- * Get the Address field of this message as InetAddress object.
- *
- * @return Host address or null, if one can't be determined.
- */
- public InetAddress getInetAddress() throws UnknownHostException {
- return ip;
- }
-
- /**
- * Get string representaion of this message.
- *
- * @return string representation of this message.
- */
- public String toString() {
- return "Proxy Message:\n" + "Version:" + version + "\n" + "Command:"
- + command + "\n" + "IP: " + ip + "\n" + "Port: " + port
- + "\n" + "User: " + user + "\n";
- }
-
- // Package methods
- // ////////////////
-
- static final String bytes2IPV4(byte[] addr, int offset) {
- String hostName = "" + (addr[offset] & 0xFF);
- for (int i = offset + 1; i < offset + 4; i++) {
- hostName += "." + (addr[i] & 0xFF);
- }
- return hostName;
- }
-
- static final String bytes2IPV6(byte[] addr, int offset) {
- // Have no idea how they look like!
- return null;
- }
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyServer.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyServer.java
deleted file mode 100644
index c8067e88..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/ProxyServer.java
+++ /dev/null
@@ -1,699 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.io.PushbackInputStream;
-import java.net.ConnectException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.NoRouteToHostException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.nio.channels.SocketChannel;
-
-import android.annotation.SuppressLint;
-import android.net.VpnService;
-import android.util.Log;
-
-import com.runjva.sourceforge.jsocks.server.ServerAuthenticator;
-
-/**
- * SOCKS4 and SOCKS5 proxy, handles both protocols simultaniously. Implements
- * all SOCKS commands, including UDP relaying.
- * <p>
- * In order to use it you will need to implement ServerAuthenticator interface.
- * There is an implementation of this interface which does no authentication
- * ServerAuthenticatorNone, but it is very dangerous to use, as it will give
- * access to your local network to anybody in the world. One should never use
- * this authentication scheme unless one have pretty good reason to do so. There
- * is a couple of other authentication schemes in socks.server package.
- *
- * @see socks.server.ServerAuthenticator
- */
-public class ProxyServer implements Runnable {
-
- ServerAuthenticator auth;
- ProxyMessage msg = null;
-
- Socket sock = null, remote_sock = null;
- ServerSocket ss = null;
- UDPRelayServer relayServer = null;
- InputStream in, remote_in;
- OutputStream out, remote_out;
-
- int mode;
- static final int START_MODE = 0;
- static final int ACCEPT_MODE = 1;
- static final int PIPE_MODE = 2;
- static final int ABORT_MODE = 3;
-
- static final int BUF_SIZE = 8192;
-
- Thread pipe_thread1, pipe_thread2;
- long lastReadTime;
-
- static int iddleTimeout = 180000; // 3 minutes
- static int acceptTimeout = 180000; // 3 minutes
-
- static SocksProxyBase proxy;
-
- static VpnService vpnService;
-
- static boolean DEBUG = false;
-
- // Public Constructors
- // ///////////////////
-
- /**
- * Creates a proxy server with given Authentication scheme.
- *
- * @param auth
- * Authentication scheme to be used.
- */
- public ProxyServer(final ServerAuthenticator auth) {
- this.auth = auth;
- }
-
- // Other constructors
- // //////////////////
-
- ProxyServer(final ServerAuthenticator auth, final Socket s) {
- this.auth = auth;
- this.sock = s;
- this.mode = START_MODE;
- }
-
- // Public methods
- // ///////////////
-
- /**
- * Set proxy.
- * <p>
- * Allows Proxy chaining so that one Proxy server is connected to another
- * and so on. If proxy supports SOCKSv4, then only some SOCKSv5 requests can
- * be handled, UDP would not work, however CONNECT and BIND will be
- * translated.
- *
- * @param p
- * Proxy which should be used to handle user requests.
- */
- public static void setProxy(final SocksProxyBase p) {
- proxy = p;
- // FIXME: Side effect.
- UDPRelayServer.proxy = proxy;
- }
-
- public static void setVpnService (final VpnService v)
- {
- vpnService = v;
- }
- /**
- * Get proxy.
- *
- * @return Proxy wich is used to handle user requests.
- */
- public static SocksProxyBase getProxy() {
- return proxy;
- }
-
- /**
- * Sets the timeout for connections, how long shoud server wait for data to
- * arrive before dropping the connection.<br>
- * Zero timeout implies infinity.<br>
- * Default timeout is 3 minutes.
- */
- public static void setIddleTimeout(final int timeout) {
- iddleTimeout = timeout;
- }
-
- /**
- * Sets the timeout for BIND command, how long the server should wait for
- * the incoming connection.<br>
- * Zero timeout implies infinity.<br>
- * Default timeout is 3 minutes.
- */
- public static void setAcceptTimeout(final int timeout) {
- acceptTimeout = timeout;
- }
-
- /**
- * Sets the timeout for UDPRelay server.<br>
- * Zero timeout implies infinity.<br>
- * Default timeout is 3 minutes.
- */
- public static void setUDPTimeout(final int timeout) {
- UDPRelayServer.setTimeout(timeout);
- }
-
- /**
- * Sets the size of the datagrams used in the UDPRelayServer.<br>
- * Default size is 64K, a bit more than maximum possible size of the
- * datagram.
- */
- public static void setDatagramSize(final int size) {
- UDPRelayServer.setDatagramSize(size);
- }
-
- /**
- * Start the Proxy server at given port.<br>
- * This methods blocks.
- */
- public void start(final int port) {
- start(port, 5, null);
- }
-
- /**
- * Create a server with the specified port, listen backlog, and local IP
- * address to bind to. The localIP argument can be used on a multi-homed
- * host for a ServerSocket that will only accept connect requests to one of
- * its addresses. If localIP is null, it will default accepting connections
- * on any/all local addresses. The port must be between 0 and 65535,
- * inclusive. <br>
- * This methods blocks.
- */
- public void start(final int port, final int backlog,
- final InetAddress localIP) {
- try {
- ss = new ServerSocket(port, backlog, localIP);
- final String address = ss.getInetAddress().getHostAddress();
- final int localPort = ss.getLocalPort();
- debug("Starting SOCKS Proxy on: {}:{}", address, localPort);
-
- while (true) {
- final Socket s = ss.accept();
- final String hostName = s.getInetAddress().getHostName();
- final int port2 = s.getPort();
- debug("Accepted from:{}:{}", hostName, port2);
-
- final ProxyServer ps = new ProxyServer(auth, s);
- (new Thread(ps)).start();
- }
- } catch (final Exception ioe) {
- ioe.printStackTrace();
- } finally {
- }
- }
-
- /**
- * Stop server operation.It would be wise to interrupt thread running the
- * server afterwards.
- */
- public void stop() {
- try {
- if (ss != null) {
- ss.close();
- }
- } catch (final IOException ioe) {
- }
- }
-
- // Runnable interface
- // //////////////////
- public void run() {
- switch (mode) {
- case START_MODE:
- try {
- startSession();
- } catch (final IOException ioe) {
- handleException(ioe);
- // ioe.printStackTrace();
- } finally {
- abort();
- if (auth != null) {
- auth.endSession();
- }
- debug("Main thread(client->remote)stopped.");
- }
- break;
- case ACCEPT_MODE:
- try {
- doAccept();
- mode = PIPE_MODE;
- pipe_thread1.interrupt(); // Tell other thread that connection
- // have
- // been accepted.
- pipe(remote_in, out);
- } catch (final IOException ioe) {
- // log("Accept exception:"+ioe);
- handleException(ioe);
- } finally {
- abort();
- debug("Accept thread(remote->client) stopped");
- }
- break;
- case PIPE_MODE:
- try {
- pipe(remote_in, out);
- } catch (final IOException ioe) {
- } finally {
- abort();
- debug("Support thread(remote->client) stopped");
- }
- break;
- case ABORT_MODE:
- break;
- default:
- debug("Unexpected MODE " + mode);
- }
- }
-
- // Private methods
- // ///////////////
- private void startSession() throws IOException {
- sock.setSoTimeout(iddleTimeout);
-
- try {
- auth = auth.startSession(sock);
- } catch (final IOException ioe) {
- debug("Auth throwed exception:", ioe);
- auth = null;
- return;
- }
-
- if (auth == null) { // Authentication failed
- debug("Authentication failed");
- return;
- }
-
- in = auth.getInputStream();
- out = auth.getOutputStream();
-
- msg = readMsg(in);
- handleRequest(msg);
- }
-
- private void handleRequest(final ProxyMessage msg) throws IOException {
- if (!auth.checkRequest(msg)) {
- throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
- }
-
- if (msg.ip == null) {
- if (msg instanceof Socks5Message) {
- msg.ip = InetAddress.getByName(msg.host);
- } else {
- throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
- }
- }
- log(msg);
-
- switch (msg.command) {
- case SocksProxyBase.SOCKS_CMD_CONNECT:
- onConnect(msg);
- break;
- case SocksProxyBase.SOCKS_CMD_BIND:
- onBind(msg);
- break;
- case SocksProxyBase.SOCKS_CMD_UDP_ASSOCIATE:
- onUDP(msg);
- break;
- default:
- throw new SocksException(SocksProxyBase.SOCKS_CMD_NOT_SUPPORTED);
- }
- }
-
- private void handleException(final IOException ioe) {
- // If we couldn't read the request, return;
- if (msg == null) {
- return;
- }
- // If have been aborted by other thread
- if (mode == ABORT_MODE) {
- return;
- }
- // If the request was successfully completed, but exception happened
- // later
- if (mode == PIPE_MODE) {
- return;
- }
-
- int error_code = SocksProxyBase.SOCKS_FAILURE;
-
- if (ioe instanceof SocksException) {
- error_code = ((SocksException) ioe).errCode;
- } else if (ioe instanceof NoRouteToHostException) {
- error_code = SocksProxyBase.SOCKS_HOST_UNREACHABLE;
- } else if (ioe instanceof ConnectException) {
- error_code = SocksProxyBase.SOCKS_CONNECTION_REFUSED;
- } else if (ioe instanceof InterruptedIOException) {
- error_code = SocksProxyBase.SOCKS_TTL_EXPIRE;
- }
-
- if ((error_code > SocksProxyBase.SOCKS_ADDR_NOT_SUPPORTED)
- || (error_code < 0)) {
- error_code = SocksProxyBase.SOCKS_FAILURE;
- }
-
- sendErrorMessage(error_code);
- }
-
- @SuppressLint("NewApi")
- private void onConnect(final ProxyMessage msg) throws IOException {
- Socket s;
-
- if (proxy == null) {
-
- s = SocketChannel.open().socket();
- if ((null != s) && (null != vpnService)) {
- vpnService.protect(s);
- }
-
- s.connect(new InetSocketAddress(msg.ip,msg.port));
-
- } else {
- s = new SocksSocket(proxy, msg.ip, msg.port);
-
- if (vpnService != null)
- vpnService.protect(s);
- }
-
-
- debug("Connected to " + s.getInetAddress() + ":" + s.getPort());
-
- ProxyMessage response = null;
- final InetAddress localAddress = s.getLocalAddress();
- final int localPort = s.getLocalPort();
-
- if (msg instanceof Socks5Message) {
- final int cmd = SocksProxyBase.SOCKS_SUCCESS;
- response = new Socks5Message(cmd, localAddress, localPort);
- } else {
- final int cmd = Socks4Message.REPLY_OK;
- response = new Socks4Message(cmd, localAddress, localPort);
-
- }
- response.write(out);
- startPipe(s);
- }
-
- private void onBind(final ProxyMessage msg) throws IOException {
- ProxyMessage response = null;
-
- if (proxy == null) {
- ss = new ServerSocket(0);
- } else {
- ss = new SocksServerSocket(proxy, msg.ip, msg.port);
- }
-
- ss.setSoTimeout(acceptTimeout);
-
- final InetAddress inetAddress = ss.getInetAddress();
- final int localPort = ss.getLocalPort();
- debug("Trying accept on {}:{}", inetAddress, localPort);
-
- if (msg.version == 5) {
- final int cmd = SocksProxyBase.SOCKS_SUCCESS;
- response = new Socks5Message(cmd, inetAddress, localPort);
- } else {
- final int cmd = Socks4Message.REPLY_OK;
- response = new Socks4Message(cmd, inetAddress, localPort);
- }
- response.write(out);
-
- mode = ACCEPT_MODE;
-
- pipe_thread1 = Thread.currentThread();
- pipe_thread2 = new Thread(this);
- pipe_thread2.start();
-
- // Make timeout infinit.
- sock.setSoTimeout(0);
- int eof = 0;
-
- try {
- while ((eof = in.read()) >= 0) {
- if (mode != ACCEPT_MODE) {
- if (mode != PIPE_MODE) {
- return;// Accept failed
- }
-
- remote_out.write(eof);
- break;
- }
- }
- } catch (final EOFException e) {
- debug("Connection closed while we were trying to accept", e);
- return;
- } catch (final InterruptedIOException e) {
- debug("Interrupted by unsucessful accept thread", e);
- if (mode != PIPE_MODE) {
- return;
- }
- } finally {
- // System.out.println("Finnaly!");
- }
-
- if (eof < 0) {
- return;
- }
-
- // Do not restore timeout, instead timeout is set on the
- // remote socket. It does not make any difference.
-
- pipe(in, remote_out);
- }
-
- private void onUDP(final ProxyMessage msg) throws IOException {
- if (msg.ip.getHostAddress().equals("0.0.0.0")) {
- msg.ip = sock.getInetAddress();
- }
- debug("Creating UDP relay server for {}:{}", msg.ip, msg.port);
-
- relayServer = new UDPRelayServer(msg.ip, msg.port,
- Thread.currentThread(), sock, auth);
-
- ProxyMessage response;
-
- response = new Socks5Message(SocksProxyBase.SOCKS_SUCCESS,
- relayServer.relayIP, relayServer.relayPort);
-
- response.write(out);
-
- relayServer.start();
-
- // Make timeout infinit.
- sock.setSoTimeout(0);
- try {
- while (in.read() >= 0) {
- /* do nothing */;
- // FIXME: Consider a slight delay here?
- }
- } catch (final EOFException eofe) {
- }
- }
-
- // Private methods
- // ////////////////
-
- private void doAccept() throws IOException {
- Socket s = null;
- final long startTime = System.currentTimeMillis();
-
- while (true) {
- s = ss.accept();
- if (s.getInetAddress().equals(msg.ip)) {
- // got the connection from the right host
- // Close listenning socket.
- ss.close();
- break;
- } else if (ss instanceof SocksServerSocket) {
- // We can't accept more then one connection
- s.close();
- ss.close();
- throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
- } else {
- if (acceptTimeout != 0) { // If timeout is not infinit
- final long passed = System.currentTimeMillis() - startTime;
- final int newTimeout = acceptTimeout - (int) passed;
-
- if (newTimeout <= 0) {
- throw new InterruptedIOException("newTimeout <= 0");
- }
- ss.setSoTimeout(newTimeout);
- }
- s.close(); // Drop all connections from other hosts
- }
- }
-
- // Accepted connection
- remote_sock = s;
- remote_in = s.getInputStream();
- remote_out = s.getOutputStream();
-
- // Set timeout
- remote_sock.setSoTimeout(iddleTimeout);
-
- final InetAddress inetAddress = s.getInetAddress();
- final int port = s.getPort();
- debug("Accepted from {}:{}", s.getInetAddress(), port);
-
- ProxyMessage response;
-
- if (msg.version == 5) {
- final int cmd = SocksProxyBase.SOCKS_SUCCESS;
- response = new Socks5Message(cmd, inetAddress, port);
- } else {
- final int cmd = Socks4Message.REPLY_OK;
- response = new Socks4Message(cmd, inetAddress, port);
- }
- response.write(out);
- }
-
- private ProxyMessage readMsg(final InputStream in) throws IOException {
- PushbackInputStream push_in;
- if (in instanceof PushbackInputStream) {
- push_in = (PushbackInputStream) in;
- } else {
- push_in = new PushbackInputStream(in);
- }
-
- final int version = push_in.read();
- push_in.unread(version);
-
- ProxyMessage msg;
-
- if (version == 5) {
- msg = new Socks5Message(push_in, false);
- } else if (version == 4) {
- msg = new Socks4Message(push_in, false);
- } else {
- throw new SocksException(SocksProxyBase.SOCKS_FAILURE);
- }
- return msg;
- }
-
- private void startPipe(final Socket s) {
- mode = PIPE_MODE;
- remote_sock = s;
- try {
- remote_in = s.getInputStream();
- remote_out = s.getOutputStream();
- pipe_thread1 = Thread.currentThread();
- pipe_thread2 = new Thread(this);
- pipe_thread2.start();
- pipe(in, remote_out);
- } catch (final IOException ioe) {
- }
- }
-
- private void sendErrorMessage(final int error_code) {
- ProxyMessage err_msg;
- if (msg instanceof Socks4Message) {
- err_msg = new Socks4Message(Socks4Message.REPLY_REJECTED);
- } else {
- err_msg = new Socks5Message(error_code);
- }
- try {
- err_msg.write(out);
- } catch (final IOException ioe) {
- }
- }
-
- private synchronized void abort() {
- if (mode == ABORT_MODE) {
- return;
- }
- mode = ABORT_MODE;
- try {
- debug("Aborting operation");
- if (remote_sock != null) {
- remote_sock.close();
- }
- if (sock != null) {
- sock.close();
- }
- if (relayServer != null) {
- relayServer.stop();
- }
- if (ss != null) {
- ss.close();
- }
- if (pipe_thread1 != null) {
- pipe_thread1.interrupt();
- }
- if (pipe_thread2 != null) {
- pipe_thread2.interrupt();
- }
- } catch (final IOException ioe) {
- }
- }
-
- static final void log(final ProxyMessage msg) {
- debug("Request version: {}, Command: ", msg.version,
- command2String(msg.command));
-
- final String user = msg.version == 4 ? ", User:" + msg.user : "";
- debug("IP:" + msg.ip + ", Port:" + msg.port + user);
- }
-
- private void pipe(final InputStream in, final OutputStream out)
- throws IOException {
- lastReadTime = System.currentTimeMillis();
- final byte[] buf = new byte[BUF_SIZE];
- int len = 0;
- while (len >= 0) {
- try {
- if (len != 0) {
- out.write(buf, 0, len);
- out.flush();
- }
- len = in.read(buf);
- lastReadTime = System.currentTimeMillis();
- } catch (final InterruptedIOException iioe) {
- if (iddleTimeout == 0) {
- return;// Other thread interrupted us.
- }
- final long timeSinceRead = System.currentTimeMillis()
- - lastReadTime;
-
- if (timeSinceRead >= iddleTimeout - 1000) {
- return;
- }
- len = 0;
-
- }
- }
- }
-
- static final String command_names[] = { "CONNECT", "BIND", "UDP_ASSOCIATE" };
-
- static final String command2String(int cmd) {
- if ((cmd > 0) && (cmd < 4)) {
- return command_names[cmd - 1];
- } else {
- return "Unknown Command " + cmd;
- }
- }
-
- public static void debug (String msg)
- {
- if (DEBUG)
- Log.d("Proxy",msg);
- }
-
- public static void debug (String msg, String host, int port)
- {
- if (DEBUG)
- debug (msg + ": " + host + ":" + port);
- }
-
- public static void debug (String msg, Exception e)
- {
- if (DEBUG)
- Log.e("Proxy",msg,e);
- }
-
- public static void debug (String msg, InetAddress addr, int port)
- {
- if (DEBUG)
- debug (msg + ": " + addr.getHostAddress() + ": " + port);
- }
-
- public static void debug (String msg, int type, String log)
- {
- if (DEBUG)
- debug (msg + " type:" + type + "=" + log);
- }
-}
\ No newline at end of file
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Message.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Message.java
deleted file mode 100644
index 484ad969..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Message.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * SOCKS4 Reply/Request message.
- */
-
-class Socks4Message extends ProxyMessage {
-
- private byte[] msgBytes;
- private int msgLength;
-
- /**
- * Server failed reply, cmd command for failed request
- */
- public Socks4Message(final int cmd) {
- super(cmd, null, 0);
- this.user = null;
-
- msgLength = 2;
- msgBytes = new byte[2];
-
- msgBytes[0] = (byte) 0;
- msgBytes[1] = (byte) command;
- }
-
- /**
- * Server successfull reply
- */
- public Socks4Message(final int cmd, final InetAddress ip, final int port) {
- this(0, cmd, ip, port, null);
- }
-
- /**
- * Client request
- */
- public Socks4Message(final int cmd, final InetAddress ip, final int port,
- final String user) {
- this(SOCKS_VERSION, cmd, ip, port, user);
- }
-
- /**
- * Most general constructor
- */
- public Socks4Message(final int version, final int cmd,
- final InetAddress ip, final int port, final String user) {
-
- super(cmd, ip, port);
- this.user = user;
- this.version = version;
-
- msgLength = user == null ? 8 : 9 + user.length();
- msgBytes = new byte[msgLength];
-
- msgBytes[0] = (byte) version;
- msgBytes[1] = (byte) command;
- msgBytes[2] = (byte) (port >> 8);
- msgBytes[3] = (byte) port;
-
- byte[] addr;
-
- if (ip != null) {
- addr = ip.getAddress();
- } else {
- addr = new byte[4];
- addr[0] = addr[1] = addr[2] = addr[3] = 0;
- }
- System.arraycopy(addr, 0, msgBytes, 4, 4);
-
- if (user != null) {
- final byte[] buf = user.getBytes();
- System.arraycopy(buf, 0, msgBytes, 8, buf.length);
- msgBytes[msgBytes.length - 1] = 0;
- }
- }
-
- /**
- * Initialise from the stream If clientMode is true attempts to read a
- * server response otherwise reads a client request see read for more detail
- */
- public Socks4Message(final InputStream in, final boolean clientMode)
- throws IOException {
- msgBytes = null;
- read(in, clientMode);
- }
-
- public void read(final InputStream in) throws IOException {
- read(in, true);
- }
-
- public void read(final InputStream in, final boolean clientMode)
- throws IOException {
- final DataInputStream d_in = new DataInputStream(in);
- version = d_in.readUnsignedByte();
- command = d_in.readUnsignedByte();
- if (clientMode && (command != REPLY_OK)) {
- String errMsg;
- // FIXME: Range should be replaced with cases.
- if ((command > REPLY_OK) && (command < REPLY_BAD_IDENTD)) {
- errMsg = replyMessage[command - REPLY_OK];
- } else {
- errMsg = "Unknown Reply Code";
- }
- throw new SocksException(command, errMsg);
- }
- port = d_in.readUnsignedShort();
- final byte[] addr = new byte[4];
- d_in.readFully(addr);
- ip = bytes2IP(addr);
- host = ip.getHostName();
- if (!clientMode) {
- int b = in.read();
- // FIXME: Hope there are no idiots with user name bigger than this
- final byte[] userBytes = new byte[256];
- int i = 0;
- for (i = 0; (i < userBytes.length) && (b > 0); ++i) {
- userBytes[i] = (byte) b;
- b = in.read();
- }
- user = new String(userBytes, 0, i);
- }
- }
-
- public void write(final OutputStream out) throws IOException {
- if (msgBytes == null) {
- final Socks4Message msg;
- msg = new Socks4Message(version, command, ip, port, user);
- msgBytes = msg.msgBytes;
- msgLength = msg.msgLength;
- }
- out.write(msgBytes);
- }
-
- // Class methods
- static InetAddress bytes2IP(final byte[] addr) {
- final String s = bytes2IPV4(addr, 0);
- try {
- return InetAddress.getByName(s);
- } catch (final UnknownHostException uh_ex) {
- return null;
- }
- }
-
- // Constants
-
- static final String[] replyMessage = { "Request Granted",
- "Request Rejected or Failed",
- "Failed request, can't connect to Identd",
- "Failed request, bad user name" };
-
- static final int SOCKS_VERSION = 4;
-
- public final static int REQUEST_CONNECT = 1;
- public final static int REQUEST_BIND = 2;
-
- public final static int REPLY_OK = 90;
- public final static int REPLY_REJECTED = 91;
- public final static int REPLY_NO_CONNECT = 92;
- public final static int REPLY_BAD_IDENTD = 93;
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Proxy.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Proxy.java
deleted file mode 100644
index 5850b5e2..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks4Proxy.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * Proxy which describes SOCKS4 proxy.
- */
-
-public class Socks4Proxy extends SocksProxyBase implements Cloneable {
-
- // Data members
- String user;
-
- // Public Constructors
- // ====================
-
- /**
- * Creates the SOCKS4 proxy
- *
- * @param p
- * Proxy to use to connect to this proxy, allows proxy chaining.
- * @param proxyHost
- * Address of the proxy server.
- * @param proxyPort
- * Port of the proxy server
- * @param user
- * User name to use for identification purposes.
- * @throws UnknownHostException
- * If proxyHost can't be resolved.
- */
- public Socks4Proxy(SocksProxyBase p, String proxyHost, int proxyPort,
- String user) throws UnknownHostException {
- super(p, proxyHost, proxyPort);
- this.user = new String(user);
- version = 4;
- }
-
- /**
- * Creates the SOCKS4 proxy
- *
- * @param proxyHost
- * Address of the proxy server.
- * @param proxyPort
- * Port of the proxy server
- * @param user
- * User name to use for identification purposes.
- * @throws UnknownHostException
- * If proxyHost can't be resolved.
- */
- public Socks4Proxy(String proxyHost, int proxyPort, String user)
- throws UnknownHostException {
- this(null, proxyHost, proxyPort, user);
- }
-
- /**
- * Creates the SOCKS4 proxy
- *
- * @param p
- * Proxy to use to connect to this proxy, allows proxy chaining.
- * @param proxyIP
- * Address of the proxy server.
- * @param proxyPort
- * Port of the proxy server
- * @param user
- * User name to use for identification purposes.
- */
- public Socks4Proxy(SocksProxyBase p, InetAddress proxyIP, int proxyPort,
- String user) {
- super(p, proxyIP, proxyPort);
- this.user = new String(user);
- version = 4;
- }
-
- /**
- * Creates the SOCKS4 proxy
- *
- * @param proxyIP
- * Address of the proxy server.
- * @param proxyPort
- * Port of the proxy server
- * @param user
- * User name to use for identification purposes.
- */
- public Socks4Proxy(InetAddress proxyIP, int proxyPort, String user) {
- this(null, proxyIP, proxyPort, user);
- }
-
- // Public instance methods
- // ========================
-
- /**
- * Creates a clone of this proxy. Changes made to the clone should not
- * affect this object.
- */
- public Object clone() {
- final Socks4Proxy newProxy = new Socks4Proxy(proxyIP, proxyPort, user);
- newProxy.directHosts = (InetRange) directHosts.clone();
- newProxy.chainProxy = chainProxy;
- return newProxy;
- }
-
- // Public Static(Class) Methods
- // ==============================
-
- // Protected Methods
- // =================
-
- protected SocksProxyBase copy() {
- final Socks4Proxy copy = new Socks4Proxy(proxyIP, proxyPort, user);
- copy.directHosts = this.directHosts;
- copy.chainProxy = chainProxy;
- return copy;
- }
-
- protected ProxyMessage formMessage(int cmd, InetAddress ip, int port) {
- switch (cmd) {
- case SOCKS_CMD_CONNECT:
- cmd = Socks4Message.REQUEST_CONNECT;
- break;
- case SOCKS_CMD_BIND:
- cmd = Socks4Message.REQUEST_BIND;
- break;
- default:
- return null;
- }
- return new Socks4Message(cmd, ip, port, user);
- }
-
- protected ProxyMessage formMessage(int cmd, String host, int port)
- throws UnknownHostException {
-
- return formMessage(cmd, InetAddress.getByName(host), port);
- }
-
- protected ProxyMessage formMessage(InputStream in) throws SocksException,
- IOException {
-
- return new Socks4Message(in, true);
- }
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5DatagramSocket.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5DatagramSocket.java
deleted file mode 100644
index 114d5906..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5DatagramSocket.java
+++ /dev/null
@@ -1,480 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-
-/**
- * Datagram socket to interract through the firewall.<BR>
- * Can be used same way as the normal DatagramSocket. One should be carefull
- * though with the datagram sizes used, as additional data is present in both
- * incomming and outgoing datagrams.
- * <p>
- * SOCKS5 protocol allows to send host address as either:
- * <ul>
- * <li>IPV4, normal 4 byte address. (10 bytes header size)
- * <li>IPV6, version 6 ip address (not supported by Java as for now). 22 bytes
- * header size.
- * <li>Host name,(7+length of the host name bytes header size).
- * </ul>
- * As with other Socks equivalents, direct addresses are handled transparently,
- * that is data will be send directly when required by the proxy settings.
- * <p>
- * <b>NOTE:</b><br>
- * Unlike other SOCKS Sockets, it <b>does not</b> support proxy chaining, and
- * will throw an exception if proxy has a chain proxy attached. The reason for
- * that is not my laziness, but rather the restrictions of the SOCKSv5 protocol.
- * Basicaly SOCKSv5 proxy server, needs to know from which host:port datagrams
- * will be send for association, and returns address to which datagrams should
- * be send by the client, but it does not inform client from which host:port it
- * is going to send datagrams, in fact there is even no guarantee they will be
- * send at all and from the same address each time.
- */
-public class Socks5DatagramSocket extends DatagramSocket {
-
- InetAddress relayIP;
- int relayPort;
- Socks5Proxy proxy;
- private boolean server_mode = false;
- UDPEncapsulation encapsulation;
-
- /**
- * Construct Datagram socket for communication over SOCKS5 proxy server.
- * This constructor uses default proxy, the one set with
- * Proxy.setDefaultProxy() method. If default proxy is not set or it is set
- * to version4 proxy, which does not support datagram forwarding, throws
- * SocksException.
- */
- public Socks5DatagramSocket() throws SocksException, IOException {
- this(SocksProxyBase.defaultProxy, 0, null);
- }
-
- /**
- * Construct Datagram socket for communication over SOCKS5 proxy server. And
- * binds it to the specified local port. This constructor uses default
- * proxy, the one set with Proxy.setDefaultProxy() method. If default proxy
- * is not set or it is set to version4 proxy, which does not support
- * datagram forwarding, throws SocksException.
- */
- public Socks5DatagramSocket(int port) throws SocksException, IOException {
- this(SocksProxyBase.defaultProxy, port, null);
- }
-
- /**
- * Construct Datagram socket for communication over SOCKS5 proxy server. And
- * binds it to the specified local port and address. This constructor uses
- * default proxy, the one set with Proxy.setDefaultProxy() method. If
- * default proxy is not set or it is set to version4 proxy, which does not
- * support datagram forwarding, throws SocksException.
- */
- public Socks5DatagramSocket(int port, InetAddress ip)
- throws SocksException, IOException {
- this(SocksProxyBase.defaultProxy, port, ip);
- }
-
- /**
- * Constructs datagram socket for communication over specified proxy. And
- * binds it to the given local address and port. Address of null and port of
- * 0, signify any availabale port/address. Might throw SocksException, if:
- * <ol>
- * <li>Given version of proxy does not support UDP_ASSOCIATE.
- * <li>Proxy can't be reached.
- * <li>Authorization fails.
- * <li>Proxy does not want to perform udp forwarding, for any reason.
- * </ol>
- * Might throw IOException if binding datagram socket to given address/port
- * fails. See java.net.DatagramSocket for more details.
- */
- public Socks5DatagramSocket(SocksProxyBase p, int port, InetAddress ip)
- throws SocksException, IOException {
-
- super(port, ip);
-
- if (p == null) {
- throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
- }
-
- if (!(p instanceof Socks5Proxy)) {
- final String s = "Datagram Socket needs Proxy version 5";
- throw new SocksException(-1, s);
- }
-
- if (p.chainProxy != null) {
- final String s = "Datagram Sockets do not support proxy chaining.";
- throw new SocksException(SocksProxyBase.SOCKS_JUST_ERROR, s);
- }
-
- proxy = (Socks5Proxy) p.copy();
-
- final ProxyMessage msg = proxy.udpAssociate(super.getLocalAddress(),
- super.getLocalPort());
-
- relayIP = msg.ip;
- if (relayIP.getHostAddress().equals("0.0.0.0")) {
- // FIXME: What happens here?
- relayIP = proxy.proxyIP;
- }
- relayPort = msg.port;
-
- encapsulation = proxy.udp_encapsulation;
-
- //log.debug("Datagram Socket:{}:{}", getLocalAddress(), getLocalPort());
- //log.debug("Socks5Datagram: {}:{}", relayIP, relayPort);
- }
-
- /**
- * Used by UDPRelayServer.
- */
- Socks5DatagramSocket(boolean server_mode, UDPEncapsulation encapsulation,
- InetAddress relayIP, int relayPort) throws IOException {
- super();
- this.server_mode = server_mode;
- this.relayIP = relayIP;
- this.relayPort = relayPort;
- this.encapsulation = encapsulation;
- this.proxy = null;
- }
-
- /**
- * Sends the Datagram either through the proxy or directly depending on
- * current proxy settings and destination address. <BR>
- *
- * <B> NOTE: </B> DatagramPacket size should be at least 10 bytes less than
- * the systems limit.
- *
- * <P>
- * See documentation on java.net.DatagramSocket for full details on how to
- * use this method.
- *
- * @param dp
- * Datagram to send.
- * @throws IOException
- * If error happens with I/O.
- */
- public void send(DatagramPacket dp) throws IOException {
- // If the host should be accessed directly, send it as is.
- if (!server_mode && proxy.isDirect(dp.getAddress())) {
- super.send(dp);
- //log.debug("Sending datagram packet directly:");
- return;
- }
-
- final byte[] head = formHeader(dp.getAddress(), dp.getPort());
- byte[] buf = new byte[head.length + dp.getLength()];
- final byte[] data = dp.getData();
-
- // Merge head and data
- System.arraycopy(head, 0, buf, 0, head.length);
- // System.arraycopy(data,dp.getOffset(),buf,head.length,dp.getLength());
- System.arraycopy(data, 0, buf, head.length, dp.getLength());
-
- if (encapsulation != null) {
- buf = encapsulation.udpEncapsulate(buf, true);
- }
-
- super.send(new DatagramPacket(buf, buf.length, relayIP, relayPort));
- }
-
- /**
- * This method allows to send datagram packets with address type DOMAINNAME.
- * SOCKS5 allows to specify host as names rather than ip addresses.Using
- * this method one can send udp datagrams through the proxy, without having
- * to know the ip address of the destination host.
- * <p>
- * If proxy specified for that socket has an option resolveAddrLocally set
- * to true host will be resolved, and the datagram will be send with address
- * type IPV4, if resolve fails, UnknownHostException is thrown.
- *
- * @param dp
- * Datagram to send, it should contain valid port and data
- * @param host
- * Host name to which datagram should be send.
- * @throws IOException
- * If error happens with I/O, or the host can't be resolved when
- * proxy settings say that hosts should be resolved locally.
- * @see Socks5Proxy#resolveAddrLocally(boolean)
- */
- public void send(DatagramPacket dp, String host) throws IOException {
- if (proxy.isDirect(host)) {
- dp.setAddress(InetAddress.getByName(host));
- super.send(dp);
- return;
- }
-
- if ((proxy).resolveAddrLocally) {
- dp.setAddress(InetAddress.getByName(host));
- }
-
- final byte[] head = formHeader(host, dp.getPort());
- byte[] buf = new byte[head.length + dp.getLength()];
- final byte[] data = dp.getData();
- // Merge head and data
- System.arraycopy(head, 0, buf, 0, head.length);
- // System.arraycopy(data,dp.getOffset(),buf,head.length,dp.getLength());
- System.arraycopy(data, 0, buf, head.length, dp.getLength());
-
- if (encapsulation != null) {
- buf = encapsulation.udpEncapsulate(buf, true);
- }
-
- super.send(new DatagramPacket(buf, buf.length, relayIP, relayPort));
- }
-
- /**
- * Receives udp packet. If packet have arrived from the proxy relay server,
- * it is processed and address and port of the packet are set to the address
- * and port of sending host.<BR>
- * If the packet arrived from anywhere else it is not changed.<br>
- * <B> NOTE: </B> DatagramPacket size should be at least 10 bytes bigger
- * than the largest packet you expect (this is for IPV4 addresses). For
- * hostnames and IPV6 it is even more.
- *
- * @param dp
- * Datagram in which all relevent information will be copied.
- */
- public void receive(DatagramPacket dp) throws IOException {
- super.receive(dp);
-
- if (server_mode) {
- // Drop all datagrams not from relayIP/relayPort
- final int init_length = dp.getLength();
- final int initTimeout = getSoTimeout();
- final long startTime = System.currentTimeMillis();
-
- while (!relayIP.equals(dp.getAddress())
- || (relayPort != dp.getPort())) {
-
- // Restore datagram size
- dp.setLength(init_length);
-
- // If there is a non-infinit timeout on this socket
- // Make sure that it happens no matter how often unexpected
- // packets arrive.
- if (initTimeout != 0) {
- final long passed = System.currentTimeMillis() - startTime;
- final int newTimeout = initTimeout - (int) passed;
-
- if (newTimeout <= 0) {
- throw new InterruptedIOException(
- "In Socks5DatagramSocket->receive()");
- }
- setSoTimeout(newTimeout);
- }
-
- super.receive(dp);
- }
-
- // Restore timeout settings
- if (initTimeout != 0) {
- setSoTimeout(initTimeout);
- }
-
- } else if (!relayIP.equals(dp.getAddress())
- || (relayPort != dp.getPort())) {
- return; // Recieved direct packet
- // If the datagram is not from the relay server, return it it as is.
- }
-
- byte[] data;
- data = dp.getData();
-
- if (encapsulation != null) {
- data = encapsulation.udpEncapsulate(data, false);
- }
-
- // FIXME: What is this?
- final int offset = 0; // Java 1.1
- // int offset = dp.getOffset(); //Java 1.2
-
- final ByteArrayInputStream bIn = new ByteArrayInputStream(data, offset,
- dp.getLength());
-
- final ProxyMessage msg = new Socks5Message(bIn);
- dp.setPort(msg.port);
- dp.setAddress(msg.getInetAddress());
-
- // what wasn't read by the Message is the data
- final int data_length = bIn.available();
- // Shift data to the left
- System.arraycopy(data, offset + dp.getLength() - data_length, data,
- offset, data_length);
-
- dp.setLength(data_length);
- }
-
- /**
- * Returns port assigned by the proxy, to which datagrams are relayed. It is
- * not the same port to which other party should send datagrams.
- *
- * @return Port assigned by socks server to which datagrams are send for
- * association.
- */
- public int getLocalPort() {
- if (server_mode) {
- return super.getLocalPort();
- }
- return relayPort;
- }
-
- /**
- * Address assigned by the proxy, to which datagrams are send for relay. It
- * is not necesseraly the same address, to which other party should send
- * datagrams.
- *
- * @return Address to which datagrams are send for association.
- */
- public InetAddress getLocalAddress() {
- if (server_mode) {
- return super.getLocalAddress();
- }
- return relayIP;
- }
-
- /**
- * Closes datagram socket, and proxy connection.
- */
- public void close() {
- if (!server_mode) {
- proxy.endSession();
- }
- super.close();
- }
-
- /**
- * This method checks wether proxy still runs udp forwarding service for
- * this socket.
- * <p>
- * This methods checks wether the primary connection to proxy server is
- * active. If it is, chances are that proxy continues to forward datagrams
- * being send from this socket. If it was closed, most likely datagrams are
- * no longer being forwarded by the server.
- * <p>
- * Proxy might decide to stop forwarding datagrams, in which case it should
- * close primary connection. This method allows to check, wether this have
- * been done.
- * <p>
- * You can specify timeout for which we should be checking EOF condition on
- * the primary connection. Timeout is in milliseconds. Specifying 0 as
- * timeout implies infinity, in which case method will block, until
- * connection to proxy is closed or an error happens, and then return false.
- * <p>
- * One possible scenario is to call isProxyactive(0) in separate thread, and
- * once it returned notify other threads about this event.
- *
- * @param timeout
- * For how long this method should block, before returning.
- * @return true if connection to proxy is active, false if eof or error
- * condition have been encountered on the connection.
- */
- public boolean isProxyAlive(int timeout) {
- if (server_mode) {
- return false;
- }
- if (proxy != null) {
- try {
- proxy.proxySocket.setSoTimeout(timeout);
-
- final int eof = proxy.in.read();
- if (eof < 0) {
- return false; // EOF encountered.
- } else {
- //log.warn("This really should not happen");
- return true; // This really should not happen
- }
-
- } catch (final InterruptedIOException iioe) {
- return true; // read timed out.
- } catch (final IOException ioe) {
- return false;
- }
- }
- return false;
- }
-
- // PRIVATE METHODS
- // ////////////////
-
- private byte[] formHeader(InetAddress ip, int port) {
- final Socks5Message request = new Socks5Message(0, ip, port);
- request.data[0] = 0;
- return request.data;
- }
-
- private byte[] formHeader(String host, int port) {
- final Socks5Message request = new Socks5Message(0, host, port);
- request.data[0] = 0;
- return request.data;
- }
-
- /*
- * ======================================================================
- *
- * //Mainly Test functions //////////////////////
- *
- * private String bytes2String(byte[] b){ String s=""; char[] hex_digit = {
- * '0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F'};
- * for(int i=0;i<b.length;++i){ int i1 = (b[i] & 0xF0) >> 4; int i2 = b[i] &
- * 0xF; s+=hex_digit[i1]; s+=hex_digit[i2]; s+=" "; } return s; } private
- * static final void debug(String s){ if(DEBUG) System.out.print(s); }
- *
- * private static final boolean DEBUG = true;
- *
- *
- * public static void usage(){ System.err.print(
- * "Usage: java Socks.SocksDatagramSocket host port [socksHost socksPort]\n"
- * ); }
- *
- * static final int defaultProxyPort = 1080; //Default Port static final
- * String defaultProxyHost = "www-proxy"; //Default proxy
- *
- * public static void main(String args[]){ int port; String host; int
- * proxyPort; String proxyHost; InetAddress ip;
- *
- * if(args.length > 1 && args.length < 5){ try{
- *
- * host = args[0]; port = Integer.parseInt(args[1]);
- *
- * proxyPort =(args.length > 3)? Integer.parseInt(args[3]) :
- * defaultProxyPort;
- *
- * host = args[0]; ip = InetAddress.getByName(host);
- *
- * proxyHost =(args.length > 2)? args[2] : defaultProxyHost;
- *
- * Proxy.setDefaultProxy(proxyHost,proxyPort); Proxy p =
- * Proxy.getDefaultProxy(); p.addDirect("lux");
- *
- *
- * DatagramSocket ds = new Socks5DatagramSocket();
- *
- *
- * BufferedReader in = new BufferedReader( new
- * InputStreamReader(System.in)); String s;
- *
- * System.out.print("Enter line:"); s = in.readLine();
- *
- * while(s != null){ byte[] data = (s+"\r\n").getBytes(); DatagramPacket dp
- * = new DatagramPacket(data,0,data.length, ip,port);
- * System.out.println("Sending to: "+ip+":"+port); ds.send(dp); dp = new
- * DatagramPacket(new byte[1024],1024);
- *
- * System.out.println("Trying to recieve on port:"+ ds.getLocalPort());
- * ds.receive(dp); System.out.print("Recieved:\n"+
- * "From:"+dp.getAddress()+":"+dp.getPort()+ "\n\n"+ new
- * String(dp.getData(),dp.getOffset(),dp.getLength())+"\n" );
- * System.out.print("Enter line:"); s = in.readLine();
- *
- * } ds.close(); System.exit(1);
- *
- * }catch(SocksException s_ex){ System.err.println("SocksException:"+s_ex);
- * s_ex.printStackTrace(); System.exit(1); }catch(IOException io_ex){
- * io_ex.printStackTrace(); System.exit(1); }catch(NumberFormatException
- * num_ex){ usage(); num_ex.printStackTrace(); System.exit(1); }
- *
- * }else{ usage(); } }
- */
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Message.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Message.java
deleted file mode 100644
index 4d4b06d0..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Message.java
+++ /dev/null
@@ -1,325 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * SOCKS5 request/response message.
- */
-
-class Socks5Message extends ProxyMessage {
- /** Address type of given message */
- public int addrType;
-
- byte[] data;
-
- /**
- * Server error response.
- *
- * @param cmd
- * Error code.
- */
- public Socks5Message(int cmd) {
- super(cmd, null, 0);
- data = new byte[3];
- data[0] = SOCKS_VERSION; // Version.
- data[1] = (byte) cmd; // Reply code for some kind of failure.
- data[2] = 0; // Reserved byte.
- }
-
- /**
- * Construct client request or server response.
- *
- * @param cmd
- * - Request/Response code.
- * @param ip
- * - IP field.
- * @paarm port - port field.
- */
- public Socks5Message(int cmd, InetAddress ip, int port) {
- super(cmd, ip, port);
-
- if (ip == null) {
- this.host = "0.0.0.0";
- } else {
- this.host = ip.getHostName();
- }
-
- this.version = SOCKS_VERSION;
-
- byte[] addr;
-
- if (ip == null) {
- addr = new byte[4];
- addr[0] = addr[1] = addr[2] = addr[3] = 0;
- } else {
- addr = ip.getAddress();
- }
-
- if (addr.length == 4) {
- addrType = SOCKS_ATYP_IPV4;
- } else {
- addrType = SOCKS_ATYP_IPV6;
- }
-
- data = new byte[6 + addr.length];
- data[0] = (byte) SOCKS_VERSION; // Version
- data[1] = (byte) command; // Command
- data[2] = (byte) 0; // Reserved byte
- data[3] = (byte) addrType; // Address type
-
- // Put Address
- System.arraycopy(addr, 0, data, 4, addr.length);
- // Put port
- data[data.length - 2] = (byte) (port >> 8);
- data[data.length - 1] = (byte) (port);
- }
-
- /**
- * Construct client request or server response.
- *
- * @param cmd
- * - Request/Response code.
- * @param hostName
- * - IP field as hostName, uses ADDR_TYPE of HOSTNAME.
- * @paarm port - port field.
- */
- public Socks5Message(int cmd, String hostName, int port) {
- super(cmd, null, port);
- this.host = hostName;
- this.version = SOCKS_VERSION;
-
- //log.debug("Doing ATYP_DOMAINNAME");
-
- addrType = SOCKS_ATYP_DOMAINNAME;
- final byte addr[] = hostName.getBytes();
-
- data = new byte[7 + addr.length];
- data[0] = (byte) SOCKS_VERSION; // Version
- data[1] = (byte) command; // Command
- data[2] = (byte) 0; // Reserved byte
- data[3] = (byte) SOCKS_ATYP_DOMAINNAME; // Address type
- data[4] = (byte) addr.length; // Length of the address
-
- // Put Address
- System.arraycopy(addr, 0, data, 5, addr.length);
- // Put port
- data[data.length - 2] = (byte) (port >> 8);
- data[data.length - 1] = (byte) (port);
- }
-
- /**
- * Initialises Message from the stream. Reads server response from given
- * stream.
- *
- * @param in
- * Input stream to read response from.
- * @throws SocksException
- * If server response code is not SOCKS_SUCCESS(0), or if any
- * error with protocol occurs.
- * @throws IOException
- * If any error happens with I/O.
- */
- public Socks5Message(InputStream in) throws SocksException, IOException {
- this(in, true);
- }
-
- /**
- * Initialises Message from the stream. Reads server response or client
- * request from given stream.
- *
- * @param in
- * Input stream to read response from.
- * @param clinetMode
- * If true read server response, else read client request.
- * @throws SocksException
- * If server response code is not SOCKS_SUCCESS(0) and reading
- * in client mode, or if any error with protocol occurs.
- * @throws IOException
- * If any error happens with I/O.
- */
- public Socks5Message(InputStream in, boolean clientMode)
- throws SocksException, IOException {
-
- read(in, clientMode);
- }
-
- /**
- * Initialises Message from the stream. Reads server response from given
- * stream.
- *
- * @param in
- * Input stream to read response from.
- * @throws SocksException
- * If server response code is not SOCKS_SUCCESS(0), or if any
- * error with protocol occurs.
- * @throws IOException
- * If any error happens with I/O.
- */
- public void read(InputStream in) throws SocksException, IOException {
- read(in, true);
- }
-
- /**
- * Initialises Message from the stream. Reads server response or client
- * request from given stream.
- *
- * @param in
- * Input stream to read response from.
- * @param clinetMode
- * If true read server response, else read client request.
- * @throws SocksException
- * If server response code is not SOCKS_SUCCESS(0) and reading
- * in client mode, or if any error with protocol occurs.
- * @throws IOException
- * If any error happens with I/O.
- */
- public void read(InputStream in, boolean clientMode) throws SocksException,
- IOException {
-
- data = null;
- ip = null;
-
- final DataInputStream di = new DataInputStream(in);
-
- version = di.readUnsignedByte();
- command = di.readUnsignedByte();
-
- if (clientMode && (command != 0)) {
- throw new SocksException(command);
- }
-
- di.readUnsignedByte();
- addrType = di.readUnsignedByte();
-
- byte addr[];
-
- switch (addrType) {
- case SOCKS_ATYP_IPV4:
- addr = new byte[4];
- di.readFully(addr);
- host = bytes2IPV4(addr, 0);
- break;
- case SOCKS_ATYP_IPV6:
- addr = new byte[SOCKS_IPV6_LENGTH];// I believe it is 16 bytes,huge!
- di.readFully(addr);
- host = bytes2IPV6(addr, 0);
- break;
- case SOCKS_ATYP_DOMAINNAME:
- //log.debug("Reading ATYP_DOMAINNAME");
- addr = new byte[di.readUnsignedByte()];// Next byte shows the length
- di.readFully(addr);
- host = new String(addr);
- break;
- default:
- throw (new SocksException(SocksProxyBase.SOCKS_JUST_ERROR));
- }
-
- port = di.readUnsignedShort();
-
- if ((addrType != SOCKS_ATYP_DOMAINNAME) && doResolveIP) {
- try {
- ip = InetAddress.getByName(host);
- } catch (final UnknownHostException uh_ex) {
- }
- }
- }
-
- /**
- * Writes the message to the stream.
- *
- * @param out
- * Output stream to which message should be written.
- */
- public void write(OutputStream out) throws SocksException, IOException {
- if (data == null) {
- Socks5Message msg;
-
- if (addrType == SOCKS_ATYP_DOMAINNAME) {
- msg = new Socks5Message(command, host, port);
- } else {
- if (ip == null) {
- try {
- ip = InetAddress.getByName(host);
- } catch (final UnknownHostException uh_ex) {
- throw new SocksException(
- SocksProxyBase.SOCKS_JUST_ERROR);
- }
- }
- msg = new Socks5Message(command, ip, port);
- }
- data = msg.data;
- }
- out.write(data);
- }
-
- /**
- * Returns IP field of the message as IP, if the message was created with
- * ATYP of HOSTNAME, it will attempt to resolve the hostname, which might
- * fail.
- *
- * @throws UnknownHostException
- * if host can't be resolved.
- */
- public InetAddress getInetAddress() throws UnknownHostException {
- if (ip != null) {
- return ip;
- }
-
- return (ip = InetAddress.getByName(host));
- }
-
- /**
- * Returns string representation of the message.
- */
- public String toString() {
- // FIXME: Single line version, please.
- final String s = "Socks5Message:" + "\n" + "VN " + version + "\n"
- + "CMD " + command + "\n" + "ATYP " + addrType + "\n"
- + "ADDR " + host + "\n" + "PORT " + port + "\n";
- return s;
- }
-
- /**
- *Wether to resolve hostIP returned from SOCKS server that is wether to
- * create InetAddress object from the hostName string
- */
- static public boolean resolveIP() {
- return doResolveIP;
- }
-
- /**
- *Wether to resolve hostIP returned from SOCKS server that is wether to
- * create InetAddress object from the hostName string
- *
- * @param doResolve
- * Wether to resolve hostIP from SOCKS server.
- *@return Previous value.
- */
- static public boolean resolveIP(boolean doResolve) {
- final boolean old = doResolveIP;
- doResolveIP = doResolve;
- return old;
- }
-
- /*
- * private static final void debug(String s){ if(DEBUG) System.out.print(s);
- * } private static final boolean DEBUG = false;
- */
-
- // SOCKS5 constants
- public static final int SOCKS_VERSION = 5;
-
- public static final int SOCKS_ATYP_IPV4 = 0x1; // Where is 2??
- public static final int SOCKS_ATYP_DOMAINNAME = 0x3; // !!!!rfc1928
- public static final int SOCKS_ATYP_IPV6 = 0x4;
-
- public static final int SOCKS_IPV6_LENGTH = 16;
-
- static boolean doResolveIP = true;
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Proxy.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Proxy.java
deleted file mode 100644
index 7400aa6e..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/Socks5Proxy.java
+++ /dev/null
@@ -1,295 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-/**
- * SOCKS5 Proxy.
- */
-
-public class Socks5Proxy extends SocksProxyBase implements Cloneable {
-
- // Data members
- private Hashtable<Integer, Authentication> authMethods = new Hashtable<Integer, Authentication>();
- private int selectedMethod;
-
- boolean resolveAddrLocally = true;
- UDPEncapsulation udp_encapsulation = null;
-
- // Public Constructors
- // ====================
-
- /**
- * Creates SOCKS5 proxy.
- *
- * @param p
- * Proxy to use to connect to this proxy, allows proxy chaining.
- * @param proxyHost
- * Host on which a Proxy server runs.
- * @param proxyPort
- * Port on which a Proxy server listens for connections.
- * @throws UnknownHostException
- * If proxyHost can't be resolved.
- */
- public Socks5Proxy(SocksProxyBase p, String proxyHost, int proxyPort)
- throws UnknownHostException {
-
- super(p, proxyHost, proxyPort);
- version = 5;
- setAuthenticationMethod(0, new AuthenticationNone());
- }
-
- /**
- * Creates SOCKS5 proxy.
- *
- * @param proxyHost
- * Host on which a Proxy server runs.
- * @param proxyPort
- * Port on which a Proxy server listens for connections.
- * @throws UnknownHostException
- * If proxyHost can't be resolved.
- */
- public Socks5Proxy(String proxyHost, int proxyPort)
- throws UnknownHostException {
- this(null, proxyHost, proxyPort);
- }
-
- /**
- * Creates SOCKS5 proxy.
- *
- * @param p
- * Proxy to use to connect to this proxy, allows proxy chaining.
- * @param proxyIP
- * Host on which a Proxy server runs.
- * @param proxyPort
- * Port on which a Proxy server listens for connections.
- */
- public Socks5Proxy(SocksProxyBase p, InetAddress proxyIP, int proxyPort) {
- super(p, proxyIP, proxyPort);
- version = 5;
- setAuthenticationMethod(0, new AuthenticationNone());
- }
-
- /**
- * Creates SOCKS5 proxy.
- *
- * @param proxyIP
- * Host on which a Proxy server runs.
- * @param proxyPort
- * Port on which a Proxy server listens for connections.
- */
- public Socks5Proxy(InetAddress proxyIP, int proxyPort) {
- this(null, proxyIP, proxyPort);
- }
-
- // Public instance methods
- // ========================
-
- /**
- * Wether to resolve address locally or to let proxy do so.
- * <p>
- * SOCKS5 protocol allows to send host names rather then IPs in the
- * requests, this option controls wether the hostnames should be send to the
- * proxy server as names, or should they be resolved locally.
- *
- * @param doResolve
- * Wether to perform resolution locally.
- * @return Previous settings.
- */
- public boolean resolveAddrLocally(boolean doResolve) {
- final boolean old = resolveAddrLocally;
- resolveAddrLocally = doResolve;
- return old;
- }
-
- /**
- * Get current setting on how the addresses should be handled.
- *
- * @return Current setting for address resolution.
- * @see Socks5Proxy#resolveAddrLocally(boolean doResolve)
- */
- public boolean resolveAddrLocally() {
- return resolveAddrLocally;
- }
-
- /**
- * Adds another authentication method.
- *
- * @param methodId
- * Authentication method id, see rfc1928
- * @param method
- * Implementation of Authentication
- * @see Authentication
- */
- public boolean setAuthenticationMethod(int methodId, Authentication method) {
- if ((methodId < 0) || (methodId > 255)) {
- return false;
- }
- if (method == null) {
- // Want to remove a particular method
- return (authMethods.remove(new Integer(methodId)) != null);
- } else {// Add the method, or rewrite old one
- authMethods.put(new Integer(methodId), method);
- }
- return true;
- }
-
- /**
- * Get authentication method, which corresponds to given method id
- *
- * @param methodId
- * Authentication method id.
- * @return Implementation for given method or null, if one was not set.
- */
- public Authentication getAuthenticationMethod(int methodId) {
- final Object method = authMethods.get(new Integer(methodId));
- if (method == null) {
- return null;
- }
- return (Authentication) method;
- }
-
- /**
- * Creates a clone of this Proxy. clone() returns an
- */
- @SuppressWarnings("unchecked")
- public Object clone() {
- final Socks5Proxy newProxy = new Socks5Proxy(proxyIP, proxyPort);
-
- final Object o = this.authMethods.clone();
- newProxy.authMethods = (Hashtable<Integer, Authentication>) o;
-
- newProxy.directHosts = (InetRange) directHosts.clone();
- newProxy.resolveAddrLocally = resolveAddrLocally;
- newProxy.chainProxy = chainProxy;
- return newProxy;
- }
-
- // Public Static(Class) Methods
- // ==============================
-
- // Protected Methods
- // =================
-
- protected SocksProxyBase copy() {
- final Socks5Proxy copy = new Socks5Proxy(proxyIP, proxyPort);
-
- copy.authMethods = this.authMethods; // same Hash, no copy
- copy.directHosts = this.directHosts;
- copy.chainProxy = this.chainProxy;
- copy.resolveAddrLocally = this.resolveAddrLocally;
- return copy;
- }
-
- /**
- *
- *
- */
- protected void startSession() throws SocksException {
- super.startSession();
- Authentication auth;
- final Socket ps = proxySocket; // The name is too long
-
- try {
-
- final byte nMethods = (byte) authMethods.size(); // Number of
- // methods
-
- final byte[] buf = new byte[2 + nMethods]; // 2 is for VER,NMETHODS
- buf[0] = (byte) version;
- buf[1] = nMethods; // Number of methods
- int i = 2;
-
- final Enumeration<Integer> ids = authMethods.keys();
- while (ids.hasMoreElements()) {
- buf[i++] = (byte) ids.nextElement().intValue();
- }
-
- out.write(buf);
- out.flush();
-
- final int versionNumber = in.read();
- selectedMethod = in.read();
-
- if ((versionNumber < 0) || (selectedMethod < 0)) {
- // EOF condition was reached
- endSession();
- final String s = "Connection to proxy lost.";
- throw new SocksException(SOCKS_PROXY_IO_ERROR, s);
- }
-
- if (versionNumber < version) {
- // What should we do??
- }
-
- if (selectedMethod == 0xFF) { // No method selected
- ps.close();
- throw (new SocksException(SOCKS_AUTH_NOT_SUPPORTED));
- }
-
- auth = getAuthenticationMethod(selectedMethod);
- if (auth == null) {
- // This shouldn't happen, unless method was removed by other
- // thread, or the server stuffed up
- final String s = "Specified Authentication not found!";
- throw new SocksException(SOCKS_JUST_ERROR, s);
- }
-
- final Object[] in_out;
- in_out = auth.doSocksAuthentication(selectedMethod, ps);
-
- if (in_out == null) {
- // Authentication failed by some reason
- throw (new SocksException(SOCKS_AUTH_FAILURE));
- }
-
- /*
- * Most authentication methods are expected to return simply the
- * input/output streams associated with the socket. However if the
- * auth. method requires some kind of encryption/decryption being
- * done on the connection it should provide classes to handle I/O.
- */
-
- in = (InputStream) in_out[0];
- out = (OutputStream) in_out[1];
- if (in_out.length > 2) {
- udp_encapsulation = (UDPEncapsulation) in_out[2];
- }
-
- } catch (final SocksException s_ex) {
- throw s_ex;
- } catch (final UnknownHostException uh_ex) {
- throw new SocksException(SOCKS_PROXY_NO_CONNECT, uh_ex);
- } catch (final SocketException so_ex) {
- throw new SocksException(SOCKS_PROXY_NO_CONNECT, so_ex);
- } catch (final IOException io_ex) {
- throw new SocksException(SOCKS_PROXY_IO_ERROR, io_ex);
- }
- }
-
- protected ProxyMessage formMessage(int cmd, InetAddress ip, int port) {
- return new Socks5Message(cmd, ip, port);
- }
-
- protected ProxyMessage formMessage(int cmd, String host, int port)
- throws UnknownHostException {
- if (resolveAddrLocally) {
- return formMessage(cmd, InetAddress.getByName(host), port);
- } else {
- return new Socks5Message(cmd, host, port);
- }
- }
-
- protected ProxyMessage formMessage(InputStream in) throws SocksException,
- IOException {
- return new Socks5Message(in);
- }
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksException.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksException.java
deleted file mode 100644
index a6515974..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksException.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-/**
- * Exception thrown by various socks classes to indicate errors with protocol or
- * unsuccessfull server responses.
- */
-public class SocksException extends java.io.IOException {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Construct a SocksException with given errorcode.
- * <p>
- * Tries to look up message which corresponds to this error code.
- *
- * @param errCode
- * Error code for this exception.
- */
- public SocksException(int errCode) {
- this.errCode = errCode;
- lookupErrorString(errCode);
- }
-
- private void lookupErrorString(int errCode) {
- if ((errCode >> 16) == 0) {
- if (errCode <= serverReplyMessage.length) {
- errString = serverReplyMessage[errCode];
- } else {
- errString = UNASSIGNED_ERROR_MESSAGE;
- }
- } else {
- // Local error
- errCode = (errCode >> 16) - 1;
- if (errCode <= localErrorMessage.length) {
- errString = localErrorMessage[errCode];
- } else {
- errString = UNASSIGNED_ERROR_MESSAGE;
- }
- }
- }
-
- /**
- * Construct a SocksException with given error code, and a Throwable cause
- *
- * @param errCode
- * @param t
- * Nested exception for debugging purposes.
- */
- public SocksException(int errCode, Throwable t) {
- super(t); // Java 1.6+
- this.errCode = errCode;
- lookupErrorString(errCode);
- }
-
- /**
- * Constructs a SocksException with given error code and message.
- *
- * @param errCode
- * Error code.
- * @param errString
- * Error Message.
- */
- public SocksException(int errCode, String errString) {
- this.errCode = errCode;
- this.errString = errString;
- }
-
- public SocksException(int errCode, String string, Throwable t) {
- super(string, t); // Java 1.6+
- this.errCode = errCode;
- this.errString = string;
- }
-
- /**
- * Get the error code associated with this exception.
- *
- * @return Error code associated with this exception.
- */
- public int getErrorCode() {
- return errCode;
- }
-
- /**
- * Get human readable representation of this exception.
- *
- * @return String represntation of this exception.
- */
- public String toString() {
- return errString;
- }
-
- static final String UNASSIGNED_ERROR_MESSAGE = "Unknown error message";
-
- static final String serverReplyMessage[] = { "Succeeded",
- "General SOCKS server failure",
- "Connection not allowed by ruleset", "Network unreachable",
- "Host unreachable", "Connection refused", "TTL expired",
- "Command not supported", "Address type not supported" };
-
- static final String localErrorMessage[] = { "SOCKS server not specified",
- "Unable to contact SOCKS server", "IO error",
- "None of Authentication methods are supported",
- "Authentication failed", "General SOCKS fault" };
-
- String errString;
- int errCode;
-
-}// End of SocksException class
-
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksProxyBase.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksProxyBase.java
deleted file mode 100644
index ebf4fdb8..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksProxyBase.java
+++ /dev/null
@@ -1,543 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.UnknownHostException;
-
-/**
- * Abstract class Proxy, base for classes Socks4Proxy and Socks5Proxy. Defines
- * methods for specifying default proxy, to be used by all classes of this
- * package.
- */
-
-public abstract class SocksProxyBase {
-
- // Data members
- protected InetRange directHosts = new InetRange();
-
- protected InetAddress proxyIP = null;
- protected String proxyHost = null;
- protected int proxyPort;
- protected Socket proxySocket = null;
-
- protected InputStream in;
- protected OutputStream out;
-
- protected int version;
-
- protected SocksProxyBase chainProxy = null;
-
- // Protected static/class variables
- protected static SocksProxyBase defaultProxy = null;
-
- // Constructors
- // ====================
- SocksProxyBase(SocksProxyBase chainProxy, String proxyHost, int proxyPort)
- throws UnknownHostException {
- this.chainProxy = chainProxy;
- this.proxyHost = proxyHost;
-
- if (chainProxy == null) {
- this.proxyIP = InetAddress.getByName(proxyHost);
- }
-
- this.proxyPort = proxyPort;
- }
-
- SocksProxyBase(String proxyHost, int proxyPort) throws UnknownHostException {
- this(null, proxyHost, proxyPort);
- }
-
- SocksProxyBase(SocksProxyBase chainProxy, InetAddress proxyIP, int proxyPort) {
- this.chainProxy = chainProxy;
- this.proxyIP = proxyIP;
- this.proxyPort = proxyPort;
- }
-
- SocksProxyBase(InetAddress proxyIP, int proxyPort) {
- this(null, proxyIP, proxyPort);
- }
-
- SocksProxyBase(SocksProxyBase p) {
- this.proxyIP = p.proxyIP;
- this.proxyPort = p.proxyPort;
- this.version = p.version;
- this.directHosts = p.directHosts;
- }
-
- // Public instance methods
- // ========================
-
- /**
- * Get the port on which proxy server is running.
- *
- * @return Proxy port.
- */
- public int getPort() {
- return proxyPort;
- }
-
- /**
- * Get the ip address of the proxy server host.
- *
- * @return Proxy InetAddress.
- */
- public InetAddress getInetAddress() {
- return proxyIP;
- }
-
- /**
- * Adds given ip to the list of direct addresses. This machine will be
- * accessed without using proxy.
- */
- public void addDirect(InetAddress ip) {
- directHosts.add(ip);
- }
-
- /**
- * Adds host to the list of direct addresses. This machine will be accessed
- * without using proxy.
- */
- public boolean addDirect(String host) {
- return directHosts.add(host);
- }
-
- /**
- * Adds given range of addresses to the lsit of direct addresses, machines
- * within this range will be accessed without using proxy.
- */
- public void addDirect(InetAddress from, InetAddress to) {
- directHosts.add(from, to);
- }
-
- /**
- * Sets given InetRange as the list of direct address, previous list will be
- * discarded, any changes done previously with addDirect(Inetaddress) will
- * be lost. The machines in this range will be accessed without using proxy.
- *
- * @param ir
- * InetRange which should be used to look up direct addresses.
- * @see InetRange
- */
- public void setDirect(InetRange ir) {
- directHosts = ir;
- }
-
- /**
- * Get the list of direct hosts.
- *
- * @return Current range of direct address as InetRange object.
- * @see InetRange
- */
- public InetRange getDirect() {
- return directHosts;
- }
-
- /**
- * Check wether the given host is on the list of direct address.
- *
- * @param host
- * Host name to check.
- * @return true if the given host is specified as the direct addresses.
- */
- public boolean isDirect(String host) {
- return directHosts.contains(host);
- }
-
- /**
- * Check wether the given host is on the list of direct addresses.
- *
- * @param host
- * Host address to check.
- * @return true if the given host is specified as the direct address.
- */
- public boolean isDirect(InetAddress host) {
- return directHosts.contains(host);
- }
-
- /**
- * Set the proxy which should be used to connect to given proxy.
- *
- * @param chainProxy
- * Proxy to use to connect to this proxy.
- */
- public void setChainProxy(SocksProxyBase chainProxy) {
- this.chainProxy = chainProxy;
- }
-
- /**
- * Get proxy which is used to connect to this proxy.
- *
- * @return Proxy which is used to connect to this proxy, or null if proxy is
- * to be contacted directly.
- */
- public SocksProxyBase getChainProxy() {
- return chainProxy;
- }
-
- /**
- * Get string representation of this proxy.
- *
- * @returns string in the form:proxyHost:proxyPort \t Version versionNumber
- */
- public String toString() {
- return ("" + proxyIP.getHostName() + ":" + proxyPort + "\tVersion " + version);
- }
-
- // Public Static(Class) Methods
- // ==============================
-
- /**
- * Sets SOCKS4 proxy as default.
- *
- * @param hostName
- * Host name on which SOCKS4 server is running.
- * @param port
- * Port on which SOCKS4 server is running.
- * @param user
- * Username to use for communications with proxy.
- */
- public static void setDefaultProxy(String hostName, int port, String user)
- throws UnknownHostException {
- defaultProxy = new Socks4Proxy(hostName, port, user);
- }
-
- /**
- * Sets SOCKS4 proxy as default.
- *
- * @param ipAddress
- * Host address on which SOCKS4 server is running.
- * @param port
- * Port on which SOCKS4 server is running.
- * @param user
- * Username to use for communications with proxy.
- */
- public static void setDefaultProxy(InetAddress ipAddress, int port,
- String user) {
- defaultProxy = new Socks4Proxy(ipAddress, port, user);
- }
-
- /**
- * Sets SOCKS5 proxy as default. Default proxy only supports
- * no-authentication.
- *
- * @param hostName
- * Host name on which SOCKS5 server is running.
- * @param port
- * Port on which SOCKS5 server is running.
- */
- public static void setDefaultProxy(String hostName, int port)
- throws UnknownHostException {
- defaultProxy = new Socks5Proxy(hostName, port);
- }
-
- /**
- * Sets SOCKS5 proxy as default. Default proxy only supports
- * no-authentication.
- *
- * @param ipAddress
- * Host address on which SOCKS5 server is running.
- * @param port
- * Port on which SOCKS5 server is running.
- */
- public static void setDefaultProxy(InetAddress ipAddress, int port) {
- defaultProxy = new Socks5Proxy(ipAddress, port);
- }
-
- /**
- * Sets default proxy.
- *
- * @param p
- * Proxy to use as default proxy.
- */
- public static void setDefaultProxy(SocksProxyBase p) {
- defaultProxy = p;
- }
-
- /**
- * Get current default proxy.
- *
- * @return Current default proxy, or null if none is set.
- */
- public static SocksProxyBase getDefaultProxy() {
- return defaultProxy;
- }
-
- /**
- * Parses strings in the form: host[:port:user:password], and creates proxy
- * from information obtained from parsing.
- * <p>
- * Defaults: port = 1080.<br>
- * If user specified but not password, creates Socks4Proxy, if user not
- * specified creates Socks5Proxy, if both user and password are speciefied
- * creates Socks5Proxy with user/password authentication.
- *
- * @param proxy_entry
- * String in the form host[:port:user:password]
- * @return Proxy created from the string, null if entry was somehow
- * invalid(host unknown for example, or empty string)
- */
- public static SocksProxyBase parseProxy(String proxy_entry) {
-
- String proxy_host;
- int proxy_port = 1080;
- String proxy_user = null;
- String proxy_password = null;
- SocksProxyBase proxy;
-
- final java.util.StringTokenizer st = new java.util.StringTokenizer(
- proxy_entry, ":");
- if (st.countTokens() < 1) {
- return null;
- }
-
- proxy_host = st.nextToken();
- if (st.hasMoreTokens()) {
- try {
- proxy_port = Integer.parseInt(st.nextToken().trim());
- } catch (final NumberFormatException nfe) {
- }
- }
-
- if (st.hasMoreTokens()) {
- proxy_user = st.nextToken();
- }
-
- if (st.hasMoreTokens()) {
- proxy_password = st.nextToken();
- }
-
- try {
- if (proxy_user == null) {
- proxy = new Socks5Proxy(proxy_host, proxy_port);
- } else if (proxy_password == null) {
- proxy = new Socks4Proxy(proxy_host, proxy_port, proxy_user);
- } else {
- proxy = new Socks5Proxy(proxy_host, proxy_port);
- final UserPasswordAuthentication upa = new UserPasswordAuthentication(
- proxy_user, proxy_password);
-
- ((Socks5Proxy) proxy).setAuthenticationMethod(
- UserPasswordAuthentication.METHOD_ID, upa);
- }
- } catch (final UnknownHostException uhe) {
- return null;
- }
-
- return proxy;
- }
-
- // Protected Methods
- // =================
-
- protected void startSession() throws SocksException {
- try {
- if (chainProxy == null) {
- proxySocket = new Socket(proxyIP, proxyPort);
- } else if (proxyIP != null) {
- proxySocket = new SocksSocket(chainProxy, proxyIP, proxyPort);
- } else {
- proxySocket = new SocksSocket(chainProxy, proxyHost, proxyPort);
- }
-
- in = proxySocket.getInputStream();
- out = proxySocket.getOutputStream();
- } catch (final SocksException se) {
- throw se;
- } catch (final IOException io_ex) {
- throw new SocksException(SOCKS_PROXY_IO_ERROR, "" + io_ex);
- }
- }
-
- /**
- * Create a copy of this proxy for use by individual threads.
- *
- * @return proxy
- */
- protected abstract SocksProxyBase copy();
-
- protected abstract ProxyMessage formMessage(int cmd, InetAddress ip,
- int port);
-
- protected abstract ProxyMessage formMessage(int cmd, String host, int port)
- throws UnknownHostException;
-
- protected abstract ProxyMessage formMessage(InputStream in)
- throws SocksException, IOException;
-
- protected ProxyMessage connect(InetAddress ip, int port)
- throws SocksException {
- try {
- startSession();
- final ProxyMessage request = formMessage(SOCKS_CMD_CONNECT, ip,
- port);
- return exchange(request);
- } catch (final SocksException se) {
- endSession();
- throw se;
- }
- }
-
- protected ProxyMessage connect(String host, int port)
- throws UnknownHostException, SocksException {
- try {
- startSession();
- final ProxyMessage request = formMessage(SOCKS_CMD_CONNECT, host,
- port);
- return exchange(request);
- } catch (final SocksException se) {
- endSession();
- throw se;
- }
- }
-
- protected ProxyMessage bind(InetAddress ip, int port) throws SocksException {
- try {
- startSession();
- final ProxyMessage request = formMessage(SOCKS_CMD_BIND, ip, port);
- return exchange(request);
- } catch (final SocksException se) {
- endSession();
- throw se;
- }
- }
-
- protected ProxyMessage bind(String host, int port)
- throws UnknownHostException, SocksException {
- try {
- startSession();
- final ProxyMessage request = formMessage(SOCKS_CMD_BIND, host, port);
- return exchange(request);
- } catch (final SocksException se) {
- endSession();
- throw se;
- }
- }
-
- protected ProxyMessage accept() throws IOException, SocksException {
- ProxyMessage msg;
- try {
- msg = formMessage(in);
- } catch (final InterruptedIOException iioe) {
- throw iioe;
- } catch (final IOException io_ex) {
- endSession();
- throw new SocksException(SOCKS_PROXY_IO_ERROR,
- "While Trying accept:" + io_ex);
- }
- return msg;
- }
-
- protected ProxyMessage udpAssociate(InetAddress ip, int port)
- throws SocksException {
- try {
- startSession();
- final ProxyMessage request = formMessage(SOCKS_CMD_UDP_ASSOCIATE,
- ip, port);
- if (request != null) {
- return exchange(request);
- }
- } catch (final SocksException se) {
- endSession();
- throw se;
- }
- // Only get here if request was null
- endSession();
- throw new SocksException(SOCKS_METHOD_NOTSUPPORTED,
- "This version of proxy does not support UDP associate, use version 5");
- }
-
- protected ProxyMessage udpAssociate(String host, int port)
- throws UnknownHostException, SocksException {
- try {
- startSession();
- final ProxyMessage request = formMessage(SOCKS_CMD_UDP_ASSOCIATE,
- host, port);
- if (request != null) {
- return exchange(request);
- }
- } catch (final SocksException se) {
- endSession();
- throw se;
- }
- // Only get here if request was null
- endSession();
- throw new SocksException(SOCKS_METHOD_NOTSUPPORTED,
- "This version of proxy does not support UDP associate, use version 5");
- }
-
- protected void endSession() {
- try {
- if (proxySocket != null) {
- proxySocket.close();
- }
- proxySocket = null;
- } catch (final IOException io_ex) {
- }
- }
-
- /**
- *Sends the request to SOCKS server
- */
- protected void sendMsg(ProxyMessage msg) throws SocksException, IOException {
- msg.write(out);
- }
-
- /**
- * Reads the reply from the SOCKS server
- */
- protected ProxyMessage readMsg() throws SocksException, IOException {
- return formMessage(in);
- }
-
- /**
- *Sends the request reads reply and returns it throws exception if
- * something wrong with IO or the reply code is not zero
- */
- protected ProxyMessage exchange(ProxyMessage request) throws SocksException {
- ProxyMessage reply;
- try {
- request.write(out);
- reply = formMessage(in);
- } catch (final SocksException s_ex) {
- throw s_ex;
- } catch (final IOException ioe) {
- throw (new SocksException(SOCKS_PROXY_IO_ERROR, "" + ioe));
- }
- return reply;
- }
-
- // Private methods
- // ===============
-
- // Constants
-
- public static final int SOCKS_SUCCESS = 0;
- public static final int SOCKS_FAILURE = 1;
- public static final int SOCKS_BADCONNECT = 2;
- public static final int SOCKS_BADNETWORK = 3;
- public static final int SOCKS_HOST_UNREACHABLE = 4;
- public static final int SOCKS_CONNECTION_REFUSED = 5;
- public static final int SOCKS_TTL_EXPIRE = 6;
- public static final int SOCKS_CMD_NOT_SUPPORTED = 7;
- public static final int SOCKS_ADDR_NOT_SUPPORTED = 8;
-
- public static final int SOCKS_NO_PROXY = 1 << 16;
- public static final int SOCKS_PROXY_NO_CONNECT = 2 << 16;
- public static final int SOCKS_PROXY_IO_ERROR = 3 << 16;
- public static final int SOCKS_AUTH_NOT_SUPPORTED = 4 << 16;
- public static final int SOCKS_AUTH_FAILURE = 5 << 16;
- public static final int SOCKS_JUST_ERROR = 6 << 16;
-
- public static final int SOCKS_DIRECT_FAILED = 7 << 16;
- public static final int SOCKS_METHOD_NOTSUPPORTED = 8 << 16;
-
- static final int SOCKS_CMD_CONNECT = 0x1;
- static final int SOCKS_CMD_BIND = 0x2;
- static final int SOCKS_CMD_UDP_ASSOCIATE = 0x3;
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksServerSocket.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksServerSocket.java
deleted file mode 100644
index 8d009cbf..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksServerSocket.java
+++ /dev/null
@@ -1,235 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-
-/**
- * SocksServerSocket allows to accept connections from one particular host
- * through the SOCKS4 or SOCKS5 proxy.
- */
-public class SocksServerSocket extends ServerSocket {
- // Data members
- protected SocksProxyBase proxy;
- protected String localHost;
- protected InetAddress localIP;
- protected int localPort;
-
- boolean doing_direct = false;
- InetAddress remoteAddr;
-
- /**
- * Creates ServerSocket capable of accepting one connection through the
- * firewall, uses default Proxy.
- *
- * @param host
- * Host from which the connection should be recieved.
- *@param port
- * Port number of the primary connection.
- */
- public SocksServerSocket(String host, int port) throws SocksException,
- UnknownHostException, IOException {
- this(SocksProxyBase.defaultProxy, host, port);
- }
-
- /**
- *Creates ServerSocket capable of accepting one connection through the
- * firewall, uses given proxy.
- *
- * @param p
- * Proxy object to use.
- *@param host
- * Host from which the connection should be recieved.
- *@param port
- * Port number of the primary connection.
- */
- public SocksServerSocket(SocksProxyBase p, String host, int port)
- throws SocksException, UnknownHostException, IOException {
-
- super(0);
- if (p == null) {
- throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
- }
- // proxy=p;
- proxy = p.copy();
- if (proxy.isDirect(host)) {
- remoteAddr = InetAddress.getByName(host);
- proxy = null;
- doDirect();
- } else {
- processReply(proxy.bind(host, port));
- }
- }
-
- /**
- * Creates ServerSocket capable of accepting one connection through the
- * firewall, uses default Proxy.
- *
- * @param ip
- * Host from which the connection should be recieved.
- *@param port
- * Port number of the primary connection.
- */
- public SocksServerSocket(InetAddress ip, int port) throws SocksException,
- IOException {
- this(SocksProxyBase.defaultProxy, ip, port);
- }
-
- /**
- *Creates ServerSocket capable of accepting one connection through the
- * firewall, uses given proxy.
- *
- * @param p
- * Proxy object to use.
- *@param ip
- * Host from which the connection should be recieved.
- *@param port
- * Port number of the primary connection.
- */
- public SocksServerSocket(SocksProxyBase p, InetAddress ip, int port)
- throws SocksException, IOException {
- super(0);
-
- if (p == null) {
- throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
- }
- this.proxy = p.copy();
-
- if (proxy.isDirect(ip)) {
- remoteAddr = ip;
- doDirect();
- } else {
- processReply(proxy.bind(ip, port));
- }
- }
-
- /**
- * Accepts the incoming connection.
- */
- public Socket accept() throws IOException {
- Socket s;
-
- if (!doing_direct) {
- if (proxy == null) {
- return null;
- }
-
- final ProxyMessage msg = proxy.accept();
- s = msg.ip == null ? new SocksSocket(msg.host, msg.port, proxy)
- : new SocksSocket(msg.ip, msg.port, proxy);
- // Set timeout back to 0
- proxy.proxySocket.setSoTimeout(0);
- } else { // Direct Connection
-
- // Mimic the proxy behaviour,
- // only accept connections from the speciefed host.
- while (true) {
- s = super.accept();
- if (s.getInetAddress().equals(remoteAddr)) {
- // got the connection from the right host
- // Close listenning socket.
- break;
- } else {
- s.close(); // Drop all connections from other hosts
- }
- }
-
- }
- proxy = null;
- // Return accepted socket
- return s;
- }
-
- /**
- * Closes the connection to proxy if socket have not been accepted, if the
- * direct connection is used, closes direct ServerSocket. If the client
- * socket have been allready accepted, does nothing.
- */
- public void close() throws IOException {
- super.close();
- if (proxy != null) {
- proxy.endSession();
- }
- proxy = null;
- }
-
- /**
- * Get the name of the host proxy is using to listen for incoming
- * connection.
- * <P>
- * Usefull when address is returned by proxy as the hostname.
- *
- * @return the hostname of the address proxy is using to listen for incoming
- * connection.
- */
- public String getHost() {
- return localHost;
- }
-
- /**
- * Get address assigned by proxy to listen for incomming connections, or the
- * local machine address if doing direct connection.
- */
- public InetAddress getInetAddress() {
- if (localIP == null) {
- try {
- localIP = InetAddress.getByName(localHost);
- } catch (final UnknownHostException e) {
- return null;
- }
- }
- return localIP;
- }
-
- /**
- * Get port assigned by proxy to listen for incoming connections, or the
- * port chosen by local system, if accepting directly.
- */
- public int getLocalPort() {
- return localPort;
- }
-
- /**
- * Set Timeout.
- *
- * @param timeout
- * Amount of time in milliseconds, accept should wait for
- * incoming connection before failing with exception. Zero
- * timeout implies infinity.
- */
- public void setSoTimeout(int timeout) throws SocketException {
- super.setSoTimeout(timeout);
- if (!doing_direct) {
- proxy.proxySocket.setSoTimeout(timeout);
- }
- }
-
- // Private Methods
- // ////////////////
-
- private void processReply(ProxyMessage reply) throws SocksException {
- localPort = reply.port;
- /*
- * If the server have assigned same host as it was contacted on it might
- * return an address of all zeros
- */
- if (reply.host.equals("0.0.0.0")) {
- localIP = proxy.proxyIP;
- localHost = localIP.getHostName();
- } else {
- localHost = reply.host;
- localIP = reply.ip;
- }
- }
-
- private void doDirect() {
- doing_direct = true;
- localPort = super.getLocalPort();
- localIP = super.getInetAddress();
- localHost = localIP.getHostName();
- }
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksSocket.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksSocket.java
deleted file mode 100644
index 0e70c7ae..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/SocksSocket.java
+++ /dev/null
@@ -1,385 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-
-/**
- * SocksSocket tryies to look very similar to normal Socket, while allowing
- * connections through the SOCKS4 or 5 proxy. To use this class you will have to
- * identify proxy you need to use, Proxy class allows you to set default proxy,
- * which will be used by all Socks aware sockets. You can also create either
- * Socks4Proxy or Socks5Proxy, and use them by passing to the appropriate
- * constructors.
- * <P>
- * Using Socks package can be as easy as that:
- *
- * <pre>
- * <tt>
- *
- * import Socks.*;
- * ....
- *
- * try{
- * //Specify SOCKS5 proxy
- * Proxy.setDefaultProxy("socks-proxy",1080);
- *
- * //OR you still use SOCKS4
- * //Code below uses SOCKS4 proxy
- * //Proxy.setDefaultProxy("socks-proxy",1080,userName);
- *
- * Socket s = SocksSocket("some.host.of.mine",13);
- * readTimeFromSock(s);
- * }catch(SocksException sock_ex){
- * //Usually it will turn in more or less meaningfull message
- * System.err.println("SocksException:"+sock_ex);
- * }
- *
- * </tt>
- * </pre>
- *<P>
- * However if the need exist for more control, like resolving addresses
- * remotely, or using some non-trivial authentication schemes, it can be done.
- */
-
-public class SocksSocket extends Socket {
- // Data members
- protected SocksProxyBase proxy;
- protected String localHost, remoteHost;
- protected InetAddress localIP, remoteIP;
- protected int localPort, remotePort;
-
- private Socket directSock = null;
-
- /**
- * Tryies to connect to given host and port using default proxy. If no
- * default proxy speciefied it throws SocksException with error code
- * SOCKS_NO_PROXY.
- *
- * @param host
- * Machine to connect to.
- * @param port
- * Port to which to connect.
- * @see SocksSocket#SocksSocket(SocksProxyBase,String,int)
- * @see Socks5Proxy#resolveAddrLocally
- */
- public SocksSocket(String host, int port) throws SocksException,
- UnknownHostException {
- this(SocksProxyBase.defaultProxy, host, port);
- }
-
- /**
- * Connects to host port using given proxy server.
- *
- * @param p
- * Proxy to use.
- * @param host
- * Machine to connect to.
- * @param port
- * Port to which to connect.
- * @throws UnknownHostException
- * If one of the following happens:
- * <ol>
- *
- * <li>Proxy settings say that address should be resolved
- * locally, but this fails.
- * <li>Proxy settings say that the host should be contacted
- * directly but host name can't be resolved.
- * </ol>
- * @throws SocksException
- * If one of the following happens:
- * <ul>
- * <li>Proxy is is null.
- * <li>Proxy settings say that the host should be contacted
- * directly but this fails.
- * <li>Socks Server can't be contacted.
- * <li>Authentication fails.
- * <li>Connection is not allowed by the SOCKS proxy.
- * <li>SOCKS proxy can't establish the connection.
- * <li>Any IO error occured.
- * <li>Any protocol error occured.
- * </ul>
- * @throws IOexception
- * if anything is wrong with I/O.
- * @see Socks5Proxy#resolveAddrLocally
- */
- public SocksSocket(SocksProxyBase p, String host, int port)
- throws SocksException, UnknownHostException {
-
- if (p == null) {
- throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
- }
- // proxy=p;
- proxy = p.copy();
- remoteHost = host;
- remotePort = port;
- if (proxy.isDirect(host)) {
- remoteIP = InetAddress.getByName(host);
- doDirect();
- } else {
- processReply(proxy.connect(host, port));
- }
- }
-
- /**
- * Tryies to connect to given ip and port using default proxy. If no default
- * proxy speciefied it throws SocksException with error code SOCKS_NO_PROXY.
- *
- * @param ip
- * Machine to connect to.
- * @param port
- * Port to which to connect.
- * @see SocksSocket#SocksSocket(SocksProxyBase,String,int)
- */
- public SocksSocket(InetAddress ip, int port) throws SocksException {
- this(SocksProxyBase.defaultProxy, ip, port);
- }
-
- /**
- * Connects to given ip and port using given Proxy server.
- *
- * @param p
- * Proxy to use.
- * @param ip
- * Machine to connect to.
- * @param port
- * Port to which to connect.
- */
- public SocksSocket(SocksProxyBase p, InetAddress ip, int port)
- throws SocksException {
- if (p == null) {
- throw new SocksException(SocksProxyBase.SOCKS_NO_PROXY);
- }
- this.proxy = p.copy();
- this.remoteIP = ip;
- this.remotePort = port;
- this.remoteHost = ip.getHostName();
- if (proxy.isDirect(remoteIP)) {
- doDirect();
- } else {
- processReply(proxy.connect(ip, port));
- }
- }
-
- /**
- * These 2 constructors are used by the SocksServerSocket. This socket
- * simply overrides remoteHost, remotePort
- */
- protected SocksSocket(String host, int port, SocksProxyBase proxy) {
- this.remotePort = port;
- this.proxy = proxy;
- this.localIP = proxy.proxySocket.getLocalAddress();
- this.localPort = proxy.proxySocket.getLocalPort();
- this.remoteHost = host;
- }
-
- protected SocksSocket(InetAddress ip, int port, SocksProxyBase proxy) {
- remoteIP = ip;
- remotePort = port;
- this.proxy = proxy;
- this.localIP = proxy.proxySocket.getLocalAddress();
- this.localPort = proxy.proxySocket.getLocalPort();
- remoteHost = remoteIP.getHostName();
- }
-
- /**
- * Same as Socket
- */
- public void close() throws IOException {
- if (proxy != null) {
- proxy.endSession();
- }
- proxy = null;
- }
-
- /**
- * Same as Socket
- */
- public InputStream getInputStream() {
- return proxy.in;
- }
-
- /**
- * Same as Socket
- */
- public OutputStream getOutputStream() {
- return proxy.out;
- }
-
- /**
- * Same as Socket
- */
- public int getPort() {
- return remotePort;
- }
-
- /**
- * Returns remote host name, it is usefull in cases when addresses are
- * resolved by proxy, and we can't create InetAddress object.
- *
- * @return The name of the host this socket is connected to.
- */
- public String getHost() {
- return remoteHost;
- }
-
- /**
- * Get remote host as InetAddress object, might return null if addresses are
- * resolved by proxy, and it is not possible to resolve it locally
- *
- * @return Ip address of the host this socket is connected to, or null if
- * address was returned by the proxy as DOMAINNAME and can't be
- * resolved locally.
- */
- public InetAddress getInetAddress() {
- if (remoteIP == null) {
- try {
- remoteIP = InetAddress.getByName(remoteHost);
- } catch (final UnknownHostException e) {
- return null;
- }
- }
- return remoteIP;
- }
-
- /**
- * Get the port assigned by the proxy for the socket, not the port on locall
- * machine as in Socket.
- *
- * @return Port of the socket used on the proxy server.
- */
- public int getLocalPort() {
- return localPort;
- }
-
- /**
- * Get address assigned by proxy to make a remote connection, it might be
- * different from the host specified for the proxy. Can return null if socks
- * server returned this address as hostname and it can't be resolved
- * locally, use getLocalHost() then.
- *
- * @return Address proxy is using to make a connection.
- */
- public InetAddress getLocalAddress() {
- if (localIP == null) {
- try {
- localIP = InetAddress.getByName(localHost);
- } catch (final UnknownHostException e) {
- return null;
- }
- }
- return localIP;
- }
-
- /**
- * Get name of the host, proxy has assigned to make a remote connection for
- * this socket. This method is usefull when proxy have returned address as
- * hostname, and we can't resolve it on this machine.
- *
- * @return The name of the host proxy is using to make a connection.
- */
- public String getLocalHost() {
- return localHost;
- }
-
- /**
- * Same as socket.
- */
- public void setSoLinger(boolean on, int val) throws SocketException {
- proxy.proxySocket.setSoLinger(on, val);
- }
-
- /**
- * Same as socket.
- */
- public int getSoLinger(int timeout) throws SocketException {
- return proxy.proxySocket.getSoLinger();
- }
-
- /**
- * Same as socket.
- */
- public void setSoTimeout(int timeout) throws SocketException {
- proxy.proxySocket.setSoTimeout(timeout);
- }
-
- /**
- * Same as socket.
- */
- public int getSoTimeout(int timeout) throws SocketException {
- return proxy.proxySocket.getSoTimeout();
- }
-
- /**
- * Same as socket.
- */
- public void setTcpNoDelay(boolean on) throws SocketException {
- proxy.proxySocket.setTcpNoDelay(on);
- }
-
- /**
- * Same as socket.
- */
- public boolean getTcpNoDelay() throws SocketException {
- return proxy.proxySocket.getTcpNoDelay();
- }
-
- /**
- * Get string representation of the socket.
- */
- public String toString() {
- if (directSock != null) {
- return "Direct connection:" + directSock;
- }
- StringBuffer sb = new StringBuffer();
- sb.append("Proxy:");
- sb.append(proxy);
- sb.append(";");
- sb.append("addr:");
- sb.append(remoteHost);
- sb.append(",port:");
- sb.append(remotePort);
- sb.append(",localport:");
- sb.append(localPort);
- return sb.toString();
-
- }
-
- // Private Methods
- // ////////////////
-
- private void processReply(ProxyMessage reply) throws SocksException {
- localPort = reply.port;
- /*
- * If the server have assigned same host as it was contacted on it might
- * return an address of all zeros
- */
- if (reply.host.equals("0.0.0.0")) {
- localIP = proxy.proxyIP;
- localHost = localIP.getHostName();
- } else {
- localHost = reply.host;
- localIP = reply.ip;
- }
- }
-
- private void doDirect() throws SocksException {
- try {
- //log.debug("IP: {}_{}", remoteIP, remotePort);
- directSock = new Socket(remoteIP, remotePort);
- proxy.out = directSock.getOutputStream();
- proxy.in = directSock.getInputStream();
- proxy.proxySocket = directSock;
- localIP = directSock.getLocalAddress();
- localPort = directSock.getLocalPort();
- } catch (final IOException io_ex) {
- final int errCode = SocksProxyBase.SOCKS_DIRECT_FAILED;
- throw new SocksException(errCode, "Direct connect failed:", io_ex);
- }
- }
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPEncapsulation.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPEncapsulation.java
deleted file mode 100644
index eaa46141..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPEncapsulation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-/**
- * This interface provides for datagram encapsulation for SOCKSv5 protocol.
- * <p>
- * SOCKSv5 allows for datagrams to be encapsulated for purposes of integrity
- * and/or authenticity. How it should be done is aggreed during the
- * authentication stage, and is authentication dependent. This interface is
- * provided to allow this encapsulation.
- *
- * @see Authentication
- */
-public interface UDPEncapsulation {
-
- /**
- * This method should provide any authentication depended transformation on
- * datagrams being send from/to the client.
- *
- * @param data
- * Datagram data (including any SOCKS related bytes), to be
- * encapsulated/decapsulated.
- * @param out
- * Wether the data is being send out. If true method should
- * encapsulate/encrypt data, otherwise it should decapsulate/
- * decrypt data.
- * @throw IOException if for some reason data can be transformed correctly.
- * @return Should return byte array containing data after transformation. It
- * is possible to return same array as input, if transformation only
- * involves bit mangling, and no additional data is being added or
- * removed.
- */
- byte[] udpEncapsulate(byte[] data, boolean out) throws java.io.IOException;
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPRelayServer.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPRelayServer.java
deleted file mode 100644
index 33ec4ed5..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UDPRelayServer.java
+++ /dev/null
@@ -1,227 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.DatagramPacket;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.UnknownHostException;
-
-import com.runjva.sourceforge.jsocks.server.ServerAuthenticator;
-
-/**
- * UDP Relay server, used by ProxyServer to perform udp forwarding.
- */
-class UDPRelayServer implements Runnable {
-
- DatagramSocket client_sock;
- DatagramSocket remote_sock;
-
- Socket controlConnection;
-
- int relayPort;
- InetAddress relayIP;
-
- Thread pipe_thread1, pipe_thread2;
- Thread master_thread;
-
- ServerAuthenticator auth;
-
- long lastReadTime;
-
- static SocksProxyBase proxy = null;
- static int datagramSize = 0xFFFF;// 64K, a bit more than max udp size
- static int iddleTimeout = 180000;// 3 minutes
-
- /**
- * Constructs UDP relay server to communicate with client on given ip and
- * port.
- *
- * @param clientIP
- * Address of the client from whom datagrams will be recieved and
- * to whom they will be forwarded.
- * @param clientPort
- * Clients port.
- * @param master_thread
- * Thread which will be interrupted, when UDP relay server
- * stoppes for some reason.
- * @param controlConnection
- * Socket which will be closed, before interrupting the master
- * thread, it is introduced due to a bug in windows JVM which
- * does not throw InterruptedIOException in threads which block
- * in I/O operation.
- */
- public UDPRelayServer(InetAddress clientIP, int clientPort,
- Thread master_thread, Socket controlConnection,
- ServerAuthenticator auth) throws IOException {
-
- this.master_thread = master_thread;
- this.controlConnection = controlConnection;
- this.auth = auth;
-
- client_sock = new Socks5DatagramSocket(true,
- auth.getUdpEncapsulation(), clientIP, clientPort);
-
- relayPort = client_sock.getLocalPort();
- relayIP = client_sock.getLocalAddress();
-
- if (relayIP.getHostAddress().equals("0.0.0.0")) {
- relayIP = InetAddress.getLocalHost();
- }
-
- if (proxy == null) {
- remote_sock = new DatagramSocket();
- } else {
- remote_sock = new Socks5DatagramSocket(proxy, 0, null);
- }
- }
-
- // Public methods
- // ///////////////
-
- /**
- * Sets the timeout for UDPRelay server.<br>
- * Zero timeout implies infinity.<br>
- * Default timeout is 3 minutes.
- */
-
- static public void setTimeout(int timeout) {
- iddleTimeout = timeout;
- }
-
- /**
- * Sets the size of the datagrams used in the UDPRelayServer.<br>
- * Default size is 64K, a bit more than maximum possible size of the
- * datagram.
- */
- static public void setDatagramSize(int size) {
- datagramSize = size;
- }
-
- /**
- * Port to which client should send datagram for association.
- */
- public int getRelayPort() {
- return relayPort;
- }
-
- /**
- * IP address to which client should send datagrams for association.
- */
- public InetAddress getRelayIP() {
- return relayIP;
- }
-
- /**
- * Starts udp relay server. Spawns two threads of execution and returns.
- */
- public void start() throws IOException {
- remote_sock.setSoTimeout(iddleTimeout);
- client_sock.setSoTimeout(iddleTimeout);
-
- //log.info("Starting UDP relay server on {}:{}", relayIP, relayPort);
- //log.info("Remote socket {}:{}", remote_sock.getLocalAddress(),
- // remote_sock.getLocalPort());
-
- pipe_thread1 = new Thread(this, "pipe1");
- pipe_thread2 = new Thread(this, "pipe2");
-
- lastReadTime = System.currentTimeMillis();
-
- pipe_thread1.start();
- pipe_thread2.start();
- }
-
- /**
- * Stops Relay server.
- * <p>
- * Does not close control connection, does not interrupt master_thread.
- */
- public synchronized void stop() {
- master_thread = null;
- controlConnection = null;
- abort();
- }
-
- // Runnable interface
- // //////////////////
- public void run() {
- try {
- if (Thread.currentThread().getName().equals("pipe1")) {
- pipe(remote_sock, client_sock, false);
- } else {
- pipe(client_sock, remote_sock, true);
- }
- } catch (final IOException ioe) {
- } finally {
- abort();
- //log.info("UDP Pipe thread " + Thread.currentThread().getName()
- // + " stopped.");
- }
-
- }
-
- // Private methods
- // ///////////////
- private synchronized void abort() {
- if (pipe_thread1 == null) {
- return;
- }
-
- //log.info("Aborting UDP Relay Server");
-
- remote_sock.close();
- client_sock.close();
-
- if (controlConnection != null) {
- try {
- controlConnection.close();
- } catch (final IOException ioe) {
- }
- }
-
- if (master_thread != null) {
- master_thread.interrupt();
- }
-
- pipe_thread1.interrupt();
- pipe_thread2.interrupt();
-
- pipe_thread1 = null;
- }
-
- private void pipe(DatagramSocket from, DatagramSocket to, boolean out)
- throws IOException {
- final byte[] data = new byte[datagramSize];
- final DatagramPacket dp = new DatagramPacket(data, data.length);
-
- while (true) {
- try {
- from.receive(dp);
- lastReadTime = System.currentTimeMillis();
-
- if (auth.checkRequest(dp, out)) {
- to.send(dp);
- }
-
- } catch (final UnknownHostException uhe) {
- //log.info("Dropping datagram for unknown host");
- } catch (final InterruptedIOException iioe) {
- // log("Interrupted: "+iioe);
- // If we were interrupted by other thread.
- if (iddleTimeout == 0) {
- return;
- }
-
- // If last datagram was received, long time ago, return.
- final long timeSinceRead = System.currentTimeMillis()
- - lastReadTime;
- if (timeSinceRead >= iddleTimeout - 100) {
- return;
- }
- }
- dp.setLength(data.length);
- }
- }
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UserPasswordAuthentication.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UserPasswordAuthentication.java
deleted file mode 100644
index 2d5e6001..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/protocol/UserPasswordAuthentication.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.runjva.sourceforge.jsocks.protocol;
-
-/**
- * SOCKS5 User Password authentication scheme.
- */
-public class UserPasswordAuthentication implements Authentication {
-
- /** SOCKS ID for User/Password authentication method */
- public final static int METHOD_ID = 2;
-
- String userName, password;
- byte[] request;
-
- /**
- * Create an instance of UserPasswordAuthentication.
- *
- * @param userName
- * User Name to send to SOCKS server.
- * @param password
- * Password to send to SOCKS server.
- */
- public UserPasswordAuthentication(String userName, String password) {
- this.userName = userName;
- this.password = password;
- formRequest();
- }
-
- /**
- * Get the user name.
- *
- * @return User name.
- */
- public String getUser() {
- return userName;
- }
-
- /**
- * Get password
- *
- * @return Password
- */
- public String getPassword() {
- return password;
- }
-
- /**
- * Does User/Password authentication as defined in rfc1929.
- *
- * @return An array containnig in, out streams, or null if authentication
- * fails.
- */
- public Object[] doSocksAuthentication(int methodId,
- java.net.Socket proxySocket) throws java.io.IOException {
-
- if (methodId != METHOD_ID) {
- return null;
- }
-
- final java.io.InputStream in = proxySocket.getInputStream();
- final java.io.OutputStream out = proxySocket.getOutputStream();
-
- out.write(request);
- final int version = in.read();
- if (version < 0) {
- return null; // Server closed connection
- }
- final int status = in.read();
- if (status != 0) {
- return null; // Server closed connection, or auth failed.
- }
-
- return new Object[] { in, out };
- }
-
- // Private methods
- // ////////////////
-
- /** Convert UserName password in to binary form, ready to be send to server */
- private void formRequest() {
- final byte[] user_bytes = userName.getBytes();
- final byte[] password_bytes = password.getBytes();
-
- request = new byte[3 + user_bytes.length + password_bytes.length];
- request[0] = (byte) 1;
- request[1] = (byte) user_bytes.length;
- System.arraycopy(user_bytes, 0, request, 2, user_bytes.length);
- request[2 + user_bytes.length] = (byte) password_bytes.length;
- System.arraycopy(password_bytes, 0, request, 3 + user_bytes.length,
- password_bytes.length);
- }
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/Ident.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/Ident.java
deleted file mode 100644
index f2b16829..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/Ident.java
+++ /dev/null
@@ -1,171 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.InterruptedIOException;
-import java.net.ConnectException;
-import java.net.Socket;
-import java.util.StringTokenizer;
-
-/**
- * Class Ident provides means to obtain user name of the owner of the socket on
- * remote machine, providing remote machine runs identd daemon.
- * <p>
- * To use it: <tt><pre>
- Socket s = ss.accept();
- Ident id = new Ident(s);
- if(id.successful) goUseUser(id.userName);
- else handleIdentError(id.errorCode,id.errorMessage)
- </pre></tt>
- */
-public class Ident {
-
- /** Error Message can be null. */
- public String errorMessage;
-
- /** Host type as returned by daemon, can be null, if error happened */
- public String hostType;
-
- /** User name as returned by the identd daemon, or null, if it failed */
- public String userName;
-
- /**
- * If this is true then userName and hostType contain valid values. Else
- * errorCode contain the error code, and errorMessage contains the
- * corresponding message.
- */
- public boolean successful;
-
- /** Error code */
- public int errorCode;
-
- /** Identd on port 113 can't be contacted */
- public static final int ERR_NO_CONNECT = 1;
-
- /** Connection timed out */
- public static final int ERR_TIMEOUT = 2;
-
- /**
- * Identd daemon responded with ERROR, in this case errorMessage contains
- * the string explanation, as send by the daemon.
- */
- public static final int ERR_PROTOCOL = 3;
-
- /**
- * When parsing server response protocol error happened.
- */
- public static final int ERR_PROTOCOL_INCORRECT = 4;
-
- /**
- * Maximum amount of time we should wait before dropping the connection to
- * identd server.Setting it to 0 implies infinit timeout.
- */
- public static final int connectionTimeout = 10000;
-
- /**
- * Constructor tries to connect to Identd daemon on the host of the given
- * socket, and retrieve user name of the owner of given socket connection on
- * remote machine. After constructor returns public fields are initialised
- * to whatever the server returned.
- * <p>
- * If user name was successfully retrieved successful is set to true, and
- * userName and hostType are set to whatever server returned. If however for
- * some reason user name was not obtained, successful is set to false and
- * errorCode contains the code explaining the reason of failure, and
- * errorMessage contains human readable explanation.
- * <p>
- * Constructor may block, for a while.
- *
- * @param s
- * Socket whose ownership on remote end should be obtained.
- */
- public Ident(Socket s) {
- Socket sock = null;
- successful = false; // We are pessimistic
-
- try {
- sock = new Socket(s.getInetAddress(), 113);
- sock.setSoTimeout(connectionTimeout);
- final byte[] request = ("" + s.getPort() + " , " + s.getLocalPort() + "\r\n")
- .getBytes();
-
- sock.getOutputStream().write(request);
-
- final BufferedReader in = new BufferedReader(new InputStreamReader(
- sock.getInputStream()));
-
- parseResponse(in.readLine());
-
- } catch (final InterruptedIOException iioe) {
- errorCode = ERR_TIMEOUT;
- errorMessage = "Connection to identd timed out.";
- } catch (final ConnectException ce) {
- errorCode = ERR_NO_CONNECT;
- errorMessage = "Connection to identd server failed.";
-
- } catch (final IOException ioe) {
- errorCode = ERR_NO_CONNECT;
- errorMessage = "" + ioe;
- } finally {
- try {
- if (sock != null) {
- sock.close();
- }
- } catch (final IOException ioe) {
- //log.warn("Could not close socket", ioe);
- }
- }
- }
-
- private void parseResponse(String response) {
- if (response == null) {
- errorCode = ERR_PROTOCOL_INCORRECT;
- errorMessage = "Identd server closed connection.";
- return;
- }
-
- final StringTokenizer st = new StringTokenizer(response, ":");
- if (st.countTokens() < 3) {
- errorCode = ERR_PROTOCOL_INCORRECT;
- errorMessage = "Can't parse server response.";
- return;
- }
-
- st.nextToken(); // Discard first token, it's basically what we have send
- final String command = st.nextToken().trim().toUpperCase();
-
- if (command.equals("USERID") && (st.countTokens() >= 2)) {
- successful = true;
- hostType = st.nextToken().trim();
- userName = st.nextToken("").substring(1);// Get all that is left
- } else if (command.equals("ERROR")) {
- errorCode = ERR_PROTOCOL;
- errorMessage = st.nextToken();
- } else {
- errorCode = ERR_PROTOCOL_INCORRECT;
- System.out.println("Opa!");
- errorMessage = "Can't parse server response.";
- }
-
- }
-
- // /////////////////////////////////////////////
- // USED for Testing
- /*
- * public static void main(String[] args) throws IOException{
- *
- * Socket s = null; s = new Socket("gp101-16", 1391);
- *
- * Ident id = new Ident(s); if(id.successful){
- * System.out.println("User: "+id.userName);
- * System.out.println("HostType: "+id.hostType); }else{
- * System.out.println("ErrorCode: "+id.errorCode);
- * System.out.println("ErrorMessage: "+id.errorMessage);
- *
- * }
- *
- * if(s!= null) s.close(); } //
- */
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/IdentAuthenticator.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/IdentAuthenticator.java
deleted file mode 100644
index 70e25936..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/IdentAuthenticator.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
-import com.runjva.sourceforge.jsocks.protocol.InetRange;
-import com.runjva.sourceforge.jsocks.protocol.ProxyMessage;
-
-/**
- * An implementation of socks.ServerAuthentication which provides simple
- * authentication based on the host from which the connection is made and the
- * name of the user on the remote machine, as reported by identd daemon on the
- * remote machine.
- * <p>
- * It can also be used to provide authentication based only on the contacting
- * host address.
- */
-
-public class IdentAuthenticator extends ServerAuthenticatorBase {
- /** Vector of InetRanges */
- Vector<InetRange> hosts;
-
- /** Vector of user hashes */
- Vector<Hashtable<?, ?>> users;
-
- String user;
-
- /**
- * Constructs empty IdentAuthenticator.
- */
- public IdentAuthenticator() {
- hosts = new Vector<InetRange>();
- users = new Vector<Hashtable<?, ?>>();
- }
-
- /**
- * Used to create instances returned from startSession.
- *
- * @param in
- * Input stream.
- * @param out
- * OutputStream.
- * @param user
- * Username associated with this connection,could be null if name
- * was not required.
- */
- IdentAuthenticator(InputStream in, OutputStream out, String user) {
- super(in, out);
- this.user = user;
- }
-
- /**
- * Adds range of addresses from which connection is allowed. Hashtable users
- * should contain user names as keys and anything as values (value is not
- * used and will be ignored).
- *
- * @param hostRange
- * Range of ip addresses from which connection is allowed.
- * @param users
- * Hashtable of users for whom connection is allowed, or null to
- * indicate that anybody is allowed to connect from the hosts
- * within given range.
- */
- public synchronized void add(InetRange hostRange, Hashtable<?, ?> users) {
- this.hosts.addElement(hostRange);
- this.users.addElement(users);
- }
-
- /**
- * Grants permission only to those users, who connect from one of the hosts
- * registered with add(InetRange,Hashtable) and whose names, as reported by
- * identd daemon, are listed for the host the connection came from.
- */
- public ServerAuthenticator startSession(Socket s) throws IOException {
-
- final int ind = getRangeIndex(s.getInetAddress());
- String user = null;
-
- // System.out.println("getRangeReturned:"+ind);
-
- if (ind < 0) {
- return null; // Host is not on the list.
- }
-
- final ServerAuthenticator serverAuthenticator = super.startSession(s);
- final ServerAuthenticatorBase auth = (ServerAuthenticatorBase) serverAuthenticator;
-
- // System.out.println("super.startSession() returned:"+auth);
- if (auth == null) {
- return null;
- }
-
- // do the authentication
-
- final Hashtable<?, ?> user_names = users.elementAt(ind);
-
- if (user_names != null) { // If need to do authentication
- Ident ident;
- ident = new Ident(s);
- // If can't obtain user name, fail
- if (!ident.successful) {
- return null;
- }
- // If user name is not listed for this address, fail
- if (!user_names.containsKey(ident.userName)) {
- return null;
- }
- user = ident.userName;
- }
- return new IdentAuthenticator(auth.in, auth.out, user);
-
- }
-
- /**
- * For SOCKS5 requests allways returns true. For SOCKS4 requests checks
- * wether the user name supplied in the request corresponds to the name
- * obtained from the ident daemon.
- */
- public boolean checkRequest(ProxyMessage msg, java.net.Socket s) {
- // If it's version 5 request, or if anybody is permitted, return true;
- if ((msg.version == 5) || (user == null)) {
- return true;
- }
-
- if (msg.version != 4) {
- return false; // Who knows?
- }
-
- return user.equals(msg.user);
- }
-
- /** Get String representaion of the IdentAuthenticator. */
- public String toString() {
- String s = "";
-
- for (int i = 0; i < hosts.size(); ++i) {
- s += "(Range:" + hosts.elementAt(i) + "," + //
- " Users:" + userNames(i) + ") ";
- }
- return s;
- }
-
- // Private Methods
- // ////////////////
- private int getRangeIndex(InetAddress ip) {
- int index = 0;
- final Enumeration<InetRange> enumx = hosts.elements();
- while (enumx.hasMoreElements()) {
- final InetRange ir = enumx.nextElement();
- if (ir.contains(ip)) {
- return index;
- }
- index++;
- }
- return -1; // Not found
- }
-
- private String userNames(int i) {
- if (users.elementAt(i) == null) {
- return "Everybody is permitted.";
- }
-
- final Enumeration<?> enumx = ((Hashtable<?, ?>) users.elementAt(i))
- .keys();
- if (!enumx.hasMoreElements()) {
- return "";
- }
- String s = enumx.nextElement().toString();
- while (enumx.hasMoreElements()) {
- s += "; " + enumx.nextElement();
- }
-
- return s;
- }
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticator.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticator.java
deleted file mode 100644
index 3014a92d..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticator.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.DatagramPacket;
-import java.net.Socket;
-
-import com.runjva.sourceforge.jsocks.protocol.ProxyMessage;
-import com.runjva.sourceforge.jsocks.protocol.UDPEncapsulation;
-
-/**
- * Classes implementing this interface should provide socks server with
- * authentication and authorization of users.
- **/
-public interface ServerAuthenticator {
-
- /**
- * This method is called when a new connection accepted by the server.
- * <p>
- * At this point no data have been extracted from the connection. It is
- * responsibility of this method to ensure that the next byte in the stream
- * after this method have been called is the first byte of the socks request
- * message. For SOCKSv4 there is no authentication data and the first byte
- * in the stream is part of the request. With SOCKSv5 however there is an
- * authentication data first. It is expected that implementaions will
- * process this authentication data.
- * <p>
- * If authentication was successful an instance of ServerAuthentication
- * should be returned, it later will be used by the server to perform
- * authorization and some other things. If authentication fails null should
- * be returned, or an exception may be thrown.
- *
- * @param s
- * Accepted Socket.
- * @return An instance of ServerAuthenticator to be used for this connection
- * or null
- */
- ServerAuthenticator startSession(Socket s) throws IOException;
-
- /**
- * This method should return input stream which should be used on the
- * accepted socket.
- * <p>
- * SOCKSv5 allows to have multiple authentication methods, and these methods
- * might require some kind of transformations being made on the data.
- * <p>
- * This method is called on the object returned from the startSession
- * function.
- */
- InputStream getInputStream();
-
- /**
- * This method should return output stream to use to write to the accepted
- * socket.
- * <p>
- * SOCKSv5 allows to have multiple authentication methods, and these methods
- * might require some kind of transformations being made on the data.
- * <p>
- * This method is called on the object returned from the startSession
- * function.
- */
- OutputStream getOutputStream();
-
- /**
- * This method should return UDPEncapsulation, which should be used on the
- * datagrams being send in/out.
- * <p>
- * If no transformation should be done on the datagrams, this method should
- * return null.
- * <p>
- * This method is called on the object returned from the startSession
- * function.
- */
-
- UDPEncapsulation getUdpEncapsulation();
-
- /**
- * This method is called when a request have been read.
- * <p>
- * Implementation should decide wether to grant request or not. Returning
- * true implies granting the request, false means request should be
- * rejected.
- * <p>
- * This method is called on the object returned from the startSession
- * function.
- *
- * @param msg
- * Request message.
- * @return true to grant request, false to reject it.
- */
- boolean checkRequest(ProxyMessage msg);
-
- /**
- * This method is called when datagram is received by the server.
- * <p>
- * Implementaions should decide wether it should be forwarded or dropped. It
- * is expecteed that implementation will use datagram address and port
- * information to make a decision, as well as anything else. Address and
- * port of the datagram are always correspond to remote machine. It is
- * either destination or source address. If out is true address is
- * destination address, else it is a source address, address of the machine
- * from which datagram have been received for the client.
- * <p>
- * Implementaions should return true if the datagram is to be forwarded, and
- * false if the datagram should be dropped.
- * <p>
- * This method is called on the object returned from the startSession
- * function.
- *
- * @param out
- * If true the datagram is being send out(from the client),
- * otherwise it is an incoming datagram.
- * @return True to forward datagram false drop it silently.
- */
- boolean checkRequest(DatagramPacket dp, boolean out);
-
- /**
- * This method is called when session is completed. Either due to normal
- * termination or due to any error condition.
- * <p>
- * This method is called on the object returned from the startSession
- * function.
- */
- void endSession();
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorBase.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorBase.java
deleted file mode 100644
index 79acd582..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorBase.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PushbackInputStream;
-import java.net.Socket;
-
-import com.runjva.sourceforge.jsocks.protocol.ProxyMessage;
-import com.runjva.sourceforge.jsocks.protocol.UDPEncapsulation;
-
-/**
- * An implementation of ServerAuthenticator, which does <b>not</b> do any
- * authentication.
- * <P>
- * <FONT size="+3" color ="FF0000"> Warning!!</font><br>
- * Should not be used on machines which are not behind the firewall.
- * <p>
- * It is only provided to make implementing other authentication schemes easier.
- * <br>
- * For Example: <tt><pre>
- class MyAuth extends socks.server.ServerAuthenticator{
- ...
- public ServerAuthenticator startSession(java.net.Socket s){
- if(!checkHost(s.getInetAddress()) return null;
- return super.startSession(s);
- }
-
- boolean checkHost(java.net.Inetaddress addr){
- boolean allow;
- //Do it somehow
- return allow;
- }
- }
-</pre></tt>
- */
-public abstract class ServerAuthenticatorBase implements ServerAuthenticator {
-
- static final byte[] socks5response = { 5, 0 };
-
- InputStream in;
- OutputStream out;
-
- /**
- * Creates new instance of the ServerAuthenticatorNone.
- */
- public ServerAuthenticatorBase() {
- this.in = null;
- this.out = null;
- }
-
- /**
- * Constructs new ServerAuthenticatorNone object suitable for returning from
- * the startSession function.
- *
- * @param in
- * Input stream to return from getInputStream method.
- * @param out
- * Output stream to return from getOutputStream method.
- */
- public ServerAuthenticatorBase(InputStream in, OutputStream out) {
- this.in = in;
- this.out = out;
- }
-
- /**
- * Grants access to everyone.Removes authentication related bytes from the
- * stream, when a SOCKS5 connection is being made, selects an authentication
- * NONE.
- */
- public ServerAuthenticator startSession(Socket s) throws IOException {
-
- final PushbackInputStream in = new PushbackInputStream(s
- .getInputStream());
- final OutputStream out = s.getOutputStream();
-
- final int version = in.read();
- if (version == 5) {
- if (!selectSocks5Authentication(in, out, 0)) {
- return null;
- }
- } else if (version == 4) {
- // Else it is the request message already, version 4
- in.unread(version);
- } else {
- return null;
- }
-
- return new ServerAuthenticatorNone(in, out);
- }
-
- /**
- * Get input stream.
- *
- * @return Input stream speciefied in the constructor.
- */
- public InputStream getInputStream() {
- return in;
- }
-
- /**
- * Get output stream.
- *
- * @return Output stream speciefied in the constructor.
- */
- public OutputStream getOutputStream() {
- return out;
- }
-
- /**
- * Allways returns null.
- *
- * @return null
- */
- public UDPEncapsulation getUdpEncapsulation() {
- return null;
- }
-
- /**
- * Allways returns true.
- */
- public boolean checkRequest(ProxyMessage msg) {
- return true;
- }
-
- /**
- * Allways returns true.
- */
- public boolean checkRequest(java.net.DatagramPacket dp, boolean out) {
- return true;
- }
-
- /**
- * Does nothing.
- */
- public void endSession() {
- }
-
- /**
- * Convinience routine for selecting SOCKSv5 authentication.
- * <p>
- * This method reads in authentication methods that client supports, checks
- * wether it supports given method. If it does, the notification method is
- * written back to client, that this method have been chosen for
- * authentication. If given method was not found, authentication failure
- * message is send to client ([5,FF]).
- *
- * @param in
- * Input stream, version byte should be removed from the stream
- * before calling this method.
- * @param out
- * Output stream.
- * @param methodId
- * Method which should be selected.
- * @return true if methodId was found, false otherwise.
- */
- static public boolean selectSocks5Authentication(InputStream in,
- OutputStream out, int methodId) throws IOException {
-
- final int num_methods = in.read();
- if (num_methods <= 0) {
- return false;
- }
- final byte method_ids[] = new byte[num_methods];
- final byte response[] = new byte[2];
- boolean found = false;
-
- response[0] = (byte) 5; // SOCKS version
- response[1] = (byte) 0xFF; // Not found, we are pessimistic
-
- int bread = 0; // bytes read so far
- while (bread < num_methods) {
- bread += in.read(method_ids, bread, num_methods - bread);
- }
-
- for (int i = 0; i < num_methods; ++i) {
- if (method_ids[i] == methodId) {
- found = true;
- response[1] = (byte) methodId;
- break;
- }
- }
-
- out.write(response);
- return found;
- }
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorNone.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorNone.java
deleted file mode 100644
index 0e976773..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/ServerAuthenticatorNone.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * Simplest possible ServerAuthenticator implementation. Extends common base.
- *
- */
-public class ServerAuthenticatorNone extends ServerAuthenticatorBase {
-
- public ServerAuthenticatorNone(InputStream in, OutputStream out) {
- super(in, out);
- }
-
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserPasswordAuthenticator.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserPasswordAuthenticator.java
deleted file mode 100644
index 82980f29..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserPasswordAuthenticator.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.Socket;
-
-/**
- * This class implements SOCKS5 User/Password authentication scheme as defined
- * in rfc1929,the server side of it. (see docs/rfc1929.txt)
- */
-public class UserPasswordAuthenticator extends ServerAuthenticatorBase {
-
- static final int METHOD_ID = 2;
-
- UserValidation validator;
-
- /**
- * Construct a new UserPasswordAuthentication object, with given
- * UserVlaidation scheme.
- *
- * @param v
- * UserValidation to use for validating users.
- */
- public UserPasswordAuthenticator(UserValidation validator) {
- this.validator = validator;
- }
-
- public ServerAuthenticator startSession(Socket s) throws IOException {
- final InputStream in = s.getInputStream();
- final OutputStream out = s.getOutputStream();
-
- if (in.read() != 5) {
- return null; // Drop non version 5 messages.
- }
-
- if (!selectSocks5Authentication(in, out, METHOD_ID)) {
- return null;
- }
- if (!doUserPasswordAuthentication(s, in, out)) {
- return null;
- }
-
- return new ServerAuthenticatorNone(in, out);
- }
-
- // Private Methods
- // ////////////////
-
- private boolean doUserPasswordAuthentication(Socket s, InputStream in,
- OutputStream out) throws IOException {
- final int version = in.read();
- if (version != 1) {
- return false;
- }
-
- final int ulen = in.read();
- if (ulen < 0) {
- return false;
- }
-
- final byte[] user = new byte[ulen];
- in.read(user);
- final int plen = in.read();
- if (plen < 0) {
- return false;
- }
- final byte[] password = new byte[plen];
- in.read(password);
-
- if (validator.isUserValid(new String(user), new String(password), s)) {
- // System.out.println("user valid");
- out.write(new byte[] { 1, 0 });
- } else {
- // System.out.println("user invalid");
- out.write(new byte[] { 1, 1 });
- return false;
- }
-
- return true;
- }
-}
diff --git a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserValidation.java b/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserValidation.java
deleted file mode 100644
index c4f77703..00000000
--- a/jsocksAndroid/src/main/java/com/runjva/sourceforge/jsocks/server/UserValidation.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.runjva.sourceforge.jsocks.server;
-
-/**
- * Interface which provides for user validation, based on user name password and
- * where it connects from.
- */
-public interface UserValidation {
- /**
- * Implementations of this interface are expected to use some or all of the
- * information provided plus any information they can extract from other
- * sources to decide wether given user should be allowed access to SOCKS
- * server, or whatever you use it for.
- *
- * @return true to indicate user is valid, false otherwise.
- * @param username
- * User whom implementation should validate.
- * @param password
- * Password this user provided.
- * @param connection
- * Socket which user used to connect to the server.
- */
- boolean isUserValid(String username, String password,
- java.net.Socket connection);
-}
diff --git a/orbotservice/build.gradle b/orbotservice/build.gradle
index 7160e29d..c416f6e9 100644
--- a/orbotservice/build.gradle
+++ b/orbotservice/build.gradle
@@ -27,8 +27,12 @@ android {
}
dependencies {
- implementation project(':jsocksAndroid')
+ // implementation project(':jsocksAndroid')
implementation 'org.torproject:tor-android-binary:0.4.0.4-rc'
+ implementation 'info.pluggabletransports.aptds:apt-dispatch-library:1.0.6'
+ implementation 'info.pluggabletransports.aptds:apt-meek-obfs4-legacy:1.0.6'
+ implementation 'info.pluggabletransports.aptds:jsocksAndroid:1.0.4'
+
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.jaredrummler:android-shell:1.0.0'
implementation fileTree(dir: 'libs', include: ['.so'])
diff --git a/orbotservice/src/main/java/org/torproject/android/service/TorService.java b/orbotservice/src/main/java/org/torproject/android/service/TorService.java
index 2561a132..4517a106 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/TorService.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/TorService.java
@@ -44,7 +44,6 @@ import org.torproject.android.control.TorControlConnection;
import org.torproject.android.service.util.CustomShell;
import org.torproject.android.service.util.CustomTorResourceInstaller;
import org.torproject.android.service.util.DummyActivity;
-import org.torproject.android.service.vpn.PDNSDInstaller;
import org.torproject.android.service.util.Prefs;
import org.torproject.android.service.util.TorServiceUtils;
import org.torproject.android.service.util.Utils;
@@ -76,6 +75,9 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeoutException;
+import info.pluggabletransports.dispatch.util.TransportListener;
+import info.pluggabletransports.dispatch.util.TransportManager;
+
public class TorService extends Service implements TorServiceConstants, OrbotConstants
{
@@ -516,8 +518,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if (!appCacheHome.exists())
appCacheHome.mkdirs();
- fileTor= new File(appBinHome, TorServiceConstants.TOR_ASSET_KEY);
- fileObfsclient = new File(appBinHome, TorServiceConstants.OBFSCLIENT_ASSET_KEY);
fileTorRc = new File(appBinHome, TorServiceConstants.TORRC_ASSET_KEY);
fileControlPort = new File(getFilesDir(), "control.txt");
@@ -549,6 +549,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
torUpgradeAndConfig();
+ pluggableTransportInstall();
+
new Thread(new Runnable ()
{
public void run ()
@@ -582,6 +584,27 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
return mCurrentStatus;
}
+ private boolean pluggableTransportInstall () {
+
+ fileObfsclient = new TransportManager() {
+ @Override
+ public void startTransportSync(TransportListener transportListener) {
+ }
+ }.installTransport(this, OBFSCLIENT_ASSET_KEY);
+
+ if (fileObfsclient != null && fileObfsclient.exists()) {
+
+ fileObfsclient.setReadable(true);
+ fileObfsclient.setExecutable(true);
+ fileObfsclient.setWritable(false);
+ fileObfsclient.setWritable(true, true);
+
+ return fileObfsclient.canExecute();
+ }
+
+ return false;
+ }
+
private boolean torUpgradeAndConfig() throws IOException, TimeoutException {
if (isTorUpgradeAndConfigComplete)
return true;
@@ -609,6 +632,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
+
+
return false;
}
@@ -1534,8 +1559,9 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
else
{
-
- if (fileObfsclient.exists() && fileObfsclient.canExecute()) {
+ if (fileObfsclient != null
+ && fileObfsclient.exists()
+ && fileObfsclient.canExecute()) {
loadBridgeDefaults();
diff --git a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
index b5f294f4..2db02389 100644
--- a/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
+++ b/orbotservice/src/main/java/org/torproject/android/service/vpn/OrbotVpnManager.java
@@ -341,7 +341,7 @@ public class OrbotVpnManager implements Handler.Callback {
}
mInterface = newInterface;
-
+
isRestart = false;
//start PDNSD daemon pointing to actual DNS
diff --git a/settings.gradle b/settings.gradle
index 9984a03e..c72325d7 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1 @@
-include ':jsocksAndroid', ':orbotservice'
-include ':app'
+include ':orbotservice',':app'
1
0