## OpenCA - Command
## (c) 1998-2001 by Massimiliano Pala and OpenCA Group
##
##   File Name: listReqs
##//       Brief: Build Requests' Listing
##// Description: Build Requests' Listing given correct dataType
##  Parameters: viewFrom, dataType, ra

sub cmdListReqs {

my $from     = ( $query->param( 'viewFrom' ) or 0 );
my $dataType = $query->param( 'dataType' );

my ( $dateColTitle, $rows, @cols, @list );

## Differentiate the list parameters
if(  $dataType eq "PENDING_REQUEST" ) {
	$doc = 'pendingbasesheet';
	@cols = ( gettext("Serial"), gettext("Submit Name"), gettext("Submitted On"), gettext("Requested Role") );
} elsif( $dataType eq "RENEW_REQUEST" ) {
	$doc = 'renewbasesheet';
	@cols = ( gettext("Op."), gettext("Serial"), gettext("Submit Name"), gettext("Renewed On"), gettext("Requested Role") );
} elsif( $dataType eq  "APPROVED_REQUEST" ) {
	$doc = 'approvedbasesheet';
	@cols = ( gettext("Op."), gettext("Serial"), gettext("Submit Name"), gettext("Approved On"), gettext("Requested Role") );
} elsif ( $dataType eq "DELETED_REQUEST" ) {
	$doc = 'deletedbasesheet';
	@cols = ( gettext("Op."), gettext("Serial"), gettext("Submit Name"), gettext("Deleted On"), gettext("Requested Role") );
} elsif ( $dataType eq "ARCHIVED_REQUEST" ) {
	$doc = 'archivedbasesheet';
	@cols = ( gettext("Op."), gettext("Serial"), gettext("Submit Name"), gettext("Archived On"), gettext("Requested Role") );
} elsif ( $dataType eq "PENDING_CRR" ) {
	$doc = 'pendingcrrbasesheet';
	@cols = ( gettext("Sender"), gettext("Certificate's Serial"), gettext("Submit Name"), gettext("Submitted On"), gettext("Affected Role") );
} elsif ( $dataType eq "APPROVED_CRR" ) {
	$doc = 'approvedcrrbasesheet';
	@cols = ( gettext("Op."), gettext("Certificate's Serial"), gettext("Submit Name"), gettext("Approved On"), gettext("Affected Role") );
} elsif ( $dataType eq "ARCHIVED_CRR" ) {
	$doc = 'archivedcrrbasesheet';
	@cols = ( gettext("Op."), gettext("Certificate's Serial"), gettext("Submit Name"), gettext("Archived On"), gettext("Affected Role") );
} elsif ( $dataType eq "DELETED_CRR" ) {
	$doc = 'deletedcrrbasesheet';
	@cols = ( gettext("Op."), gettext("Certificate's Serial"), gettext("Submit Name"), gettext("Deleted On"), gettext("Affected Role") );
} else {
	configError(gettext("Requested List NOT available"));
}

## Get required parameters ( return only the value string )
my $sheet    = getRequired( $doc );
my $maxItems = getRequired( "maxReturnedItems" );
my $elements = $db->elements( DATATYPE=>$dataType );

## Get the base Page ( got in $page variable )
my $page   = $query->getFile( "$sheet" );
my $uptime = $tools->getDate();
my $ra     = ( $query->param('ra') or "All" );

$ra = "All" if $ra eq gettext("All");
 
configError ( i18nGettext ("Error loading Page __PAGE__!", "__PAGE__", $sheet) ) if ( not $page);

## Set the column titles
if( (not $ra) or ($ra =~ /All/i) ) {
	$rows = $elements;
       	@list = $db->listItems( DATATYPE=>$dataType, 
	 		ITEMS=>$maxItems, FROM=>$from );
} else {
	## $rows = $db->rows(DATATYPE=>$dataType, RA=>$query->param('ra'));
	$rows = $db->elements(DATATYPE=>$dataType);
       	@list = $db->searchItems( DATATYPE=>$dataType, 
		ITEMS=>$maxItems, FROM=>$from, RA=>$query->param('ra'));
}

my $table;
if (not @list) {
	$table = $query->buildRefs(
			ELEMENTS  => $rows,
			MAXITEMS  => $maxItems,
			FACTOR    => 5,
			MODE      => "EXP",
			NOW_FIRST => 0,
			NOW_LAST  => 0,
			FIRST     => 0,
			LAST      => 0);
} else {
	$table = $query->buildRefs(
			ELEMENTS  => $rows,
			MAXITEMS  => $maxItems,
			FACTOR    => 5,
			MODE      => "EXP",
			NOW_FIRST => $list[0]->getSerial($dataType),
			NOW_LAST  => $list[scalar (@list) -1]->getSerial($dataType),
			FIRST     => libDBGetFirstItem ($dataType)->getSerial($dataType),
			LAST      => libDBGetLastItem ($dataType)->getSerial($dataType));
}

$table .= $query->startTable( COLS=>[ @cols ],
				WIDTH=>"100%",
				TITLE_BGCOLOR=>"#DDCCFF" );

## Process all Files
foreach $req ( @list ) {
    my ( $head, $parsed, $format, $key, $ser_col, $serial, $date );
    my @vals;

    ## We have no problem either if it is a PEM or SPKAC
    ## request as the REQ mod will try to recognize it.
    ## my $req = new OpenCA::REQ( SHELL=>$openssl,
    ##                         DATA=>$reqData);

    next if (not $req);

    if ( $dataType =~ /REQUEST/ ) {
        $parsed = $req->getParsed();
        $head   = $parsed->{HEADER};
        $key    = $req->getSerial();

        $serial = $req->getSerial();
        $date   =  ( $parsed->{NOTBEFORE} or $head->{NOTBEFORE} or "---" );

        if ( not $serial ) {
            $serial = "<CENTER>---</CENTER>";
        };

        $lnk = new CGI({cmd=>"viewCSR", dataType=>"$dataType", key=>$key});
        $ser_col = $lnk->a({-href=>$lnk->self_url()}, "$serial");

        if ($dataType !~ /PENDING/) {
            ## get operator from first signature
            if (my $sig = libGetSignatureObject ( OBJECT => $req )) {
                if (my $cert = libGetSignerCertificateDB( SIGNATURE=> $sig )) {
                    push (@vals, "<a href=\"$self?cmd=viewCert&key=".
                                 $cert->getSerial()."\">".
                                 $cert->getSerial()."</a>");
                } else {
                    push (@vals, gettext ("Cannot determine certificate from signature!"));
                    print STDERR "Cannot determine certificate from signature (CRR: $key)\n";
                }
            } else {
                if (not $req->getParsed()->{SIGNATURE}) {
                    my $operator = ( $parsed->{OPERATOR} or $head->{OPERATOR} or gettext("n/a"));
                    if ($operator =~ /n\/a/i) {
                        $operator = gettext("n/a");
                    }
                    push( @vals, $operator);
                } else {
                    push (@vals, gettext ("Cannot build PKCS#7-object from signature!"));
                    print STDERR "Cannot build object from signature (CSR: $key)\n";
                }
            }
        }

        push( @vals, $ser_col );
        if ( $head->{SUBJECT} ) {
            push( @vals, $head->{SUBJECT} );
        } elsif ( $parsed->{DN} ) {
            push( @vals, $parsed->{DN} );
        } else {
            push( @vals, "<CENTER>---</CENTER>" );
        }

        if ( $dataType !~ /(PENDING|RENEW)/i ) {
	    push( @vals, (  $head->{DELETED} or $head->{APPROVED} or gettext("n/a")));
        } else {
            push( @vals, (  $head->{NOTBEFORE} or gettext("n/a")));
        }
        push (@vals, ($head->{ROLE} or gettext("n/a")));
    } else {
        ## CRR
        $parsed = $req->getParsed ();
        $head   = $parsed->{HEADER};
        $key    = $req->getSerial ();

        $serial = $parsed->{REVOKE_CERTIFICATE_SERIAL};
        my $crr_cert = $db->getItem (DATATYPE => "CERTIFICATE", KEY => $serial);

        $date   =  ( $parsed->{SUBMIT_DATE} or "---" );

        if ( not $serial ) {
            $serial = "<CENTER>---</CENTER>";
        };

        if ($dataType =~ /PENDING/) {
            if ($parsed->{SIGNATURE}) {
                ## signature-based revocation
                if (my $sig = libGetSignatureObject ( OBJECT => $req )) {
                    if (my $cert = libGetSignerCertificateDB( SIGNATURE=> $sig )) {
                        push (@vals, $cert->getParsed()->{DN});
                    } else {
                        push (@vals, gettext ("Cannot determine certificate from signature!"));
                        print STDERR "Cannot determine certificate from signature (CRR: $key)\n";
                    }
                } else {
                    push (@vals, gettext("Cannot build object from signature!"));
                    print STDERR "Cannot build object from signature (CRR: $key)\n";
                }
            } elsif ($parsed->{REVOKE_CERTIFICATE_DN}) {
                ## pin-based revocation
                push (@vals, $parsed->{REVOKE_CERTIFICATE_DN});
            } else {
                ## last chance by strong ssl-authentication
                push (@vals, $head->{SSL_CERT_DN});
                print STDERR "submitter of CRR not determinable (CRR: $key)\n";
            }
        } else {
            ## get operator from first signature
            if (my $sig = libGetSignatureObject ( OBJECT => $req )) {
                if (my $cert = libGetSignerCertificateDB( SIGNATURE=> $sig )) {
                    push (@vals, "<a href=\"$self?cmd=viewCert&key=".
                                 $cert->getSerial()."\">".
                                 $cert->getSerial()."</a>");
                } else {
                    push (@vals, gettext ("Cannot determine certificate from signature!"));
                    print STDERR "Cannot determine certificate from signature (CRR: $key)\n";
                }
            } else {
                if (not $req->getParsed()->{SIGNATURE}) {
                    push (@vals, gettext("Request was not signed!"));
                } else {
                    push (@vals, gettext ("Cannot build PKCS#7-object from signature!"));
                    print STDERR "Cannot build object from signature (CRR: $key)\n";
                }
            }
        }

        $ser_col = "<a href=\"$self?cmd=viewCRR&dataType=$dataType" .
                   "&key=$key\">". $serial ."</a>";

        push( @vals, $ser_col );
        push( @vals, ( $parsed->{REVOKE_CERTIFICATE_DN} or "<CENTER>---</CENTER>" ) );

        if ( $dataType !~ /PENDING/i ) {
            push( @vals, (  $parsed->{DELETED_DATE} or $parsed->{APPROVED_DATE} or
                            gettext ("n/a")));
        } else {
            push( @vals, ( $date or "<CENTER>---</CENTER>") );
        }

        if ($crr_cert) {
            push (@vals, ($crr_cert->getParsed()->{HEADER}->{ROLE} or gettext("n/a")));
        } else {
            push (@vals, gettext("Cannot load affected certificate!"));
        }
    }

    $table .= $query->addTableLine( DATA =>[ @vals ]);
}

## Close the Table
$table .= $query->endTable();
$table .= getCopyRight();

## Substitute the Variables in the $page
$page = $query->subVar( $page, '$uptime', $uptime );
$page = $query->subVar( $page, '$table', $table );

print "$page";

}

1;

