diff options
author | Zeapo <mohamed@zenadi.com> | 2014-08-08 18:46:35 +0100 |
---|---|---|
committer | Zeapo <mohamed@zenadi.com> | 2014-08-08 18:46:35 +0100 |
commit | 42f1abfa76f06ee6d0a0e3bd5cc13b4afb1922a4 (patch) | |
tree | e52d5f06b8ce3107c3accdb1321cbba34b026166 | |
parent | 9db42440fb61f7e3b18f36532117f2247392dfe1 (diff) |
more refactoring and ability to pull from server
-rw-r--r-- | app/src/main/AndroidManifest.xml | 2 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java | 52 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/GitHandler.java (renamed from app/src/main/java/com/zeapo/pwdstore/GitClone.java) | 172 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/PasswordStore.java | 52 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java | 24 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_git_clone.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/menu/git_clone.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/menu/pwdstore.xml | 7 | ||||
-rw-r--r-- | app/src/main/res/xml/preference.xml | 6 |
9 files changed, 217 insertions, 102 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 822ad8cd..815febe3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ </intent-filter> </activity> <activity - android:name=".GitClone" + android:name=".GitHandler" android:label="@string/title_activity_git_clone" android:parentActivityName=".PasswordStore"> <meta-data diff --git a/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java b/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java new file mode 100644 index 00000000..cc8938fb --- /dev/null +++ b/app/src/main/java/com/zeapo/pwdstore/GitAsyncTask.java @@ -0,0 +1,52 @@ +package com.zeapo.pwdstore; + +import android.app.Activity; +import android.os.AsyncTask; +import android.util.Log; + +import org.eclipse.jgit.api.CloneCommand; +import org.eclipse.jgit.api.Git; +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; + + +public class GitAsyncTask extends AsyncTask<GitCommand, Integer, Integer> { + private Activity activity; + private boolean finishOnEnd; + public GitAsyncTask(Activity activity, boolean finishOnEnd) { + this.activity = activity; + this.finishOnEnd = finishOnEnd; + } + @Override + protected Integer 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(); + } + totalSize++; + } + return totalSize; + } + + protected void onPostExecute(Integer result) { + Log.i("GIT_ASYNC", result + ""); + if (finishOnEnd) { + this.activity.finish(); + } + } +} diff --git a/app/src/main/java/com/zeapo/pwdstore/GitClone.java b/app/src/main/java/com/zeapo/pwdstore/GitHandler.java index 7e192e25..459a8c39 100644 --- a/app/src/main/java/com/zeapo/pwdstore/GitClone.java +++ b/app/src/main/java/com/zeapo/pwdstore/GitHandler.java @@ -22,6 +22,7 @@ import android.widget.TextView; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; +import com.zeapo.pwdstore.utils.PasswordRepository; import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; @@ -30,31 +31,18 @@ import org.apache.commons.io.FileUtils; 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.errors.NotSupportedException; -import org.eclipse.jgit.internal.storage.file.FileRepository; -import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.storage.file.FileRepositoryBuilder; import org.eclipse.jgit.transport.JschConfigSessionFactory; import org.eclipse.jgit.transport.OpenSshConfig; -import org.eclipse.jgit.transport.RefSpec; -import org.eclipse.jgit.transport.RemoteConfig; import org.eclipse.jgit.transport.SshSessionFactory; -import org.eclipse.jgit.transport.Transport; -import org.eclipse.jgit.transport.URIish; import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; import org.eclipse.jgit.util.FS; import java.io.File; import java.io.IOException; -import java.net.InetAddress; -import java.net.URI; -import java.net.URL; -import java.net.UnknownHostException; // TODO move the messages to strings.xml -public class GitClone extends Activity { +public class GitHandler extends Activity { private Activity activity; private Context context; @@ -66,81 +54,95 @@ public class GitClone extends Activity { private String hostname; private String username; + public static final int REQUEST_PULL = 101; + public static final int REQUEST_PUSH = 102; + public static final int REQUEST_CLONE = 103; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_git_clone); context = getApplicationContext(); activity = this; - // init the spinner for protocols - Spinner protcol_spinner = (Spinner) findViewById(R.id.clone_protocol); - ArrayAdapter<CharSequence> protocol_adapter = ArrayAdapter.createFromResource(this, - R.array.clone_protocols, android.R.layout.simple_spinner_item); - protocol_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - protcol_spinner.setAdapter(protocol_adapter); - protcol_spinner.setOnItemSelectedListener( - new AdapterView.OnItemSelectedListener() { + switch (getIntent().getExtras().getInt("Operation")) { + case REQUEST_CLONE: + setContentView(R.layout.activity_git_clone); + + // init the spinner for protocols + Spinner protcol_spinner = (Spinner) findViewById(R.id.clone_protocol); + ArrayAdapter<CharSequence> protocol_adapter = ArrayAdapter.createFromResource(this, + R.array.clone_protocols, android.R.layout.simple_spinner_item); + protocol_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + protcol_spinner.setAdapter(protocol_adapter); + protcol_spinner.setOnItemSelectedListener( + new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { + protocol = ((Spinner)findViewById(R.id.clone_protocol)).getSelectedItem().toString(); + if (protocol.equals("ssh://")) { + ((EditText)findViewById(R.id.clone_uri)).setHint("user@hostname:path"); + } else { + ((EditText)findViewById(R.id.clone_uri)).setHint("hostname/path"); + new AlertDialog.Builder(activity). + setMessage("You are about to use a read-only repository, you will not be able to push to it"). + setCancelable(true). + setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + + } + }).show(); + } + } + + @Override + public void onNothingSelected(AdapterView<?> adapterView) { + + } + } + ); + + // init the spinner for connection modes + Spinner connection_mode_spinner = (Spinner) findViewById(R.id.connection_mode); + ArrayAdapter<CharSequence> connection_mode_adapter = ArrayAdapter.createFromResource(this, + R.array.connection_modes, android.R.layout.simple_spinner_item); + connection_mode_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + connection_mode_spinner.setAdapter(connection_mode_adapter); + connection_mode_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { - protocol = ((Spinner)findViewById(R.id.clone_protocol)).getSelectedItem().toString(); - if (protocol.equals("ssh://")) { - ((EditText)findViewById(R.id.clone_uri)).setHint("user@hostname:path"); + String selection = ((Spinner) findViewById(R.id.connection_mode)).getSelectedItem().toString(); + + if (selection.equalsIgnoreCase("ssh-key")) { + new AlertDialog.Builder(activity) + .setMessage("Authentication method not implemented yet") + .setPositiveButton("OK", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + } + ).show(); + ((Button) findViewById(R.id.clone_button)).setEnabled(false); } else { - ((EditText)findViewById(R.id.clone_uri)).setHint("hostname/path"); - new AlertDialog.Builder(activity). - setMessage("You are about to use a read-only repository, you will not be able to push to it"). - setCancelable(true). - setPositiveButton("OK", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - - } - }).show(); + ((Button) findViewById(R.id.clone_button)).setEnabled(true); } + connectionMode = selection; } @Override public void onNothingSelected(AdapterView<?> adapterView) { } - } - ); - - // init the spinner for connection modes - Spinner connection_mode_spinner = (Spinner) findViewById(R.id.connection_mode); - ArrayAdapter<CharSequence> connection_mode_adapter = ArrayAdapter.createFromResource(this, - R.array.connection_modes, android.R.layout.simple_spinner_item); - connection_mode_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - connection_mode_spinner.setAdapter(connection_mode_adapter); - connection_mode_spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { - String selection = ((Spinner) findViewById(R.id.connection_mode)).getSelectedItem().toString(); - - if (selection.equalsIgnoreCase("ssh-key")) { - new AlertDialog.Builder(activity) - .setMessage("Authentication method not implemented yet") - .setPositiveButton("OK", - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - } - ).show(); - ((Button) findViewById(R.id.clone_button)).setEnabled(false); - } else { - ((Button) findViewById(R.id.clone_button)).setEnabled(true); - } - connectionMode = selection; - } + }); + break; + case REQUEST_PULL: + authenticateThenPull(this); + break; + } - @Override - public void onNothingSelected(AdapterView<?> adapterView) { - } - }); } @Override @@ -380,6 +382,36 @@ public class GitClone extends Activity { } } + private void authenticateThenPull(final Activity activity) { + //TODO recall the username + //TODO offer the choice ssh and user/pwd + final EditText password = new EditText(activity); + password.setHint("Password"); + password.setWidth(LinearLayout.LayoutParams.MATCH_PARENT); + password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + + new AlertDialog.Builder(activity) + .setTitle("Authenticate") + .setMessage("Please provide the password for this repository") + .setView(password) + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + + SshSessionFactory.setInstance(new GitConfigSessionFactory()); + + new GitAsyncTask(activity, true).execute(new Git(PasswordRepository.getRepository(new File(""))) + .pull() + .setRebase(true) + .setCredentialsProvider(new UsernamePasswordCredentialsProvider("git", password.getText().toString()))); + + + } + }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + // Do nothing. + } + }).show(); + } } diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java index 75437fa6..4868c9a5 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java @@ -1,26 +1,35 @@ package com.zeapo.pwdstore; -import android.app.ActionBar; import android.app.Activity; +import android.app.AlertDialog; import android.app.FragmentManager; import android.app.FragmentTransaction; -import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; -import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; +import android.text.InputType; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; -import android.view.WindowManager; -import android.widget.PopupWindow; +import android.widget.EditText; +import android.widget.LinearLayout; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; import com.zeapo.pwdstore.crypto.PgpHandler; import com.zeapo.pwdstore.utils.PasswordItem; import com.zeapo.pwdstore.utils.PasswordRepository; import org.apache.commons.io.FileUtils; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.transport.JschConfigSessionFactory; +import org.eclipse.jgit.transport.OpenSshConfig; +import org.eclipse.jgit.transport.SshSessionFactory; +import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; +import org.eclipse.jgit.util.FS; import java.io.File; import java.io.IOException; @@ -85,9 +94,19 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI createPassword(getCurrentFocus()); break; - case R.id.menu_add_category: +// case R.id.menu_add_category: +// break; + + case R.id.git_push: break; + case R.id.git_pull: + Intent intent = new Intent(this, GitHandler.class); + intent.putExtra("Operation", GitHandler.REQUEST_PULL); + startActivity(intent); + this.leftActivity = true; + return true; + case R.id.referesh: refreshListAdapter(); return true; @@ -100,7 +119,8 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI } public void getClone(View view){ - Intent intent = new Intent(this, GitClone.class); + Intent intent = new Intent(this, GitHandler.class); + intent.putExtra("Operation", GitHandler.REQUEST_CLONE); startActivity(intent); } @@ -183,7 +203,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI intent.putExtra("NAME", item.toString()); intent.putExtra("FILE_PATH", item.getFile().getAbsolutePath()); intent.putExtra("Operation", "DECRYPT"); - startActivityForResult(intent, 0); + startActivityForResult(intent, PgpHandler.REQUEST_CODE_DECRYPT_AND_VERIFY); } catch (IOException e) { e.printStackTrace(); @@ -207,8 +227,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI intent.putExtra("PGP-ID", FileUtils.readFileToString(PasswordRepository.getFile("/.gpg-id"))); intent.putExtra("FILE_PATH", this.currentDir.getAbsolutePath()); intent.putExtra("Operation", "ENCRYPT"); - // TODO Define different operations here - startActivityForResult(intent, 0); + startActivityForResult(intent, PgpHandler.REQUEST_CODE_ENCRYPT); } catch (Exception e) { e.printStackTrace(); } @@ -231,10 +250,17 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI if (resultCode == RESULT_OK) { refreshListAdapter(); - // do not froget to commit the file - if (requestCode == PgpHandler.REQUEST_CODE_ENCRYPT) { - + switch (requestCode) { + case PgpHandler.REQUEST_CODE_ENCRYPT : + Git git = new Git(PasswordRepository.getRepository(new File(""))); + GitAsyncTask tasks = new GitAsyncTask(this, false); + tasks.execute( + git.add().addFilepattern(data.getExtras().getString("CREATED_FILE")), + git.commit().setMessage("Added " + data.getExtras().getString("NAME")) + ); + break; } + } } } 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 b3caea49..4cde1453 100644 --- a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java +++ b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java @@ -294,20 +294,15 @@ public class PgpHandler extends Activity { // encrypt if (requestCode == REQUEST_CODE_ENCRYPT && os != null) { try { - Log.d(OpenPgpApi.TAG, "result: " + os.toByteArray().length - + " str=" + os.toString("UTF-8")); - - if (returnToCiphertextField) { - String path = getIntent().getExtras().getString("FILE_PATH") - + "/" + ((EditText) findViewById(R.id.crypto_password_file_edit)).getText().toString() - + ".gpg"; - OutputStream outputStream = FileUtils.openOutputStream(new File(path)); - outputStream.write(os.toByteArray()); - } else { - showToast(os.toString()); - } - - setResult(RESULT_OK); + String path = getIntent().getExtras().getString("FILE_PATH") + + "/" + ((EditText) findViewById(R.id.crypto_password_file_edit)).getText().toString() + + ".gpg"; + OutputStream outputStream = FileUtils.openOutputStream(new File(path)); + outputStream.write(os.toByteArray()); + Intent data = new Intent(); + data.putExtra("CREATED_FILE", path); + data.putExtra("NAME", ((EditText) findViewById(R.id.crypto_password_file_edit)).getText().toString()); + setResult(RESULT_OK, data); finish(); } catch (Exception e) { Log.e(Constants.TAG, "UnsupportedEncodingException", e); @@ -406,7 +401,6 @@ public class PgpHandler extends Activity { data.setAction(OpenPgpApi.ACTION_ENCRYPT); data.putExtra(OpenPgpApi.EXTRA_USER_IDS, new String[]{accountName}); data.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); - Log.i("BABABOU", settings.getString("openpgpg_key_ids", "") + ""); String name = ((EditText) findViewById(R.id.crypto_password_file_edit)).getText().toString(); String pass = ((EditText) findViewById(R.id.crypto_password_edit)).getText().toString(); diff --git a/app/src/main/res/layout/activity_git_clone.xml b/app/src/main/res/layout/activity_git_clone.xml index 8c0a3336..d4ccbc8a 100644 --- a/app/src/main/res/layout/activity_git_clone.xml +++ b/app/src/main/res/layout/activity_git_clone.xml @@ -6,7 +6,7 @@ android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" - tools:context="com.zeapo.pwdstore.GitClone"> + tools:context="com.zeapo.pwdstore.GitHandler"> <LinearLayout android:orientation="vertical" diff --git a/app/src/main/res/menu/git_clone.xml b/app/src/main/res/menu/git_clone.xml index 2227d87d..88a18d2c 100644 --- a/app/src/main/res/menu/git_clone.xml +++ b/app/src/main/res/menu/git_clone.xml @@ -1,6 +1,6 @@ <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" - tools:context="com.zeapo.pwdstore.GitClone" > + tools:context="com.zeapo.pwdstore.GitHandler" > <item android:id="@+id/action_settings" android:title="@string/action_settings" android:orderInCategory="100" diff --git a/app/src/main/res/menu/pwdstore.xml b/app/src/main/res/menu/pwdstore.xml index 0458ace5..facca6c4 100644 --- a/app/src/main/res/menu/pwdstore.xml +++ b/app/src/main/res/menu/pwdstore.xml @@ -7,8 +7,13 @@ <!--<item android:id="@+id/menu_add_category"--> <!--android:title="New category"/>--> + <item android:id="@+id/git_pull" + android:title="Pull from remote"/> + <item android:id="@+id/git_push" + android:title="Push to remote"/> + <item android:id="@+id/referesh" - android:title="Refresh" + android:title="Refresh list" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_popup_sync"/> diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml index d73dd5ec..45497dbe 100644 --- a/app/src/main/res/xml/preference.xml +++ b/app/src/main/res/xml/preference.xml @@ -1,5 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> + <PreferenceCategory android:title="Git"> + <EditTextPreference android:title="Server" + android:key="git_remote_server"/> + <EditTextPreference android:title="Username" + android:key="git_remote_username"/> + </PreferenceCategory> <PreferenceCategory android:title="Crypto"> <org.openintents.openpgp.util.OpenPgpListPreference |