added SSL
[org.ibex.net.git] / src / org / ibex / net / ssl / SwingVerifyCallback.java
diff --git a/src/org/ibex/net/ssl/SwingVerifyCallback.java b/src/org/ibex/net/ssl/SwingVerifyCallback.java
new file mode 100644 (file)
index 0000000..832ef2f
--- /dev/null
@@ -0,0 +1,99 @@
+package org.ibex.net.ssl;
+
+import javax.swing.*;
+
+import java.awt.*;
+
+import org.ibex.net.SSL;
+import org.ibex.crypto.*;
+
+public class SwingVerifyCallback extends JDialog implements SSL.VerifyCallback {
+    private Component owner;
+    
+    public SwingVerifyCallback(Component owner) {
+        this.owner = owner;
+    }
+    /*
+        super(owner,"Certificate Verification",true);
+        setModal(true);
+        
+        JTextPane tp = new JTextPane();
+        doc = tp.getStyledDocument();
+        JScrollPane sp = new JScrollPane();
+        sp.setPreferredSize(new Dimension(400,300));
+        sp.setViewportView(tp);
+        sp.setAutoscrolls(false);
+
+        this.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
+        JComponent bottom = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        JButton accept = new JButton("Accept");
+        JButton reject = new JButton("Reject");
+        accept.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
+            accepted = true; 
+            hide();
+        }});
+        reject.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
+            accepted = false; 
+            hide();
+        }});
+        bottom.add(accept);
+        bottom.add(reject);
+        getContentPane().add(BorderLayout.CENTER,sp);
+        getContentPane().add(BorderLayout.SOUTH,bottom);
+        pack();
+    }*/
+    
+    public static String prettyFingerprint(byte[] fp) {
+        StringBuffer sb = new StringBuffer(fp.length*3);
+        for(int i=0;i<fp.length;i++) {
+            if(i>0) sb.append(":");
+            sb.append("0123456789abcdef".charAt((fp[i] & 0xf0) >>> 4));
+            sb.append("0123456789abcdef".charAt((fp[i] & 0x0f) >>> 0));
+        }
+        return sb.toString();
+    }
+    
+    public synchronized boolean checkCerts(X509.Certificate[] certs, String hostname, SSL.Exn exn) {
+        final boolean[] ret = new boolean[1];
+        JTextArea ta = new JTextArea();
+        ta.append("Subject: " + certs[0].subject + "\n");
+        ta.append("Issuer: " + certs[0].issuer + "\n");
+        ta.append("Start Date: " + certs[0].startDate + "\n");
+        ta.append("End Date: " + certs[0].endDate + "\n");
+        ta.append("MD5: " + prettyFingerprint(certs[0].getMD5Fingerprint()) + "\n");
+        ta.append("SHA1: " + prettyFingerprint(certs[0].getSHA1Fingerprint()) + "\n");
+        ta.setEditable(false);
+        ta.setOpaque(false);
+        JScrollPane sp = new JScrollPane(ta);
+        sp.setPreferredSize(new Dimension(300,150));
+        final Object[] messages = new Object[] {
+                "The SSL Certificate the server presented could not be verified.",
+                exn.getMessage(),
+                sp,
+        };
+        Runnable r = new Runnable() { public void run() {
+            int n = JOptionPane.showOptionDialog(
+                    owner,
+                    messages,
+                    "Confirm Server Certificate",
+                    0,
+                    JOptionPane.WARNING_MESSAGE,
+                    null, 
+                    new Object[] { "Accept", "Reject" },
+                    "Accept");
+            ret[0] = n == 0;
+                    
+        } };
+        if(SwingUtilities.isEventDispatchThread()) {
+            r.run();
+        } else {
+            try {
+                SwingUtilities.invokeAndWait(r);
+            } catch(Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return ret[0];
+    }
+
+}