## OpenCA - RAServer Command
## (c) 1998-2001 by Massimiliano Pala and OpenCA Group
##
##   File Name: editCSR
##       Brief: Edit Request
## Description: Edit a given Request
##  Parameters: key

sub cmdEditCSR {

## Get the Configuration parameters ...
my ( $ou, $ouList, $def, $op, $opCert, $info, $opStatus, $dnLabel);
my ( $sigStatus, $signer, $signature, $myCN, $myEmail, @myDnInfo, $subject, $subjectAltName );
my ( @opCertList, $reqDataTable, @cols, $opCert, $serLink, $lnk, $sigInfo );
my ( %labels, @values, $role );
my ( $reqStatus, $cmdsPanel, $reqDesc );

my $key      = $query->param('key');
my $dataType = $query->param('dataType');
if (not $dataType) {
	$dataType = "PENDING_REQUEST";
}

## Required Configuration Key
my $sheetsDir	= getRequired( 'SheetsDir' );
my $includeDir	= getRequired( 'IncludeDir' );
my $txtDir	= getRequired( 'TextDir' );
my $baseDoc = getRequired('ViewCSRSheet');

configError (gettext ("Error, needed dB key!")) if ( not $key );

$reqStatus = gettext ("Waiting for Approval");
$cmdsPanel = "$includeDir/editing_cmds.inc";
$reqDesc   = "$txtDir/pending_desc.txt";

if( not ( $page = $query->getFile( $baseDoc )) ) {
	configError (gettext ("Error while loading __FILE__!", "__FILE__", $baseDoc));
};

## Substitute the cmdsPanel, reqStatus and reqDesc
$page = $query->subVar( $page, '@STATUS@', $reqStatus );
$page = $query->subVar( $page, '@REQDESC@', $tools->getFile( "$reqDesc") );
$page = $query->subVar( $page, '@CMDSPANEL@', $tools->getFile("$cmdsPanel") );

my $req = $db->getItem( DATATYPE=>$dataType, KEY=>$key );

configError (gettext ("Request not present in DB or the status of the request was changed!")) if ( not $req );

## Get the parsed Request
my $parsed_req 	= $req->getParsed();
my $head   	= $req->getParsed()->{HEADER};
my $dbKey	= $req->getSerial();

@cols = ( gettext ("Variable"), gettext ("Value") );
$reqDataTable = $query->startTable( COLS=>[ @cols ],
                                        WIDTH=>"100%",
                                        ## BGCOLOR=>"#F1F0F8",
					PADDING=>"2",
					CELLPADDING=>"4",
					TABLE_BGCOLOR=>"#F1F0F8",
                                        TITLE_BGCOLOR=>"#DDCCFF" );

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

## subject alternative name
if (  defined $req->getParsed()->{HEADER}->{SUBJECT_ALT_NAME} ) {
        $subjectAltName = $req->getParsed()->{HEADER}->{SUBJECT_ALT_NAME};
} elsif (  $parsed_req->{EMAILADDRESS} ne "" ) {
        $subjectAltName = "email:".$parsed_req->{EMAILADDRESS};
} else {
	$subjectAltName = "";
}

## email address
my @emails = [];
if (  defined $req->getParsed()->{HEADER}->{SUBJECT_ALT_NAME} ) {
        @subjectAltNames = split (/,/, $req->getParsed()->{HEADER}->{SUBJECT_ALT_NAME});
        foreach my $h (@subjectAltNames) {
                next if ($h !~ /^\s*email:/i);
                $h =~ s/^\s*email://i;
                push (@emails, $h);
        }
}
if (  $req->getParsed()->{EMAILADDRESS} ne "" ) {
        push (@emails, $req->getParsed()->{EMAILADDRESS});
};
foreach my $h (@emails) {
        my $lnk = new CGI({cmd=>"search", dataType=>"CERTIFICATE",
                        name=>"EMAIL", value=>$h} );
        $myEmail .= ", " if ($myEmail);
        $myEmail .= $lnk->a({-href=>$lnk->self_url()}, $h);
}

## If the Request is signed
if ( $parsed_req->{TYPE} =~ /with .*? Signature/i ) {

	$lnk = new CGI({cmd=>"viewSignature", dataType=>$dataType, key=>$key});
	if( libCheckSignature( OBJECT=>$req ) ) {
		$tmp = $query->img({src=>getRequired ('ValidSigImage'),
					border=>"0", align=>"MIDDLE"});
	} else {
		$tmp = $query->img({-src=>getRequired ('SigErrorImage'),
					-border=>"0", -align=>"MIDDLE"});
	}

	$sigInfo = $lnk->a({-href=>$lnk->self_url()}, $tmp );
	
} else {
	$def = "<FONT COLOR=\"RED\">".gettext ("Not Signed")."</FONT>";
	$parsed_req->{OPERATOR} = $def;
}

## get the subject
if ($req->getParsed()->{HEADER}->{SUBJECT}) {
	$subject = $req->getParsed()->{HEADER}->{SUBJECT};
} else {
	$subject = $req->getParsed()->{DN};
}
$subject =~ s/([^\\]),\s*/${1}\n/g;

$subject = $query->newInput( -regx=>'*',
			-intype=>'textarea',
			-name=>'subj',
			-rows=>6,
			-columns=>35,
			-default=>$subject);

$subjectAltName = $query->newInput( -regx=>'*',
			-intype=>'textfield',
			-name=>'subjectAltName',
			-size=>35,
			-default=>$subjectAltName);

$role = $query->newInput( -regx=>'*',
			-intype=>"popup_menu",
			-name=>"ROLE",
			-values=>  [ loadRoles () ],
			-default=>$head->{ROLE});

## $tmp = $head->{OPERATOR_DN};
## $tmp =~ s/([^\\],|[^\\]\/)/<br>/g;

@cols = ( gettext ("Variable"), gettext ("Value") );
$reqDataTable = $query->startTable(	COLS=>[ @cols ],
					WIDTH=>"100%",
					BGCOLOR=>"#F1F0F8",
					PADDING=>"2",
					CELLPADDING=>"4",
					TABLE_BGCOLOR=>"#F1F0F8",
					TITLE_BGCOLOR=>"#DDCCFF" );

$reqDataTable .=$query->addTableLine(DATA=>["<B>".gettext ("Request Version:")."</B>",
		($parsed_req->{VERSION} or gettext ("n/a")) ]);
$reqDataTable .=$query->addTableLine(DATA=>[ "<B>".gettext ("Serial Number:")."</B>",
		($req->getSerial() or gettext ("n/a")) ]);
$reqDataTable .=$query->addTableLine(DATA=>["<B>".gettext ("Request Type:")."</B>",
		($parsed_req->{TYPE} or gettext ("n/a")) ]);
$reqDataTable .=$query->addTableLine(DATA=>["<B>".gettext ("Submission Date:")."</B>",
		($head->{NOTBEFORE} or gettext ("n/a")) ]);
$reqDataTable .=$query->addTableLine(DATA=>
		[ "<B>".gettext ("Subject alternative name:")."</B>", $subjectAltName ]);
$reqDataTable .=$query->addTableLine(DATA=>
		[ "<B>".gettext ("Subject:")."</B>", $subject ]);
$reqDataTable .=$query->addTableLine(DATA=>
		["<B>".gettext ("Role:")."</B>",
		($role or gettext ("n/a")) ]);
$reqDataTable.=$query->addTableLine(DATA=>
		["<B>".gettext ("Used Identification PIN:")."</B>",
		($head->{PIN} or gettext ("n/a")) ]);
$reqDataTable .=$query->addTableLine(DATA=>
		[ "<B>".gettext ("Modulus (key size):")."</B>",
		($parsed_req->{KEYSIZE} or gettext ("n/a")) ]);
$reqDataTable .=$query->addTableLine(DATA=>
		[ "<B>".gettext ("Public Key Algorithm:")."</B>",
		($parsed_req->{PK_ALGORITHM} or gettext ("n/a")) ]);
$reqDataTable .=$query->addTableLine(DATA=>
		[ "<B>".gettext ("Signature Algorithm:")."</B>",
		($parsed_req->{SIG_ALGORITHM} or gettext ("n/a")) ]);

$reqDataTable .= $query->endTable();

$page = $query->subVar( $page, '@KEY@',     $dbKey );
$page = $query->subVar( $page, '@DATATYPE@',$dataType );
$page = $query->subVar( $page, '@REQDATA@', $reqDataTable );
$page = $query->subVar( $page, '@_KEYLESS_DATA@', "" );

## View the Signature Logo
$page = $query->subVar( $page, '@SIGINFO@',    $sigInfo );

print "$page";

}

1;
