diff --git a/bbbeasy-backend/app/src/Actions/Presets/EditSubcategories.php b/bbbeasy-backend/app/src/Actions/Presets/EditSubcategories.php index 643980ff..7204f3d3 100644 --- a/bbbeasy-backend/app/src/Actions/Presets/EditSubcategories.php +++ b/bbbeasy-backend/app/src/Actions/Presets/EditSubcategories.php @@ -24,8 +24,10 @@ use Actions\Base as BaseAction; use Actions\RequirePrivilegeTrait; +use Enum\Presets\Security; use Enum\ResponseCode; use Models\Preset; +use Utils\Password; class EditSubcategories extends BaseAction { @@ -52,10 +54,16 @@ public function save($f3, $params): void if (isset($categories->{$categoryName})) { $subCategories = json_decode($categories->{$categoryName}); foreach ($form as $editedSubCategory) { - $subCategoryName = $editedSubCategory['name']; + $subCategoryName = $editedSubCategory['name']; + $subCategoryValue = $editedSubCategory['value']; + if (Security::PASSWORD_FOR_MODERATOR === $subCategoryName || Security::PASSWORD_FOR_ATTENDEE === $subCategoryName) { + $encryption_value = openssl_encrypt($subCategoryValue, Password::CIPHERING_VALUE, Password::ENCRYPTION_KEY); - $subCategories->{$subCategoryName} = $subCategoryValue; + $subCategories->{$subCategoryName} = $encryption_value; + } else { + $subCategories->{$subCategoryName} = $subCategoryValue; + } } $categories->{$categoryName} = json_encode($subCategories); diff --git a/bbbeasy-backend/app/src/Actions/Rooms/Start.php b/bbbeasy-backend/app/src/Actions/Rooms/Start.php index c0048f3f..54262057 100644 --- a/bbbeasy-backend/app/src/Actions/Rooms/Start.php +++ b/bbbeasy-backend/app/src/Actions/Rooms/Start.php @@ -29,11 +29,12 @@ use BigBlueButton\Parameters\GetMeetingInfoParameters; use BigBlueButton\Parameters\JoinMeetingParameters; use Enum\Presets\General; +use Enum\Presets\Security; use Enum\ResponseCode; use Models\Preset; use Models\Room; use Utils\BigBlueButtonRequester; -use Utils\DataUtils; +use Utils\Password; use Utils\PresetProcessor; /** @@ -71,6 +72,8 @@ public function execute($f3, $params): void $form = $this->getDecodedBody(); $fullname = (null !== $this->session->get('user') ? $this->session->get('user.username') : $form['fullname']); + $password = $form['password']; + if (null !== $fullname) { $room = new Room(); $room = $room->getById($id); @@ -86,19 +89,19 @@ public function execute($f3, $params): void if (null === $getMeetingInfoResponse) { return; } - $preset = new Preset(); - $p = $preset->findById($room->getPresetID($room->id)['preset_id']); + $preset = new Preset(); + $p = $preset->findById($room->getPresetID($room->id)['preset_id']); + $presetprocessor = new PresetProcessor(); + $presetData = $presetprocessor->preparePresetData($p->getMyPresetInfos($p)); if (!$getMeetingInfoResponse->success()) { // meeting not found + if ('notFound' === $getMeetingInfoResponse->getMessageKey()) { // create new meeting with the same meetingId - $presetprocessor = new PresetProcessor(); - $presetData = $presetprocessor->preparePresetData($p->getMyPresetInfos($p)); - if ($room->getRoomInfos($room)['user_id'] === $this->session->get('user.id') || $presetData[General::GROUP_NAME][General::ANYONE_CAN_START]) { - $createResult = $this->createMeeting($meetingId, $bbbRequester, $room->short_link, $p->getMyPresetInfos($p), $presetprocessor); + $createResult = $this->createMeeting($meetingId, $bbbRequester, $room->short_link, $p->getMyPresetInfos($p), $presetprocessor, $password_moderator, $password_attendee); if (null === $createResult) { return; @@ -109,7 +112,7 @@ public function execute($f3, $params): void return; } } else { - $this->logger->error('Could not fetch a meeting due to an error.'); + $this->logger->error('Could not start or join a meeting'); $this->renderJson(['meeting' => 'Could not start or join the meeting'], ResponseCode::HTTP_INTERNAL_SERVER_ERROR); return; @@ -119,7 +122,17 @@ public function execute($f3, $params): void if ($room->getRoomInfos($room)['user_id'] === $this->session->get('user.id') || $presetData[General::GROUP_NAME][General::ALL_JOIN_AS_MODERATOR]) { $this->joinMeeting($meetingId, Role::MODERATOR, $bbbRequester, $p->getMyPresetInfos($p), $fullname); } else { - $this->joinMeeting($meetingId, Role::VIEWER, $bbbRequester, $p->getMyPresetInfos($p), $fullname); + $password_moderator =$presetData[Security::GROUP_NAME][Security::PASSWORD_FOR_MODERATOR]?openssl_decrypt($presetData[Security::GROUP_NAME][Security::PASSWORD_FOR_MODERATOR], Password::CIPHERING_VALUE, Password::ENCRYPTION_KEY):null; + $password_attendee =$presetData[Security::GROUP_NAME][Security::PASSWORD_FOR_ATTENDEE]?openssl_decrypt($presetData[Security::GROUP_NAME][Security::PASSWORD_FOR_ATTENDEE], Password::CIPHERING_VALUE, Password::ENCRYPTION_KEY):null; + + if ($password === $password_moderator || $password === $password_attendee) { + $this->joinMeeting($meetingId, $password ?: Role::VIEWER, $bbbRequester, $p->getMyPresetInfos($p), $fullname); + } else { + $this->logger->error('Could not join a meeting with a wrong password'); + $this->renderJson(['password' => 'Could not join a meeting with a wrong password'], ResponseCode::HTTP_INTERNAL_SERVER_ERROR); + + return; + } } } else { $this->logger->error($errorMessage); @@ -153,8 +166,6 @@ public function createMeeting(string $meetingId, BigBlueButtonRequester $bbbRequ $presetProcessor = new PresetProcessor(); $createParams = new CreateMeetingParameters($meetingId, 'meeting-' . $meetingId); $createParams = $presetProcessor->toCreateMeetingParams($p, $createParams); - $createParams->setModeratorPassword(DataUtils::generateRandomString()); - $createParams->setAttendeePassword(DataUtils::generateRandomString()); // @todo : set later via presets $createParams->setModeratorOnlyMessage('to invite someone you can use this link ' . $this->f3->get('SERVER.HTTP_ORIGIN') . $this->f3->get('client.room_url_prefix') . $link); diff --git a/bbbeasy-backend/app/src/Actions/Rooms/View.php b/bbbeasy-backend/app/src/Actions/Rooms/View.php index a6e44d89..c451536e 100644 --- a/bbbeasy-backend/app/src/Actions/Rooms/View.php +++ b/bbbeasy-backend/app/src/Actions/Rooms/View.php @@ -26,6 +26,7 @@ use Actions\RequirePrivilegeTrait; use BigBlueButton\Parameters\GetMeetingInfoParameters; use Enum\Presets\General; +use Enum\Presets\Security; use Enum\ResponseCode; use Models\Preset; use Models\Room; @@ -80,15 +81,22 @@ public function show($f3, $params): void if (!$meetingInfoResponse->success()) { if ('notFound' === $meetingInfoResponse->getMessageKey()) { $anyonestart = false; - - if ($room->getRoomInfos($room)['user_id'] === $this->session->get('user.id') || $presetData[General::GROUP_NAME][General::ANYONE_CAN_START]) { - $canStart = true; - } + } + if ('checksumError' === $meetingInfoResponse->getMessageKey()) { + $joindisabled = true; } } + if ($room->getRoomInfos($room)['user_id'] === $this->session->get('user.id') || $presetData[General::GROUP_NAME][General::ANYONE_CAN_START]) { + $canStart = true; + } + + $meeting = (array) $meetingInfoResponse->getRawXml(); + $meeting['joinDisabled'] = $joindisabled; + $meeting['canStart'] = $canStart; - $meeting = (array) $meetingInfoResponse->getRawXml(); - $meeting['canStart'] = $canStart; + $meeting['password_moderator'] = $presetData[Security::GROUP_NAME][Security::PASSWORD_FOR_MODERATOR]?:null; + $meeting['password_attendee'] = $presetData[Security::GROUP_NAME][Security::PASSWORD_FOR_ATTENDEE]?:null; + $meeting['all_join_as_moderator'] = $presetData[General::GROUP_NAME][General::ALL_JOIN_AS_MODERATOR]; $this->renderJson(['room' => $room->getRoomInfos($room), 'meeting' => $meeting]); } else { diff --git a/bbbeasy-backend/app/src/Data/PresetData.php b/bbbeasy-backend/app/src/Data/PresetData.php index d6e636e8..32100cc9 100644 --- a/bbbeasy-backend/app/src/Data/PresetData.php +++ b/bbbeasy-backend/app/src/Data/PresetData.php @@ -28,7 +28,7 @@ class PresetData public function setData($category, $subCategory, $value): void { - if (null !== $value || (\is_string($value) && !empty($value))) { + if (null !== $value) { $this->data[$category][$subCategory] = $value; } } diff --git a/bbbeasy-backend/app/src/Enum/Presets/Security.php b/bbbeasy-backend/app/src/Enum/Presets/Security.php index 853f3be0..d498d11f 100644 --- a/bbbeasy-backend/app/src/Enum/Presets/Security.php +++ b/bbbeasy-backend/app/src/Enum/Presets/Security.php @@ -30,6 +30,6 @@ class Security extends Enum public const PASSWORD_FOR_MODERATOR = 'password_for_moderator'; public const PASSWORD_FOR_ATTENDEE = 'password_for_attendee'; - public const PASS_FOR_MODERATOR_TYPE = 'bool'; - public const PASS_FOR_ATTENDEE_TYPE = 'bool'; + public const PASS_FOR_MODERATOR_TYPE = 'password'; + public const PASS_FOR_ATTENDEE_TYPE = 'password'; } diff --git a/bbbeasy-backend/app/src/Utils/Password.php b/bbbeasy-backend/app/src/Utils/Password.php new file mode 100644 index 00000000..9d2dc648 --- /dev/null +++ b/bbbeasy-backend/app/src/Utils/Password.php @@ -0,0 +1,32 @@ + + */ + +namespace Utils; + +/** + * @codeCoverageIgnore + */ +class Password +{ + public const ENCRYPTION_KEY = 'security_group'; + public const CIPHERING_VALUE = 'AES-128-CTR'; +} diff --git a/bbbeasy-backend/app/src/Utils/PresetProcessor.php b/bbbeasy-backend/app/src/Utils/PresetProcessor.php index 53cbb0d7..fc0f2b15 100644 --- a/bbbeasy-backend/app/src/Utils/PresetProcessor.php +++ b/bbbeasy-backend/app/src/Utils/PresetProcessor.php @@ -34,6 +34,7 @@ use Enum\Presets\Presentation; use Enum\Presets\Recording; use Enum\Presets\Screenshare; +use Enum\Presets\Security; use Enum\Presets\UserExperience; use Enum\Presets\Webcams; use Enum\Presets\Whiteboard; @@ -75,10 +76,9 @@ public function toCreateMeetingParams($preset, $createParams) $presetsData->setData(BreakoutRooms::GROUP_NAME, BreakoutRooms::RECORDING, $preparePresetData[BreakoutRooms::GROUP_NAME][BreakoutRooms::RECORDING]); $presetsData->setData(BreakoutRooms::GROUP_NAME, BreakoutRooms::PRIVATE_CHAT, $preparePresetData[BreakoutRooms::GROUP_NAME][BreakoutRooms::PRIVATE_CHAT]); - $presetsData->setData(General::GROUP_NAME, General::DURATION, $preparePresetData[General::GROUP_NAME][General::DURATION]); - - $presetsData->setData(General::GROUP_NAME, General::MAXIMUM_PARTICIPANTS, $preparePresetData[General::GROUP_NAME][General::MAXIMUM_PARTICIPANTS]); + $presetsData->setData(General::GROUP_NAME, General::DURATION, $preparePresetData[General::GROUP_NAME][General::DURATION] ?: null); + $presetsData->setData(General::GROUP_NAME, General::MAXIMUM_PARTICIPANTS, $preparePresetData[General::GROUP_NAME][General::MAXIMUM_PARTICIPANTS] ?: null); $presetsData->setData(GuestPolicy::GROUP_NAME, GuestPolicy::POLICY, $preparePresetData[GuestPolicy::GROUP_NAME][GuestPolicy::POLICY]); $presetsData->setData(LearningDashboard::GROUP_NAME, LearningDashboard::CONFIGURABLE, $preparePresetData[LearningDashboard::GROUP_NAME][LearningDashboard::CONFIGURABLE]); @@ -96,11 +96,22 @@ public function toCreateMeetingParams($preset, $createParams) $presetsData->setData(Recording::GROUP_NAME, Recording::AUTO_START, $preparePresetData[Recording::GROUP_NAME][Recording::AUTO_START]); $presetsData->setData(Recording::GROUP_NAME, Recording::ALLOW_START_STOP, $preparePresetData[Recording::GROUP_NAME][Recording::ALLOW_START_STOP]); $presetsData->setData(Recording::GROUP_NAME, Recording::RECORD, $preparePresetData[Recording::GROUP_NAME][Recording::RECORD]); + + $password_moderator = $preparePresetData[Security::GROUP_NAME][Security::PASSWORD_FOR_MODERATOR]?openssl_decrypt($preparePresetData[Security::GROUP_NAME][Security::PASSWORD_FOR_MODERATOR], Password::CIPHERING_VALUE, Password::ENCRYPTION_KEY):null; + $password_attendee = $preparePresetData[Security::GROUP_NAME][Security::PASSWORD_FOR_ATTENDEE]?openssl_decrypt($preparePresetData[Security::GROUP_NAME][Security::PASSWORD_FOR_ATTENDEE], Password::CIPHERING_VALUE, Password::ENCRYPTION_KEY):null; + + $presetsData->setData(Security::GROUP_NAME, Security::PASSWORD_FOR_MODERATOR, $password_moderator); + $presetsData->setData(Security::GROUP_NAME, Security::PASSWORD_FOR_ATTENDEE, $password_attendee); + $presetsData->setData(Screenshare::GROUP_NAME, Screenshare::CONFIGURABLE, $preparePresetData[Screenshare::GROUP_NAME][Screenshare::CONFIGURABLE]); + $presetsData->setData(Webcams::GROUP_NAME, Webcams::VISIBLE_FOR_MODERATOR_ONLY, $preparePresetData[Webcams::GROUP_NAME][Webcams::VISIBLE_FOR_MODERATOR_ONLY]); $presetsData->setData(Webcams::GROUP_NAME, Webcams::MODERATOR_ALLOWED_CAMERA_EJECT, $preparePresetData[Webcams::GROUP_NAME][Webcams::MODERATOR_ALLOWED_CAMERA_EJECT]); // Get preset data to create meeting parameters + $createParams->setModeratorPassword($presetsData->getData(Security::GROUP_NAME, Security::PASSWORD_FOR_MODERATOR) ?: DataUtils::generateRandomString()); + $createParams->setAttendeePassword($presetsData->getData(Security::GROUP_NAME, Security::PASSWORD_FOR_ATTENDEE) ?: DataUtils::generateRandomString()); + $createParams->setMuteOnStart($presetsData->getData(Audio::GROUP_NAME, Audio::USERS_JOIN_MUTED)); $createParams->setAllowModsToUnmuteUsers($presetsData->getData(Audio::GROUP_NAME, Audio::MODERATORS_ALLOWED_TO_UNMUTE_USERS)); @@ -129,7 +140,7 @@ public function toCreateMeetingParams($preset, $createParams) // layout: presentation,participants,chat,navigation_bar,actions_bar $createParams->setLearningDashboardEnabled($presetsData->getData(LearningDashboard::GROUP_NAME, LearningDashboard::CONFIGURABLE)); - $createParams->setLearningDashboardCleanupDelayInMinutes($presetsData->getData(LearningDashboard::GROUP_NAME, LearningDashboard::CLEANUP_DELAY)); + $createParams->setLearningDashboardCleanupDelayInMinutes($presetsData->getData(LearningDashboard::GROUP_NAME, LearningDashboard::CLEANUP_DELAY) ?: null); $createParams->setLockSettingsDisableCam($presetsData->getData(LockSettings::GROUP_NAME, LockSettings::WEBCAMS)); $createParams->setLockSettingsDisableMic($presetsData->getData(LockSettings::GROUP_NAME, LockSettings::MICROPHONES)); diff --git a/bbbeasy-docs/guides/user-guide/Administration.md b/bbbeasy-docs/guides/user-guide/Administration.md new file mode 100644 index 00000000..f9127790 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/Administration.md @@ -0,0 +1,17 @@ +--- +sidebar_position: 12 +--- + +# Administration + +The administration settings section is related to the registration method of users .The settings are set by default to inactive during the install , then we can modify them depending on the client requirements + +**_Edit the administration settings_** + +`To Edit the administration settings, you must follow the following steps` + +1. Go to the Administration page. +2. Enable or disable the settings then save the changes . +3. The administration settings will be saved. + +![Users](/img/administration.png) diff --git a/bbbeasy-docs/guides/user-guide/Labels.md b/bbbeasy-docs/guides/user-guide/Labels.md new file mode 100644 index 00000000..203caa26 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/Labels.md @@ -0,0 +1,42 @@ +--- +sidebar_position: 6 +--- + +# Labels Management + +## labels + +Labels are used to distinguish the rooms and facilitate rooms identification by using different labels + +**_New Label_** + +`To create a new label , you must follow the following steps` + +1. Go on labels page +2. Click on the New label button +3. Fill the Create Label form and submit the form + + ![labels](/img/new_labels.png) + ![labels](/img/labels.png) + +**_Edit Label_** + +`To Edit labels ,you must follow the following steps ` + +1. Go to the labels page +2. Choose a label from the list and click on the edit button +3. Edit the label details then click on save button +4. The changes will be saved successfully + + ![labels](/img/Edit_labels.png) + +**_Delete labels_** + +`To delete labels , you must follow the following steps` + +1. Go to the labels page +2. Choose a label from the list and click on the delete button +3. Confirm deletion +4. The label will be deleted . + + ![labels](/img/delete_label.png) diff --git a/bbbeasy-docs/guides/user-guide/Profile.md b/bbbeasy-docs/guides/user-guide/Profile.md new file mode 100644 index 00000000..35dec74f --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/Profile.md @@ -0,0 +1,18 @@ +--- +sidebar_position: 11 +--- + +# User Profile + +The profile page includes all your account details(Username,Email,Profile picture). +Also you can edit your profile informations + +**_Edit Profile_** + +`To Edit your profile informations , just follow these steps` + +1. Go to the avatar profile in the right corner, a menu will be appeared , then click on profile +2. Edit your profile information , then enter your current password for confirmation and submit the form +3. your profile will be modified successfully + +![profile](/img/profile.png) diff --git a/bbbeasy-docs/guides/user-guide/Recordings.md b/bbbeasy-docs/guides/user-guide/Recordings.md new file mode 100644 index 00000000..f53317f9 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/Recordings.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 8 +--- + +# Access to Recordings + +## Recordings + +The recording section represents all the meeting recordings and all the sharing options. + +**_Recordings page_** + +` To Go the recordings page , you must follow the following steps` + +1. Go to the Recordings page. +2. You will find all the recording meetings + + ![Recordings](/img/save_recordings.png) + +**_Edit Recording_** + +`To Edit Recording Name , you must follow the following steps` + +1. Go to the Recordings page +2. Choose a Recording from the list and click on the edit button +3. Edit the Recording Name then click on the save button +4. The changes will be saved successfully + +![Recordings](/img/Edit_Recordings.png) + +**_Delete Recording_** + +`To delete Recording , you must follow the following steps` + +1. Go to the Recordings page +2. Choose a Recording from the list and click on the delete button +3. Confirm deletion +4. The Recording will be deleted . + + ![Recordings](/img/delete_recordings.png) diff --git a/bbbeasy-docs/guides/user-guide/Reset_password.md b/bbbeasy-docs/guides/user-guide/Reset_password.md new file mode 100644 index 00000000..20c21968 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/Reset_password.md @@ -0,0 +1,22 @@ +# Reset password + +This feature allows you to change your password if you forget it before login + +___Reset password___ + + +`To reset your password , just follow these steps` + +1. Go to the login page +2. Click on `reset here ` link +3. Enter your email address then click on `Reset password ` button +4. An email will be sent to you that includes a change password link +5. Click through the link , that will redirect you to change password form +6. Enter your new password and submit the form +7. The password will be changed successfully + +![Reset password](/img/reset_password.png) + +![changepassword](/img/change_password.png) + + diff --git a/bbbeasy-docs/guides/user-guide/Roles.md b/bbbeasy-docs/guides/user-guide/Roles.md new file mode 100644 index 00000000..96745cca --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/Roles.md @@ -0,0 +1,45 @@ +--- +sidebar_position: 9 +--- + +# Roles configuration + +## Roles + +Through the Roles page, Administrators are able to add,edit,delete the roles of the application. +We have basically two roles Administrator and Lecturer but we can add another ones . + +![Roles](/img/roles.png) + +**_Creating a New Role_** + +`To create a new role click on the new role button. This will open the modal where you can specify the role details` + +1. Go to the Roles page +2. Click on the New Role button +3. Fill the form and check the role permissions needed then submit the form +4. A new role will be created with its permissions + + ![Roles](/img/New_roles.png) + +**_Rename the Role name_** + +`To Edit the role , you must follow the following steps` + +1. Go to the Roles page +2. Choose a role from the list then click on the rename button +3. Enter the new role name then save the changes +4. The role name will be changed successfully + +![Rename role](/img/role_rname.png) + +**_Edit the role permissions_** + +`To Edit the role permissions , you must follow the following steps` + +1. Go to the Roles page +2. Choose a role from the list then click on permissions +3. Edit the role permissions then click on save button +4. The role permissions will be changed + +![Rename role](/img/edit_permissions.png) diff --git a/bbbeasy-docs/guides/user-guide/Rooms Details.md b/bbbeasy-docs/guides/user-guide/Rooms Details.md new file mode 100644 index 00000000..c04abbf5 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/Rooms Details.md @@ -0,0 +1,29 @@ + +## Rooms Details page + +Room details contains the entire room details (room informations , room presentations , room recordings) + + + +___Room details___ + +`In order to access to the room details page , you must follow these steps ` + +1. Go to the Rooms page +2. Choose a room and click on it to access to the room details page + +___Room Recordings section___ + +The room recordings contains all the recordings related to the specified room +This section after the end of the meeting + +___Room presentations section___ + +In the room presentations section , you can upload the desired documents for the room before starting it . +This section is available in case of the preupload setting is active on its related preset + +![Room details](/img/details_room.png) + + + + \ No newline at end of file diff --git a/bbbeasy-docs/guides/user-guide/Users.md b/bbbeasy-docs/guides/user-guide/Users.md new file mode 100644 index 00000000..ffce2d76 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/Users.md @@ -0,0 +1,45 @@ +--- +sidebar_position: 10 +--- + +# Users Management + +## Users + +User management is a very important component of your application. +User management includes their profiles and account information. You can create a list of users and assign them different roles, +Each user is identified by username,email, role and state + +![Users](/img/Users.png) +**_New User_** + +`To create a new user , you must follow the following steps` + +1. Go to the Users page +2. Click on the New user button +3. Fill the user details and assign it a role then click on the create button +4. The user will be created with a default preset + +![Users](/img/new_user.png) + +**_Edit User_** + +`To Edit user , you must follow the following steps` + +1. Go to the Users page +2. Choose a user from the list and click on the edit button +3. Edit the user details then click on save button +4. The changes will be saved successfully + +![Users](/img/edit_user.png) + +**_Delete User_** + +`To delete user , you must follow the following steps` + +1. Go to the Users page +2. Choose a user from the list and click on the delete button +3. Confirm deletion +4. The user will be deleted . + + ![Users](/img/delete_user.png) diff --git a/bbbeasy-docs/guides/user-guide/authentication.md b/bbbeasy-docs/guides/user-guide/authentication.md new file mode 100644 index 00000000..5d31e332 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/authentication.md @@ -0,0 +1,13 @@ +--- +sidebar_position: 2 +--- + +# Authentication + +`To access to your account , just follow these steps` + +1. Open your browser, navigate to **[BBBeasy](https://meet.riadvice.ovh/)** +2. Click the login button +3. Enter your Email address and password , the click the login button + +![login](/img/login.png) diff --git a/bbbeasy-docs/guides/user-guide/bigbluebutton settings.md b/bbbeasy-docs/guides/user-guide/bigbluebutton settings.md new file mode 100644 index 00000000..1d209f54 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/bigbluebutton settings.md @@ -0,0 +1,18 @@ +--- +sidebar_position: 4 +--- + +# BigBlueButton Settings + +## Edit BigBlueButton settings : + +After already have the application installed , you can customize the BigBlueButton Room settings through the BigBlueButton view + +`To Edit BigBlueButton room settings` + +1. Go to the BigBlueButton page under the settings menu +2. Select one group from the preset setting groups +3. Enable/disable the BigBlueButton room settings needed for use then confirm the changes +4. The BigBlueButton room settings group will be updated with success + +![Audio](/img/Audio.png) diff --git a/bbbeasy-docs/guides/user-guide/branding.md b/bbbeasy-docs/guides/user-guide/branding.md index cbaf128e..6fe01478 100644 --- a/bbbeasy-docs/guides/user-guide/branding.md +++ b/bbbeasy-docs/guides/user-guide/branding.md @@ -1,9 +1,12 @@ --- + sidebar_position: 4 + --- # Branding + ## Organization and branding You can customize the organization and branding information after the install , during using the application diff --git a/bbbeasy-docs/guides/user-guide/faqs.md b/bbbeasy-docs/guides/user-guide/faqs.md index 0ff8fc4f..624e88d1 100644 --- a/bbbeasy-docs/guides/user-guide/faqs.md +++ b/bbbeasy-docs/guides/user-guide/faqs.md @@ -1,9 +1,11 @@ --- + sidebar_position: 15 id: introduction-faqs title: 'Frequently Asked Questions 🙋' sidebar_label: 'FAQs' slug: '/user-guide/introduction/faqs' + --- ## What is BigBlueButton? @@ -27,6 +29,7 @@ manager experience easy behind the very wide choice of managing all the configur **BBBEasy** has been developed to respond the following specific requirements: + * Cover multiple business cases within a single integration: 1-to-1, hiring, exams, master class, pre-recorded courses... * An integration where all the features of BigBlueButton are configurable. @@ -36,6 +39,7 @@ manager experience easy behind the very wide choice of managing all the configur * Easy to install with the minimum system command line knowledge. * Full branding part of the experience. + ## Is BBBEasy open-source? **BBBEasy** is a fully open-sourced under **[AGPL v3.0](https://choosealicense.com/licenses/agpl-3.0/)**. There is no diff --git a/bbbeasy-docs/guides/user-guide/presets_management.md b/bbbeasy-docs/guides/user-guide/presets_management.md new file mode 100644 index 00000000..e9c0e2aa --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/presets_management.md @@ -0,0 +1,66 @@ +--- +sidebar_position: 5 +--- + +# Presets Management + +## Configuration Presets: + +A preset is a set of configuration settings for BigBlueButton . +This means that if you create a rooms and give it a particular configuration, it will maintain the same during the session. You can also create multiple configurations presets and assign different presets to different rooms. + +**_New Presets_** + +`To create a new preset, follow these setps` + +1. Go to the presets page +2. Click on the New preset button +3. Enter the preset name then click on the Create button +4. A new preset will be created with the default preset settings + + ![presets](/img/new_preset.png) + +![presets](/img/presets.png) + +**_Rename Presets_** + +`To Rename presets , you must follow the following steps` + +1. Go to the Presets page +2. Choose a preset from the preset cards and click on the rename button +3. Rename the preset then click on the save button +4. The preset name will be changed successfully + +![rename preset](/img/rename_preset.png) + +**_Edit the Preset settings_** + +`To Edit the preset settings , you must follow the following steps` + +1. Go to the Presets page +2. Choose a preset from the preset cards and choose a preset configuration group (Audio,Branding,.......) +3. Edit the preset settings details then click on the save button +4. The preset settings will be changed successfully + +![edit preset settings](/img/edit_preset_settings.png) + +**_Copy the Preset_** + +`To Copy the preset , you must follow the following steps` + +1. Go to the Presets page +2. Choose preset from the preset cards then click on copy option +3. The preset will be copied successfully with its preset settings + +![copy preset](/img/copy_preset.png) + +**_Delete Presets_** + +`To delete Presets , you must follow the following steps` + +1. Go to the Presets page +2. Choose a preset from the preset cards and click on the delete option +3. Confirm deletion +4. The preset will be deleted . + + ![delete preset](/img/delete_presete.png) diff --git a/bbbeasy-docs/guides/user-guide/registration.md b/bbbeasy-docs/guides/user-guide/registration.md new file mode 100644 index 00000000..f1d8b520 --- /dev/null +++ b/bbbeasy-docs/guides/user-guide/registration.md @@ -0,0 +1,17 @@ +--- +sidebar_position: 1 +--- + +# Registration + +The register page allows you to create an account in order to use the application and discover its features. + +**_Register_** + +` To Register a new account , just follow these steps` + +1. Go to register page +2. Fill the account details then submit the form +3. A new user will be registered successfully with a pending state and a default preset will be created for each new registered user +4. The administrator should activate the new created account in order to use it . + ![Register](/img/register.png) diff --git a/bbbeasy-docs/guides/user-guide/rooms.md b/bbbeasy-docs/guides/user-guide/rooms.md index 2a6971e1..9920aa08 100644 --- a/bbbeasy-docs/guides/user-guide/rooms.md +++ b/bbbeasy-docs/guides/user-guide/rooms.md @@ -1,5 +1,6 @@ --- sidebar_position: 8 + --- # Rooms Management @@ -7,16 +8,19 @@ sidebar_position: 8 The room is a communication tool between different users and through it moves to web conference. A room is identified by name , unique link ,labels(optional) and assigned to one preset . + ## New Room `To create a New room ,follow the following steps` + 1. Go to the Rooms page 2. Click on the New room button 3. Once the modal is opened , the link will be generated automatically (editable optionally) 4. Fill the rest of room details then click on the Create button 5. The room will be created successfully + ![Room](/room/new_room.png) ![Rooms](/room/rooms.png) @@ -25,20 +29,24 @@ A room is identified by name , unique link ,labels(optional) and assigned to one `To Edit rooms , follow the following steps` + 1. Go to the Rooms page 2. Choose a room and click on it to access to the room details page 3. Click on edit button , make the needed changes and click on the save button 4. The room will be changed successfully + ![Rooms](/room/edit_room.png) ## Start Room `To start rooms , follow the following steps` + 1. Go to the Rooms page 2. Choose a room and click on it to access to the room details page 3. Click on the start or join button + 4. The meeting will be started with its own setting ![Rooms](/room/start.png) @@ -47,9 +55,12 @@ A room is identified by name , unique link ,labels(optional) and assigned to one `To delete rooms , follow the following steps` + 1. Go to the rooms page 2. Choose a room from the cards and click on the delete option 3. Confirm deletion 4. The room will be deleted . + ![Delete](/room/delete-room.png) + diff --git a/bbbeasy-docs/guides/user-guide/welcome.md b/bbbeasy-docs/guides/user-guide/welcome.md index dd2ed496..85914856 100644 --- a/bbbeasy-docs/guides/user-guide/welcome.md +++ b/bbbeasy-docs/guides/user-guide/welcome.md @@ -11,9 +11,11 @@ BigBlueButton. Technically, it is a complete and fully featured integration for developed to handle multiple web-conferencing use cases. + **BBBEasy** is developed and maintained by **[RIADVICE](https://riadvice.tn)** to serve its own and customers requirements regarding managing BigBlueButton rooms management. + ![BBBEasy Screenshots](/img/intro.png) ## BBBEasy Overview ✨ @@ -22,6 +24,7 @@ customers requirements regarding managing BigBlueButton rooms management. # Languages : + The `BBBeasy` supports 3 languages and more are coming later * English @@ -33,6 +36,7 @@ All the translations are made by crowdin tool **[Crowdin](https://crowdin.com/)** + ## Fast Track ⏱️ In **BBBEasy** a `room` is designed around 3 principles: @@ -45,6 +49,7 @@ to BigBlueButton. `Label` : A room can be tagged by different labels to make it easily identifiable. ## Features 🧱 + - [Registration](./register.md) - [Authentication](./login.md) - [Reset password](./reset_password.md) @@ -62,6 +67,7 @@ to BigBlueButton. - [FAQs](./faqs.md) + ## Design principles 📜 ... diff --git a/bbbeasy-frontend/src/App-webapp.css b/bbbeasy-frontend/src/App-webapp.css index 73a15b3e..940b7f22 100644 --- a/bbbeasy-frontend/src/App-webapp.css +++ b/bbbeasy-frontend/src/App-webapp.css @@ -818,7 +818,7 @@ fieldset { font-weight: 600; clip-path: polygon(48% 0, 52% 0, 95% 25%, 95% 75%, 52% 100%, 48% 100%, 5% 75%, 5% 25%); border-radius: 50%; - background-color: #fbbc0b !important; + background-color: #fbbc0b ; } .room-presentations { border-radius: 5px !important; @@ -1369,7 +1369,10 @@ fieldset { .recording-formats .icon-disabled { color: var(--bbbeasy-medimum-gray) !important; } - +.btn-disabled{ + cursor: not-allowed; + background-color: var(--bbbeasy-medimum-gray) !important; +} .share-modal { padding: 0 30px !important; text-align: center !important; diff --git a/bbbeasy-frontend/src/components/Presets.tsx b/bbbeasy-frontend/src/components/Presets.tsx index c71dffbe..b5d2c38d 100644 --- a/bbbeasy-frontend/src/components/Presets.tsx +++ b/bbbeasy-frontend/src/components/Presets.tsx @@ -19,6 +19,7 @@ import React, { useEffect, useState } from 'react'; import { PageHeader } from '@ant-design/pro-layout'; +import { PasswordInput } from 'antd-password-input-strength'; import { Button, @@ -509,7 +510,14 @@ const PresetsCol: React.FC = ({ }} /> )} - + {item.type === 'password' && ( + { + item.value = event.target.value; + }} + /> + )} {item.type === 'color' && ( { const [isRunning, setIsRunning] = useState(false); const [canStart, setCanStart] = useState(false); const dataContext = React.useContext(DataContext); - + const [errors, setErrors] = React.useState(); const [errorsEdit, setErrorsEdit] = React.useState({}); const [showSocialMedia, setShowSocialMedia] = useState(false); const [showStartButton, setShowStartButton] = useState(true); @@ -109,6 +125,7 @@ const RoomDetails = () => { const [labels, setLabels] = React.useState(); const [presets, setPresets] = React.useState(); const prefixShortLink = '/r/'; + const [meeting, setMeeting] = React.useState(null); const [showRecodingAndPresenttaions, setShowRecodingAndPresenttaions] = React.useState(false); const [open, setOpen] = React.useState(false); const [roomRecordings, setRoomRecordings] = React.useState([]); @@ -136,17 +153,15 @@ const RoomDetails = () => { const startRoom = async () => { try { const values = await startForm.validateFields(); - - RoomsService.start_room(room.id, values.fullname) + + RoomsService.start_room(room.id, values.fullname, values.password) .then((result) => { window.open(result.data, '_self'); }) .catch((error) => { console.log(error.response.data); - Notifications.openNotificationWithIcon( - 'error', - t(Object.keys(EN_US).filter((elem) => EN_US[elem] === error.response.data.meeting)) - ); + setErrors(error.response.data); + }); } catch (errInfo) { console.log('could not start or join the meeting :', errInfo); @@ -188,7 +203,8 @@ const RoomDetails = () => { const room: RoomType = response.data.room; const meeting = response.data.meeting; - console.log(currentUser?.role); + setMeeting(meeting); + setRoom(response.data.room); if (room != null) { setRoom(room); @@ -202,6 +218,7 @@ const RoomDetails = () => { } if (meeting != null) { setCanStart(meeting.canStart); + setIsRunning(meeting.running); } @@ -399,6 +416,39 @@ const RoomDetails = () => { ); }; + + const renderPasswordModeratorOrAttendee = (errors, user, meeting) => { + + if (user == null && !meeting.all_join_as_moderator &&( meeting.password_moderator!=null || meeting.password_attendee!=null)) { + return ( + EN_US[elem] == errors['password'])} + /> + ), + validateStatus: 'error', + })} + rules={[ + { + required: true, + message: , + }, + ]} + > + + + ); + } + + }; + const disabled=(disabled)=>{ + return disabled?' btn-disabled':''; + } const renderLinkOrUsername = (open) => { if (currentUser != null) { return ( @@ -414,21 +464,22 @@ const RoomDetails = () => { ); } else { return ( -
- {' '} - , - }, - ]} - > - - -
+ , + }, + { + min:2, + message: + } + ]} + > + + ); } }; @@ -500,8 +551,17 @@ const RoomDetails = () => { ) : null} +
+ + + {renderPasswordModeratorOrAttendee( + errors, + currentUser, + meeting + )} - {renderLinkOrUsername(open)} + {renderLinkOrUsername(open)} +
) : ( @@ -568,7 +628,7 @@ const RoomDetails = () => { diff --git a/bbbeasy-frontend/src/locale/ar-TN.json b/bbbeasy-frontend/src/locale/ar-TN.json index c71d3b0b..1e3080f5 100644 --- a/bbbeasy-frontend/src/locale/ar-TN.json +++ b/bbbeasy-frontend/src/locale/ar-TN.json @@ -44,7 +44,18 @@ }, "fullname": { "label": "الاسم الكامل", - "required": "التسم الكامل مطلوب" + "required": "التسم الكامل مطلوب", + "minSize":"يجب أن يحتوي الاسم على حرفين على الأقل" + }, + "password_moderator": { + "label": "كلمة المرور للمشرف", + "required": "كلمة المرور للمشرف مطلوبة" + }, + "wrong-password-join-meeting": "تعذر الانضمام إلى اجتماع باستخدام كلمة مرور خاطئة", + + "password_attendee": { + "label": "كلمة المرور للحضور", + "required": "كلمة المرور للحضور مطلوبة" }, "empty-fullname": "الرجاء إدخال الاسم الكامل للانضمام إلى الاجتماع", "confirm-password": { diff --git a/bbbeasy-frontend/src/locale/en-US.json b/bbbeasy-frontend/src/locale/en-US.json index 89656f00..cba52571 100644 --- a/bbbeasy-frontend/src/locale/en-US.json +++ b/bbbeasy-frontend/src/locale/en-US.json @@ -44,7 +44,17 @@ }, "fullname": { "label": "Full name", - "required": "Full name is required" + "required": "Full name is required", + "minSize":"Fullname must have at least 2 characters" + }, + "password_moderator": { + "label": "Password for moderator", + "required": "Password for moderator is required" + }, + "wrong-password-join-meeting": "Could not join a meeting with a wrong password", + "password_attendee": { + "label": "Password for attendee", + "required": "Password for attendee is required" }, "empty-fullname": "Could not join a meeting with an empty fullname", "confirm-password": { diff --git a/bbbeasy-frontend/src/locale/fr-FR.json b/bbbeasy-frontend/src/locale/fr-FR.json index e564f1f8..14f15c6e 100644 --- a/bbbeasy-frontend/src/locale/fr-FR.json +++ b/bbbeasy-frontend/src/locale/fr-FR.json @@ -44,9 +44,18 @@ }, "fullname": { "label": "Nom Complet", - "required": "Le Nom complet est obligatoire" + "required": "Le Nom complet est obligatoire", + "minSize":"Le nom doit contenir au moins 2 caractères" }, - + "password_moderator": { + "label": "Mot de passe du modérateur", + "required": "Le mot de passe du modérateur est obligatoire" + }, + "password_attendee": { + "label": "Mot de passe du Participant", + "required": "Mot de passe du Participant est obligatoire" + }, + "wrong-password-join-meeting": "Impossible de rejoindre une réunion avec un mot de passe erroné", "empty-fullname": "Veuillez entrer le Nom complet pour rejoindre la réunion", "confirm-password": { "label": "Confirmation du mot de passe", diff --git a/bbbeasy-frontend/src/services/rooms.service.ts b/bbbeasy-frontend/src/services/rooms.service.ts index 948c8653..425c8d47 100644 --- a/bbbeasy-frontend/src/services/rooms.service.ts +++ b/bbbeasy-frontend/src/services/rooms.service.ts @@ -40,9 +40,10 @@ class RoomsService { delete_room(id: number) { return axiosInstance.delete(apiRoutes.DELETE_ROOM_URL + id); } - start_room(id: number, fullname) { + start_room(id: number, fullname, password) { return axiosInstance.post(apiRoutes.START_ROOM_URL + id, { fullname, + password, }); } getRoomByLink(link: string) { diff --git a/bbbeasy-frontend/yarn.lock b/bbbeasy-frontend/yarn.lock index ffa0e2c7..201b35d6 100644 --- a/bbbeasy-frontend/yarn.lock +++ b/bbbeasy-frontend/yarn.lock @@ -19010,11 +19010,11 @@ __metadata: "typescript@patch:typescript@^4.9.5#~builtin": version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=289587" + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 1f8f3b6aaea19f0f67cba79057674ba580438a7db55057eb89cc06950483c5d632115c14077f6663ea76fd09fce3c190e6414bb98582ec80aa5a4eaf345d5b68 + checksum: ab417a2f398380c90a6cf5a5f74badd17866adf57f1165617d6a551f059c3ba0a3e4da0d147b3ac5681db9ac76a303c5876394b13b3de75fdd5b1eaa06181c9d languageName: node linkType: hard diff --git a/bigbluebutton-api-php b/bigbluebutton-api-php new file mode 160000 index 00000000..226a6384 --- /dev/null +++ b/bigbluebutton-api-php @@ -0,0 +1 @@ +Subproject commit 226a6384add4fcd050f20b793fde73f1a7f7149b diff --git a/bigbluebutton.git b/bigbluebutton.git new file mode 160000 index 00000000..1a0cf1c7 --- /dev/null +++ b/bigbluebutton.git @@ -0,0 +1 @@ +Subproject commit 1a0cf1c78b1cf4a80257da231d3ac468f1c2b781