Browse Source

HUE-2708 [fb] Filechooser breaks on special characters

Filtered out single quote paths and changed to unicode the initial path
Enrico Berti 10 năm trước cách đây
mục cha
commit
ce035056f3

+ 4 - 5
apps/filebrowser/src/filebrowser/templates/listdir_components.mako

@@ -154,7 +154,7 @@ from django.utils.translation import ugettext as _
 
   <!-- rename modal -->
   <div id="renameModal" class="modal hide fade">
-    <form id="renameForm" action="/filebrowser/rename?next=${current_request_path}" method="POST" enctype="multipart/form-data" class="form-inline form-padding-fix">
+    <form id="renameForm" action="/filebrowser/rename?next=${current_request_path | n,unicode }" method="POST" enctype="multipart/form-data" class="form-inline form-padding-fix">
       ${ csrf_token(request) | n,unicode }
       <div class="modal-header">
         <a href="#" class="close" data-dismiss="modal">&times;</a>
@@ -759,7 +759,7 @@ from django.utils.translation import ugettext as _
       self.recordsPerPageChoices = ["15", "30", "45", "60", "100", "200", "1000"],
       self.recordsPerPage = ko.observable($.cookie("hueFilebrowserRecordsPerPage"));
       self.targetPageNum = ko.observable(1);
-      self.targetPath = ko.observable("${current_request_path}");
+      self.targetPath = ko.observable("${current_request_path | n,unicode }");
       self.sortBy = ko.observable("name");
       self.sortDescending = ko.observable(false);
       self.searchQuery = ko.observable("");
@@ -1784,13 +1784,12 @@ from django.utils.translation import ugettext as _
         }
         if (window.location.href.indexOf("#") == -1) {
           viewModel.targetPageNum(1);
-          targetPath = "${current_request_path}";
+          targetPath = "${current_request_path | n,unicode }";
         }
         if (targetPath != "") {
           viewModel.targetPath(targetPath);
         }
       }
-
       addPathToHistory(viewModel.targetPath())
 
       viewModel.retrieveData();
@@ -1862,7 +1861,7 @@ from django.utils.translation import ugettext as _
         }
         if (window.location.href.indexOf("#") == -1) {
           viewModel.targetPageNum(1);
-          targetPath = "${current_request_path}";
+          targetPath = "${current_request_path | n,unicode }";
         }
         if (targetPath != "") {
           viewModel.targetPath(targetPath);

+ 13 - 9
desktop/core/src/desktop/static/desktop/js/jquery.hdfstree.js

@@ -127,6 +127,10 @@
 
     var BASE_PATH = "/filebrowser/view";
     var _currentFiles = [];
+    
+    function escapeSingleQuote(path) {
+      return path.replace(/\'/gi, "\\'");
+    }
 
     function showHdfsLeaf(options) {
       var autocompleteUrl = BASE_PATH,
@@ -143,24 +147,24 @@
         _currentFiles = [];
         if (data.error == null) {
           var _dataPathForCurrent = currentPath != "" ? currentPath : "__JHUEHDFSTREE__ROOT__";
-          _el.find("[data-path='" + _dataPathForCurrent + "']").attr("data-loaded", true);
-          _el.find("[data-path='" + _dataPathForCurrent + "']").siblings("a").find(".fa-folder-o").removeClass("fa-folder-o").addClass("fa-folder-open-o");
+          _el.find("[data-path='" + escapeSingleQuote(_dataPathForCurrent) + "']").attr("data-loaded", true);
+          _el.find("[data-path='" + escapeSingleQuote(_dataPathForCurrent) + "']").siblings("a").find(".fa-folder-o").removeClass("fa-folder-o").addClass("fa-folder-open-o");
           _tree.find("a").removeClass("selected");
-          _el.find("[data-path='" + _dataPathForCurrent + "']").siblings("a").addClass("selected");
+          _el.find("[data-path='" + escapeSingleQuote(_dataPathForCurrent) + "']").siblings("a").addClass("selected");
           
           if (options.scroll) {
-            _el.parent().scrollTop(_el.find("[data-path='" + _dataPathForCurrent + "']").siblings("a").position().top + _el.parent().scrollTop() - 30);
+            _el.parent().scrollTop(_el.find("[data-path='" + escapeSingleQuote(_dataPathForCurrent) + "']").siblings("a").position().top + _el.parent().scrollTop() - 30);
           }
           $(data.files).each(function (cnt, item) {
             if (item.name != "." && item.name != ".." && item.type == "dir") {
               var _path = item.path;
-              if (_el.find("[data-path='" + _path + "']").length == 0){
-                var _li = $("<li>").html('<a class="pointer"><i class="fa fa-folder-o"></i> ' + item.name + '</a><ul class="content unstyled" data-path="' + _path + '" data-loaded="false"></ul>');
+              if (_el.find("[data-path='" + escapeSingleQuote(_path) + "']").length == 0){
+                var _li = $("<li>").html('<a class="pointer"><i class="fa fa-folder-o"></i> ' + item.name + '</a><ul class="content unstyled" data-path="' + (_path) + '" data-loaded="false"></ul>');
                 var _destination = _path.substr(0, _path.lastIndexOf("/"));
                 if (_destination == ""){
                   _destination = "__JHUEHDFSTREE__ROOT__";
                 }
-                _li.appendTo(_el.find("[data-path='" + _destination + "']"));
+                _li.appendTo(_el.find("[data-path='" + escapeSingleQuote(_destination) + "']"));
                 _li.find("a").on("click", function () {
                   _this.options.onPathChange(_path);
                   _this.lastPath = _path;
@@ -186,7 +190,7 @@
           });
           if (_this.options.createFolder) {
             var _createFolderLi = $("<li>").html('<a class="pointer"><i class="fa fa-plus-square-o"></i> ' + _this.options.labels.CREATE_FOLDER + '</a>');
-            _createFolderLi.appendTo(_el.find("[data-path='" + currentPath + "']"));
+            _createFolderLi.appendTo(_el.find("[data-path='" + escapeSingleQuote(currentPath) + "']"));
 
             var _createFolderDetails = $("<form>").css("margin-top", "10px").addClass("form-inline");
             _createFolderDetails.hide();
@@ -220,7 +224,7 @@
               });
 
             });
-            _createFolderDetails.appendTo(_el.find("[data-path='" + currentPath + "']"));
+            _createFolderDetails.appendTo(_el.find("[data-path='" + escapeSingleQuote(currentPath) + "']"));
 
             _createFolderLi.find("a").on("click", function () {
               _createFolderDetails.slideDown();