Skip to content

Commit 2c5b094

Browse files
Added service to detect and block tor apps.
1 parent f0136f7 commit 2c5b094

File tree

7 files changed

+78
-7
lines changed

7 files changed

+78
-7
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ android {
1111
applicationId = "com.cgprograms.dnslock"
1212
minSdk = 29
1313
targetSdk = 34
14-
versionCode = 5
15-
versionName = "3.1.0"
14+
versionCode = 6
15+
versionName = "4.0.0"
1616

1717
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
1818
vectorDrawables {
23 Bytes
Binary file not shown.
25 Bytes
Binary file not shown.

app/release/output-metadata.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
"type": "SINGLE",
1212
"filters": [],
1313
"attributes": [],
14-
"versionCode": 5,
15-
"versionName": "3.1.0",
14+
"versionCode": 6,
15+
"versionName": "4.0.0",
1616
"outputFile": "app-release.apk"
1717
}
1818
],

app/src/main/AndroidManifest.xml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" />
1010
<uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" />
1111
<uses-permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS" />
12+
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
1213

1314
<application
1415
android:allowBackup="true"
@@ -24,8 +25,8 @@
2425
<service
2526
android:name=".WifiTileService"
2627
android:exported="true"
27-
android:label="Wi-Fi Toggle"
2828
android:icon="@drawable/baseline_wifi_24"
29+
android:label="Wi-Fi Toggle"
2930
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
3031
<intent-filter>
3132
<action android:name="android.service.quicksettings.action.QS_TILE" />
@@ -38,13 +39,13 @@
3839
<intent-filter>
3940
<action android:name="android.intent.action.MAIN" />
4041
<category android:name="android.intent.category.LAUNCHER" />
41-
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES"/>
42+
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
4243
</intent-filter>
4344
</activity>
4445

4546
<receiver
4647
android:name=".MyDeviceAdminReceiver"
47-
android:exported="true"
48+
android:exported="false"
4849
android:permission="android.permission.BIND_DEVICE_ADMIN">
4950
<meta-data
5051
android:name="android.app.device_admin"
@@ -54,6 +55,10 @@
5455
</intent-filter>
5556
</receiver>
5657

58+
<service
59+
android:name=".TorMonitorService"
60+
android:exported="false" />
61+
5762
</application>
5863

5964
</manifest>

app/src/main/java/com/cgprograms/dnslock/MyDeviceAdminReceiver.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.content.Context
77
import android.content.Intent
88
import android.os.UserManager
99

10+
1011
class MyDeviceAdminReceiver : DeviceAdminReceiver() {
1112
override fun onEnabled(context: Context, intent: Intent) {
1213
super.onEnabled(context, intent)
@@ -16,6 +17,8 @@ class MyDeviceAdminReceiver : DeviceAdminReceiver() {
1617

1718
dpm.addUserRestriction(adminComponent, UserManager.DISALLOW_CONFIG_PRIVATE_DNS)
1819
dpm.addUserRestriction(adminComponent, UserManager.DISALLOW_CONFIG_WIFI)
20+
21+
context.startService(Intent(context, TorMonitorService::class.java))
1922
}
2023

2124
override fun onDisabled(context: Context, intent: Intent) {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.cgprograms.dnslock
2+
3+
import android.app.Service
4+
import android.app.admin.DevicePolicyManager
5+
import android.app.usage.UsageEvents
6+
import android.app.usage.UsageStatsManager
7+
import android.content.ComponentName
8+
import android.content.Context
9+
import android.content.Intent
10+
import android.os.Handler
11+
import android.os.IBinder
12+
import android.os.Looper
13+
14+
class TorMonitorService : Service() {
15+
16+
private val handler = Handler(Looper.getMainLooper())
17+
private val checkInterval: Long = 60000
18+
19+
private val checkTorRunnable = object : Runnable {
20+
override fun run() {
21+
checkTorUsage()
22+
handler.postDelayed(this, checkInterval)
23+
}
24+
}
25+
26+
override fun onCreate() {
27+
super.onCreate()
28+
handler.post(checkTorRunnable)
29+
}
30+
31+
override fun onDestroy() {
32+
super.onDestroy()
33+
handler.removeCallbacks(checkTorRunnable)
34+
}
35+
36+
override fun onBind(intent: Intent?): IBinder? {
37+
return null
38+
}
39+
40+
private fun checkTorUsage() {
41+
val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
42+
val currentTime = System.currentTimeMillis()
43+
val usageEvents = usageStatsManager.queryEvents(currentTime - checkInterval, currentTime)
44+
45+
while (usageEvents.hasNextEvent()) {
46+
val event = UsageEvents.Event()
47+
usageEvents.getNextEvent(event)
48+
49+
if (event.eventType == UsageEvents.Event.ACTIVITY_RESUMED) {
50+
val packageName = event.packageName
51+
if (packageName.contains("torproject") || packageName.contains("torbrowser")) {
52+
val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
53+
val adminComponent = ComponentName(this, MyDeviceAdminReceiver::class.java)
54+
55+
dpm.setUninstallBlocked(adminComponent, packageName, true)
56+
dpm.setPackagesSuspended(
57+
adminComponent, arrayOf<String>(packageName), true
58+
)
59+
}
60+
}
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)