\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 "

Solicitud de Renovación de Certificado

Datos de la Solicitud

Identificador
Código de solicitud
Password de Usuario
PIN del Certificado
Privacidad
\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:

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:

\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 (); ?>