// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.trustosm.gui.dialogs; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Dimension; import java.awt.GridBagLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.Box; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.tree.TreePath; import org.bouncycastle.openpgp.PGPPublicKey; import org.bouncycastle.openpgp.PGPSignature; import org.jdesktop.swingx.JXTreeTable; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.gui.DefaultNameFormatter; import org.openstreetmap.josm.gui.ExtendedDialog; import org.openstreetmap.josm.plugins.trustosm.TrustOSMplugin; import org.openstreetmap.josm.plugins.trustosm.data.TrustNode; import org.openstreetmap.josm.plugins.trustosm.data.TrustOsmPrimitive; import org.openstreetmap.josm.plugins.trustosm.data.TrustSignatures; import org.openstreetmap.josm.plugins.trustosm.data.TrustWay; import org.openstreetmap.josm.plugins.trustosm.gui.KeyTreeTableModel; import org.openstreetmap.josm.plugins.trustosm.gui.KeyTreeTableModel.SignatureTreeNode; import org.openstreetmap.josm.plugins.trustosm.util.TrustGPG; import org.openstreetmap.josm.tools.GBC; import org.openstreetmap.josm.tools.ImageProvider; public final class TrustSignaturesDialog { private TrustSignaturesDialog() { // Hide default constructors for utilities classes } private static String createLabel(String plain, int type) { if (type == 0) { String[] kv = TrustOsmPrimitive.generateTagsFromSigtext(plain); return tr("Signed key value pair was: {0}={1}", kv[0], kv[1]); } else if (type == 1) { Node node = TrustNode.generateNodeFromSigtext(plain); return "ID:"+node.getUniqueId()+" ("+node.getCoor().toString() + ")"; } else if (type == 2) { List<Node> nodes = TrustWay.generateSegmentFromSigtext(plain); return "From:"+nodes.get(0).getUniqueId()+", To:"+nodes.get(nodes.size()-1).getUniqueId(); } return "No known type"; } private static void showDialog(TrustSignatures sigs, String label, int type) { JPanel p = new JPanel(new GridBagLayout()); p.add(new JLabel(label), GBC.eol()); for (String plain : sigs.getAllPlainTexts()) { JTextArea sigtext = new JTextArea(sigs.getArmoredFulltextSignatureAll(plain)); sigtext.setEditable(false); JPanel textcontent = new JPanel(); textcontent.add(sigtext); p.add(new JCollapsiblePanel(createLabel(plain, type), textcontent), GBC.eol()); List<PGPSignature> siglist = sigs.getSignaturesByPlaintext(plain); JPanel signerPanel = new JPanel(new GridBagLayout()); KeyTreeTableModel km = new KeyTreeTableModel(siglist); final JXTreeTable t = new JXTreeTable(km); t.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { TreePath selPath = t.getPathForLocation(e.getX(), e.getY()); if (selPath == null) return; SignatureTreeNode sn = (SignatureTreeNode) selPath.getLastPathComponent(); PGPPublicKey pub = TrustOSMplugin.gpg.getPublicKeyFromRing(sn.getSignature().getKeyID()); TrustGPG.showKeyDetails(pub); } } }); t.setLeafIcon(ImageProvider.get("sign")); t.setOpenIcon(ImageProvider.get("sign_color")); t.setClosedIcon(ImageProvider.get("sign_color")); t.expandAll(); t.packAll(); t.collapseAll(); signerPanel.add(new JScrollPane(t)); p.add(new JCollapsiblePanel(tr("{0} Signatures found.", siglist.size()), signerPanel), GBC.eol().insets(20, 0, 0, 0)); } p.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH)); JScrollPane scroller = new JScrollPane(p); scroller.setPreferredSize(new Dimension(700, 500)); String[] buttons = {tr("Ok")}; ExtendedDialog info = new ExtendedDialog(Main.parent, tr("Signature Info"), buttons, false); info.setContent(scroller, false); info.showDialog(); } public static void showSignaturesDialog(TrustNode trust) { TrustSignatures sigs; if ((sigs = trust.getNodeSigs()) == null) { JOptionPane.showMessageDialog(null, tr("Sorry, there are no Signatures for the selected Node."), tr("No Signature found"), JOptionPane.WARNING_MESSAGE); } else { String nodename = ((Node) trust.getOsmPrimitive()).getDisplayName(DefaultNameFormatter.getInstance()); showDialog(sigs, tr("Selected node was:\n{0}", nodename), 1); } } public static void showSignaturesDialog(TrustOsmPrimitive trust, String key) { TrustSignatures sigs; if ((sigs = trust.getSigsOnKey(key)) == null) { JOptionPane.showMessageDialog(null, tr("Sorry, there are no Signatures for the selected Attribute."), tr("No Signature found"), JOptionPane.WARNING_MESSAGE); } else { showDialog(sigs, tr("Selected key value pair was:\n{0}={1}", key, trust.getOsmPrimitive().get(key)), 0); } } public static void showSignaturesDialog(TrustWay trust, List<Node> nodes) { TrustSignatures sigs; if ((sigs = trust.getSigsOnSegment(nodes)) == null) { JOptionPane.showMessageDialog(null, tr("Sorry, there are no Signatures for the selected Segment."), tr("No Signature found"), JOptionPane.WARNING_MESSAGE); } else { showDialog(sigs, tr("Selected WaySegment was:"), 2); } } /* public static JButton createKeyButton(String label,final long keyID) { JButton detailsButton = new JButton(label); detailsButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showKeySignaturesDialog(keyID); } }); return detailsButton; } public static void showKeySignaturesDialog(long keyID) { PGPPublicKey pub = TrustOSMplugin.gpg.getPublicKeyFromRing(keyID); JPanel p = new JPanel(new GridBagLayout()); Iterator sigIt = pub.getSignatures(); while (sigIt.hasNext()) { PGPSignature s = (PGPSignature)sigIt.next(); p.add(createKeyButton(s.getHashedSubPackets().getSignerUserID(),pub.getKeyID())); } String uid = String.valueOf(pub.getKeyID()); Iterator i = pub.getUserIDs(); if (i.hasNext()) uid = (String)i.next(); p.add(createKeyButton(uid,pub.getKeyID())); JOptionPane.showMessageDialog(Main.parent,p, tr("Key Signatures"), JOptionPane.PLAIN_MESSAGE); } public static String convPGPSignatureToString(PGPSignature s) { PGPSignatureSubpacketVector sv = s.getHashedSubPackets(); if (sv.hasSubpacket(SignatureSubpacketTags.SIGNER_USER_ID)) return sv.getSignerUserID(); PGPPublicKey pub = TrustOSMplugin.gpg.getPublicKeyFromRing(s.getKeyID()); if (pub != null) { Iterator i = pub.getUserIDs(); if (i.hasNext()) return (String)i.next(); } return tr("unknown"); } public static JTree createSignerTree(Collection<PGPSignature> sigs) { DefaultMutableTreeNode root = new DefaultMutableTreeNode(); for (PGPSignature s : sigs) { DefaultMutableTreeNode sn = new DefaultMutableTreeNode(s); PGPPublicKey pub = TrustOSMplugin.gpg.getPublicKeyFromRing(s.getKeyID()); Iterator iter = pub.getSignatures(); while (iter.hasNext()) { PGPSignature ks = (PGPSignature)iter.next(); sn.add(new DefaultMutableTreeNode(ks)); } root.add(sn); } JTree t = new JTree(new DefaultTreeModel(root)); t.setRootVisible(false); t.setBackground(TrustDialog.BGCOLOR_NO_SIG); t.setCellRenderer(new DefaultTreeCellRenderer() { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; if (node.isRoot()) return this; PGPSignature s = (PGPSignature) node.getUserObject(); setIcon(ImageProvider.get("dialogs/sign")); setText(convPGPSignatureToString(s)); PGPSignatureSubpacketVector sv = s.getHashedSubPackets(); setBackgroundNonSelectionColor(TrustDialog.BGCOLOR_NO_SIG); if (sv.hasSubpacket(SignatureSubpacketTags.NOTATION_DATA)) { for (NotationData nd : sv.getNotationDataOccurences()) { System.out.println(nd.getNotationName()+"="+nd.getNotationValue()); if (nd.getNotationName().equals("trustosm@openstreetmap.org")) { setBackgroundNonSelectionColor(TrustDialog.BGCOLOR_VALID_SIG); setToolTipText(tr("Key certified for OSM-Usage with comment:{0}",nd.getNotationValue())); } } } return this; } }); return t; } */ }