/**
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
package com.ubergeek42.WeechatAndroid.utils;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.AppCompatTextView;
import android.text.Html;
import android.widget.ScrollView;
import android.widget.TextView;
import com.ubergeek42.WeechatAndroid.R;
import com.ubergeek42.WeechatAndroid.WeechatActivity;
import com.ubergeek42.WeechatAndroid.service.SSLHandler;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.text.DateFormat;
public class UntrustedCertificateDialog extends DialogFragment {
X509Certificate certificate;
public static UntrustedCertificateDialog newInstance(X509Certificate certificate) {
UntrustedCertificateDialog d = new UntrustedCertificateDialog();
d.certificate = certificate;
d.setRetainInstance(true);
return d;
}
public UntrustedCertificateDialog() {}
// this can get called before the activity has started
@NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) {
final int padding = (int) getResources().getDimension(R.dimen.dialog_padding_full);
final ScrollView scrollView = new ScrollView(getContext());
final TextView textView = new AppCompatTextView(getContext());
textView.setText(Html.fromHtml(getCertificateDescription()));
scrollView.addView(textView);
return new AlertDialog.Builder(getContext())
.setTitle(getString(R.string.ssl_cert_dialog_title))
.setView(scrollView, padding, padding/2, padding, 0)
.setPositiveButton(getString(R.string.ssl_cert_dialog_accept_button), new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
SSLHandler.getInstance(getContext()).trustCertificate(certificate);
((WeechatActivity) getActivity()).connect();
}
})
.setNegativeButton(getString(R.string.ssl_cert_dialog_reject_button), null)
.create();
}
// this prevents the dialog from being dismissed on activity restart
// see https://code.google.com/p/android/issues/detail?id=17423
@Override public void onDestroyView() {
if (getDialog() != null && getRetainInstance()) {
getDialog().setDismissMessage(null);
}
super.onDestroyView();
}
public String getCertificateDescription() {
String fingerprint;
try {fingerprint = new String(Hex.encodeHex(DigestUtils.sha256(certificate.getEncoded())));}
catch (CertificateEncodingException e) {fingerprint = getString(R.string.ssl_cert_dialog_unknown_fingerprint); }
return getString(R.string.ssl_cert_dialog_description,
certificate.getSubjectDN().getName(),
certificate.getIssuerDN().getName(),
DateFormat.getDateTimeInstance().format(certificate.getNotBefore()),
DateFormat.getDateTimeInstance().format(certificate.getNotAfter()),
fingerprint
);
}
}