diff --git a/README.md b/README.md index 68218a5..e26215b 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Lock device and wipe data on panic trigger. -The app will listen for broadcast message with authentication code. On receive, using +You can use PanicKit or send broadcast message with authentication code. On trigger, using [Device Administration API](https://developer.android.com/guide/topics/admin/device-admin), it locks device and runs wipe. diff --git a/SECURITY.md b/SECURITY.md index b44be9b..1dc2545 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,8 +4,8 @@ | Version | Supported | | ------- | ------------------ | -| 1.0.x | :white_check_mark: | -| < 1.0 | :x: | +| 1.1.x | :white_check_mark: | +| < 1.1 | :x: | ## Reporting a Vulnerability diff --git a/app/build.gradle b/app/build.gradle index bd643e7..35110ee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,10 +8,10 @@ android { defaultConfig { applicationId "me.lucky.wasted" - minSdk 25 + minSdk 23 targetSdk 31 - versionCode 6 - versionName "1.0.5" + versionCode 7 + versionName "1.1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -45,4 +45,5 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' implementation 'androidx.security:security-crypto:1.0.0' + implementation 'info.guardianproject.panic:panic:1.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6c01825..9a60b72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,24 +4,24 @@ package="me.lucky.wasted"> + - - + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/app/src/main/java/me/lucky/wasted/MainActivity.kt b/app/src/main/java/me/lucky/wasted/MainActivity.kt index bfc3f59..5023dbe 100644 --- a/app/src/main/java/me/lucky/wasted/MainActivity.kt +++ b/app/src/main/java/me/lucky/wasted/MainActivity.kt @@ -1,7 +1,6 @@ package me.lucky.wasted import android.app.admin.DevicePolicyManager -import android.app.Activity import android.content.ComponentName import android.content.Context import android.content.Intent @@ -15,7 +14,7 @@ import java.util.* import me.lucky.wasted.databinding.ActivityMainBinding -class MainActivity : AppCompatActivity() { +open class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private val prefs by lazy { Preferences(this) } @@ -26,7 +25,7 @@ class MainActivity : AppCompatActivity() { private val requestAdminPolicy = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> when (result.resultCode) { - Activity.RESULT_OK -> setOn() + RESULT_OK -> setOn() else -> binding.toggle.isChecked = false } } diff --git a/app/src/main/java/me/lucky/wasted/PanicConnectionActivity.kt b/app/src/main/java/me/lucky/wasted/PanicConnectionActivity.kt new file mode 100644 index 0000000..94f8f6c --- /dev/null +++ b/app/src/main/java/me/lucky/wasted/PanicConnectionActivity.kt @@ -0,0 +1,50 @@ +package me.lucky.wasted + +import android.content.pm.PackageManager +import android.os.Bundle + +import androidx.appcompat.app.AlertDialog + +import info.guardianproject.panic.PanicResponder + +class PanicConnectionActivity : MainActivity() { + + private val pm by lazy { packageManager } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (PanicResponder.checkForDisconnectIntent(this)) { + finish() + return + } + val sender = PanicResponder.getConnectIntentSender(this) + val packageName = PanicResponder.getTriggerPackageName(this) + if (sender != "" && sender != packageName) { + showOptInDialog() + } + } + + private fun showOptInDialog() { + var app: CharSequence = getString(R.string.panic_app_unknown_app) + val packageName = callingActivity?.packageName + if (packageName != null) { + try { + app = pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0)) + } catch (exc: PackageManager.NameNotFoundException) {} + } + + AlertDialog.Builder(this).apply { + setTitle(getString(R.string.panic_app_dialog_title)) + setMessage(String.format(getString(R.string.panic_app_dialog_message), app)) + setNegativeButton(R.string.allow) { _, _ -> + PanicResponder.setTriggerPackageName(this@PanicConnectionActivity) + setResult(RESULT_OK) + } + setPositiveButton(R.string.cancel) { _, _ -> + setResult(RESULT_CANCELED) + finish() + } + show() + } + } +} diff --git a/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt b/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt new file mode 100644 index 0000000..4962d88 --- /dev/null +++ b/app/src/main/java/me/lucky/wasted/PanicResponderActivity.kt @@ -0,0 +1,30 @@ +package me.lucky.wasted + +import android.app.admin.DevicePolicyManager +import android.content.Context +import android.os.Bundle + +import androidx.appcompat.app.AppCompatActivity + +import info.guardianproject.panic.Panic +import info.guardianproject.panic.PanicResponder + +class PanicResponderActivity : AppCompatActivity() { + private val prefs by lazy { Preferences(this) } + private val dpm by lazy { + getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (!Panic.isTriggerIntent(intent) || !prefs.isServiceEnabled) { + finish() + return + } + try { + dpm.lockNow() + if (PanicResponder.receivedTriggerFromConnectedApp(this) && + prefs.doWipe) dpm.wipeData(0) + } catch (exc: SecurityException) {} + finish() + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 60f7e2e..99bc4b0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,8 +1,13 @@ Wasted - Turn on Wasted to lock device on panic trigger. The app will listen for broadcast message with this authentication code. + Turn on Wasted to lock device on panic trigger. You can use PanicKit or send broadcast message with this authentication code. Wasted Allow Wasted to lock device and wipe data on panic trigger Admin service unavailable Wipe data + Confirm Panic App + Are you sure that you want to allow %1$s to trigger destructive panic actions? + an unknown app + Allow + Cancel diff --git a/fastlane/metadata/android/en-US/changelogs/7.txt b/fastlane/metadata/android/en-US/changelogs/7.txt index e69de29..24d42a7 100644 --- a/fastlane/metadata/android/en-US/changelogs/7.txt +++ b/fastlane/metadata/android/en-US/changelogs/7.txt @@ -0,0 +1 @@ +add PanicKit diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index e4d6f52..a980eee 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,4 +1,4 @@ Lock device and wipe data on panic trigger. -The app will listen for broadcast message with authentication code. -On receive, using Device Administration API, it locks device and runs wipe. +You can use PanicKit or send broadcast message with authentication code. +On trigger, using Device Administration API, it locks device and runs wipe. diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png index c2797de..ea8b0e6 100644 Binary files a/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png and b/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png differ