import java.io.IOException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
-import java.security.cert.CertPath;
-import java.security.cert.CertPathValidatorException;
-import java.security.cert.Certificate;
import java.security.cert.CertificateException;
-import java.security.cert.CertificateExpiredException;
-import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;
-import java.util.List;
-
-import javax.net.ssl.SSLPeerUnverifiedException;
import android.app.Dialog;
import android.content.Context;
import android.widget.TextView;
import com.owncloud.android.R;
+import com.owncloud.android.network.CertificateCombinedException;
import com.owncloud.android.network.OwnCloudClientUtils;
-import com.owncloud.android.network.SslAnalyzer;
import com.owncloud.android.operations.RemoteOperationResult;
/**
private final static String TAG = SslValidatorDialog.class.getSimpleName();
private OnSslValidatorListener mListener;
- private Exception mException = null;
+ private CertificateCombinedException mException = null;
private View mView;
* by setting the certificate as reliable.
*/
public static SslValidatorDialog newInstance(Context context, RemoteOperationResult result, OnSslValidatorListener listener) {
- if (SslAnalyzer.isRecoverable(result)) {
+ if (result != null && result.isSslRecoverableException()) {
SslValidatorDialog dialog = new SslValidatorDialog(context, listener);
return dialog;
} else {
requestWindowFeature(Window.FEATURE_NO_TITLE);
mView = getLayoutInflater().inflate(R.layout.ssl_validator_layout, null);
setContentView(mView);
- //setTitle(R.string.ssl_validator_title);
mView.findViewById(R.id.ok).setOnClickListener(
new View.OnClickListener() {
public void updateResult(RemoteOperationResult result) {
- mException = SslAnalyzer.getRecoverableException(result);
- if (mException instanceof CertPathValidatorException ) {
- showCertificateData(((CertPathValidatorException)mException).getCertPath());
- ((TextView)mView.findViewById(R.id.reason_cert_not_trusted)).setVisibility(View.VISIBLE);
- ((TextView)mView.findViewById(R.id.reason_cert_expired)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_cert_not_yet_valid)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_hostname_not_vertified)).setVisibility(View.GONE);
+ if (result.isSslRecoverableException()) {
+ mException = (CertificateCombinedException) result.getException();
- } else if (mException instanceof CertificateExpiredException ) {
+ /// clean
((TextView)mView.findViewById(R.id.reason_cert_not_trusted)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_cert_expired)).setVisibility(View.VISIBLE);
+ ((TextView)mView.findViewById(R.id.reason_cert_expired)).setVisibility(View.GONE);
((TextView)mView.findViewById(R.id.reason_cert_not_yet_valid)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_hostname_not_vertified)).setVisibility(View.GONE);
+ ((TextView)mView.findViewById(R.id.reason_hostname_not_verified)).setVisibility(View.GONE);
+ ((TextView)mView.findViewById(R.id.subject)).setVisibility(View.GONE);
+
+ /// refresh
+ if (mException.getCertPathValidatorException() != null) {
+ ((TextView)mView.findViewById(R.id.reason_cert_not_trusted)).setVisibility(View.VISIBLE);
+ }
- } else if (mException instanceof CertificateNotYetValidException ) {
- ((TextView)mView.findViewById(R.id.reason_cert_not_trusted)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_cert_expired)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_cert_not_yet_valid)).setVisibility(View.VISIBLE);
- ((TextView)mView.findViewById(R.id.reason_hostname_not_vertified)).setVisibility(View.GONE);
+ if (mException.getCertificateExpiredException() != null) {
+ ((TextView)mView.findViewById(R.id.reason_cert_expired)).setVisibility(View.VISIBLE);
+ }
- } else if (mException instanceof SSLPeerUnverifiedException ) {
- ((TextView)mView.findViewById(R.id.reason_cert_not_trusted)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_cert_expired)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_cert_not_yet_valid)).setVisibility(View.GONE);
- ((TextView)mView.findViewById(R.id.reason_hostname_not_vertified)).setVisibility(View.VISIBLE);
+ if (mException.getCertificateNotYetValidException() != null) {
+ ((TextView)mView.findViewById(R.id.reason_cert_not_yet_valid)).setVisibility(View.VISIBLE);
+ }
+
+ if (mException.getSslPeerUnverifiedException() != null ) {
+ ((TextView)mView.findViewById(R.id.reason_hostname_not_verified)).setVisibility(View.VISIBLE);
+ }
+
+
+ showCertificateData(mException.getServerCertificate());
}
}
- private void showCertificateData(CertPath certPath) {
- final List<? extends Certificate> certs = certPath.getCertificates();
- /*X509Certificate badCert = null;
- if (e.getIndex() >= 0 && e.getIndex() < certs.size())
- badCert = (X509Certificate) certs.get(e.getIndex());*/
- if (certs.size() > 0) {
- X509Certificate serverCert = (X509Certificate) certs.get(0);
- String text = serverCert.getSubjectDN().getName();
+ private void showCertificateData(X509Certificate cert) {
+ TextView subject = (TextView)mView.findViewById(R.id.subject);
+ if (cert != null) {
+ String text = cert.getSubjectDN().getName();
text = text.substring(text.indexOf(",") + 1);
- ((TextView)mView.findViewById(R.id.issuer)).setText(text);
+ subject.setVisibility(View.VISIBLE);
+ subject.setText(text);
+ } else {
+ // this should not happen
+ subject.setText(R.string.ssl_validator_certificate_not_available);
}
}
private void saveServerCert() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {
- // TODO be able to add certificate for any recoverable exception
- if (mException instanceof CertPathValidatorException) {
- OwnCloudClientUtils.addCertToKnownServersStore(((CertPathValidatorException) mException).getCertPath().getCertificates().get(0), getContext());
+ if (mException.getServerCertificate() != null) {
+ OwnCloudClientUtils.addCertToKnownServersStore(mException.getServerCertificate(), getContext());
}
}