## OpenCA - RA Server Command
## (c) 1998-2001 by Massimiliano Pala and OpenCA Group
##
##   File Name: changeReq
##       Brief: change Request
## Description: change an edited pending request
##  Parameters: key, dataType, EMAILADDRESS, CN, O, C, S, L

sub cmdChangeCSR {

## To aprove a Request, we need it signed by the RA operator
my $beginHeader = "-----BEGIN HEADER-----";
my $endHeader = "-----END HEADER-----";

## Get the parameters
my $key		= $query->param('key');
my $dataType	= $query->param('dataType');

my $subj		= $query->param('subj');
my $subjectAltName	= $query->param('subjectAltName');
my $role		= $query->param('ROLE');

$subj =~ s/(\n|\r\n)/\, /g;

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

my ( $head, $text, $newREQ, $tmp, $format, $tmpSubj );

##// If it doesn't exists the file, report error
if( not $req ) {
	configError(i18nGettext ("Error: Request __CSR_SERIAL__ not found!", "__CSR_SERIAL__", $key));
}

$parsed->{HEADER}->{ROLE}     		= $role;
$parsed->{HEADER}->{SUBJECT}   		= $subj;
$parsed->{HEADER}->{SUBJECT_ALT_NAME}	= $subjectAltName;

## Get the Operator Serial Number ( Whatch out, only authorized
## people should get here in, please verify your web configuration,
## this is not matter of this program but access control )
$parsed->{HEADER}->{OPERATOR} = 
( $ENV{'SSL_CLIENT_CERT_SERIAL'} or $ENV{'SSL_CLIENT_M_SERIAL'});

if( $parsed->{HEADER}->{OPERATOR} eq "" ) {
	$parsed->{HEADER}->{OPERATOR} = undef;
} else {
	if ( length( $parsed->{HEADER}->{OPERATOR} ) % 2 ) {
		$parsed->{HEADER}->{OPERATOR} = "0" . 
					$parsed->{HEADER}->{OPERATOR};
	}
}

## Set Text to sign
$head  = "$beginHeader\n";
$head .= "TYPE = $parsed->{TYPE}\n";
$head .= "RA = $parsed->{HEADER}->{RA}\n";
$head .= "SERIAL = ".$req->getSerial()."\n";
$head .= "RENEW = ".$parsed->{HEADER}->{RENEW}."\n" if ($parsed->{HEADER}->{RENEW});
$head .= "OPERATOR = $parsed->{HEADER}->{OPERATOR}\n"
	if ($parsed->{HEADER}->{OPERATOR});
$head .= "NOTBEFORE = $parsed->{HEADER}->{NOTBEFORE}\n";
$head .= "APPROVED = $parsed->{HEADER}->{APPROVED}\n";
$head .= "PIN = $parsed->{HEADER}->{PIN}\n";
$head .= "SUBJECT = $parsed->{HEADER}->{SUBJECT}\n";
$head .= "SUBJECT_ALT_NAME = $parsed->{HEADER}->{SUBJECT_ALT_NAME}\n";
## handled by role
## $head .= "CERTTYPE = $certType\n";
$head .= "ROLE = $role\n";
if ($parsed->{HEADER}->{TYPE} =~ /HEADER/i) {
	$head .= "KEY_ALGORITHM = ".$parsed->{HEADER}->{KEY_ALGORITHM}."\n";
	$head .= "KEY_BITS = ".$parsed->{HEADER}->{KEY_BITS}."\n";
}
$head .= "$endHeader\n";

if ( $parsed->{TYPE} =~ /(PKCS#10|IE|HEADER)/ ) {
	$format = "PEM";
} else {
	$format = "SPKAC";
}

my $text = $req->getParsed()->{BODY};
my $keypair = $req->getParsed()->{KEY};

## Create a new REQ object (if we modified something we should
## store modifications) and save the value.
if ($parsed->{HEADER}->{TYPE} =~ /HEADER/i) {
	$newREQ = $head;
} else {
	$newREQ = $head . $text . $keypair;
}

my $item = new OpenCA::REQ( SHELL=>$cryptoShell, DATA=>$newREQ,
						INFORM=>$format);

if( not $item ) {
       	configError( i18nGettext ("Cannot create a new REQ object (__ERRVAL__)", 
                                  "__ERRVAL__", $OpenCA::REQ::errval),
                     $OpenCA::REQ::errno );
}

if( not $db->storeItem( DATATYPE=>$dataType, MODE=>"UPDATE",
				KEY=>$key, OBJECT=>$item ) ) {
       	configError (gettext ("Error while storing REQ!"));
}

libDoCommand ("viewCSR");

}

1;
