aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/com/zeapo/pwdstore/GitClone.java
diff options
context:
space:
mode:
authorZeapo <mohamed@zenadi.com>2014-08-08 18:46:35 +0100
committerZeapo <mohamed@zenadi.com>2014-08-08 18:46:35 +0100
commit42f1abfa76f06ee6d0a0e3bd5cc13b4afb1922a4 (patch)
treee52d5f06b8ce3107c3accdb1321cbba34b026166 /app/src/main/java/com/zeapo/pwdstore/GitClone.java
parent9db42440fb61f7e3b18f36532117f2247392dfe1 (diff)
downloadHardenedPass-42f1abfa76f06ee6d0a0e3bd5cc13b4afb1922a4.tar.gz
HardenedPass-42f1abfa76f06ee6d0a0e3bd5cc13b4afb1922a4.zip
more refactoring and ability to pull from server
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/GitClone.java')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/GitClone.java385
1 files changed, 0 insertions, 385 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/GitClone.java b/app/src/main/java/com/zeapo/pwdstore/GitClone.java
deleted file mode 100644
index 7e192e25..00000000
--- a/app/src/main/java/com/zeapo/pwdstore/GitClone.java
+++ /dev/null
@@ -1,385 +0,0 @@
-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.os.AsyncTask;
-import android.os.Bundle;
-import android.text.InputType;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.JSchException;
-import com.jcraft.jsch.Session;
-
-import org.eclipse.jgit.api.CloneCommand;
-import org.eclipse.jgit.api.Git;
-
-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 {
-
- private Activity activity;
- private Context context;
-
- private String protocol;
- private String connectionMode;
-
- private File localDir;
- private String hostname;
- private String username;
-
- @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() {
- @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) {
- 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;
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> adapterView) {
-
- }
- });
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.git_clone, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- if (id == R.id.action_settings) {
- return true;
- }
- 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);
- 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();
- default:
- this.dialog.dismiss();
- setResult(RESULT_OK);
- finish();
- return;
- }
- this.dialog.dismiss();
- }
-
-
- 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) {
- return -99;
- } catch (InvalidRemoteException e) {
- return -1;
- } catch (TransportException e) {
- return -2;
- } catch (Exception e) {
- e.printStackTrace();
- }
- totalSize++;
- }
- return totalSize;
- }
- }
-
- protected class GitConfigSessionFactory extends JschConfigSessionFactory {
-
- public void configure(OpenSshConfig.Host hc, Session session) {
- session.setConfig("StrictHostKeyChecking", "no");
- }
-
- @Override
- protected JSch
- getJSch(final OpenSshConfig.Host hc, FS fs) throws JSchException {
- JSch jsch = super.getJSch(hc, fs);
- jsch.removeAllIdentity();
- return jsch;
- }
- }
-
-
- public void cloneRepository(View view) {
- localDir = new File(getApplicationContext().getFilesDir().getAbsoluteFile() + "/store");
-
- hostname = ((TextView) findViewById(R.id.clone_uri)).getText().toString();
- // don't ask the user, take off the protocol that he puts in
- hostname = hostname.replaceFirst("^.+://", "");
- ((TextView) findViewById(R.id.clone_uri)).setText(hostname);
-
- // now cheat a little and prepend the real protocol
- // jGit does not accept a ssh:// but requires https://
- if (!protocol.equals("ssh://")) {
- hostname = protocol + hostname;
- } else {
- // did he forget the username?
- if (!hostname.matches("^.+@.+")) {
- new AlertDialog.Builder(this).
- setMessage("Did you forget to specify a username?").
- setPositiveButton("Oups...", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
-
- }
- }).
- show();
- return;
- }
-
- username = hostname.split("@")[0];
- }
-
-
- if (localDir.exists()) {
- new AlertDialog.Builder(this).
- setTitle(R.string.dialog_delete_title).
- setMessage(R.string.dialog_delete_msg).
- setCancelable(false).
- setPositiveButton(R.string.dialog_delete,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- try {
- FileUtils.deleteDirectory(localDir);
- authenticateThenClone(localDir);
- } catch (IOException e) {
- //TODO Handle the exception correctly if we are unable to delete the directory...
- e.printStackTrace();
- } catch (Exception e) {
- //This is what happens when jgit fails :(
- //TODO Handle the diffent cases of exceptions
- }
-
- dialog.cancel();
- }
- }
- ).
- setNegativeButton(R.string.dialog_do_not_delete,
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- dialog.cancel();
- }
- }
- ).
- show();
- } else {
- try {
- authenticateThenClone(localDir);
- } catch (Exception e) {
- //This is what happens when jgit fails :(
- //TODO Handle the diffent cases of exceptions
- e.printStackTrace();
- }
- }
- }
-
-
- private void authenticateThenClone(final File localDir) {
- String connectionMode = ((Spinner) findViewById(R.id.connection_mode)).getSelectedItem().toString();
-
- if (connectionMode.equalsIgnoreCase("ssh-key")) {
-
- } else {
- if (protocol.equals("ssh://")) {
-
- 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());
-
- CloneCommand cmd = Git.cloneRepository().
- setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password.getText().toString())).
- setCloneAllBranches(true).
- setDirectory(localDir).
- setURI(hostname);
-
- new CloneTask(activity).execute(cmd);
- }
- }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- // Do nothing.
- }
- }).show();
- } else {
- CloneCommand cmd = Git.cloneRepository()
- .setDirectory(localDir)
- .setURI(hostname)
- .setBare(false)
- .setNoCheckout(false)
- .setCloneAllBranches(true);
-
- new CloneTask(activity).execute(cmd);
- }
- }
- }
-
-
-
-}