From 47a965e6c0a18844cbe3894352e49605d3a42d8d Mon Sep 17 00:00:00 2001 From: BinTianqi Date: Sun, 8 Sep 2024 09:00:04 +0800 Subject: [PATCH] Improve security of automation (#73) Require length of automation key at least 20 Random automation key generation --- .../bintianqi/owndroid/AutomationReceiver.kt | 3 -- .../java/com/bintianqi/owndroid/Setting.kt | 43 ++++++++++++++++--- app/src/main/res/drawable/casino_fill0.xml | 9 ++++ 3 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable/casino_fill0.xml diff --git a/app/src/main/java/com/bintianqi/owndroid/AutomationReceiver.kt b/app/src/main/java/com/bintianqi/owndroid/AutomationReceiver.kt index 036d8b5..77549ff 100644 --- a/app/src/main/java/com/bintianqi/owndroid/AutomationReceiver.kt +++ b/app/src/main/java/com/bintianqi/owndroid/AutomationReceiver.kt @@ -17,9 +17,6 @@ class AutomationReceiver: BroadcastReceiver() { fun handleTask(context: Context, intent: Intent): String { val sharedPrefs = context.getSharedPreferences("data", Context.MODE_PRIVATE) val key = sharedPrefs.getString("automation_key", "") ?: "" - if(key.length < 6) { - return "Key length must longer than 6" - } if(key != intent.getStringExtra("key")) { return "Wrong key" } diff --git a/app/src/main/java/com/bintianqi/owndroid/Setting.kt b/app/src/main/java/com/bintianqi/owndroid/Setting.kt index b016648..aa7a981 100644 --- a/app/src/main/java/com/bintianqi/owndroid/Setting.kt +++ b/app/src/main/java/com/bintianqi/owndroid/Setting.kt @@ -4,19 +4,32 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build.VERSION +import android.util.Base64 import android.widget.Toast import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme.typography +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextField -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController @@ -24,7 +37,11 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import com.bintianqi.owndroid.ui.* +import com.bintianqi.owndroid.ui.Animations +import com.bintianqi.owndroid.ui.SubPageItem +import com.bintianqi.owndroid.ui.SwitchItem +import com.bintianqi.owndroid.ui.TopBar +import java.security.SecureRandom @Composable fun AppSetting(navCtrl:NavHostController, materialYou: MutableState, blackTheme: MutableState) { @@ -144,16 +161,28 @@ private fun Automation() { Text(text = stringResource(R.string.automation_api), style = typography.headlineLarge) Spacer(Modifier.padding(vertical = 5.dp)) var key by remember { mutableStateOf("") } - TextField( + OutlinedTextField( value = key, onValueChange = { key = it }, label = { Text("Key")}, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), + trailingIcon = { + IconButton( + onClick = { + val charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + val sr = SecureRandom() + key = (1..20).map { charset[sr.nextInt(charset.length)] }.joinToString("") + } + ) { + Icon(painter = painterResource(R.drawable.casino_fill0), contentDescription = "Random") + } + } ) Button( modifier = Modifier.fillMaxWidth(), onClick = { sharedPref.edit().putString("automation_key", key).apply() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() - } + }, + enabled = key.length >= 20 ) { Text(stringResource(R.string.apply)) } diff --git a/app/src/main/res/drawable/casino_fill0.xml b/app/src/main/res/drawable/casino_fill0.xml new file mode 100644 index 0000000..4d4cea1 --- /dev/null +++ b/app/src/main/res/drawable/casino_fill0.xml @@ -0,0 +1,9 @@ + + +