[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#771033: unblock: monkeysign/2.0.2 (pre-approval)



Control: tag -1 -moreinfo
On 2014-11-26 17:32:33, Jonathan Wiltshire wrote:
[...]
> They're all ok. You'll upset your translators though... please get as many
> translations into your upload as possible, but don't leave it past 3rd
> December. You can have a waiver for further translations after that.
>
> Please remove the moreinfo tag when it's in sid.

Unfortunately, there is little translation available on the project at
this point and little workforce to update it, so I went ahead and
uploaded a 2.0.2 release with the documented changes (plus another to
fix another RC bug, #77090.

An annoying part of the diff is a change in a OpenPGP ascii-armored key
file that I had to perform in order to fix the test suite, which was
making the package FTBS since well... today. :/ Sorry about that, but it
seems necessary.

The final debdiff is attached.

 debian/changelog       |   27 ++
 monkeysign/__init__.py |    2
 monkeysign/cli.py      |   12
 monkeysign/gpg.py      |   65 +++-
 monkeysign/gtkui.py    |   28 +-
 monkeysign/ui.py       |    3
 tests/6D866396.asc     |  661 +++++++++++++++++++++++++------------------------
 tests/test_gpg.py      |    5
 8 files changed, 447 insertions(+), 356 deletions(-)

diff -Nru monkeysign-2.0.1/debian/changelog monkeysign-2.0.2/debian/changelog
--- monkeysign-2.0.1/debian/changelog	2014-10-20 22:29:41.000000000 -0400
+++ monkeysign-2.0.2/debian/changelog	2014-12-01 22:02:20.000000000 -0500
@@ -1,3 +1,30 @@
+monkeysign (2.0.2) unstable; urgency=medium
+
+  * this patch releases fixes critical issues...
+  * reported in the Debian BTS:
+    * encode prompt properly before prompting (closes: #771032)
+    * try to handle error when import actually works in GTK UI
+      (closes: #770900)
+    * improve debugging by wrapping all writes to gnupg in debug
+    * use the proper index when selecting key to sign
+      (closes: #771034)
+  * reported on the Monkeysphere mailing list:
+    * hotfix: properly verify the image signature file
+    * hotfix: disable scrolling in qrcode window
+    * don't try to remove non-existent video device, and clarify error
+      message
+    * output --version to stdout and don't make it an error
+  * those fix FTBS issues:
+    * fix tests after cd4e18c: guess encoding properly
+    * update zack's key so tests succeed again
+
+  * and this makes sure this package will be easier to support for the
+    lifetime of jessie
+    * improve error handling again: distinguish different failure cases
+      and clearly transmit GPG errors
+
+ -- Antoine Beaupré <anarcat@debian.org>  Mon, 01 Dec 2014 21:03:56 -0500
+
 monkeysign (2.0.1) unstable; urgency=medium
 
   * hot patch release while we still can before jessie:
diff -Nru monkeysign-2.0.1/monkeysign/cli.py monkeysign-2.0.2/monkeysign/cli.py
--- monkeysign-2.0.1/monkeysign/cli.py	2014-10-20 22:29:41.000000000 -0400
+++ monkeysign-2.0.2/monkeysign/cli.py	2014-12-01 22:02:20.000000000 -0500
@@ -15,6 +15,7 @@
 #    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 locale
 import sys
 import os
 import getpass
@@ -78,14 +79,14 @@
         # implicit
 
     def yes_no(self, prompt, default = None):
-        ans = raw_input(prompt.encode('utf-8'))
+        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)
+            ans = raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
         if default: return default
         else: return ans.lower() == 'y'
 
     def prompt_line(self, prompt):
-        return raw_input(prompt.encode('utf-8'))
+        return raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
 
     def prompt_pass(self, prompt):
         return getpass.getpass(prompt)
@@ -99,10 +100,11 @@
 
             prompt += _(' (1-%d or full UID, control-c to abort): ') % len(allowed_uids)
 
-            pattern = raw_input(prompt)
+            # 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)
+                pattern = raw_input(prompt.encode(sys.stdout.encoding or locale.getpreferredencoding(True)))
             if pattern.isdigit():
                 pattern = allowed_uids[int(pattern)-1]
             return pattern
diff -Nru monkeysign-2.0.1/monkeysign/gpg.py monkeysign-2.0.2/monkeysign/gpg.py
--- monkeysign-2.0.1/monkeysign/gpg.py	2014-10-20 22:29:41.000000000 -0400
+++ monkeysign-2.0.2/monkeysign/gpg.py	2014-12-01 22:02:20.000000000 -0500
@@ -242,6 +242,16 @@
         """
         return self.expect_pattern(fd, '^\[GNUPG:\] ' + pattern)
 
+    def write(self, fd, message):
+        """write the specified message to gnupg, usually on stdout
+
+        but really, the pipes are often setup outside of here so the
+        fd is hardcoded here
+        """
+        if self.debug:
+            print >>self.debug, "WROTE:", message
+        print >>fd, message
+    
     def version(self):
         """return the version of the GPG binary"""
         self.call_command(['version'])
@@ -320,8 +330,8 @@
         self.context.call_command(command)
         return self.context.stdout
 
-    def verify_file(self, filename, sigfile):
-        self.context.call_command(['verify', filename, sigfile])
+    def verify_file(self, sigfile, filename):
+        self.context.call_command(['verify', sigfile, filename])
         fd = StringIO(self.context.stderr)
         try:
             self.context.seek(fd, 'VALIDSIG')
@@ -416,20 +426,19 @@
         while True:
             m = self.context.seek_pattern(proc.stdout, '^uid:.::::::::([^:]*):::[^:]*:(\d+),[^:]*:')
             if m and m.group(1) == pattern:
-                # XXX: we don't have the +1 that sign_key has, why?
                 index = int(m.group(2))
                 break
-        print >>proc.stdin, str(index)
+        self.context.write(proc.stdin, str(index))
         self.context.expect(proc.stderr, 'GOT_IT')
         self.context.expect(proc.stderr, 'GET_LINE keyedit.prompt')
         # end of copy-paste from sign_key()
-        print >>proc.stdin, 'deluid'
+        self.context.write(proc.stdin, 'deluid')
         self.context.expect(proc.stderr, 'GOT_IT')
         self.context.expect(proc.stderr, 'GET_BOOL keyedit.remove.uid.okay')
-        print >>proc.stdin, 'y'
+        self.context.write(proc.stdin, 'y')
         self.context.expect(proc.stderr, 'GOT_IT')
         self.context.expect(proc.stderr, 'GET_LINE keyedit.prompt')
-        print >>proc.stdin, 'save'
+        self.context.write(proc.stdin, 'save')
         self.context.expect(proc.stderr, 'GOT_IT')
         return proc.wait() == 0
 
@@ -468,12 +477,12 @@
                 try:
                     multiuid = self.context.seek(proc.stderr, 'GET_BOOL keyedit.sign_all.okay')
                 except GpgProtocolError as e:
-                    raise GpgRuntimeError(self.context.returncode, _('cannot sign: %s') % re.sub(r'^.*found "(.*)', r'\1', str(e)).decode('utf-8'))
+                    raise GpgRuntimeError(self.context.returncode, _('cannot select uid for signing: %s') % e.found().decode('utf-8'))
             else:
-                raise GpgRuntimeError(self.context.returncode, _('cannot sign: %s') % re.sub(r'^.*found "(.*)', r'\1', str(e)).decode('utf-8'))
+                raise GpgRuntimeError(self.context.returncode, _('cannot select uid for signing: %s') % e.found().decode('utf-8'))
         if multiuid:
             if signall: # special case, sign all keys
-                print >>proc.stdin, "y"
+                self.context.write(proc.stdin, "y")
                 self.context.expect(proc.stderr, 'GOT_IT')
                 # confirm signature
                 try:
@@ -483,8 +492,8 @@
                         raise GpgRuntimeError(self.context.returncode, _('you already signed that key'))
                     else:
                         # propagate gpg error message up
-                        raise GpgRuntimeError(self.context.returncode, _('unable to open key for editing: %s') % re.sub(r'^expected.*, found "(.*)$"', r'\1', str(e)).decode('utf-8'))
-                print >>proc.stdin, 'y'
+                        raise GpgRuntimeError(self.context.returncode, _('unable to confirm key signing: %s') % e.found().decode('utf-8'))
+                self.context.write(proc.stdin, 'y')
                 self.context.expect(proc.stderr, 'GOT_IT')
                 # expect the passphrase confirmation
                 # we seek because i have seen a USERID_HINT <keyid> <uid> in some cases
@@ -495,7 +504,7 @@
                 return proc.wait() == 0
 
             # don't sign all uids
-            print >>proc.stdin, "n"
+            self.context.write(proc.stdin, "n")
             self.context.expect(proc.stderr, 'GOT_IT')
             # select the uid
             self.context.expect(proc.stderr, 'GET_LINE keyedit.prompt')
@@ -503,23 +512,23 @@
                 # XXX: this will hang if the pattern requested is not found, we need a better way!
                 m = self.context.seek_pattern(proc.stdout, '^uid:.::::::::([^:]*):::[^:]*:(\d+),[^:]*:')
                 if m and m.group(1) == pattern:
-                    index = int(m.group(2)) + 1
+                    index = int(m.group(2))
                     break
-            print >>proc.stdin, str(index)
+            self.context.write(proc.stdin, str(index))
             self.context.expect(proc.stderr, 'GOT_IT')
             # sign the selected uid
             self.context.seek(proc.stderr, 'GET_LINE keyedit.prompt')
-            print >>proc.stdin, "sign"
+            self.context.write(proc.stdin, "sign")
             self.context.expect(proc.stderr, 'GOT_IT')
             # confirm signature
             try:
                 self.context.expect(proc.stderr, 'GET_BOOL sign_uid.okay')
             except GpgProtocolError as e:
                 # propagate gpg error message up
-                raise GpgRuntimeError(self.context.returncode, _('unable to open key for editing: %s') % re.sub(r'^expected.*, found "(.*)$"', r'\1', str(e)).decode('utf-8'))
+                raise GpgRuntimeError(self.context.returncode, _('unable to confirm signing one key: %s') % e.found().decode('utf-8'))
 
         # we fallthrough here if there's only one key to sign
-        print >>proc.stdin, 'y'
+        self.context.write(proc.stdin, 'y')
 
         try:
             self.context.expect(proc.stderr, 'GOT_IT')
@@ -529,7 +538,7 @@
             if 'EXPIRED' in str(e):
                 raise GpgRuntimeError(self.context.returncode, _('key is expired, cannot sign'))
             else:
-                raise GpgRuntimeError(self.context.returncode, _('cannot sign, unknown error from gpg: %s') % str(e) + proc.stderr.read())
+                raise GpgRuntimeError(self.context.returncode, _('unable to signing a single key: %s') % e.found().decode('utf-8') + proc.stderr.read())
         # expect the passphrase confirmation
         try:
             self.context.seek(proc.stderr, 'GOOD_PASSPHRASE')
@@ -538,7 +547,7 @@
         if multiuid:
             # we save the resulting key in uid selection mode
             self.context.expect(proc.stderr, 'GET_LINE keyedit.prompt')
-            print >>proc.stdin, "save"
+            self.context.write(proc.stdin, "save")
             self.context.expect(proc.stderr, 'GOT_IT')
         return proc.wait() == 0
 
@@ -764,7 +773,21 @@
     module should instead raise a GpgRutimeError with a user-readable
     error message (e.g. "key not found").
     """
-    pass
+
+    def match(self):
+        return re.search(r'(?:\[Errno [0-9]*\] )?expected "([^"]*)", found "(.*)\n*"', str(self))
+
+    def found(self):
+        if self.match():
+            return self.match().group(2)
+        else:
+            return '<no error found in GPG output>'
+
+    def expected(self):
+        if self.match():
+            return self.match().group(1)
+        else:
+            return '<not waiting for pattern>'
 
 class GpgRuntimeError(IOError):
     pass
diff -Nru monkeysign-2.0.1/monkeysign/gtkui.py monkeysign-2.0.2/monkeysign/gtkui.py
--- monkeysign-2.0.1/monkeysign/gtkui.py	2014-10-20 22:29:41.000000000 -0400
+++ monkeysign-2.0.2/monkeysign/gtkui.py	2014-12-01 22:02:20.000000000 -0500
@@ -264,7 +264,7 @@
                 self.clip = gtk.Clipboard() # Clipboard
                 self.qrcodewidget = gtk.VBox()
                 swin = gtk.ScrolledWindow()
-                swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+                swin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
                 swin.add_with_viewport(self.qrcode)
                 label = gtk.Label(_('This is a QR-code version of your OpenPGP fingerprint. Scan this with another Monkeysign to transfer your fingerprint.'))
                 label.set_line_wrap(True)
@@ -394,13 +394,17 @@
                 # extract results
                 found = False
                 for symbol in rawimage:
-                        self.zbarframe.remove(self.zbar)
+                        try:
+                                self.zbarframe.remove(self.zbar)
+                        except AttributeError:
+                                # no video display, ignore
+                                pass
                         self.zbarframe.add(self.capture)
                         self.zbarframe.set_shadow_type(gtk.SHADOW_ETCHED_IN)
                         self.process_scan(symbol.data)
                         found = True
                 if not found:
-                        self.msui.warn(_('data found in image!'))
+                        self.msui.warn(_('no data found in image!'))
 
         
         def save_qrcode(self, widget=None):
@@ -474,7 +478,14 @@
                 """callback invoked when gpg key download is finished
                 """
                 self.keep_pulsing=False
-                self.dialog.destroy()
+                try:
+                        self.dialog.destroy()
+                except AttributeError:
+                        # XXX: this should be handled better, bugfix for:
+                        # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=770900
+                        # this is actually because the key was
+                        # imported without having to create a dialog
+                        pass
                 self.msui.log(_('fetching finished'))
                 if condition == 0:
                         # 2. copy the signing key secrets into the keyring
@@ -534,9 +545,12 @@
                         self.msui.log(_('looking for key %s in your keyring') % self.msui.pattern)
                         self.msui.keyring.context.set_option('export-options', 'export-minimal')
                         if self.msui.tmpkeyring.import_data(self.msui.keyring.export_data(self.msui.pattern)):
-                                # XXXX: this actually hangs when signing the key, maybe because we're not in a callback?
-                                # it's the prompting that hangs, see msui.ask...
-                                self.watch_out_callback(0, 0) # XXX: hack, the callback should call a cleaner function
+                                # for some reason, we were holding on to a lock already, release it
+                                gtk.gdk.threads_leave()
+                                self.msui.copy_secrets()
+                                self.msui.sign_key()
+                                self.msui.export_key()
+                                self.resume_capture()
                                 return # XXX: also ugly, reindent everything instead
 
                         # 1.b) if allowed (@todo), from the keyservers
diff -Nru monkeysign-2.0.1/monkeysign/__init__.py monkeysign-2.0.2/monkeysign/__init__.py
--- monkeysign-2.0.1/monkeysign/__init__.py	2014-10-20 22:29:41.000000000 -0400
+++ monkeysign-2.0.2/monkeysign/__init__.py	2014-12-01 22:02:20.000000000 -0500
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-__version_info__ = ('2', '0', '0')
+__version_info__ = ('2', '0', '2')
 __version__ = '.'.join(__version_info__)
 __copyright__ = """Copyright (C) 2010-2013  Antoine Beaupré, Jerome Charaoui
 This program comes with ABSOLUTELY NO WARRANTY.
diff -Nru monkeysign-2.0.1/monkeysign/ui.py monkeysign-2.0.2/monkeysign/ui.py
--- monkeysign-2.0.1/monkeysign/ui.py	2014-10-20 22:29:41.000000000 -0400
+++ monkeysign-2.0.2/monkeysign/ui.py	2014-12-01 22:02:20.000000000 -0500
@@ -156,7 +156,8 @@
         self.tmpkeyring = TempKeyring()
 
         if self.options.version:
-            self.abort(monkeysign.__version__)
+            print(monkeysign.__version__)
+            sys.exit()
         if self.options.debug:
             self.tmpkeyring.context.debug = self.logfile
             self.keyring.context.debug = self.logfile
diff -Nru monkeysign-2.0.1/tests/6D866396.asc monkeysign-2.0.2/tests/6D866396.asc
--- monkeysign-2.0.1/tests/6D866396.asc	2014-10-20 22:29:41.000000000 -0400
+++ monkeysign-2.0.2/tests/6D866396.asc	2014-12-01 22:02:20.000000000 -0500
@@ -12,323 +12,346 @@
 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
-tCRTdGVmYW5vIFphY2NoaXJvbGkgPHphY2tAZGViaWFuLm9yZz6JAjcEEwEIACEC
-GwMCHgECF4AFAkykziEFCwkIBwMFFQoJCAsFFgIDAQAACgkQnDFQPG2GY5b1tA//
-ZRHiukN5vfizF3HLLlO+3hIWtAh++jmXxcZo8tpjbVIfUFXoo7QHwpNYTNDrRtjf
-xD5HkHLrykqMUq5odNZ5KTLDzX/UeGoGd0ZL2iP0b/tyS50PlJm5NBVy3iiHMqxa
-xokpMOJLvfe55mAFZvcH3uVnFsQorqj+0WYt8Dbg5Fg9pj2GfD6JYDwHMJBNTEqz
-PeOyeZzk/BQF7/hfAV3iXsvNLdq90Uwvrxnd7QQNgjeQWHm8quaQf1Lh9e/9tC7+
-4yN4HRi7xvq93cZ/oTA+AbsacZ/5zfCfMYAEF9PiRsit69iieyvodhaWk2KvBumC
-Qzkc+qdBW5q9BFoX1nE4SEUOY2C+JatR/J0UZvRvksPXRfqJG3L4MGMxQFivLYny
-/8i0v0as0CAPDPAZYH7p2xnX8EESqT+uNJvtq9GQZY7f+JN+ALV7dvbm69Is5lfb
-iQE3JSkqA95lOSW4rDKbj7bXcsgvcDCXkJD3d2+xl0d8QYd8B31baLsodeZwi/Cr
-YNQg8DEpcI2nayFEvxW8mY4Cc1TYIPk5uOoYoc2AtCL2rREtnCO5pQo4n337wr2B
-YNxQwJTBRkmE9eHxVrRtQJ30+Nu/DmE8SiNT9UF6Y+ZqngZ71lm3kfs+7KRCRw/S
-upJxFF1BMky3qeV70berhLdcJMtr2rFpShKE+ldNn6u0JFN0ZWZhbm8gWmFjY2hp
-cm9saSA8emFja0B1cHNpbG9uLmNjPokCOgQTAQgAJAIbAwIeAQIXgAIZAQUCTKTO
-HQULCQgHAwUVCgkICwUWAgMBAAAKCRCcMVA8bYZjlhvTD/49jFSLAdmowZgye9GB
-vLHpz2aeOMV+tvlKy71pu+7S9ftJuohC+GSrWVJfa5M5EDtp/jntpLe6USFYoOCX
-p4yuv+bgcvvMIss9lmKYuI11Oxwfqz5hvhEtEhyGqNQ6DAo+c4lzDNyKGrWOG/fU
-t2sdkJmzrgTrbTVUNA8fXkHsM0AsdTz4a1pGr2YR5V98ASxaSBwljRn7tEcKKeTj
-GcJh+D9gM4v6btt/5w0OapuwumOAXeJqKRK/2n7uzgTxIpOUb0FZZVQX/Ulksp4g
-mZf2GHaHCfGh5hf5loWPohQIXWNWBV8Yk7Z6zCfBsovhmxpUj0Vtt6UUW8GCYPAo
-7ZMFLWCX2vV0xOqtzCBxMC+Y5yjLFHI+bLXkQQanMW5C5Uy6WfNeBpV+qk9C/BNY
-2JPNZ8G+E0UeQlEiTjK6gYL9FNUf0UoxsGw/EnQ9x9jlqXKipBPHAWUNLYx0YQW0
-v74VHDwFM2224J3gyGWjnO2+sgKY8jpXKZyLMg1XMaGIrmxIf/wdmtbn2eYfaFiV
-GGQJG6Fa1TgWF8vmBG+wWw4gJ/tJbVphQcvNrv22+V6wntz1qoIguzNkai5tv0J5
-kC+DMLCMjoN2VX1qVNalNfBBJSqEt1xcB0DM3Jylyk1yLqkayu12aXV2zDW17m7k
-PTlZiQJ4inu9YGVXh5+c252Vo7QlU3RlZmFubyBaYWNjaGlyb2xpIDx6YWNrQGNz
-LnVuaWJvLml0PokCNwQTAQgAIQIbAwIeAQIXgAUCTKTOIAULCQgHAwUVCgkICwUW
-AgMBAAAKCRCcMVA8bYZjloNoD/wNZAAsIU0vI+8240bIFzt4gOh5uYNrTdMWTIo4
-1kDQmDU4xhTeyeabPR6+c+Fe/vzYVIsI5S1RVWPrOmi1JZ0GRNqmZpw4PTNRTACY
-1/DDLEr14F+JU82eur5MyyrMCLI5hkZMJyJKBS77dbwhtAlM3oKf6ezbIYfmYuuo
-Nuy9HO1Yavl9kEDDaRYus6VJFe9yo3pZ5mMGyaOdG1Sb5PAmhEeNfMofJd+AcGvr
-spq20fkw52V0zQLKCR7acx43fxJ4wLYe5fd4WsdyHCiubWEApRbAjeCaBLbEWkqC
-I8gFSGioIJofTGFxTNZgxPCh0vIaRndBnpn8NEBMdTQ/O49TtRmMCoc2GUccR2oC
-NOWdv6lCXlzEZBW8fL/PyAdABTXiSJyzRKDUna9AurEi2aTmJEqnF+IHapwObT6n
-0j1eebAS7AmwLjMOdGlKiY8MSErzOLxYkdrZBQcERwaChA9W1ru+tH/nuh65LNCs
-3M4hW0BFhDp16uYQLgYpQ8GRpkssDM2dju0TF19okvazAHcLAN25u9dY3W0MMB6y
-+BKk1CxQjgTznaYRBEy7ZqYei5LPWAC0eOiGAZgteGs6Gcc2gAf7Rzm3RYQEiJkK
-w7WrFR8yO1Qkx4kZjpUu7no2XUGR1I0kAtjoz0gCjmIk1hQFAQZ889fxTY4ke0P/
-kmBM77QoU3RlZmFubyBaYWNjaGlyb2xpIDx6YWNrQHBwcy5qdXNzaWV1LmZyPokC
-HwQwAQgACQUCUgyvZwIdIAAKCRCcMVA8bYZjlpLyD/wKYIIRP/iir7xvHC/bJnBa
-s4ym+1qA1gu+zFtBK79ZGAZgh3cMDJGvLuT3TYwOv8AsYj30eGCglYGRqMquq2fj
-6lXPg6ZqzWdhDmj3GrY1Qyi4jpvRGMAD8T5q2gjcSjvM824pUMACqeEKNXQ1M7rT
-B1hCo5qmnIVvLK4esReHBC+Z/RGWL1WSsGx4QCYiO2TwS40uq/9DwJbsKjPcuByw
-o2/ASQMm9n+f2jG9QH10eEL016VmCsXJVmopw14jRPUpW/BPEmjzYt+P3B/eR8FV
-3LutSqTTLxWxwY9P6KxNtR88l3oNzMqV/RKf48gfJ/D8KLqamuqSmOjvyou6cVOd
-yOOOWZr6B/oQZ6ztLw+3RHSejTrsw0wYTzeKZ/fyg7N0AIr7BzCMG5f1EQsdAC/3
-pHVoN44xIOU0pX3n4pzzIDMG/s4wVC1LXhZmHzwYWChJKRcfjClNsQk6co6JO70a
-TdnWlV6x+t29mToS1bC5ZoG+tT2zaPy2bQruOYDUJIkN3b/ovkAJDL+Gqd1e6pkY
-aym04b1ZCPatA8MVKVOWSBlyvUt9RzdBn8haVjFJTYTjXkb2gGsVUu+ejxoN+ACN
-of27f16el+iap2cqyGWoeeuErmKjcOfrp7f64GuAdxMYaaRTIBMaiXKOQHtwUkxr
-MjEnRnevLyoxeWNKz6AasrQzU3RlZmFubyBaYWNjaGlyb2xpIDx6YWNrQHBwcy51
-bml2LXBhcmlzLWRpZGVyb3QuZnI+iQI3BBMBCAAhBQJPJGgRAhsDBQsJCAcDBRUK
-CQgLBRYCAwEAAh4BAheAAAoJEJwxUDxthmOWouYP/2YOYAHQNUbgC1nZGk4xVw3H
-UI81rVwybkMPJu2RRAiY+mTtV3Ot8415vkIYUItJnpnais7irdEiIKlI/k45MbiM
-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
-pM4dBQsJCAcDBRUKCQgLBRYCAwEAAAoJEJwxUDxthmOWG9MP/j2MVIsB2ajBmDJ7
-0YG8senPZp44xX62+UrLvWm77tL1+0m6iEL4ZKtZUl9rkzkQO2n+Oe2kt7pRIVig
-4JenjK6/5uBy+8wiyz2WYpi4jXU7HB+rPmG+ES0SHIao1DoMCj5ziXMM3IoatY4b
-99S3ax2QmbOuBOttNVQ0Dx9eQewzQCx1PPhrWkavZhHlX3wBLFpIHCWNGfu0Rwop
-5OMZwmH4P2Azi/pu23/nDQ5qm7C6Y4Bd4mopEr/afu7OBPEik5RvQVllVBf9SWSy
-niCZl/YYdocJ8aHmF/mWhY+iFAhdY1YFXxiTtnrMJ8Gyi+GbGlSPRW23pRRbwYJg
-8CjtkwUtYJfa9XTE6q3MIHEwL5jnKMsUcj5steRBBqcxbkLlTLpZ814GlX6qT0L8
-E1jYk81nwb4TRR5CUSJOMrqBgv0U1R/RSjGwbD8SdD3H2OWpcqKkE8cBZQ0tjHRh
-BbS/vhUcPAUzbbbgneDIZaOc7b6yApjyOlcpnIsyDVcxoYiubEh//B2a1ufZ5h9o
-WJUYZAkboVrVOBYXy+YEb7BbDiAn+0ltWmFBy82u/bb5XrCe3PWqgiC7M2RqLm2/
-QnmQL4MwsIyOg3ZVfWpU1qU18EElKoS3XFwHQMzcnKXKTXIuqRrK7XZpdXbMNbXu
-buQ9OVmJAniKe71gZVeHn5zbnZWjiQLwBBIBCgDaBQJOMqxSwBIaaHR0cDovL21h
-cnRpbi1rcmFmZnQubmV0L2dwZy9jZXJ0LXBvbGljeS81NWM5ODgyZDk5OWJiY2M0
-LzIwMDkwNzEyMTgzMz9zaGE1MTJzdW09ZjMzYjE3YzlhZjUxNWJkOThiMjkyN2Ni
-NDUzYTk5MmQzZDc1MDBlOWY2NzE5NjY2MTZlOTA1MTBiOTk0MDg5NTEwOGQyNDE2
-NDhkMWEwZWI0NmIzMmJjYmYzMjUxYTEzNmE2ZWUxZTIyNzU3NDVlMTFiYjMyOGMx
-NGU3ZTcyNjMACgkQVcmILZmbvMQvNw/+N/XjgSmh72DKX1pyZJz/KXC+yODnqU82
-/1JbFjLX1NLXvB0L2DNoLCX+oYGoNN+QsyohG3jSSdt8zuZMtXNdY2XLnB/jFNpr
-Ba0XdP8bB4R7vPX1pbwYupjHJm8d/utnkfPid/qMlBlLMvmSJ0aw8D6V/Y1pL/qX
-ycEA8t7rxtOIDEX3vWreokxI+dfvjBw4lXnZJ1c3QvhbJHFGK2H9aGUZhdwe3hAx
-LXLk4lZFBDoSD64W8LPgC1MUTXMpetXDIP8syETIiNzuG5gxbbP3ks9Ab2JqLuEn
-Vk2ynV8KHEUm57W68uU56F6hTTR9gOWTpCTLq5buW7MGzmiRYK5XhpbD0dBHVl3D
-9gdru/6f6CkfL/phtzJ+m/1V6JS8BQgpye/xf6HtZC3wRCHGpIFl5AnNaCPAp09X
-EnWSl/Xjczqj2iqRwR0e2i6oShu74drJwNJJzq1oDvLTOccCQkOFP47SxUATomuu
-nbxPVbRdp/M1KVCOFXQDN4oVNaMmJSuzQpeQfWL9z0fDUuh0qhKw3M5YXYoLlcQ/
-pymwu7LRbjBJqhENlNzLcK2wBFvclI+q33fv92YWJi2CvDcLz/+3Um4AFwwfNWk3
-OS9AMhwpU4zZBptPANWFaclom6G+xn3zIqL/ie3FB38gMinAJYz5DhrKdC4tRlDm
-tk0EyHX/6DSJAvQEEAECAN4FAk1OgxCHFIAAAAAAEABuc2lnbm90ZXNAZ3JlcC5i
-ZSJodHRwOi8vd3d3LmdyZXAuYmUvZ3BnL0NGNjIzMThENUJCRUQ0OEYzM0FDRDU0
-MzFCMDAwNjI1NkZCMjkxNjQvNDkwMDcwN0REQzVDMDdGMkRFQ0IwMjgzOUMzMTUw
-M0M2RDg2NjM5Ni5hc2MiTxpodHRwOi8vd3d3LmdyZXAuYmUvZ3BnL0NGNjIzMThE
-NUJCRUQ0OEYzM0FDRDU0MzFCMDAwNjI1NkZCMjkxNjQvY2VydC1wb2xpY3ktdjIA
-CgkQGwAGJW+ykWSLsQ//QnVZYlPVIm4mj6iqY0q/31ftZNn0SSfSNIlo8TJ2vVHR
-4s7KZZTYFv40acC8YQekHExdC2H3f07YeywaoHUmkh0FfqaOjHYbAb041XEgsidZ
-WqYHik2WCZBL7buRDs55nWNjcDObEr/uK6+JP6sxyQlE85fa1k3ed6VKSQRI5GAp
-N2093/Zc9x/ocTA3VY3Mxi2ZhnCQ77k8g7S6Th79zGQ4eHac/qYLfEpC4KvcVNCb
-xJhzmayh+btNGbev3+boWQ+x7DrgFxCbNnMBtITsABSipyALCFj2Vkpubpeo4X6g
-vF5uSNnaUmkWgjXGdbb7jTLFiaerd9D6DK4cqJowLzhxT5RpDTs7/5vAQYF5qBIJ
-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
-BDs3K2rN6wTc5LG4iA==
-=VBui
+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
+PmG+ES0SHIao1DoMCj5ziXMM3IoatY4b99S3ax2QmbOuBOttNVQ0Dx9eQewzQCx1
+PPhrWkavZhHlX3wBLFpIHCWNGfu0Rwop5OMZwmH4P2Azi/pu23/nDQ5qm7C6Y4Bd
+4mopEr/afu7OBPEik5RvQVllVBf9SWSyniCZl/YYdocJ8aHmF/mWhY+iFAhdY1YF
+XxiTtnrMJ8Gyi+GbGlSPRW23pRRbwYJg8CjtkwUtYJfa9XTE6q3MIHEwL5jnKMsU
+cj5steRBBqcxbkLlTLpZ814GlX6qT0L8E1jYk81nwb4TRR5CUSJOMrqBgv0U1R/R
+SjGwbD8SdD3H2OWpcqKkE8cBZQ0tjHRhBbS/vhUcPAUzbbbgneDIZaOc7b6yApjy
+OlcpnIsyDVcxoYiubEh//B2a1ufZ5h9oWJUYZAkboVrVOBYXy+YEb7BbDiAn+0lt
+WmFBy82u/bb5XrCe3PWqgiC7M2RqLm2/QnmQL4MwsIyOg3ZVfWpU1qU18EElKoS3
+XFwHQMzcnKXKTXIuqRrK7XZpdXbMNbXubuQ9OVmJAniKe71gZVeHn5zbnZWjiQLw
+BBIBCgDaBQJOMqxSwBIaaHR0cDovL21hcnRpbi1rcmFmZnQubmV0L2dwZy9jZXJ0
+LXBvbGljeS81NWM5ODgyZDk5OWJiY2M0LzIwMDkwNzEyMTgzMz9zaGE1MTJzdW09
+ZjMzYjE3YzlhZjUxNWJkOThiMjkyN2NiNDUzYTk5MmQzZDc1MDBlOWY2NzE5NjY2
+MTZlOTA1MTBiOTk0MDg5NTEwOGQyNDE2NDhkMWEwZWI0NmIzMmJjYmYzMjUxYTEz
+NmE2ZWUxZTIyNzU3NDVlMTFiYjMyOGMxNGU3ZTcyNjMACgkQVcmILZmbvMQvNw/+
+N/XjgSmh72DKX1pyZJz/KXC+yODnqU82/1JbFjLX1NLXvB0L2DNoLCX+oYGoNN+Q
+syohG3jSSdt8zuZMtXNdY2XLnB/jFNprBa0XdP8bB4R7vPX1pbwYupjHJm8d/utn
+kfPid/qMlBlLMvmSJ0aw8D6V/Y1pL/qXycEA8t7rxtOIDEX3vWreokxI+dfvjBw4
+lXnZJ1c3QvhbJHFGK2H9aGUZhdwe3hAxLXLk4lZFBDoSD64W8LPgC1MUTXMpetXD
+IP8syETIiNzuG5gxbbP3ks9Ab2JqLuEnVk2ynV8KHEUm57W68uU56F6hTTR9gOWT
+pCTLq5buW7MGzmiRYK5XhpbD0dBHVl3D9gdru/6f6CkfL/phtzJ+m/1V6JS8BQgp
+ye/xf6HtZC3wRCHGpIFl5AnNaCPAp09XEnWSl/Xjczqj2iqRwR0e2i6oShu74drJ
+wNJJzq1oDvLTOccCQkOFP47SxUATomuunbxPVbRdp/M1KVCOFXQDN4oVNaMmJSuz
+QpeQfWL9z0fDUuh0qhKw3M5YXYoLlcQ/pymwu7LRbjBJqhENlNzLcK2wBFvclI+q
+33fv92YWJi2CvDcLz/+3Um4AFwwfNWk3OS9AMhwpU4zZBptPANWFaclom6G+xn3z
+IqL/ie3FB38gMinAJYz5DhrKdC4tRlDmtk0EyHX/6DSJAvQEEAECAN4FAk1OgxCH
+FIAAAAAAEABuc2lnbm90ZXNAZ3JlcC5iZSJodHRwOi8vd3d3LmdyZXAuYmUvZ3Bn
+L0NGNjIzMThENUJCRUQ0OEYzM0FDRDU0MzFCMDAwNjI1NkZCMjkxNjQvNDkwMDcw
+N0REQzVDMDdGMkRFQ0IwMjgzOUMzMTUwM0M2RDg2NjM5Ni5hc2MiTxpodHRwOi8v
+d3d3LmdyZXAuYmUvZ3BnL0NGNjIzMThENUJCRUQ0OEYzM0FDRDU0MzFCMDAwNjI1
+NkZCMjkxNjQvY2VydC1wb2xpY3ktdjIACgkQGwAGJW+ykWSLsQ//QnVZYlPVIm4m
+j6iqY0q/31ftZNn0SSfSNIlo8TJ2vVHR4s7KZZTYFv40acC8YQekHExdC2H3f07Y
+eywaoHUmkh0FfqaOjHYbAb041XEgsidZWqYHik2WCZBL7buRDs55nWNjcDObEr/u
+K6+JP6sxyQlE85fa1k3ed6VKSQRI5GApN2093/Zc9x/ocTA3VY3Mxi2ZhnCQ77k8
+g7S6Th79zGQ4eHac/qYLfEpC4KvcVNCbxJhzmayh+btNGbev3+boWQ+x7DrgFxCb
+NnMBtITsABSipyALCFj2Vkpubpeo4X6gvF5uSNnaUmkWgjXGdbb7jTLFiaerd9D6
+DK4cqJowLzhxT5RpDTs7/5vAQYF5qBIJK7biuofA9yfw+Ro1ra3OqZ6Z7epcmIXQ
+BriV0h5VahIBuyRJ4RF/BkUeHjK3zDkL9W0rENzae+3QiSulQaaFpB5+yKGEmZIh
+vafIldof31sNzKVnHo2RX971rga1noI3EhRLoBZK2BnyckDWQWdK8Up+2v0yGFZ1
+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
+8IMNtArFWexbXxRsmpDkknou1IEt6w/MynF2tQ==
+=LD99
 -----END PGP PUBLIC KEY BLOCK-----
diff -Nru monkeysign-2.0.1/tests/test_gpg.py monkeysign-2.0.2/tests/test_gpg.py
--- monkeysign-2.0.1/tests/test_gpg.py	2014-10-20 22:29:41.000000000 -0400
+++ monkeysign-2.0.2/tests/test_gpg.py	2014-12-01 22:02:20.000000000 -0500
@@ -245,10 +245,11 @@
         self.gpg.context.set_option('local-user', '96F47C6A')
         self.assertTrue(self.gpg.sign_key('7B75921E', True))
 
-    @unittest.expectedFailure
     def test_sign_already_signed(self):
         """test if signing a already signed key fails with a meaningful message"""
-        raise NotImplementedError('not detecting already signed keys properly yet')
+        self.assertTrue(self.gpg.sign_key('Antoine Beaupré <anarcat@debian.org>'))
+        with self.assertRaises(GpgRuntimeError):
+            self.gpg.sign_key('Antoine Beaupré <anarcat@debian.org>')
 
     def test_encrypt_decrypt_data_armored_untrusted(self):
         """test if we can encrypt data to our private key (and decrypt it)"""
Thanks for your hard work, and hopefully that's not too messy. :/

A.

-- 
À mesure que l'opression s'étend à tous les secteurs de la vie,
la révolte prend l'allure d'une guerre sociale. 
Les émeutes renaissent et annoncent la révolution à venir.
                        - Jean-François Brient, de la servitude moderne

Attachment: signature.asc
Description: PGP signature


Reply to: