-
Notifications
You must be signed in to change notification settings - Fork 3
/
addChecksum.pl
executable file
·93 lines (68 loc) · 3.18 KB
/
addChecksum.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env perl
# Copyright 2011 Wladimir Palant
# https://palant.de/
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#############################################################################
# Script to add checksums to downloadable subscriptions. The checksum will #
# be validated by Adblock Plus on download and checksum mismatches #
# (broken downloads) will be rejected. #
# #
# To add a checksum to a subscription file, run the script like this: #
# #
# perl addChecksum.pl subscription.txt #
# #
# Note: your subscription file should be saved in UTF-8 encoding, otherwise #
# the generated checksum might be incorrect. #
# AdblockPlus.Org #
#############################################################################
use strict;
use warnings;
use Path::Tiny;
use Digest::MD5 qw(md5_base64);
use Encode qw(encode_utf8);
use POSIX qw(strftime);
use feature 'unicode_strings';
die "Usage: $^X $0 subscription.txt\n" unless @ARGV;
my $file = shift;
die "Specified file: $file doesn't exist!\n" unless (-e $file);
my $data = path($file)->slurp_utf8;
# Get existing checksum
$data =~ /^.*!\s*checksum[\s\-:]+([\w\+\/=]+).*\n/gmi;
my $oldchecksum = $1;
# Remove already existing checksum
$data =~ s/^.*!\s*checksum[\s\-:]+([\w\+\/=]+).*\n//gmi;
# Calculate new checksum: remove all CR symbols and empty
# lines and get an MD5 checksum of the result (base64-encoded,
# without the trailing = characters)
my $checksumData = $data;
$checksumData =~ s/\r//g;
$checksumData =~ s/\n+/\n/g;
# Calculate new checksum
my $checksum = md5_base64(encode_utf8($checksumData));
# If the old checksum matches the new one die
die "List has not changed.\n" if (($oldchecksum) and ($checksum eq $oldchecksum));
# Update the date and time
my $updated = strftime("%Y-%m-%d %H:%M %S UTC", gmtime);
$data =~ s/(^.*!.*(Last modified|Updated):\s*)(.*)\s*$/$1$updated/gmi if ($data =~ m/^.*!.*(Last modified|Updated)/gmi);
# Update version
my $version = strftime("%Y%m%d%H%M%S" ,gmtime);
$data =~ s/^.*!\s*Version:.*/! Version: $version/gmi;
# Recalculate the checksum as we've altered the date
$checksumData = $data;
$checksumData =~ s/\r//g;
$checksumData =~ s/\n+/\n/g;
$checksum = md5_base64(encode_utf8($checksumData));
# Insert checksum into the file
$data =~ s/(\r?\n)/$1! Checksum: $checksum$1/;
path($file)->spew_utf8($data);