lunes, 25 de abril de 2011

Firefox 4: errores con DNIe y otros certificados digitales


Como a más de uno le habrá pasado, al instalar la última versión de Firefox (la 4), tuve la desagradable sorpresa de que mi DNIe, que funcionaba perfectamente, dejó de funcionar al entrar en las webs de algunos bancos y ciertos certificados digitales tampoco me funcionaban. Curiosamente no fallaba al entrar en la web de la agencia tributaria.

El error que daba Firefox4 en ambos casos era el mismo, tanto para dichos certificados como para el DNIe.


Este error se debe a que una de las líneas de las preferencias de Firefox viene cambiada en esta versión, no se si por error o por cambio de política, (Actualización por sugerencia de @tractis: Se debe a un cambio de política debido a una vulnerabilidad detectada en páginas SSL) la cuestión es que basta con cambiar lo siguiente y funcionará como antes sin problemas:

Para quien no separa como cambiar los parámetros internos de configuración de Firefox diremos que hay que poner en la barra de direcciones lo siguiente:

about:config

De este modo nos aparecerá una lista de parámetros de configuración bastante larga. Para seleccionar la línea que buscamos es recomendable introducir en la casilla "Filtro" lo siguiente:

security.ssl.allow

Nos aparecerá la línea con la preferencia de configuración:

security.ssl.allow_unrestricted_renego_everywhere__temporarily_available_pref

En la columna valor veremos que pone "false" para cambiarlo por "true" basta con hacer doble clic en dicho valor y ya está.

(Actualización por sugerencia de @tractis: Tal y como Alfonso de The New Territory explica en su blog la solución descrita unas línas más arriba deja sin resolver la vulnerabilidad comentada anteriormete y tenemos que tener en cuenta que si la llevamos a cabo mantendremos dicha vulnerabilidad para todas las páginas SSL. Lo que él recomienda es incluir sólo las páginas que son de confianza en una lista de excluidos y no modifiquemos la línea que yo apunté)

Eso lo podemos hacer en la línea:

security.ssl.renego_unrestricted_hosts y en el valor introducimos cada dominio se parado por comas: (ej. cam.es,cajamar.es)

A partir de ese momento nuestros certificados y DNIe funcionará igual que antes.

jueves, 14 de abril de 2011

Breve apunte de programación con Java. Impresión con JasperReports a doble cara


Otro breve apunte de programación con Java. Hoy trataremos el tema de imprimir a doble cara usando JasperReports.

Para imprimir algo a doble cara, la forma más sencilla es decirle al driver de impresora que se ponga en modo duplex e imprimir normalmente (el driver se encarga de hacer la impresión a doble cara).

El problema está en que si estamos imprimiendo continuamente cosas a doble cara y cosas que no van a doble cara, que sea el usuario quien cambie las funciones de impresión en cada impresión no es lo más recomendable, por lo que la opción más adecuada es que sea el programa el que indique al driver que vamos a imprimir en duplex, imprimamos como lo haríamos normalmente y sea el driver quien se encargue del duplex y al finalizar el informe deje el tema duplex como antes del mismo.

Con un ejemplo se verá más claro:
jreport = JasperCompileManager.compileReport(new FileInputStream("miReport.jrxml"));

Map parametros = new HashMap();
parametros.put("misql", "select * from clientes order by razon_social");

JasperPrint print = JasperFillManager.fillReport(jreport, parametros, conn);

JRExporter exporter = new JRPrintServiceExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);

PrintRequestAttributeSet attrSet = new HashPrintRequestAttributeSet();
attrSet.add(Sides.DUPLEX);

exporter.setParameter(JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET, attrSet);
exporter.exportReport();

En el ejemplo anterior observamos varias cosas: El report recibe un parámetro (que debemos haber indicado en la creación del mismo) llamado misql, el cuál contiene la SQL que recupera los datos del report.

Una vez tenemos el objeto JasperPrint podemos imprimirlo normalmente o bien crear un objeto JRExporter para aplicarle ciertos parámetros de impresión (en este caso, la impresión DUPLEX).

Finalmente con exporter.exportReport() lo que hacemos es imprimir con los parámetros fijados en exporter.

lunes, 4 de abril de 2011

Breve apunte de programación con Java. ProgressMonitor

Siguiendo con los breves apuntes de programación con Java, hoy hablaremos de una clase muy simple y muy útil que nos brinda Java para monitorizar procesos en nuestros programas de escritorio con Swing.

La clase se llama ProgressMonitor y se construye así:
new ProgressMonitor(Component parentComponent,
  Object message, String note, int min, int max);

Aunque parece bastante claro qué es cada cosa, parentComponent es el componente del que depende la ventana que creará la clase ProgressMonitor y puede ser null, message es el mensaje que mostrará el diálogo en la línea superior, note es la cadena que se mostrará debajo de la anterior y sobre la barra de progreso, min es el valor mínimo de la barra de progreso y max el máximo.

Veamos un ejemplo y cómo se vería:
ProgressMonitor pm = new ProgressMonitor(null, "Importación de Datos",
  "Realizando Importación...", 0, 100);  
pm.setNote("Insertando Albaranes...");
pm.setProgress(0);
new Thread()
{
  public void run()
  {
    hacerCositas(); // en éste método se actualiza pm con 
                    // pm.setProgress(x) para cada registro
  };
}.start();

Se vería más o menos así:

Es muy importante tener en cuenta que para que funcione correctamente ProgressMonitor debe ser actualizado desde un Thread ya que si no se hace así no se actualizará y se mostrará un diálogo completamente estático en el mejor de los casos, a veces ni se muestra.

También conviene recordar que si el proceso tarda menos de 500 milisegundos no se muestra el diálogo. Esta cifra también se puede cambiar.

Para más información es interesante leer Tutorial de uso de Barras de Progreso y ProgressMonitor (en inglés) de Oracle.