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

[security] Harmonize tree and roles section of Hive

Romain Rigaux 11 жил өмнө
parent
commit
01496cb

+ 5 - 2
apps/security/src/security/api/hive.py

@@ -122,8 +122,11 @@ def save_privileges(request):
     for privilege in deleted_privileges:
       print _drop_sentry_privilege(request.user, role, privilege)
     
-    modified_privileges = [privilege for privilege in role['privilegesChanged'] if privilege['status'] == 'modified']
-    
+    # todo
+#    modified_privileges = [privilege for privilege in role['privilegesChanged'] if privilege['status'] == 'modified']
+# delete modified_privileges "names"
+#    result['privileges'] += _hive_add_privileges(request.user, role, modified_privileges)
+
     result['message'] = ''
     result['status'] = 0
   except Exception, e:

+ 2 - 3
apps/security/src/security/templates/hdfs.mako

@@ -99,12 +99,11 @@ ${ layout.menubar(section='hdfs') }
                 <div class="clearfix"></div>
                 <div class="tree-toolbar">
                   <div class="pull-right">
-
                     <div class="dropdown inline-block" style="margin-right: 6px">
                       <a class="dropdown-toggle" data-toggle="dropdown" href="#"><i class="fa fa-eye-slash" data-bind="visible: $root.assist.isDiffMode"></i><i class="fa fa-eye" data-bind="visible: ! $root.assist.isDiffMode()"></i> <span data-bind="visible: $root.assist.isDiffMode">${ _('Show non accessible files for') }</span><span data-bind="visible: ! $root.assist.isDiffMode()">${ _('Impersonate the user') }</span></a>
                       <ul class="dropdown-menu">
-                        <li data-bind="visible: ! $root.assist.isDiffMode(), click: function() { $root.assist.isDiffMode(true); }"><a tabindex="-1" href="#">${ _('Show non accessible files for') } <strong data-bind="text: $root.doAs"></strong></a></li>
-                        <li data-bind="visible: $root.assist.isDiffMode(), click: function() { $root.assist.isDiffMode(false); }"><a tabindex="-1" href="#">${ _('Impersonate the user') } <strong data-bind="text: $root.doAs"></strong></a></li>
+                        <li data-bind="visible: ! $root.assist.isDiffMode(), click: function() { $root.assist.isDiffMode(true); }"><a tabindex="-1" href="#">${ _('Show non accessible files') }</a></li>
+                        <li data-bind="visible: $root.assist.isDiffMode(), click: function() { $root.assist.isDiffMode(false); }"><a tabindex="-1" href="#">${ _('Impersonate the user') }</a></li>
                       </ul>
                     </div>
                     <select class="user-list" data-bind="options: $root.selectableHadoopUsers, select2: { placeholder: '${ _("Select a user") }', update: $root.doAs, type: 'user'}" style="width: 120px"></select>

+ 27 - 22
apps/security/src/security/templates/hive.mako

@@ -59,17 +59,20 @@ ${ layout.menubar(section='hive') }
 </tr>
 </script>
 
-
-
-
 <div class="container-fluid">
   <div class="row-fluid">
     <div class="span2">
       <div class="sidebar-nav">
         <ul class="nav nav-list">
           <li class="nav-header">${ _('Privileges') }</li>
-          <li class="active"><a href="#edit"><i class="fa fa-pencil"></i> ${ _('Edit') }</a></li>
+          <li class="active"><a href="#edit"><i class="fa fa-sitemap  fa-rotate-270"></i> ${ _('Browse') }</a></li>
           <li><a href="#roles"><i class="fa fa-cubes"></i> ${ _('Roles') }</a></li>
+          <li class="nav-header"><i class="fa fa-group"></i> ${ _('Groups') }
+            </br>
+            <input type="checkbox" checked> All
+            </br>
+            <select data-bind="options: $root.selectableHadoopGroups" size="10" multiple="true"></select>
+          </li>          
           <li class="nav-header"><i class="fa fa-group"></i> ${ _('Server') }
             <input type="text" data-bind="value: $root.assist.server" class="input-small" />
           </li>
@@ -81,7 +84,7 @@ ${ layout.menubar(section='hive') }
 
       <div id="edit" class="mainSection card card-small">
         <h1 class="card-heading simple">
-          ${ _('Edit privileges') }
+          ${ _('Database and Tables privileges') }
         </h1>
 
         <div class="card-body">
@@ -97,12 +100,20 @@ ${ layout.menubar(section='hive') }
                 <div class="clearfix"></div>
                 <div class="tree-toolbar">
                   <div class="pull-right">
-
                     <div class="dropdown inline-block" style="margin-right: 6px">
-                      <a class="dropdown-toggle" data-toggle="dropdown" href="#"><i class="fa fa-eye-slash" data-bind="visible: $root.assist.isDiffMode"></i><i class="fa fa-eye" data-bind="visible: ! $root.assist.isDiffMode()"></i> <span data-bind="visible: $root.assist.isDiffMode">${ _('Show non accessible paths for') }</span><span data-bind="visible: ! $root.assist.isDiffMode()">${ _('Impersonate the user') }</span></a>
+                      <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                        <i class="fa fa-eye-slash" data-bind="visible: $root.assist.isDiffMode"></i>
+                        <i class="fa fa-eye" data-bind="visible: ! $root.assist.isDiffMode()"></i>
+                        <span data-bind="visible: $root.assist.isDiffMode">${ _('Show non accessible paths for') }</span>
+                        <span data-bind="visible: ! $root.assist.isDiffMode()">${ _('Impersonate the user') }</span>
+                      </a>
                       <ul class="dropdown-menu">
-                        <li data-bind="visible: ! $root.assist.isDiffMode(), click: function() { $root.assist.isDiffMode(true); }"><a tabindex="-1" href="#">${ _('Show non accessible paths for') } <strong data-bind="text: $root.doAs"></strong></a></li>
-                        <li data-bind="visible: $root.assist.isDiffMode(), click: function() { $root.assist.isDiffMode(false); }"><a tabindex="-1" href="#">${ _('Impersonate the user') } <strong data-bind="text: $root.doAs"></strong></a></li>
+                        <li data-bind="visible: ! $root.assist.isDiffMode(), click: function() { $root.assist.isDiffMode(true); }">
+                          <a tabindex="-1" href="#">${ _('Show non accessible paths for') }</a>
+                        </li>
+                        <li data-bind="visible: $root.assist.isDiffMode(), click: function() { $root.assist.isDiffMode(false); }">
+                          <a tabindex="-1" href="#">${ _('Impersonate the user') }</a>
+                        </li>
                       </ul>
                     </div>
                     <select class="user-list" data-bind="options: $root.selectableHadoopUsers, select2: { placeholder: '${ _("Select a user") }', update: $root.doAs, type: 'user'}" style="width: 120px"></select>
@@ -119,15 +130,11 @@ ${ layout.menubar(section='hive') }
               </div>
 
               ${ tree.render(id='hdfsTree', data='$root.assist.treeData', afterRender='$root.assist.afterRender') }
+
             </div>
             <div class="span4">
-              <span data-bind="text: ko.mapping.toJSON($root.assist.privilege)"></span>
-              <!-- ko if: $root.assist.privilege() -->
-                sentry_privileges: <span data-bind="text: $root.assist.privilege.sentry_privileges"></span>
-                message: <span data-bind="text: $root.assist.privilege.message"></span>
-              <!-- /ko -->
-
-
+               <table data-bind="template: { name: 'privilege', foreach: $root.assist.privileges }">
+               </table>
             </div>
           </div>
         </div>
@@ -166,7 +173,7 @@ ${ layout.menubar(section='hive') }
             </div>
             <div class="span7">
               Privileges
-              <div data-bind="template: { name: 'privilege', foreach: privileges}">
+              <div data-bind="template: { name: 'privilege', foreach: privileges }">
               </div>
               <a href="javascript: void(0)" data-bind="click: addPrivilege">
                 <i class="fa fa-plus"></i>
@@ -174,7 +181,7 @@ ${ layout.menubar(section='hive') }
             </div>
             <div class="span4">
               Groups
-              <select data-bind="options: $root.availableHadoopGroups, selectedOptions: groups" size="5" multiple="true"></select>
+              <select data-bind="options: $root.selectableHadoopGroups, selectedOptions: groups" size="5" multiple="true"></select>
             </div>
             <button type="button" rel="tooltip" data-placement="bottom" data-loading-text="${ _('Saving...') }" data-original-title="${ _('Save') }" class="btn"
                 data-bind="click: $root.role.create">
@@ -182,8 +189,6 @@ ${ layout.menubar(section='hive') }
             </button>
           </div>
 
-
-
         <table>
           <theader>
             <th style="width:1%"><div class="hueCheckbox selectAll fa"></div></th>
@@ -199,7 +204,7 @@ ${ layout.menubar(section='hive') }
               </td>
               <td>
                 <a href="javascript:void(0);">
-                  <i class="fa fa-2x" data-bind="click: $root.list_sentry_privileges_by_role, css: {'fa-caret-right' : ! showPrivileges(), 'fa-caret-down': showPrivileges() }""></i>
+                  <i class="fa fa-2x" data-bind="click: function() { if (showPrivileges()) { showPrivileges(false); } else { $root.list_sentry_privileges_by_role($data);} }, css: {'fa-caret-right' : ! showPrivileges(), 'fa-caret-down': showPrivileges() }""></i>
                 </a>
               </td>
               <td data-bind="text: name"></td>
@@ -215,7 +220,7 @@ ${ layout.menubar(section='hive') }
             <tr>
                 <td colspan="2"></td>
                 <td colspan="3">
-                  <table data-bind="template: { name: 'privilege', foreach: $data.privileges}, visible: $data.showPrivileges">
+                  <table data-bind="template: { name: 'privilege', foreach: $data.privileges }, visible: $data.showPrivileges">
                   </table>
                 </td>
             </tr>

+ 4 - 6
apps/security/static/js/hdfs.ko.js

@@ -273,10 +273,9 @@ var Assist = function (vm, assist) {
   self.refreshTree = function (force) {
     self.growingTree(jQuery.extend(true, {}, self.initialGrowingTree));
     Object.keys(self.treeAdditionalData).forEach(function (path) {
-      if (typeof force == "boolean" && force){
+      if (typeof force == "boolean" && force) {
         self.fetchPath(path);
-      }
-      else {
+      } else {
         if (self.treeAdditionalData[path].loaded) {
           self.fetchPath(path);
         }
@@ -300,8 +299,7 @@ var Assist = function (vm, assist) {
     if (self.getTreeAdditionalDataForPath(obj.path()).loaded || (! obj.isExpanded() && ! self.getTreeAdditionalDataForPath(obj.path()).loaded)) {
       if (typeof toggle == "boolean" && toggle){
         obj.isExpanded(!obj.isExpanded());
-      }
-      else {
+      } else {
         obj.isExpanded(true);
       }
       self.updatePathProperty(self.growingTree(), obj.path(), "isExpanded", obj.isExpanded());
@@ -442,7 +440,7 @@ var HdfsViewModel = function (initial) {
 
   self.doAs = ko.observable(initial.user);
   self.doAs.subscribe(function () {
-	  self.assist.refreshTree();
+	self.assist.refreshTree();
   });
   self.availableHadoopUsers = ko.observableArray();
   self.availableHadoopGroups = ko.observableArray();

+ 13 - 5
apps/security/static/js/hive.ko.js

@@ -71,6 +71,7 @@ var Role = function (vm, role) {
     self.groups.push(group);
   });
   self.privileges = ko.observableArray(); // Not included in the API
+  self.originalPrivileges = ko.observableArray();
   self.showPrivileges = ko.observable(false);
 
   self.privilegesChanged = ko.computed(function () {
@@ -83,6 +84,7 @@ var Role = function (vm, role) {
     self.name('');
     self.groups.removeAll();
     self.privileges.removeAll();
+    self.originalPrivileges.removeAll();
   }
 
   self.addGroup = function () {
@@ -161,14 +163,15 @@ var Assist = function (vm) {
   self.path.subscribe(function () {
     self.fetchHivePath();
   });
-  self.server = ko.observable('server1');
+  self.server = ko.observable('');
   self.db = ko.computed(function () {
     return self.path().split(/[.]/)[0];
   });
   self.table = ko.computed(function () {
     return self.path().split(/[.]/)[1];
   });
-  self.privilege = ko.observable();
+  self.privileges = ko.observableArray();
+  self.isDiffMode = ko.observable(false);
 
   self.isDiffMode = ko.observable(false);
   self.isDiffMode.subscribe(function () {
@@ -408,7 +411,6 @@ var HiveViewModel = function (initial) {
 
   // Models
   self.roles = ko.observableArray();
-  self.privileges = ko.observableArray();
   self.availableHadoopGroups = ko.mapping.fromJS(initial.hadoop_groups);
   self.assist = new Assist(self);
 
@@ -481,8 +483,11 @@ var HiveViewModel = function (initial) {
         }
         else {
           role.privileges.removeAll();
+          role.originalPrivileges.removeAll();
           $.each(data.sentry_privileges, function (index, item) {
-            role.privileges.push(_create_ko_privilege(item));
+              var privilege = _create_ko_privilege(item);
+              role.privileges.push(privilege);
+              role.originalPrivileges.push(privilege);
           });
           role.showPrivileges(true);
         }
@@ -520,7 +525,10 @@ var HiveViewModel = function (initial) {
           })
         },
         success: function (data) {
-          self.assist.privilege(ko.mapping.fromJS(data));
+          self.assist.privileges.removeAll();
+          $.each(data.privileges, function (index, item) {
+        	self.assist.privileges.push(_create_ko_privilege(item));
+          });
         }
       }).fail(function (xhr, textStatus, errorThrown) {
         $(document).trigger("error", xhr.responseText);

+ 0 - 1
desktop/libs/libsentry/src/libsentry/client.py

@@ -84,7 +84,6 @@ class SentryClient(object):
   def alter_sentry_role_revoke_privilege(self, roleName, tSentryPrivilege):
     privilege = TSentryPrivilege(**tSentryPrivilege)
     request = TAlterSentryRoleRevokePrivilegeRequest(requestorUserName=self.username, roleName=roleName, privilege=privilege)
-    print request
     return self.client.alter_sentry_role_revoke_privilege(request)