diff options
Diffstat (limited to 'app/src/main/java')
5 files changed, 83 insertions, 149 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java b/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java index c2a6f28f..26ad8c7c 100644 --- a/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java +++ b/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java @@ -1,10 +1,15 @@ package com.zeapo.pwdstore; import android.app.Activity; +import android.app.AlertDialog; import android.app.ProgressDialog; +import android.content.DialogInterface; import android.os.AsyncTask; import android.util.Log; +import com.zeapo.pwdstore.utils.PasswordRepository; + +import org.apache.commons.io.FileUtils; import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.GitCommand; @@ -13,16 +18,18 @@ import org.eclipse.jgit.api.errors.JGitInternalException; import org.eclipse.jgit.api.errors.TransportException; -public class GitAsyncTask extends AsyncTask<GitCommand, Integer, Integer> { +public class GitAsyncTask extends AsyncTask<GitCommand, Integer, String> { private Activity activity; private boolean finishOnEnd; private boolean refreshListOnEnd; private ProgressDialog dialog; + private Class operation; - public GitAsyncTask(Activity activity, boolean finishOnEnd, boolean refreshListOnEnd) { + public GitAsyncTask(Activity activity, boolean finishOnEnd, boolean refreshListOnEnd, Class operation) { this.activity = activity; this.finishOnEnd = finishOnEnd; this.refreshListOnEnd = refreshListOnEnd; + this.operation = operation; dialog = new ProgressDialog(this.activity); } @@ -34,43 +41,55 @@ public class GitAsyncTask extends AsyncTask<GitCommand, Integer, Integer> { } @Override - protected Integer doInBackground(GitCommand... cmd) { + protected String doInBackground(GitCommand... cmd) { int count = cmd.length; - Integer totalSize = 0; for (int i = 0; i < count; i++) { try { cmd[i].call(); - } catch (JGitInternalException e) { - e.printStackTrace(); - return -99; - } catch (InvalidRemoteException e) { - e.printStackTrace(); - return -1; - } catch (TransportException e) { - e.printStackTrace(); - return -2; } catch (Exception e) { e.printStackTrace(); - return -98; + return e.getMessage(); } - totalSize++; } - return totalSize; + return ""; } - protected void onPostExecute(Integer result) { - Log.i("GIT_ASYNC", result + ""); + protected void onPostExecute(String result) { this.dialog.dismiss(); - if (finishOnEnd) { - this.activity.setResult(Activity.RESULT_OK); - this.activity.finish(); - } - if (refreshListOnEnd) { - try { - ((PasswordStore) this.activity).refreshListAdapter(); - } catch (ClassCastException e){ - // oups, mistake + if (!result.isEmpty()) { + new AlertDialog.Builder(activity). + setTitle("Internal exception occurred"). + setMessage("Message from jgit:\n" + result). + setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (operation.equals(CloneCommand.class)) { + // if we were unable to finish the job + try { + FileUtils.deleteDirectory(PasswordRepository.getWorkTree()); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + activity.setResult(Activity.RESULT_CANCELED); + activity.finish(); + } + } + }).show(); + + } else { + if (finishOnEnd) { + this.activity.setResult(Activity.RESULT_OK); + this.activity.finish(); + } + + if (refreshListOnEnd) { + try { + ((PasswordStore) this.activity).refreshListAdapter(); + } catch (ClassCastException e) { + // oups, mistake + } } } } diff --git a/app/src/main/java/com/zeapo/pwdstore/GitHandler.java b/app/src/main/java/com/zeapo/pwdstore/GitHandler.java index ba42f867..c487ce0f 100644 --- a/app/src/main/java/com/zeapo/pwdstore/GitHandler.java +++ b/app/src/main/java/com/zeapo/pwdstore/GitHandler.java @@ -2,12 +2,10 @@ package com.zeapo.pwdstore; import android.app.Activity; import android.app.AlertDialog; -import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; -import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.text.InputType; @@ -32,9 +30,8 @@ import org.eclipse.jgit.api.Git; import org.apache.commons.io.FileUtils; import org.eclipse.jgit.api.GitCommand; -import org.eclipse.jgit.api.errors.InvalidRemoteException; -import org.eclipse.jgit.api.errors.JGitInternalException; -import org.eclipse.jgit.api.errors.TransportException; +import org.eclipse.jgit.api.PullCommand; +import org.eclipse.jgit.api.PushCommand; import org.eclipse.jgit.errors.UnsupportedCredentialItem; import org.eclipse.jgit.transport.CredentialItem; import org.eclipse.jgit.transport.CredentialsProvider; @@ -200,99 +197,6 @@ public class GitHandler extends Activity { return super.onOptionsItemSelected(item); } - /* The clone process has to be on a different thread than the main one */ - private class CloneTask extends AsyncTask<CloneCommand, Integer, Integer> { - private ProgressDialog dialog; - - public CloneTask(Activity activity) { - context = activity; - dialog = new ProgressDialog(context); - } - - protected void onPreExecute() { - this.dialog.setMessage("Cloning..."); - this.dialog.setCancelable(false); - // TODO: Handle a dialog leak when there is no error - this.dialog.show(); - } - - protected void onPostExecute(Integer result) { - switch (result) { - case -1: - new AlertDialog.Builder(activity). - setTitle("Please check that the repository path is correct."). - setMessage("Did you forget to specify the path after the hostname?"). - setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } - }).show(); - break; - case -2: - new AlertDialog.Builder(activity). - setTitle("Communication error"). - setMessage("JGit said that the server didn't like our request. Either an authentication issue or the host is not reachable. Check the debug messages."). - setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } - }).show(); - break; - case -99: - new AlertDialog.Builder(activity). - setTitle("JGit raised an internal exception"). - setMessage("OUPS, JGit didn't like what you did... Check that you provided it with a correct URI. Check also debug messages."). - setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } - }).show(); - break; - default: - this.dialog.dismiss(); - setResult(RESULT_OK); - finish(); - return; - } - this.dialog.dismiss(); - - // if we were unable to finish the job - try { - FileUtils.deleteDirectory(localDir); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - protected Integer doInBackground(CloneCommand... cmd) { - int count = cmd.length; - Integer totalSize = 0; - for (int i = 0; i < count; i++) { - try { - cmd[i].call(); - } catch (JGitInternalException e) { - e.printStackTrace(); - return -99; - } catch (InvalidRemoteException e) { - e.printStackTrace(); - return -1; - } catch (TransportException e) { - e.printStackTrace(); - return -2; - } catch (Exception e) { - e.printStackTrace(); - return -99; - } - totalSize++; - } - return totalSize; - } - } - protected class GitConfigSessionFactory extends JschConfigSessionFactory { protected void configure(OpenSshConfig.Host hc, Session session) { @@ -452,7 +356,7 @@ public class GitHandler extends Activity { setDirectory(localDir). setURI(hostname); - new CloneTask(activity).execute(cmd); + new GitAsyncTask(activity, true, false, CloneCommand.class).execute(cmd); } public void pullOperation(UsernamePasswordCredentialsProvider provider) { @@ -500,7 +404,7 @@ public class GitHandler extends Activity { .setRebase(true) .setRemote("origin"); - new GitAsyncTask(activity, true, false).execute(cmd); + new GitAsyncTask(activity, true, false, PullCommand.class).execute(cmd); } } @@ -550,7 +454,7 @@ public class GitHandler extends Activity { .setRemote("origin"); - new GitAsyncTask(activity, true, false).execute(cmd); + new GitAsyncTask(activity, true, false, PushCommand.class).execute(cmd); } } @@ -661,14 +565,7 @@ public class GitHandler extends Activity { } }).show(); } else { - CloneCommand cmd = Git.cloneRepository() - .setDirectory(localDir) - .setURI(hostname) - .setBare(false) - .setNoCheckout(false) - .setCloneAllBranches(true); - - new CloneTask(activity).execute(cmd); + // BUG: we do not support HTTP yet... } } } diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java index 3234c1f6..4fadb65e 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java @@ -28,6 +28,7 @@ import com.zeapo.pwdstore.utils.PasswordItem; import com.zeapo.pwdstore.utils.PasswordRepository; import org.apache.commons.io.FileUtils; +import org.eclipse.jgit.api.CommitCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.JschConfigSessionFactory; @@ -214,6 +215,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI } private void checkLocalRepository(File localDir) { + Log.d("PASS", localDir.getAbsolutePath()); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); @@ -323,7 +325,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI setResult(RESULT_CANCELED); Git git = new Git(PasswordRepository.getRepository(new File(""))); - GitAsyncTask tasks = new GitAsyncTask(activity, false, true); + GitAsyncTask tasks = new GitAsyncTask(activity, false, true, CommitCommand.class); System.out.println(tasks); tasks.execute( git.rm().addFilepattern(path.replace(PasswordRepository.getWorkTree() + "/", "")), @@ -366,7 +368,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI switch (requestCode) { case PgpHandler.REQUEST_CODE_ENCRYPT : Git git = new Git(PasswordRepository.getRepository(new File(""))); - GitAsyncTask tasks = new GitAsyncTask(this, false, false); + GitAsyncTask tasks = new GitAsyncTask(this, false, false, CommitCommand.class); tasks.execute( git.add().addFilepattern("."), git.commit().setMessage("[ANDROID PwdStore] Add " + data.getExtras().getString("NAME") + " from store.") diff --git a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java index f80893a4..3213fd2e 100644 --- a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java +++ b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java @@ -63,6 +63,7 @@ public class PgpHandler extends Activity implements OpenPgpServiceConnection.OnB private ProgressDialog bindingDialog; + private boolean registered; public static final int REQUEST_CODE_SIGN = 9910; public static final int REQUEST_CODE_ENCRYPT = 9911; @@ -90,6 +91,8 @@ public class PgpHandler extends Activity implements OpenPgpServiceConnection.OnB accountName = settings.getString("openpgp_account_name", ""); keyIDs = settings.getString("openpgp_key_ids", ""); + registered = false; + if (TextUtils.isEmpty(providerPackageName)) { Toast.makeText(this, "No OpenPGP Provider selected!", Toast.LENGTH_LONG).show(); Intent intent = new Intent(this, UserPreference.class); @@ -110,6 +113,8 @@ public class PgpHandler extends Activity implements OpenPgpServiceConnection.OnB bindingDialog.setCancelable(false); bindingDialog.show(); + registered = true; + ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); } @@ -118,8 +123,12 @@ public class PgpHandler extends Activity implements OpenPgpServiceConnection.OnB @Override public void onStop(){ super.onStop(); - if (this.mServiceConnection.isBound()) - this.mServiceConnection.unbindFromService(); + if (this.registered && this.mServiceConnection.isBound()) + try { + this.mServiceConnection.unbindFromService(); + } catch (Exception e){ + + } } @Override diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java index eda32b0a..289f9f43 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PasswordRepository.java @@ -1,6 +1,9 @@ package com.zeapo.pwdstore.utils; +import android.util.Log; + import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.FileFilterUtils; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.lib.Repository; @@ -10,7 +13,10 @@ import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.jgit.transport.URIish; import java.io.File; +import java.io.FileFilter; +import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; @@ -115,7 +121,10 @@ public class PasswordRepository { public static ArrayList<File> getFilesList(File path){ if (!path.exists()) return new ArrayList<File>(); - List<File> files = (List<File>) FileUtils.listFiles(path, new String[] {"gpg"}, true); + Log.d("REPO", path.getAbsolutePath()); + ArrayList<File> files = new ArrayList<File>(Arrays.asList(path.listFiles((FileFilter) FileFilterUtils.directoryFileFilter()))); + files.addAll( new ArrayList<File>((List<File>)FileUtils.listFiles(path, new String[] {"gpg"}, false))); + return new ArrayList<File>(files); } @@ -129,15 +138,13 @@ public class PasswordRepository { ArrayList<PasswordItem> passwordList = new ArrayList<PasswordItem>(); for (File file : passList) { - String fileName = file.getAbsolutePath().replace(path.getAbsolutePath() + "/", ""); - - String[] parts = fileName.split("/"); - if (parts.length == 1) { - passwordList.add(PasswordItem.newPassword(parts[0], file)); + if (file.isFile()) { + passwordList.add(PasswordItem.newPassword(file.getName(), file)); } else { - if (!passwordList.contains(PasswordItem.newCategory(parts[0], file.getParentFile()))) { - passwordList.add(PasswordItem.newCategory(parts[0], file.getParentFile())); - } + // ignore .git directory + if (file.getName().equals(".git")) + continue; + passwordList.add(PasswordItem.newCategory(file.getName(), file)); } } sort(passwordList); |