Add S3KeyCleaner (#348)

This commit is contained in:
formsdev 2024-03-18 20:54:48 +05:30 committed by GitHub
parent 868d88bd4c
commit 26ad93a230
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 1719 additions and 8 deletions

View File

@ -0,0 +1,54 @@
<?php
namespace App\Service\Storage;
class S3KeyCleaner
{
public static function sanitize($objectKey, $separator = '-')
{
return (new self())->sanitizeS3Key($objectKey, $separator);
}
public function replaceLatinCharacters($value)
{
// Load the latin map
$latinMap = json_decode(\File::get(resource_path('data/latin-map.json')), true);
$result = '';
$length = mb_strlen($value);
for ($i = 0; $i < $length; $i++) {
$char = mb_substr($value, $i, 1);
$result .= array_key_exists($char, $latinMap) ? $latinMap[$char] : $char;
}
return $result;
}
private function removeIllegalCharacters($value)
{
$SAFE_CHARACTERS = '/[^0-9a-zA-Z! _\\.\\*\'\\(\\)\\-\\/]/';
return preg_replace($SAFE_CHARACTERS, '', $value);
}
private function isValidSeparator($separator)
{
$SAFE_CHARACTERS = '/[^0-9a-zA-Z! _\\.\\*\'\\(\\)\\-\\/]/';
return $separator && !preg_match($SAFE_CHARACTERS, $separator);
}
public function sanitizeS3Key($objectKey, $separator = '-')
{
if (!$this->isValidSeparator($separator)) {
throw new \Exception("${separator} is not a valid separator");
}
if (!$objectKey || (!is_string($objectKey) && !is_numeric($objectKey))) {
throw new \Exception("Expected non-empty string or number, got ${objectKey}");
}
if (is_numeric($objectKey)) {
return strval($objectKey);
}
return str_replace(' ', $separator, $this->removeIllegalCharacters($this->replaceLatinCharacters(trim($objectKey))));
}
}

View File

@ -30,10 +30,10 @@ class StorageFileNameParser
public function getMovedFileName(): ?string
{
if ($this->fileName && $this->extension) {
$fileName = substr($this->fileName, 0, 50).'_'.$this->uuid.'.'.$this->extension;
$fileName = substr($this->fileName, 0, 50) . '_' . $this->uuid . '.' . $this->extension;
$fileName = preg_replace('#\p{C}+#u', '', $fileName); // avoid CorruptedPathDetected exceptions
return mb_convert_encoding($fileName, 'UTF-8', 'UTF-8');
return S3KeyCleaner::sanitize($fileName);
}
return $this->uuid;
@ -47,13 +47,15 @@ class StorageFileNameParser
return;
}
if (! str_contains($fileName, '_')) {
if (!str_contains($fileName, '_')) {
return;
}
$candidateString = substr($fileName, strrpos($fileName, '_') + 1);
if (! str_contains($candidateString, '.')
|| ! Str::isUuid(substr($candidateString, 0, strpos($candidateString, '.')))) {
if (
!str_contains($candidateString, '.')
|| !Str::isUuid(substr($candidateString, 0, strpos($candidateString, '.')))
) {
return;
}

828
client/data/latin-map.json Normal file
View File

@ -0,0 +1,828 @@
{
"Á": "A",
"Ă": "A",
"Ắ": "A",
"Ặ": "A",
"Ằ": "A",
"Ẳ": "A",
"Ẵ": "A",
"Ǎ": "A",
"Â": "A",
"Ấ": "A",
"Ậ": "A",
"Ầ": "A",
"Ẩ": "A",
"Ẫ": "A",
"Ä": "A",
"Ǟ": "A",
"Ȧ": "A",
"Ǡ": "A",
"Ạ": "A",
"Ȁ": "A",
"À": "A",
"Ả": "A",
"Ȃ": "A",
"Ā": "A",
"Ą": "A",
"Å": "A",
"Ǻ": "A",
"Ḁ": "A",
"Ⱥ": "A",
"Ã": "A",
"Ꜳ": "AA",
"Æ": "AE",
"Ǽ": "AE",
"Ǣ": "AE",
"Ꜵ": "AO",
"Ꜷ": "AU",
"Ꜹ": "AV",
"Ꜻ": "AV",
"Ꜽ": "AY",
"Ḃ": "B",
"Ḅ": "B",
"Ɓ": "B",
"Ḇ": "B",
"Ƀ": "B",
"Ƃ": "B",
"Ć": "C",
"Č": "C",
"Ç": "C",
"Ḉ": "C",
"Ĉ": "C",
"Ċ": "C",
"Ƈ": "C",
"Ȼ": "C",
"Ď": "D",
"Ḑ": "D",
"Ḓ": "D",
"Ḋ": "D",
"Ḍ": "D",
"Ɗ": "D",
"Ḏ": "D",
"Dz": "D",
"Dž": "D",
"Đ": "D",
"Ƌ": "D",
"DZ": "DZ",
"DŽ": "DZ",
"É": "E",
"Ĕ": "E",
"Ě": "E",
"Ȩ": "E",
"Ḝ": "E",
"Ê": "E",
"Ế": "E",
"Ệ": "E",
"Ề": "E",
"Ể": "E",
"Ễ": "E",
"Ḙ": "E",
"Ë": "E",
"Ė": "E",
"Ẹ": "E",
"Ȅ": "E",
"È": "E",
"Ẻ": "E",
"Ȇ": "E",
"Ē": "E",
"Ḗ": "E",
"Ḕ": "E",
"Ę": "E",
"Ɇ": "E",
"Ẽ": "E",
"Ḛ": "E",
"": "ET",
"Ḟ": "F",
"Ƒ": "F",
"Ǵ": "G",
"Ğ": "G",
"Ǧ": "G",
"Ģ": "G",
"Ĝ": "G",
"Ġ": "G",
"Ɠ": "G",
"Ḡ": "G",
"Ǥ": "G",
"Ḫ": "H",
"Ȟ": "H",
"Ḩ": "H",
"Ĥ": "H",
"Ⱨ": "H",
"Ḧ": "H",
"Ḣ": "H",
"Ḥ": "H",
"Ħ": "H",
"Í": "I",
"Ĭ": "I",
"Ǐ": "I",
"Î": "I",
"Ï": "I",
"Ḯ": "I",
"İ": "I",
"Ị": "I",
"Ȉ": "I",
"Ì": "I",
"Ỉ": "I",
"Ȋ": "I",
"Ī": "I",
"Į": "I",
"Ɨ": "I",
"Ĩ": "I",
"Ḭ": "I",
"Ꝺ": "D",
"Ꝼ": "F",
"Ᵹ": "G",
"Ꞃ": "R",
"Ꞅ": "S",
"Ꞇ": "T",
"Ꝭ": "IS",
"Ĵ": "J",
"Ɉ": "J",
"Ḱ": "K",
"Ǩ": "K",
"Ķ": "K",
"Ⱪ": "K",
"Ꝃ": "K",
"Ḳ": "K",
"Ƙ": "K",
"Ḵ": "K",
"Ꝁ": "K",
"Ꝅ": "K",
"Ĺ": "L",
"Ƚ": "L",
"Ľ": "L",
"Ļ": "L",
"Ḽ": "L",
"Ḷ": "L",
"Ḹ": "L",
"Ⱡ": "L",
"Ꝉ": "L",
"Ḻ": "L",
"Ŀ": "L",
"Ɫ": "L",
"Lj": "L",
"Ł": "L",
"LJ": "LJ",
"Ḿ": "M",
"Ṁ": "M",
"Ṃ": "M",
"Ɱ": "M",
"Ń": "N",
"Ň": "N",
"Ņ": "N",
"Ṋ": "N",
"Ṅ": "N",
"Ṇ": "N",
"Ǹ": "N",
"Ɲ": "N",
"Ṉ": "N",
"Ƞ": "N",
"Nj": "N",
"Ñ": "N",
"NJ": "NJ",
"Ó": "O",
"Ŏ": "O",
"Ǒ": "O",
"Ô": "O",
"Ố": "O",
"Ộ": "O",
"Ồ": "O",
"Ổ": "O",
"Ỗ": "O",
"Ö": "O",
"Ȫ": "O",
"Ȯ": "O",
"Ȱ": "O",
"Ọ": "O",
"Ő": "O",
"Ȍ": "O",
"Ò": "O",
"Ỏ": "O",
"Ơ": "O",
"Ớ": "O",
"Ợ": "O",
"Ờ": "O",
"Ở": "O",
"Ỡ": "O",
"Ȏ": "O",
"Ꝋ": "O",
"Ꝍ": "O",
"Ō": "O",
"Ṓ": "O",
"Ṑ": "O",
"Ɵ": "O",
"Ǫ": "O",
"Ǭ": "O",
"Ø": "O",
"Ǿ": "O",
"Õ": "O",
"Ṍ": "O",
"Ṏ": "O",
"Ȭ": "O",
"Ƣ": "OI",
"Ꝏ": "OO",
"Ɛ": "E",
"Ɔ": "O",
"Ȣ": "OU",
"Ṕ": "P",
"Ṗ": "P",
"Ꝓ": "P",
"Ƥ": "P",
"Ꝕ": "P",
"Ᵽ": "P",
"Ꝑ": "P",
"Ꝙ": "Q",
"Ꝗ": "Q",
"Ŕ": "R",
"Ř": "R",
"Ŗ": "R",
"Ṙ": "R",
"Ṛ": "R",
"Ṝ": "R",
"Ȑ": "R",
"Ȓ": "R",
"Ṟ": "R",
"Ɍ": "R",
"Ɽ": "R",
"Ꜿ": "C",
"Ǝ": "E",
"Ś": "S",
"Ṥ": "S",
"Š": "S",
"Ṧ": "S",
"Ş": "S",
"Ŝ": "S",
"Ș": "S",
"Ṡ": "S",
"Ṣ": "S",
"Ṩ": "S",
"ẞ": "SS",
"Ť": "T",
"Ţ": "T",
"Ṱ": "T",
"Ț": "T",
"Ⱦ": "T",
"Ṫ": "T",
"Ṭ": "T",
"Ƭ": "T",
"Ṯ": "T",
"Ʈ": "T",
"Ŧ": "T",
"Ɐ": "A",
"Ꞁ": "L",
"Ɯ": "M",
"Ʌ": "V",
"Ꜩ": "TZ",
"Ú": "U",
"Ŭ": "U",
"Ǔ": "U",
"Û": "U",
"Ṷ": "U",
"Ü": "U",
"Ǘ": "U",
"Ǚ": "U",
"Ǜ": "U",
"Ǖ": "U",
"Ṳ": "U",
"Ụ": "U",
"Ű": "U",
"Ȕ": "U",
"Ù": "U",
"Ủ": "U",
"Ư": "U",
"Ứ": "U",
"Ự": "U",
"Ừ": "U",
"Ử": "U",
"Ữ": "U",
"Ȗ": "U",
"Ū": "U",
"Ṻ": "U",
"Ų": "U",
"Ů": "U",
"Ũ": "U",
"Ṹ": "U",
"Ṵ": "U",
"Ꝟ": "V",
"Ṿ": "V",
"Ʋ": "V",
"Ṽ": "V",
"Ꝡ": "VY",
"Ẃ": "W",
"Ŵ": "W",
"Ẅ": "W",
"Ẇ": "W",
"Ẉ": "W",
"Ẁ": "W",
"Ⱳ": "W",
"Ẍ": "X",
"Ẋ": "X",
"Ý": "Y",
"Ŷ": "Y",
"Ÿ": "Y",
"Ẏ": "Y",
"Ỵ": "Y",
"Ỳ": "Y",
"Ƴ": "Y",
"Ỷ": "Y",
"Ỿ": "Y",
"Ȳ": "Y",
"Ɏ": "Y",
"Ỹ": "Y",
"Ź": "Z",
"Ž": "Z",
"Ẑ": "Z",
"Ⱬ": "Z",
"Ż": "Z",
"Ẓ": "Z",
"Ȥ": "Z",
"Ẕ": "Z",
"Ƶ": "Z",
"IJ": "IJ",
"Œ": "OE",
"ᴀ": "A",
"ᴁ": "AE",
"ʙ": "B",
"ᴃ": "B",
"": "C",
"ᴅ": "D",
"ᴇ": "E",
"ꜰ": "F",
"ɢ": "G",
"ʛ": "G",
"ʜ": "H",
"ɪ": "I",
"ʁ": "R",
"ᴊ": "J",
"ᴋ": "K",
"ʟ": "L",
"ᴌ": "L",
"ᴍ": "M",
"ɴ": "N",
"": "O",
"ɶ": "OE",
"ᴐ": "O",
"ᴕ": "OU",
"ᴘ": "P",
"ʀ": "R",
"ᴎ": "N",
"ᴙ": "R",
"": "S",
"ᴛ": "T",
"ⱻ": "E",
"ᴚ": "R",
"": "U",
"": "V",
"": "W",
"ʏ": "Y",
"": "Z",
"á": "a",
"ă": "a",
"ắ": "a",
"ặ": "a",
"ằ": "a",
"ẳ": "a",
"ẵ": "a",
"ǎ": "a",
"â": "a",
"ấ": "a",
"ậ": "a",
"ầ": "a",
"ẩ": "a",
"ẫ": "a",
"ä": "a",
"ǟ": "a",
"ȧ": "a",
"ǡ": "a",
"ạ": "a",
"ȁ": "a",
"à": "a",
"ả": "a",
"ȃ": "a",
"ā": "a",
"ą": "a",
"ᶏ": "a",
"ẚ": "a",
"å": "a",
"ǻ": "a",
"ḁ": "a",
"ⱥ": "a",
"ã": "a",
"ꜳ": "aa",
"æ": "ae",
"ǽ": "ae",
"ǣ": "ae",
"ꜵ": "ao",
"ꜷ": "au",
"ꜹ": "av",
"ꜻ": "av",
"ꜽ": "ay",
"ḃ": "b",
"ḅ": "b",
"ɓ": "b",
"ḇ": "b",
"ᵬ": "b",
"ᶀ": "b",
"ƀ": "b",
"ƃ": "b",
"ɵ": "o",
"ć": "c",
"č": "c",
"ç": "c",
"ḉ": "c",
"ĉ": "c",
"ɕ": "c",
"ċ": "c",
"ƈ": "c",
"ȼ": "c",
"ď": "d",
"ḑ": "d",
"ḓ": "d",
"ȡ": "d",
"ḋ": "d",
"ḍ": "d",
"ɗ": "d",
"ᶑ": "d",
"ḏ": "d",
"ᵭ": "d",
"ᶁ": "d",
"đ": "d",
"ɖ": "d",
"ƌ": "d",
"ı": "i",
"ȷ": "j",
"ɟ": "j",
"ʄ": "j",
"dz": "dz",
"dž": "dz",
"é": "e",
"ĕ": "e",
"ě": "e",
"ȩ": "e",
"ḝ": "e",
"ê": "e",
"ế": "e",
"ệ": "e",
"ề": "e",
"ể": "e",
"ễ": "e",
"ḙ": "e",
"ë": "e",
"ė": "e",
"ẹ": "e",
"ȅ": "e",
"è": "e",
"ẻ": "e",
"ȇ": "e",
"ē": "e",
"ḗ": "e",
"ḕ": "e",
"ⱸ": "e",
"ę": "e",
"ᶒ": "e",
"ɇ": "e",
"ẽ": "e",
"ḛ": "e",
"ꝫ": "et",
"ḟ": "f",
"ƒ": "f",
"ᵮ": "f",
"ᶂ": "f",
"ǵ": "g",
"ğ": "g",
"ǧ": "g",
"ģ": "g",
"ĝ": "g",
"ġ": "g",
"ɠ": "g",
"ḡ": "g",
"": "g",
"ǥ": "g",
"ḫ": "h",
"ȟ": "h",
"ḩ": "h",
"ĥ": "h",
"ⱨ": "h",
"ḧ": "h",
"ḣ": "h",
"ḥ": "h",
"ɦ": "h",
"ẖ": "h",
"ħ": "h",
"ƕ": "hv",
"í": "i",
"ĭ": "i",
"ǐ": "i",
"î": "i",
"ï": "i",
"ḯ": "i",
"ị": "i",
"ȉ": "i",
"ì": "i",
"ỉ": "i",
"ȋ": "i",
"ī": "i",
"į": "i",
"ᶖ": "i",
"ɨ": "i",
"ĩ": "i",
"ḭ": "i",
"ꝺ": "d",
"ꝼ": "f",
"ᵹ": "g",
"ꞃ": "r",
"ꞅ": "s",
"ꞇ": "t",
"ꝭ": "is",
"ǰ": "j",
"ĵ": "j",
"ʝ": "j",
"ɉ": "j",
"ḱ": "k",
"ǩ": "k",
"ķ": "k",
"ⱪ": "k",
"ꝃ": "k",
"ḳ": "k",
"ƙ": "k",
"ḵ": "k",
"ᶄ": "k",
"ꝁ": "k",
"ꝅ": "k",
"ĺ": "l",
"ƚ": "l",
"ɬ": "l",
"ľ": "l",
"ļ": "l",
"ḽ": "l",
"ȴ": "l",
"ḷ": "l",
"ḹ": "l",
"ⱡ": "l",
"ꝉ": "l",
"ḻ": "l",
"ŀ": "l",
"ɫ": "l",
"ᶅ": "l",
"ɭ": "l",
"ł": "l",
"lj": "lj",
"ſ": "s",
"ẜ": "s",
"ẛ": "s",
"": "s",
"ḿ": "m",
"ṁ": "m",
"ṃ": "m",
"ɱ": "m",
"ᵯ": "m",
"ᶆ": "m",
"ń": "n",
"ň": "n",
"ņ": "n",
"ṋ": "n",
"ȵ": "n",
"ṅ": "n",
"ṇ": "n",
"ǹ": "n",
"ɲ": "n",
"ṉ": "n",
"ƞ": "n",
"ᵰ": "n",
"ᶇ": "n",
"ɳ": "n",
"ñ": "n",
"nj": "nj",
"ó": "o",
"ŏ": "o",
"ǒ": "o",
"ô": "o",
"ố": "o",
"ộ": "o",
"ồ": "o",
"ổ": "o",
"ỗ": "o",
"ö": "o",
"ȫ": "o",
"ȯ": "o",
"ȱ": "o",
"ọ": "o",
"ő": "o",
"ȍ": "o",
"ò": "o",
"ỏ": "o",
"ơ": "o",
"ớ": "o",
"ợ": "o",
"ờ": "o",
"ở": "o",
"ỡ": "o",
"ȏ": "o",
"ꝋ": "o",
"ꝍ": "o",
"ⱺ": "o",
"ō": "o",
"ṓ": "o",
"ṑ": "o",
"ǫ": "o",
"ǭ": "o",
"ø": "o",
"ǿ": "o",
"õ": "o",
"ṍ": "o",
"ṏ": "o",
"ȭ": "o",
"ƣ": "oi",
"ꝏ": "oo",
"ɛ": "e",
"ᶓ": "e",
"ɔ": "o",
"ᶗ": "o",
"ȣ": "ou",
"ṕ": "p",
"ṗ": "p",
"ꝓ": "p",
"ƥ": "p",
"ᵱ": "p",
"ᶈ": "p",
"ꝕ": "p",
"ᵽ": "p",
"ꝑ": "p",
"ꝙ": "q",
"ʠ": "q",
"ɋ": "q",
"ꝗ": "q",
"ŕ": "r",
"ř": "r",
"ŗ": "r",
"ṙ": "r",
"ṛ": "r",
"ṝ": "r",
"ȑ": "r",
"ɾ": "r",
"ᵳ": "r",
"ȓ": "r",
"ṟ": "r",
"ɼ": "r",
"ᵲ": "r",
"ᶉ": "r",
"ɍ": "r",
"ɽ": "r",
"ↄ": "c",
"ꜿ": "c",
"ɘ": "e",
"ɿ": "r",
"ś": "s",
"ṥ": "s",
"š": "s",
"ṧ": "s",
"ş": "s",
"ŝ": "s",
"ș": "s",
"ṡ": "s",
"ṣ": "s",
"ṩ": "s",
"ʂ": "s",
"ᵴ": "s",
"ᶊ": "s",
"ȿ": "s",
"ɡ": "g",
"ß": "ss",
"": "o",
"ᴓ": "o",
"ᴝ": "u",
"ť": "t",
"ţ": "t",
"ṱ": "t",
"ț": "t",
"ȶ": "t",
"ẗ": "t",
"ⱦ": "t",
"ṫ": "t",
"ṭ": "t",
"ƭ": "t",
"ṯ": "t",
"ᵵ": "t",
"ƫ": "t",
"ʈ": "t",
"ŧ": "t",
"ᵺ": "th",
"ɐ": "a",
"ᴂ": "ae",
"ǝ": "e",
"ᵷ": "g",
"ɥ": "h",
"ʮ": "h",
"ʯ": "h",
"ᴉ": "i",
"ʞ": "k",
"ꞁ": "l",
"ɯ": "m",
"ɰ": "m",
"ᴔ": "oe",
"ɹ": "r",
"ɻ": "r",
"ɺ": "r",
"ⱹ": "r",
"ʇ": "t",
"ʌ": "v",
"ʍ": "w",
"ʎ": "y",
"ꜩ": "tz",
"ú": "u",
"ŭ": "u",
"ǔ": "u",
"û": "u",
"ṷ": "u",
"ü": "u",
"ǘ": "u",
"ǚ": "u",
"ǜ": "u",
"ǖ": "u",
"ṳ": "u",
"ụ": "u",
"ű": "u",
"ȕ": "u",
"ù": "u",
"ủ": "u",
"ư": "u",
"ứ": "u",
"ự": "u",
"ừ": "u",
"ử": "u",
"ữ": "u",
"ȗ": "u",
"ū": "u",
"ṻ": "u",
"ų": "u",
"ᶙ": "u",
"ů": "u",
"ũ": "u",
"ṹ": "u",
"ṵ": "u",
"ᵫ": "ue",
"": "um",
"ⱴ": "v",
"ꝟ": "v",
"ṿ": "v",
"ʋ": "v",
"": "v",
"ⱱ": "v",
"ṽ": "v",
"ꝡ": "vy",
"ẃ": "w",
"ŵ": "w",
"ẅ": "w",
"ẇ": "w",
"ẉ": "w",
"ẁ": "w",
"ⱳ": "w",
"ẘ": "w",
"ẍ": "x",
"ẋ": "x",
"ᶍ": "x",
"ý": "y",
"ŷ": "y",
"ÿ": "y",
"ẏ": "y",
"ỵ": "y",
"ỳ": "y",
"ƴ": "y",
"ỷ": "y",
"ỿ": "y",
"ȳ": "y",
"ẙ": "y",
"ɏ": "y",
"ỹ": "y",
"ź": "z",
"ž": "z",
"ẑ": "z",
"ʑ": "z",
"ⱬ": "z",
"ż": "z",
"ẓ": "z",
"ȥ": "z",
"ẕ": "z",
"ᵶ": "z",
"ᶎ": "z",
"ʐ": "z",
"ƶ": "z",
"ɀ": "z",
"ff": "ff",
"ffi": "ffi",
"ffl": "ffl",
"fi": "fi",
"fl": "fl",
"ij": "ij",
"œ": "oe",
"st": "st",
"ₐ": "a",
"ₑ": "e",
"ᵢ": "i",
"ⱼ": "j",
"ₒ": "o",
"ᵣ": "r",
"ᵤ": "u",
"ᵥ": "v",
"ₓ": "x"
}

View File

@ -0,0 +1,828 @@
{
"Á": "A",
"Ă": "A",
"Ắ": "A",
"Ặ": "A",
"Ằ": "A",
"Ẳ": "A",
"Ẵ": "A",
"Ǎ": "A",
"Â": "A",
"Ấ": "A",
"Ậ": "A",
"Ầ": "A",
"Ẩ": "A",
"Ẫ": "A",
"Ä": "A",
"Ǟ": "A",
"Ȧ": "A",
"Ǡ": "A",
"Ạ": "A",
"Ȁ": "A",
"À": "A",
"Ả": "A",
"Ȃ": "A",
"Ā": "A",
"Ą": "A",
"Å": "A",
"Ǻ": "A",
"Ḁ": "A",
"Ⱥ": "A",
"Ã": "A",
"Ꜳ": "AA",
"Æ": "AE",
"Ǽ": "AE",
"Ǣ": "AE",
"Ꜵ": "AO",
"Ꜷ": "AU",
"Ꜹ": "AV",
"Ꜻ": "AV",
"Ꜽ": "AY",
"Ḃ": "B",
"Ḅ": "B",
"Ɓ": "B",
"Ḇ": "B",
"Ƀ": "B",
"Ƃ": "B",
"Ć": "C",
"Č": "C",
"Ç": "C",
"Ḉ": "C",
"Ĉ": "C",
"Ċ": "C",
"Ƈ": "C",
"Ȼ": "C",
"Ď": "D",
"Ḑ": "D",
"Ḓ": "D",
"Ḋ": "D",
"Ḍ": "D",
"Ɗ": "D",
"Ḏ": "D",
"Dz": "D",
"Dž": "D",
"Đ": "D",
"Ƌ": "D",
"DZ": "DZ",
"DŽ": "DZ",
"É": "E",
"Ĕ": "E",
"Ě": "E",
"Ȩ": "E",
"Ḝ": "E",
"Ê": "E",
"Ế": "E",
"Ệ": "E",
"Ề": "E",
"Ể": "E",
"Ễ": "E",
"Ḙ": "E",
"Ë": "E",
"Ė": "E",
"Ẹ": "E",
"Ȅ": "E",
"È": "E",
"Ẻ": "E",
"Ȇ": "E",
"Ē": "E",
"Ḗ": "E",
"Ḕ": "E",
"Ę": "E",
"Ɇ": "E",
"Ẽ": "E",
"Ḛ": "E",
"": "ET",
"Ḟ": "F",
"Ƒ": "F",
"Ǵ": "G",
"Ğ": "G",
"Ǧ": "G",
"Ģ": "G",
"Ĝ": "G",
"Ġ": "G",
"Ɠ": "G",
"Ḡ": "G",
"Ǥ": "G",
"Ḫ": "H",
"Ȟ": "H",
"Ḩ": "H",
"Ĥ": "H",
"Ⱨ": "H",
"Ḧ": "H",
"Ḣ": "H",
"Ḥ": "H",
"Ħ": "H",
"Í": "I",
"Ĭ": "I",
"Ǐ": "I",
"Î": "I",
"Ï": "I",
"Ḯ": "I",
"İ": "I",
"Ị": "I",
"Ȉ": "I",
"Ì": "I",
"Ỉ": "I",
"Ȋ": "I",
"Ī": "I",
"Į": "I",
"Ɨ": "I",
"Ĩ": "I",
"Ḭ": "I",
"Ꝺ": "D",
"Ꝼ": "F",
"Ᵹ": "G",
"Ꞃ": "R",
"Ꞅ": "S",
"Ꞇ": "T",
"Ꝭ": "IS",
"Ĵ": "J",
"Ɉ": "J",
"Ḱ": "K",
"Ǩ": "K",
"Ķ": "K",
"Ⱪ": "K",
"Ꝃ": "K",
"Ḳ": "K",
"Ƙ": "K",
"Ḵ": "K",
"Ꝁ": "K",
"Ꝅ": "K",
"Ĺ": "L",
"Ƚ": "L",
"Ľ": "L",
"Ļ": "L",
"Ḽ": "L",
"Ḷ": "L",
"Ḹ": "L",
"Ⱡ": "L",
"Ꝉ": "L",
"Ḻ": "L",
"Ŀ": "L",
"Ɫ": "L",
"Lj": "L",
"Ł": "L",
"LJ": "LJ",
"Ḿ": "M",
"Ṁ": "M",
"Ṃ": "M",
"Ɱ": "M",
"Ń": "N",
"Ň": "N",
"Ņ": "N",
"Ṋ": "N",
"Ṅ": "N",
"Ṇ": "N",
"Ǹ": "N",
"Ɲ": "N",
"Ṉ": "N",
"Ƞ": "N",
"Nj": "N",
"Ñ": "N",
"NJ": "NJ",
"Ó": "O",
"Ŏ": "O",
"Ǒ": "O",
"Ô": "O",
"Ố": "O",
"Ộ": "O",
"Ồ": "O",
"Ổ": "O",
"Ỗ": "O",
"Ö": "O",
"Ȫ": "O",
"Ȯ": "O",
"Ȱ": "O",
"Ọ": "O",
"Ő": "O",
"Ȍ": "O",
"Ò": "O",
"Ỏ": "O",
"Ơ": "O",
"Ớ": "O",
"Ợ": "O",
"Ờ": "O",
"Ở": "O",
"Ỡ": "O",
"Ȏ": "O",
"Ꝋ": "O",
"Ꝍ": "O",
"Ō": "O",
"Ṓ": "O",
"Ṑ": "O",
"Ɵ": "O",
"Ǫ": "O",
"Ǭ": "O",
"Ø": "O",
"Ǿ": "O",
"Õ": "O",
"Ṍ": "O",
"Ṏ": "O",
"Ȭ": "O",
"Ƣ": "OI",
"Ꝏ": "OO",
"Ɛ": "E",
"Ɔ": "O",
"Ȣ": "OU",
"Ṕ": "P",
"Ṗ": "P",
"Ꝓ": "P",
"Ƥ": "P",
"Ꝕ": "P",
"Ᵽ": "P",
"Ꝑ": "P",
"Ꝙ": "Q",
"Ꝗ": "Q",
"Ŕ": "R",
"Ř": "R",
"Ŗ": "R",
"Ṙ": "R",
"Ṛ": "R",
"Ṝ": "R",
"Ȑ": "R",
"Ȓ": "R",
"Ṟ": "R",
"Ɍ": "R",
"Ɽ": "R",
"Ꜿ": "C",
"Ǝ": "E",
"Ś": "S",
"Ṥ": "S",
"Š": "S",
"Ṧ": "S",
"Ş": "S",
"Ŝ": "S",
"Ș": "S",
"Ṡ": "S",
"Ṣ": "S",
"Ṩ": "S",
"ẞ": "SS",
"Ť": "T",
"Ţ": "T",
"Ṱ": "T",
"Ț": "T",
"Ⱦ": "T",
"Ṫ": "T",
"Ṭ": "T",
"Ƭ": "T",
"Ṯ": "T",
"Ʈ": "T",
"Ŧ": "T",
"Ɐ": "A",
"Ꞁ": "L",
"Ɯ": "M",
"Ʌ": "V",
"Ꜩ": "TZ",
"Ú": "U",
"Ŭ": "U",
"Ǔ": "U",
"Û": "U",
"Ṷ": "U",
"Ü": "U",
"Ǘ": "U",
"Ǚ": "U",
"Ǜ": "U",
"Ǖ": "U",
"Ṳ": "U",
"Ụ": "U",
"Ű": "U",
"Ȕ": "U",
"Ù": "U",
"Ủ": "U",
"Ư": "U",
"Ứ": "U",
"Ự": "U",
"Ừ": "U",
"Ử": "U",
"Ữ": "U",
"Ȗ": "U",
"Ū": "U",
"Ṻ": "U",
"Ų": "U",
"Ů": "U",
"Ũ": "U",
"Ṹ": "U",
"Ṵ": "U",
"Ꝟ": "V",
"Ṿ": "V",
"Ʋ": "V",
"Ṽ": "V",
"Ꝡ": "VY",
"Ẃ": "W",
"Ŵ": "W",
"Ẅ": "W",
"Ẇ": "W",
"Ẉ": "W",
"Ẁ": "W",
"Ⱳ": "W",
"Ẍ": "X",
"Ẋ": "X",
"Ý": "Y",
"Ŷ": "Y",
"Ÿ": "Y",
"Ẏ": "Y",
"Ỵ": "Y",
"Ỳ": "Y",
"Ƴ": "Y",
"Ỷ": "Y",
"Ỿ": "Y",
"Ȳ": "Y",
"Ɏ": "Y",
"Ỹ": "Y",
"Ź": "Z",
"Ž": "Z",
"Ẑ": "Z",
"Ⱬ": "Z",
"Ż": "Z",
"Ẓ": "Z",
"Ȥ": "Z",
"Ẕ": "Z",
"Ƶ": "Z",
"IJ": "IJ",
"Œ": "OE",
"ᴀ": "A",
"ᴁ": "AE",
"ʙ": "B",
"ᴃ": "B",
"": "C",
"ᴅ": "D",
"ᴇ": "E",
"ꜰ": "F",
"ɢ": "G",
"ʛ": "G",
"ʜ": "H",
"ɪ": "I",
"ʁ": "R",
"ᴊ": "J",
"ᴋ": "K",
"ʟ": "L",
"ᴌ": "L",
"ᴍ": "M",
"ɴ": "N",
"": "O",
"ɶ": "OE",
"ᴐ": "O",
"ᴕ": "OU",
"ᴘ": "P",
"ʀ": "R",
"ᴎ": "N",
"ᴙ": "R",
"": "S",
"ᴛ": "T",
"ⱻ": "E",
"ᴚ": "R",
"": "U",
"": "V",
"": "W",
"ʏ": "Y",
"": "Z",
"á": "a",
"ă": "a",
"ắ": "a",
"ặ": "a",
"ằ": "a",
"ẳ": "a",
"ẵ": "a",
"ǎ": "a",
"â": "a",
"ấ": "a",
"ậ": "a",
"ầ": "a",
"ẩ": "a",
"ẫ": "a",
"ä": "a",
"ǟ": "a",
"ȧ": "a",
"ǡ": "a",
"ạ": "a",
"ȁ": "a",
"à": "a",
"ả": "a",
"ȃ": "a",
"ā": "a",
"ą": "a",
"ᶏ": "a",
"ẚ": "a",
"å": "a",
"ǻ": "a",
"ḁ": "a",
"ⱥ": "a",
"ã": "a",
"ꜳ": "aa",
"æ": "ae",
"ǽ": "ae",
"ǣ": "ae",
"ꜵ": "ao",
"ꜷ": "au",
"ꜹ": "av",
"ꜻ": "av",
"ꜽ": "ay",
"ḃ": "b",
"ḅ": "b",
"ɓ": "b",
"ḇ": "b",
"ᵬ": "b",
"ᶀ": "b",
"ƀ": "b",
"ƃ": "b",
"ɵ": "o",
"ć": "c",
"č": "c",
"ç": "c",
"ḉ": "c",
"ĉ": "c",
"ɕ": "c",
"ċ": "c",
"ƈ": "c",
"ȼ": "c",
"ď": "d",
"ḑ": "d",
"ḓ": "d",
"ȡ": "d",
"ḋ": "d",
"ḍ": "d",
"ɗ": "d",
"ᶑ": "d",
"ḏ": "d",
"ᵭ": "d",
"ᶁ": "d",
"đ": "d",
"ɖ": "d",
"ƌ": "d",
"ı": "i",
"ȷ": "j",
"ɟ": "j",
"ʄ": "j",
"dz": "dz",
"dž": "dz",
"é": "e",
"ĕ": "e",
"ě": "e",
"ȩ": "e",
"ḝ": "e",
"ê": "e",
"ế": "e",
"ệ": "e",
"ề": "e",
"ể": "e",
"ễ": "e",
"ḙ": "e",
"ë": "e",
"ė": "e",
"ẹ": "e",
"ȅ": "e",
"è": "e",
"ẻ": "e",
"ȇ": "e",
"ē": "e",
"ḗ": "e",
"ḕ": "e",
"ⱸ": "e",
"ę": "e",
"ᶒ": "e",
"ɇ": "e",
"ẽ": "e",
"ḛ": "e",
"ꝫ": "et",
"ḟ": "f",
"ƒ": "f",
"ᵮ": "f",
"ᶂ": "f",
"ǵ": "g",
"ğ": "g",
"ǧ": "g",
"ģ": "g",
"ĝ": "g",
"ġ": "g",
"ɠ": "g",
"ḡ": "g",
"": "g",
"ǥ": "g",
"ḫ": "h",
"ȟ": "h",
"ḩ": "h",
"ĥ": "h",
"ⱨ": "h",
"ḧ": "h",
"ḣ": "h",
"ḥ": "h",
"ɦ": "h",
"ẖ": "h",
"ħ": "h",
"ƕ": "hv",
"í": "i",
"ĭ": "i",
"ǐ": "i",
"î": "i",
"ï": "i",
"ḯ": "i",
"ị": "i",
"ȉ": "i",
"ì": "i",
"ỉ": "i",
"ȋ": "i",
"ī": "i",
"į": "i",
"ᶖ": "i",
"ɨ": "i",
"ĩ": "i",
"ḭ": "i",
"ꝺ": "d",
"ꝼ": "f",
"ᵹ": "g",
"ꞃ": "r",
"ꞅ": "s",
"ꞇ": "t",
"ꝭ": "is",
"ǰ": "j",
"ĵ": "j",
"ʝ": "j",
"ɉ": "j",
"ḱ": "k",
"ǩ": "k",
"ķ": "k",
"ⱪ": "k",
"ꝃ": "k",
"ḳ": "k",
"ƙ": "k",
"ḵ": "k",
"ᶄ": "k",
"ꝁ": "k",
"ꝅ": "k",
"ĺ": "l",
"ƚ": "l",
"ɬ": "l",
"ľ": "l",
"ļ": "l",
"ḽ": "l",
"ȴ": "l",
"ḷ": "l",
"ḹ": "l",
"ⱡ": "l",
"ꝉ": "l",
"ḻ": "l",
"ŀ": "l",
"ɫ": "l",
"ᶅ": "l",
"ɭ": "l",
"ł": "l",
"lj": "lj",
"ſ": "s",
"ẜ": "s",
"ẛ": "s",
"": "s",
"ḿ": "m",
"ṁ": "m",
"ṃ": "m",
"ɱ": "m",
"ᵯ": "m",
"ᶆ": "m",
"ń": "n",
"ň": "n",
"ņ": "n",
"ṋ": "n",
"ȵ": "n",
"ṅ": "n",
"ṇ": "n",
"ǹ": "n",
"ɲ": "n",
"ṉ": "n",
"ƞ": "n",
"ᵰ": "n",
"ᶇ": "n",
"ɳ": "n",
"ñ": "n",
"nj": "nj",
"ó": "o",
"ŏ": "o",
"ǒ": "o",
"ô": "o",
"ố": "o",
"ộ": "o",
"ồ": "o",
"ổ": "o",
"ỗ": "o",
"ö": "o",
"ȫ": "o",
"ȯ": "o",
"ȱ": "o",
"ọ": "o",
"ő": "o",
"ȍ": "o",
"ò": "o",
"ỏ": "o",
"ơ": "o",
"ớ": "o",
"ợ": "o",
"ờ": "o",
"ở": "o",
"ỡ": "o",
"ȏ": "o",
"ꝋ": "o",
"ꝍ": "o",
"ⱺ": "o",
"ō": "o",
"ṓ": "o",
"ṑ": "o",
"ǫ": "o",
"ǭ": "o",
"ø": "o",
"ǿ": "o",
"õ": "o",
"ṍ": "o",
"ṏ": "o",
"ȭ": "o",
"ƣ": "oi",
"ꝏ": "oo",
"ɛ": "e",
"ᶓ": "e",
"ɔ": "o",
"ᶗ": "o",
"ȣ": "ou",
"ṕ": "p",
"ṗ": "p",
"ꝓ": "p",
"ƥ": "p",
"ᵱ": "p",
"ᶈ": "p",
"ꝕ": "p",
"ᵽ": "p",
"ꝑ": "p",
"ꝙ": "q",
"ʠ": "q",
"ɋ": "q",
"ꝗ": "q",
"ŕ": "r",
"ř": "r",
"ŗ": "r",
"ṙ": "r",
"ṛ": "r",
"ṝ": "r",
"ȑ": "r",
"ɾ": "r",
"ᵳ": "r",
"ȓ": "r",
"ṟ": "r",
"ɼ": "r",
"ᵲ": "r",
"ᶉ": "r",
"ɍ": "r",
"ɽ": "r",
"ↄ": "c",
"ꜿ": "c",
"ɘ": "e",
"ɿ": "r",
"ś": "s",
"ṥ": "s",
"š": "s",
"ṧ": "s",
"ş": "s",
"ŝ": "s",
"ș": "s",
"ṡ": "s",
"ṣ": "s",
"ṩ": "s",
"ʂ": "s",
"ᵴ": "s",
"ᶊ": "s",
"ȿ": "s",
"ɡ": "g",
"ß": "ss",
"": "o",
"ᴓ": "o",
"ᴝ": "u",
"ť": "t",
"ţ": "t",
"ṱ": "t",
"ț": "t",
"ȶ": "t",
"ẗ": "t",
"ⱦ": "t",
"ṫ": "t",
"ṭ": "t",
"ƭ": "t",
"ṯ": "t",
"ᵵ": "t",
"ƫ": "t",
"ʈ": "t",
"ŧ": "t",
"ᵺ": "th",
"ɐ": "a",
"ᴂ": "ae",
"ǝ": "e",
"ᵷ": "g",
"ɥ": "h",
"ʮ": "h",
"ʯ": "h",
"ᴉ": "i",
"ʞ": "k",
"ꞁ": "l",
"ɯ": "m",
"ɰ": "m",
"ᴔ": "oe",
"ɹ": "r",
"ɻ": "r",
"ɺ": "r",
"ⱹ": "r",
"ʇ": "t",
"ʌ": "v",
"ʍ": "w",
"ʎ": "y",
"ꜩ": "tz",
"ú": "u",
"ŭ": "u",
"ǔ": "u",
"û": "u",
"ṷ": "u",
"ü": "u",
"ǘ": "u",
"ǚ": "u",
"ǜ": "u",
"ǖ": "u",
"ṳ": "u",
"ụ": "u",
"ű": "u",
"ȕ": "u",
"ù": "u",
"ủ": "u",
"ư": "u",
"ứ": "u",
"ự": "u",
"ừ": "u",
"ử": "u",
"ữ": "u",
"ȗ": "u",
"ū": "u",
"ṻ": "u",
"ų": "u",
"ᶙ": "u",
"ů": "u",
"ũ": "u",
"ṹ": "u",
"ṵ": "u",
"ᵫ": "ue",
"": "um",
"ⱴ": "v",
"ꝟ": "v",
"ṿ": "v",
"ʋ": "v",
"": "v",
"ⱱ": "v",
"ṽ": "v",
"ꝡ": "vy",
"ẃ": "w",
"ŵ": "w",
"ẅ": "w",
"ẇ": "w",
"ẉ": "w",
"ẁ": "w",
"ⱳ": "w",
"ẘ": "w",
"ẍ": "x",
"ẋ": "x",
"ᶍ": "x",
"ý": "y",
"ŷ": "y",
"ÿ": "y",
"ẏ": "y",
"ỵ": "y",
"ỳ": "y",
"ƴ": "y",
"ỷ": "y",
"ỿ": "y",
"ȳ": "y",
"ẙ": "y",
"ɏ": "y",
"ỹ": "y",
"ź": "z",
"ž": "z",
"ẑ": "z",
"ʑ": "z",
"ⱬ": "z",
"ż": "z",
"ẓ": "z",
"ȥ": "z",
"ẕ": "z",
"ᵶ": "z",
"ᶎ": "z",
"ʐ": "z",
"ƶ": "z",
"ɀ": "z",
"ff": "ff",
"ffi": "ffi",
"ffl": "ffl",
"fi": "fi",
"fl": "fl",
"ij": "ij",
"œ": "oe",
"st": "st",
"ₐ": "a",
"ₑ": "e",
"ᵢ": "i",
"ⱼ": "j",
"ₒ": "o",
"ᵣ": "r",
"ᵤ": "u",
"ᵥ": "v",
"ₓ": "x"
}

View File

@ -25,14 +25,13 @@ it('can parse filenames', function () {
expect($parsedFilename->uuid)->toBeNull();
expect($parsedFilename->extension)->toBeNull();
expect($parsedFilename->getMovedFileName())->toBeNull();
});
it('can handles non-utf characters', function () {
it('can clean non-utf characters', function () {
$fileName = 'Образец_для_заполнения_85e16d7b-58ed-43bc-8dce-7d3ff7d69f41.png';
$parsedFilename = \App\Service\Storage\StorageFileNameParser::parse($fileName);
expect($parsedFilename->fileName)->toBe('Образец_для_заполнения');
expect($parsedFilename->uuid)->toBe('85e16d7b-58ed-43bc-8dce-7d3ff7d69f41');
expect($parsedFilename->extension)->toBe('png');
expect($parsedFilename->getMovedFileName())->toBe($fileName);
expect($parsedFilename->getMovedFileName())->toBe('___85e16d7b-58ed-43bc-8dce-7d3ff7d69f41.png');
});