Răsfoiți Sursa

HUE-3424 [doc2] Restrict re-sharing to permission the user does not have in the popup

Johan Ahlen 9 ani în urmă
părinte
comite
205f81f

+ 24 - 1
desktop/core/src/desktop/static/desktop/js/fileBrowser/hueFileEntry.js

@@ -47,6 +47,7 @@
     self.assistHelper = options.assistHelper;
     self.app = options.app;
     self.user = options.user;
+    self.userGroups = options.userGroups;
     self.superuser = options.superuser;
 
     self.document = ko.observable();
@@ -72,13 +73,35 @@
 
     self.isShared = ko.pureComputed(function () {
       var perms = self.definition().perms;
-      return perms && (perms.read.users.length || perms.read.groups.length || perms.write.users.length || perms.write.groups.length);
+      return perms && (perms.read.users.length > 0 || perms.read.groups.length > 0 || perms.write.users.length > 0 || perms.write.groups.length > 0);
     });
 
     self.isSharedWithMe = ko.pureComputed(function () {
       return self.user !== self.definition().owner;
     });
 
+    self.canModify = ko.pureComputed(function () {
+      var perms = self.definition().perms;
+      return !self.isSharedWithMe() || self.superuser || (perms && (perms.write.users.filter(function (user) {
+            return user.username == self.user;
+          }).length > 0
+          || perms.write.groups.filter(function (writeGroup) {
+            return self.userGroups.indexOf(writeGroup) !== -1
+          }).length > 0));
+    });
+
+    self.canReshare = ko.pureComputed(function () {
+      if (! self.isSharedWithMe()) {
+        return true;
+      }
+      var activePerms = {};
+      var target = self;
+      while (target.parent && !target.isShared()) {
+        target = target.parent;
+      }
+      return target.canModify();
+    });
+
     self.entriesToDelete = ko.observableArray();
 
     self.selected = ko.observable(false);

+ 5 - 5
desktop/core/src/desktop/templates/file_browser.mako

@@ -325,12 +325,12 @@ from desktop.views import _ko
             <div data-bind="visible: (perms.read.users.length == 0 && perms.read.groups.length == 0)">${_('The document is not shared for read.')}</div>
             <ul class="unstyled airy" data-bind="foreach: perms.read.users">
               <li>
-                <span class="badge badge-info badge-left"><i class="fa fa-user"></i> <span data-bind="text: prettyName, css:{ 'notpretty': prettyName === '' }, attr:{ 'data-id': id }"></span></span><span class="badge badge-right trash-share" data-bind="click: function() { $parents[1].removeUserReadShare($data) }"> <i class="fa fa-times"></i></span>
+                <span class="badge badge-info" data-bind="css: { 'badge-left' : $parents[1].fileEntry.canModify() }"><i class="fa fa-user"></i> <span data-bind="text: prettyName, css:{ 'notpretty': prettyName === '' }, attr:{ 'data-id': id }"></span></span><span class="badge badge-right trash-share" data-bind="visible: $parents[1].fileEntry.canModify(), click: function() { $parents[1].removeUserReadShare($data) }"> <i class="fa fa-times"></i></span>
               </li>
             </ul>
             <ul class="unstyled airy" data-bind="foreach: perms.read.groups">
               <li>
-                <span class="badge badge-info badge-left"><i class="fa fa-users"></i> ${ _('Group') } &quot;<span data-bind="text: name"></span>&quot;</span><span class="badge badge-right trash-share" data-bind="click: function() { $parents[1].removeGroupReadShare($data) }"> <i class="fa fa-times"></i></span>
+                <span class="badge badge-info" data-bind="css: { 'badge-left' : $parents[1].fileEntry.canModify() }"><i class="fa fa-users"></i> ${ _('Group') } &quot;<span data-bind="text: name"></span>&quot;</span><span class="badge badge-right trash-share" data-bind="visible: $parents[1].fileEntry.canModify(), click: function() { $parents[1].removeGroupReadShare($data) }"> <i class="fa fa-times"></i></span>
               </li>
             </ul>
           </div>
@@ -340,12 +340,12 @@ from desktop.views import _ko
             <div data-bind="visible: (perms.write.users.length == 0 && perms.write.groups.length == 0)">${_('The document is not shared for modify.')}</div>
             <ul class="unstyled airy" data-bind="foreach: perms.write.users">
               <li>
-                <span class="badge badge-info badge-left"><i class="fa fa-user"></i> <span data-bind="text: prettyName, css:{'notpretty': prettyName == ''}, attr:{'data-id': id}"></span></span><span class="badge badge-right trash-share" data-bind="click: function() { $parents[1].removeUserWriteShare($data) }"> <i class="fa fa-times"></i></span>
+                <span class="badge badge-info badge-left" data-bind="css: { 'badge-left' : $parents[1].fileEntry.canModify() }"><i class="fa fa-user"></i> <span data-bind="text: prettyName, css:{'notpretty': prettyName == ''}, attr:{'data-id': id}"></span></span><span class="badge badge-right trash-share" data-bind="visible: $parents[1].fileEntry.canModify(), click: function() { $parents[1].removeUserWriteShare($data) }"> <i class="fa fa-times"></i></span>
               </li>
             </ul>
             <ul class="unstyled airy" data-bind="foreach: perms.write.groups">
               <li>
-                <span class="badge badge-info badge-left"><i class="fa fa-users"></i> ${ _('Group') } &quot;<span data-bind="text: name"></span>&quot;</span><span class="badge badge-right trash-share" data-bind="click: function() { $parents[1].removeGroupWriteShare($data) }"> <i class="fa fa-times"></i></span>
+                <span class="badge badge-info badge-left" data-bind="css: { 'badge-left' : $parents[1].fileEntry.canModify() }"><i class="fa fa-users"></i> ${ _('Group') } &quot;<span data-bind="text: name"></span>&quot;</span><span class="badge badge-right trash-share" data-bind="visible: $parents[1].fileEntry.canModify(), click: function() { $parents[1].removeGroupWriteShare($data) }"> <i class="fa fa-times"></i></span>
               </li>
             </ul>
           </div>
@@ -357,7 +357,7 @@ from desktop.views import _ko
         <div class="fb-empty animated" style="display: none;" data-bind="visible: hasErrors() && ! loading()">
           ${ _('There was an error loading the document.')}
         </div>
-        <div style="margin-top: 20px" data-bind="visible: ! hasErrors() && ! loading()">
+        <div style="margin-top: 20px" data-bind="visible: fileEntry.canModify() && ! hasErrors() && ! loading()">
           <div class="input-append">
             <input id="documentShareTypeahead" type="text" style="width: 420px" placeholder="${_('Type a username or a group name')}">
             <div class="btn-group" style="overflow:visible">

+ 6 - 0
desktop/core/src/desktop/templates/home2.mako

@@ -226,9 +226,15 @@ ${ fileBrowser.fileBrowser() }
 
     ko.options.deferUpdates = true;
 
+    var userGroups = [];
+    % for group in user.groups.all():
+      userGroups.push('${ group }');
+    % endfor
+
     $(document).ready(function () {
       var options = {
         user: '${ user.username }',
+        userGroups: userGroups,
         superuser: '${ user.is_superuser }' === 'True',
         i18n: {
           errorFetchingTableDetails: '${_('An error occurred fetching the table details. Please try again.')}',