Browse Source

HUE-8888 [core] Adding a is_admin auth decorator

With a test suite
Romain 5 years ago
parent
commit
ad1a93509f

+ 39 - 0
desktop/core/src/desktop/auth/decorators.py

@@ -0,0 +1,39 @@
+
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you 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 json
+import logging
+
+from django.utils.functional import wraps
+from django.utils.translation import ugettext as _
+
+from desktop.auth.backend import is_admin
+from desktop.lib.exceptions_renderable import PopupException
+
+
+LOG = logging.getLogger(__name__)
+
+
+def admin_required(f):
+  @wraps(f)
+  def wrapper(request, *args, **kwargs):
+    if not is_admin(request.user):
+      raise PopupException(_("You must be an admin."), error_code=401)
+
+    return f(request, *args, **kwargs)
+  return wrapper

+ 54 - 0
desktop/core/src/desktop/auth/decorators_tests.py

@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+## -*- coding: utf-8 -*-
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you 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 sys
+import unittest
+
+from nose.tools import assert_equal, assert_true, assert_false, assert_raises
+
+from desktop.auth.decorators import admin_required
+from desktop.lib.django_test_util import make_logged_in_client
+from desktop.lib.exceptions_renderable import PopupException
+
+from useradmin.models import User, Group, Organization, orm_user_lookup
+
+if sys.version_info[0] > 2:
+  from unittest.mock import patch, Mock
+else:
+  from mock import patch, Mock
+
+
+class TestDecorator(unittest.TestCase):
+
+  @classmethod
+  def setUpClass(cls):
+    cls.client1 = make_logged_in_client(username='admin', recreate=True, is_superuser=True)
+    cls.client2 = make_logged_in_client(username='joe', recreate=True, is_superuser=False)
+
+
+  def test_user_group(self):
+    request = Mock(user=User.objects.get(**{orm_user_lookup(): 'admin'}))
+    hello(request)
+
+    request = Mock(user=User.objects.get(**{orm_user_lookup(): 'joe'}))
+    assert_raises(PopupException, hello, request)
+
+
+@admin_required
+def hello(request, *args, **kwargs):
+  return 'Hello'

+ 1 - 1
desktop/core/src/desktop/lib/connectors/api.py

@@ -98,7 +98,7 @@ def update_connector(request):
 
 # TODO: check if has perm
 def delete_connector(request):
-  connector = json.loads(request.POST.get('connector'), '{}')
+  connector = json.loads(request.POST.get('connector', '{}'))
 
   try:
     Connector.objects.get(id=connector['id']).delete()