/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.fp.firma.applet;
import com.fp.firma.common.CertificateUtils;
import com.fp.firma.common.FirmMessages;
import com.itextpdf.text.Rectangle;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
/**
* Applet de firma electrónica a través de token
* @author dcruz
*/
public class FirmaApplet extends javax.swing.JApplet {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final String PREFIX = "firmado_";
private String rutaArchivoFirmar = "";
private static final Logger logger = Logger.getLogger(FirmaApplet.class .getName());
private String tipoFirma;
/**
* Initializes the applet FirmaApplet
*/
@Override
public void init() {
// FileHandler handler;
// try {
// handler = new FileHandler(System.getProperty("java.io.tmpdir")+"\\applet.txt");
// handler.setFormatter(new SimpleFormatter());
// logger.addHandler(handler);
// } catch (IOException ex) {
// Logger.getLogger(FirmaApplet.class.getName()).log(Level.SEVERE, null, ex);
// } catch (SecurityException ex) {
// Logger.getLogger(FirmaApplet.class.getName()).log(Level.SEVERE, null, ex);
// }
/* Set the Nimbus look and feel */
//
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(FirmaApplet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(FirmaApplet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(FirmaApplet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(FirmaApplet.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//
/* Create and display the applet */
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
initComponents();
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* This method is called from within the init() method to initialize the form. WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
private void initComponents() {
grupoRadios = new javax.swing.ButtonGroup();
jPanel1 = new javax.swing.JPanel();
labelArchivoFirma = new javax.swing.JLabel();
txtRutaArchivo = new javax.swing.JTextField();
btnExaminar = new javax.swing.JButton();
btnFirmarArchivo = new javax.swing.JButton();
tokenIkey = new javax.swing.JRadioButton();
tokenAlladin = new javax.swing.JRadioButton();
tokenSD = new javax.swing.JRadioButton();
grupoRadios.add(tokenIkey);
grupoRadios.add(tokenAlladin);
grupoRadios.add(tokenSD);
labelArchivoFirma.setText("Archivo a firmar");
txtRutaArchivo.setEditable(false);
btnFirmarArchivo.setEnabled(true);
btnExaminar.setEnabled(true);
btnExaminar.setText("Examinar");
btnExaminar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnExaminarActionPerformed(evt);
}
});
btnFirmarArchivo.setText("Firmar");
btnFirmarArchivo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnFirmarArchivoActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(labelArchivoFirma)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(12, 12, 12)
.addComponent(btnFirmarArchivo))
.addGroup(jPanel1Layout.createSequentialGroup()
.addComponent(txtRutaArchivo, javax.swing.GroupLayout.PREFERRED_SIZE, 139, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnExaminar)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(labelArchivoFirma)
.addComponent(txtRutaArchivo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnExaminar))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(btnFirmarArchivo)
.addContainerGap())
);
tokenIkey.setText("iKey 2032");
tokenIkey.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tokenIkeyActionPerformed(evt);
}
});
tokenAlladin.setText("eTokenPro");
tokenAlladin.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tokenAlladinActionPerformed(evt);
}
});
tokenSD.setText("Security Data");
tokenSD.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tokenSDActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGap(41, 41, 41)
.addComponent(tokenIkey)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tokenAlladin)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(tokenSD)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(75, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(tokenAlladin)
.addComponent(tokenSD)
.addComponent(tokenIkey))
.addGap(18, 18, 18)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(25, 25, 25))
);
}// //GEN-END:initComponents
private void btnExaminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExaminarActionPerformed
// TODO add your handling code here:
try
{
/**llamamos el metodo que permite cargar la ventana*/
JFileChooser fileChooser=new JFileChooser();
String rutaArchivo = txtRutaArchivo.getText();
File directorio = new File(rutaArchivo).getParentFile();
fileChooser.setCurrentDirectory(directorio);
// System.out.println("Directorio del archivo "+fileChooser.getCurrentDirectory() != null ? fileChooser.getCurrentDirectory().getAbsolutePath() : "");
/**abrimos el archivo seleccionado*/
int respuestaDialog = fileChooser.showOpenDialog(this);
if(respuestaDialog == JFileChooser.APPROVE_OPTION){
File fileSelected = fileChooser.getSelectedFile();
rutaArchivoFirmar = fileSelected.getAbsolutePath();
System.out.println("Ruta del archivo escogido "+rutaArchivoFirmar);
txtRutaArchivo.setText(rutaArchivoFirmar);
} else{
JOptionPane.showMessageDialog(null,"" +
"\nAccion cancelada por el usuario",
"ADVERTENCIA!!!",JOptionPane.WARNING_MESSAGE);
}
/**recorremos el archivo, lo leemos para plasmarlo
*en el area de texto*/
}catch(Throwable ex)
{
JOptionPane.showMessageDialog(null,ex+"" +
"\nNo se ha encontrado el archivo",
"ADVERTENCIA!!!",JOptionPane.WARNING_MESSAGE);
}
}//GEN-LAST:event_btnExaminarActionPerformed
private void btnFirmarArchivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFirmarArchivoActionPerformed
// TODO add your handling code here:
InputStream inputStream = null;
try{
String razon = getParameter("razon") != null ? getParameter("razon") : "";
String lugar = getParameter("lugar") != null ? getParameter("lugar") : "";
String nombreFirma = getParameter("firma") != null ? getParameter("firma") : "";
Float llx = Float.valueOf(getParameter("llx") != null ? Float.parseFloat(getParameter("llx")) : 0.0F);
Float lly = Float.valueOf(getParameter("lly") != null ? Float.parseFloat(getParameter("lly")) : 0.0F);
Float urx = Float.valueOf(getParameter("urx") != null ? Float.parseFloat(getParameter("urx")) : 0.0F);
Float ury = Float.valueOf(getParameter("ury") != null ? Float.parseFloat(getParameter("ury")) : 0.0F);
if(tipoFirma == null){
JOptionPane.showMessageDialog(null, "Debe seleccionar un Token con el cual firmar", "Tipo Firma", JOptionPane.ERROR_MESSAGE);
return;
}
if(txtRutaArchivo.getText() != null){
JPasswordField txtPasswordToken = new JPasswordField();
final JComponent[] components = new JComponent[]{new JLabel("Password:"), txtPasswordToken};
JOptionPane.showMessageDialog(null, components, "TOKEN", JOptionPane.PLAIN_MESSAGE);
if(txtPasswordToken.getPassword() == null){
throw new NullPointerException(FirmMessages.getString("FIR-0007"));
}
inputStream = new FileInputStream(txtRutaArchivo.getText());
byte[] datos = CertificateUtils.sign(inputStream, null, new String(txtPasswordToken.getPassword()), razon, lugar, Boolean.FALSE.booleanValue(), Boolean.FALSE.booleanValue(), new Rectangle(llx.floatValue(), lly.floatValue(), urx.floatValue(), ury.floatValue()), 1, nombreFirma, this.tipoFirma);
if(datos != null){
escribirArchivo(datos);
txtPasswordToken.setText("");
JOptionPane.showMessageDialog(null, "El archivo se modificado correctamente", "Archivo firmado", JOptionPane.INFORMATION_MESSAGE);
}
}else{
JOptionPane.showMessageDialog(null, "Debe seleccionar un archivo", "Archivo no encontrado", JOptionPane.ERROR_MESSAGE);
}
btnFirmarArchivo.setEnabled(false);
btnExaminar.setEnabled(false);
} catch(IOException e){
JOptionPane.showMessageDialog(null, e.getMessage(), "IO Error", JOptionPane.ERROR_MESSAGE);
} catch(Exception e){
JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
} finally{
try {
if(inputStream != null){
inputStream.close();
}
} catch (IOException ex) {
Logger.getLogger(FirmaApplet.class.getName()).log(Level.SEVERE, null, ex);
}
}
}//GEN-LAST:event_btnFirmarArchivoActionPerformed
public void escribirArchivo(byte[] data){
System.out.println("Ingreso a escribir el archivo");
FileOutputStream fo = null;
try {
File archivoFirmado = new File(txtRutaArchivo.getText());
fo = new FileOutputStream(archivoFirmado);
fo.write(data);
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Error archivo no encontrado", JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Error al escribir el archivo firmado", JOptionPane.ERROR_MESSAGE);
} finally {
try {
fo.close();
} catch (IOException ex) {
Logger.getLogger(FirmaApplet.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void tokenIkeyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tokenIkeyActionPerformed
// TODO add your handling code here:
tipoFirma = "1";
}//GEN-LAST:event_tokenIkeyActionPerformed
private void tokenAlladinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tokenAlladinActionPerformed
// TODO add your handling code here:
tipoFirma = "2";
}//GEN-LAST:event_tokenAlladinActionPerformed
private void tokenSDActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tokenSDActionPerformed
// TODO add your handling code here:
tipoFirma = "3";
}//GEN-LAST:event_tokenSDActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnExaminar;
private javax.swing.JButton btnFirmarArchivo;
private javax.swing.ButtonGroup grupoRadios;
private javax.swing.JPanel jPanel1;
private javax.swing.JLabel labelArchivoFirma;
private javax.swing.JRadioButton tokenAlladin;
private javax.swing.JRadioButton tokenIkey;
private javax.swing.JRadioButton tokenSD;
private javax.swing.JTextField txtRutaArchivo;
// End of variables declaration//GEN-END:variables
}