Your message dated Fri, 03 Feb 2017 21:48:12 +0000 with message-id <E1cZliG-0000mE-WE@respighi.debian.org> and subject line unblock limnoria has caused the Debian Bug report #853727, regarding unblock: limnoria/2017.01.10-1 to be marked as done. This means that you claim that the problem has been dealt with. If this is not the case it is now your responsibility to reopen the Bug report if necessary, and/or fix the problem forthwith. (NB: If you are a system administrator and have no idea what this message is talking about, this may indicate a serious mail system misconfiguration somewhere. Please contact owner@bugs.debian.org immediately.) -- 853727: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=853727 Debian Bug Tracking System Contact owner@bugs.debian.org with problems
--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: unblock: limnoria/2017.01.10-1
- From: Mattia Rizzolo <mattia@debian.org>
- Date: Tue, 31 Jan 2017 12:14:41 +0100
- Message-id: <20170131111437.tzkcwpwwpshubdq7@mapreri.org>
Package: release.debian.org User: release.debian.org@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 <mattia@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 = versionAttachment: signature.asc
Description: PGP signature
--- End Message ---
--- Begin Message ---
- To: 853727-done@bugs.debian.org
- Subject: unblock limnoria
- From: Emilio Pozuelo Monfort <pochu@respighi.debian.org>
- Date: Fri, 03 Feb 2017 21:48:12 +0000
- Message-id: <E1cZliG-0000mE-WE@respighi.debian.org>
Unblocked.
--- End Message ---