Browse Source

HUE-8758 [connector] Revamp the test suite to use real objects

Fix a few permission bugs at the same time.
Romain 5 years ago
parent
commit
c0ef563f1a

+ 4 - 1
apps/useradmin/src/useradmin/models.py

@@ -110,7 +110,10 @@ class UserProfile(models.Model):
     if self.user.is_superuser:
     if self.user.is_superuser:
       return True
       return True
     if ENABLE_CONNECTORS.get() and app in ('jobbrowser', 'metastore', 'filebrowser', 'indexer', 'useradmin', 'notebook'):
     if ENABLE_CONNECTORS.get() and app in ('jobbrowser', 'metastore', 'filebrowser', 'indexer', 'useradmin', 'notebook'):
-      return True
+      if app == 'useradmin' and action == 'superuser':
+        return False
+      else:
+        return True
 
 
     group_ids = self.user.groups.values_list('id', flat=True)
     group_ids = self.user.groups.values_list('id', flat=True)
     return GroupPermission.objects.filter(group__id__in=group_ids, hue_permission=perm).exists()
     return GroupPermission.objects.filter(group__id__in=group_ids, hue_permission=perm).exists()

+ 5 - 3
desktop/core/src/desktop/auth/backend.py

@@ -108,25 +108,27 @@ def rewrite_user(user):
 
 
 def is_admin(user):
 def is_admin(user):
   """
   """
-  Admin of the Organization. Typically can edit users, connectors.
+  Admin of the Organization. Typically can edit users, connectors...
   To rename to is_org_admin at some point.
   To rename to is_org_admin at some point.
 
 
   If ENABLE_ORGANIZATIONS is false:
   If ENABLE_ORGANIZATIONS is false:
-    - Hue superusers are automaticall also admin
+    - Hue superusers are automatically also admin
 
 
   If ENABLE_ORGANIZATIONS is true:
   If ENABLE_ORGANIZATIONS is true:
     - Hue superusers might not be admin of the organization
     - Hue superusers might not be admin of the organization
   """
   """
   is_admin = False
   is_admin = False
+
   if hasattr(user, 'is_superuser') and not ENABLE_ORGANIZATIONS.get():
   if hasattr(user, 'is_superuser') and not ENABLE_ORGANIZATIONS.get():
     is_admin = user.is_superuser
     is_admin = user.is_superuser
+
   if not is_admin and user.is_authenticated():
   if not is_admin and user.is_authenticated():
     try:
     try:
       user = rewrite_user(user)
       user = rewrite_user(user)
-        # Either via flag or Admin group
       is_admin = user.is_admin if ENABLE_ORGANIZATIONS.get() else user.has_hue_permission(action="superuser", app="useradmin")
       is_admin = user.is_admin if ENABLE_ORGANIZATIONS.get() else user.has_hue_permission(action="superuser", app="useradmin")
     except Exception:
     except Exception:
       LOG.exception("Could not validate if %s is a superuser, assuming False." % user)
       LOG.exception("Could not validate if %s is a superuser, assuming False." % user)
+
   return is_admin
   return is_admin
 
 
 
 

+ 5 - 6
desktop/core/src/desktop/lib/connectors/models.py

@@ -102,6 +102,10 @@ def _get_installed_connectors(category=None, categories=None, dialect=None, inte
     _create_connector_examples()
     _create_connector_examples()
 
 
   connectors = []
   connectors = []
+  connectors_objects = Connector.objects.all()
+  if user is not None and not is_admin(user):  # Apply Permissions
+    connectors_objects = connectors_objects.filter(huepermission__in=user.get_permissions())
+
   connector_instances = [
   connector_instances = [
       {
       {
         'id': connector.id,
         'id': connector.id,
@@ -112,7 +116,7 @@ def _get_installed_connectors(category=None, categories=None, dialect=None, inte
         'settings': json.loads(connector.settings),
         'settings': json.loads(connector.settings),
         'is_demo': False,
         'is_demo': False,
       }
       }
-      for connector in Connector.objects.all()
+      for connector in connectors_objects
   ]
   ]
 
 
   for connector in connector_instances:
   for connector in connector_instances:
@@ -152,11 +156,6 @@ def _get_installed_connectors(category=None, categories=None, dialect=None, inte
   if interface is not None:
   if interface is not None:
     connectors = [connector for connector in connectors if connector['interface'] == interface]
     connectors = [connector for connector in connectors if connector['interface'] == interface]
 
 
-  # Apply Permissions
-  if user is not None and not is_admin(user):
-    allowed_connectors = user.get_permissions().values_list('app', flat=True)
-    connectors = [connector for connector in connectors if connector['id'] in allowed_connectors]
-
   return connectors
   return connectors
 
 
 
 

+ 16 - 22
desktop/core/src/desktop/lib/connectors/tests.py

@@ -16,18 +16,20 @@
 # See the License for the specific language governing permissions and
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # limitations under the License.
 
 
+import json
 import sys
 import sys
 import unittest
 import unittest
 
 
 from nose.plugins.skip import SkipTest
 from nose.plugins.skip import SkipTest
 from nose.tools import assert_equal, assert_true, assert_false
 from nose.tools import assert_equal, assert_true, assert_false
 
 
-from desktop.auth.backend import rewrite_user
+from desktop.auth.backend import rewrite_user, is_admin
 from desktop.conf import ENABLE_CONNECTORS
 from desktop.conf import ENABLE_CONNECTORS
 from desktop.lib.connectors.api import _get_installed_connectors
 from desktop.lib.connectors.api import _get_installed_connectors
 from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.django_test_util import make_logged_in_client
 
 
-from useradmin.models import User, update_app_permissions, get_default_user_group
+from useradmin.models import User, update_app_permissions, get_default_user_group, Connector
+from useradmin.permissions import HuePermission, GroupPermission
 
 
 
 
 if sys.version_info[0] > 2:
 if sys.version_info[0] > 2:
@@ -100,15 +102,10 @@ class TestConnectorListing(unittest.TestCase):
 
 
   def test_get_installed_editor_connectors(self):
   def test_get_installed_editor_connectors(self):
 
 
-    with patch('desktop.lib.connectors.models.CONNECTORS.get') as CONNECTORS:
-      CONNECTORS.return_value = {
-        'mysql-1': Mock(
-          NICE_NAME=Mock(get=Mock(return_value='MySql')),
-          DIALECT=Mock(get=Mock(return_value='mysql')),
-          INTERFACE=Mock(get=Mock(return_value='sqlalchemy')),
-          SETTINGS=Mock(get=Mock(return_value=[{"name": "url", "value": "mysql://hue:pwd@hue:3306/hue"}])),
-        )
-      }
+    with patch('desktop.lib.connectors.models.Connector.objects.all') as ConnectorObjectsAll:
+      ConnectorObjectsAll.return_value = [
+        Connector(name='MySql', dialect='mysql', settings=json.dumps([{"name": "url", "value": "mysql://hue:pwd@hue:3306/hue"}]))
+      ]
 
 
       connectors = _get_installed_connectors()
       connectors = _get_installed_connectors()
 
 
@@ -118,21 +115,18 @@ class TestConnectorListing(unittest.TestCase):
 
 
 
 
   def test_get_connectors_for_user(self):
   def test_get_connectors_for_user(self):
+    connector = Connector.objects.create(name='MySql', dialect='mysql', settings=json.dumps([{"name": "url", "value": "mysql://hue:pwd@hue:3306/hue"}]))
 
 
-    with patch('desktop.lib.connectors.models.CONNECTORS.get') as CONNECTORS:
-      CONNECTORS.return_value = {
-        'mysql-1': Mock(
-          NICE_NAME=Mock(get=Mock(return_value='MySql')),
-          DIALECT=Mock(get=Mock(return_value='mysql')),
-          INTERFACE=Mock(get=Mock(return_value='sqlalchemy')),
-          SETTINGS=Mock(get=Mock(return_value=[{"name": "url", "value": "mysql://hue:pwd@hue:3306/hue"}])),
-        )
-      }
-
-      update_app_permissions()
+    # Could leverate update_app_permissions() instead of adding manually the permission but this is more lightweight for now
+    conn_perm = HuePermission.objects.create(app=connector.name, action='access', description='', connector=connector)
+    default_group = get_default_user_group()
+    GroupPermission.objects.create(group=default_group, hue_permission=conn_perm)
 
 
+    try:
       connectors = _get_installed_connectors(user=self.user)
       connectors = _get_installed_connectors(user=self.user)
       assert_true(connectors, connectors)
       assert_true(connectors, connectors)
 
 
       connectors = _get_installed_connectors(user=self.alone_user)
       connectors = _get_installed_connectors(user=self.alone_user)
       assert_false(connectors, connectors)
       assert_false(connectors, connectors)
+    finally:
+      connector.delete()