Commit f4d06886 authored by PidgeyL's avatar PidgeyL
Browse files

new plug-in manager features + fix function names

parent 5b20f3d9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -363,7 +363,7 @@ class ConfigReader():
    def read(self, section, item, default):
        result = default
        try:
            if type(default == bool):
            if type(default) == bool:
                result = self.ConfigParser.getboolean(section, item)
            elif type(default) == int:
                result = self.ConfigParser.getint(section, item)
+36 −15
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ colRANKING= db['ranking']
colMSBULLETIN=  db['ms']
colCAPEC=       db['capec']
colMISP=        db['user_misp']
colPlugSettings=db['plugin_settings']

# Functions
def sanitize(x):
@@ -363,19 +364,39 @@ def getUsers():
def getUser(user):
  return sanitize(colUSERS.find_one({"username": user}))

# Plugins
###########
# Plugins #
###########
# Settings
def p_writeSetting(plugin, setting, value):
  colPlugSettings({"plugin": plugin}, {"$set": {setting: value}}, upsert=True)

def p_readSetting(plugin, setting):
  data = colPlugSettings.distinct(setting, {'plugin': plugin})
  if len(data) !=0: return data[0]
  else:             return None

# Query
def p_queryData(collection, query):
  return list(db['plug_%s'%collection].find(query))

def p_queryOne(collection, query):
  return db['plug_%s'%collection].find_one(query)

# Data manipulation
def p_addEntry(collection, data):
  db['plug_%s'%collection].insert(data)

def p_removeEntry(collection, query):
  db['plug_%s'%collection].remove(query)

def p_bulkUpdate(collection, keyword, data):
  if len(data)>0:
    bulk=db['plug_%s'%collection].initialize_ordered_bulk_op()
    for x in data:
      bulk.find({keyword: x[keyword]}).upsert().update({'$set': x})
    bulk.execute()

def p_addToList(collection, query, listname, data):
  if type(data) != list: data=[data]
  current = list(p_queryData(collection, query))
+17 −4
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ class PluginManager():
          # Load plugins
          i = importlib.import_module(x[0].replace("/", "."))
          plugin = getattr(i, x[0].split("/")[-1])()
          plugin.setUID(plugin.getName())
          plugin.setUID(plugin.getName().replace(" ", "_"))
          # Ensure UID's unique
          while True:
            if plugin.getUID() in uids: plugin.setUID(plugin.getUID()+"_")
@@ -65,6 +65,9 @@ class PluginManager():
      if self.plugins[plugin].isWebPlugin():  # Check if plugin is web plugin
        return self.plugins[plugin].onCVEAction(cve, action, **args)

  def getPlugins(self):
    return self.plugins.values()

  def getWebPlugins(self):
    webPlugins = []
    for plugin in self.plugins.values():
@@ -72,6 +75,14 @@ class PluginManager():
        webPlugins.append(plugin)
    return webPlugins

  def getWebPluginsWithPage(self):
    plugins = []
    for plug in self.getWebPlugins:
      page = plug.getPage()
      if page and page[0]: # Make sure there is a page
        plugins.append(plug)
    return plugins

  def getCVEActions(self, **args):
    actions = []
    for plugin in self.getWebPlugins():
@@ -90,9 +101,11 @@ class PluginManager():
  def openPage(self, name, **args):
    if name.strip() in self.plugins.keys(): # Check if plugin exists
      if self.plugins[name].isWebPlugin():  # Check if plugin is web plugin
        page, content = self.plugins[name].getPage(**args)
        if page:
          return ("plugins/%s"%page, content)
        pageInfo = self.plugins[name].getPage(**args)
        if type(pageInfo) == tuple:
          page, content = pageInfo
          if page: return ("plugins/%s"%page, content)
          else:    return None
        else:
          return ("error.html", {'status': {'except': 'plugin-page-missing'}})
    return ("error.html", {'status': {'except': 'plugin-not-loaded'}})
+4 −3
Original line number Diff line number Diff line
@@ -14,14 +14,15 @@ class Plugin():
  # Don't override
  def isWebPlugin(self):  return False
  # To override
  def loadSettings(self): pass
  def loadSettings(self, reader): pass
  def onDatabaseUpdate(self):     pass


class WebPlugin(Plugin):
  # Don't override
  def isWebPlugin(self):           return True
  # To override
  def getPage(self, **args):       return None
  def getPage(self, **args):       return (None, None)
  def getCVEActions(self, **args): return []
  # Functions based on user interaction
  def onCVEAction(self, action, **args): pass
+2 −2
Original line number Diff line number Diff line
@@ -328,9 +328,9 @@ def unseen(r):
@app.route('/_get_plugins', methods=['GET'])
def get_plugins():
    if not current_user.is_authenticated(): # Don't show plugins requiring auth if not authenticated
        plugins = [{"name": x.getName(), "link": x.getUID()} for x in plugManager.getWebPlugins() if not x.requiresAuth]
        plugins = [{"name": x.getName(), "link": x.getUID()} for x in plugManager.getWebPluginsWithPage() if not x.requiresAuth]
    else:
        plugins = [{"name": x.getName(), "link": x.getUID()} for x in plugManager.getWebPlugins()]
        plugins = [{"name": x.getName(), "link": x.getUID()} for x in plugManager.getWebPluginsWithPage()]
    return jsonify({"plugins": plugins})

@app.route('/plugin/_get_cve_actions', methods=['GET'])