add remember passphrase and clearing it from settings
This commit is contained in:
parent
24a77b9028
commit
bf1b67ea6a
5 changed files with 90 additions and 23 deletions
|
@ -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()) {
|
||||||
|
|
|
@ -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,25 +160,40 @@ 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()) {
|
||||||
new AlertDialog.Builder(callingActivity)
|
if (sshKeyPassphrase != null && !sshKeyPassphrase.isEmpty()) {
|
||||||
.setTitle(callingActivity.getResources().getString(R.string.passphrase_dialog_title))
|
if (keyPair.decrypt(sshKeyPassphrase)) {
|
||||||
.setMessage(callingActivity.getResources().getString(R.string.passphrase_dialog_text))
|
// Authenticate using the ssh-key and then execute the command
|
||||||
.setView(passphrase)
|
setAuthentication(sshKey, username, sshKeyPassphrase).execute();
|
||||||
.setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
|
} else {
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
// call back the method
|
||||||
if (keyPair.decrypt(passphrase.getText().toString())) {
|
executeAfterAuthentication(connectionMode, username, sshKey, true);
|
||||||
// Authenticate using the ssh-key and then execute the command
|
|
||||||
setAuthentication(sshKey, username, passphrase.getText().toString()).execute();
|
|
||||||
} else {
|
|
||||||
// call back the method
|
|
||||||
executeAfterAuthentication(connectionMode, username, sshKey, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).setNegativeButton(callingActivity.getResources().getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
}
|
||||||
}).show();
|
} else {
|
||||||
|
new AlertDialog.Builder(callingActivity)
|
||||||
|
.setTitle(callingActivity.getResources().getString(R.string.passphrase_dialog_title))
|
||||||
|
.setMessage(callingActivity.getResources().getString(R.string.passphrase_dialog_text))
|
||||||
|
.setView(dialogView)
|
||||||
|
.setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int whichButton) {
|
||||||
|
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
|
||||||
|
setAuthentication(sshKey, username, passphrase.getText().toString()).execute();
|
||||||
|
} else {
|
||||||
|
settings.edit().putString("ssh_key_passphrase", null).apply();
|
||||||
|
// call back the method
|
||||||
|
executeAfterAuthentication(connectionMode, username, sshKey, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).setNegativeButton(callingActivity.getResources().getString(R.string.dialog_cancel), new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int whichButton) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
}).show();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
setAuthentication(sshKey, username, "").execute();
|
setAuthentication(sshKey, username, "").execute();
|
||||||
}
|
}
|
||||||
|
|
34
app/src/main/res/layout/git_passphrase_layout.xml
Normal file
34
app/src/main/res/layout/git_passphrase_layout.xml
Normal 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>
|
|
@ -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>
|
||||||
|
|
|
@ -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" />
|
||||||
|
|
Loading…
Reference in a new issue