blob: 415b1e21444ece18fb589f7b5ea09d2cb20a1757 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.j2ee.weblogic9;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.text.DateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import org.openide.util.NbBundle;
/**
*
* @author Petr Hejl
*/
public class CertificateQuestionPanel extends javax.swing.JPanel {
private static final Logger LOGGER = Logger.getLogger(CertificateQuestionPanel.class.getName());
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
/**
* Creates new form CertificatePanel
*/
public CertificateQuestionPanel(X509Certificate cert) {
initComponents();
setCertificateInfo(cert);
}
@NbBundle.Messages({
"LBL_Description=Description",
"LBL_Value=Value",
"LBL_IssuedTo=<html><b>Issued To</b></html>",
"LBL_IssuedBy=<html><b>Issued By</b></html>",
"LBL_SerialNumber=Serial Number",
"LBL_CommonName=Common Name (CN)",
"LBL_Organization=Organization (O)",
"LBL_OrganizationalUnit=Organizational Unit (OU)",
"LBL_ValidityPeriod=<html><b>Validity Period</b></html>",
"LBL_BeginsOn=Begins On",
"LBL_ExpiresOn=Expires On",
"LBL_Fingerprints=<html><b>Fingerprints</b></html>",
"LBL_MD5Fingerprint=MD5 Fingerprint",
"LBL_SHA1Fingerprint=SHA-1 Fingerprint"
})
private void setCertificateInfo(X509Certificate cert) {
BigInteger serialNumber = cert.getSerialNumber();
byte[] byteValue = serialNumber.toByteArray();
String certSerialNumber = bytesToHex(byteValue);
String md5 = getCertFingerPrint("MD5", cert); // NOI18N
String sha1 = getCertFingerPrint("SHA1", cert); // NOI18N
Map<String, String> subject = getDNString(cert.getSubjectDN().toString());
Map<String, String> issuer = getDNString(cert.getIssuerDN().toString());
DateFormat format = DateFormat.getDateInstance();
String[] columnNames = { Bundle.LBL_Description(), Bundle.LBL_Value() };
Object[][] data = {
{ Bundle.LBL_IssuedTo(), null },
{ Bundle.LBL_CommonName(),
subject.get("CN") }, // NOI18N
{ Bundle.LBL_Organization(),
subject.get("O") }, // NOI18N
{ Bundle.LBL_OrganizationalUnit(),
subject.get("OU") }, // NOI18N
{ Bundle.LBL_SerialNumber(),
certSerialNumber },
{ Bundle.LBL_IssuedBy(), null },
{ Bundle.LBL_CommonName(),
issuer.get("CN") }, // NOI18N
{ Bundle.LBL_Organization(),
issuer.get("O") }, // NOI18N
{ Bundle.LBL_OrganizationalUnit(),
issuer.get("OU") }, // NOI18N
{ Bundle.LBL_ValidityPeriod(), null },
{ Bundle.LBL_BeginsOn(), format.format(cert.getNotBefore()) },
{ Bundle.LBL_ExpiresOn(), format.format(cert.getNotAfter()) },
{ Bundle.LBL_Fingerprints(), null },
{ Bundle.LBL_MD5Fingerprint(), md5},
{ Bundle.LBL_SHA1Fingerprint(), sha1}
};
certificateTable.setModel(new DefaultTableModel(data, columnNames) {
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
});
certificateTable.getColumnModel().getColumn(0).setPreferredWidth(50);
certificateTable.getColumnModel().getColumn(1).setPreferredWidth(200);
certificateTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
certificateTable.repaint();
}
private static Map<String, String> getDNString(String dnString) {
int len = dnString.length();
boolean inQuote = false;
boolean inKey = true;
Map<String, String> result = new HashMap<String, String>();
StringBuilder key = new StringBuilder();
StringBuilder value = new StringBuilder();
for (int i = 0; i < len; i++) {
char ch = dnString.charAt(i);
if (!inQuote) {
if (inKey && ch == '=') {
inKey = false;
continue;
}
if (ch == ',') {
result.put(key.toString().trim(), value.toString().trim());
key.setLength(0);
value.setLength(0);
inKey = true;
continue;
}
}
if (ch == '\"' || ch == '\'') {
inQuote = !inQuote;
continue;
}
if (inKey) {
key.append(ch);
} else {
value.append(ch);
}
}
result.put(key.toString().trim(), value.toString().trim());
return result;
}
private static String getCertFingerPrint(String mdAlg, X509Certificate cert) {
try {
byte[] encCertInfo = cert.getEncoded();
MessageDigest md = MessageDigest.getInstance(mdAlg);
byte[] digest = md.digest(encCertInfo);
return bytesToHex(digest);
} catch (CertificateEncodingException ex) {
LOGGER.log(Level.FINE, null, ex);
} catch (NoSuchAlgorithmException ex) {
LOGGER.log(Level.FINE, null, ex);
}
return null;
}
private static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
certificateScrollPane = new javax.swing.JScrollPane();
certificateTable = new javax.swing.JTable();
messageScrollPane = new javax.swing.JScrollPane();
messageTextArea = new javax.swing.JTextArea();
certificateScrollPane.setViewportView(certificateTable);
messageScrollPane.setBorder(null);
messageTextArea.setEditable(false);
messageTextArea.setBackground(javax.swing.UIManager.getDefaults().getColor("Label.background"));
messageTextArea.setColumns(20);
messageTextArea.setLineWrap(true);
messageTextArea.setText(org.openide.util.NbBundle.getMessage(CertificateQuestionPanel.class, "MSG_Explanation")); // NOI18N
messageTextArea.setWrapStyleWord(true);
messageScrollPane.setViewportView(messageTextArea);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(messageScrollPane)
.addComponent(certificateScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(messageScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(certificateScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 344, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane certificateScrollPane;
private javax.swing.JTable certificateTable;
private javax.swing.JScrollPane messageScrollPane;
private javax.swing.JTextArea messageTextArea;
// End of variables declaration//GEN-END:variables
}