1 | #! /usr/bin/env perl
|
---|
2 | # Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved.
|
---|
3 | #
|
---|
4 | # Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
5 | # this file except in compliance with the License. You can obtain a copy
|
---|
6 | # in the file LICENSE in the source distribution or at
|
---|
7 | # https://www.openssl.org/source/license.html
|
---|
8 |
|
---|
9 |
|
---|
10 | use strict;
|
---|
11 | use warnings;
|
---|
12 |
|
---|
13 | use File::Spec::Functions;
|
---|
14 | use File::Copy;
|
---|
15 | use File::Basename;
|
---|
16 | use OpenSSL::Glob;
|
---|
17 | use OpenSSL::Test qw/:DEFAULT srctop_file/;
|
---|
18 |
|
---|
19 | setup("test_rehash");
|
---|
20 |
|
---|
21 | #If "openssl rehash -help" fails it's most likely because we're on a platform
|
---|
22 | #that doesn't support the rehash command (e.g. Windows)
|
---|
23 | plan skip_all => "test_rehash is not available on this platform"
|
---|
24 | unless run(app(["openssl", "rehash", "-help"]));
|
---|
25 |
|
---|
26 | plan tests => 4;
|
---|
27 |
|
---|
28 | indir "rehash.$$" => sub {
|
---|
29 | prepare();
|
---|
30 | ok(run(app(["openssl", "rehash", curdir()])),
|
---|
31 | 'Testing normal rehash operations');
|
---|
32 | }, create => 1, cleanup => 1;
|
---|
33 |
|
---|
34 | indir "rehash.$$" => sub {
|
---|
35 | prepare(sub { chmod 400, $_ foreach (@_); });
|
---|
36 | ok(run(app(["openssl", "rehash", curdir()])),
|
---|
37 | 'Testing rehash operations on readonly files');
|
---|
38 | }, create => 1, cleanup => 1;
|
---|
39 |
|
---|
40 | indir "rehash.$$" => sub {
|
---|
41 | ok(run(app(["openssl", "rehash", curdir()])),
|
---|
42 | 'Testing rehash operations on empty directory');
|
---|
43 | }, create => 1, cleanup => 1;
|
---|
44 |
|
---|
45 | indir "rehash.$$" => sub {
|
---|
46 | prepare();
|
---|
47 | chmod 0500, curdir();
|
---|
48 | SKIP: {
|
---|
49 | if (open(FOO, ">unwritable.txt")) {
|
---|
50 | close FOO;
|
---|
51 | skip "It's pointless to run the next test as root", 1;
|
---|
52 | }
|
---|
53 | isnt(run(app(["openssl", "rehash", curdir()])), 1,
|
---|
54 | 'Testing rehash operations on readonly directory');
|
---|
55 | }
|
---|
56 | chmod 0700, curdir(); # make it writable again, so cleanup works
|
---|
57 | }, create => 1, cleanup => 1;
|
---|
58 |
|
---|
59 | sub prepare {
|
---|
60 | my @pemsourcefiles = sort glob(srctop_file('test', "*.pem"));
|
---|
61 | my @destfiles = ();
|
---|
62 |
|
---|
63 | die "There are no source files\n" if scalar @pemsourcefiles == 0;
|
---|
64 |
|
---|
65 | my $cnt = 0;
|
---|
66 | foreach (@pemsourcefiles) {
|
---|
67 | my $basename = basename($_, ".pem");
|
---|
68 | my $writing = 0;
|
---|
69 |
|
---|
70 | open PEM, $_ or die "Can't read $_: $!\n";
|
---|
71 | while (my $line = <PEM>) {
|
---|
72 | if ($line =~ m{^-----BEGIN (?:CERTIFICATE|X509 CRL)-----}) {
|
---|
73 | die "New start in a PEM blob?\n" if $writing;
|
---|
74 | $cnt++;
|
---|
75 | my $destfile =
|
---|
76 | catfile(curdir(),
|
---|
77 | $basename . sprintf("-%02d", $cnt) . ".pem");
|
---|
78 | push @destfiles, $destfile;
|
---|
79 | open OUT, '>', $destfile
|
---|
80 | or die "Can't write $destfile\n";
|
---|
81 | $writing = 1;
|
---|
82 | }
|
---|
83 | print OUT $line if $writing;
|
---|
84 | if ($line =~ m|^-----END |) {
|
---|
85 | close OUT if $writing;
|
---|
86 | $writing = 0;
|
---|
87 | }
|
---|
88 | }
|
---|
89 | die "No end marker in $basename\n" if $writing;
|
---|
90 | }
|
---|
91 | die "No test PEM files produced\n" if $cnt == 0;
|
---|
92 |
|
---|
93 | foreach (@_) {
|
---|
94 | die "Internal error, argument is not CODE"
|
---|
95 | unless (ref($_) eq 'CODE');
|
---|
96 | $_->(@destfiles);
|
---|
97 | }
|
---|
98 | }
|
---|