## OpenCA - Command ## (c) 1998-2001 by Massimiliano Pala and OpenCA Group ## (c) Copyright 2002-2004 The OpenCA Project ## ## File Name: viewCert ## Brief: Display a certificate ## Version: $Revision: 1.6 $ ## Description: Display certificate data ## Parameters: dataType, key ## this script supports the following configurable references ## ## INSTALL_CERT ## LDAP ## REVOCATION ## SENDCERT ## SEND_CERT_KEY ## VIEW_CSR ## TOKENHANDLING ## MAIL ## SET_PUBLIC_PASSWD ## DELETE_PUBLIC_PASSWD use strict; sub cmdViewCert { our ( $query, $self ); my ($info_list, $cmd_list, $hidden_list, $cmd_panel) = (undef, undef, undef, undef); my ($hidden_pos, $info_pos, $cmd_pos) = (0, 0, 0); ## Get the Serial Number my $key = $query->param( 'key' ); my $dataType = $query->param( 'dataType' ); my $status; my @certDataTypes = ( "VALID_CERTIFICATE", "EXPIRED_CERTIFICATE", "SUSPENDED_CERTIFICATE", "REVOKED_CERTIFICATE" ); if( not $key and ($key != 0)) { configError( gettext ("Error, missing key!") ); } if ( not $dataType ) { $dataType = "CERTIFICATE"; } if ( $dataType =~ /^VALID_CERTIFICATE/ ) { $status = gettext ("Valid"); } elsif ( $dataType =~ /^EXPIRED_CERTIFICATE/ ) { $status = gettext("Expired"); } elsif ( $dataType =~ /^SUSPENDED_CERTIFICATE/ ) { $status = gettext("Suspended"); } elsif ( $dataType =~ /^REVOKED_CERTIFICATE/ ) { $status = gettext("Revoked"); } elsif ( $dataType =~ /^VALID_CA_CERTIFICATE/ ) { $status = gettext("Valid"); } elsif ( $dataType =~ /^EXPIRED_CA_CERTIFICATE/ ) { $status = gettext("Expired"); } elsif ( $dataType =~ /^CA_CERTIFICATE/ ) { ## try to determine the datatype if ($db->getItem ( DATATYPE => "VALID_CA_CERTIFICATE", KEY => $key )) { $dataType = "VALID_CA_CERTIFICATE"; $status = gettext("Valid"); } elsif ($db->getItem ( DATATYPE => "EXPIRED_CA_CERTIFICATE", KEY => $key )) { $dataType = "EXPIRED_CA_CERTIFICATE"; $status = gettext("Expired"); } else { configError ( gettext ("Cannot determine status of this CA-Certificate!")); } } elsif ( $dataType =~ /^CERTIFICATE/ ) { ## try to determine the datatype if ($db->getItem ( DATATYPE => "VALID_CERTIFICATE", KEY => $key )) { $dataType = "VALID_CERTIFICATE"; $status = gettext("Valid"); } elsif ($db->getItem ( DATATYPE => "EXPIRED_CERTIFICATE", KEY => $key )) { $dataType = "EXPIRED_CERTIFICATE"; $status = gettext("Expired"); } elsif ($db->getItem ( DATATYPE => "SUSPENDED_CERTIFICATE", KEY => $key )) { $dataType = "SUSPENDED_CERTIFICATE"; $status = gettext("Suspended"); } elsif ($db->getItem ( DATATYPE => "REVOKED_CERTIFICATE", KEY => $key )) { $dataType = "REVOKED_CERTIFICATE"; $status = gettext("Revoked"); } else { configError ( gettext ("Cannot determine status of this Certificate!")); } } else { configError (i18nGettext ("DataType not supported (__DATATYPE__)!", "__DATATYPE__", $dataType)); } my $cert = $db->getItem( DATATYPE=>$dataType, KEY=>$key ); configError( i18nGettext ("Error __ERRNO__, unable to get cert from dB! (__ERRVAL__)", "__ERRNO__", $db->errno(), "__ERRVAL__", $db->errval())) if( not $cert ); my $parsedCert = $cert->getParsed(); ## build emailaddress string my $emails = ""; foreach my $email (@{$parsedCert->{EMAILADDRESSES}}) { $emails .= ", " if ($emails); $emails .= $email; } $hidden_list->{"cmd"} = ""; $hidden_list->{"GET_PARAMS_CMD"} = ""; $hidden_list->{"passwd"} = ""; $hidden_list->{"key"} = $key; $hidden_list->{"HIDDEN_key"} = $key; $hidden_list->{"dataType"} = $dataType; $hidden_list->{"dn"} = $parsedCert->{DN}; $hidden_list->{"new_dn"} = ""; $hidden_list->{"name"} = "PUBLIC"; $hidden_list->{"format"} = ""; $hidden_list->{"text"} = ""; $hidden_list->{"signature"} = ""; my $tmpIssuer = $parsedCert->{ISSUER}; my $tmpDN = $parsedCert->{DN}; my $tmpStatus = $status; ## old version - if it can be removed then simply remove it $tmpIssuer =~ s/[\/,]\s*(?=[A-Za-z0-9\-]+=)/
\n/g; $tmpDN =~ s/[\/,]\s*(?=[A-Za-z0-9\-]+=)/
\n/g; my $now = timestamp(); if ( $tmpStatus =~ /^Valid/i ) { if ($now > $cryptoShell->getNumericDate ($parsedCert->{NOTAFTER})) { $tmpStatus = gettext("Expired"); } } elsif ( $tmpStatus =~ /revoked/gi ) { $tmpStatus = i18nGettext ("Revoked on __DATE__", "__DATE__", $parsedCert->{HEADER}->{REVOKED}); } elsif ( $tmpStatus =~ /^Expired/i ) { if ($now <= $cryptoShell->getNumericDate ($parsedCert->{NOTAFTER})) { $tmpStatus = gettext("Not Expired"); } } my $download = ""; my $revoke = ""; my $ctype = ""; if ( $dataType =~ /CA_CERTIFICATE/gi ) { $download = '?cmd=send_email_cert;type=ca;dataType=$dataType;key='. $key; # $cert->getSerial(); $ctype = "ca"; } else { $download = '?cmd=send_email_cert;type=email;dataType=$dataType;key='. $key; # $cert->getSerial(); $ctype = "email"; $revoke = '?cmd=revoke_req;key='.$cert->getSerial(); } # $info_list->{HEAD}->[0] = gettext("Variable"); # $info_list->{HEAD}->[1] = gettext("Value"); my $html_download = ""; my $text = undef; $text = ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; # $text .= " "; # $text .= ""; $text .= ""; $text .= "
" . "getSerial() . "\" alt=\"" . $key . "\" alt=\"" . gettext ("Install this Certificate" ) . "\">" . " " .
			gettext("Install this Certificate") . "" . "" ; $text .= " " . " "; $text .= " " . " "; $text .= " "; $text .= " " . " "; $text .= " " . " "; $text .= " " . " "; $text .= "
" . $parsedCert->{DN_HASH}->{CN}[0] . " [" . $cert->getSerial() . "]
" . "Issued By:" . $parsedCert->{ISSUER_HASH}->{O}[0] . "
" . "Expiration on:" . $parsedCert->{NOTAFTER} . "
" . "Profile:" . $parsedCert->{HEADER}->{ROLE} . "
 " . "" . "key=$key\" >" . gettext ( "More Info" ) . "...
"; $text .= "

" . "
" . # " " . # $html_download . "
" . gettext ("Certificate Profile" ) . # ":
" . $parsedCert->{HEADER}->{ROLE} . "
" . gettext ("Fingerprint" ) . ":
" . $parsedCert->{FINGERPRINT} . "
"; $info_list->{BODY}->[$info_pos++]->[1] = $text; ####################################### ## here starts the filtered commands ## ## here starts the filtered commands ## ## cmd_list ## ####################################### $cmd_list->{HEAD}->[0] = gettext ("Operations"); my $allow = libGetPermissionHash (getRequiredList ('CmdRefs_viewCert')); ## perhaps an operator want to have a look at the request if ($allow->{VIEW_CSR} and $parsedCert->{HEADER}->{CSR_SERIAL} ) { $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("CSR's Serial Number"); $cmd_list->{BODY}->[$cmd_pos]->[1] = "{HEADER}->{CSR_SERIAL}."\">". "$parsedCert->{HEADER}->{CSR_SERIAL}"; $cmd_pos++; } ## download certs in different formats if ( $allow->{SENDCERT} and ($dataType =~ /(VALID|EXPIRED|SUSPENDED)/i) ) { my $select = "\n"; my $button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Certificate"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $select.$button; $cmd_pos++; } ## prepare download of private keys if ( $allow->{SEND_CERT_KEY} and $parsedCert->{KEY} ) { my $select = "\n"; my $button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Certificate and Keypair"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $select.$button; $cmd_pos++; ## Change passphrase my $change_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Change Passphrase"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $change_button; $cmd_pos++; ## Remove private key from DB my $remove_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Remove Key from database"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $remove_button; $cmd_pos++; } ## prepare the actualization of the LDAP if ( $allow->{LDAP} and (getRequired ('LDAP') =~ /y/i) ) { ## update cert on LDAP my $ldap_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Add the certificate to LDAP"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $ldap_button; $cmd_pos++; ## update cert on LDAP with modified DN $ldap_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Add the certificate to LDAP but with changed DN"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $ldap_button; $cmd_pos++; ## delete cert from LDAP $ldap_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Delete the certificate from LDAP"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $ldap_button; $cmd_pos++; ## delete cert from LDAP with modified DN $ldap_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Delete the certificate from LDAP but with changed DN"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $ldap_button; $cmd_pos++; } if ($allow->{TOKENHANDLING} and not $parsedCert->{IS_CA} and $status ne gettext("Revoked") and $status ne gettext("Suspended") ) { my $ra_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Tokenhandling"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $ra_button; $cmd_pos++; } if ($allow->{MAIL}) { my $ra_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Send mail to the User"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $ra_button; $cmd_pos++; } ## set enrollment passphrase for certificate and private key on public gateway if ( $allow->{SET_PUBLIC_PASSWD} and $parsedCert->{KEY} and ($dataType =~ /(VALID|EXPIRED|SUSPENDED)/i) ) { my $button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Set passphrase for key enrollment"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $button; $cmd_pos++; } if ( $allow->{DELETE_PUBLIC_PASSWD} and $parsedCert->{KEY} and ($dataType =~ /(VALID|EXPIRED|SUSPENDED)/i) ) { my $button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Delete passphrase for key enrollment"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $button; $cmd_pos++; } ## revoke cert if ( $allow->{REVOCATION} and $status ne gettext("Revoked") ) { my $ra_button = ""; $cmd_list->{BODY}->[$cmd_pos]->[0] = gettext("Start Revocation"); $cmd_list->{BODY}->[$cmd_pos]->[1] = $ra_button; $cmd_pos++; } if ($allow->{INSTALL_CERT}) { if ($dataType =~ /(VALID|EXPIRED|SUSPENDED)_CERTIFICATE/) { $cmd_panel->[0] = "".gettext("Install the certificate").""; $cmd_panel->[1] = "".gettext("Revoke the certificate").""; } } return libSendReply ( "NAME" => i18nGettext ("__STATUS__ Certificate", "__STATUS__", $status), # "EXPLANATION" => gettext ("Following you can find the certificate details."), # "TIMESTAMP" => 1, "INFO_LIST" => $info_list, # "CMD_LIST" => $cmd_list, # "CMD_PANEL" => $cmd_panel, "HIDDEN_LIST" => $hidden_list ); } 1;