summaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/GitClone.java116
1 files changed, 87 insertions, 29 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/GitClone.java b/app/src/main/java/com/zeapo/pwdstore/GitClone.java
index 6f57a9f7..a7c817c5 100644
--- a/app/src/main/java/com/zeapo/pwdstore/GitClone.java
+++ b/app/src/main/java/com/zeapo/pwdstore/GitClone.java
@@ -28,6 +28,9 @@ 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.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.SshSessionFactory;
@@ -36,7 +39,12 @@ 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 {
@@ -48,6 +56,7 @@ public class GitClone extends Activity {
private File localDir;
private String hostname;
+ private String username;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -68,6 +77,20 @@ public class GitClone extends Activity {
@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
@@ -132,7 +155,7 @@ public class GitClone extends Activity {
}
/* The clone process has to be on a different thread than the main one */
- private class CloneTask extends AsyncTask<CloneCommand, Integer, Long> {
+ private class CloneTask extends AsyncTask<CloneCommand, Integer, Integer> {
private ProgressDialog dialog;
public CloneTask(Activity activity) {
@@ -146,30 +169,57 @@ public class GitClone extends Activity {
this.dialog.show();
}
- protected void onPostExecute(Long result) {
- if (result < 0) {
- new AlertDialog.Builder(activity).
- setTitle("Invalid remote repository path").
- setMessage("Please check that the repository path is correct.\nDid you forget to specify the path after the hostname?").
- setPositiveButton("OK", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
+ 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();
+ }
+ }).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();
}
this.dialog.dismiss();
}
- protected Long doInBackground(CloneCommand... cmd) {
+ protected Integer doInBackground(CloneCommand... cmd) {
int count = cmd.length;
- long totalSize = 0;
+ Integer totalSize = 0;
for (int i = 0; i < count; i++) {
try {
cmd[i].call();
+ } catch (JGitInternalException e) {
+ return -99;
} catch (InvalidRemoteException e) {
- return new Long(-1);
+ return -1;
+ } catch (TransportException e) {
+ return -2;
} catch (Exception e) {
e.printStackTrace();
}
@@ -205,7 +255,26 @@ public class GitClone extends Activity {
// 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;
+ 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).
@@ -256,33 +325,22 @@ public class GitClone extends Activity {
if (connectionMode.equalsIgnoreCase("ssh-key")) {
} else {
- // Set an EditText view to get user input
- final LinearLayout layout = new LinearLayout(activity);
- layout.setOrientation(LinearLayout.VERTICAL);
-
- final EditText username = new EditText(activity);
- username.setHint("Username");
- username.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
-
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);
- layout.addView(username);
- layout.addView(password);
-
new AlertDialog.Builder(activity)
.setTitle("Authenticate")
- .setMessage("Please provide your usename and password for this repository")
- .setView(layout)
+ .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("git", "nicomint")).
+ setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password.getText().toString())).
setCloneAllBranches(true).
setDirectory(localDir).
setURI(hostname);