## OpenCA - CA Command
## (c) 1998-2001 by Massimiliano Pala and OpenCA Group
##
##   File Name: genCRL
##       Brief: Issue a CRL
## Description: Issue a new CRL
##  Parameters: passwd
## Cfg KeyWord: OpenCADir,TempDir

sub cmdGenCRL {

## This function exports the CRL in DER format (preferred
## to the default PEM format for its smaller size: CRL
##// can get very long in a medium CAs' life cycle).
				  
## Get required parameters from the configuration file
my $cacert    = getRequired( 'CACertificate' );
my $cakey     = getRequired( 'CAKey' );
my $crlDir    = getRequired( 'CRLDir' );

## unique DN?
my $nouniqueDN = 0;
if (getRequired ('UNIQUE_DN') =~ /NO|N|OFF/i) {
	$nouniqueDN = 1;
}

my $pwd     = $query->param( 'passwd' );
my $days    = $query->param( 'days' );
my $exts    = $query->param( 'exts' );
	
print startLogPage("CRL Issuing");
print addLogSection(gettext ("Generating Certificate Revocation List ... "));

## Generate a new CRL object
my $CRL = new OpenCA::CRL (
                           SHELL      => $cryptoShell,
                           CACERT     => $cacert,
                           CAKEY      => $cakey,
                           DAYS       => $days,
                           EXTS       => $exts,
                           PASSWD     => "$pwd",
                           NOUNIQUEDN => $nouniqueDN );

if ( not $CRL ) {
	print addErrorLog   (gettext ("ERROR: Cannot initialize a new CRL Object!"));
	print addPreLogLine ($CRL);
	print addPreLogLine (i18nGettext ("OpenCA::OpenSSL errorcode: __ERRNO__", "__ERRNO__", $OpenCA::OpenSSL::errno));
	print addPreLogLine (i18nGettext ("OpenCA::OpenSSL errormessage: __ERRVAL__", "__ERRVAL__", $OpenCA::OpenSSL::errval));
	closePage();
	return undef;
}

$ret = $CRL->getTXT();
print addLogLine(gettext("Ok."));
print addPreLogLine( $ret );
print closeLogSection();

print addLogSection(gettext("Saving CRL to PEM format ... "));
if ( open( FD, ">$crlDir/${$}_cacrl.pem" ) ) {
	print FD $CRL->getPEM();
	close(FD);
} else {
	print addErrorLog(i18nGettext ("CRL saving Error (__FILE__)!", "__FILE__", "$crlDir/${$}_cacrl.pem"));
	print addPreLogLine("$!");
	closePage();
	return undef;
}
print addLogLine(gettext("Ok."));
print addPreLogLine("$crlDir/${$}_cacrl.pem");
print closeLogSection();

print addLogSection(gettext ("Importing CRL to dB ... "));
if( not $db->storeItem( DATATYPE=>VALID_CRL, OBJECT=>$CRL, MODE=>"INSERT" )) {
	print addErrorLog(gettext ("DB Error while importing!"));
	closePage();
	return undef;
}
print addLogLine(gettext ("Ok."));
print closeLogSection();

print addLogSection( gettext ("Making CRL available on server ... "));
if (not $tools->saveFile (FILENAME => "$crlDir/cacrl.pem",
			DATA       => $CRL->getPEM())) {
	print addPreLogLine ("<FONT COLOR=#FF0000>".
			i18nGettext ("Cannot update CRL on server. FILE: __FILE__", "__FILE__", "$crlDir/cacrl.pem").
			"</FONT>");
} else {
	print addPreLogLine ("<FONT COLOR=#00FF00>".
			i18nGettext ("Updated CRL on server. FILE: __FILE__", "__FILE__", "$crlDir/cacrl.pem").
			"</FONT>");
}
if (not $tools->saveFile (FILENAME => "$crlDir/cacrl.der",
			DATA       => $CRL->getDER())) {
	print addPreLogLine ("<FONT COLOR=#FF0000>".
			i18nGettext ("Cannot update CRL on server. FILE: __FILE__", "__FILE__", "$crlDir/cacrl.der").
			"</FONT>");
} else {
	print addPreLogLine ("<FONT COLOR=#00FF00>".
			i18nGettext ("Updated CRL on server. FILE: __FILE__", "__FILE__", "$crlDir/cacrl.der").
			"</FONT>");
}
if (not $tools->saveFile (FILENAME => "$crlDir/cacrl.crl",
			DATA       => $CRL->getDER())) {
	print addPreLogLine ("<FONT COLOR=#FF0000>".
			i18nGettext ("Cannot update CRL on server. FILE: __FILE__", "__FILE__", "$crlDir/cacrl.crl").
			"</FONT>");
} else {
	print addPreLogLine ("<FONT COLOR=#00FF00>".
			i18nGettext ("Updated CRL on server. FILE: __FILE__", "__FILE__", "$crlDir/cacrl.crl").
			"</FONT>");
}
if (not $tools->saveFile (FILENAME => "$crlDir/cacrl.txt",
			DATA       => $CRL->getTXT())) {
	print addPreLogLine ("<FONT COLOR=#FF0000>".
			i18nGettext ("Cannot update CRL on server. FILE: __FILE__", "__FILE__", "$crlDir/cacrl.txt").
			"</FONT>");
} else {
	print addPreLogLine ("<FONT COLOR=#00FF00>".
			i18nGettext ("Updated CRL on server. FILE: __FILE__", "__FILE__", "$crlDir/cacrl.txt").
			"</FONT>");
}
print closeLogSection();

closePage();

return 1;

}

1;

