commit c2b76dcc4a854d7cecb44acac2bea1cf23cf51e6 Author: Nicolas Vigier boklm@mars-attacks.org Date: Thu Sep 25 19:39:19 2014 +0200
Add the update responses script
Add the update responses script in directory tools/update-responses.
This adds the content of commit 2c3625507a5c12b4c15b6681a8b694114a0cfb7b from https://github.com/boklm/tb-update-response. --- tools/update-responses/.gitignore | 1 + tools/update-responses/README.md | 45 +++++++ tools/update-responses/config.yml | 16 +++ tools/update-responses/htdocs/no-update.xml | 2 + tools/update-responses/update_responses | 169 +++++++++++++++++++++++++++ 5 files changed, 233 insertions(+)
diff --git a/tools/update-responses/.gitignore b/tools/update-responses/.gitignore new file mode 100644 index 0000000..c077014 --- /dev/null +++ b/tools/update-responses/.gitignore @@ -0,0 +1 @@ +htdocs diff --git a/tools/update-responses/README.md b/tools/update-responses/README.md new file mode 100644 index 0000000..ee21bac --- /dev/null +++ b/tools/update-responses/README.md @@ -0,0 +1,45 @@ +Tor Browser Update Responses script +=================================== + +This repository contains a script to generate responses for Tor Browser +updater. + +See ticket [#12622](https://trac.torproject.org/projects/tor/ticket/12622) +for details. + + +Dependencies +------------ + +The following perl modules need to be installed to run the script: + FindBin YAML File::Slurp Digest::SHA XML::Writer + +On Debian / Ubuntu you can install them with: + +``` + # apt-get install libfindbin-libs-perl libyaml-perl libfile-slurp-perl \ + libdigest-sha-perl libxml-writer-perl +``` + +On Red Hat / Fedora you can install them with: + +``` + # for module in FindBin YAML File::Slurp Digest::SHA XML::Writer + do yum install "perl($module)"; done +``` + + +URL Format +---------- + +The URL format is: + https://something/$channel/$build_target/$tb_version/$lang?force=1 + +'build_target' is the OS for which the browser was built. The correspo +ndance between the build target and the OS name that we use in archive +files is defined in the config.yml file. + +'tb_version' is the Tor Browser version. + +'lang' is the locale. + diff --git a/tools/update-responses/config.yml b/tools/update-responses/config.yml new file mode 100644 index 0000000..8b5475a --- /dev/null +++ b/tools/update-responses/config.yml @@ -0,0 +1,16 @@ +--- +build_targets: + linux32: Linux_x86-gcc3 + linux64: Linux_x86_64-gcc3 + win32: WINNT_x86-gcc3 + osx32: Darwin_x86-gcc3 +channels: + alpha: 4.0-alpha-3 +versions: + 4.0-alpha-3: + platformVersion: 24.8.1 + detailsURL: https://www.torproject.org/projects/torbrowser.html.en + download_url: https://www.torproject.org/dist/torbrowser/4.0-alpha-3 +# osx32: +# minSupportedOSVersion: 10.7 +# unsupported: 1 diff --git a/tools/update-responses/htdocs/no-update.xml b/tools/update-responses/htdocs/no-update.xml new file mode 100644 index 0000000..910e99d --- /dev/null +++ b/tools/update-responses/htdocs/no-update.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<updates></updates> diff --git a/tools/update-responses/releases/.directory b/tools/update-responses/releases/.directory new file mode 100644 index 0000000..e69de29 diff --git a/tools/update-responses/update_responses b/tools/update-responses/update_responses new file mode 100755 index 0000000..e082592 --- /dev/null +++ b/tools/update-responses/update_responses @@ -0,0 +1,169 @@ +#!/usr/bin/perl -w + +use strict; +use FindBin; +use YAML qw(LoadFile); +use File::Slurp; +use Digest::SHA; +use XML::Writer; + +my $htdocsdir = "$FindBin::Bin/htdocs"; +my $config = LoadFile("$FindBin::Bin/config.yml"); +my %htdocsfiles = ( '.' => 1, '..' => 1, 'no-update.xml' => 1 ); + +sub exit_error { + print STDERR "Error: ", $_[0], "\n"; + exit (exists $_[1] ? $_[1] : 1); +} + +sub build_target_by_os { + $config->{build_targets}{$_[0]} ? $config->{build_targets}{$_[0]} : $_[0]; +} + +sub write_htdocs { + my ($file, $content) = @_; + mkdir $htdocsdir unless -d $htdocsdir; + write_file("$htdocsdir/$file", $content); + $htdocsfiles{$file} = 1; +} + +sub clean_htdocs { + opendir(my $d, $htdocsdir); + my @files = grep { ! $htdocsfiles{$_} } readdir $d; + closedir $d; + unlink map { "$htdocsdir/$_" } @files; +} + +sub get_sha512_hex_of_file { + my ($file) = @_; + my $sha = Digest::SHA->new("512"); + $sha->addfile($file); + return $sha->hexdigest; +} + +sub get_version_files { + my ($config, $version) = @_; + return if $config->{versions}{$version}{files}; + my $files = {}; + my $vdir = "$FindBin::Bin/releases/$version"; + opendir(my $d, $vdir) or exit_error "Error opening directory $vdir"; + foreach my $file (readdir $d) { + next unless -f "$vdir/$file"; + if ($file =~ m/^tor-browser-([^-]+)-${version}_(.+).mar$/) { + my ($os, $lang) = ($1, $2); + $files->{$os}{$lang}{complete} = { + type => 'complete', + URL => "$config->{versions}{$version}{download_url}/$file", + size => -s "$vdir/$file", + hashFunction => 'SHA512', + hashValue => get_sha512_hex_of_file("$vdir/$file"), + }; + next; + } + if ($file =~ m/^tor-browser-([^-]+)-([^-]+)-${version}_(.+).mar$/) { + my ($os, $from_version, $lang) = ($1, $2, $3); + $files->{$os}{$lang}{partial}{$from_version} = { + type => 'partial', + URL => "$config->{versions}{$version}{download_url}/$file", + size => -s "$vdir/$file", + hashFunction => 'SHA512', + hashValue => get_sha512_hex_of_file("$vdir/$file"), + } + } + } + closedir $d; + $config->{versions}{$version}{files} = $files; +} + +sub get_config { + my ($config, $version, $os, $name) = @_; + return $config->{versions}{$version}{$os}{$name} + // $config->{versions}{$version}{$name} + // $config->{$name}; +} + +sub get_response { + my ($config, $version, $os, @patches) = @_; + my $res; + my $writer = XML::Writer->new(OUTPUT => $res, ENCODING => 'UTF-8'); + $writer->xmlDecl; + $writer->startTag('updates'); + if (get_config($config, $version, $os, 'unsupported')) { + $writer->startTag('update', + unsupported => 'true', + detailsURL => get_config($config, $version, $os, 'detailsURL'), + ); + goto CLOSETAGS; + } + my $minversion = get_config($config, $version, $os, 'minSupportedOSVersion'); + $writer->startTag('update', + type => 'minor', + displayVersion => $version, + appVersion => $version, + platformVersion => get_config($config, $version, $os, 'platformVersion'), + buildID => '20000101000000', + detailsURL => get_config($config, $version, $os, 'detailsURL'), + defined $minversion ? ( minSupportedOSVersion => $minversion ) : (), + ); + foreach my $patch (@patches) { + $writer->startTag('patch', %$patch); + $writer->endTag('patch'); + } + CLOSETAGS: + $writer->endTag('update'); + $writer->endTag('updates'); + $writer->end; + return $res; +} + +sub write_responses { + my ($config) = @_; + foreach my $version (values %{$config->{channels}}) { + get_version_files($config, $version); + my $files = $config->{versions}{$version}{files}; + foreach my $os (keys %$files) { + foreach my $lang (keys %{$files->{$os}}) { + my $resp = get_response($config, $version, $os, + $files->{$os}{$lang}{complete}); + write_htdocs("$version-$os-$lang.xml", $resp); + foreach my $from_version (keys %{$files->{$os}{$lang}{partial}}) { + $resp = get_response($config, $version, $os, + $files->{$os}{$lang}{complete}, + $files->{$os}{$lang}{partial}{$from_version}); + write_htdocs("$from_version-$version-$os-$lang.xml", $resp); + } + } + } + } +} + +sub write_htaccess { + my ($config) = @_; + my $htaccess = "RewriteEngine On\n"; + my $flags = "[last]"; + foreach my $channel (keys %{$config->{channels}}) { + my $version = $config->{channels}{$channel}; + my $files = $config->{versions}{$version}{files}; + $htaccess .= "RewriteRule " + . "^$channel/[^/]+/$version/ " + . "no-update.xml $flags\n"; + foreach my $os (keys %$files) { + my $bt = build_target_by_os($os); + foreach my $lang (keys %{$files->{$os}}) { + foreach my $from_version (keys %{$files->{$os}{$lang}{partial}}) { + $htaccess .= "RewriteRule ^$channel/$bt/$from_version/$lang " + . "$from_version-$version-$os-$lang.xml $flags\n"; + } + $htaccess .= "RewriteRule ^$channel/$bt/[^/]+/$lang " + . "$version-$os-$lang.xml $flags\n"; + } + $htaccess .= "RewriteRule ^$channel/$bt " + . "$version-$os-en-US.xml $flags\n"; + } + } + write_htdocs('.htaccess', $htaccess); +} + +write_responses($config); +write_htaccess($config); +clean_htdocs;