diff options
author | Ivo Hinkelmann <ihi@openoffice.org> | 2007-08-20 14:44:09 +0000 |
---|---|---|
committer | Ivo Hinkelmann <ihi@openoffice.org> | 2007-08-20 14:44:09 +0000 |
commit | 75528f3874003b3ffcd55dd8ac953d16e5d28bec (patch) | |
tree | aefa0be142931a06ab82fa7d6d5fc40aa34122cc /postprocess/signing | |
parent | 530a9472269d3363d3ceb81ce3ff5a66dbcea36d (diff) |
INTEGRATION: CWS obo14 (1.1.2); FILE ADDED
2007/07/25 11:32:03 rt 1.1.2.3: Minor beautifications.
2007/07/25 10:41:10 obo 1.1.2.2: minor fixes
2007/07/11 09:10:17 obo 1.1.2.1: #i79312# Signing support for Windows Vista
Diffstat (limited to 'postprocess/signing')
-rw-r--r-- | postprocess/signing/signing.pl | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/postprocess/signing/signing.pl b/postprocess/signing/signing.pl new file mode 100644 index 000000000000..c9ccdb187823 --- /dev/null +++ b/postprocess/signing/signing.pl @@ -0,0 +1,281 @@ +: +eval 'exec perl -wS $0 ${1+"$@"}' + if 0; +#************************************************************************* +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: signing.pl,v $ +# +# $Revision: 1.2 $ +# +# last change: $Author: ihi $ $Date: 2007-08-20 15:44:09 $ +# +# The Contents of this file are made available subject to +# the terms of GNU Lesser General Public License Version 2.1. +# +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2005 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +#************************************************************************* + +use strict; +use Getopt::Long; + +my $debug = 0; +my $max_files = 20; # sign $max_files with one command line + +#### globals ##### +my $myname = ""; +my $opt_dir = ""; +my $opt_exclude = ""; # file with a list of not signable dll and exe files +my $opt_verbose = 0; +my $opt_help = 0; +my $opt_log = ""; # for logging +my $opt_pass = ""; # password for signing +my $opt_pfxfile = ""; # Personal Information Exchange file +my $opt_timestamp_url = ""; # timestamp url +my %exclude_files = (); # list of not signable dll and exe files +my $signtool = "signtool.exe sign"; +my @args = (); +my @files_to_sign = (); + +#### main ##### +$myname = script_id(); +if ( $#ARGV < 2 ) { + usage(); + exit(1); +} +@args = parse_options(); +get_exclude_files(); +@files_to_sign = get_files(\@args); +if ( $opt_log ) { # logging + open(LOG,">$opt_log") || die "Can't open log file $opt_log\n"; +} +sign_files(\@files_to_sign); +close LOG if ($opt_log); # logging +exit 0; + + +#### subroutines #### + +sub script_id +{ + ( my $script_name = $0 ) =~ s/^.*[\\\/]([\w\.]+)$/$1/; + + my $script_rev; + my $id_str = ' $Revision: 1.2 $ '; + $id_str =~ /Revision:\s+(\S+)\s+\$/ + ? ($script_rev = $1) : ($script_rev = "-"); + print "\n$script_name -- version: $script_rev\n"; + return $script_name; +} + +############################################################################ +sub parse_options #09.07.2007 08:13 +############################################################################ +{ + # e exclude list file + # v verbose + my $success = GetOptions('h' => \$opt_help, + 'd=s' => \$opt_dir, 'e=s'=>\$opt_exclude, 'f=s'=>\$opt_pfxfile, 'l=s'=>\$opt_log, + 'p=s'=>\$opt_pass,'v'=>\$opt_verbose, 't=s'=>\$opt_timestamp_url); + if ( !$success || $opt_help ) { + usage(); + exit(1); + } + if ( !$opt_exclude || !$opt_pfxfile || !$opt_pass || !$opt_timestamp_url) { + print "ERROR: Parameter missing!\n!"; + usage(); + exit(1); + } + return @ARGV; +} ##parse_options + +############################################################################ +sub get_exclude_files #09.07.2007 10:12 +############################################################################ +{ + if ( -e $opt_exclude ) { + # get data from cache file + open( IN, "<$opt_exclude") || die "Can't open exclude file $opt_exclude\n"; + while ( my $line = <IN> ) { + chomp($line); + $exclude_files{$line} = 1; # fill hash + print "$line - $exclude_files{$line}\n" if ($debug); + } + } else + { + print_error("Can't open $opt_exclude file!\n"); + } +} ##get_exclude_files + +############################################################################ +sub get_files #10.07.2007 10:19 +############################################################################ + { + use File::Basename; + my $target = shift; + my $file_pattern; + my $file; + my @files = (); + print "\n"; + foreach $file_pattern ( @$target ) + { + print "Files: $file_pattern\n"; + foreach $file ( glob( $file_pattern ) ) + { + my $lib = File::Basename::basename $file; + if ( ! $exclude_files{$lib} ) { + push @files,$file; + } + else + { + print "exclude=$lib\n" if ($opt_verbose); + } + } + } + print "\n"; + return @files; +} ##get_files + +############################################################################ +sub sign_files #09.07.2007 10:36 +############################################################################ +{ + my $files_to_sign = shift; + my $commandline_base = ""; # contains whole stuff without the file name + my $file = ""; + my $result = ""; + + print_error("Can't open PFX file: $opt_pfxfile\n") if ( ! -e $opt_pfxfile ); + print_error("Password is empty\n") if ( !$opt_pass ); + if ( $opt_pass =~ /\.exe$/ ) { + # get password by tool + open(PIPE, "$opt_pass 2>&1 |") || die "Can't open PIPE!\n"; + my $pass = <PIPE>; + close PIPE; + print_error("Can't get password!\n") if ( !$pass ); # exit here + $opt_pass = $pass; + } + $signtool .= " -v" if ($opt_verbose); + $commandline_base = $signtool . " " . "-f $opt_pfxfile -p $opt_pass -t $opt_timestamp_url"; + + # Here switch between: + # one command line for muliple files (all doesn't work, too much) / for each file one command line + if ( $max_files > 1 ) { + exec_multi_sign($files_to_sign, $commandline_base); + } else + { + exec_single_sign($files_to_sign, $commandline_base); + } +} ##sign_files + +############################################################################ +sub exec_single_sign #11.07.2007 09:05 +############################################################################ +{ + my $files_to_sign = shift; + my $commandline_base = shift; # contains whole stuff without the file name + my $file = ""; + my $commandline = ""; + + foreach $file (@$files_to_sign) + { + $commandline = $commandline_base . " $file"; + print "$commandline\n" if ($debug); + execute($commandline); + } #foreach +} ##exec_single_sign + +############################################################################ +sub exec_multi_sign #11.07.2007 08:56 +############################################################################ + { + # sign multiple file with one command line + my $files_to_sign = shift; + my $commandline_base = shift; # contains whole stuff without the file name + my $commandline = $commandline_base; # contains stuff which will be executed + my $file = ""; + my $counter = 0; + + foreach $file (@$files_to_sign) + { + $commandline .= " $file"; + ++$counter; + if ( $counter >= $max_files ) { + execute($commandline); + $counter = 0; # reset counter + $commandline = $commandline_base; # reset command line + } + } + execute($commandline) if ($counter > 0); +} ##exec_multi_sign + +############################################################################ +sub execute #11.07.2007 10:02 +############################################################################ +{ + my $commandline = shift; + my $result = ""; + + print "$commandline\n" if ($debug); + open(PIPE, "$commandline 2>&1 |") || die "Error: Cant open pipe!\n"; + while ( $result = <PIPE> ) { + print LOG "$result" if ($opt_log); # logging + if ( $result =~ /SignTool Error\:/ ) { + close PIPE; + print_error( "$result\n" ); + } # if error + } # while + close PIPE; +} ##execute + +############################################################################ +sub print_error #09.07.2007 11:21 +############################################################################ + { + my $text = shift; + print "ERROR: $text\n"; + print LOG "ERROR: $text\n" if ($opt_log); # logging + close LOG if ($opt_log); # logging + exit(1); +} ##print_error + +############################################################################ +sub usage #09.07.2007 08:39 +############################################################################ + { + print "Usage:\t $myname <-e filename> <-f filename> <-p password> <-t timestamp> [-l filename] [-v] <file[list]> \n"; + print "Options:\n"; + print "\t -e filename\t\t\tFile which contains a list of files which don't have to be signed.\n"; + print "Mandatory.\n"; + print "\t -f pfx_filename\t\t\"Personal Information Exchange\" file. "; + print "Mandatory.\n"; + print "\t -p password\t\t\tPassword for \"Personal Information Exchange\" file. Mandatory.\n"; + print "\t -t timestamp\t\t\tTimestamp URL e.g. \"http://timestamp.verisign.com/scripts/timstamp.dll\"\n"; + print "\t\t\t\t\tMandatory.\n"; + print "\t -l log_filename\t\tFile for logging.\n"; + print "\t -v\t\t\t\tVerbose.\n"; +} ##usage + + + + |