# -*- coding: utf-8 -*-
#
# Copyright (C) 2012-2013 Antoine Beaupré <anarcat@orangeseeds.org>
#
# This program 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 3 of the License, or
# 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, see <http://www.gnu.org/licenses/>.
import errno
import locale
import sys
import os
import getpass
from monkeysign.ui import MonkeysignUi
import monkeysign.translation
[docs]class MonkeysignCli(MonkeysignUi):
"""sign a key in a safe fashion.
This command signs a key based on the fingerprint or user id
specified on the commandline, encrypt the result and mail it to the
user. This leave the choice of publishing the certification to that
person and makes sure that person owns the identity signed.
This program assumes you have gpg-agent configured to prompt for
passwords."""
[docs] def main(self):
"""main code execution loop
we expect to have the commandline parsed for us
"""
MonkeysignUi.main(self)
if not 'GPG_TTY' in os.environ:
try:
os.environ['GPG_TTY'] = os.ttyname(sys.stdin.fileno())
except OSError as e:
if e.errno == errno.ENOTTY:
self.warn(_('cannot find your TTY, GPG may freak out if you do not set the GPG_TTY environment'))
else:
raise
else:
self.log(_('reset GPG_TTY to %s') % os.environ['GPG_TTY'])
# 1. fetch the key into a temporary keyring
self.find_key()
# 2. copy the signing key secrets into the keyring
self.copy_secrets()
self.warn(_('Preparing to sign with this key\n\n%s') % self.signing_key)
# 3. for every user id (or all, if -a is specified)
# 3.1. sign the uid, using gpg-agent
self.sign_key()
# 3.2. export and encrypt the signature
# 3.3. mail the key to the user
# 3.4. optionnally (-l), create a local signature and import in
#local keyring
self.export_key()
# 4. trash the temporary keyring
# implicit
[docs] def yes_no(self, prompt, default = None):
ans = raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
while default is None and ans.lower() not in ["y", "n"]:
ans = raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
if default: return default
else: return ans.lower() == 'y'
[docs] def acknowledge(self, prompt):
prompt = _('press enter when %s') % prompt
raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
[docs] def prompt_line(self, prompt):
return raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
[docs] def prompt_pass(self, prompt):
return getpass.getpass(prompt)
[docs] def choose_uid(self, prompt, key):
"""present the user with a list of UIDs and let him choose one"""
try:
allowed_uids = []
for uid in key.uidslist:
allowed_uids.append(uid.uid)
prompt += _(' (1-%d or full UID, control-c to abort): ') % len(allowed_uids)
# workaround http://bugs.python.org/issue7768
pattern = raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
while not (pattern in allowed_uids or (pattern.isdigit() and int(pattern)-1 in range(0,len(allowed_uids)))):
print _('invalid uid')
pattern = raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
if pattern.isdigit():
pattern = allowed_uids[int(pattern)-1]
return pattern
except KeyboardInterrupt:
return False