From 3214aefb1d37da4e3899fc9f5650b79ea748d4fd Mon Sep 17 00:00:00 2001
From: Uma <uma.s@vtiger.com>
Date: Wed, 11 Mar 2020 18:09:13 +0530
Subject: [PATCH] Fixes #1254 Kcfinder library cleanup

---
 kcfinder/core/browser.php    |  3 ++-
 kcfinder/core/uploader.php   | 16 +++++++++++++++-
 kcfinder/js/browser/files.js |  6 +++---
 kcfinder/lib/helper_file.php | 14 ++++++++++++--
 4 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/kcfinder/core/browser.php b/kcfinder/core/browser.php
index f429fd9c4..e292bf842 100644
--- a/kcfinder/core/browser.php
+++ b/kcfinder/core/browser.php
@@ -262,7 +262,8 @@ class browser extends uploader {
             $this->errorMsg($message);
         }
 
-        $target = "$dir/" . file::getInexistantFilename($this->file['name'], $dir);
+        $sanitizedFilename = file::sanitizeFileName($this->file['name']);
+        $target = "$dir/" . file::getInexistantFilename($sanitizedFilename, $dir);
 
         if (!@move_uploaded_file($this->file['tmp_name'], $target) &&
             !@rename($this->file['tmp_name'], $target) &&
diff --git a/kcfinder/core/uploader.php b/kcfinder/core/uploader.php
index 736708aec..f0aa69458 100644
--- a/kcfinder/core/uploader.php
+++ b/kcfinder/core/uploader.php
@@ -86,6 +86,7 @@ class uploader {
         $this->types = &$this->config['types'];
         $firstType = array_keys($this->types);
         $firstType = $firstType[0];
+        $this->get['type'] = "images"; // to allow images upload only
         $this->type = (
             isset($this->get['type']) &&
             isset($this->types[$this->get['type']])
@@ -202,7 +203,8 @@ class uploader {
                 if (!is_dir(path::normalize($dir)))
                     @mkdir(path::normalize($dir), $this->config['dirPerms'], true);
 
-                $target = file::getInexistantFilename("$dir{$file['name']}");
+                $sanitizedFilename = file::sanitizeFileName($file['name']);
+                $target = file::getInexistantFilename("$dir{$sanitizedFilename}");
 
                 if (!@move_uploaded_file($file['tmp_name'], $target) &&
                     !@rename($file['tmp_name'], $target) &&
@@ -290,6 +292,14 @@ class uploader {
         if (!$gd->init_error && !$this->imageResize($gd, $file['tmp_name']))
             return $this->label("The image is too big and/or cannot be resized.");
 
+        //sanitization as per Vtiger standard
+        $isValidImage = Vtiger_Functions::validateImage($file);
+        if (is_string($isValidImage))
+            $isValidImage = ($isValidImage == 'false') ? false : true;
+        if (!$isValidImage) {
+            return $this->label("Denied file extension.");
+        }
+
         return true;
     }
 
@@ -448,6 +458,10 @@ class uploader {
         $CKfuncNum = isset($this->opener['CKEditor']['funcNum'])
             ? $this->opener['CKEditor']['funcNum'] : 0;
         if (!$CKfuncNum) $CKfuncNum = 0;
+        if(!is_numeric($CKfuncNum)){
+            $CKfuncNum = 0; // to prevent xss
+        }
+        $url = addcslashes($url, "'");
         header("Content-Type: text/html; charset={$this->charset}");
 
 ?><html>
diff --git a/kcfinder/js/browser/files.js b/kcfinder/js/browser/files.js
index 3d8506102..dfcac7efd 100644
--- a/kcfinder/js/browser/files.js
+++ b/kcfinder/js/browser/files.js
@@ -137,14 +137,14 @@ browser.selectFile = function(file, e) {
                 $('#fileinfo').html(files.length + ' ' + this.label("selected files") + ' (' + size + ')');
             else {
                 var data = $(files[0]).data();
-                $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
+                $('#fileinfo').text(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
             }
         }
     } else {
         var data = file.data();
         $('.file').removeClass('selected');
         file.addClass('selected');
-        $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
+        $('#fileinfo').text(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
     }
 };
 
@@ -378,7 +378,7 @@ browser.menuFile = function(file, e) {
         html += '<div class="menu">';
         $('.file').removeClass('selected');
         file.addClass('selected');
-        $('#fileinfo').html(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
+        $('#fileinfo').text(data.name + ' (' + this.humanSize(data.size) + ', ' + data.date + ')');
         if (this.opener.callBack || this.opener.callBackMultiple) {
             html += '<a href="kcact:pick">' + this.label("Select") + '</a>';
             if (data.thumb) html +=
diff --git a/kcfinder/lib/helper_file.php b/kcfinder/lib/helper_file.php
index 7facb100b..54ea6955e 100644
--- a/kcfinder/lib/helper_file.php
+++ b/kcfinder/lib/helper_file.php
@@ -196,7 +196,17 @@ class file {
                 ? "$fdir/" . basename($file)
                 : basename($file));
     }
-
+    
+    static function sanitizeFileName($filename){
+        $sanitizedFilename = vtlib_purify($filename);
+        $sanitizedFilename = str_replace('/', "", $sanitizedFilename);
+        $sanitizedFilename = str_replace('"', "", $sanitizedFilename);
+        $sanitizedFilename = str_replace("'", "", $sanitizedFilename);
+        $sanitizedFilename = str_replace(' ', "", $sanitizedFilename);
+        $sanitizedFilename = str_replace('=', "", $sanitizedFilename);
+        $sanitizedFilename = str_replace('<', "", $sanitizedFilename);
+        $sanitizedFilename = str_replace('>', "", $sanitizedFilename);
+        return $sanitizedFilename;
+    }
 }
-
 ?>
\ No newline at end of file
-- 
GitLab