X-Git-Url: https://git.strongswan.org/?p=strongswan.git;a=blobdiff_plain;f=src%2Ffrontends%2Fandroid%2Fsrc%2Forg%2Fstrongswan%2Fandroid%2Fui%2FVpnProfileDetailActivity.java;h=73fa3017bee8454359a4bf2f51bb32b8c3241669;hp=9e8ae2ff256e79121c5373a7be776c744056cbb9;hb=825c192d4f07251a60fc0bdca7e5b1ea27878050;hpb=cb431e12daff06278edb66338ce5480a44328b1d diff --git a/src/frontends/android/src/org/strongswan/android/ui/VpnProfileDetailActivity.java b/src/frontends/android/src/org/strongswan/android/ui/VpnProfileDetailActivity.java index 9e8ae2f..73fa301 100644 --- a/src/frontends/android/src/org/strongswan/android/ui/VpnProfileDetailActivity.java +++ b/src/frontends/android/src/org/strongswan/android/ui/VpnProfileDetailActivity.java @@ -17,46 +17,61 @@ package org.strongswan.android.ui; +import java.security.cert.X509Certificate; + import org.strongswan.android.R; +import org.strongswan.android.data.TrustedCertificateEntry; import org.strongswan.android.data.VpnProfile; import org.strongswan.android.data.VpnProfileDataSource; +import org.strongswan.android.data.VpnType; import org.strongswan.android.logic.TrustedCertificateManager; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; -import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.view.Window; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.Spinner; +import android.widget.TextView; public class VpnProfileDetailActivity extends Activity { + private static final int SELECT_TRUSTED_CERTIFICATE = 0; + private VpnProfileDataSource mDataSource; private Long mId; + private TrustedCertificateEntry mCertEntry; + private VpnType mVpnType = VpnType.IKEV2_EAP; private VpnProfile mProfile; - private boolean mCertsLoaded; - private String mCertAlias; private EditText mName; private EditText mGateway; + private Spinner mSelectVpnType; + private ViewGroup mUsernamePassword; private EditText mUsername; private EditText mPassword; private CheckBox mCheckAuto; + private RelativeLayout mSelectCert; + private TextView mCertTitle; + private TextView mCertSubtitle; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); /* the title is set when we load the profile, if any */ getActionBar().setDisplayHomeAsUpEnabled(true); @@ -67,17 +82,49 @@ public class VpnProfileDetailActivity extends Activity setContentView(R.layout.profile_detail_view); mName = (EditText)findViewById(R.id.name); - mPassword = (EditText)findViewById(R.id.password); mGateway = (EditText)findViewById(R.id.gateway); + mSelectVpnType = (Spinner)findViewById(R.id.vpn_type); + + mUsernamePassword = (ViewGroup)findViewById(R.id.username_password_group); mUsername = (EditText)findViewById(R.id.username); + mPassword = (EditText)findViewById(R.id.password); mCheckAuto = (CheckBox)findViewById(R.id.ca_auto); + mSelectCert = (RelativeLayout)findViewById(R.id.select_certificate); + mCertTitle = (TextView)findViewById(R.id.select_certificate_title); + mCertSubtitle = (TextView)findViewById(R.id.select_certificate_subtitle); + + + mSelectVpnType.setOnItemSelectedListener(new OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) + { + mVpnType = VpnType.values()[position]; + updateClientCredentialView(); + } + + @Override + public void onNothingSelected(AdapterView parent) + { /* should not happen */ + mVpnType = VpnType.IKEV2_EAP; + updateClientCredentialView(); + } + }); mCheckAuto.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + updateCertificateSelector(); + } + }); + mSelectCert.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) + { + Intent intent = new Intent(VpnProfileDetailActivity.this, TrustedCertificatesActivity.class); + startActivityForResult(intent, SELECT_TRUSTED_CERTIFICATE); } }); @@ -88,9 +135,10 @@ public class VpnProfileDetailActivity extends Activity mId = extras == null ? null : extras.getLong(VpnProfileDataSource.KEY_ID); } - loadProfileData(); + loadProfileData(savedInstanceState); - new CertificateLoadTask().execute(); + updateClientCredentialView(); + updateCertificateSelector(); } @Override @@ -108,6 +156,10 @@ public class VpnProfileDetailActivity extends Activity { outState.putLong(VpnProfileDataSource.KEY_ID, mId); } + if (mCertEntry != null) + { + outState.putString(VpnProfileDataSource.KEY_CERTIFICATE, mCertEntry.getAlias()); + } } @Override @@ -135,6 +187,33 @@ public class VpnProfileDetailActivity extends Activity } } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + switch (requestCode) + { + case SELECT_TRUSTED_CERTIFICATE: + if (resultCode == RESULT_OK) + { + String alias = data.getStringExtra(VpnProfileDataSource.KEY_CERTIFICATE); + X509Certificate certificate = TrustedCertificateManager.getInstance().getCACertificateFromAlias(alias); + mCertEntry = certificate == null ? null : new TrustedCertificateEntry(alias, certificate); + updateCertificateSelector(); + } + break; + default: + super.onActivityResult(requestCode, resultCode, data); + } + } + + /** + * Update the UI to enter client credentials depending on the type of VPN currently selected + */ + private void updateClientCredentialView() + { + mUsernamePassword.setVisibility(mVpnType.getRequiresUsernamePassword() ? View.VISIBLE : View.GONE); + } + /** * Show an alert in case the previously selected certificate is not found anymore * or the user did not select a certificate in the spinner. @@ -155,32 +234,31 @@ public class VpnProfileDetailActivity extends Activity } /** - * Asynchronously executed task which confirms that the certificates are loaded. - * They are loaded from the main Activity already but might not be ready yet, or - * unloaded again. - * - * Once loaded the CA certificate spinner and checkboxes are updated - * accordingly. + * Update the CA certificate selection UI depending on whether the + * certificate should be automatically selected or not. */ - private class CertificateLoadTask extends AsyncTask + private void updateCertificateSelector() { - @Override - protected void onPreExecute() + if (!mCheckAuto.isChecked()) { - setProgressBarIndeterminateVisibility(true); - } + mSelectCert.setEnabled(true); + mSelectCert.setVisibility(View.VISIBLE); - @Override - protected TrustedCertificateManager doInBackground(Void... params) - { - return TrustedCertificateManager.getInstance().load(); + if (mCertEntry != null) + { + mCertTitle.setText(mCertEntry.getSubjectPrimary()); + mCertSubtitle.setText(mCertEntry.getSubjectSecondary()); + } + else + { + mCertTitle.setText(R.string.profile_ca_select_certificate_label); + mCertSubtitle.setText(R.string.profile_ca_select_certificate); + } } - - @Override - protected void onPostExecute(TrustedCertificateManager result) + else { - setProgressBarIndeterminateVisibility(false); - mCertsLoaded = true; + mSelectCert.setEnabled(false); + mSelectCert.setVisibility(View.GONE); } } @@ -220,12 +298,15 @@ public class VpnProfileDetailActivity extends Activity mGateway.setError(getString(R.string.alert_text_no_input_gateway)); valid = false; } - if (mUsername.getText().toString().trim().isEmpty()) + if (mVpnType.getRequiresUsernamePassword()) { - mUsername.setError(getString(R.string.alert_text_no_input_username)); - valid = false; + if (mUsername.getText().toString().trim().isEmpty()) + { + mUsername.setError(getString(R.string.alert_text_no_input_username)); + valid = false; + } } - if (!mCheckAuto.isChecked()) + if (!mCheckAuto.isChecked() && mCertEntry == null) { showCertificateAlert(); valid = false; @@ -243,17 +324,27 @@ public class VpnProfileDetailActivity extends Activity String gateway = mGateway.getText().toString().trim(); mProfile.setName(name.isEmpty() ? gateway : name); mProfile.setGateway(gateway); - mProfile.setUsername(mUsername.getText().toString().trim()); - String password = mPassword.getText().toString().trim(); - password = password.isEmpty() ? null : password; - mProfile.setPassword(password); + mProfile.setVpnType(mVpnType); + if (mVpnType.getRequiresUsernamePassword()) + { + mProfile.setUsername(mUsername.getText().toString().trim()); + String password = mPassword.getText().toString().trim(); + password = password.isEmpty() ? null : password; + mProfile.setPassword(password); + } + String certAlias = mCheckAuto.isChecked() ? null : mCertEntry.getAlias(); + mProfile.setCertificateAlias(certAlias); } /** * Load an existing profile if we got an ID + * + * @param savedInstanceState previously saved state */ - private void loadProfileData() + private void loadProfileData(Bundle savedInstanceState) { + String alias = null; + getActionBar().setTitle(R.string.add_profile); if (mId != null) { @@ -262,9 +353,10 @@ public class VpnProfileDetailActivity extends Activity { mName.setText(mProfile.getName()); mGateway.setText(mProfile.getGateway()); + mVpnType = mProfile.getVpnType(); mUsername.setText(mProfile.getUsername()); mPassword.setText(mProfile.getPassword()); - mCertAlias = mProfile.getCertificateAlias(); + alias = mProfile.getCertificateAlias(); getActionBar().setTitle(mProfile.getName()); } else @@ -274,6 +366,24 @@ public class VpnProfileDetailActivity extends Activity finish(); } } - mCheckAuto.setChecked(mCertAlias == null); + + mSelectVpnType.setSelection(mVpnType.ordinal()); + + /* check if the user selected a certificate previously */ + alias = savedInstanceState == null ? alias : savedInstanceState.getString(VpnProfileDataSource.KEY_CERTIFICATE); + mCheckAuto.setChecked(alias == null); + if (alias != null) + { + X509Certificate certificate = TrustedCertificateManager.getInstance().getCACertificateFromAlias(alias); + if (certificate != null) + { + mCertEntry = new TrustedCertificateEntry(alias, certificate); + } + else + { /* previously selected certificate is not here anymore */ + showCertificateAlert(); + mCertEntry = null; + } + } } }