# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from ipsilon.util.log import Log
from ipsilon.util.page import Page
from ipsilon.util.user import UserSession
from ipsilon.util.plugin import PluginLoader, PluginObject
from ipsilon.util.plugin import PluginInstaller
from ipsilon.info.common import Info
from ipsilon.util.cookies import SecureCookie
-from ipsilon.util.trans import Transaction
import cherrypy
USERNAME_COOKIE = 'ipsilon_default_username'
-class LoginManagerBase(PluginObject, Log):
+class LoginManagerBase(PluginObject):
def __init__(self):
super(LoginManagerBase, self).__init__()
+ self._site = None
self.path = '/'
self.next_login = None
self.info = None
+ self.is_enabled = False
def redirect_to_path(self, path):
base = cherrypy.config.get('base.mount', "")
if self.info:
userattrs = self.info.get_user_attrs(username)
if userdata:
- userdata.update(userattrs or {})
+ userdata.update(userattrs.get('userdata', {}))
else:
- userdata = userattrs
+ userdata = userattrs.get('userdata', {})
+
+ # merge groups and extras from login plugin and info plugin
+ userdata['groups'] = list(set(userdata.get('groups', []) +
+ userattrs.get('groups', [])))
+
+ userdata['extras'] = userdata.get('extras', {})
+ userdata['extras'].update(userattrs.get('extras', {}))
+
self.debug("User %s attributes: %s" % (username, repr(userdata)))
if auth_type:
raise NotImplementedError
def enable(self, site):
- plugins = site[FACILITY]
- if self in plugins['enabled']:
+ if self.is_enabled:
return
+ if not self._site:
+ self._site = site
+ plugins = self._site[FACILITY]
+
# configure self
if self.name in plugins['config']:
self.set_config(plugins['config'][self.name])
root.first_login = self
plugins['enabled'].append(self)
+ self.is_enabled = True
self._debug('Login plugin enabled: %s' % self.name)
# Get handle of the info plugin
self.info = root.info
def disable(self, site):
- plugins = site[FACILITY]
- if self not in plugins['enabled']:
+ if not self.is_enabled:
return
+ plugins = self._site[FACILITY]
+
# remove self from chain
root = plugins['root']
if root.first_login == self:
self.next_login = None
plugins['enabled'].remove(self)
+ self.is_enabled = False
self._debug('Login plugin disabled: %s' % self.name)
return self._template(self.formtemplate, **context)
def root(self, *args, **kwargs):
- self.trans = Transaction('login', **kwargs)
+ self.trans = self.get_valid_transaction('login', **kwargs)
op = getattr(self, cherrypy.request.method, self.GET)
if callable(op):
return op(*args, **kwargs)
if username is None:
username = ''
+ target = None
if self.trans is not None:
tid = self.trans.transaction_id
+ target = self.trans.retrieve().get('login_target')
if tid is None:
tid = ''
"description": self.lm.help_text,
"next_url": next_url,
"username": username,
+ "login_target": target,
+ "cancel_url": '%s/login/cancel?%s' % (self.basepath,
+ self.trans.get_GET_arg()),
}
context.update(kwargs)
if self.trans is not None:
def __init__(self, *args, **kwargs):
super(Login, self).__init__(*args, **kwargs)
+ self.cancel = Cancel(*args, **kwargs)
self.first_login = None
self.info = Info(self._site)
def root(self, *args, **kwargs):
if self.first_login:
- trans = Transaction('login', **kwargs)
+ trans = self.get_valid_transaction('login', **kwargs)
redirect = '%s/login/%s?%s' % (self.basepath,
self.first_login.path,
trans.get_GET_arg())
return self._template('logout.html', title='Logout')
+class Cancel(Page):
+
+ def GET(self, *args, **kwargs):
+
+ session = UserSession()
+ session.logout(None)
+
+ # return to the caller if any
+ transdata = self.get_valid_transaction('login', **kwargs).retrieve()
+ if 'login_return' not in transdata:
+ raise cherrypy.HTTPError(401)
+ raise cherrypy.HTTPRedirect(transdata['login_return'])
+
+ def root(self, *args, **kwargs):
+ op = getattr(self, cherrypy.request.method, self.GET)
+ if callable(op):
+ return op(*args, **kwargs)
+
+
class LoginMgrsInstall(object):
def __init__(self):