aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/com')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/PasswordStore.java2
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/CloneOperation.java82
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/CloneOperation.kt72
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/GitOperation.java256
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/GitOperation.kt252
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/PullOperation.java54
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/PullOperation.kt49
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/PushOperation.java52
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/PushOperation.kt47
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/SyncOperation.java66
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/SyncOperation.kt60
11 files changed, 481 insertions, 511 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java
index f20c3f2e..2ce17353 100644
--- a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java
+++ b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java
@@ -595,7 +595,7 @@ public class PasswordStore extends AppCompatActivity {
@Override
public void execute() {
Log.d(TAG, "Committing with message " + message);
- Git git = new Git(repository);
+ Git git = new Git(getRepository());
GitAsyncTask tasks = new GitAsyncTask(activity, false, true, this);
tasks.execute(
git.add().addFilepattern("."),
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/CloneOperation.java b/app/src/main/java/com/zeapo/pwdstore/git/CloneOperation.java
deleted file mode 100644
index e3de3f05..00000000
--- a/app/src/main/java/com/zeapo/pwdstore/git/CloneOperation.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.zeapo.pwdstore.git;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import com.zeapo.pwdstore.R;
-import org.eclipse.jgit.api.CloneCommand;
-import org.eclipse.jgit.api.Git;
-
-import java.io.File;
-
-public class CloneOperation extends GitOperation {
- /**
- * Creates a new clone operation
- *
- * @param fileDir the git working tree directory
- * @param callingActivity the calling activity
- */
- public CloneOperation(File fileDir, Activity callingActivity) {
- super(fileDir, callingActivity);
- }
-
- /**
- * Sets the command using the repository uri
- *
- * @param uri the uri of the repository
- * @return the current object
- */
- public CloneOperation setCommand(String uri) {
- this.command = Git.cloneRepository().
- setCloneAllBranches(true).
- setDirectory(repository.getWorkTree()).
- setURI(uri);
- return this;
- }
-
- /**
- * sets the authentication for user/pwd scheme
- *
- * @param username the username
- * @param password the password
- * @return the current object
- */
- @Override
- public CloneOperation setAuthentication(String username, String password) {
- super.setAuthentication(username, password);
- return this;
- }
-
- /**
- * sets the authentication for the ssh-key scheme
- *
- * @param sshKey the ssh-key file
- * @param username the username
- * @param passphrase the passphrase
- * @return the current object
- */
- @Override
- public CloneOperation setAuthentication(File sshKey, String username, String passphrase) {
- super.setAuthentication(sshKey, username, passphrase);
- return this;
- }
-
- @Override
- public void execute() {
- if (this.provider != null) {
- ((CloneCommand) this.command).setCredentialsProvider(this.provider);
- }
- new GitAsyncTask(callingActivity, true, false, this).execute(this.command);
- }
-
- @Override
- public void onError(String errorMessage) {
- new AlertDialog.Builder(callingActivity).
- setTitle(callingActivity.getResources().getString(R.string.jgit_error_dialog_title)).
- setMessage("Error occured during the clone operation, "
- + callingActivity.getResources().getString(R.string.jgit_error_dialog_text)
- + errorMessage
- + "\nPlease check the FAQ for possible reasons why this error might occur.").
- setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), (dialogInterface, i) -> {
- }).show();
- }
-}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/CloneOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/CloneOperation.kt
new file mode 100644
index 00000000..bf407838
--- /dev/null
+++ b/app/src/main/java/com/zeapo/pwdstore/git/CloneOperation.kt
@@ -0,0 +1,72 @@
+package com.zeapo.pwdstore.git
+
+import android.app.Activity
+import android.app.AlertDialog
+import com.zeapo.pwdstore.R
+import org.eclipse.jgit.api.CloneCommand
+import org.eclipse.jgit.api.Git
+
+import java.io.File
+
+/**
+ * Creates a new clone operation
+ *
+ * @param fileDir the git working tree directory
+ * @param callingActivity the calling activity
+ */
+class CloneOperation(fileDir: File, callingActivity: Activity) : GitOperation(fileDir, callingActivity) {
+
+ /**
+ * Sets the command using the repository uri
+ *
+ * @param uri the uri of the repository
+ * @return the current object
+ */
+ fun setCommand(uri: String): CloneOperation {
+ this.command = Git.cloneRepository().setCloneAllBranches(true).setDirectory(repository.workTree).setURI(uri)
+ return this
+ }
+
+ /**
+ * sets the authentication for user/pwd scheme
+ *
+ * @param username the username
+ * @param password the password
+ * @return the current object
+ */
+ public override fun setAuthentication(username: String, password: String): CloneOperation {
+ super.setAuthentication(username, password)
+ return this
+ }
+
+ /**
+ * sets the authentication for the ssh-key scheme
+ *
+ * @param sshKey the ssh-key file
+ * @param username the username
+ * @param passphrase the passphrase
+ * @return the current object
+ */
+ public override fun setAuthentication(sshKey: File, username: String, passphrase: String): CloneOperation {
+ super.setAuthentication(sshKey, username, passphrase)
+ return this
+ }
+
+ override fun execute() {
+ if (this.provider != null) {
+ (this.command as CloneCommand).setCredentialsProvider(this.provider)
+ }
+ GitAsyncTask(callingActivity, true, false, this).execute(this.command)
+ }
+
+ override fun onError(errorMessage: String) {
+ AlertDialog.Builder(callingActivity)
+ .setTitle(callingActivity.resources.getString(R.string.jgit_error_dialog_title))
+ .setMessage("Error occured during the clone operation, "
+ + callingActivity.resources.getString(R.string.jgit_error_dialog_text)
+ + errorMessage
+ + "\nPlease check the FAQ for possible reasons why this error might occur.")
+ .setPositiveButton(callingActivity.resources.getString(R.string.dialog_ok)) { _, _ -> }
+ .show()
+ }
+}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.java b/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.java
deleted file mode 100644
index 39edf158..00000000
--- a/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.java
+++ /dev/null
@@ -1,256 +0,0 @@
-package com.zeapo.pwdstore.git;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.text.InputType;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AlertDialog;
-
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.KeyPair;
-import com.zeapo.pwdstore.R;
-import com.zeapo.pwdstore.UserPreference;
-import com.zeapo.pwdstore.git.config.GitConfigSessionFactory;
-import com.zeapo.pwdstore.git.config.SshApiSessionFactory;
-import com.zeapo.pwdstore.git.config.SshConfigSessionFactory;
-import com.zeapo.pwdstore.utils.PasswordRepository;
-
-import org.eclipse.jgit.api.GitCommand;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.transport.JschConfigSessionFactory;
-import org.eclipse.jgit.transport.SshSessionFactory;
-import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
-
-import java.io.File;
-
-public abstract class GitOperation {
- public static final int GET_SSH_KEY_FROM_CLONE = 201;
-
- protected final Repository repository;
- final Activity callingActivity;
- UsernamePasswordCredentialsProvider provider;
- GitCommand command;
-
- /**
- * Creates a new git operation
- *
- * @param fileDir the git working tree directory
- * @param callingActivity the calling activity
- */
- public GitOperation(File fileDir, Activity callingActivity) {
- this.repository = PasswordRepository.getRepository(fileDir);
- this.callingActivity = callingActivity;
- }
-
- /**
- * Sets the authentication using user/pwd scheme
- *
- * @param username the username
- * @param password the password
- * @return the current object
- */
- GitOperation setAuthentication(String username, String password) {
- SshSessionFactory.setInstance(new GitConfigSessionFactory());
- this.provider = new UsernamePasswordCredentialsProvider(username, password);
- return this;
- }
-
- /**
- * Sets the authentication using ssh-key scheme
- *
- * @param sshKey the ssh-key file
- * @param username the username
- * @param passphrase the passphrase
- * @return the current object
- */
- GitOperation setAuthentication(File sshKey, String username, String passphrase) {
- JschConfigSessionFactory sessionFactory = new SshConfigSessionFactory(sshKey.getAbsolutePath(), username, passphrase);
- SshSessionFactory.setInstance(sessionFactory);
- this.provider = null;
- return this;
- }
-
- /**
- * Sets the authentication using OpenKeystore scheme
- *
- * @param identity The identiy to use
- * @return the current object
- */
- GitOperation setAuthentication(String username, SshApiSessionFactory.ApiIdentity identity) {
- SshSessionFactory.setInstance(new SshApiSessionFactory(username, identity));
- this.provider = null;
- return this;
- }
-
- /**
- * Executes the GitCommand in an async task
- */
- public abstract void execute();
-
- /**
- * Executes the GitCommand in an async task after creating the authentication
- *
- * @param connectionMode the server-connection mode
- * @param username the username
- * @param sshKey the ssh-key file to use in ssh-key connection mode
- * @param identity the api identity to use for auth in OpenKeychain connection mode
- */
- public void executeAfterAuthentication(final String connectionMode,
- final String username,
- @Nullable final File sshKey,
- SshApiSessionFactory.ApiIdentity identity) {
- executeAfterAuthentication(connectionMode, username, sshKey, identity, false);
- }
-
- /**
- * Executes the GitCommand in an async task after creating the authentication
- *
- * @param connectionMode the server-connection mode
- * @param username the username
- * @param sshKey the ssh-key file to use in ssh-key connection mode
- * @param identity the api identity to use for auth in OpenKeychain connection mode
- * @param showError show the passphrase edit text in red
- */
- private void executeAfterAuthentication(final String connectionMode,
- final String username,
- @Nullable final File sshKey,
- SshApiSessionFactory.ApiIdentity identity,
- final boolean showError) {
- if (connectionMode.equalsIgnoreCase("ssh-key")) {
- if (sshKey == null || !sshKey.exists()) {
- new AlertDialog.Builder(callingActivity)
- .setMessage(callingActivity.getResources().getString(R.string.ssh_preferences_dialog_text))
- .setTitle(callingActivity.getResources().getString(R.string.ssh_preferences_dialog_title))
- .setPositiveButton(callingActivity.getResources().getString(R.string.ssh_preferences_dialog_import), (dialog, id) -> {
- try {
- // Ask the UserPreference to provide us with the ssh-key
- // onResult has to be handled by the callingActivity
- Intent intent = new Intent(callingActivity.getApplicationContext(), UserPreference.class);
- intent.putExtra("operation", "get_ssh_key");
- callingActivity.startActivityForResult(intent, GET_SSH_KEY_FROM_CLONE);
- } catch (Exception e) {
- System.out.println("Exception caught :(");
- e.printStackTrace();
- }
- })
- .setNegativeButton(callingActivity.getResources().getString(R.string.ssh_preferences_dialog_generate), (dialog, which) -> {
- try {
- // Duplicated code
- Intent intent = new Intent(callingActivity.getApplicationContext(), UserPreference.class);
- intent.putExtra("operation", "make_ssh_key");
- callingActivity.startActivityForResult(intent, GET_SSH_KEY_FROM_CLONE);
- } catch (Exception e) {
- System.out.println("Exception caught :(");
- e.printStackTrace();
- }
- })
- .setNeutralButton(callingActivity.getResources().getString(R.string.dialog_cancel), (dialog, id) -> {
- // Finish the blank GitActivity so user doesn't have to press back
- callingActivity.finish();
- }).show();
- } else {
- LayoutInflater layoutInflater = LayoutInflater.from(callingActivity.getApplicationContext());
- @SuppressLint("InflateParams") final View dialogView = layoutInflater.inflate(R.layout.git_passphrase_layout, null);
- final EditText passphrase = dialogView.findViewById(R.id.sshkey_passphrase);
- final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(callingActivity.getApplicationContext());
- final String sshKeyPassphrase = settings.getString("ssh_key_passphrase", null);
- if (showError) {
- passphrase.setError("Wrong passphrase");
- }
- JSch jsch = new JSch();
- try {
- final KeyPair keyPair = KeyPair.load(jsch, callingActivity.getFilesDir() + "/.ssh_key");
-
- 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, identity, true);
- }
- } 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), (dialog, 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, identity, true);
- }
- }).setNegativeButton(callingActivity.getResources().getString(R.string.dialog_cancel), (dialog, whichButton) -> {
- // Do nothing.
- }).show();
- }
- } else {
- setAuthentication(sshKey, username, "").execute();
- }
- } catch (JSchException e) {
- new AlertDialog.Builder(callingActivity)
- .setTitle("Unable to open the ssh-key")
- .setMessage("Please check that it was imported.")
- .setPositiveButton("Ok", (dialogInterface, i) -> {
-
- }).show();
- }
- }
- } else if (connectionMode.equalsIgnoreCase("OpenKeychain")) {
- setAuthentication(username, identity).execute();
- } else {
- final EditText password = new EditText(callingActivity);
- password.setHint("Password");
- password.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
- password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
-
- new AlertDialog.Builder(callingActivity)
- .setTitle(callingActivity.getResources().getString(R.string.passphrase_dialog_title))
- .setMessage(callingActivity.getResources().getString(R.string.password_dialog_text))
- .setView(password)
- .setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), (dialog, whichButton) -> {
- // authenticate using the user/pwd and then execute the command
- setAuthentication(username, password.getText().toString()).execute();
-
- })
- .setNegativeButton(callingActivity.getResources().getString(R.string.dialog_cancel), (dialog, whichButton) -> callingActivity.finish()).show();
- }
- }
-
- /**
- * Action to execute on error
- */
- public void onError(String errorMessage) {
- new AlertDialog.Builder(callingActivity).
- setTitle(callingActivity.getResources().getString(R.string.jgit_error_dialog_title)).
- setMessage(callingActivity.getResources().getString(R.string.jgit_error_dialog_text) + errorMessage).
- setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), (dialogInterface, i) -> {
- callingActivity.setResult(Activity.RESULT_CANCELED);
- callingActivity.finish();
- }).show();
- }
-
- /**
- * Action to execute on success
- */
- public void onSuccess() {
- }
-}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.kt
new file mode 100644
index 00000000..5c945c30
--- /dev/null
+++ b/app/src/main/java/com/zeapo/pwdstore/git/GitOperation.kt
@@ -0,0 +1,252 @@
+package com.zeapo.pwdstore.git
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Intent
+import android.preference.PreferenceManager
+import android.text.InputType
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.CheckBox
+import android.widget.EditText
+import android.widget.LinearLayout
+import androidx.appcompat.app.AlertDialog
+
+import com.jcraft.jsch.JSch
+import com.jcraft.jsch.JSchException
+import com.jcraft.jsch.KeyPair
+import com.zeapo.pwdstore.R
+import com.zeapo.pwdstore.UserPreference
+import com.zeapo.pwdstore.git.config.GitConfigSessionFactory
+import com.zeapo.pwdstore.git.config.SshApiSessionFactory
+import com.zeapo.pwdstore.git.config.SshConfigSessionFactory
+import com.zeapo.pwdstore.utils.PasswordRepository
+
+import org.eclipse.jgit.api.GitCommand
+import org.eclipse.jgit.lib.Repository
+import org.eclipse.jgit.transport.SshSessionFactory
+import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider
+
+import java.io.File
+
+/**
+ * Creates a new git operation
+ *
+ * @param fileDir the git working tree directory
+ * @param callingActivity the calling activity
+ */
+abstract class GitOperation(fileDir: File, internal val callingActivity: Activity) {
+
+ protected val repository: Repository = PasswordRepository.getRepository(fileDir)
+ internal var provider: UsernamePasswordCredentialsProvider? = null
+ internal var command: GitCommand<*>? = null
+
+ /**
+ * Sets the authentication using user/pwd scheme
+ *
+ * @param username the username
+ * @param password the password
+ * @return the current object
+ */
+ internal open fun setAuthentication(username: String, password: String): GitOperation {
+ SshSessionFactory.setInstance(GitConfigSessionFactory())
+ this.provider = UsernamePasswordCredentialsProvider(username, password)
+ return this
+ }
+
+ /**
+ * Sets the authentication using ssh-key scheme
+ *
+ * @param sshKey the ssh-key file
+ * @param username the username
+ * @param passphrase the passphrase
+ * @return the current object
+ */
+ internal open fun setAuthentication(sshKey: File, username: String, passphrase: String): GitOperation {
+ val sessionFactory = SshConfigSessionFactory(sshKey.absolutePath, username, passphrase)
+ SshSessionFactory.setInstance(sessionFactory)
+ this.provider = null
+ return this
+ }
+
+ /**
+ * Sets the authentication using OpenKeystore scheme
+ *
+ * @param identity The identiy to use
+ * @return the current object
+ */
+ private fun setAuthentication(username: String, identity: SshApiSessionFactory.ApiIdentity?): GitOperation {
+ SshSessionFactory.setInstance(SshApiSessionFactory(username, identity))
+ this.provider = null
+ return this
+ }
+
+ /**
+ * Executes the GitCommand in an async task
+ */
+ abstract fun execute()
+
+ /**
+ * Executes the GitCommand in an async task after creating the authentication
+ *
+ * @param connectionMode the server-connection mode
+ * @param username the username
+ * @param sshKey the ssh-key file to use in ssh-key connection mode
+ * @param identity the api identity to use for auth in OpenKeychain connection mode
+ */
+ fun executeAfterAuthentication(connectionMode: String,
+ username: String,
+ sshKey: File?,
+ identity: SshApiSessionFactory.ApiIdentity?) {
+ executeAfterAuthentication(connectionMode, username, sshKey, identity, false)
+ }
+
+ /**
+ * Executes the GitCommand in an async task after creating the authentication
+ *
+ * @param connectionMode the server-connection mode
+ * @param username the username
+ * @param sshKey the ssh-key file to use in ssh-key connection mode
+ * @param identity the api identity to use for auth in OpenKeychain connection mode
+ * @param showError show the passphrase edit text in red
+ */
+ private fun executeAfterAuthentication(connectionMode: String,
+ username: String,
+ sshKey: File?,
+ identity: SshApiSessionFactory.ApiIdentity?,
+ showError: Boolean) {
+ if (connectionMode.equals("ssh-key", ignoreCase = true)) {
+ if (sshKey == null || !sshKey.exists()) {
+ AlertDialog.Builder(callingActivity)
+ .setMessage(callingActivity.resources.getString(R.string.ssh_preferences_dialog_text))
+ .setTitle(callingActivity.resources.getString(R.string.ssh_preferences_dialog_title))
+ .setPositiveButton(callingActivity.resources.getString(R.string.ssh_preferences_dialog_import)) { _, _ ->
+ try {
+ // Ask the UserPreference to provide us with the ssh-key
+ // onResult has to be handled by the callingActivity
+ val intent = Intent(callingActivity.applicationContext, UserPreference::class.java)
+ intent.putExtra("operation", "get_ssh_key")
+ callingActivity.startActivityForResult(intent, GET_SSH_KEY_FROM_CLONE)
+ } catch (e: Exception) {
+ println("Exception caught :(")
+ e.printStackTrace()
+ }
+ }
+ .setNegativeButton(callingActivity.resources.getString(R.string.ssh_preferences_dialog_generate)) { _, _ ->
+ try {
+ // Duplicated code
+ val intent = Intent(callingActivity.applicationContext, UserPreference::class.java)
+ intent.putExtra("operation", "make_ssh_key")
+ callingActivity.startActivityForResult(intent, GET_SSH_KEY_FROM_CLONE)
+ } catch (e: Exception) {
+ println("Exception caught :(")
+ e.printStackTrace()
+ }
+ }
+ .setNeutralButton(callingActivity.resources.getString(R.string.dialog_cancel)) { _, _ ->
+ // Finish the blank GitActivity so user doesn't have to press back
+ callingActivity.finish()
+ }.show()
+ } else {
+ val layoutInflater = LayoutInflater.from(callingActivity.applicationContext)
+ @SuppressLint("InflateParams") val dialogView = layoutInflater.inflate(R.layout.git_passphrase_layout, null)
+ val passphrase = dialogView.findViewById<EditText>(R.id.sshkey_passphrase)
+ val settings = PreferenceManager.getDefaultSharedPreferences(callingActivity.applicationContext)
+ val sshKeyPassphrase = settings.getString("ssh_key_passphrase", null)
+ if (showError) {
+ passphrase.error = "Wrong passphrase"
+ }
+ val jsch = JSch()
+ try {
+ val keyPair = KeyPair.load(jsch, callingActivity.filesDir.toString() + "/.ssh_key")
+
+ if (keyPair.isEncrypted) {
+ if (sshKeyPassphrase != null && sshKeyPassphrase.isNotEmpty()) {
+ 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, identity, true)
+ }
+ } else {
+ AlertDialog.Builder(callingActivity)
+ .setTitle(callingActivity.resources.getString(R.string.passphrase_dialog_title))
+ .setMessage(callingActivity.resources.getString(R.string.passphrase_dialog_text))
+ .setView(dialogView)
+ .setPositiveButton(callingActivity.resources.getString(R.string.dialog_ok)) { _, _ ->
+ if (keyPair.decrypt(passphrase.text.toString())) {
+ val rememberPassphrase = (dialogView.findViewById<View>(R.id.sshkey_remember_passphrase) as CheckBox).isChecked
+ if (rememberPassphrase) {
+ settings.edit().putString("ssh_key_passphrase", passphrase.text.toString()).apply()
+ }
+ // Authenticate using the ssh-key and then execute the command
+ setAuthentication(sshKey, username, passphrase.text.toString()).execute()
+ } else {
+ settings.edit().putString("ssh_key_passphrase", null).apply()
+ // call back the method
+ executeAfterAuthentication(connectionMode, username, sshKey, identity, true)
+ }
+ }.setNegativeButton(callingActivity.resources.getString(R.string.dialog_cancel)) { _, _ ->
+ // Do nothing.
+ }.show()
+ }
+ } else {
+ setAuthentication(sshKey, username, "").execute()
+ }
+ } catch (e: JSchException) {
+ AlertDialog.Builder(callingActivity)
+ .setTitle("Unable to open the ssh-key")
+ .setMessage("Please check that it was imported.")
+ .setPositiveButton("Ok") { _, _ -> }
+ .show()
+ }
+
+ }
+ } else if (connectionMode.equals("OpenKeychain", ignoreCase = true)) {
+ setAuthentication(username, identity).execute()
+ } else {
+ val password = EditText(callingActivity)
+ password.hint = "Password"
+ password.width = LinearLayout.LayoutParams.MATCH_PARENT
+ password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
+
+ AlertDialog.Builder(callingActivity)
+ .setTitle(callingActivity.resources.getString(R.string.passphrase_dialog_title))
+ .setMessage(callingActivity.resources.getString(R.string.password_dialog_text))
+ .setView(password)
+ .setPositiveButton(callingActivity.resources.getString(R.string.dialog_ok)) { _, _ ->
+ // authenticate using the user/pwd and then execute the command
+ setAuthentication(username, password.text.toString()).execute()
+
+ }
+ .setNegativeButton(callingActivity.resources.getString(R.string.dialog_cancel)) { _, _ ->
+ callingActivity.finish()
+ }
+ .show()
+ }
+ }
+
+ /**
+ * Action to execute on error
+ */
+ open fun onError(errorMessage: String) {
+ AlertDialog.Builder(callingActivity)
+ .setTitle(callingActivity.resources.getString(R.string.jgit_error_dialog_title))
+ .setMessage(callingActivity.resources.getString(R.string.jgit_error_dialog_text) + errorMessage)
+ .setPositiveButton(callingActivity.resources.getString(R.string.dialog_ok)) { _, _ ->
+ callingActivity.setResult(Activity.RESULT_CANCELED)
+ callingActivity.finish()
+ }
+ .show()
+ }
+
+ /**
+ * Action to execute on success
+ */
+ open fun onSuccess() {}
+
+ companion object {
+ const val GET_SSH_KEY_FROM_CLONE = 201
+ }
+}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/PullOperation.java b/app/src/main/java/com/zeapo/pwdstore/git/PullOperation.java
deleted file mode 100644
index 322a6206..00000000
--- a/app/src/main/java/com/zeapo/pwdstore/git/PullOperation.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.zeapo.pwdstore.git;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import com.zeapo.pwdstore.R;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.PullCommand;
-
-import java.io.File;
-
-public class PullOperation extends GitOperation {
-
- /**
- * Creates a new git operation
- *
- * @param fileDir the git working tree directory
- * @param callingActivity the calling activity
- */
- public PullOperation(File fileDir, Activity callingActivity) {
- super(fileDir, callingActivity);
- }
-
- /**
- * Sets the command
- *
- * @return the current object
- */
- public PullOperation setCommand() {
- this.command = new Git(repository)
- .pull()
- .setRebase(true)
- .setRemote("origin");
- return this;
- }
-
- @Override
- public void execute() {
- if (this.provider != null) {
- ((PullCommand) this.command).setCredentialsProvider(this.provider);
- }
- new GitAsyncTask(callingActivity, true, false, this).execute(this.command);
- }
-
- @Override
- public void onError(String errorMessage) {
- new AlertDialog.Builder(callingActivity).
- setTitle(callingActivity.getResources().getString(R.string.jgit_error_dialog_title)).
- setMessage("Error occured during the pull operation, "
- + callingActivity.getResources().getString(R.string.jgit_error_dialog_text)
- + errorMessage
- + "\nPlease check the FAQ for possible reasons why this error might occur.").
- setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), (dialogInterface, i) -> callingActivity.finish()).show();
- }
-}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/PullOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/PullOperation.kt
new file mode 100644
index 00000000..fa6c5445
--- /dev/null
+++ b/app/src/main/java/com/zeapo/pwdstore/git/PullOperation.kt
@@ -0,0 +1,49 @@
+package com.zeapo.pwdstore.git
+
+import android.app.Activity
+import android.app.AlertDialog
+import com.zeapo.pwdstore.R
+import org.eclipse.jgit.api.Git
+import org.eclipse.jgit.api.PullCommand
+
+import java.io.File
+
+/**
+ * Creates a new git operation
+ *
+ * @param fileDir the git working tree directory
+ * @param callingActivity the calling activity
+ */
+class PullOperation(fileDir: File, callingActivity: Activity) : GitOperation(fileDir, callingActivity) {
+
+ /**
+ * Sets the command
+ *
+ * @return the current object
+ */
+ fun setCommand(): PullOperation {
+ this.command = Git(repository)
+ .pull()
+ .setRebase(true)
+ .setRemote("origin")
+ return this
+ }
+
+ override fun execute() {
+ if (this.provider != null) {
+ (this.command as PullCommand).setCredentialsProvider(this.provider)
+ }
+ GitAsyncTask(callingActivity, true, false, this).execute(this.command)
+ }
+
+ override fun onError(errorMessage: String) {
+ AlertDialog.Builder(callingActivity)
+ .setTitle(callingActivity.resources.getString(R.string.jgit_error_dialog_title))
+ .setMessage("Error occured during the pull operation, "
+ + callingActivity.resources.getString(R.string.jgit_error_dialog_text)
+ + errorMessage
+ + "\nPlease check the FAQ for possible reasons why this error might occur.")
+ .setPositiveButton(callingActivity.resources.getString(R.string.dialog_ok)) { _, _ -> callingActivity.finish() }
+ .show()
+ }
+}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/PushOperation.java b/app/src/main/java/com/zeapo/pwdstore/git/PushOperation.java
deleted file mode 100644
index 056b7034..00000000
--- a/app/src/main/java/com/zeapo/pwdstore/git/PushOperation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.zeapo.pwdstore.git;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import com.zeapo.pwdstore.R;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.PushCommand;
-
-import java.io.File;
-
-public class PushOperation extends GitOperation {
-
- /**
- * Creates a new git operation
- *
- * @param fileDir the git working tree directory
- * @param callingActivity the calling activity
- */
- public PushOperation(File fileDir, Activity callingActivity) {
- super(fileDir, callingActivity);
- }
-
- /**
- * Sets the command
- *
- * @return the current object
- */
- public PushOperation setCommand() {
- this.command = new Git(repository)
- .push()
- .setPushAll()
- .setRemote("origin");
- return this;
- }
-
- @Override
- public void execute() {
- if (this.provider != null) {
- ((PushCommand) this.command).setCredentialsProvider(this.provider);
- }
- new GitAsyncTask(callingActivity, true, false, this).execute(this.command);
- }
-
- @Override
- public void onError(String errorMessage) {
- // TODO handle the "Nothing to push" case
- new AlertDialog.Builder(callingActivity).
- setTitle(callingActivity.getResources().getString(R.string.jgit_error_dialog_title)).
- setMessage(callingActivity.getString(R.string.jgit_error_push_dialog_text) + errorMessage).
- setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), (dialogInterface, i) -> callingActivity.finish()).show();
- }
-}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/PushOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/PushOperation.kt
new file mode 100644
index 00000000..9674e5b0
--- /dev/null
+++ b/app/src/main/java/com/zeapo/pwdstore/git/PushOperation.kt
@@ -0,0 +1,47 @@
+package com.zeapo.pwdstore.git
+
+import android.app.Activity
+import android.app.AlertDialog
+import com.zeapo.pwdstore.R
+import org.eclipse.jgit.api.Git
+import org.eclipse.jgit.api.PushCommand
+
+import java.io.File
+
+/**
+ * Creates a new git operation
+ *
+ * @param fileDir the git working tree directory
+ * @param callingActivity the calling activity
+ */
+class PushOperation(fileDir: File, callingActivity: Activity) : GitOperation(fileDir, callingActivity) {
+
+ /**
+ * Sets the command
+ *
+ * @return the current object
+ */
+ fun setCommand(): PushOperation {
+ this.command = Git(repository)
+ .push()
+ .setPushAll()
+ .setRemote("origin")
+ return this
+ }
+
+ override fun execute() {
+ if (this.provider != null) {
+ (this.command as PushCommand).setCredentialsProvider(this.provider)
+ }
+ GitAsyncTask(callingActivity, true, false, this).execute(this.command)
+ }
+
+ override fun onError(errorMessage: String) {
+ // TODO handle the "Nothing to push" case
+ AlertDialog.Builder(callingActivity)
+ .setTitle(callingActivity.resources.getString(R.string.jgit_error_dialog_title))
+ .setMessage(callingActivity.getString(R.string.jgit_error_push_dialog_text) + errorMessage)
+ .setPositiveButton(callingActivity.resources.getString(R.string.dialog_ok)) { _, _ -> callingActivity.finish() }
+ .show()
+ }
+}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/SyncOperation.java b/app/src/main/java/com/zeapo/pwdstore/git/SyncOperation.java
deleted file mode 100644
index 266dd096..00000000
--- a/app/src/main/java/com/zeapo/pwdstore/git/SyncOperation.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.zeapo.pwdstore.git;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import com.zeapo.pwdstore.R;
-import org.eclipse.jgit.api.AddCommand;
-import org.eclipse.jgit.api.CommitCommand;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.PullCommand;
-import org.eclipse.jgit.api.PushCommand;
-import org.eclipse.jgit.api.StatusCommand;
-
-import java.io.File;
-
-public class SyncOperation extends GitOperation {
- private AddCommand addCommand;
- private StatusCommand statusCommand;
- private CommitCommand commitCommand;
- private PullCommand pullCommand;
- private PushCommand pushCommand;
-
- /**
- * Creates a new git operation
- *
- * @param fileDir the git working tree directory
- * @param callingActivity the calling activity
- */
- public SyncOperation(File fileDir, Activity callingActivity) {
- super(fileDir, callingActivity);
- }
-
- /**
- * Sets the command
- *
- * @return the current object
- */
- public SyncOperation setCommands() {
- Git git = new Git(repository);
- this.addCommand = git.add().addFilepattern(".");
- this.statusCommand = git.status();
- this.commitCommand = git.commit().setAll(true).setMessage("[Android Password Store] Sync");
- this.pullCommand = git.pull().setRebase(true).setRemote("origin");
- this.pushCommand = git.push().setPushAll().setRemote("origin");
- return this;
- }
-
- @Override
- public void execute() {
- if (this.provider != null) {
- this.pullCommand.setCredentialsProvider(this.provider);
- this.pushCommand.setCredentialsProvider(this.provider);
- }
- new GitAsyncTask(callingActivity, true, false, this).execute(this.addCommand, this.statusCommand, this.commitCommand, this.pullCommand, this.pushCommand);
- }
-
- @Override
- public void onError(String errorMessage) {
- new AlertDialog.Builder(callingActivity).
- setTitle(callingActivity.getResources().getString(R.string.jgit_error_dialog_title)).
- setMessage("Error occured during the sync operation, "
- + "\nPlease check the FAQ for possible reasons why this error might occur."
- + callingActivity.getResources().getString(R.string.jgit_error_dialog_text)
- + errorMessage).
- setPositiveButton(callingActivity.getResources().getString(R.string.dialog_ok), (dialogInterface, i) -> callingActivity.finish()).show();
- }
-}
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/SyncOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/SyncOperation.kt
new file mode 100644
index 00000000..8712a200
--- /dev/null
+++ b/app/src/main/java/com/zeapo/pwdstore/git/SyncOperation.kt
@@ -0,0 +1,60 @@
+package com.zeapo.pwdstore.git
+
+import android.app.Activity
+import android.app.AlertDialog
+import com.zeapo.pwdstore.R
+import org.eclipse.jgit.api.AddCommand
+import org.eclipse.jgit.api.CommitCommand
+import org.eclipse.jgit.api.Git
+import org.eclipse.jgit.api.PullCommand
+import org.eclipse.jgit.api.PushCommand
+import org.eclipse.jgit.api.StatusCommand
+
+import java.io.File
+
+/**
+ * Creates a new git operation
+ *
+ * @param fileDir the git working tree directory
+ * @param callingActivity the calling activity
+ */
+class SyncOperation(fileDir: File, callingActivity: Activity) : GitOperation(fileDir, callingActivity) {
+ private var addCommand: AddCommand? = null
+ private var statusCommand: StatusCommand? = null
+ private var commitCommand: CommitCommand? = null
+ private var pullCommand: PullCommand? = null
+ private var pushCommand: PushCommand? = null
+
+ /**
+ * Sets the command
+ *
+ * @return the current object
+ */
+ fun setCommands(): SyncOperation {
+ val git = Git(repository)
+ this.addCommand = git.add().addFilepattern(".")
+ this.statusCommand = git.status()
+ this.commitCommand = git.commit().setAll(true).setMessage("[Android Password Store] Sync")
+ this.pullCommand = git.pull().setRebase(true).setRemote("origin")
+ this.pushCommand = git.push().setPushAll().setRemote("origin")
+ return this
+ }
+
+ override fun execute() {
+ if (this.provider != null) {
+ this.pullCommand!!.setCredentialsProvider(this.provider)
+ this.pushCommand!!.setCredentialsProvider(this.provider)
+ }
+ GitAsyncTask(callingActivity, true, false, this).execute(this.addCommand, this.statusCommand, this.commitCommand, this.pullCommand, this.pushCommand)
+ }
+
+ override fun onError(errorMessage: String) {
+ AlertDialog.Builder(callingActivity).setTitle(callingActivity.resources.getString(R.string.jgit_error_dialog_title))
+ .setMessage("Error occured during the sync operation, "
+ + "\nPlease check the FAQ for possible reasons why this error might occur."
+ + callingActivity.resources.getString(R.string.jgit_error_dialog_text)
+ + errorMessage)
+ .setPositiveButton(callingActivity.resources.getString(R.string.dialog_ok)) { _, _ -> callingActivity.finish() }
+ .show()
+ }
+}