speedo: Also try patch files w/o version number.
[gnupg.git] / build-aux / getswdb.sh
1 #!/bin/sh
2 # Get the online version of the GnuPG software version database
3 # Copyright (C) 2014  Werner Koch
4 #
5 # This file is free software; as a special exception the author gives
6 # unlimited permission to copy and/or distribute it, with or without
7 # modifications, as long as this notice is preserved.
8 #
9 # This program is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
11 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 # The URL of the file to retrieve.
14 # (some wget versions seem to have problems with SubjectAltName, thus
15 #  we do not use www.gnupg.org)
16 urlbase="https://gnupg.org/"
17
18 WGET=wget
19 GPGV=gpgv
20
21 srcdir=$(dirname "$0")
22 distsigkey="$srcdir/../g10/distsigkey.gpg"
23
24 # Convert a 3 part version number it a numeric value.
25 cvtver () {
26   awk 'NR==1 {split($NF,A,".");X=1000000*A[1]+1000*A[2]+A[3];print X;exit 0}'
27 }
28
29 # Prints usage information.
30 usage()
31 {
32     cat <<EOF
33 Usage: $(basename $0) [OPTIONS]
34 Get the online version of the GnuPG software version database
35 Options:
36     --skip-download    Assume download has already been done.
37     --skip-verify      Do not check signatures
38     --skip-selfcheck   Do not check GnuPG version
39     --find-sha1sum     Print the name of the sha1sum utility
40     --find-sha256sum   Print the name of the sha256sum utility
41     --help             Print this help.
42 EOF
43     exit $1
44 }
45
46 #
47 # Parse options
48 #
49 skip_download=no
50 skip_verify=no
51 skip_selfcheck=no
52 find_sha1sum=no
53 find_sha256sum=no
54 while test $# -gt 0; do
55     case "$1" in
56         # Set up `optarg'.
57         --*=*)
58             optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
59             ;;
60         *)
61             optarg=""
62             ;;
63     esac
64
65     case $1 in
66         --help|-h)
67             usage 0
68             ;;
69         --skip-download)
70             skip_download=yes
71             ;;
72         --skip-verify)
73             skip_verify=yes
74             ;;
75         --skip-selfcheck)
76             skip_selfcheck=yes
77             ;;
78         --find-sha1sum)
79             find_sha1sum=yes
80             ;;
81         --find-sha256sum)
82             find_sha256sum=yes
83             ;;
84         *)
85             usage 1 1>&2
86             ;;
87     esac
88     shift
89 done
90
91 # Mac OSX has only a shasum and not sha1sum
92 if [ ${find_sha1sum} = yes ]; then
93     for i in sha1sum shasum ; do
94        tmp=$($i </dev/null 2>/dev/null | cut -d ' ' -f1)
95        if [ x"$tmp" = x"da39a3ee5e6b4b0d3255bfef95601890afd80709" ]; then
96            echo "$i"
97            exit 0
98        fi
99     done
100     echo "false"
101     exit 1
102 fi
103
104 # Mac OSX has only a shasum and not sha256sum
105 if [ ${find_sha256sum} = yes ]; then
106     for i in 'shasum -a 256' sha256sum ; do
107        tmp=$($i </dev/null 2>/dev/null | cut -d ' ' -f1)
108        tmp2="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
109        if [ x"$tmp" = x"$tmp2" ]; then
110            echo "$i"
111            exit 0
112        fi
113     done
114     echo "false"
115     exit 1
116 fi
117
118
119 # Get GnuPG version from VERSION file.  For a GIT checkout this means
120 # that ./autogen.sh must have been run first.  For a regular tarball
121 # VERSION is always available.
122 if [ ! -f "$srcdir/../VERSION" ]; then
123     echo "VERSION file missing - run autogen.sh first." >&2
124     exit 1
125 fi
126 version=$(cat "$srcdir/../VERSION")
127 version_num=$(echo "$version" | cvtver)
128
129 if [ $skip_verify = no ]; then
130   if ! $GPGV --version >/dev/null 2>/dev/null ; then
131     echo "command \"gpgv\" is not installed" >&2
132     echo "(please install an older version of GnuPG)" >&2
133     exit 1
134   fi
135 fi
136
137 #
138 # Download the list and verify.
139 #
140 if [ $skip_download = yes ]; then
141   if [ ! -f swdb.lst ]; then
142       echo "swdb.lst is missing." >&2
143       exit 1
144   fi
145   if [ $skip_verify = no ]; then
146     if [ ! -f swdb.lst.sig ]; then
147       echo "swdb.lst.sig is missing." >&2
148       exit 1
149     fi
150   fi
151 else
152   if ! $WGET --version >/dev/null 2>/dev/null ; then
153       echo "command \"wget\" is not installed" >&2
154       exit 1
155   fi
156
157   if ! $WGET -q -O swdb.lst "$urlbase/swdb.lst" ; then
158       echo "download of swdb.lst failed." >&2
159       exit 1
160   fi
161   if [ $skip_verify = no ]; then
162     if ! $WGET -q -O swdb.lst.sig "$urlbase/swdb.lst.sig" ; then
163       echo "download of swdb.lst.sig failed." >&2
164       exit 1
165     fi
166   fi
167 fi
168 if [ $skip_verify = no ]; then
169   if ! $GPGV --keyring "$distsigkey" swdb.lst.sig swdb.lst; then
170     echo "list of software versions is not valid!" >&2
171     exit 1
172  fi
173 fi
174
175 #
176 # Check that the online version of GnuPG is not less than this version
177 # to help detect rollback attacks.
178 #
179 if [ $skip_selfcheck = no ]; then
180   gnupg_ver=$(awk '$1=="gnupg21_ver" {print $2;exit}' swdb.lst)
181   if [ -z "$gnupg_ver" ]; then
182       echo "GnuPG 2.1 version missing in swdb.lst!" >&2
183       exit 1
184   fi
185   gnupg_ver_num=$(echo "$gnupg_ver" | cvtver)
186   if [ $(( $gnupg_ver_num >= $version_num )) = 0 ]; then
187       echo "GnuPG version in swdb.lst is less than this version!" >&2
188       echo "  This version: $version" >&2
189       echo "  SWDB version: $gnupg_ver" >&2
190       exit 1
191   fi
192 fi