Misc fixes

Add CVE snarfer
Malone -> Launchpad rename
This commit is contained in:
Dennis Kaarsemaker 2007-06-08 20:16:37 +02:00
parent 10022b2a42
commit d218ddad74
8 changed files with 71 additions and 25 deletions

View File

@ -72,11 +72,12 @@ class BugNotFoundError(Exception):
"""Pity, bug isn't there""" """Pity, bug isn't there"""
pass pass
cvere = re.compile(r'<td><font[^>]*>description</font></td>\s*<td><font[^>]*>(.*?)\s*</font>', re.I | re.DOTALL)
class Bugtracker(callbacks.PluginRegexp): class Bugtracker(callbacks.PluginRegexp):
"""Show a link to a bug report with a brief description""" """Show a link to a bug report with a brief description"""
threaded = True threaded = True
callBefore = ['URL'] callBefore = ['URL']
regexps = ['turlSnarfer', 'bugSnarfer', 'oopsSnarfer'] regexps = ['turlSnarfer', 'bugSnarfer', 'oopsSnarfer', 'cveSnarfer']
def __init__(self, irc): def __init__(self, irc):
callbacks.PluginRegexp.__init__(self, irc) callbacks.PluginRegexp.__init__(self, irc)
@ -155,9 +156,9 @@ class Bugtracker(callbacks.PluginRegexp):
if tag not in bugs: if tag not in bugs:
bugs[tag] = {} bugs[tag] = {}
# Determine bugtracker type (currently only Malone is supported anyway) # Determine bugtracker type (currently only Launchpad is supported anyway)
if bug['X-Launchpad-Bug']: if bug['X-Launchpad-Bug']:
tracker = self.db['malone'] tracker = self.db['launchpad']
id = int(bug['Reply-To'].split()[1]) id = int(bug['Reply-To'].split()[1])
if self.is_new(tracker, tag, id): if self.is_new(tracker, tag, id):
component = bug['X-Launchpad-Bug'] component = bug['X-Launchpad-Bug']
@ -171,6 +172,8 @@ class Bugtracker(callbacks.PluginRegexp):
bugs[tag][id] = self.get_bug('',tracker, id, False)[0].replace('"','(%s) "' % component, 1) bugs[tag][id] = self.get_bug('',tracker, id, False)[0].replace('"','(%s) "' % component, 1)
else: else:
bugs[tag][id] = self.get_bug('',tracker, id, False)[0] bugs[tag][id] = self.get_bug('',tracker, id, False)[0]
if '[apport]' in bugs[tag][id]:
bugs[tag].pop(id)
except: except:
self.log.info("Unable to get new bug %d" % id) self.log.info("Unable to get new bug %d" % id)
pass pass
@ -185,12 +188,13 @@ class Bugtracker(callbacks.PluginRegexp):
continue continue
for b in sorted(bugs[tag].keys()): for b in sorted(bugs[tag].keys()):
irc.queueMsg(ircmsgs.privmsg(c,'New bug: #%s' % bugs[tag][b][bugs[tag][b].find('bug ')+4:])) irc.queueMsg(ircmsgs.privmsg(c,'New bug: #%s' % bugs[tag][b][bugs[tag][b].find('bug ')+4:]))
print "Reported!"
def add(self, irc, msg, args, name, trackertype, url, description): def add(self, irc, msg, args, name, trackertype, url, description):
"""<name> <type> <url> [<description>] """<name> <type> <url> [<description>]
Add a bugtracker <url> to the list of defined bugtrackers. <type> is the Add a bugtracker <url> to the list of defined bugtrackers. <type> is the
type of the tracker (currently only Malone, Debbugs, Bugzilla, type of the tracker (currently only Launchpad, Debbugs, Bugzilla,
Issuezilla and Trac are known). <name> is the name that will be used to Issuezilla and Trac are known). <name> is the name that will be used to
reference the bugzilla in all commands. Unambiguous abbreviations of reference the bugzilla in all commands. Unambiguous abbreviations of
<name> will be accepted also. <description> is the common name for the <name> will be accepted also. <description> is the common name for the
@ -373,9 +377,26 @@ class Bugtracker(callbacks.PluginRegexp):
# Only useful for launchpad developers # Only useful for launchpad developers
def oopsSnarfer(self, irc, msg, match): def oopsSnarfer(self, irc, msg, match):
r"OOPS-(?P<oopsid>\d*[A-Z]\d+)" r"OOPS-(?P<oopsid>\d*[A-Z]\d+)"
if msg.args[0][0] == '#' and not self.registryValue('bugSnarfer', msg.args[0]):
return
oopsid = match.group(1) oopsid = match.group(1)
irc.reply("https://devpad.canonical.com/~jamesh/oops.cgi/%s" % oopsid, prefixNick=False) irc.reply("https://devpad.canonical.com/~jamesh/oops.cgi/%s" % oopsid, prefixNick=False)
def cveSnarfer(self, irc, msg, match):
r"(cve[- ]\d{4}[- ]\d{4})"
if msg.args[0][0] == '#' and not self.registryValue('bugSnarfer', msg.args[0]):
return
cve = match.group(1).replace(' ','-').upper()
url = 'http://cve.mitre.org/cgi-bin/cvename.cgi?name=%s' % cve
cvedata = utils.web.getUrl(url)
m = cvere.search(cvedata)
if m:
cve = m.group(1).replace('\n', ' ')
irc.reply("%s (%s)" % (cve,url))
def cveUrlSnarfer(self, irc, msg, match):
pass
def get_tracker(self,snarfurl,sfdata): def get_tracker(self,snarfurl,sfdata):
snarfurl = snarfurl.replace('sf.net','sourceforge.net') snarfurl = snarfurl.replace('sf.net','sourceforge.net')
snarfhost = snarfurl.replace('http://','').replace('https://','') snarfhost = snarfurl.replace('http://','').replace('https://','')
@ -517,7 +538,7 @@ class Issuezilla(IBugtracker):
raise BugtrackerError, s raise BugtrackerError, s
return [(id, component, title, severity, status, assignee, "%s/show_bug.cgi?id=%d" % (self.url, id))] return [(id, component, title, severity, status, assignee, "%s/show_bug.cgi?id=%d" % (self.url, id))]
class Malone(IBugtracker): class Launchpad(IBugtracker):
def _parse(self, task): def _parse(self, task):
parser = email.FeedParser.FeedParser() parser = email.FeedParser.FeedParser()
parser.feed(task) parser.feed(task)
@ -525,7 +546,7 @@ class Malone(IBugtracker):
def _sort(self, task1, task2): def _sort(self, task1, task2):
# Status sort: # Status sort:
try: try:
statuses = ['Rejected', 'Fix Released', 'Fix Committed', 'Unconfirmed', 'Needs Info', 'In Progress', 'Confirmed'] statuses = ['Rejected', 'Fix Released', 'Fix Committed', 'Unconfirmed','Needs Info','Confirmed','In Progress']
severities = ['Undecided', 'Wishlist', 'Minor', 'Low', 'Normal', 'Medium', 'Major', 'High', 'Critical'] severities = ['Undecided', 'Wishlist', 'Minor', 'Low', 'Normal', 'Medium', 'Major', 'High', 'Critical']
if task1['status'] not in statuses and task2['status'] in statuses: return -1 if task1['status'] not in statuses and task2['status'] in statuses: return -1
if task1['status'] in statuses and task2['status'] not in statuses: return 1 if task1['status'] in statuses and task2['status'] not in statuses: return 1
@ -544,7 +565,8 @@ class Malone(IBugtracker):
return 0 return 0
def get_bug(self, id): def get_bug(self, id):
try: try:
bugdata = utils.web.getUrl("%s/%d/+text" % (self.url.replace('malone','bugs'),id)) print("%s/bugs/%d/+text" % (self.url,id))
bugdata = utils.web.getUrl("%s/bugs/%d/+text" % (self.url,id))
except Exception, e: except Exception, e:
if '404' in str(e): if '404' in str(e):
raise BugNotFoundError raise BugNotFoundError
@ -576,9 +598,9 @@ class Malone(IBugtracker):
if bugdata['duplicate-of']: if bugdata['duplicate-of']:
dupbug = self.get_bug(int(bugdata['duplicate-of'])) dupbug = self.get_bug(int(bugdata['duplicate-of']))
return [(id, t, bugdata['title'] + (' (dup-of: %d)' % dupbug[0][0]), taskdata['importance'], return [(id, t, bugdata['title'] + (' (dup-of: %d)' % dupbug[0][0]), taskdata['importance'],
taskdata['status'], taskdata['assignee'], "%s/bugs/%s" % (self.url.replace('/malone',''), id))] + dupbug taskdata['status'], taskdata['assignee'], "%s/bugs/%s" % (self.url, id))] + dupbug
return [(id, t, bugdata['title'], taskdata['importance'], return [(id, t, bugdata['title'], taskdata['importance'],
taskdata['status'], taskdata['assignee'], "%s/bugs/%s" % (self.url.replace('/malone',''), id))] taskdata['status'], taskdata['assignee'], "%s/bugs/%s" % (self.url, id))]
# <rant> # <rant>
# Debbugs sucks donkeyballs # Debbugs sucks donkeyballs
@ -784,7 +806,9 @@ registerBugtracker('ximian', 'http://bugzilla.ximian.com', 'Ximian', 'bugzilla')
registerBugtracker('freedesktop', 'http://bugzilla.freedesktop.org', 'Freedesktop', 'bugzilla') registerBugtracker('freedesktop', 'http://bugzilla.freedesktop.org', 'Freedesktop', 'bugzilla')
registerBugtracker('freedesktop2', 'http://bugs.freedesktop.org', 'Freedesktop', 'bugzilla') registerBugtracker('freedesktop2', 'http://bugs.freedesktop.org', 'Freedesktop', 'bugzilla')
registerBugtracker('openoffice', 'http://openoffice.org/issues', 'OpenOffice.org', 'issuezilla') registerBugtracker('openoffice', 'http://openoffice.org/issues', 'OpenOffice.org', 'issuezilla')
registerBugtracker('malone', 'https://launchpad.net/malone', 'Malone', 'malone') registerBugtracker('launchpad', 'https://launchpad.net', 'Launchpad', 'launchpad')
registerBugtracker('lp', 'https://launchpad.net', 'Launchpad', 'launchpad')
registerBugtracker('malone', 'https://launchpad.net', 'Launchpad', 'launchpad')
registerBugtracker('debian', 'http://bugs.debian.org', 'Debian', 'debbugs') registerBugtracker('debian', 'http://bugs.debian.org', 'Debian', 'debbugs')
registerBugtracker('trac', 'http://trac.edgewall.org/ticket', 'Trac', 'trac') registerBugtracker('trac', 'http://trac.edgewall.org/ticket', 'Trac', 'trac')
registerBugtracker('django', 'http://code.djangoproject.com/ticket', 'Django', 'trac') registerBugtracker('django', 'http://code.djangoproject.com/ticket', 'Django', 'trac')

View File

@ -51,7 +51,9 @@ if 'search' in form:
# Select factoids # Select factoids
if search: if search:
keys = [x.strip() for x in search.split() if len(x.strip()) >2][:5] keys = [urllib2.unquote(x.strip()) for x in search.split() if len(x.strip()) >2][:5]
if not keys:
keys = ['']
query1 = "SELECT name, value, author, added, popularity FROM facts WHERE name NOT LIKE '%-also' AND (" query1 = "SELECT name, value, author, added, popularity FROM facts WHERE name NOT LIKE '%-also' AND ("
query2 = "SELECT COUNT(name) FROM facts WHERE " query2 = "SELECT COUNT(name) FROM facts WHERE "
bogus = False bogus = False

View File

@ -318,7 +318,7 @@ class Encyclopedia(callbacks.Plugin):
text, target, retmsg = self.get_target(msg.nick, orig_text, target) text, target, retmsg = self.get_target(msg.nick, orig_text, target)
if text.startswith('bug ') and text != ('bug 1'): if text.startswith('bug ') and text != ('bug 1'):
return return
if text == self.registryValue('alert') and msg.args[0][0] == '#': if text == self.registryValue('alert') and msg.args[0][0] == '#' and not display_info:
msg.tag('alert') msg.tag('alert')
ret = self.factoid_lookup(text, channel, display_info) ret = self.factoid_lookup(text, channel, display_info)
@ -348,7 +348,7 @@ class Encyclopedia(callbacks.Plugin):
queue(irc, target, retmsg + ret[0]) queue(irc, target, retmsg + ret[0])
if msg.tagged('alert'): if msg.tagged('alert'):
queue(irc, self.registryValue('relayChannel'), '%s called the ops in %s' % (msg.nick, msg.args[0])) queue(irc, self.registryValue('relayChannel'), '%s called the ops in %s' % (msg.nick, msg.args[0]))
queue(irc, self.registryValue('relayChannel'), retmsg + ret[0]) #queue(irc, self.registryValue('relayChannel'), retmsg + ret[0])
for r in ret[1:]: for r in ret[1:]:
queue(irc, target, r) queue(irc, target, r)

View File

@ -3,6 +3,7 @@
DIR=/home/dennis/ubotu/data/apt DIR=/home/dennis/ubotu/data/apt
for DIST in "$DIR"/*.list; do for DIST in "$DIR"/*.list; do
test -h $DIST && continue
DIST=${DIST:${#DIR}} DIST=${DIST:${#DIR}}
DIST=${DIST/.list} DIST=${DIST/.list}
touch "$DIR/$DIST.status" touch "$DIR/$DIST.status"

View File

@ -60,6 +60,7 @@ class Lart(plugins.ChannelIdDatabasePlugin):
(target, reason) = map(str.strip, text.split(' for ', 1)) (target, reason) = map(str.strip, text.split(' for ', 1))
else: else:
(target, reason) = (text, '') (target, reason) = (text, '')
print target
if id is not None: if id is not None:
try: try:
lart = self.db.get(channel, id) lart = self.db.get(channel, id)
@ -74,8 +75,8 @@ class Lart(plugins.ChannelIdDatabasePlugin):
return return
text = self._replaceFirstPerson(lart.text, msg.nick) text = self._replaceFirstPerson(lart.text, msg.nick)
if ircutils.strEqual(target, irc.nick) or \ if ircutils.strEqual(target, irc.nick) or \
'ubotu' in target.lower() or 'ubugtu' in target.lower() or \ 'ubotu' in ircutils.stripFormatting(target).lower() or \
'seveas' in target.lower() or \ 'seveas' in ircutils.stripFormatting(target).lower() or \
((not msg.prefix.endswith('seveas')) and random.uniform(0,100) < 25): ((not msg.prefix.endswith('seveas')) and random.uniform(0,100) < 25):
target = msg.nick target = msg.nick
reason = '' reason = ''

View File

@ -28,7 +28,7 @@ class LpLogin(callbacks.Plugin):
except: except:
pass pass
# Reload every 6 hours # Reload every 6 hours
schedule.addPeriodicEvent(lambda: self.reportnewbugs(irc), 60*60*6, name=self.name() + '.nickreload') #schedule.addPeriodicEvent(lambda: self.reportnewbugs(irc), 60*60*6, name=self.name() + '.nickreload')
def loadnicks(self): def loadnicks(self):
uf = self.registryValue('UserList') uf = self.registryValue('UserList')
@ -66,6 +66,8 @@ class LpLogin(callbacks.Plugin):
def do376(self, irc, msg): def do376(self, irc, msg):
irc.queueMsg(ircmsgs.IrcMsg('CAPAB IDENTIFY-MSG')) irc.queueMsg(ircmsgs.IrcMsg('CAPAB IDENTIFY-MSG'))
def do422(self, irc, msg): # MOTD missing
irc.queueMsg(ircmsgs.IrcMsg('CAPAB IDENTIFY-MSG'))
def inFilter(self, irc, msg): def inFilter(self, irc, msg):
if getattr(irc,'_Freenode_capabed',None) and msg.command == 'PRIVMSG': if getattr(irc,'_Freenode_capabed',None) and msg.command == 'PRIVMSG':

View File

@ -19,6 +19,7 @@ import supybot.ircutils as ircutils
import supybot.callbacks as callbacks import supybot.callbacks as callbacks
import random, re, time, commands, urllib2 import random, re, time, commands, urllib2
import supybot.ircmsgs as ircmsgs import supybot.ircmsgs as ircmsgs
import supybot.conf as conf
mess = { mess = {
't': ('http://4q.cc/?pid=fact&person=mrt', r'</h1>.*?<p>(?P<fact>.*?)</p>', False), 't': ('http://4q.cc/?pid=fact&person=mrt', r'</h1>.*?<p>(?P<fact>.*?)</p>', False),
@ -37,10 +38,12 @@ mess = {
'mjg59': ('http://www.angryfacts.com', r'</p><h1>(?P<fact>.*?)</h1>', False), 'mjg59': ('http://www.angryfacts.com', r'</p><h1>(?P<fact>.*?)</h1>', False),
'vmjg': ('http://www.rjek.com/vmjg59.cgi', r'<body>(?P<fact>.*?)<p>', True), 'vmjg': ('http://www.rjek.com/vmjg59.cgi', r'<body>(?P<fact>.*?)<p>', True),
'vmjg59': ('http://www.rjek.com/vmjg59.cgi', r'<body>(?P<fact>.*?)<p>', True), 'vmjg59': ('http://www.rjek.com/vmjg59.cgi', r'<body>(?P<fact>.*?)<p>', True),
'bofh': ('/home/dennis/ubotu/plugins/Mess/bofh.txt', 'BOFH Excuse #%d: ', False), 'shakespeare': ('http://www.pangloss.com/seidel/Shaker/', r'<font.*?>(?P<fact>.*?)</font>', False),
'42': ('/home/dennis/ubotu/plugins/Mess/42.txt', '', False), 'lugradio': ('http://planet.lugradio.org/facts/', r'<h2>\s*(?P<fact>.*?)</h2>', False),
'magic8ball': ('/home/dennis/ubotu/plugins/Mess/ball.txt', '', False), 'bofh': ('/home/dennis/ubotu/plugins/Mess/bofh.txt', 'BOFH Excuse #%d: ', False),
'ferengi': ('/home/dennis/ubotu/plugins/Mess/ferengi.txt', 'Ferengi rule of acquisition ', False) '42': ('/home/dennis/ubotu/plugins/Mess/42.txt', '', False),
'magic8ball': ('/home/dennis/ubotu/plugins/Mess/ball.txt', '', False),
'ferengi': ('/home/dennis/ubotu/plugins/Mess/ferengi.txt', 'Ferengi rule of acquisition ', False)
} }
data = {} data = {}
for m in mess.keys(): for m in mess.keys():
@ -53,7 +56,7 @@ for m in mess.keys():
badwords = ['sex','masturbate','fuck','rape','dick','pussy','prostitute','hooker', badwords = ['sex','masturbate','fuck','rape','dick','pussy','prostitute','hooker',
'orgasm','sperm','cunt','penis','shit','piss','urin','bitch','semen','cock', 'orgasm','sperm','cunt','penis','shit','piss','urin','bitch','semen','cock',
'retarded'] 'retard']
tagre = re.compile(r'<.*?>') tagre = re.compile(r'<.*?>')
def filter(txt,off): def filter(txt,off):
_txt = txt.lower() _txt = txt.lower()
@ -119,12 +122,25 @@ class Mess(callbacks.PluginRegexp):
return callbacks.PluginRegexp.getCommandMethod(self, command) return callbacks.PluginRegexp.getCommandMethod(self, command)
except AttributeError: except AttributeError:
return self.messcb return self.messcb
def _callCommand(self, command, irc, msg, *args, **kwargs):
method = self.getCommandMethod(command)
if command[0] in mess:
msg.tag('messcmd', command[0])
try:
method(irc, msg, *args, **kwargs)
except Exception, e:
self.log.exception('Uncaught exception in %s.', command)
if conf.supybot.reply.error.detailed():
irc.error(utils.exnToString(e))
else:
irc.replyError()
@ok @ok
def messcb(self, irc, msg, args): def messcb(self, irc, msg, args, text):
"""General mess""" """General mess"""
global data global data
cmd = msg.args[1].split()[-1] cmd = msg.tagged('messcmd')
try: try:
(loc, tx, off) = mess[cmd] (loc, tx, off) = mess[cmd]
except: except:
@ -147,7 +163,7 @@ class Mess(callbacks.PluginRegexp):
if '%d' in tx: if '%d' in tx:
tx = tx % i tx = tx % i
irc.reply(tx + data[loc][i]) irc.reply(tx + data[loc][i])
messcb = wrap(messcb) messcb = wrap(messcb, [additional('text')])
# WARNING: depends on an alteration in supybot/callbacks.py - don't do # WARNING: depends on an alteration in supybot/callbacks.py - don't do
# str(s) if s is unicode! # str(s) if s is unicode!

View File

@ -12,7 +12,7 @@
# #
### ###
import cgi, cgitb, re, sys, math, os, md5, sqlite, random, time, datetime, pytz, Cookie, StringIO import cgi, cgitb, re, sys, math, os, md5, sqlite, random, time, datetime, pytz, Cookie, StringIO, urllib2
import cPickle as pickle import cPickle as pickle
cgitb.enable() cgitb.enable()