From 0ead7535de2ef59e10138772ef4bfa0b9d4c4fe8 Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 28 Jan 2025 06:13:54 -0800 Subject: [PATCH] add wiki editors list Signed-off-by: Aditya --- src/configs/Config.php | 2 +- src/configs/Createdb.php | 2 +- src/controllers/RegisterController.php | 4 +- .../components/AccountaccessComponent.php | 8 +- .../components/SocialComponent.php | 85 +++++++- src/library/VersionFunctions.php | 22 +- src/locale/ar/configure.ini | 1 + src/locale/bn/configure.ini | 1 + src/locale/de/configure.ini | 1 + src/locale/el_GR/configure.ini | 1 + src/locale/en_US/configure.ini | 1 + src/locale/es/configure.ini | 1 + src/locale/fa/configure.ini | 1 + src/locale/fr_FR/configure.ini | 3 +- src/locale/he/configure.ini | 4 +- src/locale/hi/configure.ini | 1 + src/locale/id/configure.ini | 1 + src/locale/it/configure.ini | 1 + src/locale/ja/configure.ini | 1 + src/locale/kn/configure.ini | 1 + src/locale/ko/configure.ini | 1 + src/locale/nl/configure.ini | 1 + src/locale/pl/configure.ini | 1 + src/locale/pt/configure.ini | 1 + src/locale/ru/configure.ini | 1 + src/locale/te/configure.ini | 1 + src/locale/th/configure.ini | 1 + src/locale/tl/configure.ini | 1 + src/locale/tr/configure.ini | 1 + src/locale/vi_VN/configure.ini | 1 + src/locale/zh_CN/configure.ini | 1 + src/models/GroupModel.php | 188 +++++++++++++++++- src/models/ProfileModel.php | 6 + src/views/elements/GroupbarElement.php | 1 + src/views/elements/ManagegroupsElement.php | 15 ++ src/views/helpers/GrouplistHelper.php | 1 + tests/ManyUserExperiment.php | 4 +- 37 files changed, 349 insertions(+), 19 deletions(-) diff --git a/src/configs/Config.php b/src/configs/Config.php index 985a40206..05c115600 100755 --- a/src/configs/Config.php +++ b/src/configs/Config.php @@ -162,7 +162,7 @@ nsconddefine('GENERATOR_STRING', "Yioop"); * Version number for upgrade database function * @var int */ -nsdefine('DATABASE_VERSION', 81); +nsdefine('DATABASE_VERSION', 82); /** * Minimum Version fo Yioop for which keyword ad script * still works with this version diff --git a/src/configs/Createdb.php b/src/configs/Createdb.php index c7e6e6cea..bc1797d60 100755 --- a/src/configs/Createdb.php +++ b/src/configs/Createdb.php @@ -150,7 +150,7 @@ $root_group_name = C\PERSONAL_GROUP_PREFIX . ROOT_ID; $group_model = new GroupModel(DB_NAME, false); $group_model->db = $db; $group_model->addGroup($root_group_name, - ROOT_ID, C\INVITE_ONLY_JOIN, C\ACTIVE_STATUS, + ROOT_ID, ["root"], C\INVITE_ONLY_JOIN, C\ACTIVE_STATUS, C\NON_VOTING_GROUP, C\FOREVER, 0); /* public account is an inactive account for used for public permissions default account is root without a password diff --git a/src/controllers/RegisterController.php b/src/controllers/RegisterController.php index 9f1b3def1..c76dcfeff 100755 --- a/src/controllers/RegisterController.php +++ b/src/controllers/RegisterController.php @@ -322,8 +322,8 @@ class RegisterController extends Controller implements CrawlConstants $user['USER_ID']; if ($group_model->getGroupId($personal_group_name) < 0) { $group_model->addGroup($personal_group_name, - $user['USER_ID'], C\INVITE_ONLY_JOIN, C\ACTIVE_STATUS, - C\NON_VOTING_GROUP, C\FOREVER, 0); + $user['USER_ID'], [$user['USER_NAME']], C\INVITE_ONLY_JOIN, + C\ACTIVE_STATUS, C\NON_VOTING_GROUP, C\FOREVER, 0); } } unset($_SESSION['RECOVERY_ANSWERS']); diff --git a/src/controllers/components/AccountaccessComponent.php b/src/controllers/components/AccountaccessComponent.php index 0b498bf4a..76caf2b1d 100644 --- a/src/controllers/components/AccountaccessComponent.php +++ b/src/controllers/components/AccountaccessComponent.php @@ -166,7 +166,7 @@ class AccountaccessComponent extends Component if (($personal_group_id = $group_model->getGroupId($personal_group_name)) < 0) { $personal_group_id = $group_model->addGroup($personal_group_name, - $user_id, C\INVITE_ONLY_JOIN, C\ACTIVE_STATUS, + $user_id, [$username], C\INVITE_ONLY_JOIN, C\ACTIVE_STATUS, C\NON_VOTING_GROUP, C\FOREVER, 0); } $this->initSocialBadges($user_id, $data); @@ -511,6 +511,7 @@ class AccountaccessComponent extends Component substr($parent->clean($_REQUEST['password'], "string"), 0, C\LONG_NAME_LEN); $username = trim($username); + $user_id = $user_model->addUser($username, $norm_password, substr(trim($parent->clean($_REQUEST['first_name'], @@ -526,8 +527,9 @@ class AccountaccessComponent extends Component $user_id; if ($group_model->getGroupId($personal_group_name) < 0){ $group_model->addGroup($personal_group_name, - $user_id, C\INVITE_ONLY_JOIN, C\ACTIVE_STATUS, - C\NON_VOTING_GROUP, C\FOREVER, 0); + $user_id, [$username], C\INVITE_ONLY_JOIN, + C\ACTIVE_STATUS, C\NON_VOTING_GROUP, C\FOREVER, + 0); } return $parent->redirectWithMessage( tl('accountaccess_component_user_added'), diff --git a/src/controllers/components/SocialComponent.php b/src/controllers/components/SocialComponent.php index 879296c54..8a6a1b40e 100644 --- a/src/controllers/components/SocialComponent.php +++ b/src/controllers/components/SocialComponent.php @@ -136,6 +136,19 @@ class SocialComponent extends Component implements CrawlConstants 1 => tl('social_component_encryption_enable'), 0 => tl('social_component_encryption_disable'), ]; + + if (!empty($_REQUEST['group_id'])) { + $group_id = $parent->clean($_REQUEST['group_id'], "int"); + $wiki_editors = $group_model->getWikiEditors($group_id); + $data['edit_wiki_users'] = $wiki_editors; + $data['edit_wiki_usernames'] = + $group_model->getWikiEditorsUsernames($group_id); + } + else { + $data['edit_wiki_users'] = [$_SESSION['USER_ID']]; + $data['edit_wiki_usernames'] = + [$this->parent->model("user")->getUserName($_SESSION['USER_ID'])]; + } if (in_array(C\MONETIZATION_TYPE, ['group_fees','fees_and_keywords'])) { $data['can_monetise_group'] = true; } else { @@ -344,8 +357,21 @@ class SocialComponent extends Component implements CrawlConstants "vote_access" => ["VOTING_CODES", C\NON_VOTING_GROUP], "post_lifetime" => ["POST_LIFETIMES", C\FOREVER], - "encryption" => ["ENCRYPTION_CODES", 0] + "encryption" => ["ENCRYPTION_CODES", 0], ]; + + $edit_wiki_users = []; + if (isset($_REQUEST['edit_wiki_users'])) { + $edit_wiki_users = array_map( + 'trim', + explode(',', $_REQUEST['edit_wiki_users']) + ); + $edit_wiki_users = + $group_model->validateWikiEditors($edit_wiki_users); + } + + $_REQUEST['edit_wiki_users'] = $edit_wiki_users; + foreach ($group_fields as $field => $info) { if (!isset($_REQUEST[$field]) || !in_array($_REQUEST[$field], @@ -354,7 +380,9 @@ class SocialComponent extends Component implements CrawlConstants } } $group_model->addGroup($name, - $_SESSION['USER_ID'], $_REQUEST['register'], + $_SESSION['USER_ID'], + $_REQUEST['edit_wiki_users'], + $_REQUEST['register'], $_REQUEST['member_access'], $_REQUEST['vote_access'], $_REQUEST['post_lifetime'], @@ -445,10 +473,40 @@ class SocialComponent extends Component implements CrawlConstants ['register', 'REGISTER_TYPE','REGISTER_CODES'], ['vote_access', 'VOTE_ACCESS', 'VOTING_CODES'], ['post_lifetime', 'POST_LIFETIME', 'POST_LIFETIMES'], - ['encryption', 'ENCRYPTION', 'ENCRYPTION_CODES'] + ['encryption', 'ENCRYPTION', 'ENCRYPTION_CODES'], ]; $message = $this->updateGroup($data, $group, - $update_fields); + $update_fields); + $edit_wiki_users = []; + $edit_wiki_users_cleaned = []; + if (isset($_REQUEST['edit_wiki_users'])) { + $edit_wiki_users = array_map( + 'trim', + explode(',', $_REQUEST['edit_wiki_users']) + ); + foreach ($edit_wiki_users as $user) { + $clean_user = $parent->clean(trim($user), "string"); + $edit_wiki_users_cleaned[] = $clean_user; + } + $user_model = $this->parent->model("user"); + $username = $user_model->getUserName( + $_SESSION['USER_ID'] + ); + + $edit_wiki_users_cleaned[] = $username; + + $edit_wiki_users = $group_model->validateWikiEditors( + $edit_wiki_users_cleaned + ); + $data['edit_wiki_usernames'] = $edit_wiki_users_cleaned; + $data['edit_wiki_users'] = + $group_model->wikiEditorIdLookup( + $edit_wiki_users_cleaned + ); + $message = $group_model->updateWikiEditors( + $group_id, $edit_wiki_users_cleaned + ); + } if (!empty($message)) { $preserve_fields = ['arg', 'browse', 'context', 'start_row','end_row', 'group_limit', 'num_show', @@ -2061,10 +2119,14 @@ class SocialComponent extends Component implements CrawlConstants $page_info = $group_model->getPageInfoByThread($just_thread); if (isset($page_info["PAGE_NAME"])) { $group_id = $page_info['GROUP_ID']; + $wiki_editors = $group_model->getWikiEditors($group_id); + $is_user_editor = in_array($user_id, $wiki_editors); + var_dump($wiki_editors); $data["WIKI_PAGE_NAME"] = $page_info["PAGE_NAME"]; $group = $group_model->getGroupById($group_id, $user_id, true); if (!empty($group) && ($group["OWNER_ID"] == $user_id || + $is_user_editor || ($group["STATUS"] == C\ACTIVE_STATUS && $group["MEMBER_ACCESS"] == C\GROUP_READ_WIKI && $user_id != C\PUBLIC_USER_ID))) { @@ -3313,6 +3375,7 @@ class SocialComponent extends Component implements CrawlConstants $strings_array) = $this->initCommonWikiArrays( $controller_name, $base_url); $group_model = $parent->model("group"); + if (isset($_SESSION['USER_ID'])) { $user_id = $_SESSION['USER_ID']; $data['ADMIN'] = 1; @@ -3399,6 +3462,10 @@ class SocialComponent extends Component implements CrawlConstants } else { $group_id = C\PUBLIC_GROUP_ID; } + $wiki_editors = $group_model->getWikiEditors($group_id); + if (in_array($user_id, $wiki_editors)) { + $data['CAN_EDIT'] = true; + } $group = $group_model->getGroupById($group_id, $user_id, true); if (!$group) { $group = $group_model->getGroupById($group_id, $user_id); @@ -4528,11 +4595,17 @@ EOD; $page_name, $page, $sub_path, $edit_reason, $missing_fields, $read_address, $additional_substitutions) { + $parent = $this->parent; + $group_model = $parent->model("group"); + $wiki_editors = $group_model->getWikiEditors($group_id); + + if (in_array($user_id, $wiki_editors)) { + $data['CAN_EDIT'] = true; + } if (empty($data["CAN_EDIT"])) { return; } - $parent = $this->parent; - $group_model = $parent->model("group"); + if (isset($_REQUEST['caret']) && isset($_REQUEST['scroll_top']) && !isset($page)) { diff --git a/src/library/VersionFunctions.php b/src/library/VersionFunctions.php index 488b1e7ce..7c0f0b9ee 100644 --- a/src/library/VersionFunctions.php +++ b/src/library/VersionFunctions.php @@ -1870,7 +1870,7 @@ function upgradeDatabaseVersion65(&$db) $group_model->db = $db; $group_id = $group_model->getGroupId('Search'); if ($group_id <= 0) { - $group_model->addGroup('Search', C\ROOT_ID, + $group_model->addGroup('Search', C\ROOT_ID, ["root"], C\PUBLIC_BROWSE_REQUEST_JOIN, C\GROUP_READ_WIKI, C\UP_DOWN_VOTING_GROUP, C\FOREVER, 0); $group_id = $group_model->getGroupId('Search'); @@ -2193,3 +2193,23 @@ function upgradeDatabaseVersion81(&$db) $profile_model->updateProfile(C\WORK_DIRECTORY, $new_profile, $profile); } +/** + * Upgrades a Version 81 version of the Yioop database to a Version 82 version + * @param object $db datasource to use to upgrade + */ +function upgradeDatabaseVersion82(&$db) +{ + $dbinfo = ["DBMS" => C\DBMS, "DB_HOST" => C\DB_HOST, + "DB_NAME" => C\DB_NAME, "DB_PASSWORD" => C\DB_PASSWORD]; + $integer = $db->integerType($dbinfo); + $db->execute("DROP TABLE IF EXISTS GROUP_EDITORS"); + $db->execute("CREATE TABLE GROUP_EDITORS ( + id $integer AUTO_INCREMENT PRIMARY KEY, + group_id $integer NOT NULL, + user_id $integer NOT NULL, + FOREIGN KEY (group_id) REFERENCES SOCIAL_GROUPS(GROUP_ID) + ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (user_id) REFERENCES USERS(USER_ID) + ON DELETE CASCADE ON UPDATE CASCADE + )"); +} diff --git a/src/locale/ar/configure.ini b/src/locale/ar/configure.ini index cbaf61e27..6aec068c9 100755 --- a/src/locale/ar/configure.ini +++ b/src/locale/ar/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "إ 注册" managegroups_element_memberaccess = "دخول" managegroups_element_voting = "التصويت" managegroups_element_post_lifetime = "عمر المنشور" +managegroups_element_wikieditors = "محررو الويكي" managegroups_element_encryption = "تشفير" managegroups_element_feed = "رصد" managegroups_element_import_discussions = "إستيراد المحادثات" diff --git a/src/locale/bn/configure.ini b/src/locale/bn/configure.ini index b0458dcd5..63a2951b6 100755 --- a/src/locale/bn/configure.ini +++ b/src/locale/bn/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "রেজিস্টার" managegroups_element_memberaccess = "অ্যাক্সেস" managegroups_element_voting = "ভোটিং" managegroups_element_post_lifetime = "পোস্ট জীবনকাল" +managegroups_element_wikieditors = "উইকি সম্পাদক" managegroups_element_encryption = "এনক্রিপশন" managegroups_element_feed = "ফিড" managegroups_element_import_discussions = "আমদানি আলোচনা" diff --git a/src/locale/de/configure.ini b/src/locale/de/configure.ini index 75112f605..efa51ffde 100755 --- a/src/locale/de/configure.ini +++ b/src/locale/de/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Inscribirse" managegroups_element_memberaccess = "Zugriff" managegroups_element_voting = "Stimmen" managegroups_element_post_lifetime = "Dauer des Beitrags" +managegroups_element_wikieditors = "Wiki-Editoren" managegroups_element_encryption = "Verschlüsselung" managegroups_element_feed = "Nachrichten" managegroups_element_import_discussions = "Importate Discusiones" diff --git a/src/locale/el_GR/configure.ini b/src/locale/el_GR/configure.ini index d9de3ba33..7f2f87cdf 100644 --- a/src/locale/el_GR/configure.ini +++ b/src/locale/el_GR/configure.ini @@ -1180,6 +1180,7 @@ managegroups_element_register = "Εγγραφή" managegroups_element_memberaccess = "Πρόσβαση" managegroups_element_voting = "Εψήφηση" managegroups_element_post_lifetime = "Πόστι Ζωή" +managegroups_element_wikieditors = "Επεξεργαστές Wiki" managegroups_element_encryption = "Κρυπτογράφηση" managegroups_element_feed = "Παρακοινοποίηση" managegroups_element_import_discussions = "Εισαγωγή Συζητήσεων" diff --git a/src/locale/en_US/configure.ini b/src/locale/en_US/configure.ini index 25bd221b0..6e1c9ebc4 100644 --- a/src/locale/en_US/configure.ini +++ b/src/locale/en_US/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Register" managegroups_element_memberaccess = "Access" managegroups_element_voting = "Voting" managegroups_element_post_lifetime = "Post Lifetime" +managegroups_element_wikieditors = "Wiki Editors" managegroups_element_encryption = "Encryption" managegroups_element_feed = "Feed" managegroups_element_import_discussions = "Import Discussions" diff --git a/src/locale/es/configure.ini b/src/locale/es/configure.ini index 411b01c65..337c3a3b6 100755 --- a/src/locale/es/configure.ini +++ b/src/locale/es/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Registro" managegroups_element_memberaccess = "Acceso" managegroups_element_voting = "Votación" managegroups_element_post_lifetime = "Vida después de la publicación" +managegroups_element_wikieditors = "Editores de Wiki" managegroups_element_encryption = "Criptografía" managegroups_element_feed = "Ruta de alimentación" managegroups_element_import_discussions = "Importar discusiones" diff --git a/src/locale/fa/configure.ini b/src/locale/fa/configure.ini index fd5f2650a..afc94392b 100755 --- a/src/locale/fa/configure.ini +++ b/src/locale/fa/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "ثبت نام" managegroups_element_memberaccess = "دسترسی" managegroups_element_voting = "رأی" managegroups_element_post_lifetime = "پس از عمر" +managegroups_element_wikieditors = "ویراستاران ویکی" managegroups_element_encryption = "شیفه" managegroups_element_feed = "رشته" managegroups_element_import_discussions = "دخیل بحث‌ها را وارد کنید" diff --git a/src/locale/fr_FR/configure.ini b/src/locale/fr_FR/configure.ini index 66937132c..f9c48ab11 100755 --- a/src/locale/fr_FR/configure.ini +++ b/src/locale/fr_FR/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Inscrire" managegroups_element_memberaccess = "Accès" managegroups_element_voting = "Votation" managegroups_element_post_lifetime = "Gestion de vie du groupe" +managegroups_element_wikieditors = "Éditeurs Wiki" managegroups_element_encryption = "Chiffrement" managegroups_element_feed = "Rubrique" managegroups_element_import_discussions = "Importer les discussions" @@ -5686,4 +5687,4 @@ wordfilter_plugin_settings_saved = "Les paramètres de filtration des mots ont wordfilter_plugin_defaults_restored = "Les paramètres par défaut ont été restaurés !" wordfilter_plugin_preferences = "Filtrage des mots : préférences" wordfilter_plugin_factory_settings = "Paramètres d\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'usine" -wordfilter_plugin_save = "Enregistrer" +wordfilter_plugin_save = "Enregistrer" \ No newline at end of file diff --git a/src/locale/he/configure.ini b/src/locale/he/configure.ini index 03f95ad10..2452413f1 100755 --- a/src/locale/he/configure.ini +++ b/src/locale/he/configure.ini @@ -1160,6 +1160,8 @@ managegroups_element_register = "Registro" managegroups_element_memberaccess = "Acceso" managegroups_element_voting = "Votación" managegroups_element_post_lifetime = "Kündigungszeitraum" +managegroups_element_wikieditors = "עורכי ויקי" +managegroups_element_wikieditors = "עורכי ויקי" managegroups_element_encryption = "Verschlüsselung" managegroups_element_feed = "Feed" managegroups_element_import_discussions = "Diskussionsimportieren" @@ -5686,4 +5688,4 @@ wordfilter_plugin_settings_saved = "המילה הגדרות סינון הציל! wordfilter_plugin_defaults_restored = "ברירות מחדל משוחזר!" wordfilter_plugin_preferences = "המילה העדפות סינון" wordfilter_plugin_factory_settings = "הגדרות יצרן" -wordfilter_plugin_save = "להציל" +wordfilter_plugin_save = "להציל" \ No newline at end of file diff --git a/src/locale/hi/configure.ini b/src/locale/hi/configure.ini index 5ca2280e5..367b28919 100755 --- a/src/locale/hi/configure.ini +++ b/src/locale/hi/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "रजिस्टर" managegroups_element_memberaccess = "पहुँच" managegroups_element_voting = "मतदान" managegroups_element_post_lifetime = "पोस्ट जीवन भर" +managegroups_element_wikieditors = "विकी संपादक" managegroups_element_encryption = "एन्क्रिप्शन" managegroups_element_feed = "फ़ीड" managegroups_element_import_discussions = "आयात चर्चा" diff --git a/src/locale/id/configure.ini b/src/locale/id/configure.ini index 372d18bc5..fe853c544 100755 --- a/src/locale/id/configure.ini +++ b/src/locale/id/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Daftar" managegroups_element_memberaccess = "Akses" managegroups_element_voting = "Pemegang" managegroups_element_post_lifetime = "Posting Seumur Hidup" +managegroups_element_wikieditors = "Editor Wiki" managegroups_element_encryption = "Enkripsi" managegroups_element_feed = "Pakan" managegroups_element_import_discussions = "Impor Diskusi" diff --git a/src/locale/it/configure.ini b/src/locale/it/configure.ini index 886b914c3..8c82bfe5a 100755 --- a/src/locale/it/configure.ini +++ b/src/locale/it/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Registro" managegroups_element_memberaccess = "Accesso" managegroups_element_voting = "Voto" managegroups_element_post_lifetime = "Post Vita" +managegroups_element_wikieditors = "Editor Wiki" managegroups_element_encryption = "La crittografia" managegroups_element_feed = "Feed" managegroups_element_import_discussions = "Importazione Discussioni" diff --git a/src/locale/ja/configure.ini b/src/locale/ja/configure.ini index f0f4463b9..743df60ef 100755 --- a/src/locale/ja/configure.ini +++ b/src/locale/ja/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "登録" managegroups_element_memberaccess = "アクセス" managegroups_element_voting = "議決権" managegroups_element_post_lifetime = "ポストの生涯" +managegroups_element_wikieditors = "ウィキ編集者" managegroups_element_encryption = "暗号化" managegroups_element_feed = "飼料" managegroups_element_import_discussions = "輸入の議論" diff --git a/src/locale/kn/configure.ini b/src/locale/kn/configure.ini index 7e1cf0d10..db32b1396 100755 --- a/src/locale/kn/configure.ini +++ b/src/locale/kn/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "ನೋಂದಣಿ" managegroups_element_memberaccess = "ಪ್ರವೇಶ" managegroups_element_voting = "ಮತದಾನ" managegroups_element_post_lifetime = "ಪೋಸ್ಟ್ ಜೀವಮಾನ" +managegroups_element_wikieditors = "ವಿಕಿ ಸಂಪಾದಕರು" managegroups_element_encryption = "ಗೂಢಲಿಪೀಕರಣ" managegroups_element_feed = "ಫೀಡ್" managegroups_element_import_discussions = "ಆಮದು ಚರ್ಚೆಗಳು" diff --git a/src/locale/ko/configure.ini b/src/locale/ko/configure.ini index 0dc5c7592..072f90adc 100755 --- a/src/locale/ko/configure.ini +++ b/src/locale/ko/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "등록" managegroups_element_memberaccess = "스" managegroups_element_voting = "투표" managegroups_element_post_lifetime = "게시 일생" +managegroups_element_wikieditors = "위키 편집자" managegroups_element_encryption = "암호화" managegroups_element_feed = "피드" managegroups_element_import_discussions = "Import 토론" diff --git a/src/locale/nl/configure.ini b/src/locale/nl/configure.ini index 1e829b415..71dc1eb53 100644 --- a/src/locale/nl/configure.ini +++ b/src/locale/nl/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Registreer" managegroups_element_memberaccess = "toegang" managegroups_element_voting = "stemming" managegroups_element_post_lifetime = "bericht Lifetime" +managegroups_element_wikieditors = "Wiki-bewerkers" managegroups_element_encryption = "Encryptie" managegroups_element_feed = "Feed" managegroups_element_import_discussions = "Importeren Discussies" diff --git a/src/locale/pl/configure.ini b/src/locale/pl/configure.ini index d3646b900..fa82f485b 100755 --- a/src/locale/pl/configure.ini +++ b/src/locale/pl/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Zarejestruj się" managegroups_element_memberaccess = "Dostęp do" managegroups_element_voting = "Głosowanie" managegroups_element_post_lifetime = "Po Życiu" +managegroups_element_wikieditors = "Edytory Wiki" managegroups_element_encryption = "Szyfrowanie" managegroups_element_feed = "Karmić" managegroups_element_import_discussions = "Dyskusja Import " diff --git a/src/locale/pt/configure.ini b/src/locale/pt/configure.ini index 7eaad4ef4..49328fda2 100755 --- a/src/locale/pt/configure.ini +++ b/src/locale/pt/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Registar" managegroups_element_memberaccess = "Acesso" managegroups_element_voting = "Votação" managegroups_element_post_lifetime = "Pós Vida" +managegroups_element_wikieditors = "Editores Wiki" managegroups_element_encryption = "Criptografia" managegroups_element_feed = "Alimentação" managegroups_element_import_discussions = "Importação De Discussões" diff --git a/src/locale/ru/configure.ini b/src/locale/ru/configure.ini index e9b0523f0..561aeddd4 100755 --- a/src/locale/ru/configure.ini +++ b/src/locale/ru/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Зарегистрироваться" managegroups_element_memberaccess = "Доступ к" managegroups_element_voting = "Голосование" managegroups_element_post_lifetime = "После Жизни" +managegroups_element_wikieditors = "Редакторы Wiki" managegroups_element_encryption = "Шифрование" managegroups_element_feed = "Кормить" managegroups_element_import_discussions = "Обсуждение Импорт " diff --git a/src/locale/te/configure.ini b/src/locale/te/configure.ini index e26795786..bb9462598 100644 --- a/src/locale/te/configure.ini +++ b/src/locale/te/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "నమోదు చేయి" managegroups_element_memberaccess = "ప్రాప్యత" managegroups_element_voting = "ఓటింగ్" managegroups_element_post_lifetime = "పోస్ట్ జీవితకాలం" +managegroups_element_wikieditors = "వికీ ఎడిటర్లు" managegroups_element_encryption = "ఎన్క్రిప్షన్" managegroups_element_feed = "ఫీడ్" managegroups_element_import_discussions = "దిగుమతి చర్చలు" diff --git a/src/locale/th/configure.ini b/src/locale/th/configure.ini index 36c7074e9..01781d3f9 100755 --- a/src/locale/th/configure.ini +++ b/src/locale/th/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "ลงทะเบียน" managegroups_element_memberaccess = "การเข้าถึง" managegroups_element_voting = "โหวต" managegroups_element_post_lifetime = "โพสในชีวิต" +managegroups_element_wikieditors = "บรรณาธิการ Wiki" managegroups_element_encryption = "การเข้ารหัส" managegroups_element_feed = "แหล่งป้อน" managegroups_element_import_discussions = "นำเข้า Discussions" diff --git a/src/locale/tl/configure.ini b/src/locale/tl/configure.ini index 9e856cf46..e27704415 100644 --- a/src/locale/tl/configure.ini +++ b/src/locale/tl/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Magrehistro" managegroups_element_memberaccess = "Access" managegroups_element_voting = "Pagboto" managegroups_element_post_lifetime = "Mag-Post Ng Panghabang Buhay" +managegroups_element_wikieditors = "Mga Editor ng Wiki" managegroups_element_encryption = "Pag-encrypt" managegroups_element_feed = "Feed" managegroups_element_import_discussions = "I-Import Ang Mga Talakayan" diff --git a/src/locale/tr/configure.ini b/src/locale/tr/configure.ini index a7983c6a2..79973b709 100755 --- a/src/locale/tr/configure.ini +++ b/src/locale/tr/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Kayıt" managegroups_element_memberaccess = "Erişim" managegroups_element_voting = "Oylama" managegroups_element_post_lifetime = "Sonrası Ömür Boyu" +managegroups_element_wikieditors = "Wiki Editörleri" managegroups_element_encryption = "Şifreleme" managegroups_element_feed = "Besleme" managegroups_element_import_discussions = "İthalat Tartışmalar" diff --git a/src/locale/vi_VN/configure.ini b/src/locale/vi_VN/configure.ini index c2f155a26..778aa2fe2 100755 --- a/src/locale/vi_VN/configure.ini +++ b/src/locale/vi_VN/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "Đăng ký" managegroups_element_memberaccess = "Truy cập" managegroups_element_voting = "Bỏ phiếu" managegroups_element_post_lifetime = "Bài Đời" +managegroups_element_wikieditors = "Biên tập viên Wiki" managegroups_element_encryption = "Mã hóa" managegroups_element_feed = "Thức ăn" managegroups_element_import_discussions = "Nhập Cuộc Thảo Luận" diff --git a/src/locale/zh_CN/configure.ini b/src/locale/zh_CN/configure.ini index a46d1a165..5160fa490 100755 --- a/src/locale/zh_CN/configure.ini +++ b/src/locale/zh_CN/configure.ini @@ -1160,6 +1160,7 @@ managegroups_element_register = "注册" managegroups_element_memberaccess = "访问" managegroups_element_voting = "投票" managegroups_element_post_lifetime = "后辈子" +managegroups_element_wikieditors = "维基编辑器" managegroups_element_encryption = "加密的" managegroups_element_feed = "喂" managegroups_element_import_discussions = "导入讨论" diff --git a/src/models/GroupModel.php b/src/models/GroupModel.php index 1c7b11015..8d7d0f419 100644 --- a/src/models/GroupModel.php +++ b/src/models/GroupModel.php @@ -265,7 +265,7 @@ class GroupModel extends Model implements MediaConstants * group * @return int id of group added */ - public function addGroup($group_name, $user_id, + public function addGroup($group_name, $user_id, $wiki_editors, $register = C\REQUEST_JOIN, $member = C\GROUP_READ, $voting = C\NON_VOTING_GROUP, $post_lifetime = C\FOREVER, $encryption = 0) @@ -300,6 +300,19 @@ class GroupModel extends Model implements MediaConstants $encrypt_key = base64_encode(openssl_random_pseudo_bytes(32)); $private_db->execute($sql, [$last_id, $encrypt_key]); } + if (is_string($wiki_editors)) { + $wiki_editors = array_map('trim', explode(',', $wiki_editors)); + } + $insert_sql = "INSERT INTO GROUP_EDITORS (group_id, user_id) " . + "VALUES (?, ?)"; + foreach ($wiki_editors as $editor) { + $get_user_sql = "SELECT USER_ID FROM USERS WHERE USER_NAME = ?"; + $result = $this->db->execute($get_user_sql, [$editor]); + if ($result && $editor_row = $this->db->fetchArray($result)) { + $editor_id = $editor_row['USER_ID']; + $this->db->execute($insert_sql, [$last_id, $editor_id]); + } + } return $last_id; } /** @@ -470,6 +483,8 @@ class GroupModel extends Model implements MediaConstants $db->execute($sql, $params); $sql = "DELETE FROM TYPE_KEYS WHERE TYPE_ID=?"; $private_db->execute($sql, $params); + $sql = "DELETE FROM GROUP_EDITORS WHERE group_id=?"; + $db->execute($sql, $params); } /** * Deletes a wiki page from a group from the database @@ -502,6 +517,177 @@ class GroupModel extends Model implements MediaConstants $db->execute($sql, $params); return true; } + /** + * Validates an array of usernames against the USERS table to ensure they + * are registered users. + * + * @param array $edit_wiki_users Array of usernames to validate. + * @return array Returns an array of valid usernames that exist in the + * USERS table. + */ + public function validateWikiEditors($edit_wiki_users) + { + if (empty($edit_wiki_users) || !is_array($edit_wiki_users)) { + return []; + } + $placeholders = implode( + ',', array_fill(0, count($edit_wiki_users), '?') + ); + $sql = "SELECT USER_NAME FROM USERS WHERE USER_NAME IN ($placeholders)"; + $result = $this->db->execute($sql, $edit_wiki_users); + $valid_users = []; + while ($row = $this->db->fetchArray($result)) { + if (isset($row['USER_NAME'])) { + $valid_users[] = $row['USER_NAME']; + } + } + return $valid_users; + } + /** + * Retrieves a list of editor user IDs associated with a specific group. + * + * @param string $group_id The ID of the group for which to retrieve editor + * IDs. + * @return array Returns an array of user IDs who are editors of the group. + */ + public function getWikiEditors($group_id) + { + $sql = "SELECT USER_ID FROM GROUP_EDITORS WHERE group_id = ?"; + $result = $this->db->execute($sql, [$group_id]); + + $editors = []; + while ($row = $this->db->fetchArray($result)) { + if (isset($row['USER_ID'])) { + $editors[] = $row['USER_ID']; + } + } + return $editors; + } + /** + * Retrieves a list of usernames for the editors of a specific group using + * their user IDs. + * + * @param string $group_id The ID of the group for which to retrieve editor + * usernames. + * @return array Returns an array of usernames of the group's editors. + */ + public function getWikiEditorsUserNames($group_id) + { + $sql = "SELECT USER_ID FROM GROUP_EDITORS WHERE group_id = ?"; + $result = $this->db->execute($sql, [$group_id]); + + $user_ids = []; + while ($row = $this->db->fetchArray($result)) { + if (isset($row['USER_ID'])) { + $user_ids[] = $row['USER_ID']; + } + } + if (empty($user_ids)) { + return []; + } + $placeholders = implode(',', array_fill(0, count($user_ids), '?')); + $user_sql = "SELECT USER_NAME FROM USERS " . + "WHERE USER_ID IN ($placeholders)"; + $user_result = $this->db->execute($user_sql, $user_ids); + $usernames = []; + while ($user_row = $this->db->fetchArray($user_result)) { + if (isset($user_row['USER_NAME'])) { + $usernames[] = $user_row['USER_NAME']; + } + } + return $usernames; + } + /** + * Looks up the user IDs of editors based on their usernames. + * + * @param array $editor_list Array of editor usernames to look up. + * @return array Returns an array of user IDs corresponding to the + * provided editor names. + */ + public function wikiEditorIdLookup($editor_list) + { + $editors = []; + foreach ($editor_list as $editor_name) { + $sql = "SELECT USER_ID FROM USERS WHERE USER_NAME = ?"; + $result = $this->db->execute($sql, [$editor_name]); + if ($result && $row = $this->db->fetchArray($result)) { + $editor_id = $row['USER_ID']; + if ($editor_id) { + $editors[] = $editor_id; + } + } + } + return $editors; + } + /** + * Looks up the usernames of editors based on their user IDs. + * + * @param array $editors Array of editor user IDs to look up. + * @return array Returns an array of usernames corresponding to the + * provided user IDs. + */ + public function wikiEditorUsernameLookup($editors) + { + $editor_names = []; + foreach ($editors as $editor_id) { + $sql = "SELECT USER_NAME FROM USERS WHERE USER_ID = ?"; + $result = $this->db->execute($sql, [$editor_id]); + if ($result && $row = $this->db->fetchArray($result)) { + $editor_name = $row['USER_NAME']; + if ($editor_name) { + $editor_names[] = $editor_name; + } + } + } + return $editor_names; + } + /** + * Updates the group editor list for a specified group by adding new + * editors. Old editors are removed before the update. + * + * @param string $group_id The group ID to update editor list. + * @param array $editors Array of editor usernames to update in the group. + * @return string Returns a status message indicating the result of the + * update operation. + */ + public function updateWikiEditors($group_id, $editors) + { + $sql = "DELETE FROM GROUP_EDITORS WHERE group_id = ?"; + $result = $this->db->execute($sql, [$group_id]); + if (!$result) { + return L\tl('social_component_upload_error'); + } + if (empty($editors)) { + return L\tl('social_component_group_updated'); + } + $placeholders = str_repeat('?,', count($editors) - 1) . '?'; + $get_user_sql = "SELECT USER_ID, USER_NAME FROM USERS " . + "WHERE USER_NAME IN ($placeholders)"; + $result = $this->db->execute($get_user_sql, $editors); + if (!$result) { + return L\tl('social_component_upload_error'); + } + $user_map = []; + while ($row = $this->db->fetchArray($result)) { + $user_map[$row['USER_NAME']] = $row['USER_ID']; + } + foreach ($editors as $editor) { + if (!isset($user_map[$editor])) { + return L\tl('social_component_upload_error'); + } + } + $insert_sql = "INSERT INTO GROUP_EDITORS (group_id, user_id) " . + "VALUES (?, ?)"; + foreach ($editors as $editor) { + $insert_result = $this->db->execute( + $insert_sql, [$group_id, $user_map[$editor]] + ); + if (!$insert_result) { + return L\tl('social_component_upload_error'); + } + } + return L\tl('social_component_group_updated'); + } /** * Return the type of the registration for a group given by $group_id * This says who is allowed to register for the group (i.e., is it diff --git a/src/models/ProfileModel.php b/src/models/ProfileModel.php index 4e4c7befe..952724baf 100755 --- a/src/models/ProfileModel.php +++ b/src/models/ProfileModel.php @@ -262,6 +262,12 @@ class ProfileModel extends Model MEMBER_ACCESS $integer, VOTE_ACCESS $integer DEFAULT ". C\NON_VOTING_GROUP . ", POST_LIFETIME $integer DEFAULT ". C\FOREVER . ", ENCRYPTION $integer DEFAULT 0)", + "GROUP_EDITORS" => "CREATE TABLE GROUP_EDITORS ( + id $integer AUTO_INCREMENT PRIMARY KEY, + group_id $integer NOT NULL, + user_id $integer NOT NULL, + FOREIGN KEY (group_id) REFERENCES SOCIAL_GROUPS(GROUP_ID), + FOREIGN KEY (user_id) REFERENCES USERS(USER_ID))", /* NOTE: We are not using singular name GROUP for SOCIAL_GROUPS as GROUP is a reserved SQL keyword and the table used to be called GROUPS until Mysql reserved that word too diff --git a/src/views/elements/GroupbarElement.php b/src/views/elements/GroupbarElement.php index 24526a776..6c6ba711a 100644 --- a/src/views/elements/GroupbarElement.php +++ b/src/views/elements/GroupbarElement.php @@ -238,6 +238,7 @@ class GroupbarElement extends Element $token_string = ($logged_in) ? C\CSRF_TOKEN . "=" . $data[C\CSRF_TOKEN] : ""; $can_edit = $logged_in && !empty($data["CAN_EDIT"]); + $wiki_base_url = htmlentities(B\wikiUrl( $data['PAGE_NAME'], true, $data['CONTROLLER'], $data["GROUP"]["GROUP_ID"])) . $token_string; diff --git a/src/views/elements/ManagegroupsElement.php b/src/views/elements/ManagegroupsElement.php index f09ecb665..40a5655b4 100755 --- a/src/views/elements/ManagegroupsElement.php +++ b/src/views/elements/ManagegroupsElement.php @@ -265,6 +265,18 @@ class ManagegroupsElement extends Element $data["POST_LIFETIMES"], $data['CURRENT_GROUP']['post_lifetime']); ?> + + : + + : : + : +