add missing commands

This commit is contained in:
Michele Balistreri 2019-11-22 16:39:35 +03:00
parent eabb16ecc5
commit 84fb20bab9
No known key found for this signature in database
GPG Key ID: E9567DA33A4F791A
20 changed files with 322 additions and 19 deletions

View File

@ -17,6 +17,8 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ui.ChangePairingPasswordActivity"></activity>
<activity android:name=".ui.ChangePUKActivity" />
<activity android:name=".ui.ShowMnemonicActivity" />
<activity android:name=".ui.LoadKeyActivity" />
<activity android:name=".ui.SignTransactionActivity" />

View File

@ -1,8 +1,6 @@
package im.status.keycard.connect.card
import im.status.keycard.connect.Registry
import java.io.IOException
import java.lang.Exception
class ChangePINCommand(private val newPIN: String) : CardCommand {
//TODO: like for the PINCache, no strings should be used here

View File

@ -0,0 +1,14 @@
package im.status.keycard.connect.card
import im.status.keycard.connect.Registry
import java.io.IOException
import java.lang.Exception
class ChangePUKCommand(private val newPUK: String) : CardCommand {
//TODO: like for the PINCache, no strings should be used here
override fun run(context: CardScriptExecutor.ScriptContext): CardCommand.Result {
return runOnCard {
context.cmdSet.changePUK(newPUK).checkOK()
}
}
}

View File

@ -0,0 +1,9 @@
package im.status.keycard.connect.card
class ChangePairingPasswordCommand(private val pairingPassword: String) : CardCommand {
override fun run(context: CardScriptExecutor.ScriptContext): CardCommand.Result {
return runOnCard {
context.cmdSet.changePairingPassword(pairingPassword).checkOK()
}
}
}

View File

@ -4,8 +4,6 @@ import im.status.keycard.applet.BIP32KeyPair
import im.status.keycard.applet.KeyPath
import im.status.keycard.applet.KeycardCommandSet
import im.status.keycard.io.APDUResponse
import java.io.IOException
import java.lang.Exception
class ExportKeyCommand(private val listener: Listener, private val path: String? = null, private val makeCurrent: Boolean = true, private val publicOnly: Boolean = true) : CardCommand {
interface Listener {

View File

@ -7,8 +7,6 @@ import im.status.keycard.applet.Mnemonic
import im.status.keycard.connect.data.*
import im.status.keycard.connect.ui.LoadKeyActivity
import im.status.keycard.connect.ui.ShowMnemonicActivity
import java.io.IOException
import java.lang.Exception
class LoadKeyCommand(private var loadType: Int = LOAD_NONE, private var mnemonic: String? = null) : CardCommand {
private fun promptKey(activity: Activity) : CardCommand.Result {

View File

@ -0,0 +1,9 @@
package im.status.keycard.connect.card
class RemoveKeyCommand() : CardCommand {
override fun run(context: CardScriptExecutor.ScriptContext): CardCommand.Result {
return runOnCard {
context.cmdSet.removeKey().checkOK()
}
}
}

View File

@ -1,8 +1,5 @@
package im.status.keycard.connect.card
import java.io.IOException
import java.lang.Exception
class SelectCommand : CardCommand {
override fun run(context: CardScriptExecutor.ScriptContext): CardCommand.Result {
//TODO: handle not-installed-applet/not-a-keycard

View File

@ -4,8 +4,6 @@ import im.status.keycard.applet.KeyPath
import im.status.keycard.applet.KeycardCommandSet
import im.status.keycard.applet.RecoverableSignature
import im.status.keycard.io.APDUResponse
import java.io.IOException
import java.lang.Exception
class SignCommand(private val listener: Listener, private val hash: ByteArray, private val path: String? = null, private val makeCurrent: Boolean = true, private val pinless: Boolean = false) : CardCommand {
interface Listener {

View File

@ -0,0 +1,12 @@
package im.status.keycard.connect.card
import im.status.keycard.connect.Registry
class UnpairCommand() : CardCommand {
override fun run(context: CardScriptExecutor.ScriptContext): CardCommand.Result {
return runOnCard {
context.cmdSet.autoUnpair()
Registry.pairingManager.removePairing(context.cmdSet.applicationInfo.instanceUID)
}
}
}

View File

@ -0,0 +1,9 @@
package im.status.keycard.connect.card
class UnpairOthersCommand() : CardCommand {
override fun run(context: CardScriptExecutor.ScriptContext): CardCommand.Result {
return runOnCard {
context.cmdSet.unpairOthers()
}
}
}

View File

@ -19,7 +19,7 @@ class ChangePINActivity : AppCompatActivity() {
fun ok(@Suppress("UNUSED_PARAMETER") view: View) {
val pinText = findViewById<EditText>(R.id.newPINText)
val script: List<CardCommand> = scriptWithAuthentication().plus(ChangePINCommand(pinText.text.toString()))
val script = scriptWithAuthentication().plus(ChangePINCommand(pinText.text.toString()))
Registry.scriptExecutor.runScript(script)
finish()
}

View File

@ -0,0 +1,29 @@
package im.status.keycard.connect.ui
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.EditText
import im.status.keycard.connect.R
import im.status.keycard.connect.Registry
import im.status.keycard.connect.card.ChangePUKCommand
import im.status.keycard.connect.card.scriptWithAuthentication
class ChangePUKActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
//TODO: puk validation and confirmation
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_change_puk)
}
fun ok(@Suppress("UNUSED_PARAMETER") view: View) {
val pukText = findViewById<EditText>(R.id.newPUKText)
val script = scriptWithAuthentication().plus(ChangePUKCommand(pukText.text.toString()))
Registry.scriptExecutor.runScript(script)
finish()
}
fun cancel(@Suppress("UNUSED_PARAMETER") view: View) {
finish()
}
}

View File

@ -0,0 +1,30 @@
package im.status.keycard.connect.ui
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.EditText
import im.status.keycard.connect.R
import im.status.keycard.connect.Registry
import im.status.keycard.connect.card.ChangePUKCommand
import im.status.keycard.connect.card.ChangePairingPasswordCommand
import im.status.keycard.connect.card.scriptWithAuthentication
class ChangePairingPasswordActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
//TODO: puk validation and confirmation
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_change_pairing_password)
}
fun ok(@Suppress("UNUSED_PARAMETER") view: View) {
val pairingPasswordText = findViewById<EditText>(R.id.newPairingPasswordText)
val script = scriptWithAuthentication().plus(ChangePairingPasswordCommand(pairingPasswordText.text.toString()))
Registry.scriptExecutor.runScript(script)
finish()
}
fun cancel(@Suppress("UNUSED_PARAMETER") view: View) {
finish()
}
}

View File

@ -83,6 +83,30 @@ class MainActivity : AppCompatActivity(), ScriptListener {
startCommand(ChangePINActivity::class)
}
fun changePUK(@Suppress("UNUSED_PARAMETER") view: View) {
startCommand(ChangePUKActivity::class)
}
fun changePairingPassword(@Suppress("UNUSED_PARAMETER") view: View) {
startCommand(ChangePairingPasswordActivity::class)
}
fun unpair(@Suppress("UNUSED_PARAMETER") view: View) {
Registry.scriptExecutor.runScript(scriptWithAuthentication().plus(UnpairCommand()))
}
fun unpairOthers(@Suppress("UNUSED_PARAMETER") view: View) {
Registry.scriptExecutor.runScript(scriptWithAuthentication().plus(UnpairOthersCommand()))
}
fun changeKey(@Suppress("UNUSED_PARAMETER") view: View) {
Registry.scriptExecutor.runScript(scriptWithAuthentication().plus(LoadKeyCommand()))
}
fun removeKey(@Suppress("UNUSED_PARAMETER") view: View) {
Registry.scriptExecutor.runScript(scriptWithAuthentication().plus(RemoveKeyCommand()))
}
private fun startCommand(activity: KClass<out Activity>) {
val intent = Intent(this, activity.java)
startActivity(intent)

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.ChangePairingPasswordActivity">
<TextView
android:id="@+id/newPairingPasswordPrompt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:text="@string/change_pairing_password_prompt"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/okButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="88dp"
android:onClick="ok"
android:text="@android:string/ok"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/cancelButton" />
<Button
android:id="@+id/cancelButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="68dp"
android:layout_marginTop="76dp"
android:onClick="cancel"
android:text="@android:string/cancel"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/newPairingPasswordText" />
<EditText
android:id="@+id/newPairingPasswordText"
android:layout_width="328dp"
android:layout_height="46dp"
android:layout_marginTop="88dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/newPairingPasswordPrompt"
tools:text="password" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -14,7 +14,6 @@
android:text="@string/change_pin_prompt"
android:textAppearance="@style/TextAppearance.AppCompat.Display2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.ChangePUKActivity">
<TextView
android:id="@+id/newPukPrompt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:text="@string/change_puk_prompt"
android:textAppearance="@style/TextAppearance.AppCompat.Display2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/okButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="88dp"
android:onClick="ok"
android:text="@android:string/ok"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/cancelButton" />
<Button
android:id="@+id/cancelButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="68dp"
android:layout_marginTop="76dp"
android:onClick="cancel"
android:text="@android:string/cancel"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/newPUKText" />
<EditText
android:id="@+id/newPUKText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="88dp"
android:ems="10"
android:inputType="numberPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/newPukPrompt"
tools:text="123456" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -10,25 +10,89 @@
<Button
android:id="@+id/changePINButton"
android:layout_width="wrap_content"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:layout_marginTop="16dp"
android:onClick="changePIN"
android:text="@string/change_pin"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.532"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/walletConnectButton" />
<Button
android:id="@+id/walletConnectButton"
android:layout_width="wrap_content"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginTop="24dp"
android:onClick="connectWallet"
android:text="@string/connect_wallet"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.553"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/changePUKButton"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="changePUK"
android:text="@string/change_puk"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/changePINButton" />
<Button
android:id="@+id/changePairingPasswordButton"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="changePairingPassword"
android:text="@string/change_pairing_password"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/changePUKButton" />
<Button
android:id="@+id/unpairButton"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="unpair"
android:text="@string/unpair"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/changePairingPasswordButton" />
<Button
android:id="@+id/unpairOthers"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="unpairOthers"
android:text="@string/unpair_others"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/unpairButton" />
<Button
android:id="@+id/changeKeyButton"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="changeKey"
android:text="@string/change_key"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/unpairOthers" />
<Button
android:id="@+id/removeKey"
android:layout_width="236dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="removeKey"
android:text="@string/remove_key"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/changeKeyButton" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -25,4 +25,12 @@
<string name="load_generate_mnemonic_label">Generate and load BIP39 mnemonic. You will be shown the mnemonic after it is loaded</string>
<string name="mnemonic_ok_button">I have wrote these words down</string>
<string name="mnemonic_label">Please write these words down. They won\'t be presented again and there is no way to recover them.</string>
<string name="change_puk">Change PUK</string>
<string name="change_pairing_password">Change pairing password</string>
<string name="unpair">Unpair</string>
<string name="unpair_others">Unpair Others</string>
<string name="change_key">Change Key</string>
<string name="remove_key">Remove key</string>
<string name="change_puk_prompt">New PUK</string>
<string name="change_pairing_password_prompt">New pairing password</string>
</resources>