## OpenCA - CA Command
## (c) 1998-2001 by Massimiliano Pala and OpenCA Group
##
##   File Name: viewSignature
##       Brief: View Signature
##// Description: Display given object's signature and its validity
##  Parameters: dataType, key

sub cmdViewSignature {

## Get the Configuration parameters ...
my ( $parsed, $lnk, $serLink, $sigInfo, $sigStatus, $signer, $signature);
my ( $baseDoc, $info, $sigCertStatus, $def, $dbStatus, $dbMessage);
my ( $myCN, $myEmail, $mySerial, $tmpCert, $pCert );

my $dataType 	= $query->param('dataType' );
my $key      	= $query->param('key');
my $baseDoc 	= getRequired('ViewSignatureSheet');
my $tempDir  	= getRequired('tempDir');

## Check passed parameters
configError( gettext ("Error, needed dB key!") ) if ( not $key );
configError ( i18nGettext ("Invalid or missing dataType (__DATATYPE__)!", "__DATATYPE__", $dataType)) if ( not $dataType);

## Load base page
if( not ( $page = $query->getFile( $baseDoc )) ) {
	configError ( i18nGettext ("Error while loading file __FILE__!", "__FILE__", $baseDoc) );
};

## Retrieve item from the DB
my $item = $db->getItem( DATATYPE=>$dataType, KEY=>$key );

configError (gettext ("Object not present in DB!") ) if ( not $item );
configError (gettext ("Object not Signed!")) if ( not $item->getParsed()->{SIGNATURE} );

## Get the parsed Object
my $parsed = $item->getParsed();

@cols = ( gettext ("Variable"), gettext ("Value") );

## Get Signature
if( not $signature = libGetSignatureObject( OBJECT=>$item )) {
	generalError( gettext ("Signature Object not returned, check the openca-verify command."), 560);
}

## Get Signer
$signer = $signature->getSigner();

$lnk = new CGI({cmd=>"search", dataType=>"CERTIFICATE",
		name=>"CN", value=>$signer->{DN_HASH}->{CN}[0]} );
$myCN = $lnk->a({-href=>$lnk->self_url()}, $signer->{DN_HASH}->{CN}[0]);

$lnk = new CGI({cmd=>"search", dataType=>"CERTIFICATE",
		name=>"EMAIL", value=>$signer->{DN_HASH}->{EMAILADDRESS}[0]} );
$myEmail = $lnk->a({-href=>$lnk->self_url()}, $signer->{DN_HASH}->{EMAILADDRESS}[0]);

## Check Signature Status
if( not libCheckSignature( SIGNATURE=>$signature ) ) {
	$sigStatus = "<FONT COLOR=\"Red\">".gettext("Error")."</FONT>";
	$sigMessage = gettext ("Signature Verification Error!");

	$sigInfo = $query->img({-src=>getRequired ('SigErrorImage'),
				-align=>"MIDDLE"});
	if( $errno > 400 ) {
		$dbMessage = $errval;
		$dbStatus = $errno;
		$sigStatus = "<FONT COLOR=\"Red\">".gettext ("Unknown")."</FONT>";

		if( $signer->{SERIAL} ) {
			$serLink = $signer->{SERIAL};
		} else {
			$serLink = gettext("Unknown");
		}
	} else {
		##// FIXME: what's that!? 
		## FIXME: libCheckSignature fails and we state "Signature correctly verified"
		## $sigMessage = gettext ("Signature correctly verified");
	}
} else {
	$sigStatus = gettext ("Valid");
	$sigMessage = gettext ("Signature correctly verified");
	$sigInfo = $query->img({src=>getRequired ('ValidSigImage'),
			border=>"0", align=>"MIDDLE"});
}

$tmpCert = libGetSignerCertificateDB( SIGNATURE=>$signature );
if( $errno < 400 ) {
	if( $tmpCert->{DATATYPE} =~ /VALID/ ) {
		$sigCertStatus = gettext ("Valid");
	} elsif ( $tmpCert->{DATATYPE} =~ /EXPIRED/ ) {
		$sigCertStatus = gettext ("Expired");
	} elsif ( $tmpCert->{DATATYPE} =~ /REVOKED/ ) {
		$sigCertStatus = "<FONT COLOR=\"RED\">".gettext("Revoked")."</FONT>";
	}
	$dbStatus = "0";
	$dbMessage = gettext ("Certificate present in dB");

	$lnk = new CGI({ cmd=>"viewCert",
		 dataType=>$tmpCert->{DATATYPE},
		 key=>$tmpCert->getSerial()});

	$serLink = $lnk->a({-href=>$lnk->self_url()},
			$tmpCert->getSerial() );

 	$decSerLink = "( " . hex( $tmpCert->getSerial() ) . " )";

    $lnk = new CGI({cmd      => "search",
                    dataType => "CERTIFICATE",
                    name     => "EMAIL",
                    value    => $tmpCert->getParsed()->{EMAILADDRESS}} );
    $myEmail = $lnk->a({-href=>$lnk->self_url()}, $tmpCert->getParsed()->{EMAILADDRESS});
}

$pCert = $tmpCert->getParsed();

## View the Operator Used Certificate Data
$page = $query->subVar( $page, '@CN@',       ($myCN or "n/a" ) );
$page = $query->subVar( $page, '@EMAIL@',    ($myEmail or "n/a" ) );
$page = $query->subVar( $page, '@SERIAL@',    $serLink );
$page = $query->subVar( $page, '@DECSERIAL@', $decSerLink );

$page = $query->subVar( $page, '@NOTBEFORE@', ($pCert->{NOTBEFORE} or "n/a"));
$page = $query->subVar( $page, '@NOTAFTER@',  ($pCert->{NOTAFTER} or "n/a" ));
$page = $query->subVar( $page, '@SIGSTATUS@',  $sigStatus );
$page = $query->subVar( $page, '@SIGMESSAGE@', $sigMessage );

$page = $query->subVar( $page, '@KEY@', 	$key);
$page = $query->subVar( $page, '@SIGINFO@',     $sigInfo );

$page = $query->subVar( $page, '@SIGNATURE@',   $parsed->{SIGNATURE} );
$page = $query->subVar( $page, '@DBSTATUS@',    $dbStatus );
$page = $query->subVar( $page, '@DBMESSAGE@',   $dbMessage );

print "$page";

}

1;

