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