Change provider plugins registration and enablement
[cascardo/ipsilon.git] / ipsilon / providers / common.py
index 4599735..b1eab1a 100755 (executable)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 from ipsilon.util.plugin import PluginLoader, PluginObject
+from ipsilon.util.plugin import PluginInstaller
 from ipsilon.util.page import Page
 import cherrypy
 
 
+class ProviderException(Exception):
+
+    def __init__(self, message):
+        super(ProviderException, self).__init__(message)
+        self.message = message
+
+    def __str__(self):
+        return repr(self.message)
+
+    def _debug(self, fact):
+        if cherrypy.config.get('debug', False):
+            cherrypy.log('%s: %s' % (self.__class__.__name__, fact))
+
+
 class ProviderBase(PluginObject):
 
     def __init__(self, name, path):
         super(ProviderBase, self).__init__()
         self.name = name
         self.path = path
+        self.tree = None
+        self.admin = None
+
+    def _debug(self, fact):
+        if cherrypy.config.get('debug', False):
+            cherrypy.log(fact)
+
+    def get_tree(self, site):
+        raise NotImplementedError
+
+    def register(self, site):
+        if self.tree:
+            # already registered
+            return
+
+        # configure self
+        plugins = site[FACILITY]
+        if self.name in plugins['config']:
+            self.set_config(plugins['config'][self.name])
+
+        # init pages and admin interfaces
+        self.tree = self.get_tree(site)
+
+        self._debug('IdP Provider registered: %s' % self.name)
+
+        if self.get_config_value('enabled') == '1':
+            # and add self to the root
+            root = site[FACILITY]['root']
+            root.add_subtree(self.name, self.tree)
+            self._debug('IdP Provider enabled: %s' % self.name)
+
+    @property
+    def is_enabled(self):
+        if self.get_config_value('enabled') == '1':
+            return True
+        return False
+
+    def enable(self, site):
+        if self.is_enabled:
+            return
+
+        # and add self to the root
+        root = site[FACILITY]['root']
+        root.add_subtree(self.name, self.tree)
+
+        self.set_config_value('enabled', '1')
+        self.save_plugin_config(FACILITY)
+        self._debug('IdP Provider enabled: %s' % self.name)
+
+    def disable(self, site):
+        if not self.is_enabled:
+            return
+
+        # remove self to the root
+        root = site[FACILITY]['root']
+        root.del_subtree(self.name)
+
+        self.set_config_value('enabled', '0')
+        self.save_plugin_config(FACILITY)
+        self._debug('IdP Provider disabled: %s' % self.name)
 
 
 class ProviderPageBase(Page):
@@ -71,17 +146,18 @@ class LoadProviders(object):
         available = providers['available'].keys()
         self._debug('Available providers: %s' % str(available))
 
-        for item in providers['whitelist']:
-            self._debug('IdP Provider in whitelist: %s' % item)
-            if item not in providers['available']:
-                continue
-            self._debug('IdP Provider enabled: %s' % item)
-            providers['enabled'].append(item)
-            provider = providers['available'][item]
-            if item in providers['config']:
-                provider.set_config(providers['config'][item])
-            root.__dict__[item] = provider.get_tree(site)
+        providers['root'] = root
+        for item in providers['available']:
+            plugin = providers['available'][item]
+            plugin.register(site)
 
     def _debug(self, fact):
         if cherrypy.config.get('debug', False):
             cherrypy.log(fact)
+
+
+class ProvidersInstall(object):
+
+    def __init__(self):
+        pi = PluginInstaller(ProvidersInstall)
+        self.plugins = pi.get_plugins()