### # Copyright (c) 2021, Pedro de Oliveira # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions, and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions, and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the author of this software nor the name of # contributors to this software may be used to endorse or promote products # derived from this software without specific prior written consent. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. ### from supybot import utils, plugins, ircutils, callbacks from supybot.commands import * try: from supybot.i18n import PluginInternationalization _ = PluginInternationalization('CVE') except ImportError: # Placeholder that allows to run the plugin on a bot # without the i18n module _ = lambda x: x import json import re import requests class CVE(callbacks.Plugin): """Client to CVE.""" threaded = True def info(self, irc, msg, args, cve): """ Returns information about a specific CVE. """ URL = "https://cve.circl.lu/api/cve/{}".format(cve.group(0)) response = requests.get(URL) if response.content == b"null": irc.error(_('Invalid CVE format.'), prefixNick=False) return item = json.loads(response.content) output = "[{}] {} - {}".format(item['Modified'], item['id'], item['summary']) irc.reply(output, prefixNick=False) _cve = re.compile(r"^CVE-\d{4}-\d{4,6}$") info = wrap(info, [ ('matches', _cve, _('Invalid CVE format.'))]) def latest(self, irc, msg, args, limit): """ Returns the latest CVE. Default is 3. Max is 5. """ URL = "https://cve.circl.lu/api/last" response = requests.get(URL) results = json.loads(response.content) if limit > 5: limit = 5 count = 0 output = "" for item in results: if count >= limit: break if output != "": output += " || " output += "[{}] {} - {}{}".format(item['Modified'], item['id'], item['summary'][:65].strip(), u"…") count += 1 irc.reply(output, prefixNick=False) latest = wrap(latest, [optional('int', default=3)]) Class = CVE # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: