aboutsummaryrefslogtreecommitdiff
path: root/lib/GPGSigVerifier.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/GPGSigVerifier.py')
-rw-r--r--lib/GPGSigVerifier.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/GPGSigVerifier.py b/lib/GPGSigVerifier.py
new file mode 100644
index 0000000..78aeebb
--- /dev/null
+++ b/lib/GPGSigVerifier.py
@@ -0,0 +1,78 @@
+# GPGSigVerifier -*- mode: python; coding: utf-8 -*-
+
+# A class for verifying signed files
+
+# Copyright © 2002 Colin Walters <walters@gnu.org>
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+import os, re, sys, string, stat
+from minidinstall import misc
+
+class GPGSigVerifierException(Exception):
+ def __init__(self, value):
+ self._value = value
+ def __str__(self):
+ return `self._value`
+
+class GPGSigVerificationFailure(Exception):
+ def __init__(self, value, output):
+ self._value = value
+ self._output = output
+ def __str__(self):
+ return `self._value`
+
+ def getOutput(self):
+ return self._output
+
+class GPGSigVerifier:
+ def __init__(self, keyrings, gpgv=None):
+ self._keyrings = keyrings
+ if gpgv is None:
+ gpgv = '/usr/bin/gpgv'
+ if not os.access(gpgv, os.X_OK):
+ raise GPGSigVerifierException("Couldn't execute \"%s\"" % (gpgv,))
+ self._gpgv = gpgv
+
+ def verify(self, filename, sigfilename=None):
+ (stdin, stdout) = os.pipe()
+ pid = os.fork()
+ if pid == 0:
+ os.close(stdin)
+ misc.dup2(stdout, 1)
+ misc.dup2(stdout, 2)
+ args = []
+ for keyring in self._keyrings:
+ args.append('--keyring')
+ args.append(keyring)
+ if sigfilename:
+ args.append(sigfilename)
+ args = [self._gpgv] + args + [filename]
+ os.execv(self._gpgv, args)
+ os.exit(1)
+ os.close(stdout)
+ output = os.fdopen(stdin).readlines()
+ (pid, status) = os.waitpid(pid, 0)
+ if not (status is None or (os.WIFEXITED(status) and os.WEXITSTATUS(status) == 0)):
+ if os.WIFEXITED(status):
+ msg = "gpgv exited with error code %d" % (os.WEXITSTATUS(status),)
+ elif os.WIFSTOPPED(status):
+ msg = "gpgv stopped unexpectedly with signal %d" % (os.WSTOPSIG(status),)
+ elif os.WIFSIGNALED(status):
+ msg = "gpgv died with signal %d" % (os.WTERMSIG(status),)
+ raise GPGSigVerificationFailure(msg, output)
+ return output
+
+# vim:ts=4:sw=4:et: