diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8631082 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.php text eol=lf +*.json text eol=lf diff --git a/.github/workflows/PublishDocker.yml b/.github/workflows/PublishDocker.yml index 73dee66..517bae8 100644 --- a/.github/workflows/PublishDocker.yml +++ b/.github/workflows/PublishDocker.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Docker meta id: meta - uses: docker/metadata-action@v3 + uses: docker/metadata-action@v4 with: images: | ${{ secrets.DOCKERHUB_USERNAME }}/tinyfilemanager @@ -21,6 +21,8 @@ jobs: type=ref,event=branch type=ref,event=pr type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx @@ -35,4 +37,5 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: ${{ steps.meta.outputs.tags }} \ No newline at end of file + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/tinyfilemanager.php b/tinyfilemanager.php index 8dba40a..37bd371 100644 --- a/tinyfilemanager.php +++ b/tinyfilemanager.php @@ -4,7 +4,7 @@ $CONFIG = '{"lang":"en","error_reporting":false,"show_hidden":false,"hide_Cols": /** * H3K | Tiny File Manager V2.5.3 - * @author Prasath Mani | CCP Programmers + * @author CCP Programmers * @email ccpprogrammers@gmail.com * @github https://github.com/prasathmani/tinyfilemanager * @link https://tinyfilemanager.github.io @@ -77,6 +77,12 @@ $iconv_input_encoding = 'UTF-8'; // Doc - https://www.php.net/manual/en/function.date.php $datetime_format = 'm/d/Y g:i A'; +// Path display mode when viewing file information +// 'full' => show full path +// 'relative' => show path relative to root_path +// 'host' => show path on the host +$path_display_mode = 'full'; + // Allowed file extensions for create and rename files // e.g. 'txt,html,css,js' $allowed_file_extensions = ''; @@ -220,7 +226,7 @@ if (defined('FM_EMBED')) { mb_regex_encoding('UTF-8'); } - session_cache_limiter(''); + session_cache_limiter('nocache'); // Prevent logout issue after page was cached session_name(FM_SESSION_ID ); function session_error_handling_function($code, $msg, $file, $line) { // Permission denied for default session, try to create a new one @@ -235,7 +241,7 @@ if (defined('FM_EMBED')) { restore_error_handler(); } -//Genrating CSRF Token +//Generating CSRF Token if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } @@ -320,11 +326,11 @@ if ($use_auth) { if (isset($auth_users[$_POST['fm_usr']]) && isset($_POST['fm_pwd']) && password_verify($_POST['fm_pwd'], $auth_users[$_POST['fm_usr']]) && verifyToken($_POST['token'])) { $_SESSION[FM_SESSION_ID]['logged'] = $_POST['fm_usr']; fm_set_msg(lng('You are logged in')); - fm_redirect(FM_ROOT_URL); + fm_redirect(FM_SELF_URL); } else { unset($_SESSION[FM_SESSION_ID]['logged']); fm_set_msg(lng('Login failed. Invalid username or password'), 'error'); - fm_redirect(FM_ROOT_URL); + fm_redirect(FM_SELF_URL); } } else { fm_set_msg(lng('password_hash not supported, Upgrade PHP version'), 'error');; @@ -912,7 +918,6 @@ if (!empty($_FILES) && !FM_READONLY) { echo json_encode($response); exit(); } - $override_file_name = false; $chunkIndex = $_POST['dzchunkindex']; $chunkTotal = $_POST['dztotalchunkcount']; $fullPathInput = fm_clean_path($_REQUEST['fullpath']); @@ -950,11 +955,6 @@ if (!empty($_FILES) && !FM_READONLY) { $fullPath = $path . '/' . basename($fullPathInput); $folder = substr($fullPath, 0, strrpos($fullPath, "/")); - if(file_exists ($fullPath) && !$override_file_name && !$chunks) { - $ext_1 = $ext ? '.'.$ext : ''; - $fullPath = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1; - } - if (!is_dir($folder)) { $old = umask(0); mkdir($folder, 0777, true); @@ -967,7 +967,12 @@ if (!empty($_FILES) && !FM_READONLY) { if ($out) { $in = @fopen($tmp_name, "rb"); if ($in) { - while ($buff = fread($in, 4096)) { fwrite($out, $buff); } + if (PHP_VERSION_ID < 80009) { + // workaround https://bugs.php.net/bug.php?id=81145 + while (!feof($in)) { fwrite($out, fread($in, 4096)); } + } else { + stream_copy_to_stream($in, $out); + } $response = array ( 'status' => 'success', 'info' => "file upload successful" @@ -995,7 +1000,13 @@ if (!empty($_FILES) && !FM_READONLY) { } if ($chunkIndex == $chunkTotal - 1) { - rename("{$fullPath}.part", $fullPath); + if (file_exists ($fullPath)) { + $ext_1 = $ext ? '.'.$ext : ''; + $fullPathTarget = $path . '/' . basename($fullPathInput, $ext_1) .'_'. date('ymdHis'). $ext_1; + } else { + $fullPathTarget = $fullPath; + } + rename("{$fullPath}.part", $fullPathTarget); } } else if (move_uploaded_file($tmp_name, $fullPath)) { @@ -1677,7 +1688,8 @@ if (isset($_GET['view'])) {

""

- Full path:
+ + :
File size:
MIME-type:
image

'; + echo '

'; } } elseif ($is_audio) { // Audio content @@ -1936,7 +1948,8 @@ if (isset($_GET['chmod']) && !FM_READONLY && !FM_IS_WIN) {

- Full path:
+ + :

@@ -2049,6 +2062,12 @@ $tableTheme = (FM_THEME == "dark") ? "text-white bg-dark table-dark" : "bg-white if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) { $owner = posix_getpwuid(fileowner($path . '/' . $f)); $group = posix_getgrgid(filegroup($path . '/' . $f)); + if ($owner === false) { + $owner = array('name' => '?'); + } + if ($group === false) { + $group = array('name' => '?'); + } } else { $owner = array('name' => '?'); $group = array('name' => '?'); @@ -2102,6 +2121,12 @@ $tableTheme = (FM_THEME == "dark") ? "text-white bg-dark table-dark" : "bg-white if (function_exists('posix_getpwuid') && function_exists('posix_getgrgid')) { $owner = posix_getpwuid(fileowner($path . '/' . $f)); $group = posix_getgrgid(filegroup($path . '/' . $f)); + if ($owner === false) { + $owner = array('name' => '?'); + } + if ($group === false) { + $group = array('name' => '?'); + } } else { $owner = array('name' => '?'); $group = array('name' => '?'); @@ -2495,6 +2520,30 @@ function fm_get_parent_path($path) return false; } +function fm_get_display_path($file_path) +{ + global $path_display_mode, $root_path, $root_url; + switch ($path_display_mode) { + case 'relative': + return array( + 'label' => 'Path', + 'path' => fm_enc(fm_convert_win(str_replace($root_path, '', $file_path))) + ); + case 'host': + $relative_path = str_replace($root_path, '', $file_path); + return array( + 'label' => 'Host Path', + 'path' => fm_enc(fm_convert_win('/' . $root_url . '/' . ltrim(str_replace('\\', '/', $relative_path), '/'))) + ); + case 'full': + default: + return array( + 'label' => 'Full Path', + 'path' => fm_enc(fm_convert_win($file_path)) + ); + } +} + /** * Check file is in exclude list * @param string $file @@ -3703,7 +3752,9 @@ $isStickyNavBar = $sticky_navbar ? 'navbar-fixed' : 'navbar-normal'; .message.ok { border-color:green;color:green } .message.error { border-color:red;color:red } .message.alert { border-color:orange;color:orange } - .preview-img { max-width:100%;max-height:80vh;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5//8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC) } + .preview-img { max-width:100%;max-height:80vh;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAKklEQVR42mL5//8/Azbw+PFjrOJMDCSCUQ3EABZc4S0rKzsaSvTTABBgAMyfCMsY4B9iAAAAAElFTkSuQmCC);cursor:zoom-in } + input#preview-img-zoomCheck[type=checkbox] { display:none } + input#preview-img-zoomCheck[type=checkbox]:checked ~ label > img { max-width:none;max-height:none;cursor:zoom-out } .inline-actions > a > i { font-size:1em;margin-left:5px;background:#3785c1;color:#fff;padding:3px 4px;border-radius:3px; } .preview-video { position:relative;max-width:100%;height:0;padding-bottom:62.5%;margin-bottom:10px } .preview-video video { position:absolute;width:100%;height:100%;left:0;top:0;background:#000 } diff --git a/translation.json b/translation.json index 8a3d37b..7872bbc 100644 --- a/translation.json +++ b/translation.json @@ -8,79 +8,79 @@ "translation": { "AppName": "Tiny File Manager", "AppTitle": "Titlu aplicație", - "Login": "Logare", + "Login": "Autentificare", "Username": "Nume utilizator", - "Password": "Parola", - "Logout": "Delogare", + "Password": "Parolă", + "Logout": "Ieșire", "Move": "Mută", "Copy": "Copiază", "Save": "Salvează", - "SelectAll": "Selectează Tot", - "UnSelectAll": "Deselectează Tot", + "SelectAll": "Selectează tot", + "UnSelectAll": "Deselectează tot", "File": "Fișier", "Back": "Înapoi", - "Size": "Mărime", + "Size": "Dimensiune", "Perms": "Permisiuni", "Modified": "Modificat", - "Owner": "Titular", + "Owner": "Proprietar", "Search": "Caută", "NewItem": "Nou", "Folder": "Dosar", "Delete": "Șterge", "Rename": "Redenumește", - "CopyTo": "Copiază În", - "DirectLink": "Link Direct", - "UploadingFiles": "Încarcă Fișiere", - "ChangePermissions": "Schimbă Permisiuni", - "Copying": "Copiază", - "CreateNewItem": "Creează Obiect Nou", - "Name": "Nume", - "AdvancedEditor": "Editor Avansat", - "RememberMe": "Ține-mă Minte", + "CopyTo": "Copiază în", + "DirectLink": "Legătură directă", + "UploadingFiles": "Se încarcă fișiere", + "ChangePermissions": "Schimbă permisiunile", + "Copying": "Se copiază", + "CreateNewItem": "Creează element nou", + "Name": "Denumire", + "AdvancedEditor": "Redactor avansat", + "RememberMe": "Ține-mă minte", "Actions": "Acțiuni", "Upload": "Încarcă", "Cancel": "Anulează", - "InvertSelection": "Selectare Inversă", - "DestinationFolder": "Dosar Destinație", - "ItemType": "Tip Obiect", - "ItemName": "Nume obiect", - "CreateNow": "Creează Acum", + "InvertSelection": "Inversează selecția", + "DestinationFolder": "Dosar destinație", + "ItemType": "Tip element", + "ItemName": "Denumire element", + "CreateNow": "Creează acum", "Download": "Descarcă", "Open": "Deschide", "UnZip": "Decomprimă", - "UnZipToFolder": "Decomprimă în Dosar", - "Edit": "Editează", - "NormalEditor": "Editor Standard", - "BackUp": "Copie de Siguranță", - "SourceFolder": "Dosar Sursă", + "UnZipToFolder": "Decomprimă în dosar", + "Edit": "Modifică", + "NormalEditor": "Redactor standard", + "BackUp": "Copie de rezervă", + "SourceFolder": "Dosar sursă", "Files": "Fișiere", "Change": "Schimbă", - "Settings": "Setari", + "Settings": "Configurări", "Language": "Limba", - "MemoryUsed": "Memorie Utilizată", - "PartitionSize": "Dimensiune Partiție", - "ErrorReporting": "Raportare de Erori", - "ShowHiddenFiles": "Arată Fișiere Ascunse", - "Full size": "Dimensiune Totală", + "MemoryUsed": "Memorie utilizată", + "PartitionSize": "Dimensiune partiție", + "ErrorReporting": "Raportare erori", + "ShowHiddenFiles": "Arată fișiere ascunse", + "Full size": "Dimensiune totală", "Help": "Ajutor", "Free of": "Liber din", "Preview": "Previzualizează", "Help Documents": "Documentație", - "Report Issue": "Raportează o Problemă", + "Report Issue": "Raportează defect", "Generate": "Generează", - "FullSize": "Mărime Maximă", + "FullSize": "Dimensiune completă", "FreeOf": "Liber din", - "CalculateFolderSize": "Calculează spațiul acupat de dosar", - "ProcessID": "Id instanță", + "CalculateFolderSize": "Calculează dimensiunea dosarului", + "ProcessID": "Id. proces", "Created": "Creat", - "HideColumns": "Ascunde Coloanele", + "HideColumns": "Ascunde coloanele", "Folder is empty": "Dosarul este gol", "Check Latest Version": "Verifică ultima versiune", "Generate new password hash": "Generează hash nou parolă", - "You are logged in": "Sunteti logat/ă", - "Login failed. Invalid username or password": "Autentificare eșuată. Credențialele nu sunt valide (utilizator/parolă)", - "password_hash not supported, Upgrade PHP version": "Generare hash parolă nesuportată, actualizați interpretorul PHP de pe server", - "Theme": "Tema", + "You are logged in": "Sunteți autentificat", + "Login failed. Invalid username or password": "Autentificare eșuată. Utilizator sau parolă incorecte", + "password_hash not supported, Upgrade PHP version": "Generare hash parolă nesuportată, actualizați versiunea de PHP", + "Theme": "Tematică", "dark": "Întunecată", "light": "Luminoasă" } @@ -2682,6 +2682,130 @@ "password_hash not supported, Upgrade PHP version": "password_hash er ikke understøttet, opgrader PHP-versionen", "to": "til" } + }, + { + "name": "Bengali", + "code": "bn", + "translation": { + "Access denied. IP restriction applicable": "অ্যাক্সেস অস্বীকার করা হয়েছে৷ আইপি সীমাবদ্ধতা প্রযোজ্য", + "Actions": "একশন্স", + "Advanced Search": "উন্নত অনুসন্ধান", + "AdvancedEditor": "উন্নত এডিটর", + "AppTitle": "ফাইল ম্যানেজার", + "Archive not created": "আর্কাইভ তৈরি করা হয়নি", + "Archive not unpacked": "আর্কাইভ প্যাক করা হয়নি", + "Archive unpacked": "আর্কাইভ আনপ্যাক", + "Archive": "আর্কাইভ", + "Back": "পেছনে", + "BackUp": "ব্যাকআপ", + "CalculateFolderSize": "ফোল্ডার সাইজ গণনা করুন", + "Cancel": "বাতিল করুন", + "Change": "পরিবর্তন", + "ChangePermissions": "অনুমতি পরিবর্তন করুন", + "Check Latest Version": "সর্বশেষ সংস্করণ পরীক্ষা করুন", + "Copied from": "থেকে কপি করা হয়েছে", + "Copy": "কপি", + "CopyTo": "কপি করুন", + "Copying": "কপি করা হচ্ছে", + "Create archive?": "নতুন আর্কাইভ তৈরি করুন", + "CreateNewItem": "নতুন আইটেম তৈরি করুন", + "CreateNow": "এখন তৈরি করুন", + "Created": "তৈরি করা হয়েছে", + "Delete selected files and folders?": "নির্বাচিত ফাইল এবং ফোল্ডার মুছবেন?", + "Delete": "মুছে ফেলা", + "Deleted": "মুছে ফেলা হয়েছে", + "DestinationFolder": "গন্তব্য ফোল্ডার", + "DirectLink": "সরাসরি লিঙ্ক", + "Download": "ডাউনলোড", + "Edit": "এডিট", + "Error while copying from": "থেকে কপি করার সময় ত্রুটি", + "Error while deleting items": "থেকে মুছে ফেলার সময় ত্রুটি", + "Error while fetching archive info": "আর্কাইভ তথ্য আনার সময় ত্রুটি", + "Error while moving from": "থেকে সরানোর সময় ত্রুটি", + "Error while renaming from": "থেকে নাম পরিবর্তন করার সময় ত্রুটি", + "ErrorReporting": "এরর রিপোর্টিং", + "Execute": "এক্সিকিউট", + "FILE EXTENSION HAS NOT SUPPORTED": "ফাইল এক্সটেনশন সমর্থিত নয়", + "File Saved Successfully": "ফাইল সফলভাবে সংরক্ষিত হয়েছে৷", + "File extension is not allowed": "ফাইল এক্সটেনশন অনুমোদিত নয়", + "File not found": "ফাইল পাওয়া যায়নি", + "File or folder with this path already exists": "এই পথ সহ ফাইল বা ফোল্ডার ইতিমধ্যেই বিদ্যমান", + "File": "ফাইল", + "Files": "ফাইলস", + "Folder is empty": "ফোল্ডার খালি", + "Folder": "ফোল্ডার", + "FreeOf": "মুক্ত", + "FullSize": "ফুল সাইজ", + "Generate new password hash": "নতুন পাসওয়ার্ড হ্যাশ তৈরি করুন", + "Generate": "উৎপন্ন", + "Group": "গ্রুপ", + "Help Documents": "হেল্প ডকুমেন্টস", + "Help": "সাহায্য", + "HideColumns": "কলাম লুকান", + "Invalid characters in file name": "ফাইলের নামে অবৈধ অক্ষর", + "Invalid characters in file or folder name": "ফাইল বা ফোল্ডার নামের অবৈধ অক্ষর", + "Invalid file or folder name": "অবৈধ ফাইল বা ফোল্ডারের নাম", + "InvertSelection": "উল্টে নির্বাচন করুন", + "ItemName": "আইটেম নাম", + "ItemType": "আইটেম ধরন", + "Language": "ভাষা", + "Login failed. Invalid username or password": "লগইন ব্যর্থ. অবৈধ ব্যবহারকারীর নাম বা পাসওয়ার্ড", + "Login": "লগইন", + "Logout": "লগআউট", + "Modified": "পরিবর্তিত", + "Move": "সরান", + "Moved from": "থেকে সরানো", + "Name": "নাম", + "NewItem": "নতুন আইটেম", + "NormalEditor": "সাধারণ এডিটর", + "Nothing selected": "কিছুই নির্বাচিত নয়", + "Open": "খোলা", + "Operations with archives are not available": "আর্কাইভ সহ অপারেশন পাওয়া যায়নি", + "Other": "অন্যান্য", + "Owner": "মালিক", + "PartitionSize": "পার্টিশনের মাপ", + "Password": "পাসওয়ার্ড", + "Paths must be not equal": "পথ সমান হতে হবে না", + "Permissions changed": "অনুমতি পরিবর্তন", + "Permissions not changed": "অনুমতি পরিবর্তন করা হয়নি", + "Perms": "পারমস", + "Preview": "পূর্বরূপ", + "Read": "পড়ুন", + "Rename": "নাম পরিবর্তন করা হয়েছে", + "Renamed from": "থেকে নাম পরিবর্তন করা হয়েছে", + "Report Issue": "ইস্যুস রিপোর্ট করুন", + "Root path": "রুট পথ", + "Save": "সংরক্ষণ", + "Search file in folder and subfolders...": "ফোল্ডার এবং সাবফোল্ডারে ফাইল অনুসন্ধান করুন...", + "Search": "অনুসন্ধান করুন", + "Select folder": "ফোল্ডার নির্বাচন করুন", + "SelectAll": "সব নির্বাচন করুন", + "Selected files and folder deleted": "নির্বাচিত ফাইল এবং ফোল্ডার মুছে ফেলা হয়েছে", + "Settings": "সেটিংস", + "ShowHiddenFiles": "গোপন ফাইলগুলো দেখুন", + "Size": "সাইজ", + "Source path not defined": "সোর্স পথ সংজ্ঞায়িত করা হয়নি", + "SourceFolder": "সোর্স ফোল্ডার", + "Tar": "টার", + "Theme": "থিম", + "UnSelectAll": "সরিয়ে ফেলুন সব", + "UnZip": "আনজিপ করুন", + "UnZipToFolder": "ফোল্ডারে আনজিপ", + "Upload": "আপলোড", + "UploadingFiles": "ফাইল আপলোড করা হচ্ছে", + "Username": "ব্যবহারকারীর নাম", + "Write": "লিখুন", + "You are logged in": "আপনি লগ ইন করছেন", + "Zip": "জিপ", + "already exists": "আগে থেকেই আছে", + "dark": "ডার্ক", + "light": "লাইট", + "not created": "তৈরি করা হয়নি", + "not deleted": "মুছে ফেলা হয়নি", + "not found!": "পাওয়া যায় নি!", + "password_hash not supported, Upgrade PHP version": "পাসওয়ার্ড_হ্যাশ সমর্থিত নয়, পিএইচপি ভার্সন আপগ্রেড করুন", + "to": "to" + } } ] }