Browse Source

[security] Add or remove groups in a role

Romain Rigaux 11 years ago
parent
commit
0a393fbbf3

+ 24 - 0
apps/security/src/security/api/hive.py

@@ -115,6 +115,30 @@ def create_role(request):
   return HttpResponse(json.dumps(result), mimetype="application/json")
 
 
+def update_role_groups(request):
+  result = {'status': -1, 'message': 'Error'}
+
+  try:
+    role = json.loads(request.POST['role'])
+    
+    new_groups = set(role['groups']) - set(role['originalGroups'])
+    deleted_groups = set(role['originalGroups']) - set(role['groups'])
+
+    api = get_api(request.user)
+    
+    if new_groups:
+      api.alter_sentry_role_add_groups(role['name'], new_groups)
+    if deleted_groups:
+      api.alter_sentry_role_delete_groups(role['name'], deleted_groups)
+
+    result['message'] = ''
+    result['status'] = 0
+  except Exception, e:
+    result['message'] = unicode(str(e), "utf8")
+
+  return HttpResponse(json.dumps(result), mimetype="application/json")
+
+
 def save_privileges(request):
   result = {'status': -1, 'message': 'Error'}
 

+ 8 - 10
apps/security/src/security/templates/hive.mako

@@ -202,20 +202,18 @@ ${ layout.menubar(section='hive') }
                 <td data-bind="text: name, click: function() { if (showPrivileges()) { showPrivileges(false); } else { $root.list_sentry_privileges_by_role($data);} }" class="pointer"></td>
                 <td>
                   <a href="javascript: void(0)" data-bind="click: function() { showEditGroups(true); }">
-                    <span data-bind="foreach: groups, visible: ! showEditGroups()">
+                    <span data-bind="foreach: groups, visible: ! showEditGroups() && ! groupsChanged()">
                       <span data-bind="text: $data"></span>
                     </span>
                   </a>
-                  <div data-bind="visible: showEditGroups() || groups().length == 0">
+                  <div data-bind="visible: showEditGroups() || groups().length == 0 || groupsChanged()">
                     <select data-bind="options: $root.selectableHadoopGroups, selectedOptions: groups, select2: { update: groups, type: 'group'}" size="5" multiple="true" style="width: 400px"></select>
-                    <div data-bind="visible: groupsChanged().length > 0">
-                      <a href="javascript: void(0)">
-                        <i class="fa fa-undo"></i>
-                      </a>
-                      <a href="javascript: void(0)">
-                        <i class="fa fa-save"></i>
-                      </a>
-                    </div>
+                    <a href="javascript: void(0)" data-bind="visible: groupsChanged, click: resetGroups">
+                      <i class="fa fa-undo"></i>
+                    </a>
+                    <a href="javascript: void(0)" data-bind="visible: groupsChanged, click: saveGroups">
+                      <i class="fa fa-save"></i>
+                    </a>
                   </div>
                 </td>
                 <td>

+ 1 - 0
apps/security/src/security/urls.py

@@ -38,6 +38,7 @@ urlpatterns += patterns('security.api.hive',
   url(r'^api/hive/list_sentry_privileges_for_provider$', 'list_sentry_privileges_for_provider', name='list_sentry_privileges_for_provider'),
   url(r'^api/hive/list_sentry_privileges_by_authorizable', 'list_sentry_privileges_by_authorizable', name='list_sentry_privileges_by_authorizable'),
   url(r'^api/hive/create_sentry_role', 'create_sentry_role', name='create_sentry_role'),
+  url(r'^api/hive/update_role_groups', 'update_role_groups', name='update_role_groups'),
   url(r'^api/hive/drop_sentry_role', 'drop_sentry_role', name='drop_sentry_role'),
   url(r'^api/hive/create_role$', 'create_role', name='create_role'),
   url(r'^api/hive/save_privileges$', 'save_privileges', name='save_privileges'),

+ 28 - 6
apps/security/static/js/hive.ko.js

@@ -121,9 +121,7 @@ var Role = function (vm, role) {
   });
 
   self.groupsChanged = ko.computed(function () {
-    var a = ko.utils.compareArrays(self.groups(), self.originalGroups());
-    //alert(ko.mapping.toJSON(a));
-    return a;
+	return ! ($(self.groups()).not(self.originalGroups()).length == 0 && $(self.originalGroups()).not(self.groups()).length == 0);
   });
   
   self.reset = function () {
@@ -140,6 +138,32 @@ var Role = function (vm, role) {
   self.addPrivilege = function () {
     self.privileges.push(new Privilege(vm, {'serverName': vm.assist.server(), 'status': 'new', 'editing': true}));
   }
+  
+  self.resetGroups = function () {
+	self.groups.removeAll();
+	$.each(self.originalGroups(), function (index, group) {
+	  self.groups.push(group);
+	});
+  }
+  
+  self.saveGroups = function() {
+    $(".jHueNotify").hide();
+    $.post("/security/api/hive/update_role_groups", {
+    	role: ko.mapping.toJSON(self)
+    }, function (data) {
+      if (data.status == 0) {
+        self.showEditGroups(false);
+    	self.originalGroups.removeAll();
+    	$.each(self.groups(), function (index, group) {
+    	  self.originalGroups.push(group);
+    	});        
+      } else {
+        $(document).trigger("error", data.message);
+      }
+    }).fail(function (xhr, textStatus, errorThrown) {
+      $(document).trigger("error", xhr.responseText);
+	});
+  }
 
   self.create = function () {
     $(".jHueNotify").hide();
@@ -168,10 +192,8 @@ var Role = function (vm, role) {
       roleName: role.name
     }, function (data) {
       if (data.status == 0) {
-        $(document).trigger("info", data.message);
         vm.removeRole(role.name);
-      }
-      else {
+      } else {
         $(document).trigger("error", data.message);
       }
     }).fail(function (xhr, textStatus, errorThrown) {