Makes all dashboards (and all views under them) login_required by default.

Change-Id: I435a4cbca669a7fdb6fa9ac483984c3c5fb2a58d
This commit is contained in:
Gabriel Hurley 2012-01-12 16:47:41 -08:00
parent b4107997e5
commit af66c03e42
20 changed files with 29 additions and 43 deletions

View File

@ -29,6 +29,7 @@ import logging
from django.conf import settings
from django.conf.urls.defaults import patterns, url, include
from django.contrib.auth.decorators import login_required
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import reverse, RegexURLPattern
from django.utils.functional import SimpleLazyObject
@ -318,6 +319,11 @@ class Dashboard(Registry, HorizonComponent):
support for projects/tenants. If set to ``True`` this dashboard's
naviagtion will include a UI element that allows the user to select
project/tenant. Default: ``False``.
.. attribute:: public
Boolean value to determine whether this dashboard can be viewed
without being logged in. Defaults to ``False``.
"""
_registerable_class = Panel
name = ''
@ -327,6 +333,7 @@ class Dashboard(Registry, HorizonComponent):
default_panel = None
nav = True
supports_tenants = False
public = False
def __repr__(self):
return "<Dashboard: %s>" % self.__unicode__()
@ -399,6 +406,9 @@ class Dashboard(Registry, HorizonComponent):
urlpatterns += patterns('',
url(r'', include(default_panel._decorated_urls)))
# Require login if not public.
if not self.public:
_decorate_urlconf(urlpatterns, login_required)
# Apply access controls to all views in the patterns
roles = getattr(self, 'roles', [])
_decorate_urlconf(urlpatterns, require_roles, roles)

View File

@ -21,7 +21,6 @@
import logging
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django import shortcuts
from django.utils.translation import ugettext as _
from novaclient import exceptions as novaclient_exceptions

View File

@ -26,7 +26,6 @@ import os
from django import http
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django import shortcuts
from horizon import api

View File

@ -26,7 +26,6 @@ import logging
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from glance.common import exception as glance_exception
from novaclient import exceptions as novaclient_exceptions
@ -40,7 +39,6 @@ from .forms import UpdateImageForm, LaunchForm, DeleteImage
LOG = logging.getLogger(__name__)
@login_required
def index(request):
for f in (DeleteImage, ):
unused, handled = f.maybe_handle(request)
@ -74,7 +72,6 @@ def index(request):
'images': images})
@login_required
def launch(request, image_id):
def flavorlist():
try:
@ -140,7 +137,6 @@ def launch(request, image_id):
'quotas': quotas})
@login_required
def update(request, image_id):
try:
image = api.image_get_meta(request, image_id)

View File

@ -29,7 +29,6 @@ from django import http
from django import shortcuts
from django import template
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from glance.common import exception as glance_exception
from openstackx.api import exceptions as api_exceptions
@ -43,7 +42,6 @@ from horizon.dashboards.nova.images_and_snapshots.snapshots.forms import \
LOG = logging.getLogger(__name__)
@login_required
def index(request):
images = []
@ -63,7 +61,6 @@ def index(request):
{'images': images})
@login_required
def create(request, instance_id):
tenant_id = request.user.tenant_id
form, handled = CreateSnapshot.maybe_handle(request,

View File

@ -27,7 +27,6 @@ import logging
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from glance.common import exception as glance_exception
from novaclient import exceptions as novaclient_exceptions
@ -41,7 +40,6 @@ from horizon.dashboards.nova.images_and_snapshots.images.forms import \
LOG = logging.getLogger(__name__)
@login_required
def index(request):
for f in (DeleteImage, ):
unused, handled = f.maybe_handle(request)

View File

@ -27,7 +27,6 @@ import logging
from django import http
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.datastructures import SortedDict
from django.utils.translation import ugettext as _
import openstackx.api.exceptions as api_exceptions
@ -44,7 +43,6 @@ from horizon.dashboards.nova.instances_and_volumes.instances.forms import (
LOG = logging.getLogger(__name__)
@login_required
def index(request):
tenant_id = request.user.tenant_id
for f in (TerminateInstance, RebootInstance):
@ -97,7 +95,6 @@ def index(request):
'reboot_form': reboot_form})
@login_required
def refresh(request):
tenant_id = request.user.tenant_id
instances = []
@ -129,7 +126,6 @@ def refresh(request):
'reboot_form': reboot_form})
@login_required
def usage(request, tenant_id=None):
tenant_id = tenant_id or request.user.tenant_id
today = test.today()
@ -197,7 +193,6 @@ def usage(request, tenant_id=None):
content_type=mimetype)
@login_required
def console(request, instance_id):
tenant_id = request.user.tenant_id
try:
@ -219,7 +214,6 @@ def console(request, instance_id):
'horizon:nova:instances_and_volumes:instances:index')
@login_required
def vnc(request, instance_id):
tenant_id = request.user.tenant_id
try:
@ -236,7 +230,6 @@ def vnc(request, instance_id):
'horizon:nova:instances_and_volumes:instances:index')
@login_required
def update(request, instance_id):
tenant_id = request.user.tenant_id
try:
@ -263,7 +256,6 @@ def update(request, instance_id):
'form': form})
@login_required
def detail(request, instance_id):
tenant_id = request.user.tenant_id
try:

View File

@ -28,7 +28,6 @@ import logging
from django import http
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from django.utils.datastructures import SortedDict
from novaclient import exceptions as novaclient_exceptions
@ -47,7 +46,6 @@ CreateForm, DeleteForm, AttachForm, DetachForm)
LOG = logging.getLogger(__name__)
@login_required
def index(request):
for f in (TerminateInstance, PauseInstance, UnpauseInstance,
SuspendInstance, ResumeInstance, RebootInstance,

View File

@ -22,7 +22,6 @@ import logging
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from novaclient import exceptions as novaclient_exceptions
@ -34,7 +33,6 @@ from horizon.dashboards.nova.instances_and_volumes.volumes.forms \
LOG = logging.getLogger(__name__)
@login_required
def index(request):
delete_form, handled = DeleteForm.maybe_handle(request)
detach_form, handled = DetachForm.maybe_handle(request)
@ -59,7 +57,6 @@ def index(request):
'detach_form': detach_form})
@login_required
def detail(request, volume_id):
try:
volume = api.volume_get(request, volume_id)
@ -82,7 +79,6 @@ def detail(request, volume_id):
'instance': instance})
@login_required
def create(request):
create_form, handled = CreateForm.maybe_handle(request)
@ -94,7 +90,6 @@ def create(request):
'create_form': create_form})
@login_required
def attach(request, volume_id):
instances = api.server_list(request)
attach_form, handled = AttachForm.maybe_handle(request,

View File

@ -28,7 +28,6 @@ import warnings
from django import shortcuts
from django import template
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from horizon import api

View File

@ -15,11 +15,9 @@
# under the License.
from django import shortcuts
from django.contrib.auth.decorators import login_required
from horizon.dashboards.settings.tenant.forms import DownloadOpenRCForm
@login_required
def index(request):
form, handled = DownloadOpenRCForm.maybe_handle(request,
initial={'tenant': request.user.tenant_id})

View File

@ -15,10 +15,8 @@
# under the License.
from django import shortcuts
from django.contrib.auth.decorators import login_required
from horizon.dashboards.settings.tenant.forms import DownloadOpenRCForm
@login_required
def index(request):
return shortcuts.render(request, 'settings/user/settings.html', {})

View File

@ -22,7 +22,6 @@ import logging
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from novaclient import exceptions as api_exceptions

View File

@ -22,7 +22,6 @@ import logging
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from glance.common import exception as glance_exception
@ -34,7 +33,6 @@ from horizon.dashboards.syspanel.images.forms import (DeleteImage,
LOG = logging.getLogger(__name__)
@login_required
def index(request):
for f in (DeleteImage, ToggleImage):
form, handled = f.maybe_handle(request)
@ -67,7 +65,6 @@ def index(request):
'images': images})
@login_required
def update(request, image_id):
try:
image = api.image_get_meta(request, image_id)
@ -146,7 +143,6 @@ def update(request, image_id):
'form': form})
@login_required
def upload(request):
if request.method == "POST":
form = UploadImageForm(request.POST)

View File

@ -25,7 +25,6 @@ from django import template
from django import http
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response, redirect
from django.utils.translation import ugettext as _

View File

@ -22,7 +22,6 @@ import logging
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from horizon import api
from horizon import tables

View File

@ -25,7 +25,6 @@ import urlparse
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from openstackx.api import exceptions as api_exceptions

View File

@ -24,7 +24,6 @@ from django import shortcuts
from django import http
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from keystoneclient import exceptions as api_exceptions

View File

@ -22,7 +22,6 @@ import logging
from django import shortcuts
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _
from keystoneclient import exceptions as api_exceptions

View File

@ -21,13 +21,14 @@
import copy
from django.core.urlresolvers import NoReverseMatch
from django.test.client import Client
import horizon
from horizon import base
from horizon import exceptions
from horizon import test
from horizon import users
from horizon.base import Horizon
from horizon.users import User
class MyDash(horizon.Dashboard):
@ -91,7 +92,7 @@ class HorizonTests(test.TestCase):
self.assertEqual(repr(Horizon), "<Site: Horizon>")
dash = Horizon.get_dashboard('nova')
self.assertEqual(Horizon.get_default_dashboard(), dash)
user = User()
user = users.User()
self.assertEqual(Horizon.get_user_home(user), dash.get_absolute_url())
def test_dashboard(self):
@ -143,3 +144,19 @@ class HorizonTests(test.TestCase):
# The following two methods simply should not raise any exceptions
iter(urlpatterns)
reversed(urlpatterns)
class HorizonBaseViewTests(test.BaseViewTests):
def setUp(self):
super(HorizonBaseViewTests, self).setUp()
users.get_user_from_request = self._real_get_user_from_request
def test_public(self):
settings = horizon.get_dashboard("settings")
# Known to have no restrictions on it other than being logged in.
user_panel = settings.get_panel("user")
url = user_panel.get_absolute_url()
client = Client() # Get a clean, logged out client instance.
client.logout()
resp = client.get(url)
self.assertRedirectsNoFollow(resp, '/accounts/login/?next=/settings/')