Эх сурвалжийг харах

HUE-8377 [security] Support new Sentry finer grain privileges

Enrico Berti 7 жил өмнө
parent
commit
7c71df6706

+ 18 - 1
apps/security/src/security/static/security/js/hive.ko.js

@@ -825,7 +825,24 @@ var HiveViewModel = (function () {
     self.isApplyingBulk = ko.observable(false);
 
     self.availablePrivileges = ko.observableArray(['SERVER', 'DATABASE', 'TABLE', 'COLUMN']);
-    self.availableActions = ko.observableArray(['SELECT', 'INSERT', 'ALL']);
+
+    self.availableActions = function(scope) {
+      var actions = ['SELECT', 'INSERT', 'ALL'];
+      var databaseActions = ['CREATE'];
+      var tableActions = ['REFRESH', 'ALTER', 'DROP'];
+      switch (scope) {
+        case 'SERVER':
+          actions = actions.concat(databaseActions).concat(tableActions);
+          break;
+        case 'DATABASE':
+          actions = actions.concat(databaseActions);
+          break;
+        case 'TABLE':
+          actions = actions.concat(tableActions);
+          break;
+      }
+      return ko.observableArray(actions.sort());
+    }
 
     self.privilegeFilter = ko.observable("");
 

+ 19 - 3
apps/security/src/security/static/security/js/sentry.ko.js

@@ -864,15 +864,31 @@ var SentryViewModel = (function () {
     self.isApplyingBulk = ko.observable(false);
 
     self.availablePrivileges = ko.observableArray();
-    self.availableActions = ko.observableArray();
     self.availableSolrConfigActions = ko.observableArray();
     if (initial.component == 'solr') {
-      self.availableActions(['QUERY', 'UPDATE', 'ALL']);
+      self.availableActions = function () {
+        return ko.observableArray(['QUERY', 'UPDATE', 'ALL']);
+      }
       self.availableSolrConfigActions(['ALL']);
     } else {
-      self.availableActions(['SELECT', 'INSERT', 'ALL']);
+      self.availableActions = function (authorizables) {
+        var actions = ['SELECT', 'INSERT', 'ALL'];
+        var databaseActions = ['CREATE'];
+        var tableActions = ['REFRESH', 'ALTER', 'DROP'];
+        if (authorizables.length === 0) {
+          actions = actions.concat(databaseActions).concat(tableActions);
+        }
+        else if (authorizables.length === 1) {
+          actions = actions.concat(databaseActions);
+        }
+        else {
+          actions = actions.concat(tableActions);
+        }
+        return ko.observableArray(actions.sort());
+      }
     }
 
+
     self.privilegeFilter = ko.observable("");
 
     // Models

+ 2 - 2
apps/security/src/security/templates/hive.mako

@@ -58,7 +58,7 @@ ${ layout.menubar(section='hive1', is_embeddable=is_embeddable) }
     </div>
 
     <div class="inline-block" style="vertical-align: middle">
-      <a class="pointer" style="padding-top: 4px" data-bind="click: function(){ privilegeType('db'); action($root.availableActions()[0]) }">
+      <a class="pointer" style="padding-top: 4px" data-bind="click: function(){ privilegeType('db'); action($root.availableActions(privilegeScope())[0]) }">
         <i class="fa fa-fw fa-1halfx muted" data-bind="css: {'fa-circle-o': privilegeType() != 'db' , 'fa-check-circle-o': privilegeType() == 'db'}"></i>
       </a>
     </div>
@@ -71,7 +71,7 @@ ${ layout.menubar(section='hive1', is_embeddable=is_embeddable) }
     </div>
     <input type="text" data-bind="filechooser: $data.URI, enable: privilegeType() == 'uri', valueUpdate: 'afterkeydown'" placeholder="URI">
 
-    <select data-bind="options: $root.availableActions, value: $data.action, enable: (privilegeType() == 'db')" style="width: 100px; margin-bottom: 0"></select>
+    <select data-bind="options: $root.availableActions(privilegeScope()), value: $data.action, enable: (privilegeType() == 'db')" style="width: 100px; margin-bottom: 0"></select>
 
     <div class="new-line-if-small">
       <label class="checkbox"><input type="checkbox" data-bind="checked: grantOption"> ${ _('With grant') }</label>

+ 3 - 3
apps/security/src/security/templates/sentry.mako

@@ -61,7 +61,7 @@ ${ layout.menubar(section=component, is_embeddable=is_embeddable) }
 
     <!-- ko if: $root.component() == 'hive' -->
       <div class="inline-block" style="vertical-align: middle">
-        <a class="pointer" style="padding-top: 4px" data-bind="click: function(){ privilegeType('DATABASE'); action($root.availableActions()[0]) }">
+        <a class="pointer" style="padding-top: 4px" data-bind="click: function(){ privilegeType('DATABASE'); action($root.availableActions(authorizables())[0]) }">
           <i class="fa fa-fw fa-1halfx muted" data-bind="css: {'fa-circle-o': privilegeType() != 'DATABASE', 'fa-check-circle-o': privilegeType() == 'DATABASE'}"></i>
         </a>
       </div>
@@ -75,12 +75,12 @@ ${ layout.menubar(section=component, is_embeddable=is_embeddable) }
 
       <input type="text" data-bind="filechooser: 'URI TODO', enable: privilegeType() == 'URI'" placeholder="URI">
 
-      <select data-bind="options: $root.availableActions, value: $data.action, enable: (privilegeType() == 'DATABASE')" style="width: 100px; margin-bottom: 0"></select>
+      <select data-bind="options: $root.availableActions(authorizables()), value: $data.action, enable: (privilegeType() == 'DATABASE')" style="width: 100px; margin-bottom: 0"></select>
     <!-- /ko -->
 
     <!-- ko if: $root.component() == 'solr' -->
       <input type="text" class="input-xxlarge" data-bind="solrchooser: $data.path" placeholder="collection or config name <CTRL+SPACE>">
-      <select data-bind="options: privilegeType() == 'CONFIG' ? $root.availableSolrConfigActions : $root.availableActions, value: $data.action, enable: privilegeType() != 'CONFIG'" style="width: 100px; margin-bottom: 0"></select>
+      <select data-bind="options: privilegeType() == 'CONFIG' ? $root.availableSolrConfigActions : $root.availableActions(authorizables()), value: $data.action, enable: privilegeType() != 'CONFIG'" style="width: 100px; margin-bottom: 0"></select>
     <!-- /ko -->
 
     <div class="new-line-if-small">