14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
"""GPG signing and checking logic."""
23
from bzrlib.lazy_import import lazy_import
24
lazy_import(globals(), """
24
import bzrlib.errors as errors
36
27
class DisabledGPGStrategy(object):
50
41
"""Real strategies take a configuration."""
52
43
def sign(self, content):
53
return ("-----BEGIN PSEUDO-SIGNED CONTENT-----\n" + content +
54
"-----END PSEUDO-SIGNED CONTENT-----\n")
58
tty = os.environ.get('TTY')
60
os.environ['GPG_TTY'] = tty
61
trace.mutter('setting GPG_TTY=%s', tty)
63
# This is not quite worthy of a warning, because some people
64
# don't need GPG_TTY to be set. But it is worthy of a big mark
65
# in ~/.bzr.log, so that people can debug it if it happens to them
66
trace.mutter('** Env var TTY empty, cannot set GPG_TTY.'
70
47
class GPGStrategy(object):
71
48
"""GPG Signing and checking facilities."""
73
50
def _command_line(self):
74
return [self._config.gpg_signing_command(), '--clearsign']
51
return [self._config.gpg_signing_command(),
52
'--output', '-', '--clearsign']
76
54
def __init__(self, config):
77
55
self._config = config
79
57
def sign(self, content):
80
if isinstance(content, unicode):
81
raise errors.BzrBadParameterUnicode('content')
82
ui.ui_factory.clear_term()
84
preexec_fn = _set_gpg_tty
85
if sys.platform == 'win32':
86
# Win32 doesn't support preexec_fn, but wouldn't support TTY anyway.
58
f = tempfile.NamedTemporaryFile()
59
cmd = self._command_line() + [f.name]
89
process = subprocess.Popen(self._command_line(),
90
stdin=subprocess.PIPE,
91
stdout=subprocess.PIPE,
92
preexec_fn=preexec_fn)
63
process = subprocess.Popen(cmd,
64
stdout=subprocess.PIPE)
94
result = process.communicate(content)[0]
66
result = process.communicate()[0]
95
67
if process.returncode is None:
97
69
if process.returncode != 0:
98
raise errors.SigningFailed(self._command_line())
70
raise errors.SigningFailed(cmd)
100
72
except OSError, e:
101
73
if e.errno == errno.EPIPE:
102
raise errors.SigningFailed(self._command_line())
74
raise errors.SigningFailed(cmd)
105
77
except ValueError: