From 297ae34b4f6611be6b885072ed12673270f52e2d Mon Sep 17 00:00:00 2001 From: Brady Wetherington Date: Thu, 23 Jan 2025 13:04:16 +0000 Subject: [PATCH] Add some safeties around the charset-detection and transliteration --- app/Http/Controllers/Api/ImportController.php | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php index 2a4d91c3d98..d627b36c8e4 100644 --- a/app/Http/Controllers/Api/ImportController.php +++ b/app/Http/Controllers/Api/ImportController.php @@ -66,25 +66,33 @@ public function store() : JsonResponse if (! ini_get('auto_detect_line_endings')) { ini_set('auto_detect_line_endings', '1'); } - $file_contents = $file->getContent(); //TODO - this *does* load the whole file in RAM, but we need that to be able to 'iconv' it? - $encoding = $detector->getEncoding($file_contents); - $reader = null; - if (strcasecmp($encoding, 'UTF-8') != 0) { - $transliterated = iconv($encoding, 'UTF-8', $file_contents); - if ($transliterated !== false) { - $tmpname = tempnam(sys_get_temp_dir(), ''); - $tmpresults = file_put_contents($tmpname, $transliterated); - if ($tmpresults !== false) { - $transliterated = null; //save on memory? - $newfile = new UploadedFile($tmpname, $file->getClientOriginalName(), null, null, true); //WARNING: this is enabling 'test mode' - which is gross, but otherwise the file won't be treated as 'uploaded' - if ($newfile->isValid()) { - $file = $newfile; + if (function_exists('iconv')) { + $file_contents = $file->getContent(); //TODO - this *does* load the whole file in RAM, but we need that to be able to 'iconv' it? + $encoding = $detector->getEncoding($file_contents); + $reader = null; + if (strcasecmp($encoding, 'UTF-8') != 0) { + $transliterated = false; + try { + $transliterated = iconv(strtoupper($encoding), 'UTF-8', $file_contents); + } catch (\Exception $e) { + $transliterated = false; + \Log::info("Unable to transliterate from $encoding to UTF-8"); + } + if ($transliterated !== false) { + $tmpname = tempnam(sys_get_temp_dir(), ''); + $tmpresults = file_put_contents($tmpname, $transliterated); + if ($tmpresults !== false) { + $transliterated = null; //save on memory? + $newfile = new UploadedFile($tmpname, $file->getClientOriginalName(), null, null, true); //WARNING: this is enabling 'test mode' - which is gross, but otherwise the file won't be treated as 'uploaded' + if ($newfile->isValid()) { + $file = $newfile; + } } } } + $file_contents = null; //try to save on memory, I guess? } $reader = Reader::createFromFileObject($file->openFile('r')); //file pointer leak? - $file_contents = null; //try to save on memory, I guess? try { $import->header_row = $reader->fetchOne(0);