diff --git a/app/src/main/java/com/nutomic/zertman/CertificateAdapter.java b/app/src/main/java/com/nutomic/zertman/CertificateAdapter.java index f74a580..00c6a67 100644 --- a/app/src/main/java/com/nutomic/zertman/CertificateAdapter.java +++ b/app/src/main/java/com/nutomic/zertman/CertificateAdapter.java @@ -2,6 +2,7 @@ package com.nutomic.zertman; import android.content.Context; import android.os.AsyncTask; +import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,8 +38,12 @@ public class CertificateAdapter extends ArrayAdapter implements } final Certificate cert = getItem(position); + // NOTE: This should be called asynchronously. + Pair desc = CertificateManager.getDescription(cert); TextView title = (TextView) convertView.findViewById(R.id.title); - title.setText(cert.getFile().getName()); + title.setText(desc.first); + TextView summary = (TextView) convertView.findViewById(R.id.summary); + summary.setText(desc.second); Button button = (Button) convertView.findViewById(R.id.button); int colorRes; if (cert.isSystemCertificate()) { diff --git a/app/src/main/java/com/nutomic/zertman/CertificateManager.java b/app/src/main/java/com/nutomic/zertman/CertificateManager.java index b5a3310..4add340 100644 --- a/app/src/main/java/com/nutomic/zertman/CertificateManager.java +++ b/app/src/main/java/com/nutomic/zertman/CertificateManager.java @@ -1,8 +1,17 @@ package com.nutomic.zertman; +import android.net.http.SslCertificate; import android.util.Log; +import android.util.Pair; +import java.io.BufferedInputStream; import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; @@ -111,4 +120,55 @@ public class CertificateManager { return result != null; } + /** + * Returns strings for certificate naming, copied from AOSP 4.4.4, + * packages/apps/Settings/src/com/android/settings/TrustedCredentialsSettings.java:310. + */ + public static Pair getDescription(Certificate cert) { + InputStream is = null; + X509Certificate cert2; + try { + CertificateFactory factory = CertificateFactory.getInstance("X509"); + is = new BufferedInputStream(new FileInputStream(cert.getFile())); + cert2 = (X509Certificate) factory.generateCertificate(is); + } catch (IOException e) { + return null; + } catch (CertificateException e) { + return null; + } finally { + try { + is.close(); + } + catch (IOException e) { + Log.w(TAG, "Failed to close stream", e); + } + } + + String primary; + String secondary; + + SslCertificate c2 = new SslCertificate(cert2); + String cn = c2.getIssuedTo().getCName(); + String o = c2.getIssuedTo().getOName(); + String ou = c2.getIssuedTo().getUName(); + if (!o.isEmpty()) { + if (!cn.isEmpty()) { + primary = o; + secondary = cn; + } else { + primary = o; + secondary = ou; + } + } else { + if (!cn.isEmpty()) { + primary = cn; + secondary = ""; + } else { + primary = c2.getIssuedTo().getDName(); + secondary = ""; + } + } + return new Pair(primary, secondary); + } + } diff --git a/app/src/main/res/layout/certificate_list_item.xml b/app/src/main/res/layout/certificate_list_item.xml index c78152f..d9f0a35 100644 --- a/app/src/main/res/layout/certificate_list_item.xml +++ b/app/src/main/res/layout/certificate_list_item.xml @@ -23,4 +23,12 @@ android:layout_alignParentRight="true" style="?android:attr/buttonStyleSmall"/> + +