Package: release.debian.org
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package limnoria.

It is a new upstream, yes, but
1) it's a leaf package
2) it has a very extensive testsuite
3) the changes are so minimal...
4) it fixes the only bug this package has ;)

Attached a debdiff against the current version in stretch.

unblock limnoria/2017.01.10-1

-- 
regards,
                        Mattia Rizzolo

GPG Key: 66AE 2B4A FCCF 3F52 DA18  4D18 4B04 3FCD B944 4540      .''`.
more about me:  https://mapreri.org                             : :'  :
Launchpad user: https://launchpad.net/~mapreri                  `. `'`
Debian QA page: https://qa.debian.org/developer.php?login=mattia  `-
diffstat for limnoria-2016.12.08 limnoria-2017.01.10

 PKG-INFO                  |    2 -
 debian/changelog          |    9 +++++
 debian/rules              |    1 
 plugins/Channel/plugin.py |    9 +----
 plugins/Debug/plugin.py   |    2 +
 plugins/Google/plugin.py  |    2 -
 plugins/Unix/test.py      |    6 ++-
 scripts/supybot           |    2 -
 scripts/supybot-test      |    5 ++
 src/irclib.py             |   78 ++++++++++++++++++++++++++++++++++++++--------
 src/test.py               |    1 
 src/version.py            |    2 -
 12 files changed, 94 insertions(+), 25 deletions(-)

diff -Nru limnoria-2016.12.08/debian/changelog 
limnoria-2017.01.10/debian/changelog
--- limnoria-2016.12.08/debian/changelog        2016-12-15 08:40:27.000000000 
+0100
+++ limnoria-2017.01.10/debian/changelog        2017-01-31 11:59:27.000000000 
+0100
@@ -1,3 +1,12 @@
+limnoria (2017.01.10-1) unstable; urgency=medium
+
+  * New upstream version 2017.01.10.
+  * d/rules: use the new --no-setuid to skip tests that might require a
+    setuid binary (like /bin/ping in some hosts without settcap) as they
+    wouldn't work under libeatmydata.  Closes: #834950
+
+ -- Mattia Rizzolo <mat...@debian.org>  Tue, 31 Jan 2017 11:59:27 +0100
+
 limnoria (2016.12.08-1) unstable; urgency=medium
 
   * New upstream version 2016.12.08.
diff -Nru limnoria-2016.12.08/debian/rules limnoria-2017.01.10/debian/rules
--- limnoria-2016.12.08/debian/rules    2016-12-04 14:48:31.000000000 +0100
+++ limnoria-2017.01.10/debian/rules    2017-01-31 11:58:29.000000000 +0100
@@ -13,6 +13,7 @@
        PYBUILD_TEST_ARGS="PYTHONPATH={build_dir} \
                build/scripts-{version}/supybot-test \
                test \
+               --no-setuid \
                --no-network \
                --disable-multiprocessing \
                --plugins-dir={build_dir}/supybot/plugins/" \
diff -Nru limnoria-2016.12.08/PKG-INFO limnoria-2017.01.10/PKG-INFO
--- limnoria-2016.12.08/PKG-INFO        2016-12-08 21:11:36.000000000 +0100
+++ limnoria-2017.01.10/PKG-INFO        2017-01-27 00:14:32.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: limnoria
-Version: 2016.12.08
+Version: 2017.01.10
 Summary: A modified version of Supybot (an IRC bot and framework)
 Home-page: https://github.com/ProgVal/Limnoria
 Author: Valentin Lorentz
diff -Nru limnoria-2016.12.08/plugins/Channel/plugin.py 
limnoria-2017.01.10/plugins/Channel/plugin.py
--- limnoria-2016.12.08/plugins/Channel/plugin.py       2016-12-08 
21:11:26.000000000 +0100
+++ limnoria-2017.01.10/plugins/Channel/plugin.py       2017-01-27 
00:13:31.000000000 +0100
@@ -909,10 +909,9 @@
         # Make sure we don't elicit information about private channels to
         # people or channels that shouldn't know
         capability = ircdb.makeChannelCapability(channel, 'op')
-        hostmask = irc.state.nickToHostmask(msg.nick)
         if 's' in irc.state.channels[channel].modes and \
             msg.args[0] != channel and \
-            not ircdb.checkCapability(hostmask, capability) and \
+            not ircdb.checkCapability(msg.prefix, capability) and \
             (ircutils.isChannel(msg.args[0]) or \
              msg.nick not in irc.state.channels[channel].users):
             irc.error(_('You don\'t have access to that information.'),
@@ -937,8 +936,7 @@
         if frm is not None:
             s += format(_(' (from %s)'), frm)
         for nick in irc.state.channels[channel].users:
-            hostmask = irc.state.nickToHostmask(nick)
-            if ircdb.checkCapability(hostmask, capability):
+            if ircdb.checkCapability(msg.prefix, capability):
                 irc.reply(s, to=nick, private=True)
         irc.replySuccess()
 
@@ -969,8 +967,7 @@
             else:
                 irc.error(Raise=True)
         capability = ircdb.makeChannelCapability(channel, 'op')
-        hostmask = irc.state.nickToHostmask(msg.nick)
-        if not ircdb.checkCapabilities(hostmask, [capability, 'admin']):
+        if not ircdb.checkCapabilities(msg.prefix, [capability, 'admin']):
             irc.errorNoCapability(capability, Raise=True)
         try:
             network = conf.supybot.networks.get(irc.network)
diff -Nru limnoria-2016.12.08/plugins/Debug/plugin.py 
limnoria-2017.01.10/plugins/Debug/plugin.py
--- limnoria-2016.12.08/plugins/Debug/plugin.py 2016-12-08 21:11:26.000000000 
+0100
+++ limnoria-2017.01.10/plugins/Debug/plugin.py 2017-01-27 00:13:31.000000000 
+0100
@@ -34,6 +34,8 @@
 a Supybot developer requests you to debug some issue.
 """
 
+# Import supybot for easier access to the module namespace
+import supybot
 import supybot.plugins as plugins
 
 import gc
diff -Nru limnoria-2016.12.08/plugins/Google/plugin.py 
limnoria-2017.01.10/plugins/Google/plugin.py
--- limnoria-2016.12.08/plugins/Google/plugin.py        2016-12-08 
21:11:26.000000000 +0100
+++ limnoria-2017.01.10/plugins/Google/plugin.py        2017-01-27 
00:13:31.000000000 +0100
@@ -292,7 +292,7 @@
         Returns <text> translated from <source language> into <target
         language>. <source language> and <target language> take language
         codes (not language names), which are listed here:
-        
https://cloud.google.com/translate/v2/translate-reference#supported_languages
+        https://cloud.google.com/translate/docs/languages
         """
         channel = msg.args[0]
         (text, language) = self._translate(sourceLang, targetLang, text)
diff -Nru limnoria-2016.12.08/plugins/Unix/test.py 
limnoria-2017.01.10/plugins/Unix/test.py
--- limnoria-2016.12.08/plugins/Unix/test.py    2016-12-08 21:11:26.000000000 
+0100
+++ limnoria-2017.01.10/plugins/Unix/test.py    2017-01-27 00:13:31.000000000 
+0100
@@ -48,9 +48,11 @@
             'aspell/ispell not available.')
     skipUnlessFortune = skipIf(utils.findBinaryInPath('fortune') is None,
             'fortune not available.')
-    skipUnlessPing = skipIf(utils.findBinaryInPath('ping') is None,
+    skipUnlessPing = skipIf(
+            utils.findBinaryInPath('ping') is None or not setuid,
             'ping not available.')
-    skipUnlessPing6 = skipIf(utils.findBinaryInPath('ping6') is None,
+    skipUnlessPing6 = skipIf(
+            utils.findBinaryInPath('ping6') is None or not setuid,
             'ping6 not available.')
 
 class UnixConfigTestCase(ChannelPluginTestCase):
diff -Nru limnoria-2016.12.08/scripts/supybot 
limnoria-2017.01.10/scripts/supybot
--- limnoria-2016.12.08/scripts/supybot 2016-12-08 21:11:26.000000000 +0100
+++ limnoria-2017.01.10/scripts/supybot 2017-01-27 00:13:31.000000000 +0100
@@ -208,7 +208,7 @@
             # The registry *MUST* be opened before importing log or conf.
             i18n.getLocaleFromRegistryFilename(registryFilename)
             registry.open_registry(registryFilename)
-            shutil.copy(registryFilename, registryFilename + '.bak')
+            shutil.copyfile(registryFilename, registryFilename + '.bak')
         except registry.InvalidRegistryFile as e:
             s = '%s in %s.  Please fix this error and start supybot again.' % \
                 (e, registryFilename)
diff -Nru limnoria-2016.12.08/scripts/supybot-test 
limnoria-2017.01.10/scripts/supybot-test
--- limnoria-2016.12.08/scripts/supybot-test    2016-12-08 21:11:26.000000000 
+0100
+++ limnoria-2017.01.10/scripts/supybot-test    2017-01-27 00:13:31.000000000 
+0100
@@ -138,6 +138,9 @@
     parser.add_option('', '--no-network', action='store_true', default=False,
                       dest='nonetwork', help='Causes the network-based tests '
                                              'not to run.')
+    parser.add_option('', '--no-setuid', action='store_true', default=False,
+                      dest='nosetuid', help='Causes the tests based on a '
+                                             'setuid executable not to run.')
     parser.add_option('', '--trace', action='store_true', default=False,
                       help='Traces all calls made.  Unless you\'re really in '
                       'a pinch, you probably shouldn\'t do this; it results '
@@ -184,6 +187,8 @@
 
     if options.nonetwork:
         test.network = False
+    if options.nosetuid:
+        test.setuid = False
 
     log.testing = True
     world.testing = True
diff -Nru limnoria-2016.12.08/src/irclib.py limnoria-2017.01.10/src/irclib.py
--- limnoria-2016.12.08/src/irclib.py   2016-12-08 21:11:26.000000000 +0100
+++ limnoria-2017.01.10/src/irclib.py   2017-01-27 00:13:31.000000000 +0100
@@ -35,10 +35,14 @@
 import collections
 
 try:
-    from ecdsa import SigningKey, BadDigestError
-    ecdsa = True
+    import ecdsa
 except ImportError:
-    ecdsa = False
+    ecdsa = None
+
+try:
+    import pyxmpp2_scram as scram
+except ImportError:
+    scram = None
 
 from . import conf, ircdb, ircmsgs, ircutils, log, utils, world
 from .utils.str import rsplit
@@ -994,6 +998,7 @@
         self.sasl_username = network_config.sasl.username()
         self.sasl_password = network_config.sasl.password()
         self.sasl_ecdsa_key = network_config.sasl.ecdsa_key()
+        self.sasl_scram_state = {'step': 'uninitialized'}
         self.authenticate_decoder = None
         self.sasl_next_mechanisms = []
         self.sasl_current_mechanism = None
@@ -1006,6 +1011,9 @@
                     network_config.certfile() or
                     conf.supybot.protocols.irc.certfile()):
                 self.sasl_next_mechanisms.append(mechanism)
+            elif mechanism.startswith('scram-') and scram and \
+                    self.sasl_username and self.sasl_password:
+                self.sasl_next_mechanisms.append(mechanism)
             elif mechanism == 'plain' and \
                     self.sasl_username and self.sasl_password:
                 self.sasl_next_mechanisms.append(mechanism)
@@ -1101,20 +1109,24 @@
 
         mechanism = self.sasl_current_mechanism
         if mechanism == 'ecdsa-nist256p-challenge':
-            if string == b'':
-                self.sendSaslString(self.sasl_username.encode('utf-8'))
-                return
+            self.doAuthenticateEcdsa(string)
+        elif mechanism == 'external':
+            self.sendSaslString(b'')
+        elif mechanism.startswith('scram-'):
+            step = self.sasl_scram_state['step']
             try:
-                with open(self.sasl_ecdsa_key) as fd:
-                    private_key = SigningKey.from_pem(fd.read())
-                authstring = 
private_key.sign(base64.b64decode(msg.args[0].encode()))
-                self.sendSaslString(authstring)
-            except (BadDigestError, OSError, ValueError):
+                if step == 'uninitialized':
+                    self.doAuthenticateScramFirst()
+                elif step == 'first-sent':
+                    self.doAuthenticateScramChallenge(string)
+                elif step == 'final-sent':
+                    self.doAuthenticateScramFinish(string)
+                else:
+                    assert False
+            except scram.ScramException:
                 self.sendMsg(ircmsgs.IrcMsg(command='AUTHENTICATE',
                     args=('*',)))
                 self.tryNextSaslMechanism()
-        elif mechanism == 'external':
-            self.sendSaslString(b'')
         elif mechanism == 'plain':
             authstring = b'\0'.join([
                 self.sasl_username.encode('utf-8'),
@@ -1123,6 +1135,46 @@
             ])
             self.sendSaslString(authstring)
 
+    def doAuthenticateEcdsa(self, string):
+        if string == b'':
+            self.sendSaslString(self.sasl_username.encode('utf-8'))
+            return
+        try:
+            with open(self.sasl_ecdsa_key) as fd:
+                private_key = ecdsa.SigningKey.from_pem(fd.read())
+            authstring = private_key.sign(string)
+            self.sendSaslString(authstring)
+        except (ecdsa.BadDigestError, OSError, ValueError):
+            self.sendMsg(ircmsgs.IrcMsg(command='AUTHENTICATE',
+                args=('*',)))
+            self.tryNextSaslMechanism()
+
+    def doAuthenticateScramFirst(self):
+        """Handle sending the client-first message of SCRAM auth."""
+        hash_name = mechanism[len('scram-'):]
+        if hash_name.endswith('-plus'):
+            hash_name = hash_name[:-len('-plus')]
+        authenticator = scram.SCRAMClientAuthenticator(hash_name,
+                channel_binding=False)
+        self.sasl_scram_state['authenticator'] = authenticator
+        client_first = authenticator.start({
+            'username': self.sasl_username,
+            'password': self.sasl_password,
+            })
+        self.sendSaslString(client_first)
+        self.sasl_scram_state['step'] = 'first-sent'
+
+    def doAuthenticateScramChallenge(self, challenge):
+        client_final = self.sasl_scram_state['authenticator'] \
+                .challenge(challenge)
+        self.sasl_scram_state['step'] = 'final-sent'
+
+    def doAuthenticateScramFinish(self, data):
+        # TODO: do something with BadSuccessException
+        res = self.sasl_scram_state['authenticator'] \
+                .finish(data)
+        self.sasl_scram_state['step'] = 'authenticated'
+
     def do903(self, msg):
         log.info('%s: SASL authentication successful', self.network)
         self.sasl_authenticated = True
diff -Nru limnoria-2016.12.08/src/test.py limnoria-2017.01.10/src/test.py
--- limnoria-2016.12.08/src/test.py     2016-12-08 21:11:26.000000000 +0100
+++ limnoria-2017.01.10/src/test.py     2017-01-27 00:13:31.000000000 +0100
@@ -59,6 +59,7 @@
 
 i18n.import_conf()
 network = True
+setuid = True
 
 # This is the global list of suites that are to be run.
 suites = []
diff -Nru limnoria-2016.12.08/src/version.py limnoria-2017.01.10/src/version.py
--- limnoria-2016.12.08/src/version.py  2016-12-08 21:11:36.000000000 +0100
+++ limnoria-2017.01.10/src/version.py  2017-01-27 00:14:32.000000000 +0100
@@ -1,4 +1,4 @@
-version = '2016.12.08'
+version = '2017.01.10'
 try: # For import from setup.py
     import supybot.utils.python
     supybot.utils.python._debug_software_version = version

Attachment: signature.asc
Description: PGP signature

Reply via email to