certificates ala communigate, RT#7515
authorivan <ivan>
Sun, 7 Nov 2010 23:47:04 +0000 (23:47 +0000)
committerivan <ivan>
Sun, 7 Nov 2010 23:47:04 +0000 (23:47 +0000)
FS/FS/svc_cert.pm
httemplate/edit/process/svc_cert.cgi
httemplate/edit/svc_cert/import_certificate.html [new file with mode: 0644]
httemplate/view/svc_cert.cgi

index e3ef325..36e7582 100644 (file)
@@ -2,6 +2,7 @@ package FS::svc_cert;
 
 use strict;
 use base qw( FS::svc_Common );
+use Tie::IxHash;
 #use FS::Record qw( qsearch qsearchs );
 use FS::cust_svc;
 
@@ -251,14 +252,18 @@ sub check_privatekey {
   return ($ok =~ /key ok/);
 }
 
-my %subj = (
+tie my %subj, 'Tie::IxHash',
   'CN' => 'common_name',
   'O'  => 'organization',
   'OU'  => 'organization_unit',
   'L' => 'city',
   'ST' => 'state',
   'C' => 'country',
-);
+;
+
+sub subj_col {
+  \%subj;
+}
 
 sub subj {
   my $self = shift;
@@ -343,11 +348,25 @@ sub check_certificate {
 
   my %hash = ();
   while (<OUT>) {
-    warn $_;
     /^\s*(\w+)=\s*(.*)\s*$/ or next;
     $hash{$1} = $2;
   }
 
+  for my $f (qw( subject issuer )) {
+
+    $hash{$f} = { map { if ( /^\s*(\w+)=\s*(.*)\s*$/ ) {
+                          ($1=>$2);
+                        } else {
+                          (''=>'');
+                        }
+                      }
+                      split('/', $hash{$f})
+                };
+
+  }
+
+  $hash{'selfsigned'} = 1 if $hash{'subject'}->{'O'} eq $hash{'issuer'}->{'O'};
+
   %hash;
 }
 
index 58b95a6..a8dc0ca 100644 (file)
@@ -9,7 +9,7 @@
 %  } else {
 <% include('/elements/header-popup.html', $title ) %>
     <SCRIPT TYPE="text/javascript">
-      window.top.location = '<% popurl(3). "edit/svc_cert.cgi?$svcnum" %>';
+      window.top.location = '<% popurl(3). "$popup/svc_cert.cgi?$svcnum" %>';
     </SCRIPT>
     </BODY></HTML>
 %  }
@@ -40,10 +40,10 @@ if ( $svcnum ) {
   $new->$_( $old->$_ ) for grep $old->$_, qw( privatekey csr certificate cacert );
 }
 
-my $popup = 0;
+my $popup = '';
 my $title = '';
 if ( $cgi->param('privatekey') eq '_generate' ) { #generate
-  $popup = 1;
+  $popup = 'edit';
   $title = 'Key generated';
 
   $cgi->param('keysize') =~ /^(\d+)$/ or die 'illegal keysize';
@@ -51,12 +51,22 @@ if ( $cgi->param('privatekey') eq '_generate' ) { #generate
   $new->generate_privatekey($keysize);
 
 } elsif ( $cgi->param('privatekey') =~ /\S/ ) { #import
-  $popup = 1;
+  $popup = 'edit';
   $title = 'Key imported';
 
   $new->privatekey( $cgi->param('privatekey') );
 
-} #elsif ( $cgi->param('privatekey') eq '_clear' ) { #clear
+#} #elsif ( $cgi->param('privatekey') eq '_clear' ) { #clear
+
+} elsif ( $cgi->param('certificate') ) {
+
+  $popup = 'view';
+  $title = 'Certificate imported';
+
+  $new->certificate( $cgi->param('certificate') );
+  $new->$_( $old->$_ ) for grep $old->$_, qw( recnum common_name organization organization_unit city state country cert_contact );
+
+}
 
 my $error = '';
 if ($cgi->param('svcnum')) {
diff --git a/httemplate/edit/svc_cert/import_certificate.html b/httemplate/edit/svc_cert/import_certificate.html
new file mode 100644 (file)
index 0000000..337a741
--- /dev/null
@@ -0,0 +1,22 @@
+<% include('/elements/header-popup.html', 'Import issued certificate' ) %>
+
+<% include('/elements/error.html') %>
+
+<FORM NAME="ImportKeyForm" ACTION="<% $p %>process/svc_cert.cgi" METHOD="POST">
+
+<INPUT TYPE="hidden" NAME="svcnum" VALUE="<% $svcnum %>">
+
+<TEXTAREA NAME="certificate" COLS=64 ROWS=15 STYLE="font-family:monospace"></TEXTAREA>
+
+<BR><BR>
+<INPUT TYPE="submit" VALUE="Import">
+
+</FORM>
+</BODY>
+</HTML>
+<%init>
+
+$cgi->param('svcnum') =~ /^(\d*)$/ or die 'illegal svcnum';
+my $svcnum = $1;
+
+</%init>
index 36f598b..28a269b 100644 (file)
@@ -34,8 +34,8 @@ my @fields = (
     'value'=> sub {
       my $svc_cert = shift;
       if ( $svc_cert->csr ) { #display the subject etc?
-        '<FONT STYLE="font-family:monospace"><PRE>'. $svc_cert->csr.
-        '</PRE></FONT>';
+        '<PRE><FONT STYLE="font-family:monospace">'. "\n". $svc_cert->csr.
+        '</FONT></PRE>';
       } elsif ( $svc_cert->common_name ) {
         my $svcnum = $svc_cert->svcnum;
         qq(<A HREF="${p}misc/svc_cert-generate.html?action=generate_csr;svcnum=$svcnum">Generate</A>);
@@ -50,15 +50,60 @@ my @fields = (
       if ( $svc_cert->certificate ) {
 
         my %hash = $svc_cert->check_certificate;
-        my $out = '<TABLE>'; #XXX better formatting
-        foreach my $key ( keys %hash ) {
-          $out .= "<TR><TD>$key</TD><TD>$hash{$key}</TD></TR>";
+
+        tie my %w, 'Tie::IxHash',
+          'subject' => 'Issued to',
+          'issuer'  => 'Issued by',
+        ;
+
+        my $out = '<TABLE><TR><TD>';
+
+        foreach my $w ( keys %w ) {
+
+          $out .= include('/elements/table-grid.html'). #'<TABLE>'.
+                  '<TR><TH COLSPAN=2 BGCOLOR="#cccccc" ALIGN="center">'.
+                  $w{$w}. '</TH></TR>';
+
+          my $col = $svc_cert->subj_col;
+
+          my $subj = $hash{$w};
+          foreach my $key (keys %$col) { #( keys %$subj ) {
+            $out .= "<TR><TD>". $labels{$col->{$key}}.  "</TD>".
+                        "<TD>". $subj->{$key}. "</TD></TR>";
+          }
+
+          $out .= '</TABLE></TD><TD>';
         }
-        $out .= '</TABLE>';
+        $out .= '</TD></TR></TABLE>';
+
+        $out .= '<TABLE>'.
+                '<TR><TH ALIGN="right">Serial number</TH>'.
+                    "<TD>$hash{serial}</TD></TR>".
+                '<TR><TH ALIGN="right">Valid</TH>'.
+                    "<TD>$hash{notBefore} - $hash{notAfter}</TD></TR>".
+                '</TABLE>';
 
-        $out .= '<FONT STYLE="font-family:monospace"><PRE>'.
+        if ( $hash{'selfsigned'} ) {
+          my $svcnum = $svc_cert->svcnum;
+          $out .= qq(<BR> <A HREF="${p}misc/svc_cert-generate.html?action=generate_selfsigned;svcnum=$svcnum">Re-generate self-signed</A>).
+                  ' &nbsp; '.
+                  include('/elements/popup_link.html', {
+                    'action'      => $p."edit/svc_cert/import_certificate.html".
+                                     "?svcnum=$svcnum",
+                    'label'       => 'Import issued certificate', #link
+                    'actionlabel' => 'Import issued certificate', #title
+                    #opt
+                    'width'       => '544',
+                    'height'      => '368',
+                    #'color'       => '#ff0000',
+                  }).
+                  '<BR>';
+        }
+
+        $out .= '<PRE><FONT STYLE="font-family:monospace">'.
                 $svc_cert->certificate.
-                '</PRE></FONT>';
+                '</FONT><PRE>';
+
         $out;
       } elsif ( $svc_cert->csr ) {
         my $svcnum = $svc_cert->svcnum;