\n";
// En la variable command guardaremos el estado de la renovacion.
// Dependiendo de su valor, entraremos en una u otra parte del codigo.
$command = $_POST["crt_command"];
$status = "renew";
$errorCode = "a0";
switch($command) {
// Por defecto mostramos el formulario en el que se le solicita
// al usuario los datos del certificado a renovar
default:
echo "
Datos de la Solicitud
\n";
break;
case "crt_process":
// Obtenemos el valor de las variables pasadas en el formulario
$crtID = $_POST['crtID'];
$copa = $_POST['copa'];
$userPass = $_POST['userPass'];
$userPin = $_POST['userPin'];
$csr_showMail = $_POST['csr_showMail'];
// Tenemos que comprobar que los datos proporcionados son correctos
// y cumplen los requisitos de una renovacion
// Lo primero que tenemos que comprobar es si el certificado
// pertenece a la RA desde la que se esta realizando la solicitud
list ($crtNumRa, $kk) = split ("b", $copa);
if ( $crtNumRa != $raNum )
$errorCode = "a4b2c3d2e4";
else {
$filter = "(&(objectClass=pkirisCertificate)(pkirisCopaID=$copa))";
$justthese = array("pkirisID", "pkirisstatus");
$result = ldap_get_info($ldapVar['base'], $filter, $justthese);
if ( !$result )
$errorCode = "a4b2c3d1e1";
else {
// Verificamos si existe el codigo del certificado, si el resultado
// del count($result) es 1 no existe, si es 2 si existe.
if (count($result) == 1)
$errorCode = "a4b2c3d2e1";
else if ($result[0]["pkirisstatus"][0] != "issued")
$errorCode = "a4b2c3d2e3";
// Si existe, tenemos que comprobar si el identificador introducido
// se corresponde con ese codigo
else {
if ($result[0]["pkirisid"][0] != $crtID )
$errorCode = "a4b2c3d2e2";
else {
// Hacemos un bind al ldap para verificar la password del usuario.
$ds = ldap_connect($ldapVar['server'], $ldapVar['port']);
if ( !$ds )
$errorCode = "a4b2c3d1e3";
else {
list ($copaUsr, $kk) = split ("c", $copa);
$dn = $ldapVar['rdnAttr']."=".$copaUsr.",".$ldapVar['base'];
$ldapbind = ldap_bind($ds, $dn, $userPass);
if (!$ldapbind)
$errorCode = "a4b2c3d1e4";
else {
// Buscamos la informacion del certificado que tenga el
// usuario en estado issued.
$usrCerts=$copaUsr."c";
$filter = "(&(objectClass=pkirisCertificate)(pkirisStatus=issued)(pkirisCopaID=$usrCerts*))";
$justthese = array("pkirispin", "pkiriscertificateexpirationdate");
$result = ldap_get_info($ldapVar['base'], $filter, $justthese);
if ( !$result )
$errorCode = "a4b2c3d1e1";
else {
//Contamos cuantos certificados tiene firmados el usuario
$counter = count($result);
if ($counter <= 1)
$errorCode = "a4b2c3d2e3";
else if ($counter > 2)
$errorCode = "a4b2c3d2e5";
// Si solo tiene un certificado firmado ($counter==2),
// entonces puede pedir la renovacion
else{
// Comparamos los pines para ver si son iguales
if (crypt($userPin, $result[0]["pkirispin"][0]) != $result[0]["pkirispin"][0])
$errorCode = "a4b2c3d2e6";
else {
// Obtenemos el numero de renovaciones que ha
// realizado el usuario cuyo numero copa es &copaUsr
$currentRenewalsNum = renewalsCounter($copaUsr);
if ( false ) //!$currentRenewalsNum ) // la funcion puede devolver 0, y 0==false, pero 0 no sifnifica error
$errorCode = "a4b2c3d2e7";
else {
// No se le permitira renovar si ha alcanzado el numero
// maximo de renovaciones permitidas
if ($currentRenewalsNum >= $pkiris['maxRenewalsNum'])
$errorCode = "a4b2c3d2e8";
else{
// Recuperamos del ldap la fecha de expiracion del
// certificado. Ademas, tenemos que obtener la
// fecha actual y la fecha permitida para la
// renovacion, correspondiente a 30 dias antes de
// la fecha de expiracion
$expirationDate = $result [0]["pkiriscertificateexpirationdate"][0];
$currentDate = date("YmdHis");
// Pasamos la fecha de expiracion a segundos
$year = substr($expirationDate, 0, 4);
$month = substr($expirationDate, 4, 2);
$day = substr($expirationDate, 6, 2);
$hour = substr($expirationDate, 8, 2);
$minute = substr($expirationDate, 10, 2);
$second = substr($expirationDate, 12, 2);
$renewalPermittedDate = mktime($hour, $minute, $second, $month, $day, $year);
// y le restamos 30 dias (2592000 segundos)
$renewalPermittedDate -= 2592000;
// obteniendo asi la fecha permitida
$renewalPermittedDate = date("YmdHis",$renewalPermittedDate);
// Solo podremos renovar el certificado si estamos
// dentro de los 30 dias permitidos
if ( ($currentDate > $renewalPermittedDate) and ( $currentDate < $expirationDate) ) {
// Comprobamos que no hay ninguna peticion de
// renovacion anterior
$copaLastCsr = $copaUsr . "c". (getCounter($copaUsr));
$lastStatus = getStatus($copaLastCsr);
if ( !$lastStatus )
$errorCode = "a4b2c3d2e10";
else if ($lastStatus == "renew")
$errorCode = "a4b2c3d2e9";
}
else { // Si no estamos en el rango permitido
if ($currentDate <= $renewalPermittedDate )
$errorCode = "a4b2c3d2e11";
else
$errorCode = "a4b2c3d2e12";
}
}
}
}
}
}
}
}
}
}
}
}
// Una vez comprobados todos los requisitos, si no se ha producido
// ningun error, insertamos las solicitud en el servidor LDAP
if ( $errorCode == "a0" ) {
// Construimos el numero copa de la nueva CSR a
// partir del contador de certificados del usuario
$copaNew = $copaUsr . "c". (getCounter($copaUsr) + 1);
$justthese = array ("pkirisid","pkirispin","pkiriscsr","pkiriscerttype","pkirissubjectdn");
$oldCrtInfo = ldap_get_info($ldapVar['base'], $filter, $justthese);
if ( !$oldCrtInfo )
$errorCode = "a4b2c3d1e1";
else {
// Preparamos los datos necesarios para generar la traza
$dn = $ldapVar['rdnAttr']."=".$copaNew.",".$ldapVar['base'];
$crt_type = $oldCrtInfo[0]["pkiriscerttype"][0];
$traceVals["status"] = $status;
$traceVals["copa"] = $copaNew;
$traceVals["currentDate"] = $currentDate;
// Generamos la traza con los valores de $traceVals
$pkiTrace = getTrace($traceVals);
if ( !$pkiTrace )
$errorCode = "a4b2c3d2e14";
else {
// Creamos un array con los atributos necesarios,
// algunos de los cuales se copiaran del
// certificado a renovar y otros seran nuevos
$info["objectClass"][0] = "top";
$info["objectClass"][1] = "irisObject";
$info["objectClass"][2] = "pkirisCertificate";
$info[$ldapVar['rdnAttr']] = "$copaNew";
$info["pkirisID"] = $oldCrtInfo[0]["pkirisid"][0];
$info["pkirisTrace"] = $pkiTrace;
$info["pkirisStatus"] = $status;
$info["pkirisDate"] = "$currentDate";
$info["pkirisPin"] = $oldCrtInfo[0]["pkirispin"][0];
$info["pkirisCSR"] = $oldCrtInfo[0]["pkiriscsr"][0];
$info["pkirisCertType"] = $crt_type;
$info["pkirisSubjectDN"] = $oldCrtInfo[0]["pkirissubjectdn"][0];
$info["pkirisCopaID"] = "$copaNew";
// Sacamos el email de los datos del usuario
$filter = "(&(objectClass=pkirisEndEntity)(pkirisCopaID=$copaUsr))";
$justthese = array("mail");
$userInfo = ldap_get_info($ldapVar['base'], $filter, $justthese);
if ( !$userInfo )
$errorCode = "a4b2c3d1e1";
else {
$info["mail"]= $userInfo[0]["mail"][0];
// Si la CSR es de usuario, le agregamos
// el campo pkirisShowMail
if( ($crt_type == "usr") )
$info["pkirisshowmail"] = $csr_showMail;
else
$info["pkirisshowmail"] = "FALSE";
// Insertamos en el ldap la peticion de renovacion
$r = ldap_add_info($dn, $info);
if (!$r)
$errorCode = "a4b2c3d1e2";
else {
// Incrementamos el contador del numero de certificados del usuario
$r = incrCounter ($copaUsr);
if (!$r)
$errorCode = "a4b2c3d2e13";
else {
// Le enviamos al administrador un email para avisarle de que tiene una nueva CSR
$envioMail = mail($ldapVar['adminRaMail'], "Renovación de certificado", "Se ha generado una petición de renovación del certificado cuyo identificador es: $crtID\n");
echo "
Solicitud Aceptada
Su solicitud:
- Identificador: $crtID
- Código de soliciud: $copaNew
ha sido aceptada.
Por favor es muy importante que anote los valores anteriores ya que le serán de utilidad a la hora de las siguientes operaciones:
- Autenticación frente a la autoridad de registro.
- Descarga de su certificado.
- Revocación de su certificado.
\n";
// Registramos la accion en el fichero de log
$pkiLog['status'] = $status;
$pkiLog['eee'] = $copa;
$pkiLog['user'] = "Publico";
$pkiLog['error'] = $errorCode;
writeLog ($pkiLog);
}
}
}
}
}
}
break;
} // switch
// Si se ha producido algun error, llamamos a la funcion encargada de
// tratarlos
if ( $errorCode != "a0" ) {
echo "
Error en la Solicitud de Renocación
No ha sido posible generar su solicitud.
\n";
$pkiLog['status'] = $status;
$pkiLog['eee'] = $copa;
$pkiLog['user'] = "Publico";
$pkiLog['error'] = $errorCode;
pkirisErrorHandler($pkiLog);
}
pie ();
?>