Browse Source

[security] Split default rules below

Romain Rigaux 11 years ago
parent
commit
c0555c5

+ 7 - 3
apps/security/src/security/api/hdfs.py

@@ -19,6 +19,7 @@ import json
 
 from django.http import HttpResponse
 from django.utils.translation import ugettext as _
+from desktop.lib.exceptions_renderable import PopupException
 
 
 def _get_acl_name(acl):
@@ -37,9 +38,12 @@ def get_acls(request):
 def update_acls(request):
   path = request.POST.get('path')
   acls = json.loads(request.POST.get('acls'))
-
-  _remove_acl_entries(request.fs, path, [acl for acl in acls if acl['status'] == 'deleted'])
-  _modify_acl_entries(request.fs, path, [acl for acl in acls if acl['status'] in ('new', 'modified')])
+  
+  try:
+    _remove_acl_entries(request.fs, path, [acl for acl in acls if acl['status'] == 'deleted'])
+    _modify_acl_entries(request.fs, path, [acl for acl in acls if acl['status'] in ('new', 'modified')])
+  except Exception, e:
+    raise PopupException(unicode(str(e.message), "utf8"))
 
   return HttpResponse(json.dumps({'status': 0}), mimetype="application/json")
 

+ 30 - 17
apps/security/src/security/templates/hdfs.mako

@@ -26,6 +26,23 @@ ${ commonheader(_('Hadoop Security'), "security", user) | n,unicode }
 ${ layout.menubar(section='hdfs') }
 
 
+<script type="text/html" id="acl-edition">
+  <div data-bind="visible: status() != 'deleted'">
+    <span data-bind="visible: isDefault">Default</span>
+    <input type="radio" value="group" data-bind="checked: type, attr: { name: 'aclType' + $index() + (isDefault() ? 'isDefault' : 'notDefault') }"/> ${ _('group') }
+    <input type="radio" value="user" data-bind="checked: type, attr: { name: 'aclType' + $index() + (isDefault() ? 'isDefault' : 'notDefault') }"/> ${ _('user') }
+    <input type="radio" value="mask" data-bind="checked: type, attr: { name: 'aclType' + $index() + (isDefault() ? 'isDefault' : 'notDefault') }"/> ${ _('mask') }
+    <input type="radio" value="other" data-bind="checked: type, attr: { name: 'aclType' + $index() + (isDefault() ? 'isDefault' : 'notDefault') }"/> ${ _('other') }
+    <input type="text" data-bind="value: name, valueUpdate:'afterkeydown'" class="input-small" placeholder="${ _('name...') }"/>
+    <input type="checkbox" data-bind="checked: r"/>
+    <input type="checkbox" data-bind="checked: w"/>
+    <input type="checkbox" data-bind="checked: x"/>
+    <a href="javascript: void(0)"
+      <i class="fa fa-minus" data-bind="click: $root.assist.removeAcl"></i>
+    </a>
+  </div>
+</script>
+
 <div class="container-fluid">
   <div class="row-fluid">
     <div class="span2">
@@ -71,26 +88,22 @@ ${ layout.menubar(section='hdfs') }
               <a href="javascript: void(0)">
                 <i class="fa fa-header"></i> View in text
               </a>
-              <div data-bind="foreach: $root.assist.acls">
-                <div data-bind="visible: status() != 'deleted'">
-                ##                   <span data-bind="visible: isDefault">Default</span>
-                  <input type="radio" value="group" data-bind="checked: type, attr: { name: 'aclType' + $index() }"/> ${ _('Group') }
-                  <input type="radio" value="user" data-bind="checked: type, attr: { name: 'aclType' + $index() }"/> ${ _('User') }
-                  <input type="radio" value="mask" data-bind="checked: type, attr: { name: 'aclType' + $index() }"/> ${ _('Mask') }
-                  <input type="radio" value="other" data-bind="checked: type, attr: { name: 'aclType' + $index() }"/> ${ _('Other') }
-                  <input type="text" data-bind="value: name, valueUpdate:'afterkeydown'" class="input-small" placeholder="${ _('name...') }"/>
-                  <input type="checkbox" data-bind="checked: r"/>
-                  <input type="checkbox" data-bind="checked: w"/>
-                  <input type="checkbox" data-bind="checked: x"/>
-                  <a href="javascript: void(0)"
-                    <i class="fa fa-minus" data-bind="click: $root.assist.removeAcl"></i>
-                  </a>
-                </div>
+              </br>
+              <div data-bind="foreach: $root.assist.regularAcls">
+                <div data-bind="template: {name: 'acl-edition'}"></div>                 
               </div>
               <a href="javascript: void(0)" data-bind="click: $root.assist.addAcl">
                 <i class="fa fa-plus"></i>
-              </a>
-              <div data-bind="visible: $root.assist.changed().length">
+              </a>  
+              </br>
+              Default            
+              <div data-bind="foreach: $root.assist.defaultAcls">
+                <div data-bind="template: {name: 'acl-edition'}"></div>
+              </div>
+              <a href="javascript: void(0)" data-bind="click: $root.assist.addDefaultAcl">
+                <i class="fa fa-plus"></i>
+              </a>              
+              <div data-bind="visible: $root.assist.changedAcls().length">
                 <button type="button" data-bind="click: $root.assist.updateAcls" rel="tooltip" data-placement="bottom" data-loading-text="${ _('Saving...') }" data-original-title="${ _('Save') }" class="btn">
                   <i class="fa fa-save"></i>
                 </button>

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

@@ -30,7 +30,7 @@ function parseAcl(acl) {
   acl.type.subscribe(function() {
     acl.status('modified');
   });
-  acl.name.subscribe(function() {
+  acl.name.subscribe(function() { // TODO duplicates
 	acl.status('modified');
   });
   acl.r.subscribe(function() {
@@ -60,19 +60,31 @@ var Assist = function(vm, assist) {
   self.files = ko.observableArray();
 
   self.acls = ko.observableArray();
-  self.owner = ko.observable('');
-  self.group = ko.observable('');
-
-  self.changed = ko.computed(function() {
+  self.regularAcls = ko.computed(function() {
+	return $.grep(self.acls(), function(acl){ return ! acl.isDefault(); });
+  });
+  self.defaultAcls = ko.computed(function() {
+	return $.grep(self.acls(), function(acl){ return acl.isDefault(); });
+  });
+  self.changedAcls = ko.computed(function() {
 	return $.grep(self.acls(), function(acl){ return ['new', 'deleted', 'modified'].indexOf(acl.status()) != -1 });
   });
 
+  self.owner = ko.observable('');
+  self.group = ko.observable('');
+
   self.addAcl = function() {
 	var newAcl = parseAcl('group::---');
 	newAcl.status('new');
 	self.acls.push(newAcl);
   };
 
+  self.addDefaultAcl = function() {
+	var newAcl = parseAcl('default:group::---');
+	newAcl.status('new');
+	self.acls.push(newAcl);
+  };  
+  
   self.removeAcl = function(acl) {
 	if (acl.status() == 'new') {
 	  self.acls.remove(acl);
@@ -141,7 +153,7 @@ var Assist = function(vm, assist) {
         $(document).trigger("info", 'Done!');
       }
     ).fail(function (xhr, textStatus, errorThrown) {
-      $(document).trigger("error", xhr.responseText);
+      $(document).trigger("error", JSON.parse(xhr.responseText).message);
     });
   }
 }