add remember passphrase and clearing it from settings

This commit is contained in:
zeapo 2017-08-10 15:13:58 +02:00
parent 24a77b9028
commit bf1b67ea6a
5 changed files with 90 additions and 23 deletions

View file

@ -74,6 +74,11 @@ class UserPreference : AppCompatActivity() {
true true
} }
findPreference("ssh_key_clear_passphrase").onPreferenceClickListener = Preference.OnPreferenceClickListener {
sharedPreferences.edit().putString("ssh_key_passphrase", null).apply()
it.isEnabled = false
true
}
findPreference("git_server_info").onPreferenceClickListener = Preference.OnPreferenceClickListener { findPreference("git_server_info").onPreferenceClickListener = Preference.OnPreferenceClickListener {
val intent = Intent(callingActivity, GitActivity::class.java) val intent = Intent(callingActivity, GitActivity::class.java)
@ -155,6 +160,7 @@ class UserPreference : AppCompatActivity() {
findPreference("pref_select_external").summary = preferenceManager.sharedPreferences.getString("git_external_repo", getString(R.string.no_repo_selected)) findPreference("pref_select_external").summary = preferenceManager.sharedPreferences.getString("git_external_repo", getString(R.string.no_repo_selected))
findPreference("ssh_see_key").isEnabled = sharedPreferences.getBoolean("use_generated_key", false) findPreference("ssh_see_key").isEnabled = sharedPreferences.getBoolean("use_generated_key", false)
findPreference("git_delete_repo").isEnabled = !sharedPreferences.getBoolean("git_external", false) findPreference("git_delete_repo").isEnabled = !sharedPreferences.getBoolean("git_external", false)
findPreference("ssh_key_clear_passphrase").isEnabled = sharedPreferences.getString("ssh_key_passphrase", null)?.isNotEmpty() ?: false
val keyPref = findPreference("openpgp_key_id_pref") val keyPref = findPreference("openpgp_key_id_pref")
val selectedKeys: Array<String> = ArrayList<String>(sharedPreferences.getStringSet("openpgp_key_ids_set", HashSet<String>())).toTypedArray() val selectedKeys: Array<String> = ArrayList<String>(sharedPreferences.getStringSet("openpgp_key_ids_set", HashSet<String>())).toTypedArray()
if (selectedKeys.isEmpty()) { if (selectedKeys.isEmpty()) {

View file

@ -1,11 +1,17 @@
package com.zeapo.pwdstore.git; package com.zeapo.pwdstore.git;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.text.InputType; import android.text.InputType;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -19,6 +25,7 @@ import com.zeapo.pwdstore.git.config.SshConfigSessionFactory;
import com.zeapo.pwdstore.utils.PasswordRepository; import com.zeapo.pwdstore.utils.PasswordRepository;
import org.eclipse.jgit.api.GitCommand; import org.eclipse.jgit.api.GitCommand;
import org.eclipse.jgit.diff.Edit;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.JschConfigSessionFactory; import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.SshSessionFactory; import org.eclipse.jgit.transport.SshSessionFactory;
@ -140,10 +147,11 @@ public abstract class GitOperation {
} }
}).show(); }).show();
} else { } else {
final EditText passphrase = new EditText(callingActivity); LayoutInflater layoutInflater = LayoutInflater.from(callingActivity.getApplicationContext());
passphrase.setHint("Passphrase"); @SuppressLint("InflateParams") final View dialogView = layoutInflater.inflate(R.layout.git_passphrase_layout, null);
passphrase.setWidth(LinearLayout.LayoutParams.MATCH_PARENT); final EditText passphrase = (EditText) dialogView.findViewById(R.id.sshkey_passphrase);
passphrase.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(callingActivity.getApplicationContext());
final String sshKeyPassphrase = settings.getString("ssh_key_passphrase", null);
if (showError) { if (showError) {
passphrase.setError("Wrong passphrase"); passphrase.setError("Wrong passphrase");
} }
@ -152,16 +160,30 @@ public abstract class GitOperation {
final KeyPair keyPair = KeyPair.load(jsch, callingActivity.getFilesDir() + "/.ssh_key"); final KeyPair keyPair = KeyPair.load(jsch, callingActivity.getFilesDir() + "/.ssh_key");
if (keyPair.isEncrypted()) { if (keyPair.isEncrypted()) {
if (sshKeyPassphrase != null && !sshKeyPassphrase.isEmpty()) {
if (keyPair.decrypt(sshKeyPassphrase)) {
// Authenticate using the ssh-key and then execute the command
setAuthentication(sshKey, username, sshKeyPassphrase).execute();
} else {
// call back the method
executeAfterAuthentication(connectionMode, username, sshKey, true);
}
} else {
new AlertDialog.Builder(callingActivity) new AlertDialog.Builder(callingActivity)
.setTitle(callingActivity.getResources().getString(R.string.passphrase_dialog_title)) .setTitle(callingActivity.getResources().getString(R.string.passphrase_dialog_title))
.setMessage(callingActivity.getResources().getString(R.string.passphrase_dialog_text)) .setMessage(callingActivity.getResources().getString(R.string.passphrase_dialog_text))
.setView(passphrase) .setView(dialogView)
.setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() { .setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) { public void onClick(DialogInterface dialog, int whichButton) {
if (keyPair.decrypt(passphrase.getText().toString())) { if (keyPair.decrypt(passphrase.getText().toString())) {
boolean rememberPassphrase = ((CheckBox) dialogView.findViewById(R.id.sshkey_remember_passphrase)).isChecked();
if (rememberPassphrase) {
settings.edit().putString("ssh_key_passphrase", passphrase.getText().toString()).apply();
}
// Authenticate using the ssh-key and then execute the command // Authenticate using the ssh-key and then execute the command
setAuthentication(sshKey, username, passphrase.getText().toString()).execute(); setAuthentication(sshKey, username, passphrase.getText().toString()).execute();
} else { } else {
settings.edit().putString("ssh_key_passphrase", null).apply();
// call back the method // call back the method
executeAfterAuthentication(connectionMode, username, sshKey, true); executeAfterAuthentication(connectionMode, username, sshKey, true);
} }
@ -171,6 +193,7 @@ public abstract class GitOperation {
// Do nothing. // Do nothing.
} }
}).show(); }).show();
}
} else { } else {
setAuthentication(sshKey, username, "").execute(); setAuthentication(sshKey, username, "").execute();
} }

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/sshkey_passphrase"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<CheckBox
android:id="@+id/sshkey_remember_passphrase"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:text="Remember until the application is closed"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/sshkey_passphrase" />
</android.support.constraint.ConstraintLayout>

View file

@ -46,7 +46,7 @@
<string name="ssh_preferences_dialog_import">Import</string> <string name="ssh_preferences_dialog_import">Import</string>
<string name="ssh_preferences_dialog_generate">Generate</string> <string name="ssh_preferences_dialog_generate">Generate</string>
<string name="passphrase_dialog_title">Authenticate</string> <string name="passphrase_dialog_title">Authenticate</string>
<string name="passphrase_dialog_text">Please provide the passphrase for your SSH key. Leave it empty if there is no passphrase.</string> <string name="passphrase_dialog_text">Please provide the passphrase for your SSH key</string>
<string name="password_dialog_text">Please provide the password for this repository</string> <string name="password_dialog_text">Please provide the password for this repository</string>
<!-- Clone fragment --> <!-- Clone fragment -->
@ -208,4 +208,5 @@
<string name="git_push_generic_error">Push was rejected by remote, reason:</string> <string name="git_push_generic_error">Push was rejected by remote, reason:</string>
<string name="git_push_other_error">Remote rejected non-fast-forward push. Check receive.denyNonFastForwards variable in config file of destination repository.</string> <string name="git_push_other_error">Remote rejected non-fast-forward push. Check receive.denyNonFastForwards variable in config file of destination repository.</string>
<string name="jgit_error_push_dialog_text">Error occurred during the push operation:</string> <string name="jgit_error_push_dialog_text">Error occurred during the push operation:</string>
<string name="ssh_key_clear_passphrase">Clear ssh-key saved passphrase</string>
</resources> </resources>

View file

@ -13,6 +13,9 @@
<Preference <Preference
android:key="ssh_keygen" android:key="ssh_keygen"
android:title="@string/pref_ssh_keygen_title" /> android:title="@string/pref_ssh_keygen_title" />
<Preference
android:key="ssh_key_clear_passphrase"
android:title="@string/ssh_key_clear_passphrase" />
<Preference <Preference
android:key="ssh_see_key" android:key="ssh_see_key"
android:title="@string/pref_ssh_see_key_title" /> android:title="@string/pref_ssh_see_key_title" />