a7796e24000238b37270d60df6520f346cbfc5c3
[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 urlbase="https://www.gnupg.org/"
15
16 WGET=wget
17 GPGV=gpgv
18
19 srcdir=$(dirname "$0")
20 distsigkey="$srcdir/../g10/distsigkey.gpg"
21
22 # Convert a 3 part version number it a numeric value.
23 cvtver () {
24   awk 'NR==1 {split($NF,A,".");X=1000000*A[1]+1000*A[2]+A[3];print X;exit 0}'
25 }
26
27 # Prints usage information.
28 usage()
29 {
30     cat <<EOF
31 Usage: $(basename $0) [OPTIONS]
32 Get the online version of the GnuPG software version database
33 Options:
34     --skip-download  Assume download has already been done.
35     --find-sha1sum   Print the name of the sha1sum utility
36     --help           Print this help.
37 EOF
38     exit $1
39 }
40
41 #
42 # Parse options
43 #
44 skip_download=no
45 find_sha1sum=no
46 while test $# -gt 0; do
47     case "$1" in
48         # Set up `optarg'.
49         --*=*)
50             optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
51             ;;
52         *)
53             optarg=""
54             ;;
55     esac
56
57     case $1 in
58         --help|-h)
59             usage 0
60             ;;
61         --skip-download)
62             skip_download=yes
63             ;;
64         --find-sha1sum)
65             find_sha1sum=yes
66             ;;
67         *)
68             usage 1 1>&2
69             ;;
70     esac
71     shift
72 done
73
74 # Mac OSX has only a shasum and not sha1sum
75 if [ ${find_sha1sum} = yes ]; then
76     for i in sha1sum shasum ; do
77        tmp=$($i </dev/null 2>/dev/null | cut -d ' ' -f1)
78        if [ x"$tmp" = x"da39a3ee5e6b4b0d3255bfef95601890afd80709" ]; then
79            echo "$i"
80            exit 0
81        fi
82     done
83     echo "false"
84     exit 1
85 fi
86
87 # Get GnuPG version from VERSION file.  For a GIT checkout this means
88 # that ./autogen.sh must have been run first.  For a regular tarball
89 # VERSION is always available.
90 if [ ! -f "$srcdir/../VERSION" ]; then
91     echo "VERSION file missing - run autogen.sh first." >&2
92     exit 1
93 fi
94 version=$(cat "$srcdir/../VERSION")
95 version_num=$(echo "$version" | cvtver)
96
97 if ! $GPGV --version >/dev/null 2>/dev/null ; then
98   echo "command \"gpgv\" is not installed" >&2
99   echo "(please install an older version of GnuPG)" >&2
100   exit 1
101 fi
102
103 #
104 # Download the list and verify.
105 #
106 if [ $skip_download = yes ]; then
107   if [ ! -f swdb.lst ]; then
108       echo "swdb.lst is missing." >&2
109       exit 1
110   fi
111   if [ ! -f swdb.lst.sig ]; then
112       echo "swdb.lst.sig is missing." >&2
113       exit 1
114   fi
115 else
116   if ! $WGET --version >/dev/null 2>/dev/null ; then
117       echo "command \"wget\" is not installed" >&2
118       exit 1
119   fi
120
121   if ! $WGET -q -O swdb.lst "$urlbase/swdb.lst" ; then
122       echo "download of swdb.lst failed." >&2
123       exit 1
124   fi
125   if ! $WGET -q -O swdb.lst.sig "$urlbase/swdb.lst.sig" ; then
126       echo "download of swdb.lst.sig failed." >&2
127       exit 1
128   fi
129 fi
130 if ! $GPGV --keyring "$distsigkey" swdb.lst.sig swdb.lst; then
131     echo "list of software versions is not valid!" >&2
132     exit 1
133 fi
134
135 #
136 # Check that the online version of GnuPG is not less than this version
137 # to help detect rollback attacks.
138 #
139 gnupg_ver=$(awk '$1=="gnupg21_ver" {print $2;exit}' swdb.lst)
140 if [ -z "$gnupg_ver" ]; then
141     echo "GnuPG 2.1 version missing in swdb.lst!" >&2
142     exit 1
143 fi
144 gnupg_ver_num=$(echo "$gnupg_ver" | cvtver)
145 if [ $(( $gnupg_ver_num >= $version_num )) = 0 ]; then
146     echo "GnuPG version in swdb.lst is less than this version!" >&2
147     echo "  This version: $version" >&2
148     echo "  SWDB version: $gnupg_ver" >&2
149     exit 1
150 fi