On 06/24/2010 07:51 AM, Geert Hendrickx wrote:
[...]
The "Active" menu entry takes me to a CA key passphrase form, and after
submitting that, I get a long delay and eventually an incomplete status
overview screen (html code is interrupted).  The certificate issuing is
enabled though, but no opportunity to modify the displayed options.

That is really strange.. there's definitely an error - you should check
the log file.. it is impossible to understand what's going on without
looking at that.

I'm running openca-base-1.1.0 with openca-tools-1.3.0, the latest versions
offered on the website.  I see 4 patches on the wiki but none of them seems
relevant (postgresql fix, viewcrl long serial issue, and 2 charset/encoding
issues, are there others?).

Although they don't seem relevant, I suggest you to apply the patches anyway,
they might solve issues related to the software that might influence also the
auto-issuing daemons..

OpenCA: General error trapped 700: The compilation of the command
cmdStartAutoCRL failed. Can't locate object method "setHeaderAttribute"
via package "OpenCA::CRL" at /opt/openca-base-1.1.0/lib/openca/perl_mo
dules/perl5/OpenCA/CRL.pm line 453.<br>

It is really strange that there is no setHeaderAttribute in the OpenCA::CRL
module - it should be there. Try to substitute the module with the one I
attach here and let me know.

Another question, which distribution are you using (i.e., sources or binaries,
and if the latter, which one ?)

Cheers,
Max


--

Best Regards,

        Massimiliano Pala

--o------------------------------------------------------------------------
Massimiliano Pala [OpenCA Project Manager]                   ope...@acm.org
                                                 project.mana...@openca.org

Dartmouth Computer Science Dept               Home Phone: +1 (603) 369-9332
PKI/Trust Laboratory                          Work Phone: +1 (603) 646-8734
--o------------------------------------------------------------------------
People who think they know everything are a great annoyance to those of us
who do.
                                                           -- Isaac Asimov
## OpenCA::CRL
##
## Copyright (C) 1998-1999 Massimiliano Pala (madw...@openca.org)
## All rights reserved.
##
## This library is free for commercial and non-commercial use as long as
## the following conditions are aheared to.  The following conditions
## apply to all code found in this distribution, be it the RC4, RSA,
## lhash, DES, etc., code; not just the SSL code.  The documentation
## included with this distribution is covered by the same copyright terms
## 
## // Copyright remains Massimiliano Pala's, and as such any Copyright notices
## in the code are not to be removed.
## If this package is used in a product, Massimiliano Pala should be given
## attribution as the author of the parts of the library used.
## This can be in the form of a textual message at program startup or
## in documentation (online or textual) provided with the package.
## 
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the copyright
##    notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
##    notice, this list of conditions and the following disclaimer in the
##    documentation and/or other materials provided with the distribution.
## 3. All advertising materials mentioning features or use of this software
##    must display the following acknowledgement:
## //   "This product includes OpenCA software written by Massimiliano Pala
## //    (madw...@openca.org) and the OpenCA Group (www.openca.org)"
## 4. If you include any Windows specific code (or a derivative thereof) from 
##    some directory (application code) you must include an acknowledgement:
##    "This product includes OpenCA software (www.openca.org)"
## 
## THIS SOFTWARE IS PROVIDED BY OPENCA DEVELOPERS ``AS IS'' AND
## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
## ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.
## 
## The licence and distribution terms for any publically available version or
## derivative of this code cannot be changed.  i.e. this code cannot simply be
## copied and put under another distribution licence
## [including the GNU Public Licence.]
##

## // the module's errorcode is 76
##
## functions:
##
## new          11
## init         12
## parseCRL     13
## getHeader    21
## getBody      22
## getTXT       31
## getParsed    41
## getPEM       32
## getDER       33
## getItem      51
## getSerial    52
## setParams    61

use strict;

package OpenCA::CRL;

our ($errno, $errval);

($OpenCA::CRL::VERSION = '$Revision: 1.6 $' )=~ s/(?:^.*: 
(\d+))|(?:\s+\$$)/defined $1?"0\.9":""/eg;

my %params = (
        crl => undef, 
        item => undef,
        pwd => undef, 
        crlFormat => undef,
        pemCRL => undef,
        derCRL => undef,
        txtCRL => undef,
        parsedItem => undef,
        backend => undef,
        beginHeader => undef,
        endHeader => undef
);

sub setError {
        my $self = shift;

        if (scalar (@_) == 4) {
                my $keys = { @_ };
                $errval = $keys->{ERRVAL};
                $errno  = $keys->{ERRNO};
        } else {
                $errno  = $_[0];
                $errval = $_[1];
        }

        ## support for: return $self->setError (1234, "Something fails.") if 
(not $xyz);
        return undef;
}

sub new {
        my $that = shift;
        my $class = ref($that) || $that;

        my $self = {
                %params,
        };

        bless $self, $class;

        my $keys = { @_ };

        $self->{crl}       = $keys->{DATA};
        $self->{pwd}       = $keys->{PASSWD};
        $self->{crlFormat} = ( $keys->{FORMAT} or $keys->{INFORM} or "PEM");
        $self->{backend}   = $keys->{SHELL};
        $self->{gettext}   = $keys->{GETTEXT};

        $self->{gettext} = \&$self->gettext if( not $self->{gettext} );
        return $self->setError (7611011,
                                $self->{gettext} ("OpenCA::CRL->new: There is 
no crypto-backend specified."))
                if( not $self->{backend} );

        my $infile = $keys->{INFILE};
        my $cakey  = $keys->{CAKEY};
        my $cacert = $keys->{CACERT};
        my $days   = $keys->{DAYS};
        my $hours  = $keys->{HOURS};
        my $exts   = $keys->{EXTS};

        $self->{beginHeader} = "-----BEGIN HEADER-----";
        $self->{endHeader} = "-----END HEADER-----";

        if (defined($infile) and ($infile ne "") ) {
                my $tmpLine;
                open( FD, "<$infile" ) 
                        or return $self->setError (7611021,
                                      $self->{gettext} ("OpenCA::CRL->new: 
Cannot open infile __FILENAME__ for reading.",
                                                        "__FILENAME__", 
$infile));
                while( $tmpLine = <FD> ) {
                        $self->{crl} .= $tmpLine;
                }
                close(FD);
        }

        if (not $self->{crl})
        {
        # the can be stored directly in the token ({backend})
        #
        #if( ($cacert) or ($cakey) ) {
        #       return $self->setError (7611031, "OpenCA::CRL->new: You must 
specify the CA-certificate too ".
        #                               "if you want to issue a CRL.")
        #               if (not $cacert);
        #       return $self->setError (7611032, "OpenCA::CRL->new: You must 
specify the CA's private key too ".
        #                               "if you want to issue a CRL.")
        #               if (not $cakey);

                $self->{crl} = $self->{backend}->issueCrl(
                                            CAKEY      => $cakey,
                                            USE_ENGINE => 1,
                                            CACERT     => $cacert,
                                            OUTFORM    => $self->{crlFormat},
                                            DAYS       => $days,
                                            HOURS      => $hours,
                                            PASSWD     => $self->{pwd},
                                            EXTS       => $exts,
                                            NOUNIQUEDN => $keys->{NOUNIQUEDN} );

                return $self->setError (7611035, 
                           $self->{gettext} ("OpenCA::CRL->new: Failed to issue 
a new CRL (__ERRNO__). __ERRVAL__",
                                             "__ERRNO__", 
$OpenCA::OpenSSL::errno,
                                             "__ERRVAL__", 
$OpenCA::OpenSSL::errval))
                        if ( not $self->{crl} );
        }


        if ( $self->{crl} ne "" ) {
                $self->{item} = $self->{crl};

                $self->{crl} = $self->getBody( ITEM=>$self->{item} );

                if ( not $self->init()) {
                        return $self->setError (7611041, 
                                   $self->{gettext} ("OpenCA::CRL->new: Failed 
to issue a new CRL (__ERRNO__). __ERRVAL__",
                                                     "__ERRNO__", $errno,
                                                     "__ERRVAL__", $errval));
                }
        }

        return $self;
}


sub init {
        my $self = shift;
        my $keys = { @_ };

        return $self->setError (7612011, 
                   $self->{gettext} ("OpenCA::CRL->init: There is no CRL 
present."))
                if (not $self->{crl});

        $self->{pemCRL} = "";

        $self->{derCRL} = "";

        $self->{txtCRL} = "";

        $self->{parsedItem} = $self->parseCRL();
        return $self->setError (7612021, 
                   $self->{gettext} ("OpenCA::CRL->init: Cannot parse CRL 
(__ERRNO__). __ERRVAL__",
                                     "__ERRNO__", $errno,
                                     "__ERRVAL__", $errval))
                if (not $self->{parsedItem});

        return 1;
}

sub parseCRL {

        my $self = shift;
        my $keys = { @_ };

        my ( $version, $issuer, $last, $next, $alg, $tmp);
        my @list;
        my @certs;

        my ( $head, $body );

        my @attList = ( "VERSION", "ISSUER", "NEXTUPDATE", "LASTUPDATE", 
                        "SIGNATURE_ALGORITHM", "REVOKED", "SERIAL" );

        my $hret = $self->{backend}->getCRLAttribute(
                        ATTRIBUTE_LIST => \...@attlist,
                        DATA           => $self->{crl},
                        INFORM         => $self->{crlFormat});
        if (not $hret) {
                return $self->setError (7613015, 
                           $self->{gettext} ("OpenCA::CRL->parseCRL: 
Cryptobackend fails (__ERRNO__). __ERRVAL__",
                                             "__ERRNO__", 
$OpenCA::OpenSSL::errno,
                                             "__ERRVAL__", 
$OpenCA::OpenSSL::errval));
        }

        ## Parse lines ...
        @certs = split ( /\n/i, $hret->{REVOKED} );
        for (my $i=0; $i<scalar @certs; $i++)
        {
                my $serial = "" . $certs[$i++];
                my $date   = $certs[$i];
                my $ext    = "";
                while ($certs[$i+1] =~ /^  /) {
                        $ext .= $certs[++$i]."\n";
                }

                print STDERR "CRL::Found Entry -> $serial ($i)\n";

                my $entry = {
                        SERIAL => $serial,
                        DATE   => $date }; 

                @list = ( @list, $entry );
        }

        my $ret = {
                        VERSION           => $hret->{VERSION},
                        ALGORITHM         => $hret->{SIGNATURE_ALGORITHM},
                        ISSUER            => $hret->{ISSUER},
                        LAST_UPDATE       => $hret->{LASTUPDATE},
                        NEXT_UPDATE       => $hret->{NEXTUPDATE},
                        SERIAL            => $hret->{SERIAL},
                        BODY              => $self->getBody( ITEM=> 
$self->{item} ),
                        ITEM              => $self->getBody( ITEM=> 
$self->{item} ),
                        HEADER            => $self->getHeader ( 
ITEM=>$self->{item} ),
                        LIST              => [ @list ],
                        FLAG_EXPORT_STATE => 0
                  };

        return $ret;
}

sub getHeader {
        my $self = shift;
        my $keys = { @_ };
        my $req = $keys->{ITEM};

        my ( $txt, $ret, $i, $key, $val );

        my $beginHeader = $self->{beginHeader};
        my $endHeader = $self->{endHeader};

        if( ($txt) = ( $req =~ /$beginHeader\n([\S\s\n]+)\n$endHeader/m) ) {
                foreach $i ( split ( /\n/, $txt ) ) {
                        $i =~ s/\s*=\s*/=/;
                        ( $key, $val ) = ( $i =~ /(.*)\s*=\s*(.*)\s*/ );
                        $ret->{$key} = $val;
                }
        }

        return $ret;
}

sub getBody {
        my $self = shift;
        my $keys = { @_ };

        my $ret = $keys->{ITEM};

        my $beginHeader         = $self->{beginHeader};
        my $endHeader           = $self->{endHeader};

        ## Let us throw away text between the two headers, included
        $ret =~ s/($beginHeader[\S\s\n]+$endHeader\n)//;

        return $ret;
}

sub getParsed {
        my $self = shift;

        return $self->setError (7641011,
                   $self->{gettext} ("OpenCA::CRL->getParsed: The CRL was not 
parsed."))
                if ( not $self->{parsedItem} );
        return $self->{parsedItem};
}

sub getPEM {
        my $self = shift;

        if ( $self->{crlFormat} eq 'PEM' ) {
                $self->{crl} =~ s/^\n*//;
                $self->{crl} =~ s/\n*$/\n/;
                return $self->{crl};
        }
        if (not $self->{pemCRL}) {
                $self->{pemCRL} = $self->{backend}->dataConvert( 
DATA=>$self->{crl},
                                        DATATYPE=>"CRL",
                                        INFORM=>$self->{crlFormat},
                                        OUTFORM=>"PEM" );
                return $self->setError (7632011,
                           $self->{gettext} ("OpenCA::CRL->init: Cannot convert 
CRL to PEM-format (__ERRNO__). __ERRVAL__",
                                             "__ERRNO__", 
$OpenCA::OpenSSL::errno,
                                             "__ERRVAL__", 
$OpenCA::OpenSSL::errval))
                        if (not $self->{pemCRL});
        }

        return $self->{pemCRL};
}

sub getDER {
        my $self = shift;

        if ( $self->{crlFormat} eq 'DER' ) {
                return $self->{crl};
        }
        if (not $self->{derCRL}) {
                $self->{derCRL} = $self->{backend}->dataConvert( 
DATA=>$self->{crl},
                                        DATATYPE=>"CRL",
                                        INFORM=>$self->{crlFormat},
                                        OUTFORM=>"DER" );
                return $self->setError (7633011,
                           $self->{gettext} ("OpenCA::CRL->getDER: Cannot 
convert CRL to DER-format (__ERRNO__). __ERRVAL__",
                                             "__ERRNO__", 
$OpenCA::OpenSSL::errno,
                                             "__ERRVAL__", 
$OpenCA::OpenSSL::errval))
                        if (not $self->{derCRL});
        }

        return $self->{derCRL};
}

sub getTXT {
        my $self = shift;

        if (not $self->{txtCRL}) {
                $self->{txtCRL} = $self->{backend}->dataConvert( 
DATA=>$self->{crl},
                                        DATATYPE=>"CRL",
                                        INFORM=>$self->{crlFormat},
                                        OUTFORM=>"TXT" );
                return $self->setError (7631011,
                           $self->{gettext} ("OpenCA::CRL->getTXT: Cannot 
convert CRL to TXT-format (__ERRNO__). __ERRVAL__",
                                             "__ERRNO__", 
$OpenCA::OpenSSL::errno,
                                             "__ERRVAL__", 
$OpenCA::OpenSSL::errval))
                        if (not $self->{txtCRL});
        }

        return $self->{txtCRL};
}

sub getItem {
        my $self = shift;
        my $txtItem;

        $txtItem  = $self->{beginHeader}."\n";
        $txtItem .= $self->getHeader ();
        $txtItem .= $self->{endHeader}."\n";
        $txtItem .= $self->getPEM ();

        return $txtItem;
}

sub getSerial {
        my $self = shift;

        # return the serial if one is present
        return "".$self->getParsed()->{SERIAL}
                if ($self->getParsed()->{SERIAL} >= 0);

        # new numbering by timestamp
        return "".$self->{backend}->getNumericDate (
                   $self->getParsed()->{LAST_UPDATE}
                                                );

        # old numbering by digest
        # return $self->{backend}->getDigest ( DATA => $self->getPEM() );
}

sub setParams {

        my $self = shift;
        my $params = { @_ };
        my $key;

        foreach $key ( keys %{$params} ) {
                ## we should place the parameters here
        }

        return 1;
}

sub getStatus
{
    my $self = shift;
    return $self->{STATUS};
}

sub setStatus {
        my $self = shift;
        my $status = shift;

        my $status_update = undef;
        my $now = gmtime;

        ## Handles special fields like SUSPENDED_AFTER, REVOKED_AFTER, etc.
        $status =~ s/\_.*//;
        if (($self->{STATUS} ne $status) and ($status !~ /VALID/)) {
                $status_update = $status . "_AFTER";
                if( $self->getParsed()->{HEADER}->{$status_update} eq "" ) {
                        $self->setHeaderAttribute ( $status_update => $now );
                }
        }

        $self->{DATATYPE} = $self->{STATUS} . "_CRL";
        $self->{STATUS} = $status;

        return $self->getStatus();
}

sub setHeaderAttribute {

  my $self = shift;
  my $keys = { @_ };

  my $beginHeader = $self->{beginHeader};
  my $endHeader = $self->{endHeader};
  my $beginAttribute = $self->{beginAttribute};
  my $endAttribute = $self->{endAttribute};

  ## check format to be PEM
  return $self->setError (7651011,
             $self->{gettext} ("OpenCA::CRL->setHeaderAttribute: The request is 
not in PEM-format."))
        if ($self->{reqFormat} !~ /^PEM|CRR|SPKAC$/i);
  print $self->{gettext} ("CRL->setHeaderAttribute: correct format - 
PEM")."<br>\n" if ($self->{DEBUG});

  ## check for header
  if ($self->{item} !~ /$beginHeader/) {
    ## create header
    $self->{item} = $beginHeader."\n".$endHeader."\n".$self->{item};
  }

  for my $attribute (keys %{$keys}) {

    # print STDERR "REQ->setHeaderAttribute: $attribute:=".
    #                                   $keys->{$attribute}."<br>\n";

        next if ( not $attribute );

    ## insert into item
    ## find last position in header
    ## enter attributename
    ## check fo multirow
    if ($keys->{$attribute} =~ /\n/) {
      ## multirow
      $self->{item} =~ 
s/${endHeader}/${attribute}=\n${beginAttribute}\n$keys->{$attribute}\n${endAttribute}\n${endHeader}/;
    } else {
        # print STDERR "REQ::setHeaderAttribute::Setting $attribute = " .
        #               $keys->{$attribute} . "\n" if ( $self->{DEBUG} );

        ## Delete old attribute
        if ( $self->getParsed()->{HEADER}->{$attribute} ) {
                $self->{item} =~ s/($attribute[^\n]+\n)//;
        }

      ## single row
      $self->{item} =~ s/${endHeader}/${attribute} = 
$keys->{$attribute}\n${endHeader}/;
      # print STDERR "REQ::NEW HEADER\n".$self->{item}."\n";
    }
  }

  ## if you call init then all information is lost !!!
  return $self->setError (7651021,
             $self->{gettext} ("OpenCA::CRL->setHeaderAttribute: Cannot 
re-initialize the request (__ERRNO__). __ERRVAL__",
                               "__ERRNO__", $errno,
                               "__ERRVAL__", $errval))
        if (not $self->init ( REQ => $self->{item},
                    FORMAT      => $self->{reqFormat}));

  return 1;
}


## very simple dummy
sub gettext
{
    return $_[0];
}

# Below is the stub of documentation for your module. You better edit it!
1;

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Openca-Users mailing list
Openca-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openca-users

Reply via email to