package eu.geclipse.ui.internal.preference; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.Set; import java.util.Map.Entry; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import eu.geclipse.core.security.ICertificateHandle; import eu.geclipse.core.security.ICertificateManager; public class CertificateContentProvider implements ITreeContentProvider { public enum GroupMode { Country, State, Locality, Organization, OrganizationalUnit, Trust } private static final String NA_STRING = "N/A"; private boolean grouped; private GroupMode groupMode; public CertificateContentProvider() { this.grouped = true; this.groupMode = GroupMode.Organization; } public Object[] getChildren( final Object parentElement ) { Object[] result = new Object[ 0 ]; if ( parentElement instanceof Entry< ?, ? > ) { Object value = ( ( Entry< ?, ? > ) parentElement ).getValue(); if ( value instanceof List< ? > ) { List< ? > list = ( List< ? > ) value; result = list.toArray( new Object[ list.size() ] ); } } return result; } public Object getParent( final Object element ) { return null; } public boolean hasChildren( final Object element ) { boolean result = false; if ( element instanceof Entry< ?, ? > ) { result = true; } return result; } public Object[] getElements( final Object inputElement ) { Object[] result = new Object[ 0 ]; if ( inputElement instanceof ICertificateManager ) { List< ICertificateHandle > certificates = ( ( ICertificateManager ) inputElement ).getAllCertificates(); if ( ! isGrouped() ) { result = certificates.toArray(); } else { Set< Entry < String, List< ICertificateHandle > > > entrySet = getGroupedCertificates( certificates, getGroupMode() ); result = entrySet.toArray(); } } return result; } public void dispose() { } public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) { } public GroupMode getGroupMode() { return this.groupMode; } public boolean isGrouped() { return this.grouped; } public void setGrouped( final boolean b ) { this.grouped = b; } public void setGroupMode( final GroupMode mode ) { this.groupMode = mode; } private Set< Entry < String, List< ICertificateHandle > > > getGroupedCertificates( final List< ICertificateHandle > certs, final GroupMode m ) { Hashtable< String, List< ICertificateHandle > > table = new Hashtable< String, List< ICertificateHandle > >(); for ( ICertificateHandle c : certs ) { String name = getGroupName( c, m ); if ( ( name == null ) || ( name.trim().length() == 0 ) ) { name = NA_STRING; } List< ICertificateHandle > list = table.get( name ); if ( list == null ) { list = new ArrayList< ICertificateHandle >(); table.put( name, list ); } list.add( c ); } return table.entrySet(); } private String getGroupName( final ICertificateHandle h, final GroupMode m ) { String result = NA_STRING; if ( m == GroupMode.Country ) { result = getSubjectDN( h.getCertificate(), "C" ); } else if ( m == GroupMode.State ) { result = getSubjectDN( h.getCertificate(), "ST" ); } else if ( m == GroupMode.Locality ) { result = getSubjectDN( h.getCertificate(), "L" ); } else if ( m == GroupMode.Organization ) { result = getSubjectDN( h.getCertificate(), "O" ); } else if ( m == GroupMode.OrganizationalUnit ) { result = getSubjectDN( h.getCertificate(), "OU" ); } else if ( m == GroupMode.Trust ) { result = h.getTrust().toString(); } return result; } static String getSubjectDN( final X509Certificate c, final String part ) { String result = NA_STRING; String search = part.toUpperCase() + "="; String name = c.getSubjectX500Principal().getName(); String[] parts = name.split( "[,/]" ); for ( String s : parts ) { if ( s.trim().toUpperCase().startsWith( search ) ) { result = s.trim().substring( search.length() ); break; } } return result; } }