make additionsdialog show connection errors
[LibreOffice.git] / postprocess / signing / signing.pl
blob793900ca074c5f054679ac5b1480d6fb1ecebd3f
2 eval 'exec perl -wS $0 ${1+"$@"}'
3 if 0;
5 # This file is part of the LibreOffice project.
7 # This Source Code Form is subject to the terms of the Mozilla Public
8 # License, v. 2.0. If a copy of the MPL was not distributed with this
9 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
11 # This file incorporates work covered by the following license notice:
13 # Licensed to the Apache Software Foundation (ASF) under one or more
14 # contributor license agreements. See the NOTICE file distributed
15 # with this work for additional information regarding copyright
16 # ownership. The ASF licenses this file to you under the Apache
17 # License, Version 2.0 (the "License"); you may not use this file
18 # except in compliance with the License. You may obtain a copy of
19 # the License at http://www.apache.org/licenses/LICENSE-2.0 .
22 use strict;
23 use Getopt::Long;
25 my $debug = 0;
26 my $max_files = 400; # sign $max_files with one command line
28 #### globals #####
29 my $myname = "";
30 my $opt_desc = "";
31 my $opt_exclude = ""; # file with a list of not signable dll and exe files
32 my $opt_verbose = 0;
33 my $opt_help = 0;
34 my $opt_log = ""; # for logging
35 my $opt_pass = ""; # password for signing
36 my $opt_pfxfile = ""; # Personal Information Exchange file
37 my $opt_timestamp_url = ""; # timestamp url
38 my %exclude_files = (); # list of not signable dll and exe files
39 my $signtool = "signtool.exe sign";
40 my @args = ();
41 my @files_to_sign = ();
43 #### main #####
44 $myname = script_id();
45 if ( $#ARGV < 2 ) {
46 usage();
47 exit(1);
49 @args = parse_options();
50 get_exclude_files() if ($opt_exclude ne "");
51 @files_to_sign = get_files(\@args);
52 if ( $opt_log ) { # logging
53 open(LOG,">$opt_log") || die "Can't open log file $opt_log\n";
55 sign_files(\@files_to_sign);
56 close LOG if ($opt_log); # logging
57 exit 0;
60 #### subroutines ####
62 sub script_id
64 ( my $script_name = $0 ) =~ s/^.*[\\\/]([\w\.]+)$/$1/;
65 return $script_name;
68 ############################################################################
69 sub parse_options #09.07.2007 08:13
70 ############################################################################
72 # e exclude list file
73 # v verbose
74 my $success = GetOptions('h' => \$opt_help,
75 'd=s' => \$opt_desc, 'e=s'=>\$opt_exclude, 'f=s'=>\$opt_pfxfile, 'l=s'=>\$opt_log,
76 'p=s'=>\$opt_pass,'v'=>\$opt_verbose, 't=s'=>\$opt_timestamp_url);
77 if ( !$success || $opt_help ) {
78 usage();
79 exit(1);
81 return @ARGV;
82 } ##parse_options
84 ############################################################################
85 sub get_exclude_files #09.07.2007 10:12
86 ############################################################################
88 if ( -e $opt_exclude ) {
89 # get data from cache file
90 open( IN, "<$opt_exclude") || die "Can't open exclude file $opt_exclude\n";
91 while ( my $line = <IN> ) {
92 chomp($line);
93 $exclude_files{$line} = 1; # fill hash
94 print "$line - $exclude_files{$line}\n" if ($debug);
96 } else
98 print_error("Can't open $opt_exclude file!\n");
100 } ##get_exclude_files
102 ############################################################################
103 sub get_files #10.07.2007 10:19
104 ############################################################################
106 use File::Basename;
107 my $target = shift;
108 my $file_pattern;
109 my $file;
110 my @files = ();
111 print "\n";
112 foreach $file_pattern ( @$target )
114 print "Files: $file_pattern\n";
115 foreach $file ( glob( $file_pattern ) )
117 my $lib = File::Basename::basename $file;
118 if ( ! $exclude_files{$lib} ) {
119 push @files,$file;
121 else
123 print "exclude=$lib\n" if ($opt_verbose);
127 print "\n";
128 return @files;
129 } ##get_files
131 ############################################################################
132 sub sign_files #09.07.2007 10:36
133 ############################################################################
135 my $files_to_sign = shift;
136 my $commandline_base = ""; # contains whole stuff without the file name
137 my $file = "";
138 my $result = "";
140 if ( $opt_pass =~ /\.exe$/ ) {
141 # get password by tool
142 open(PIPE, "$opt_pass 2>&1 |") || die "Can't open PIPE!\n";
143 my $pass = <PIPE>;
144 close PIPE;
145 print_error("Can't get password!\n") if ( !$pass ); # exit here
146 $opt_pass = $pass;
148 $signtool .= " -v" if ($opt_verbose);
149 $commandline_base = $signtool;
150 $commandline_base .= " -fd sha256 -td sha256";
151 $commandline_base .= " -f $opt_pfxfile" if ($opt_pfxfile ne "");
152 $commandline_base .= " -p $opt_pass" if ($opt_pass ne "");
153 $commandline_base .= " -tr $opt_timestamp_url" if ($opt_timestamp_url ne "");
154 $commandline_base .= " -d \"$opt_desc\"" if ($opt_desc ne "");
156 # Here switch between:
157 # one command line for multiple files (all doesn't work, too much) / for each file one command line
158 if ( $max_files > 1 ) {
159 exec_multi_sign($files_to_sign, $commandline_base);
160 } else
162 exec_single_sign($files_to_sign, $commandline_base);
164 } ##sign_files
166 ############################################################################
167 sub exec_single_sign #11.07.2007 09:05
168 ############################################################################
170 my $files_to_sign = shift;
171 my $commandline_base = shift; # contains whole stuff without the file name
172 my $file = "";
173 my $commandline = "";
175 foreach $file (@$files_to_sign)
177 $commandline = $commandline_base . " $file";
178 print "$commandline\n" if ($debug);
179 execute($commandline);
180 } #foreach
181 } ##exec_single_sign
183 ############################################################################
184 sub exec_multi_sign #11.07.2007 08:56
185 ############################################################################
187 # sign multiple file with one command line
188 my $files_to_sign = shift;
189 my $commandline_base = shift; # contains whole stuff without the file name
190 my $commandline = $commandline_base; # contains stuff which will be executed
191 my $file = "";
192 my $counter = 0;
194 foreach $file (@$files_to_sign)
196 $commandline .= " $file";
197 ++$counter;
198 if ( $counter >= $max_files ) {
199 execute($commandline);
200 $counter = 0; # reset counter
201 $commandline = $commandline_base; # reset command line
204 execute($commandline) if ($counter > 0);
205 } ##exec_multi_sign
207 ############################################################################
208 sub execute #11.07.2007 10:02
209 ############################################################################
211 my $commandline = shift;
212 my $result = "";
213 my $errorlines = "";
215 print "$commandline\n" if ($debug);
216 open(PIPE, "$commandline 2>&1 |") || die "Error: Cannot execute '$commandline' - $!\n";
217 while ( $result = <PIPE> ) {
218 print LOG "$result" if ($opt_log);
219 $errorlines .= $result if ($result =~ /SignTool Error\:/);
220 } # while
221 close PIPE;
222 print_error( "$errorlines\n" ) if ($errorlines);
223 } ##execute
225 ############################################################################
226 sub print_error #09.07.2007 11:21
227 ############################################################################
229 my $text = shift;
230 print "ERROR: $text\n";
231 print LOG "ERROR: $text\n" if ($opt_log); # logging
232 close LOG if ($opt_log); # logging
233 exit(1);
234 } ##print_error
236 ############################################################################
237 sub usage #09.07.2007 08:39
238 ############################################################################
240 print "Usage:\t $myname [-e filename] [-f filename] [-p password] [-t timestamp] [-l filename] [-v] <file[list]> \n";
241 print "Options:\n";
242 print "\t -e filename\t\t\tFile which contains a list of files which don't have to be signed.\n";
243 print "\t -f pfx_filename\t\t\"Personal Information Exchange\" file.\n";
244 print "\t -p password\t\t\tPassword for \"Personal Information Exchange\" file.\n";
245 print "\t -t timestamp\t\t\tTimestamp URL e.g. \"http://timestamp.verisign.com/scripts/timstamp.dll\"\n";
246 print "\t -l log_filename\t\tFile for logging.\n";
247 print "\t -v\t\t\t\tVerbose.\n";
248 } ##usage