| #!/usr/bin/env python |
| |
| # Less terrible, ugly hack of a script than getsigs.pl, but similar. Used to |
| # verify the signatures on the release tarballs and produce the list of who |
| # signed them in the format we use for the announcements. |
| # |
| # To use just run it in the directory with the signatures and tarballs and |
| # pass the version of subversion you want to check. It assumes gpg is on |
| # your path, if it isn't you should fix that. :D |
| # |
| # Script will die if any gpg process returns an error. |
| # |
| # Because I hate perl... |
| |
| import glob, subprocess, shutil, sys, re |
| |
| key_start = '-----BEGIN PGP SIGNATURE-----\n' |
| sig_pattern = re.compile(r'^gpg: Signature made .*? using \w+ key ID (\w+)') |
| fp_pattern = re.compile(r'^pub\s+(\w+\/\w+)[^\n]*\n\s+Key\sfingerprint\s=((\s+[0-9A-F]{4}){10})\nuid\s+([^<\(]+)\s') |
| |
| |
| def grab_sig_ids(): |
| good_sigs = {} |
| |
| for filename in glob.glob('subversion-*.asc'): |
| shutil.copyfile(filename, '%s.bak' % filename) |
| text = open(filename).read() |
| keys = text.split(key_start) |
| |
| for key in keys[1:]: |
| open(filename, 'w').write(key_start + key) |
| gpg = subprocess.Popen(['gpg', '--logger-fd', '1', |
| '--verify', filename], |
| stdout=subprocess.PIPE, |
| stderr=subprocess.STDOUT) |
| |
| rc = gpg.wait() |
| output = gpg.stdout.read() |
| if rc: |
| # gpg choked, die with an error |
| print(output) |
| sys.stderr.write("BAD SIGNATURE in %s\n" % filename) |
| shutil.move('%s.bak' % filename, filename) |
| sys.exit(1) |
| |
| for line in output.split('\n'): |
| match = sig_pattern.match(line) |
| if match: |
| key_id = match.groups()[0] |
| good_sigs[key_id] = True |
| |
| shutil.move('%s.bak' % filename, filename) |
| |
| return good_sigs |
| |
| |
| def generate_output(good_sigs): |
| for id in good_sigs.keys(): |
| gpg = subprocess.Popen(['gpg', '--fingerprint', id], |
| stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
| rc = gpg.wait() |
| gpg_output = gpg.stdout.read() |
| if rc: |
| print(gpg_output) |
| sys.stderr.write("UNABLE TO GET FINGERPRINT FOR %s" % id) |
| sys.exit(1) |
| |
| fp = fp_pattern.match(gpg_output).groups() |
| print(" %s [%s] with fingerprint:" % (fp[3], fp[0])) |
| print(" %s" % fp[1]) |
| |
| |
| if __name__ == '__main__': |
| if len(sys.argv) < 2: |
| print("Give me a version number!") |
| sys.exit(1) |
| |
| generate_output(grab_sig_ids()) |