1#!/usr/bin/env perl 2#!/usr/bin/perl 3use strict; 4use warnings; 5 6# Core modules 7use Carp; 8use English; 9use Data::Dumper; 10use File::Basename; 11use FindBin qw( $Bin ); 12use File::Find; 13 14# CPAN modules 15use Log::Log4perl qw(:easy); 16Log::Log4perl->easy_init($WARN); 17use Test::More; 18use DateTime; 19 20# Project modules 21use lib "$Bin/../../core/server"; 22use OpenXPKI::Server::Init; 23use OpenXPKI::Server::Context qw( CTX ); 24 25 26sub get_files { 27 my ($path, $extension) = @_; 28 my $filemap = {}; 29 find( 30 sub { 31 return unless / \. \Q$extension\E $/msxi; 32 my $name = $_; $name =~ s/ \. [^\.]+ $//msxi; 33 # slurp 34 open (my $fh, '<', $_) or die "Could not open $File::Find::name"; 35 my @pem = <$fh>; close ($fh); 36 chomp @pem; 37 $filemap->{$name} = join('\n', @pem); 38 }, 39 $path 40 ); 41 return $filemap; 42} 43 44# 45# Converts the generated PEM private key files into Perl code to be inserted 46# into OpenXPKI::Test::CertHelper::Database. 47# 48die "Base path where certificates reside must be specified as first parameter" 49 unless $ARGV[0] and -d $ARGV[0]; 50 51my $pkcs7 = get_files($ARGV[0], "p7b"); 52my $crl = get_files($ARGV[0], "crl"); 53my $privkeys = get_files($ARGV[0], "pem"); # used later on 54 55print "sub _build_pkcs7 {\n return {\n"; 56printf " '%s' => \"%s\",\n", $_, $pkcs7->{$_} for sort keys %$pkcs7; 57print " };\n}\n"; 58 59print "sub _build_crl {\n return {\n"; 60printf " '%s' => \"%s\",\n", $_, $crl->{$_} for sort keys %$crl; 61print " };\n}\n"; 62 63# 64# Print all certificates as database hashes 65# 66OpenXPKI::Server::Init::init({ 67 TASKS => ['config_versioned','log','dbi'], 68 SILENT => 1, 69 CLI => 1, 70}); 71 72my $dbh = CTX('dbi')->select( 73 from_join => 'aliases|a identifier=identifier certificate|c', 74 columns => [ qw( a.alias a.group_id a.generation c.* ) ], 75); 76 77print "sub _build_certs {\n return {\n"; 78 79while (my $data = $dbh->fetchrow_hashref) { 80 my $label = (split("=", (split(",", $data->{subject}))[0]))[1]; 81 my $internal_id = ($data->{group_id}//"") eq "root" ? $data->{pki_realm}."-".$data->{alias} : $data->{alias}; 82 83 print " '$internal_id' => OpenXPKI::Test::CertHelper::Database::Cert->new(\n"; 84 print " label => '$label',\n"; 85 print " name => '$internal_id',\n"; 86 print ' db => {'."\n "; 87 print join "\n ", 88 map { 89 my $val = $data->{$_}; 90 my $qc = "'"; 91 # Multiline attributes 92 if (m/^(data)$/) { 93 $val =~ s/\r?\n/\\n/g if $val; # Convert newlines to "\n" 94 $qc = '"'; # Double quotes 95 } 96 sprintf("%s => %s,%s", 97 $_, 98 (defined $val ? "$qc$val$qc" : "undef"), 99 ($_ =~ /^not(before|after)$/ ? " # ".DateTime->from_epoch(epoch => $val)->datetime : ""), 100 ) 101 } 102 sort 103 grep { $_ !~ /^ ( alias | group_id | generation ) $/msx } 104 keys %$data; 105 print "\n },\n"; 106 print ' db_alias => {'."\n "; 107 print join "\n ", 108 map { 109 my $val = $data->{$_}; 110 sprintf("%s => %s,", 111 $_, 112 (defined $val ? "'$val'" : "undef"), 113 ) 114 } 115 sort 116 grep { /^ ( alias | group_id | generation ) $/msx } 117 keys %$data; 118 print "\n },\n"; 119 printf " private_key => \"%s\",\n", $privkeys->{$internal_id}; 120 print " ),\n\n"; 121}; 122 123print " };\n}\n"; 124