From 1dd38c4be28503275e63c90bc81254b0973ddb57 Mon Sep 17 00:00:00 2001 From: "H.Rouatbi" Date: Sat, 31 Aug 2024 17:01:46 +0100 Subject: [PATCH] Add group max storage --- go.php | 15 ++++++++++- includes/adm/c_files.php | 19 +++++++++++--- includes/adm/d_img_ctrl.php | 5 ++++ includes/adm/g_users.php | 3 ++- includes/up_methods/defaultUploader.php | 23 ++++++++++++++++- index.php | 3 +-- install/includes/default_values.php | 1 + install/includes/install_sqls.php | 1 + lang/ar/acp.php | 1 + lang/ar/common.php | 3 +++ lang/en/acp.php | 1 + lang/en/common.php | 3 +++ lang/fa/acp.php | 1 + lang/fa/common.php | 3 +++ styles/bootstrap/fileuser.html | 14 +++++++++++ styles/bootstrap/footer.html | 16 ++++++++++++ ucp.php | 33 +++++++++++++++++++++++++ 17 files changed, 136 insertions(+), 9 deletions(-) diff --git a/go.php b/go.php index f4c5dd4..8a75c0a 100755 --- a/go.php +++ b/go.php @@ -361,7 +361,7 @@ switch ($current_go_case) if (ig('sure') && g('sure') == 'ok') { $query = [ - 'SELECT' => 'f.id, f.name, f.folder, f.size, f.type', + 'SELECT' => 'f.id, f.name, f.folder, f.size, f.type, f.user', 'FROM' => "{$dbprefix}files f", 'WHERE' => "f.code_del='" . $cd . "'", 'LIMIT' => '1', @@ -402,6 +402,19 @@ switch ($current_go_case) ]; $SQL->build($update_query); + + if ($row['user']!=-1) + { + //update user storage size + $update_query = [ + 'UPDATE' => "{$dbprefix}users", + 'SET' => 'storage_size=storage_size-' . $row['size'], + 'WHERE' => 'id=' . $row['user'], + ]; + + $SQL->build($update_query); + } + kleeja_info($lang['DELETE_SUCCESFUL']); } else diff --git a/includes/adm/c_files.php b/includes/adm/c_files.php index 7d7e3e6..cc23586 100755 --- a/includes/adm/c_files.php +++ b/includes/adm/c_files.php @@ -66,7 +66,7 @@ if (ip('submit')) foreach ($del as $key => $id) { $query = [ - 'SELECT' => 'f.id, f.name, f.folder, f.size, f.type', + 'SELECT' => 'f.id, f.name, f.folder, f.size, f.type, f.user', 'FROM' => "{$dbprefix}files f", 'WHERE' => 'f.id = ' . intval($id), ]; @@ -96,6 +96,11 @@ if (ip('submit')) $files_num++; } $sizes += $row['size']; + + //Subtract size from storage of the user + if ($row['user'] != -1) { + $SQL->query("UPDATE {$dbprefix}users SET storage_size=storage_size-".$row['size']." WHERE id=".$row['user']); + } } } @@ -436,18 +441,18 @@ elseif ($current_smt == 'delete_by_extension') $ext = p('selected_extnsion'); $query = [ - 'SELECT' => 'id, name, type, size', + 'SELECT' => 'id, name, type, size, user', 'FROM' => $dbprefix . 'files', 'WHERE' => 'type = \'' . $ext . '\'' ]; - $SQL->build($query); + $result = $SQL->build($query); $deleted_files = []; $fileSizes = 0; if ($SQL->num_rows()) { - while ($file = $SQL->fetch()) + while ($file = $SQL->fetch_array($result)) { $fileLocation = PATH . 'uploads/' . $file['name']; $thumbFileLocation = PATH . 'uploads/thumbs/' . $file['name']; @@ -463,6 +468,11 @@ elseif ($current_smt == 'delete_by_extension') } $fileSizes += $file['size']; $deleted_files[] = $file['id']; + + //Subtract size from storage of the user + if ($file['user'] != -1) { + $SQL->query("UPDATE {$dbprefix}users SET storage_size=storage_size-".$file['size']." WHERE id=".$file['user']); + } } if (($deletedFileCount = count($deleted_files)) <= 1) @@ -481,6 +491,7 @@ elseif ($current_smt == 'delete_by_extension') $SQL->query($update_stats); } + $SQL->freeresult($result); kleeja_admin_info($lang['ADMIN_DELETE_FILE_OK'], true, '', true, $action); exit; diff --git a/includes/adm/d_img_ctrl.php b/includes/adm/d_img_ctrl.php index 15f0132..3d67767 100755 --- a/includes/adm/d_img_ctrl.php +++ b/includes/adm/d_img_ctrl.php @@ -71,6 +71,11 @@ if (ip('submit')) $ids[] = $row['id']; $num++; $sizes += $row['size']; + + //Subtract size from storage of the user + if ($row['user'] != -1) { + $SQL->query("UPDATE {$dbprefix}users SET storage_size=storage_size-".$row['size']." WHERE id=".$row['user']); + } } $SQL->freeresult($result); diff --git a/includes/adm/g_users.php b/includes/adm/g_users.php index cec9247..fb5b710 100755 --- a/includes/adm/g_users.php +++ b/includes/adm/g_users.php @@ -868,7 +868,8 @@ case 'group_data': } } - if ($req_group == 2 && in_array($row['name'], ['enable_userfile'])) + $guest_disallowed_configs = ['enable_userfile', 'max_storage']; + if ($req_group == 2 && in_array($row['name'], $guest_disallowed_configs)) { continue; } diff --git a/includes/up_methods/defaultUploader.php b/includes/up_methods/defaultUploader.php index 459f7c7..20e680c 100755 --- a/includes/up_methods/defaultUploader.php +++ b/includes/up_methods/defaultUploader.php @@ -181,6 +181,19 @@ class defaultUploader implements KleejaUploader $SQL->build($update_query); + if ($fileInfo['currentUserId']!=-1) + { + // update user storage size + $update_query = [ + 'UPDATE' => "{$dbprefix}users", + 'SET' => 'storage_size=storage_size+' . intval($fileInfo['fileSize']), + 'WHERE' => 'id=' . $fileInfo['currentUserId'], + ]; + + $SQL->build($update_query); + } + + $this->generateOutputBox($fileInfo); } @@ -483,7 +496,7 @@ class defaultUploader implements KleejaUploader */ public function uploadTypeFile($fieldNumber, $current_uploading_folder, $current_user_id) { - global $config, $lang; + global $config, $lang, $remaining_storage; $fileInfo = [ 'saveToFolder', @@ -582,6 +595,10 @@ class defaultUploader implements KleejaUploader ) ); } + elseif ($remaining_storage != -1 && $fileInfo['fileSize'] > $remaining_storage) + { + $this->addErrorMessage($lang['TOTAL_SIZE_EXCEEDED']); + } // no errors, so upload it else { is_array($plugin_run_result = Plugins::getInstance()->run('defaultUploader_uploadTypeFile_2nd', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook @@ -591,6 +608,10 @@ class defaultUploader implements KleejaUploader if ($file) { $this->saveToDatabase($fileInfo); + if ($remaining_storage != -1) + { + $remaining_storage -= $fileInfo['fileSize']; + } } else { $this->addErrorMessage(sprintf($lang['CANT_UPLAOD'], $fileInfo['originalFileName'])); } diff --git a/index.php b/index.php index 9128bc9..e459180 100755 --- a/index.php +++ b/index.php @@ -62,8 +62,7 @@ if (! $uploader instanceof KleejaUploader) { $uploader->setAllowedFileExtensions($d_groups[$userinfo['group_id']]['exts']); $uploader->setUploadFieldsLimit($config['filesnum']); - - +$remaining_storage = $d_groups[$userinfo['group_id']]['configs']['max_storage']>0 ? $d_groups[$userinfo['group_id']]['configs']['max_storage']-$userinfo['storage_size'] : -1; if (ip('submitr')) { diff --git a/install/includes/default_values.php b/install/includes/default_values.php index 4508604..f3749f9 100755 --- a/install/includes/default_values.php +++ b/install/includes/default_values.php @@ -37,6 +37,7 @@ $config_values[] = ['user_system', '1', ' checked=\"checked\" />\r\n ', 10, 'general', 0, 0]; $config_values[] = ['enable_userfile', '1', '\r\n ', 11, 'groups', 0, 0]; $config_values[] = ['mod_writer', '0', '\r\n \r\n [ {lang.MOD_WRITER_EX} ]', 12, 'advanced', 0, 0]; +$config_values[] = ['max_storage', '0', '', 11, 'groups', 0, 0]; // Cookies settings $cookie_data = get_cookies_settings(); diff --git a/install/includes/install_sqls.php b/install/includes/install_sqls.php index 9545245..475c008 100755 --- a/install/includes/install_sqls.php +++ b/install/includes/install_sqls.php @@ -87,6 +87,7 @@ CREATE TABLE `{$dbprefix}users` ( `show_my_filecp` tinyint(1) unsigned NOT NULL default '1', `new_password` varchar(200) COLLATE utf8_bin NOT NULL DEFAULT '', `hash_key` varchar(200) COLLATE utf8_bin NOT NULL DEFAULT '', + `storage_size` bigint(20) NOT NULL DEFAULT '0', KEY `clean_name` (`clean_name`(300)), KEY `group_id` (`group_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; diff --git a/lang/ar/acp.php b/lang/ar/acp.php index 29eee37..38c69c9 100755 --- a/lang/ar/acp.php +++ b/lang/ar/acp.php @@ -103,6 +103,7 @@ return [ 'SEARCH_USERS' => 'بحث عن مستخدمين', 'R_IMG_CTRL' => 'إدارة الصور', 'ENABLE_USERFILE' => 'تفعيل مجلدات المستخدمين', + 'MAX_STORAGE' => 'الحد الأقصى للتخزين (بايت)', 'R_EXTRA' => 'هيدر وفوتر إضافي', 'EX_HEADER_N' => 'الهيدر الإضافي.. وهو ما يظهر أسفل الهيدر الأصلي ..', 'EX_FOOTER_N' => 'الفوتر الإضافي.. وهو ما يظهر أعلى الفوتر الأصلي ..', diff --git a/lang/ar/common.php b/lang/ar/common.php index 922ab62..e8e19fc 100755 --- a/lang/ar/common.php +++ b/lang/ar/common.php @@ -94,6 +94,8 @@ return [ 'URL' => 'الرابط', 'REASON' => 'السبب', 'NO_ID' => 'لم تحدد ملف..!', + 'TOTAL_SIZE_EXCEEDED' => 'لقد تم تجاوز الحجم الإجمالي', + 'STORAGE_USAGE' => '%s من %s', 'NO_ME300RES' => 'رجاءً.. حقل السبب لا يمكن ملأه بأكثر من 300 حرف!', 'THNX_REPORTED' => 'تم التبليغ.. شكراً لاهتمامك', 'RULES' => 'شروط الخدمة', @@ -116,6 +118,7 @@ return [ 'IMAGE' => 'صورة', 'USERS_ST' => 'عدد الأعضاء', 'USER' => 'عضو', + 'USED_SPACE' => 'المساحة المستخدمة', 'SIZES_ST' => 'حجم جميع الملفات', //'LSTFLE_ST' => 'آخر ملف تم رفعه', 'LSTDELST' => 'آخر فحص للملفات الخاملة ', diff --git a/lang/en/acp.php b/lang/en/acp.php index 14df60e..6aff817 100755 --- a/lang/en/acp.php +++ b/lang/en/acp.php @@ -102,6 +102,7 @@ return [ 'SEARCH_USERS' => 'Search for users', 'R_IMG_CTRL' => 'Image control only', 'ENABLE_USERFILE' => 'Enable users files', + 'MAX_STORAGE' => 'Maximum storage (Bytes)', 'R_EXTRA' => 'Extra Templates', 'EX_HEADER_N' => 'Extra header ... which shows at the bottom of the original header', 'EX_FOOTER_N' => 'Extra footer ... which shows at the top of the original footer', diff --git a/lang/en/common.php b/lang/en/common.php index 0351afb..9d013b4 100755 --- a/lang/en/common.php +++ b/lang/en/common.php @@ -90,6 +90,8 @@ return [ 'URL' => 'Link', 'REASON' => 'Reason', 'NO_ID' => 'No file selected ..!!', + 'TOTAL_SIZE_EXCEEDED' => 'The total size has been exceeded', + 'STORAGE_USAGE' => '%s of %s', 'NO_ME300RES' => 'The Reason field cannot be more than 300 characters!!', 'THNX_REPORTED' => 'We have received your report, Thank you.', 'RULES' => 'Terms', @@ -111,6 +113,7 @@ return [ 'IMAGE' => 'Image', 'USERS_ST' => 'Total Users', 'USER' => 'user', + 'USED_SPACE' => 'Used Space', 'SIZES_ST' => 'Total size of uploaded files', 'LSTDELST' => 'Last check for un-downloaded (inactive) files', diff --git a/lang/fa/acp.php b/lang/fa/acp.php index 7b1984c..cb91e5d 100644 --- a/lang/fa/acp.php +++ b/lang/fa/acp.php @@ -103,6 +103,7 @@ return [ 'SEARCH_USERS' => 'جست وجو براي کاربر', 'R_IMG_CTRL' => 'کنترل تصاوير', 'ENABLE_USERFILE' => 'فعال سازي فايل هاي کاربران', + 'MAX_STORAGE' => 'حداکثر ذخیره سازی (بایت)', 'R_EXTRA' => 'قالب هاي اضافي', 'EX_HEADER_N' => 'هدر اضافي... هدري که در زير هدر اصلي نمايش داده خواهد شد.', 'EX_FOOTER_N' => 'فوتر اضافي...فوتري که در بالاي فوتر اصلي نمايش داده خواهد شد.', diff --git a/lang/fa/common.php b/lang/fa/common.php index 1d340d1..8dc3f3a 100644 --- a/lang/fa/common.php +++ b/lang/fa/common.php @@ -94,6 +94,8 @@ return [ 'URL' => 'ادرس', 'REASON' => 'دلیل (توضیحات)', 'NO_ID' => 'فایلی انتخاب نشده است..!!!', + 'TOTAL_SIZE_EXCEEDED' => 'از اندازه کل فراتر رفته است', + 'STORAGE_USAGE' => '%s از %s', 'NO_ME300RES' => 'توضیحات نمی تواند بیشتر از 300 کاراکتر باشند!!', 'THNX_REPORTED' => 'ما گزارش شما را دریافت کردیم ، متشکریم.', 'RULES' => 'قوانین', @@ -116,6 +118,7 @@ return [ 'IMAGE' => 'تصویر', 'USERS_ST' => 'مجموع کاربران', 'USER' => 'کاربر', + 'USED_SPACE' => 'فضای مورد استفاده', 'SIZES_ST' => 'مجموع حجم فایل های اپلود شده', //'LSTFLE_ST' => 'اخرین اپلود', 'LSTDELST' => 'آخرین عملیات چک کردن فایلهای دانلود نشده', diff --git a/styles/bootstrap/fileuser.html b/styles/bootstrap/fileuser.html index 0c34528..76dd3eb 100755 --- a/styles/bootstrap/fileuser.html +++ b/styles/bootstrap/fileuser.html @@ -93,6 +93,20 @@ + +
+
{lang.USED_SPACE}
+
+ {storage_usage_str} + +
+
+
+ {nums_rows} Files +
+
+
+
diff --git a/styles/bootstrap/footer.html b/styles/bootstrap/footer.html index bd9022e..be6a006 100755 --- a/styles/bootstrap/footer.html +++ b/styles/bootstrap/footer.html @@ -76,6 +76,7 @@ $(document).ready(function(){ $("#uploader input:file").change(function (){ if(!check_selected_file(this)){ $(this).val(''); + this.dataset.previousSize = 0; // Reset previous size if file is invalid }else{ if($(this).data('number') !== null){ var selected_text = $('#file-text' + $(this).data('number')); @@ -96,6 +97,8 @@ $(document).ready(function(){ var allowed_exts = {js_allowed_extensions_types}; var allowed_sizes = {js_allowed_extensions_sizes}; +var remaining_storage = {remaining_storage}; +var totalSize = 0; function check_selected_file(file) { var selected_file = file.files[0]; @@ -124,6 +127,19 @@ function check_selected_file(file) { } } + // Subtract the previous file size and add the new file size + var previousSize = parseInt(file.dataset.previousSize || 0); + totalSize = totalSize - previousSize + file_size; + + if (remaining_storage != -1 && totalSize > remaining_storage){ + totalSize = totalSize - file_size + previousSize; // Revert the change + alert('{lang.TOTAL_SIZE_EXCEEDED}'); + return false; + } + + // Update the previous size for this file input + file.dataset.previousSize = file_size; + return true; } diff --git a/ucp.php b/ucp.php index c6b3d0d..27784b0 100755 --- a/ucp.php +++ b/ucp.php @@ -343,6 +343,21 @@ switch (g('go')) $start = $Pager->getStartRow(); $your_fileuser = $config['siteurl'] . ($config['mod_writer'] ? 'fileuser-' . $usrcp->id() . '.html' : 'ucp.php?go=fileuser&id=' . $usrcp->id()); + if($user_himself) + { + $used_storage = $userinfo['storage_size']; + $max_storage = $d_groups[$usrcp->group_id()]['configs']['max_storage']; + $is_limited = $max_storage>0; + if($is_limited) + { + $storage_per = ($used_storage*100)/$max_storage; + $storage_per = round($storage_per, 2); + $storage_per = min($storage_per,100); + $max_storage = readable_size($max_storage); + } + $used_storage = readable_size($used_storage); + $storage_usage_str = sprintf($lang['STORAGE_USAGE'], $used_storage, $is_limited ? $max_storage : '∞'); + } $total_pages = $Pager->getTotalPages(); $linkgoto = $config['siteurl'] . ( $config['mod_writer'] @@ -505,6 +520,15 @@ switch (g('go')) ]; $SQL->build($update_query); + + //update storage + $update_query = [ + 'UPDATE' => "{$dbprefix}users", + 'SET' => "storage_size=storage_size-$sizes", + 'WHERE' => "id=$user_id", + ]; + + $SQL->build($update_query); } //delete is ok, show msg @@ -539,6 +563,15 @@ switch (g('go')) ]; $SQL->build($update_query); + + //update storage + $update_query = [ + 'UPDATE' => "{$dbprefix}users", + 'SET' => "storage_size=storage_size-$sizes", + 'WHERE' => "id=$user_id", + ]; + + $SQL->build($update_query); }