package model; import java.util.Collections; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import javax.swing.tree.DefaultMutableTreeNode; public class BurpCertificateStore { private DefaultMutableTreeNode rootNode; public BurpCertificateStore() { rootNode = new DefaultMutableTreeNode("Certificates"); } /** * Adds a new certificate to the store directly under the root node. * * @param burpCertificate * to add */ public void addCertificate(BurpCertificate burpCertificate) { rootNode.add(new DefaultMutableTreeNode(burpCertificate)); } /** * Adds a complete certificate chain to the store. The top certificate of * the chain is directly under the root node. * * @param burpCertificateChain * to add */ public void addCertificateChain(List<BurpCertificate> burpCertificateChain) { Collections.reverse(burpCertificateChain); // CA first DefaultMutableTreeNode currentNode = null; DefaultMutableTreeNode previousNode = null; for (BurpCertificate c : burpCertificateChain) { currentNode = new DefaultMutableTreeNode(c); if (previousNode == null) { // Self-Signed rootNode.add(currentNode); } else { previousNode.add(currentNode); } previousNode = currentNode; } } /** * Deletes a certificate from the store. It can be placed anywhere in the * tree. * * @param burpCertificate * to remove */ public void removeCertificate(BurpCertificate burpCertificate) { @SuppressWarnings("unchecked") Enumeration<DefaultMutableTreeNode> en = rootNode.depthFirstEnumeration(); while (en.hasMoreElements()) { DefaultMutableTreeNode foundNode = en.nextElement(); if (foundNode.getUserObject() instanceof BurpCertificate) { if (foundNode.getUserObject() == burpCertificate) { foundNode.removeFromParent(); } } } } /** * Get all certificates of the store. * * @return a List of all certificates */ public List<BurpCertificate> getBurpCertificates() { List<BurpCertificate> certificates = new LinkedList<>(); return certificates; } /** * Returns the root node of the store tree. * * @return root node */ public DefaultMutableTreeNode getRootNode() { return rootNode; } /** * Get a list of all certificates which have a private key. * * @return List of certificates with a private key */ public List<BurpCertificate> getBurpCertificatesWithPrivateKey() { List<BurpCertificate> certificatesWithPrivateKey = new LinkedList<>(); @SuppressWarnings("unchecked") Enumeration<DefaultMutableTreeNode> en = rootNode.depthFirstEnumeration(); while (en.hasMoreElements()) { DefaultMutableTreeNode foundNode = en.nextElement(); if (foundNode.getUserObject() instanceof BurpCertificate) { BurpCertificate b = (BurpCertificate) foundNode.getUserObject(); if (b.hasPrivateKey()) { certificatesWithPrivateKey.add((BurpCertificate) foundNode.getUserObject()); } } } return certificatesWithPrivateKey; } }