diff --git a/res/menu/main_menu.xml b/res/menu/main_menu.xml
index 2e1e0a6..b381399 100644
--- a/res/menu/main_menu.xml
+++ b/res/menu/main_menu.xml
@@ -3,9 +3,9 @@
-
+ android:title="Reset Keys" />
diff --git a/src/org/galexander/sshd/AuthKeys.java b/src/org/galexander/sshd/AuthKeys.java
deleted file mode 100644
index 0db7771..0000000
--- a/src/org/galexander/sshd/AuthKeys.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.galexander.sshd;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.text.InputType;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
-import android.view.View;
-import android.widget.EditText;
-import android.widget.Toast;
-
-public class AuthKeys extends Activity {
- private EditText authtext;
- private String authtext_orig;
-
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.authkeys);
- authtext = (EditText)findViewById(R.id.authtext);
- authtext_orig = null;
- }
-
- public void onResume() {
- super.onResume();
- AuthKeysLoad.go(this);
- }
-
- public void onPause() {
- save_authtext();
- super.onPause();
- }
-
- public void fetch_clicked(View v) {
- AlertDialog.Builder ab = new AlertDialog.Builder(this);
- ab.setTitle("Fetch authorized_keys");
- final EditText url = new EditText(this);
- url.setInputType(InputType.TYPE_CLASS_TEXT |
- InputType.TYPE_TEXT_VARIATION_URI);
- ab.setView(url);
- ab.setPositiveButton("OK",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface d, int which) {
- start_fetch(url.getText().toString());
- } });
- ab.setNegativeButton("Cancel",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface d, int which) {
- d.cancel();
- } });
- ab.show();
- }
-
- public void cancel_clicked(View v) {
- authtext_orig = null;
- finish();
- }
-
- public void save_clicked(View v) {
- save_authtext();
- finish();
- }
-
- private void save_authtext() {
- String s = get_authtext();
- if ((s != null) && ((authtext_orig != null) ||
- !s.equals(authtext_orig))) {
- Intent i = new Intent(this, AuthKeysSave.class);
- i.putExtra("s", s);
- startService(i);
- }
- /* so that we won't save it again */
- authtext_orig = null;
- }
-
- private String get_authtext() {
- if (authtext != null) {
- return authtext.getText().toString();
- }
- return null;
- }
-
- /* called from AuthKeysLoad, which puts it on the UI thread */
- public void set_authtext(String s) {
- if (authtext != null) {
- authtext.setText(s);
- authtext_orig = s;
- }
- }
-
- /* called from AuthKeysFetch, from its own thread */
- public void append_authtext(String s) {
- if (authtext != null) {
- String t = get_authtext();
- if (t == null) {
- t = "";
- }
- if (!t.endsWith("\n")) {
- t += "\n";
- }
- t += s;
- authtext.setText(t);
- }
- }
-
- private void start_fetch(String url) {
- Intent i = new Intent(this, AuthKeysFetch.class);
- final Context ctx = this;
- i.putExtra("url", url);
- i.putExtra("m", new Messenger(new Handler() {
- public void handleMessage(Message msg) {
- Object o = msg.obj;
- if (o == null) {
- return;
- }
- String s = (String)o;
- int n = msg.arg1;
- if (n == 0) {
- /* s is data read from the url */
- append_authtext(s);
- } else {
- /* s must be an error message */
- Toast.makeText(ctx, s,
- Toast.LENGTH_LONG).show();
- }
- } } ));
- startService(i);
- }
-}
diff --git a/src/org/galexander/sshd/AuthKeysFetch.java b/src/org/galexander/sshd/AuthKeysFetch.java
deleted file mode 100644
index 97b04da..0000000
--- a/src/org/galexander/sshd/AuthKeysFetch.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.galexander.sshd;
-
-import android.app.IntentService;
-import android.content.Intent;
-import android.os.Message;
-import android.os.Messenger;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.HttpURLConnection;
-
-
-public class AuthKeysFetch extends IntentService {
- public AuthKeysFetch() {
- super("SimpleSSHDAuthKeysFetch");
- }
- protected void onHandleIntent(Intent i) {
- Messenger m = (Messenger)i.getParcelableExtra("m");
- Message msg = Message.obtain();
- String url = i.getStringExtra("url");
-
- String result = "";
- byte[] b = new byte[1024];
-
- try {
- if (url == null) {
- throw new Exception("no url");
- }
- URL u = new URL(url);
- HttpURLConnection conn = (HttpURLConnection)
- u.openConnection();
- try {
- InputStream in = conn.getInputStream();
- try {
- while (result.length() < 65536) {
- int r = in.read(b);
- if (r <= 0) {
- break;
- }
- result += new String(b, 0, r);
- }
- } finally {
- in.close();
- }
- } finally {
- conn.disconnect();
- }
- if (result.equals("")) {
- throw new Exception("empty file");
- }
- msg.arg1 = 0;
- msg.obj = result;
- } catch (Exception e) {
- msg.arg1 = 1;
- msg.obj = "HTTP fetch: " + e.getMessage();
- }
- try {
- m.send(msg);
- } catch (Exception e) { }
- }
-}
diff --git a/src/org/galexander/sshd/AuthKeysLoad.java b/src/org/galexander/sshd/AuthKeysLoad.java
deleted file mode 100644
index 18b5f4e..0000000
--- a/src/org/galexander/sshd/AuthKeysLoad.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.galexander.sshd;
-
-import android.app.Activity;
-import android.os.AsyncTask;
-import android.widget.Toast;
-import java.io.File;
-import java.io.FileInputStream;
-
-
-public class AuthKeysLoad extends AsyncTask {
- private AuthKeys act = null;
- private String result = null;
- private String error = null;
-
- public static void go(AuthKeys act_) {
- (new AuthKeysLoad(act_)).execute();
- }
-
- AuthKeysLoad(AuthKeys act_) {
- super();
- act = act_;
- }
-
- protected Void doInBackground(Void... v) {
- try {
- File f = new File(Prefs.get_path(), "authorized_keys");
- FileInputStream fis = new FileInputStream(f);
-
- byte b[] = new byte[1024];
-
- result = "";
- try {
- while (true) {
- int r = fis.read(b);
- if (r <= 0) {
- break;
- }
- result += new String(b, 0, r);
- }
- } finally {
- fis.close();
- }
- } catch (Exception e) {
- error = e.getMessage();
- }
- return null;
- }
-
- protected void onPostExecute(Void v) {
- if (result != null) {
- act.set_authtext(result);
- } else if (error != null) {
- Toast.makeText(act,
- "failed to load authorized_keys: " + error,
- Toast.LENGTH_LONG).show();
- }
- }
-}
diff --git a/src/org/galexander/sshd/AuthKeysSave.java b/src/org/galexander/sshd/AuthKeysSave.java
deleted file mode 100644
index 16444e5..0000000
--- a/src/org/galexander/sshd/AuthKeysSave.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.galexander.sshd;
-
-import android.app.IntentService;
-import android.content.Intent;
-import java.io.File;
-import java.io.FileOutputStream;
-
-public class AuthKeysSave extends IntentService {
- public AuthKeysSave() {
- super("SimpleSSHDAuthKeysSave");
- }
- protected void onHandleIntent(Intent i) {
- String s = i.getStringExtra("s");
- if (s == null) {
- return;
- }
- try {
- File p = new File(Prefs.get_path());
- if (!p.exists()) {
- p.mkdirs();
- }
- File f = new File(p, "authorized_keys");
- FileOutputStream fos = new FileOutputStream(f);
- int ofs = 0;
-
- try {
- fos.write(s.getBytes());
- } finally {
- fos.close();
- }
- } catch (Exception e) {
- SimpleSSHD.toast(
- "authorized_keys save failed: "+e.getMessage());
- }
- }
-}
diff --git a/src/org/galexander/sshd/SimpleSSHD.java b/src/org/galexander/sshd/SimpleSSHD.java
index 0f2ad16..dfdba4d 100644
--- a/src/org/galexander/sshd/SimpleSSHD.java
+++ b/src/org/galexander/sshd/SimpleSSHD.java
@@ -11,7 +11,6 @@ import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;
-import android.widget.Toast;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
@@ -32,7 +31,6 @@ public class SimpleSSHD extends Activity
private TextView ip_view;
public static SimpleSSHD curr = null;
private UpdaterThread updater = null;
- private static String pending_toast = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -47,11 +45,6 @@ public class SimpleSSHD extends Activity
super.onResume();
synchronized (lock) {
curr = this;
- if (pending_toast != null) {
- Toast.makeText(this, pending_toast,
- Toast.LENGTH_LONG).show();
- pending_toast = null;
- }
}
update_startstop_prime();
updater = new UpdaterThread();
@@ -81,8 +74,8 @@ public class SimpleSSHD extends Activity
case R.id.settings:
startActivity(new Intent(this, Settings.class));
return true;
- case R.id.authkeys:
- startActivity(new Intent(this, AuthKeys.class));
+ case R.id.resetkeys:
+ reset_keys();
return true;
case R.id.doc: {
Intent i = new Intent(Intent.ACTION_VIEW);
@@ -227,6 +220,29 @@ public class SimpleSSHD extends Activity
return ret;
}
+ private void do_reset_keys() {
+ new File(Prefs.get_path(), "authorized_keys").delete();
+ }
+
+ private void reset_keys() {
+ AlertDialog.Builder b = new AlertDialog.Builder(this);
+ b.setCancelable(true);
+ b.setPositiveButton("Yes",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface di,
+ int which) { do_reset_keys(); }
+ });
+ b.setNegativeButton("No",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface di,
+ int which) { }
+ });
+ b.setIcon(android.R.drawable.ic_dialog_alert);
+ b.setTitle("Reset Keys");
+ b.setMessage("Delete the authorized_keys file? (then you will only be able to login with single-use passwords)");
+ b.show();
+ }
+
public String my_version() {
try {
return getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
@@ -234,19 +250,4 @@ public class SimpleSSHD extends Activity
return "UNKNOWN";
}
}
-
- /* called from AuthKeysSave (in its own worker thread) if it fails */
- public static void toast(final String s) {
- synchronized (lock) {
- if (curr != null) {
- curr.runOnUiThread(new Runnable() {
- public void run() {
- Toast.makeText(curr, s,
- Toast.LENGTH_LONG).show();
- } });
- } else {
- pending_toast = s;
- }
- }
- }
}