154 lines
5.6 KiB
Python
154 lines
5.6 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2011 United States Government as represented by the
|
|
# Administrator of the National Aeronautics and Space Administration.
|
|
# All Rights Reserved.
|
|
#
|
|
# Copyright 2011 Nebula, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import logging
|
|
|
|
from django import template
|
|
from django import shortcuts
|
|
from django.contrib import messages
|
|
|
|
from django_openstack import api
|
|
from django_openstack import forms
|
|
from openstackx.api import exceptions as api_exceptions
|
|
|
|
|
|
LOG = logging.getLogger('django_openstack.auth')
|
|
|
|
|
|
class Login(forms.SelfHandlingForm):
|
|
username = forms.CharField(max_length="20", label="User Name")
|
|
password = forms.CharField(max_length="20", label="Password",
|
|
widget=forms.PasswordInput(render_value=False))
|
|
|
|
def handle(self, request, data):
|
|
|
|
def is_admin(token):
|
|
for role in token.user['roles']:
|
|
if role['name'].lower() == 'admin':
|
|
return True
|
|
return False
|
|
|
|
try:
|
|
if data.get('tenant'):
|
|
token = api.token_create(request,
|
|
data.get('tenant'),
|
|
data['username'],
|
|
data['password'])
|
|
|
|
tenants = api.tenant_list_for_token(request, token.id)
|
|
tenant = None
|
|
for t in tenants:
|
|
if t.id == data.get('tenant'):
|
|
tenant = t
|
|
else:
|
|
# We are logging in without tenant
|
|
token = api.token_create(request,
|
|
'',
|
|
data['username'],
|
|
data['password'])
|
|
|
|
# Unscoped token
|
|
request.session['unscoped_token'] = token.id
|
|
|
|
def get_first_tenant_for_user():
|
|
for t in api.tenant_list_for_token(request, token.id):
|
|
# FIXME (anthony)
|
|
# keystone does the annoying 'always return everything
|
|
# for admin users thing' which causes the following
|
|
# annoying code block to exist (until that is fixed)
|
|
if is_admin(token):
|
|
for u in api.users_list_for_token_and_tenant(
|
|
request, token.id, t.id):
|
|
if u.name == data['username']:
|
|
return t
|
|
else:
|
|
return t
|
|
return None
|
|
|
|
# Get the tenant list, and log in using first tenant
|
|
# FIXME (anthony): add tenant chooser here?
|
|
tenant = get_first_tenant_for_user()
|
|
|
|
# Create a token
|
|
token = api.token_create_scoped_with_token(request,
|
|
data.get('tenant', tenant.id),
|
|
token.id)
|
|
|
|
request.session['admin'] = is_admin(token)
|
|
request.session['serviceCatalog'] = token.serviceCatalog
|
|
|
|
LOG.info('Login form for user "%s". Service Catalog data:\n%s' %
|
|
(data['username'], token.serviceCatalog))
|
|
|
|
request.session['tenant'] = tenant.name
|
|
request.session['tenant_id'] = tenant.id
|
|
request.session['token'] = token.id
|
|
request.session['user'] = data['username']
|
|
|
|
return shortcuts.redirect('dash_overview')
|
|
|
|
except api_exceptions.Unauthorized as e:
|
|
msg = 'Error authenticating: %s' % e.message
|
|
LOG.exception(msg)
|
|
messages.error(request, msg)
|
|
except api_exceptions.ApiException as e:
|
|
messages.error(request, 'Error authenticating with keystone: %s' %
|
|
e.message)
|
|
|
|
|
|
class LoginWithTenant(Login):
|
|
username = forms.CharField(max_length="20",
|
|
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
|
|
tenant = forms.CharField(widget=forms.HiddenInput())
|
|
|
|
|
|
def login(request):
|
|
if request.user and request.user.is_authenticated():
|
|
if request.user.is_admin():
|
|
return shortcuts.redirect('syspanel_overview')
|
|
else:
|
|
return shortcuts.redirect('dash_overview')
|
|
|
|
form, handled = Login.maybe_handle(request)
|
|
if handled:
|
|
return handled
|
|
|
|
return shortcuts.render_to_response('splash.html', {
|
|
'form': form,
|
|
}, context_instance=template.RequestContext(request))
|
|
|
|
|
|
def switch_tenants(request, tenant_id):
|
|
form, handled = LoginWithTenant.maybe_handle(
|
|
request, initial={'tenant': tenant_id,
|
|
'username': request.user.username})
|
|
if handled:
|
|
return handled
|
|
|
|
return shortcuts.render_to_response('switch_tenants.html', {
|
|
'to_tenant': tenant_id,
|
|
'form': form,
|
|
}, context_instance=template.RequestContext(request))
|
|
|
|
|
|
def logout(request):
|
|
request.session.clear()
|
|
return shortcuts.redirect('splash')
|