package com.kedzie.vbox.server; import java.security.cert.X509Certificate; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.util.Log; import com.kedzie.vbox.R; import com.kedzie.vbox.api.IVirtualBox; import com.kedzie.vbox.app.BaseActivity; import com.kedzie.vbox.app.BundleBuilder; import com.kedzie.vbox.app.Utils; import com.kedzie.vbox.machine.MachineListActivity; import com.kedzie.vbox.server.ServerListFragment.OnSelectServerListener; import com.kedzie.vbox.soap.VBoxSvc; import com.kedzie.vbox.soap.ssl.SSLUtil.AddCertificateToKeystoreTask; import com.kedzie.vbox.task.DialogTask; /** * VirtualBox server list * @author Marek Kędzierski * @apiviz.stereotype activity * @apiviz.owns com.kedzie.vbox.server.ServerListFragment */ public class ServerListFragmentActivity extends BaseActivity implements OnSelectServerListener { /** * Log on to VirtualBox webservice */ class LogonTask extends DialogTask<Server, IVirtualBox> { public LogonTask() { super(ServerListFragmentActivity.this, null, R.string.progress_connecting, true); } @Override protected IVirtualBox work(Server... params) throws Exception { _vmgr = new VBoxSvc(params[0]); _vmgr.logon(); _vmgr.getVBox().getVersion(); return _vmgr.getVBox(); } @Override protected void onSuccess(IVirtualBox vbox) { super.onSuccess(vbox); Utils.toastLong(ServerListFragmentActivity.this, getContext().getString(R.string.toast_connected_to_vbox) + vbox.getVersion()); Intent intent = new Intent(ServerListFragmentActivity.this, MachineListActivity.class); BundleBuilder.putVBoxSvc(intent, _vmgr); Utils.startActivity(ServerListFragmentActivity.this, intent); } } /** * For Untrusted certificates prompt user to save certificate to keystore */ private Handler _sslHandler = new Handler() { @Override public void handleMessage(Message msg) { final Server server = (Server)msg.getData().getParcelable(Server.BUNDLE); if(msg.getData().getBoolean("isTrusted")) { new LogonTask().execute(server); } else { final X509Certificate[] chain = (X509Certificate[]) msg.getData().getSerializable("certs"); X509Certificate root = chain[chain.length-1]; String text = String.format("Issuer: %1$s\nSubject: %2$s", root.getIssuerDN().getName(), root.getSubjectDN().getName()); new AlertDialog.Builder(ServerListFragmentActivity.this) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle("Unrecognized Certificate") .setMessage("Do you trust this certificate?\n" + text) .setPositiveButton("Trust", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new AddCertificateToKeystoreTask(ServerListFragmentActivity.this, server) { @Override protected void onSuccess(Void result) { super.onSuccess(result); Utils.toastLong(getContext(), "Successfully updated keystore"); new LogonTask().execute(server); }; }.execute(chain); dialog.dismiss(); } }).setNegativeButton("Cancel", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayShowHomeEnabled(false); if(savedInstanceState==null) { getSupportFragmentManager().beginTransaction().add(android.R.id.content, new ServerListFragment(), "server_list").commit(); } } @Override public void onSelectServer(final Server server) { if(server.isSSL()) new Thread() { public void run() { try { new VBoxSvc(server).ping(_sslHandler); } catch (Exception e) { Log.e("ServerListFragment", "error ping", e); } } }.start(); else { new LogonTask().execute(server); } } }