Hola a todos. Tengo un problema a la hora de almacenar el PDF firmado desde
PHP.
Utilizo la función signUrlToUrl, pasándole a la url de destino (el php que
me da problemas) un parámetro adicional con la ruta en la que quiero que
almacene al PDF firmado.
El proceso de firma se realiza correctamente y se invoca al PHP pasándole
por POST los parámetros: content (con el contenido del PDF en base64,
teóricamente) y path (con la ruta). El caso es que la decodificación a
base64 parece estar fallando, pues se genera un fichero con tamaño 0. No
obstante el parámetro $_POST["content"] tiene datos, sino no pasaría del
if.... ¿alguien ve o sabe que se hace mal?.
Os envío los ficheros implicados:
PHP:
<?php
//Procesar los includes
$g_path = $_SERVER['DOCUMENT_ROOT'] . "/FLUX";
$g_path = str_replace("//", "/", $g_path);
/*****************/
/** PROPIEDADES **/
/*****************/
$g_res = "";
$g_rutaFichero = "";
$g_rutaBackup = "";
//Comprobar parámetros
if(isset($_POST["content"]) && isset($_POST["path"]))
{
//Obtener el contenido del fichero
if(($g_contenidoFichero = base64_decode($_POST["content"])) === FALSE)
{
$g_res = "Fallo al decodificar el contenido del fichero: " .
$_POST["content"];
}
else
{
//$g_contenidoFichero = $_POST["content"];
//Obtener las rutas al documento
$g_rutaFichero = $g_path . "/" . $_POST["path"];
$g_rutaBackup = "$g_rutaFichero.bak";
//Comprobar
if(file_exists($g_rutaFichero))
{
//Hacer un backup del fichero a reemplazar
if(file_exists($g_rutaBackup))
{
unlink($g_rutaBackup);
}
copy($g_rutaFichero, $g_rutaBackup);
//Crear el fichero firmado
if(($fh = fopen($g_rutaFichero, 'w')) === FALSE)
{
$g_res = "No se puede sobreescribir el documento original";
}
else
{
if(fwrite($fh, $g_contenidoFichero) === FALSE)
{
$g_res = "Fallo al escribir el contenido:
$g_contenidoFichero";
//Restablecer el backup
fclose($fh);
copy($g_rutaBackup, $g_rutaFichero);
}
else
{
fclose($fh);
}
}
}
else
{
$g_res = "El fichero a firmar no existe";
}
}
}
else
{
$g_res = "El fichero firmado está vacío";
}
echo $g_res;
?>
URLOUTPUTPARAMS.JAVA
package es.uji.security.ui.applet.io;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.StringTokenizer;
import netscape.javascript.JSObject;
import org.apache.log4j.Logger;
import es.uji.security.crypto.config.OS;
import es.uji.security.ui.applet.JSCommands;
import es.uji.security.ui.applet.SignatureApplet;
public class URLOutputParams extends AbstractData implements OutputParams
{
private Logger log = Logger.getLogger(URLOutputParams.class);
private String[] urls = null;
private int current = 0;
private boolean signOkInvoked = false;
private boolean loginOkInvoked = false;
private int _count = 1;
private int outputcount = 0;
private int conn_timeout = 10000;
private int read_timeout = 60000;
private String postVariable = "content";
public URLOutputParams(String[] urls)
{
this(urls, "content");
}
public URLOutputParams(String[] urls, String postVariable)
{
this.urls = urls;
this.postVariable = postVariable;
}
public void setOutputCount(int oCount)
{
this.outputcount = oCount;
}
public void setSignData(InputStream is) throws IOException
{
String cookies = "";
// Try to obtain and configure Cookies
try
{
log.debug("Recover JavaScript member: document");
JSObject document = (JSObject)
JSCommands.getWindow().getMember("document");
cookies = (String) document.getMember("cookie");
log.debug("Cookies: " + cookies);
}
catch (Exception e)
{
log.debug("Cookies can not be obtained", e);
}
String urlOk= null;
String urlOriginal = null;
if (this.urls.length>1)
urlOriginal = this.urls[current];
else
urlOriginal = this.urls[0];
if (urlOriginal.indexOf('?') > -1)
{
urlOk = urlOriginal.substring(0, urlOriginal.indexOf('?'));
}
else
{
urlOk = urlOriginal;
}
log.debug("Posting data to " + urlOk + ", with post parameter
variable " + postVariable);
URL url = new URL(urlOk);
HttpURLConnection urlConn = (HttpURLConnection)
url.openConnection();
urlConn.setConnectTimeout(conn_timeout);
urlConn.setReadTimeout(read_timeout);
urlConn.setRequestMethod("POST");
urlConn.setRequestProperty("Content-type",
"application/x-www-form-urlencoded");
urlConn.setRequestProperty("Cookie", "");
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
DataOutputStream out = new
DataOutputStream(urlConn.getOutputStream());
byte[] buffer = new byte[2048];
int length = 0;
out.writeBytes(postVariable + "=");
while ((length = is.read(buffer)) >= 0)
{
out.writeBytes(URLEncoder.encode(new String(buffer,0,length),
"ISO-8859-1"));
}
out.writeBytes("&item=" + URLEncoder.encode("" + _count,
"ISO-8859-1"));
//Enviar los par�metros asociados a la url original
StringTokenizer strTok = new
StringTokenizer(urlOriginal.substring(urlOriginal.indexOf('?') + 1), "&");
while (strTok.hasMoreTokens())
{
String strAux = strTok.nextToken();
log.debug("PROCESANDO TOKEN: " + strAux);
if (strAux.indexOf("=") > -1)
{
String var = strAux.substring(0, strAux.indexOf("="));
String value = strAux.substring(strAux.indexOf("=") + 1);
log.debug("ENVIANDO EN EL POST : " + var + "=" + value);
out.writeBytes("&" + var + "=" + URLEncoder.encode(new
String(value), "ISO-8859-1"));
}
}
out.flush();
out.close();
log.debug("Respuesta del servidor: " +
urlConn.getResponseMessage());
if (urlConn.getResponseCode() >= 400)
{
log.error("Error en el post: " +
urlConn.getResponseCode());
throw new IOException("Error en el post: " +
urlConn.getResponseCode());
}
_count++;
current++;
try
{
is.close();
new File(OS.getSystemTmpDir() + "/signature.xsig").delete();
}
catch(Exception e)
{
}
}
public void setLoginData(String data)
{
//TODO: Not supported
}
public void setSignFormat(SignatureApplet base, byte[] signFormat)
{
}
public void setSignFormat(byte[] signFormat) throws IOException
{
}
public void signOk()
{
if (!signOkInvoked)
{
log.debug("Call JavaScript method: onSignOk");
JSCommands.getWindow().call("onSignOk", new String[] { "" });
}
}
public void loginOk()
{
if (!loginOkInvoked)
{
log.debug("Call JavaScript method: onLoginOk");
JSCommands.getWindow().call("onLoginOk", new String[] { "" });
}
}
public void flush()
{
_count = 1;
current = 0;
}
}
Ya no se me ocurren muchas cosas más, así que agradecería cualquier tipo de
ayuda.
Gracias. Un saludo.
--
Héctor Espí Hernández
_______________________________________________
CryptoApplet mailing list
[email protected]
http://llistes.uji.es/mailman/listinfo/cryptoapplet