Implement change registration
[cascardo/ipsilon.git] / ipsilon / providers / common.py
old mode 100755 (executable)
new mode 100644 (file)
index ead50e2..c4d6658
@@ -1,26 +1,12 @@
-#!/usr/bin/python
-#
-# Copyright (C) 2014  Simo Sorce <simo@redhat.com>
-#
-# see file 'COPYING' for use and warranty information
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# Copyright (C) 2014 Ipsilon project Contributors, for license see COPYING
 
 from ipsilon.util.log import Log
 from ipsilon.util.plugin import PluginInstaller, PluginLoader
-from ipsilon.util.plugin import PluginObject, PluginConfig
+from ipsilon.util.plugin import PluginObject
+from ipsilon.util.config import ConfigHelper
 from ipsilon.util.page import Page
+from ipsilon.util.page import admin_protect
+from ipsilon.rest.common import RestPage
 import cherrypy
 
 
@@ -39,80 +25,41 @@ class AuthenticationError(ProviderException):
     def __init__(self, message, code):
         super(AuthenticationError, self).__init__(message)
         self.code = code
-        self._debug('%s [%s]' % (message, code))
+        self.debug('%s [%s]' % (message, code))
 
 
 class InvalidRequest(ProviderException):
 
     def __init__(self, message):
         super(InvalidRequest, self).__init__(message)
-        self._debug(message)
+        self.debug(message)
 
 
-class ProviderBase(PluginConfig, PluginObject):
+class ProviderBase(ConfigHelper, PluginObject):
 
-    def __init__(self, name, path):
-        PluginConfig.__init__(self)
-        PluginObject.__init__(self)
+    def __init__(self, name, path, *pargs):
+        ConfigHelper.__init__(self)
+        PluginObject.__init__(self, *pargs)
         self.name = name
+        self._root = None
         self.path = path
         self.tree = None
-        self.is_enabled = False
-
-    def on_enable(self):
-        # this one does nothing
-        # derived classes can override with custom behavior
-        return
 
     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.import_config(plugins['config'][self.name])
+    def register(self, root, site):
 
+        self._root = root
         # init pages and admin interfaces
         self.tree = self.get_tree(site)
+        self.debug('IdP Provider registered: %s' % self.name)
 
-        self._debug('IdP Provider registered: %s' % self.name)
-
-        if self.get_config_value('enabled') is True:
-            # and enable self
-            self._enable(site)
-
-    def _enable(self, site):
-        root = site[FACILITY]['root']
-        root.add_subtree(self.name, self.tree)
-        self._debug('IdP Provider enabled: %s' % self.name)
-        self.is_enabled = True
-        self.on_enable()
-
-    def enable(self, site):
-        if self.is_enabled:
-            return
-
-        self._enable(site)
-        self.set_config_value('enabled', True)
-        self.save_plugin_config(FACILITY)
-
-    def disable(self, site):
-        if not self.is_enabled:
-            return
-
-        # remove self to the root
-        root = site[FACILITY]['root']
-        root.del_subtree(self.name)
+    def on_enable(self):
+        self._root.add_subtree(self.name, self.tree)
 
-        self.is_enabled = False
-        self.set_config_value('enabled', False)
-        self.save_plugin_config(FACILITY)
-        self._debug('IdP Provider disabled: %s' % self.name)
+    def on_disable(self):
+        self._root.del_subtree(self.name)
 
 
 class ProviderPageBase(Page):
@@ -141,9 +88,9 @@ class ProviderPageBase(Page):
         else:
             raise cherrypy.HTTPError(405)
 
-    def _debug(self, fact):
+    def debug(self, fact):
         superfact = '%s: %s' % (self.plugin_name, fact)
-        super(ProviderPageBase, self)._debug(superfact)
+        super(ProviderPageBase, self).debug(superfact)
 
     def _audit(self, fact):
         cherrypy.log('%s: %s' % (self.plugin_name, fact))
@@ -152,24 +99,92 @@ class ProviderPageBase(Page):
 FACILITY = 'provider_config'
 
 
+class ProviderInstaller(object):
+    def __init__(self):
+        self.facility = FACILITY
+        self.ptype = 'provider'
+        self.name = None
+
+    def unconfigure(self, opts, changes):
+        return
+
+    def install_args(self, group):
+        raise NotImplementedError
+
+    def validate_args(self, args):
+        return
+
+    def configure(self, opts, changes):
+        raise NotImplementedError
+
+
 class LoadProviders(Log):
 
     def __init__(self, root, site):
-        loader = PluginLoader(LoadProviders, FACILITY, 'IdpProvider')
-        site[FACILITY] = loader.get_plugin_data()
-        providers = site[FACILITY]
+        plugins = PluginLoader(LoadProviders, FACILITY, 'IdpProvider')
+        plugins.get_plugin_data()
+        site[FACILITY] = plugins
 
-        available = providers['available'].keys()
-        self._debug('Available providers: %s' % str(available))
+        available = plugins.available.keys()
+        self.debug('Available providers: %s' % str(available))
 
-        providers['root'] = root
-        for item in providers['available']:
-            plugin = providers['available'][item]
-            plugin.register(site)
+        for item in plugins.available:
+            plugin = plugins.available[item]
+            plugin.register(root, site)
+
+        for item in plugins.enabled:
+            self.debug('Provider plugin in enabled list: %s' % item)
+            if item not in plugins.available:
+                continue
+            plugins.available[item].enable()
 
 
 class ProvidersInstall(object):
 
     def __init__(self):
-        pi = PluginInstaller(ProvidersInstall)
+        pi = PluginInstaller(ProvidersInstall, FACILITY)
         self.plugins = pi.get_plugins()
+
+
+class RestProviderBase(RestPage):
+
+    def __init__(self, site, config):
+        super(RestProviderBase, self).__init__(site)
+        self.plugin_name = config.name
+        self.cfg = config
+
+    @admin_protect
+    def GET(self, *args, **kwargs):
+        raise cherrypy.HTTPError(501)
+
+    @admin_protect
+    def POST(self, *args, **kwargs):
+        raise cherrypy.HTTPError(501)
+
+    @admin_protect
+    def DELETE(self, *args, **kwargs):
+        raise cherrypy.HTTPError(501)
+
+    @admin_protect
+    def PUT(self, *args, **kwargs):
+        raise cherrypy.HTTPError(501)
+
+    def root(self, *args, **kwargs):
+        method = cherrypy.request.method
+
+        preop = getattr(self, 'pre_%s' % method, None)
+        if preop and callable(preop):
+            preop(*args, **kwargs)
+
+        op = getattr(self, method, self.GET)
+        if callable(op):
+            return op(*args, **kwargs)
+        else:
+            raise cherrypy.HTTPError(405)
+
+    def debug(self, fact):
+        superfact = '%s: %s' % (self.plugin_name, fact)
+        super(RestProviderBase, self).debug(superfact)
+
+    def _audit(self, fact):
+        cherrypy.log('%s: %s' % (self.plugin_name, fact))