build: Update standard build-aux files.
[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     --find-sha1sum   Print the name of the sha1sum utility
39     --help           Print this help.
40 EOF
41     exit $1
42 }
43
44 #
45 # Parse options
46 #
47 skip_download=no
48 skip_verify=no
49 find_sha1sum=no
50 while test $# -gt 0; do
51     case "$1" in
52         # Set up `optarg'.
53         --*=*)
54             optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
55             ;;
56         *)
57             optarg=""
58             ;;
59     esac
60
61     case $1 in
62         --help|-h)
63             usage 0
64             ;;
65         --skip-download)
66             skip_download=yes
67             ;;
68         --skip-verify)
69             skip_verify=yes
70             ;;
71         --find-sha1sum)
72             find_sha1sum=yes
73             ;;
74         *)
75             usage 1 1>&2
76             ;;
77     esac
78     shift
79 done
80
81 # Mac OSX has only a shasum and not sha1sum
82 if [ ${find_sha1sum} = yes ]; then
83     for i in sha1sum shasum ; do
84        tmp=$($i </dev/null 2>/dev/null | cut -d ' ' -f1)
85        if [ x"$tmp" = x"da39a3ee5e6b4b0d3255bfef95601890afd80709" ]; then
86            echo "$i"
87            exit 0
88        fi
89     done
90     echo "false"
91     exit 1
92 fi
93
94 # Get GnuPG version from VERSION file.  For a GIT checkout this means
95 # that ./autogen.sh must have been run first.  For a regular tarball
96 # VERSION is always available.
97 if [ ! -f "$srcdir/../VERSION" ]; then
98     echo "VERSION file missing - run autogen.sh first." >&2
99     exit 1
100 fi
101 version=$(cat "$srcdir/../VERSION")
102 version_num=$(echo "$version" | cvtver)
103
104 if [ $skip_verify = no ]; then
105   if ! $GPGV --version >/dev/null 2>/dev/null ; then
106     echo "command \"gpgv\" is not installed" >&2
107     echo "(please install an older version of GnuPG)" >&2
108     exit 1
109   fi
110 fi
111
112 #
113 # Download the list and verify.
114 #
115 if [ $skip_download = yes ]; then
116   if [ ! -f swdb.lst ]; then
117       echo "swdb.lst is missing." >&2
118       exit 1
119   fi
120   if [ $skip_verify = no ]; then
121     if [ ! -f swdb.lst.sig ]; then
122       echo "swdb.lst.sig is missing." >&2
123       exit 1
124     fi
125   fi
126 else
127   if ! $WGET --version >/dev/null 2>/dev/null ; then
128       echo "command \"wget\" is not installed" >&2
129       exit 1
130   fi
131
132   if ! $WGET -q -O swdb.lst "$urlbase/swdb.lst" ; then
133       echo "download of swdb.lst failed." >&2
134       exit 1
135   fi
136   if [ $skip_verify = no ]; then
137     if ! $WGET -q -O swdb.lst.sig "$urlbase/swdb.lst.sig" ; then
138       echo "download of swdb.lst.sig failed." >&2
139       exit 1
140     fi
141   fi
142 fi
143 if [ $skip_verify = no ]; then
144   if ! $GPGV --keyring "$distsigkey" swdb.lst.sig swdb.lst; then
145     echo "list of software versions is not valid!" >&2
146     exit 1
147  fi
148 fi
149
150 #
151 # Check that the online version of GnuPG is not less than this version
152 # to help detect rollback attacks.
153 #
154 gnupg_ver=$(awk '$1=="gnupg21_ver" {print $2;exit}' swdb.lst)
155 if [ -z "$gnupg_ver" ]; then
156     echo "GnuPG 2.1 version missing in swdb.lst!" >&2
157     exit 1
158 fi
159 gnupg_ver_num=$(echo "$gnupg_ver" | cvtver)
160 if [ $(( $gnupg_ver_num >= $version_num )) = 0 ]; then
161     echo "GnuPG version in swdb.lst is less than this version!" >&2
162     echo "  This version: $version" >&2
163     echo "  SWDB version: $gnupg_ver" >&2
164     exit 1
165 fi